The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .env.example
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── index.html
├── package.json
├── src
    ├── App.tsx
    ├── components
    │   ├── ArticleItem.tsx
    │   ├── ArticleSkeleton.tsx
    │   ├── CommentItem.tsx
    │   ├── CommentSkeleton.tsx
    │   ├── LabelItem.tsx
    │   ├── MarkdownHtml.tsx
    │   ├── Pagination.tsx
    │   ├── Playground.tsx
    │   ├── ProjectItem.tsx
    │   ├── ProjectSkeleton.tsx
    │   ├── ShapeEffect
    │   │   ├── ShapeEffect.tsx
    │   │   └── shapes.ts
    │   └── Skeleton.tsx
    ├── favicon.svg
    ├── hooks
    │   ├── use-dark-mode.ts
    │   ├── use-handling.ts
    │   ├── use-local-storage.ts
    │   └── use-query.ts
    ├── i18n
    │   ├── index.ts
    │   └── locales
    │   │   ├── cn
    │   │       ├── index.ts
    │   │       └── translation.json
    │   │   └── en
    │   │       ├── index.ts
    │   │       └── translation.json
    ├── main.tsx
    ├── models
    │   ├── ArticleModel.ts
    │   ├── CategoryModel.ts
    │   ├── CommentModel.ts
    │   ├── LabelModel.ts
    │   ├── ProjectModel.ts
    │   └── UserModel.ts
    ├── services
    │   └── github.ts
    ├── styles
    │   └── BaseStyles.tsx
    ├── utils.ts
    └── views
    │   ├── Article.tsx
    │   ├── Articles.tsx
    │   ├── Home.tsx
    │   ├── Main.tsx
    │   └── Projects.tsx
├── tailwind.config.js
├── tsconfig.json
├── tsconfig.node.json
├── types
    ├── env.d.ts
    ├── react-i18next.d.ts
    ├── twin.d.ts
    └── vite-env.d.ts
├── vite.config.ts
└── yarn.lock


/.env.example:
--------------------------------------------------------------------------------
 1 | VITE_APP_TITLE=Blog
 2 | VITE_TITLE=Title
 3 | VITE_EMAIL=fake@email.com
 4 | VITE_GITHUB_URL=FAKE_URL
 5 | VITE_GITHUB_ACCESS_TOKEN_PART1=FAKE_TOKEN_PART1
 6 | VITE_GITHUB_ACCESS_TOKEN_PART2=FAKE_TOKEN_PART2
 7 | VITE_GITHUB_OWNER=FAKE_USER
 8 | VITE_GITHUB_REPO=FAKE_REPO
 9 | VITE_GITHUB_MILESTONE_POSTS=1
10 | VITE_GITHUB_MILESTONE_SNIPPETS=2
11 | VITE_ARTICLE_PAGE_SIZE=10
12 | VITE_COMMENT_PAGE_SIZE=30


--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
 1 | # Logs
 2 | logs
 3 | *.log
 4 | npm-debug.log*
 5 | yarn-debug.log*
 6 | yarn-error.log*
 7 | pnpm-debug.log*
 8 | lerna-debug.log*
 9 | 
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 | 
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 | 


--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
 1 | {
 2 |   "printWidth": 100,
 3 |   "tabWidth": 2,
 4 |   "useTabs": false,
 5 |   "semi": true,
 6 |   "singleQuote": true,
 7 |   "trailingComma": "all",
 8 |   "bracketSpacing": true,
 9 |   "bracketSameLine": false,
10 |   "arrowParens": "always",
11 |   "importOrder": ["^@/(.*)
quot;, "^[../]", "^[./]"],
12 |   "importOrderSeparation": true,
13 |   "importOrderSortSpecifiers": true
14 | }
15 | 


--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | MIT License
 2 | 
 3 | Copyright (c) 2016-present, varHarrie
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | of this software and associated documentation files (the "Software"), to deal
 7 | in the Software without restriction, including without limitation the rights
 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 | 
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.


--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
 1 | # varHarrie's Blog
 2 | 
 3 | Personal blog site based on github issues.
 4 | 
 5 | ## Features
 6 | 
 7 | - 💪 No need backend server
 8 | - 📱 Mobile compatible
 9 | - 🌙 Supports dark theme
10 | - 🌏 Supports i18n
11 | - ⚾︎ Integrates code playground
12 | 
13 | ## Getting started
14 | 
15 | 1. Clone the repository: `git clone https://github.com/varHarrie/varharrie.github.io.git`
16 | 2. Install dependencies: `yarn`
17 | 3. Rename .env.example to .env.local and Modify its content
18 | 4. Start dev server: `yarn run dev`
19 | 
20 | ## License
21 | 
22 | [MIT](./LICENSE)
23 | 


--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
 1 | <!DOCTYPE html>
 2 | <html lang="en">
 3 |   <head>
 4 |     <meta charset="UTF-8" />
 5 |     <link rel="icon" type="image/svg+xml" href="/src/favicon.svg" />
 6 |     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 7 |     <title></title>
 8 |   </head>
 9 |   <body>
10 |     <div id="root"></div>
11 |     <script type="module" src="/src/main.tsx"></script>
12 |   </body>
13 | </html>
14 | 


--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "varharrie-blog",
 3 |   "private": true,
 4 |   "version": "0.0.0",
 5 |   "babelMacros": {
 6 |     "twin": {
 7 |       "preset": "emotion"
 8 |     }
 9 |   },
10 |   "scripts": {
11 |     "dev": "vite",
12 |     "build": "tsc && vite build",
13 |     "preview": "vite preview"
14 |   },
15 |   "homepage": "https://github.com/varHarrie/varharrie.github.io#readme",
16 |   "author": "varharrie <varharrie@gmail.com>",
17 |   "license": "MIT",
18 |   "dependencies": {
19 |     "@codesandbox/sandpack-react": "^2.0.26",
20 |     "@emotion/react": "^11.10.6",
21 |     "@emotion/serialize": "^1.1.1",
22 |     "@emotion/styled": "^11.10.6",
23 |     "copy-text-to-clipboard": "^3.0.1",
24 |     "date-fns": "^2.29.3",
25 |     "github-markdown-css": "^5.2.0",
26 |     "i18next": "^22.4.10",
27 |     "markdown-it": "^13.0.1",
28 |     "prism-themes": "^1.9.0",
29 |     "prismjs": "^1.29.0",
30 |     "react": "^18.2.0",
31 |     "react-dom": "^18.2.0",
32 |     "react-i18next": "^12.2.0",
33 |     "react-router-dom": "^6.8.2",
34 |     "react-transition-group": "^4.4.5",
35 |     "tailwindcss": "^3.2.7",
36 |     "twin.macro": "^3.1.0"
37 |   },
38 |   "devDependencies": {
39 |     "@babel/plugin-transform-react-jsx": "^7.21.0",
40 |     "@emotion/babel-plugin-jsx-pragmatic": "^0.2.0",
41 |     "@ianvs/prettier-plugin-sort-imports": "^3.7.1",
42 |     "@iconify-json/octicon": "^1.1.33",
43 |     "@iconify-json/ri": "^1.1.5",
44 |     "@iconify-json/teenyicons": "^1.1.5",
45 |     "@iconify-json/vscode-icons": "^1.1.22",
46 |     "@svgr/core": "^6.5.1",
47 |     "@types/markdown-it": "^12.2.3",
48 |     "@types/prismjs": "^1.26.0",
49 |     "@types/react": "^18.0.28",
50 |     "@types/react-dom": "^18.0.11",
51 |     "@types/react-transition-group": "^4.4.5",
52 |     "@vitejs/plugin-react": "^3.1.0",
53 |     "babel-plugin-macros": "^3.1.0",
54 |     "prettier": "^2.8.4",
55 |     "typescript": "^4.9.5",
56 |     "unplugin-icons": "^0.15.3",
57 |     "vite": "^4.1.4"
58 |   }
59 | }
60 | 


--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import { HashRouter, Outlet, Route, Routes } from 'react-router-dom';
 3 | 
 4 | import Article from './views/Article';
 5 | import Articles from './views/Articles';
 6 | import Home from './views/Home';
 7 | import Main from './views/Main';
 8 | import Projects from './views/Projects';
 9 | 
10 | const milestones = {
11 |   posts: Number(import.meta.env.VITE_GITHUB_MILESTONE_POSTS),
12 |   snippets: Number(import.meta.env.VITE_GITHUB_MILESTONE_SNIPPETS),
13 | };
14 | 
15 | export default function App() {
16 |   return (
17 |     <HashRouter>
18 |       <Routes>
19 |         <Route path="/" element={<Main />}>
20 |           <Route path="" element={<Home />} />
21 |           <Route path="posts" element={<Outlet />}>
22 |             <Route path="" element={<Articles milestone={milestones.posts} />} />
23 |             <Route path=":id" element={<Article />} />
24 |           </Route>
25 |           <Route path="snippets" element={<Outlet />}>
26 |             <Route path="" element={<Articles milestone={milestones.snippets} />} />
27 |             <Route path=":id" element={<Article />} />
28 |           </Route>
29 |           <Route path="projects" element={<Projects />} />
30 |         </Route>
31 |       </Routes>
32 |     </HashRouter>
33 |   );
34 | }
35 | 


--------------------------------------------------------------------------------
/src/components/ArticleItem.tsx:
--------------------------------------------------------------------------------
 1 | import { format } from 'date-fns';
 2 | import React, { useMemo } from 'react';
 3 | import { useTranslation } from 'react-i18next';
 4 | import { Link, To } from 'react-router-dom';
 5 | import tw from 'twin.macro';
 6 | import IconComments from '~icons/ri/chat-2-line';
 7 | 
 8 | import ArticleModel from '../models/ArticleModel';
 9 | import LabelItem from './LabelItem';
10 | 
11 | const Wrapper = tw.div`flex flex-col justify-center h-20 border-t  border-dotted border-gray-300 dark:border-gray-800`;
12 | 
13 | const Row = tw.div`flex items-center`;
14 | 
15 | const Left = tw.div`hidden lg:block w-36 text-sm text-slate-400 dark:text-slate-600 text-right`;
16 | 
17 | const Right = tw.div`ml-4 flex-1 min-w-0 truncate`;
18 | 
19 | export type ArticleItemProps = {
20 |   article: ArticleModel;
21 |   getLink: (id: number) => To;
22 |   getLabelLink: (label: string) => To;
23 | };
24 | 
25 | export default function ArticleItem(props: ArticleItemProps) {
26 |   const { article, getLink, getLabelLink } = props;
27 | 
28 |   const { t } = useTranslation();
29 | 
30 |   const createdAt = useMemo(() => format(new Date(article.createdAt), t('dateFormat')), [article]);
31 | 
32 |   return (
33 |     <Wrapper>
34 |       <Row>
35 |         <Left>{createdAt}</Left>
36 |         <Right>
37 |           <Link to={getLink(article.number)}>{article.title}</Link>
38 |         </Right>
39 |       </Row>
40 |       <Row tw="mt-1">
41 |         <Left>
42 |           <IconComments tw="inline mr-2" />
43 |           {article.comments}
44 |         </Left>
45 |         <Right tw="flex text-sm text-slate-400">
46 |           {article.labels.map((label) => (
47 |             <LabelItem key={label.id} label={label} getLink={getLabelLink} />
48 |           ))}
49 |         </Right>
50 |       </Row>
51 |     </Wrapper>
52 |   );
53 | }
54 | 


--------------------------------------------------------------------------------
/src/components/ArticleSkeleton.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import tw from 'twin.macro';
 3 | 
 4 | import Skeleton from './Skeleton';
 5 | 
 6 | const Wrapper = tw.div`flex flex-col justify-center h-20 border-t  border-dotted border-gray-300 dark:border-gray-800`;
 7 | 
 8 | const Row = tw.div`flex items-center`;
 9 | 
10 | const Left = tw.div`hidden lg:block w-36 text-sm text-right`;
11 | 
12 | const Right = tw.div`ml-4 flex-1 min-w-0 truncate`;
13 | 
14 | export default function ArticleSkeleton() {
15 |   const titleWidth = `${50 + Math.random() * 50}%`;
16 |   const labelCount = Math.floor(Math.random() * 3) + 1;
17 | 
18 |   return (
19 |     <Wrapper>
20 |       <Row>
21 |         <Left>
22 |           <Skeleton />
23 |         </Left>
24 |         <Right>
25 |           <Skeleton style={{ width: titleWidth }} />
26 |         </Right>
27 |       </Row>
28 |       <Row tw="mt-1">
29 |         <Left>
30 |           <Skeleton tw="inline-block w-10" />
31 |         </Left>
32 |         <Right tw="flex">
33 |           {Array.from({ length: labelCount }).map((_, i) => (
34 |             <Skeleton key={i} tw="mr-4 w-10" />
35 |           ))}
36 |         </Right>
37 |       </Row>
38 |     </Wrapper>
39 |   );
40 | }
41 | 


--------------------------------------------------------------------------------
/src/components/CommentItem.tsx:
--------------------------------------------------------------------------------
 1 | import { format } from 'date-fns';
 2 | import React, { useMemo } from 'react';
 3 | import { useTranslation } from 'react-i18next';
 4 | import tw from 'twin.macro';
 5 | 
 6 | import CommentModel from '../models/CommentModel';
 7 | import MarkdownHtml from './MarkdownHtml';
 8 | 
 9 | const Wrapper = tw.div`relative mt-8 pt-8 pl-12 border-t border-gray-300 dark:border-gray-800`;
10 | 
11 | const Avatar = tw.div`absolute top-8 left-0 w-8 h-8 rounded-full overflow-hidden`;
12 | 
13 | const Header = tw.header`mb-2 space-x-4 flex items-center text-sm`;
14 | 
15 | const OwnerTag = tw.span`px-1 text-xs text-white leading-5 rounded-sm bg-blue-500`;
16 | 
17 | export type CommentItemProps = {
18 |   comment: CommentModel;
19 | };
20 | 
21 | export default function CommentItem(props: CommentItemProps) {
22 |   const { comment } = props;
23 |   const { t } = useTranslation();
24 | 
25 |   const createdAt = useMemo(() => {
26 |     return format(new Date(comment.createdAt), 'yyyy-MM-dd HH:mm:ss');
27 |   }, ['article']);
28 | 
29 |   const link = useMemo(() => {
30 |     const { origin, pathname } = window.location;
31 |     return [origin, pathname, `#${comment.id}`].join('');
32 |   }, [comment]);
33 | 
34 |   return (
35 |     <Wrapper>
36 |       <Avatar>
37 |         <img src={comment.user.avatarUrl} alt="Avatar" />
38 |       </Avatar>
39 |       <Header>
40 |         <a href={comment.user.htmlUrl}>{comment.user.login}</a>
41 |         {comment.authorAssociation === 'OWNER' && <OwnerTag>{t('comment.owner')}</OwnerTag>}
42 |         <a href={link} tw="opacity-40 text-xs">
43 |           {createdAt}
44 |         </a>
45 |       </Header>
46 |       <MarkdownHtml markdown={comment.body} />
47 |     </Wrapper>
48 |   );
49 | }
50 | 


--------------------------------------------------------------------------------
/src/components/CommentSkeleton.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import tw from 'twin.macro';
 3 | 
 4 | import Skeleton from './Skeleton';
 5 | 
 6 | const Wrapper = tw.div`relative mt-8 pt-8 pl-12 border-t border-gray-300 dark:border-gray-800`;
 7 | 
 8 | export default function CommentSkeleton() {
 9 |   return (
10 |     <Wrapper>
11 |       <Skeleton tw="absolute top-8 left-0 w-8 h-8 rounded-full" />
12 |       <Skeleton tw="mb-2 w-1/3" />
13 |       <div tw="space-y-2">
14 |         <Skeleton tw="w-full" />
15 |         <Skeleton tw="w-3/5" />
16 |       </div>
17 |     </Wrapper>
18 |   );
19 | }
20 | 


--------------------------------------------------------------------------------
/src/components/LabelItem.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import { Link, To } from 'react-router-dom';
 3 | import tw from 'twin.macro';
 4 | 
 5 | import LabelModel from '../models/LabelModel';
 6 | 
 7 | const Wrapper = tw(Link)`mr-4 flex items-center`;
 8 | 
 9 | const Dot = tw.span`w-2 h-2 rounded-full`;
10 | 
11 | const Title = tw.span`ml-2 dark:text-slate-600`;
12 | 
13 | export type LabelItemProps = {
14 |   label: LabelModel;
15 |   getLink: (label: string) => To;
16 | };
17 | 
18 | export default function LabelItem(props: LabelItemProps) {
19 |   const { label, getLink } = props;
20 | 
21 |   return (
22 |     <Wrapper to={getLink(label.name)}>
23 |       <Dot style={{ background: label.color }} />
24 |       <Title>{label.name}</Title>
25 |     </Wrapper>
26 |   );
27 | }
28 | 


--------------------------------------------------------------------------------
/src/components/MarkdownHtml.tsx:
--------------------------------------------------------------------------------
  1 | import { SANDBOX_TEMPLATES } from '@codesandbox/sandpack-react';
  2 | import MarkdownIt from 'markdown-it';
  3 | import React, { memo, useContext, useEffect, useRef, useState } from 'react';
  4 | import { Root, createRoot } from 'react-dom/client';
  5 | import tw, { styled } from 'twin.macro';
  6 | 
  7 | import { DarkModeValueContext } from '../hooks/use-dark-mode';
  8 | import { highlight } from '../utils';
  9 | import Playground, { PlaygroundProps } from './Playground';
 10 | 
 11 | const Container = styled.div`
 12 |   ${tw`bg-transparent!`}
 13 | 
 14 |   > pre {
 15 |     ${tw`rounded shadow-md border border-gray-200 bg-white dark:bg-slate-800 dark:border-gray-800`}
 16 |   }
 17 | `;
 18 | 
 19 | const parseArgs = (raw: string): Record<string, string> => {
 20 |   const re = /(?<key>\w+)="(?<value>[^"]*)"/g;
 21 |   const args: Record<string, string> = {};
 22 | 
 23 |   for (const matched of raw.matchAll(re)) {
 24 |     const { key, value } = matched.groups!;
 25 |     args[key] = value;
 26 |   }
 27 | 
 28 |   const [lang] = raw.split(' ', 1);
 29 |   if (lang) args.lang = lang;
 30 | 
 31 |   return args;
 32 | };
 33 | 
 34 | const toHtml = (markdown: string, playground?: boolean) => {
 35 |   if (!markdown) return '';
 36 | 
 37 |   const md = new MarkdownIt({ highlight });
 38 |   const defaultFence = md.renderer.rules.fence;
 39 | 
 40 |   md.renderer.rules.fence = (tokens, idx, options, env, self) => {
 41 |     const { content, info } = tokens[idx];
 42 |     const args = parseArgs(info);
 43 | 
 44 |     if (playground && Object.keys(SANDBOX_TEMPLATES).includes(args.template)) {
 45 |       const el = document.createElement('div');
 46 | 
 47 |       Object.assign(el.dataset, {
 48 |         playground: true,
 49 |         code: content,
 50 |         template: args.template,
 51 |         autorun: args.autorun !== 'false',
 52 |       });
 53 | 
 54 |       return el.outerHTML;
 55 |     }
 56 | 
 57 |     return defaultFence?.(tokens, idx, options, env, self) || '';
 58 |   };
 59 | 
 60 |   return md.render(markdown);
 61 | };
 62 | 
 63 | type ReactRootElement = HTMLDivElement & { reactRoot?: Root };
 64 | 
 65 | export type MarkdownHtmlProps = {
 66 |   markdown: string;
 67 |   playground?: boolean;
 68 | };
 69 | 
 70 | export default memo(function MarkdownHtml(props: MarkdownHtmlProps) {
 71 |   const { markdown, playground } = props;
 72 |   const darkMode = useContext(DarkModeValueContext);
 73 | 
 74 |   const container = useRef<HTMLDivElement>(null);
 75 |   const playgrounds = useRef<Root[]>([]);
 76 |   const [html, setHtml] = useState('');
 77 | 
 78 |   useEffect(() => {
 79 |     setHtml(toHtml(markdown, playground));
 80 |   }, []);
 81 | 
 82 |   useEffect(() => {
 83 |     if (!container.current) return;
 84 | 
 85 |     container.current
 86 |       .querySelectorAll<HTMLDivElement>('[data-playground]')
 87 |       .forEach((el: ReactRootElement) => {
 88 |         if (!el.reactRoot) {
 89 |           el.reactRoot = createRoot(el);
 90 |           playgrounds.current.push(el.reactRoot);
 91 |         }
 92 | 
 93 |         el.reactRoot.render(
 94 |           <Playground {...(el.dataset as PlaygroundProps)} theme={darkMode ? 'dark' : 'light'} />,
 95 |         );
 96 |       });
 97 |   }, [html, darkMode]);
 98 | 
 99 |   useEffect(() => {
100 |     return () => {
101 |       playgrounds.current.forEach((root) => {
102 |         setTimeout(() => root.unmount(), 0);
103 |       });
104 |     };
105 |   }, []);
106 | 
107 |   return (
108 |     <Container
109 |       ref={container}
110 |       className="markdown-body"
111 |       dangerouslySetInnerHTML={{ __html: html }}
112 |     />
113 |   );
114 | });
115 | 


--------------------------------------------------------------------------------
/src/components/Pagination.tsx:
--------------------------------------------------------------------------------
 1 | import React, { useCallback, useMemo } from 'react';
 2 | import tw, { styled } from 'twin.macro';
 3 | import IconArrowLeft from '~icons/ri/arrow-left-s-line';
 4 | import IconArrowRight from '~icons/ri/arrow-right-s-line';
 5 | 
 6 | import { clamp } from '../utils';
 7 | 
 8 | const RADIUS = 2;
 9 | const RANGE = 2 * RADIUS;
10 | 
11 | const List = tw.ul`space-x-4 flex items-center`;
12 | 
13 | const Item = styled.li<{ active?: boolean; disabled?: boolean }>`
14 |   ${tw`w-8 h-8 flex items-center justify-center rounded-sm text-slate-300  cursor-pointer`}
15 |   ${({ active }) => active && tw`bg-blue-500 text-white`}
16 |   ${({ disabled }) => disabled && tw`opacity-30 cursor-not-allowed`}
17 | `;
18 | 
19 | export type PaginationProps = {
20 |   page: number;
21 |   pageSize: number;
22 |   total: number;
23 |   onChange?: (page: number) => void;
24 | };
25 | 
26 | export default function Pagination(props: PaginationProps) {
27 |   const { page, pageSize, total, onChange } = props;
28 | 
29 |   const totalPages = useMemo(() => Math.ceil(total / pageSize), [total, pageSize]);
30 | 
31 |   const pages = useMemo(() => {
32 |     if (totalPages < 1) return [];
33 | 
34 |     const start = clamp(
35 |       page + RADIUS > totalPages ? totalPages - RANGE : page - RADIUS,
36 |       1,
37 |       totalPages,
38 |     );
39 | 
40 |     const end = clamp(start + RANGE, start, totalPages);
41 |     const length = end - start + 1;
42 | 
43 |     return Array.from({ length }).map((_, i) => start + i);
44 |   }, [page, totalPages]);
45 | 
46 |   const hasPrevious = page > 1;
47 |   const hasNext = page < totalPages;
48 | 
49 |   const onGoto = useCallback(
50 |     (e: React.MouseEvent<HTMLLIElement>) => {
51 |       const to = (e.target as HTMLLIElement).dataset.page;
52 |       if (to) onChange?.(parseInt(to, 10));
53 |     },
54 |     [onChange],
55 |   );
56 | 
57 |   const onPrevious = useCallback(() => {
58 |     if (hasPrevious) onChange?.(page - 1);
59 |   }, [page, hasPrevious, onChange]);
60 | 
61 |   const onNext = useCallback(() => {
62 |     if (hasNext) onChange?.(page + 1);
63 |   }, [page, hasNext, onChange]);
64 | 
65 |   if (totalPages <= 0) return null;
66 | 
67 |   return (
68 |     <List>
69 |       <Item disabled={!hasPrevious} onClick={onPrevious}>
70 |         <IconArrowLeft />
71 |       </Item>
72 |       {pages.map((i) => (
73 |         <Item key={i} active={i === page} onClick={onGoto} data-page={i}>
74 |           {i}
75 |         </Item>
76 |       ))}
77 |       <Item disabled={!hasNext} onClick={onNext}>
78 |         <IconArrowRight />
79 |       </Item>
80 |     </List>
81 |   );
82 | }
83 | 


--------------------------------------------------------------------------------
/src/components/Playground.tsx:
--------------------------------------------------------------------------------
  1 | import {
  2 |   SANDBOX_TEMPLATES,
  3 |   SandpackCodeEditor,
  4 |   SandpackConsole,
  5 |   SandpackLayout,
  6 |   SandpackPredefinedTemplate,
  7 |   SandpackPreview,
  8 |   SandpackProvider,
  9 |   SandpackStack,
 10 | } from '@codesandbox/sandpack-react';
 11 | import { memo, useCallback, useEffect, useRef, useState } from 'react';
 12 | import tw, { styled } from 'twin.macro';
 13 | 
 14 | import { clamp } from '../utils';
 15 | 
 16 | type DragHandlerProps = {
 17 |   direction: 'horizontal' | 'vertical';
 18 | };
 19 | 
 20 | const DragHandler = styled.div<DragHandlerProps>`
 21 |   ${tw`absolute z-1`}
 22 |   ${({ direction }) =>
 23 |     direction === 'horizontal'
 24 |       ? tw`top-0 bottom-0 w-2 cursor-ew-resize`
 25 |       : tw`left-0 right-0 h-2 cursor-ns-resize`}
 26 | `;
 27 | 
 28 | const ConsoleWrapper = tw.div`w-full overflow-hidden`;
 29 | 
 30 | export type PlaygroundProps = {
 31 |   theme: 'dark' | 'light';
 32 |   code: string;
 33 |   template: SandpackPredefinedTemplate;
 34 |   autorun: string;
 35 | };
 36 | 
 37 | export default memo(function Playground(props: PlaygroundProps) {
 38 |   const { theme, code, template, autorun } = props;
 39 |   const entry = SANDBOX_TEMPLATES[template].main;
 40 | 
 41 |   const [horizontalSize, setHorizontalSize] = useState(50);
 42 |   const [verticalSize, setVerticalSize] = useState(70);
 43 | 
 44 |   const dragHandlerRef = useRef<HTMLDivElement>();
 45 | 
 46 |   const onDragStart = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
 47 |     dragHandlerRef.current = e.target as HTMLDivElement;
 48 | 
 49 |     const container = dragHandlerRef.current.parentElement;
 50 |     container?.querySelectorAll<HTMLDivElement>('.sp-stack').forEach((el) => {
 51 |       el.style.pointerEvents = 'none';
 52 |     });
 53 |   }, []);
 54 | 
 55 |   const onDragMove = useCallback((e: MouseEvent) => {
 56 |     if (!dragHandlerRef.current?.parentElement) return;
 57 | 
 58 |     const container = dragHandlerRef.current.parentElement;
 59 |     const { direction } = dragHandlerRef.current.dataset;
 60 |     const { width, height, top, left } = container.getBoundingClientRect();
 61 | 
 62 |     if (direction === 'horizontal') {
 63 |       const size = ((e.clientX - left) / width) * 100;
 64 |       setHorizontalSize(clamp(size, 25, 75));
 65 |     } else {
 66 |       const size = ((e.clientY - top) / height) * 100;
 67 |       setVerticalSize(clamp(size, 25, 75));
 68 |     }
 69 |   }, []);
 70 | 
 71 |   const onDragEnd = useCallback(() => {
 72 |     if (!dragHandlerRef.current?.parentElement) return;
 73 | 
 74 |     const container = dragHandlerRef.current.parentElement;
 75 |     container?.querySelectorAll<HTMLDivElement>('.sp-stack').forEach((el) => {
 76 |       el.style.pointerEvents = 'auto';
 77 |     });
 78 | 
 79 |     dragHandlerRef.current = undefined;
 80 |   }, []);
 81 | 
 82 |   useEffect(() => {
 83 |     document.body.addEventListener('mousemove', onDragMove);
 84 |     document.body.addEventListener('mouseup', onDragEnd);
 85 | 
 86 |     return (): void => {
 87 |       document.body.removeEventListener('mousemove', onDragMove);
 88 |       document.body.removeEventListener('mouseup', onDragEnd);
 89 |     };
 90 |   }, []);
 91 | 
 92 |   return (
 93 |     <SandpackProvider
 94 |       theme={theme}
 95 |       template={template}
 96 |       options={{ autorun: autorun !== 'false' }}
 97 |       customSetup={{ entry }}
 98 |       files={{ [entry]: code }}
 99 |     >
100 |       <SandpackLayout>
101 |         <SandpackCodeEditor
102 |           style={{
103 |             height: 500,
104 |             flexGrow: horizontalSize,
105 |             flexShrink: horizontalSize,
106 |             flexBasis: 0,
107 |             overflow: 'hidden',
108 |           }}
109 |         />
110 |         <DragHandler
111 |           direction="horizontal"
112 |           data-direction="horizontal"
113 |           style={{ left: `calc(${horizontalSize}% - 5px)` }}
114 |           onMouseDown={onDragStart}
115 |         />
116 |         <SandpackStack
117 |           style={{
118 |             height: 500,
119 |             flexGrow: 100 - horizontalSize,
120 |             flexShrink: 100 - horizontalSize,
121 |             flexBasis: 0,
122 |             width: 100 - horizontalSize + '%',
123 |             gap: 1,
124 |           }}
125 |         >
126 |           <SandpackPreview
127 |             showOpenInCodeSandbox={false}
128 |             style={{
129 |               flexGrow: verticalSize,
130 |               flexShrink: verticalSize,
131 |               flexBasis: 0,
132 |               overflow: 'hidden',
133 |             }}
134 |           />
135 |           <DragHandler
136 |             direction="vertical"
137 |             data-direction="vertical"
138 |             style={{ top: `calc(${verticalSize}% - 5px)` }}
139 |             onMouseDown={onDragStart}
140 |           />
141 |           <ConsoleWrapper
142 |             style={{
143 |               flexGrow: 100 - verticalSize,
144 |               flexShrink: 100 - verticalSize,
145 |               flexBasis: 0,
146 |             }}
147 |           >
148 |             <SandpackConsole resetOnPreviewRestart />
149 |           </ConsoleWrapper>
150 |         </SandpackStack>
151 |       </SandpackLayout>
152 |     </SandpackProvider>
153 |   );
154 | });
155 | 


--------------------------------------------------------------------------------
/src/components/ProjectItem.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import tw, { styled } from 'twin.macro';
 3 | import IconIssue from '~icons/octicon/issue-opened-16';
 4 | import IconForked from '~icons/octicon/repo-forked-16';
 5 | import IconStar from '~icons/octicon/star-16';
 6 | import IconDefault from '~icons/ri/code-s-slash-line';
 7 | import IconCss from '~icons/ri/css3-line';
 8 | import IconHtml from '~icons/ri/html5-line';
 9 | import IconVue from '~icons/ri/vuejs-line';
10 | import IconJs from '~icons/teenyicons/javascript-outline';
11 | import IconTs from '~icons/teenyicons/typescript-outline';
12 | import IconCS from '~icons/vscode-icons/file-type-csharp';
13 | 
14 | import ProjectModel from '../models/ProjectModel';
15 | 
16 | const Wrapper = tw.div`
17 |   relative p-3 pl-14
18 |   bg-white dark:bg-gray-900 rounded-md ring-1 ring-slate-600/5 shadow-sm hover:shadow-lg
19 |   transition-all duration-300
20 | `;
21 | 
22 | const Icon = styled.div`
23 |   ${tw`
24 |     absolute top-3 left-3 w-9 h-9 rounded-md
25 |     flex items-center justify-center overflow-hidden font-bold
26 |   `}
27 | 
28 |   &::before {
29 |     ${tw`absolute top-0 left-0 block [content:''] w-full h-full opacity-20`}
30 |     background-color: currentColor;
31 |   }
32 | `;
33 | 
34 | const Title = tw.a`block text-blue-500 truncate`;
35 | 
36 | const Description = styled.div`
37 |   ${tw`mt-2 text-slate-400 text-sm overflow-hidden`}
38 | 
39 |   display: -webkit-box;
40 |   -webkit-line-clamp: 2;
41 |   -webkit-box-orient: vertical;
42 | `;
43 | 
44 | const CountList = tw.ul`mt-2 space-x-3 flex min-w-0 text-sm text-slate-400 leading-5`;
45 | 
46 | const CountItem = tw.li`flex items-center`;
47 | 
48 | type IconDetail = {
49 |   component: React.FunctionComponent;
50 |   color: string;
51 | };
52 | 
53 | const iconMap: Record<string, IconDetail> = {
54 |   default: { component: IconDefault, color: '' },
55 |   TypeScript: { component: IconTs, color: '#3178C6' },
56 |   JavaScript: { component: IconJs, color: '#FCD002' },
57 |   HTML: { component: IconHtml, color: '#FF3C41' },
58 |   CSS: { component: IconCss, color: '#10BDFF' },
59 |   Vue: { component: IconVue, color: '#41B883' },
60 |   'C#': { component: IconCS, color: '#368833' },
61 | };
62 | 
63 | export type ProjectItemProps = {
64 |   project: ProjectModel;
65 | };
66 | 
67 | export default function ProjectItem(props: ProjectItemProps) {
68 |   const { project } = props;
69 | 
70 |   const icon = iconMap[props.project.language] ?? iconMap.default;
71 | 
72 |   return (
73 |     <Wrapper>
74 |       <Icon style={{ color: icon.color }}>
75 |         <icon.component />
76 |       </Icon>
77 |       <Title href={project.htmlUrl}>{project.fullName}</Title>
78 |       <Description>{project.description}</Description>
79 |       <CountList>
80 |         <CountItem>
81 |           <IconStar />
82 |           <span tw="ml-2">{project.stargazersCount}</span>
83 |         </CountItem>
84 |         <CountItem>
85 |           <IconForked />
86 |           <span tw="ml-2">{project.forksCount}</span>
87 |         </CountItem>
88 |         <CountItem>
89 |           <IconIssue />
90 |           <span tw="ml-2">{project.openIssuesCount}</span>
91 |         </CountItem>
92 |       </CountList>
93 |     </Wrapper>
94 |   );
95 | }
96 | 


--------------------------------------------------------------------------------
/src/components/ProjectSkeleton.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import tw from 'twin.macro';
 3 | 
 4 | import Skeleton from './Skeleton';
 5 | 
 6 | const Wrapper = tw.div`
 7 |   relative p-3 pl-14
 8 |   bg-white dark:bg-gray-900 rounded-md ring-1 ring-slate-600/5 shadow-sm hover:shadow-lg
 9 |   transition-all duration-300
10 | `;
11 | 
12 | const Icon = tw(Skeleton)`absolute top-3 left-3 w-9 h-9 rounded-md`;
13 | 
14 | const Title = tw(Skeleton)`w-1/2 h-5 text-blue-200`;
15 | 
16 | const Description = tw(Skeleton)`mt-2 w-2/3`;
17 | 
18 | const CountList = tw.div`mt-2 flex`;
19 | 
20 | const CountItem = tw(Skeleton)`mr-4 w-10 h-5`;
21 | 
22 | export default function ProjectSkeleton() {
23 |   return (
24 |     <Wrapper>
25 |       <Icon />
26 |       <Title />
27 |       <Description />
28 |       <CountList>
29 |         {Array.from({ length: 3 }).map((_, i) => (
30 |           <CountItem key={i} />
31 |         ))}
32 |       </CountList>
33 |     </Wrapper>
34 |   );
35 | }
36 | 


--------------------------------------------------------------------------------
/src/components/ShapeEffect/ShapeEffect.tsx:
--------------------------------------------------------------------------------
  1 | import React, { useCallback, useEffect, useRef, useState } from 'react';
  2 | import tw from 'twin.macro';
  3 | 
  4 | import { Circle, Rectangle, Shape, Triangle } from './shapes';
  5 | 
  6 | const Canvas = tw.canvas`w-full h-full opacity-0 transition-opacity duration-300`;
  7 | 
  8 | const visible = tw`opacity-100`;
  9 | 
 10 | const Shapes = [Triangle, Rectangle, Circle];
 11 | 
 12 | // https://tailwindcss.com/docs/customizing-colors
 13 | const colors = [
 14 |   // '#71717a',
 15 |   // '#737373',
 16 |   // '#78716c',
 17 |   // '#ef4444',
 18 |   '#f97316',
 19 |   '#f59e0b',
 20 |   '#eab308',
 21 |   '#84cc16',
 22 |   '#22c55e',
 23 |   '#10b981',
 24 |   '#14b8a6',
 25 |   '#06b6d4',
 26 |   '#0ea5e9',
 27 |   '#3b82f6',
 28 |   '#6366f1',
 29 |   '#8b5cf6',
 30 |   '#a855f7',
 31 |   '#d946ef',
 32 |   '#ec4899',
 33 |   '#f43f5e',
 34 | ];
 35 | 
 36 | export type ShapeEffectProps = {
 37 |   count: number;
 38 |   sizes: [min: number, max: number];
 39 | };
 40 | 
 41 | export default function ShapeEffect(props: ShapeEffectProps) {
 42 |   const { count, sizes } = props;
 43 | 
 44 |   const [mounted, setMounted] = useState(false);
 45 |   const canvas = useRef<HTMLCanvasElement>(null);
 46 |   const shapes = useRef<Shape[]>([]);
 47 | 
 48 |   const resize = useCallback(() => {
 49 |     if (!canvas.current) return;
 50 | 
 51 |     const rect = canvas.current.getBoundingClientRect();
 52 |     canvas.current.width = rect.width;
 53 |     canvas.current.height = rect.height;
 54 |   }, []);
 55 | 
 56 |   const fill = useCallback(() => {
 57 |     if (!canvas.current) return;
 58 |     const ctxWidth = canvas.current.width;
 59 |     const ctxHeight = canvas.current.height;
 60 |     const firstTime = shapes.current.length === 0;
 61 | 
 62 |     while (shapes.current.length < count) {
 63 |       const ShapeCtor = Shapes[Math.floor(Math.random() * Shapes.length)];
 64 |       const color = colors[Math.floor(Math.random() * colors.length)];
 65 |       const size = sizes[0] + Math.random() * (sizes[1] - sizes[0]);
 66 |       const x = firstTime ? Math.random() * ctxWidth : -size;
 67 |       const y = Math.random() * ctxHeight;
 68 | 
 69 |       shapes.current.push(new ShapeCtor(x, y, size, color));
 70 |     }
 71 |   }, []);
 72 | 
 73 |   const draw = useCallback(() => {
 74 |     if (!canvas.current) return;
 75 |     const ctx = canvas.current.getContext('2d')!;
 76 |     const ctxWidth = canvas.current.width;
 77 |     const ctxHeight = canvas.current.height;
 78 | 
 79 |     ctx.clearRect(0, 0, ctxWidth, ctxHeight);
 80 | 
 81 |     shapes.current.forEach((shape) => {
 82 |       shape.move();
 83 |       shape.draw(ctx);
 84 |     });
 85 | 
 86 |     shapes.current = shapes.current.filter((shape) => {
 87 |       return shape.x - shape.size < ctxWidth;
 88 |     });
 89 |   }, []);
 90 | 
 91 |   const tick = useCallback(() => {
 92 |     fill();
 93 |     draw();
 94 |     requestAnimationFrame(tick);
 95 |   }, []);
 96 | 
 97 |   useEffect(() => {
 98 |     resize();
 99 |     tick();
100 |     setMounted(true);
101 |     window.addEventListener('resize', resize);
102 | 
103 |     return () => {
104 |       window.removeEventListener('resize', resize);
105 |     };
106 |   }, []);
107 | 
108 |   return <Canvas ref={canvas} css={[mounted && visible]} />;
109 | }
110 | 


--------------------------------------------------------------------------------
/src/components/ShapeEffect/shapes.ts:
--------------------------------------------------------------------------------
  1 | interface Point {
  2 |   x: number;
  3 |   y: number;
  4 | }
  5 | 
  6 | function createPolygonPath2D(points: Point[]) {
  7 |   const path = new Path2D();
  8 | 
  9 |   points.forEach((point, index) => {
 10 |     if (index === 0) {
 11 |       path.moveTo(point.x, point.y);
 12 |     } else {
 13 |       path.lineTo(point.x, point.y);
 14 |     }
 15 |   });
 16 | 
 17 |   return path;
 18 | }
 19 | 
 20 | export abstract class Shape implements Point {
 21 |   x: number;
 22 | 
 23 |   y: number;
 24 | 
 25 |   size: number;
 26 | 
 27 |   color: string;
 28 | 
 29 |   angle = 2 * Math.PI * Math.random();
 30 | 
 31 |   rotate = Math.random() * Math.PI;
 32 | 
 33 |   speed = 0.2 + Math.random() * 1.5;
 34 | 
 35 |   constructor(x: number, y: number, size: number, color: string) {
 36 |     this.x = x;
 37 |     this.y = y;
 38 |     this.size = size;
 39 |     this.color = color;
 40 |   }
 41 | 
 42 |   move() {
 43 |     this.x += this.speed;
 44 |     this.rotate -= this.speed * 0.006;
 45 |   }
 46 | 
 47 |   createGradient(ctx: CanvasRenderingContext2D) {
 48 |     const size = this.size * 1.5;
 49 |     const endAngle = this.angle + Math.PI;
 50 | 
 51 |     const startX = this.x + this.size * Math.sin(this.angle + this.rotate);
 52 |     const startY = this.y + this.size * Math.cos(this.angle + this.rotate);
 53 |     const endX = this.x + size * Math.sin(endAngle + this.rotate);
 54 |     const endY = this.y + size * Math.cos(endAngle + this.rotate);
 55 | 
 56 |     const gradient = ctx.createLinearGradient(startX, startY, endX, endY);
 57 |     gradient.addColorStop(0, this.color);
 58 |     gradient.addColorStop(0.3, this.color);
 59 |     gradient.addColorStop(0.85, '#ffffff');
 60 | 
 61 |     return gradient;
 62 |   }
 63 | 
 64 |   abstract draw(ctx: CanvasRenderingContext2D): void;
 65 | }
 66 | 
 67 | export class Polygon extends Shape {
 68 |   sides: number;
 69 | 
 70 |   constructor(
 71 |     x: number,
 72 |     y: number,
 73 |     size: number,
 74 |     color: string,
 75 |     sides: number
 76 |   ) {
 77 |     super(x, y, size, color);
 78 |     this.sides = sides;
 79 |   }
 80 | 
 81 |   draw(ctx: CanvasRenderingContext2D) {
 82 |     const halfSize = this.size / 2;
 83 |     const angle = (Math.PI * 2) / this.sides;
 84 |     const points: Point[] = [];
 85 | 
 86 |     Array.from({ length: this.sides }).forEach((_, i) => {
 87 |       points.push({
 88 |         x: this.x + halfSize * Math.sin(angle * i + this.rotate),
 89 |         y: this.y + halfSize * Math.cos(angle * i + this.rotate),
 90 |       });
 91 |     });
 92 | 
 93 |     const path = createPolygonPath2D(points);
 94 |     ctx.fillStyle = this.createGradient(ctx);
 95 |     ctx.fill(path);
 96 |   }
 97 | }
 98 | 
 99 | export class Triangle extends Polygon {
100 |   constructor(x: number, y: number, size: number, color: string) {
101 |     super(x, y, size, color, 3);
102 |   }
103 | }
104 | 
105 | export class Rectangle extends Polygon {
106 |   constructor(x: number, y: number, size: number, color: string) {
107 |     super(x, y, size, color, 4);
108 |   }
109 | }
110 | 
111 | export class Circle extends Shape {
112 |   draw(ctx: CanvasRenderingContext2D) {
113 |     const radius = this.size / 2;
114 | 
115 |     const path = new Path2D();
116 |     path.moveTo(0, 0);
117 |     path.arc(this.x, this.y, radius, 0, 2 * Math.PI);
118 | 
119 |     ctx.fillStyle = this.createGradient(ctx);
120 |     ctx.fill(path);
121 |   }
122 | }
123 | 


--------------------------------------------------------------------------------
/src/components/Skeleton.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import tw from 'twin.macro';
 3 | 
 4 | const Bone = tw.div`h-6 rounded bg-gray-200 dark:bg-gray-800 animate-pulse`;
 5 | 
 6 | type SkeletonProps = React.HTMLAttributes<HTMLDivElement> & {
 7 |   children?: React.ReactElement;
 8 | };
 9 | 
10 | export default function Skeleton(props: SkeletonProps) {
11 |   return props.children ?? <Bone {...props} />;
12 | }
13 | 


--------------------------------------------------------------------------------
/src/favicon.svg:
--------------------------------------------------------------------------------
 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512"
 2 |   viewBox="0 0 512 512">
 3 |   <defs>
 4 |     <clipPath id="a">
 5 |       <rect width="349" height="318" fill="none" />
 6 |     </clipPath>
 7 |     <clipPath id="c">
 8 |       <rect width="512" height="512" />
 9 |     </clipPath>
10 |   </defs>
11 |   <g id="b" clip-path="url(#c)">
12 |     <rect width="480" height="480" rx="88" transform="translate(16 16)" fill="#3b82f6" />
13 |     <g transform="translate(82 97)" opacity="0.3" clip-path="url(#a)">
14 |       <g transform="translate(-94 -135)">
15 |         <rect width="349" height="23" rx="11.5" transform="translate(94 135)" fill="#fff" />
16 |       </g>
17 |       <g transform="translate(-94 -76)">
18 |         <rect width="349" height="23" rx="11.5" transform="translate(94 135)" fill="#fff" />
19 |       </g>
20 |       <g transform="translate(-94 -17)">
21 |         <rect width="349" height="23" rx="11.5" transform="translate(94 135)" fill="#fff" />
22 |       </g>
23 |       <g transform="translate(-94 42)">
24 |         <rect width="349" height="23" rx="11.5" transform="translate(94 135)" fill="#fff" />
25 |       </g>
26 |       <g transform="translate(-94 101)">
27 |         <rect width="349" height="23" rx="11.5" transform="translate(94 135)" fill="#fff" />
28 |       </g>
29 |       <g transform="translate(-94 160)">
30 |         <rect width="349" height="23" rx="11.5" transform="translate(94 135)" fill="#fff" />
31 |       </g>
32 |     </g>
33 |     <path
34 |       d="M230.712-250.8h60.941V-2.349q0,21.095,5.86,33.986t26.955,12.891h4.688V58.591H272.9q-12.188,0-20.392-2.813a25.854,25.854,0,0,1-13.126-9.844q-4.922-7.032-6.8-18.751a192.274,192.274,0,0,1-1.875-29.533V-91.417H104.143V58.591H43.2V-189.859q0-21.095-5.86-33.986T10.388-236.737H5.7V-250.8H61.953q12.188,0,20.392,3.047A27.188,27.188,0,0,1,95.47-237.674q4.922,7.032,6.8,18.751a188.5,188.5,0,0,1,1.875,29.064v77.348H230.712Z"
35 |       transform="translate(88.3 351.8)" fill="#fff" />
36 |   </g>
37 | </svg>


--------------------------------------------------------------------------------
/src/hooks/use-dark-mode.ts:
--------------------------------------------------------------------------------
 1 | import { createContext, useEffect } from 'react';
 2 | 
 3 | import useLocalStorage from './use-local-storage';
 4 | 
 5 | export const DarkModeValueContext = createContext(false);
 6 | 
 7 | export default function useDarkMode() {
 8 |   const [enabledValue, setEnabledValue] = useLocalStorage<boolean>('dark-mode-enabled');
 9 | 
10 |   const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
11 | 
12 |   const enabled = enabledValue ?? prefersDarkMode;
13 | 
14 |   useEffect(() => {
15 |     if (enabled) {
16 |       document.documentElement.classList.add('dark');
17 |     } else {
18 |       document.documentElement.classList.remove('dark');
19 |     }
20 |   }, [enabled]);
21 | 
22 |   return [enabled, setEnabledValue] as const;
23 | }
24 | 


--------------------------------------------------------------------------------
/src/hooks/use-handling.ts:
--------------------------------------------------------------------------------
 1 | import { useState } from 'react';
 2 | 
 3 | import { AnyFunction } from '../utils';
 4 | 
 5 | export default function useHandling<T extends AnyFunction>(
 6 |   handler: T,
 7 |   initialValue = false
 8 | ) {
 9 |   const [handling, setHandling] = useState(initialValue);
10 | 
11 |   const execute = async (...args: Parameters<T>) => {
12 |     setHandling(true);
13 | 
14 |     try {
15 |       return (await handler(...args)) as Promise<ReturnType<T>>;
16 |     } finally {
17 |       setHandling(false);
18 |     }
19 |   };
20 | 
21 |   return [handling, execute as T] as const;
22 | }
23 | 


--------------------------------------------------------------------------------
/src/hooks/use-local-storage.ts:
--------------------------------------------------------------------------------
 1 | import { useCallback, useState } from 'react';
 2 | 
 3 | export default function useLocalStorage<T>(
 4 |   key: string
 5 | ): [T | undefined, (value: T) => void];
 6 | export default function useLocalStorage<T>(
 7 |   key: string,
 8 |   initialValue: T
 9 | ): [T, (value: T) => void];
10 | export default function useLocalStorage<T>(
11 |   key: string,
12 |   initialValue?: T
13 | ): [T, (value: T) => void] {
14 |   const [value, setValue] = useState<T>(() => {
15 |     try {
16 |       const item = window.localStorage.getItem(key);
17 |       return item ? JSON.parse(item) : initialValue;
18 |     } catch (error) {
19 |       return initialValue;
20 |     }
21 |   });
22 | 
23 |   const update = useCallback((newValue: T) => {
24 |     setValue(newValue);
25 |     window.localStorage.setItem(key, JSON.stringify(newValue));
26 |   }, []);
27 | 
28 |   return [value, update];
29 | }
30 | 


--------------------------------------------------------------------------------
/src/hooks/use-query.ts:
--------------------------------------------------------------------------------
 1 | import { useMemo } from 'react';
 2 | import { useSearchParams } from 'react-router-dom';
 3 | 
 4 | export default function useQuery() {
 5 |   const [search] = useSearchParams();
 6 |   const query = useMemo(() => Object.fromEntries(search.entries()), [search]);
 7 | 
 8 |   return query;
 9 | }
10 | 


--------------------------------------------------------------------------------
/src/i18n/index.ts:
--------------------------------------------------------------------------------
 1 | import i18n from 'i18next';
 2 | import { initReactI18next } from 'react-i18next';
 3 | 
 4 | import cn from './locales/cn';
 5 | import en from './locales/en';
 6 | 
 7 | export const defaultNS = 'translation';
 8 | export const resources = { cn, en };
 9 | 
10 | const preferredLanguage = navigator.language === 'zh-CN' ? 'cn' : 'en';
11 | const storedLanguage = localStorage.getItem('language');
12 | 
13 | i18n.use(initReactI18next).init({
14 |   resources,
15 |   defaultNS,
16 |   lng: storedLanguage || preferredLanguage,
17 | });
18 | 
19 | export default i18n;
20 | 


--------------------------------------------------------------------------------
/src/i18n/locales/cn/index.ts:
--------------------------------------------------------------------------------
1 | import translation from './translation.json';
2 | 
3 | export default { translation } as const;
4 | 


--------------------------------------------------------------------------------
/src/i18n/locales/cn/translation.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "tab": {
 3 |     "posts": "文章",
 4 |     "snippets": "代码片段",
 5 |     "projects": "项目"
 6 |   },
 7 |   "intro": {
 8 |     "title": "👋 你好,我是Harrie",
 9 |     "description": "一个全栈的Web开发者,主要专注于Node.js、Vue、React等技术",
10 |     "link": "开始阅读"
11 |   },
12 |   "dateFormat": "yyyy / MM / dd",
13 |   "comment": {
14 |     "title": "评论",
15 |     "btn": "评论",
16 |     "owner": "作者"
17 |   },
18 |   "projects": {
19 |     "title": "项目"
20 |   }
21 | }
22 | 


--------------------------------------------------------------------------------
/src/i18n/locales/en/index.ts:
--------------------------------------------------------------------------------
1 | import translation from './translation.json';
2 | 
3 | export default { translation } as const;
4 | 


--------------------------------------------------------------------------------
/src/i18n/locales/en/translation.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "tab": {
 3 |     "posts": "Posts",
 4 |     "snippets": "Snippets",
 5 |     "projects": "Projects"
 6 |   },
 7 |   "intro": {
 8 |     "title": "👋 Hi! I'm Harrie",
 9 |     "description": "A full-stack web developer, focuses on Node.js, Vue, React and other technologies",
10 |     "link": "Take a Look"
11 |   },
12 |   "dateFormat": "MMM dd, yyyy",
13 |   "comment": {
14 |     "title": "Comments",
15 |     "btn": "Click to Comment",
16 |     "owner": "Author"
17 |   },
18 |   "projects": {
19 |     "title": "Projects"
20 |   }
21 | }
22 | 


--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
 1 | import './i18n';
 2 | 
 3 | import React from 'react';
 4 | import { createRoot } from 'react-dom/client';
 5 | 
 6 | import App from './App';
 7 | import BaseStyles from './styles/BaseStyles';
 8 | 
 9 | document.title = import.meta.env.VITE_APP_TITLE;
10 | 
11 | const rootEl = document.getElementById('root')!;
12 | const root = createRoot(rootEl);
13 | 
14 | root.render(
15 |   <>
16 |     <BaseStyles />
17 |     <App />
18 |   </>,
19 | );
20 | 


--------------------------------------------------------------------------------
/src/models/ArticleModel.ts:
--------------------------------------------------------------------------------
 1 | import { Issue } from '../services/github';
 2 | import LabelModel from './LabelModel';
 3 | 
 4 | export default class ArticleModel {
 5 |   private constructor(
 6 |     public id: number,
 7 |     public number: number,
 8 |     public title: string,
 9 |     public body: string,
10 |     public comments: number,
11 |     public labels: LabelModel[],
12 |     public htmlUrl: string,
13 |     public createdAt: string,
14 |     public updatedAt: string
15 |   ) {}
16 | 
17 |   static from(raw: Issue): ArticleModel {
18 |     return new ArticleModel(
19 |       raw.id,
20 |       raw.number,
21 |       raw.title,
22 |       raw.body,
23 |       raw.comments,
24 |       raw.labels.map(LabelModel.from),
25 |       raw.html_url,
26 |       raw.created_at,
27 |       raw.updated_at
28 |     );
29 |   }
30 | }
31 | 


--------------------------------------------------------------------------------
/src/models/CategoryModel.ts:
--------------------------------------------------------------------------------
 1 | import { Milestone } from '../services/github';
 2 | 
 3 | export default class CategoryModel {
 4 |   private constructor(
 5 |     public id: number,
 6 |     public number: number,
 7 |     public title: string,
 8 |     public description: string,
 9 |     public articles: number
10 |   ) {}
11 | 
12 |   static from(raw: Milestone): CategoryModel {
13 |     return new CategoryModel(
14 |       raw.id,
15 |       raw.number,
16 |       raw.title,
17 |       raw.description,
18 |       raw.open_issues
19 |     );
20 |   }
21 | }
22 | 


--------------------------------------------------------------------------------
/src/models/CommentModel.ts:
--------------------------------------------------------------------------------
 1 | import { Comment } from '../services/github';
 2 | import UserModel from './UserModel';
 3 | 
 4 | export default class CommentModel {
 5 |   private constructor(
 6 |     public id: number,
 7 |     public body: string,
 8 |     public htmlUrl: string,
 9 |     public authorAssociation: string,
10 |     public createdAt: string,
11 |     public updatedAt: string,
12 |     public user: UserModel
13 |   ) {}
14 | 
15 |   static from(raw: Comment): CommentModel {
16 |     return new CommentModel(
17 |       raw.id,
18 |       raw.body,
19 |       raw.html_url,
20 |       raw.author_association,
21 |       raw.created_at,
22 |       raw.updated_at,
23 |       UserModel.from(raw.user)
24 |     );
25 |   }
26 | }
27 | 


--------------------------------------------------------------------------------
/src/models/LabelModel.ts:
--------------------------------------------------------------------------------
 1 | import { Label } from '../services/github';
 2 | 
 3 | export default class LabelModel {
 4 |   private constructor(
 5 |     public id: number,
 6 |     public name: string,
 7 |     public color: string
 8 |   ) {}
 9 | 
10 |   static from(raw: Label): LabelModel {
11 |     return new LabelModel(raw.id, raw.name, `#${raw.color}`);
12 |   }
13 | }
14 | 


--------------------------------------------------------------------------------
/src/models/ProjectModel.ts:
--------------------------------------------------------------------------------
 1 | import { Repository } from '../services/github';
 2 | import UserModel from './UserModel';
 3 | 
 4 | export default class ProjectModel {
 5 |   private constructor(
 6 |     public id: number,
 7 |     public owner: UserModel,
 8 |     public fullName: string,
 9 |     public name: string,
10 |     public htmlUrl: string,
11 |     public description: string,
12 |     public language: string,
13 |     public forksCount: number,
14 |     public stargazersCount: number,
15 |     public openIssuesCount: number,
16 |     public archived: boolean,
17 |     public disabled: boolean,
18 |     public pushedAt: string,
19 |     public createdAt: string,
20 |     public updatedAt: string
21 |   ) {}
22 | 
23 |   static from(raw: Repository): ProjectModel {
24 |     return new ProjectModel(
25 |       raw.id,
26 |       UserModel.from(raw.owner),
27 |       raw.full_name,
28 |       raw.name,
29 |       raw.html_url,
30 |       raw.description,
31 |       raw.language,
32 |       raw.forks_count,
33 |       raw.stargazers_count,
34 |       raw.open_issues_count,
35 |       raw.archived,
36 |       raw.disabled,
37 |       raw.pushed_at,
38 |       raw.created_at,
39 |       raw.updated_at
40 |     );
41 |   }
42 | }
43 | 


--------------------------------------------------------------------------------
/src/models/UserModel.ts:
--------------------------------------------------------------------------------
 1 | import { User } from '../services/github';
 2 | 
 3 | export default class UserModel {
 4 |   private constructor(
 5 |     public id: number,
 6 |     public login: string,
 7 |     public avatarUrl: string,
 8 |     public htmlUrl: string
 9 |   ) {}
10 | 
11 |   static from(raw: User): UserModel {
12 |     return new UserModel(raw.id, raw.login, raw.avatar_url, raw.html_url);
13 |   }
14 | }
15 | 


--------------------------------------------------------------------------------
/src/services/github.ts:
--------------------------------------------------------------------------------
  1 | export enum Sort {
  2 |   Created = 'created',
  3 |   Updated = 'updated',
  4 |   Comments = 'comments',
  5 | }
  6 | 
  7 | export enum State {
  8 |   All = 'all',
  9 |   Open = 'open',
 10 |   Closed = 'closed',
 11 | }
 12 | 
 13 | export enum Direction {
 14 |   Asc = 'asc',
 15 |   Desc = 'desc',
 16 | }
 17 | 
 18 | export enum RepositorySort {
 19 |   Created = 'created',
 20 |   Updated = 'updated',
 21 |   Pushed = 'pushed',
 22 |   FullName = 'full_name',
 23 | }
 24 | 
 25 | export enum RepositoryType {
 26 |   All = 'all',
 27 |   Owner = 'owner',
 28 |   Member = 'member',
 29 | }
 30 | 
 31 | export type ListMilestonesOptions = {
 32 |   state?: State;
 33 |   sort?: Sort;
 34 |   direction?: Direction;
 35 |   page?: number;
 36 |   pageSize?: number;
 37 | };
 38 | 
 39 | export type ListIssuesOptions = {
 40 |   milestone: number;
 41 |   labels?: string;
 42 |   state?: State;
 43 |   sort?: Sort;
 44 |   direction?: Direction;
 45 |   page?: number;
 46 |   pageSize?: number;
 47 | };
 48 | 
 49 | export type ListCommentsOptions = {
 50 |   issue: number;
 51 |   sort?: Sort;
 52 |   direction?: Direction;
 53 |   page?: number;
 54 |   pageSize?: number;
 55 | };
 56 | 
 57 | export type ListRepositoriesOptions = {
 58 |   type?: RepositoryType;
 59 |   sort?: RepositorySort;
 60 |   direction?: Direction;
 61 |   page?: number;
 62 |   pageSize?: number;
 63 | };
 64 | 
 65 | export type User = {
 66 |   id: number;
 67 |   login: string;
 68 |   avatar_url: string;
 69 |   html_url: string;
 70 | };
 71 | 
 72 | export type Milestone = {
 73 |   id: number;
 74 |   number: number;
 75 |   title: string;
 76 |   description: string;
 77 |   open_issues: number;
 78 | };
 79 | 
 80 | export type Issue = {
 81 |   id: number;
 82 |   number: number;
 83 |   title: string;
 84 |   state: State;
 85 |   body: string;
 86 |   comments: number;
 87 |   user: User;
 88 |   milestone: Milestone;
 89 |   labels: Label[];
 90 |   html_url: string;
 91 |   created_at: string;
 92 |   updated_at: string;
 93 | };
 94 | 
 95 | export type Label = {
 96 |   id: number;
 97 |   name: string;
 98 |   description: string;
 99 |   color: string;
100 | };
101 | 
102 | export type Comment = {
103 |   id: number;
104 |   body: string;
105 |   html_url: string;
106 |   author_association: string;
107 |   created_at: string;
108 |   updated_at: string;
109 |   user: User;
110 | };
111 | 
112 | export type Repository = {
113 |   id: number;
114 |   owner: User;
115 |   full_name: string;
116 |   name: string;
117 |   html_url: string;
118 |   description: string;
119 |   language: string;
120 |   forks_count: number;
121 |   stargazers_count: number;
122 |   open_issues_count: number;
123 |   archived: boolean;
124 |   disabled: boolean;
125 |   pushed_at: string;
126 |   created_at: string;
127 |   updated_at: string;
128 | };
129 | 
130 | function toQuery(raw: Record<string, unknown>) {
131 |   const params = new URLSearchParams();
132 | 
133 |   Object.keys(raw).forEach((key) => {
134 |     if (raw[key]) params.append(key, String(raw[key]));
135 |   });
136 | 
137 |   return `?${params.toString()}`;
138 | }
139 | 
140 | function hasBody(method: string) {
141 |   return ['POST', 'PUT', 'PATCH'].includes(method);
142 | }
143 | 
144 | class Github {
145 |   private apiBase = 'https://api.github.com';
146 | 
147 |   constructor(private token: string, private owner: string, private repo: string) {}
148 | 
149 |   private async request(method: string, url: string, data?: Record<string, unknown>) {
150 |     let query = '';
151 |     let body = data;
152 | 
153 |     if (data && !hasBody(method)) {
154 |       query = toQuery(data);
155 |       body = undefined;
156 |     }
157 | 
158 |     const response = await fetch([this.apiBase, url, query].join(''), {
159 |       method,
160 |       headers: {
161 |         'Content-Type': 'application/json;charset=UTF-8',
162 |         Accept: 'application/vnd.github.v3+json',
163 |         Authorization: `token ${this.token}`,
164 |       },
165 |       body: body ? JSON.stringify(body) : undefined,
166 |     });
167 | 
168 |     return response.json();
169 |   }
170 | 
171 |   public async listMilestones(options: ListMilestonesOptions = {}): Promise<Milestone[]> {
172 |     const { state, sort, direction, page, pageSize } = options;
173 |     const query = { state, sort, direction, page, per_page: pageSize };
174 | 
175 |     return this.request('GET', `/repos/${this.owner}/${this.repo}/milestones`, query);
176 |   }
177 | 
178 |   public async listIssues(options: ListIssuesOptions): Promise<Issue[]> {
179 |     const { milestone, labels, state, sort, direction, page, pageSize } = options;
180 | 
181 |     const query = {
182 |       milestone,
183 |       labels,
184 |       state,
185 |       sort,
186 |       direction,
187 |       page,
188 |       per_page: pageSize,
189 |       creator: this.owner,
190 |     };
191 | 
192 |     return this.request('GET', `/repos/${this.owner}/${this.repo}/issues`, query);
193 |   }
194 | 
195 |   public getIssue(issue: number): Promise<Issue> {
196 |     return this.request('GET', `/repos/${this.owner}/${this.repo}/issues/${issue}`);
197 |   }
198 | 
199 |   public listComments(options: ListCommentsOptions): Promise<Comment[]> {
200 |     const { issue, sort, direction, page, pageSize } = options;
201 |     const query = { sort, direction, page, per_page: pageSize };
202 | 
203 |     return this.request('GET', `/repos/${this.owner}/${this.repo}/issues/${issue}/comments`, query);
204 |   }
205 | 
206 |   public listRepositories(options: ListRepositoriesOptions): Promise<Repository[]> {
207 |     const { type, sort, direction, page, pageSize } = options;
208 |     const query = { type, sort, direction, page, per_page: pageSize };
209 |     return this.request('GET', `/users/${this.owner}/repos`, query);
210 |   }
211 | }
212 | 
213 | export default new Github(
214 |   import.meta.env.VITE_GITHUB_ACCESS_TOKEN_PART1 + import.meta.env.VITE_GITHUB_ACCESS_TOKEN_PART2,
215 |   import.meta.env.VITE_GITHUB_OWNER,
216 |   import.meta.env.VITE_GITHUB_REPO,
217 | );
218 | 


--------------------------------------------------------------------------------
/src/styles/BaseStyles.tsx:
--------------------------------------------------------------------------------
 1 | import { Global, css } from '@emotion/react';
 2 | import React from 'react';
 3 | import tw, { GlobalStyles } from 'twin.macro';
 4 | 
 5 | const customStyles = css`
 6 |   @import url(https://cdn.jsdelivr.net/gh/tonsky/FiraCode@5.2/distr/fira_code.css);
 7 | 
 8 |   body {
 9 |     font-family: 'Fira Code VF', 'Segoe UI', 'Consolas', 'monospace', 'Microsoft YaHei';
10 |     font-variant-ligatures: normal;
11 |     background-size: 32px 32px;
12 |     background-image: radial-gradient(rgba(59, 130, 246, 0.2) 1px, rgba(59, 130, 246, 0) 0px);
13 |     ${tw`overflow-y-scroll antialiased`}
14 |     ${tw`bg-slate-50 text-slate-900`}
15 |     ${tw`dark:bg-black dark:text-slate-400`}
16 |   }
17 | 
18 |   *::-webkit-scrollbar {
19 |     ${tw`w-2 h-2`}
20 |   }
21 | 
22 |   *::-webkit-scrollbar-thumb {
23 |     ${tw`bg-slate-200 dark:bg-slate-700`}
24 |   }
25 | `;
26 | 
27 | function BaseStyles() {
28 |   return (
29 |     <>
30 |       <GlobalStyles />
31 |       <Global styles={customStyles} />
32 |     </>
33 |   );
34 | }
35 | 
36 | export default BaseStyles;
37 | 


--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
 1 | import Prism from 'prismjs';
 2 | 
 3 | export type AnyFunction = (...args: never[]) => unknown;
 4 | 
 5 | export function debounce<T extends AnyFunction>(fn: T, ms: number): T {
 6 |   let timer: ReturnType<typeof setTimeout> | undefined;
 7 | 
 8 |   const handler = (...args: never[]) => {
 9 |     if (timer) clearTimeout(timer);
10 |     timer = setTimeout(() => fn(...args), ms);
11 |   };
12 | 
13 |   return handler as T;
14 | }
15 | 
16 | export function clamp(value: number, min: number, max: number): number {
17 |   return Math.min(Math.max(value, min), max);
18 | }
19 | 
20 | export function ensureArray<T>(target: T | T[]): T[] {
21 |   if (Array.isArray(target)) return target;
22 |   return target === undefined ? [] : [target];
23 | }
24 | 
25 | export function createQueryURL(
26 |   raw: Record<string, string | number | undefined>
27 | ) {
28 |   const params: Record<string, string> = {};
29 | 
30 |   Object.entries(raw).forEach(([key, value]) => {
31 |     if (value === undefined) return;
32 |     params[key] = typeof value === 'number' ? value.toString() : value;
33 |   });
34 | 
35 |   return `?${new URLSearchParams(params)}`;
36 | }
37 | 
38 | export function highlight(code: string, lang: string) {
39 |   const grammar = Prism.languages[lang] ?? Prism.languages.plain;
40 |   return Prism.highlight(code, grammar, lang);
41 | }
42 | 
43 | export async function loadThemeStyles(id: string, theme: string) {
44 |   const existed = document.getElementById(id);
45 |   if (existed) existed.remove();
46 | 
47 |   const style = document.createElement('style');
48 |   style.setAttribute('id', id);
49 |   style.textContent = theme;
50 |   document.head.appendChild(style);
51 | }
52 | 


--------------------------------------------------------------------------------
/src/views/Article.tsx:
--------------------------------------------------------------------------------
  1 | import { format } from 'date-fns';
  2 | import React, { memo, useCallback, useEffect, useMemo, useState } from 'react';
  3 | import { useTranslation } from 'react-i18next';
  4 | import { useNavigate, useParams } from 'react-router-dom';
  5 | import tw from 'twin.macro';
  6 | import IconComments from '~icons/ri/chat-2-line';
  7 | 
  8 | import CommentItem from '../components/CommentItem';
  9 | import CommentSkeleton from '../components/CommentSkeleton';
 10 | import LabelItem from '../components/LabelItem';
 11 | import MarkdownHtml from '../components/MarkdownHtml';
 12 | import Pagination from '../components/Pagination';
 13 | import Skeleton from '../components/Skeleton';
 14 | import useHandling from '../hooks/use-handling';
 15 | import useQuery from '../hooks/use-query';
 16 | import ArticleModel from '../models/ArticleModel';
 17 | import CommentModel from '../models/CommentModel';
 18 | import github from '../services/github';
 19 | import { createQueryURL } from '../utils';
 20 | 
 21 | const Wrapper = tw.article`mx-auto w-full max-w-screen-lg px-8 py-12`;
 22 | 
 23 | const Title = tw.h2`text-2xl text-slate-700`;
 24 | 
 25 | const Into = tw.div`mt-4 mb-8 space-x-4 flex flex-wrap content-center text-sm text-slate-400`;
 26 | 
 27 | const ParagraphSkeleton = tw.ul`mt-8 space-y-4`;
 28 | 
 29 | const CommentTitle = tw.h2`text-2xl text-slate-700`;
 30 | 
 31 | const CommentButton = tw.a`
 32 |   mt-4 block w-full h-10
 33 |   leading-10 text-slate-400 text-center
 34 |   border border-gray-400 rounded-sm outline-none
 35 |   cursor-pointer 
 36 | `;
 37 | 
 38 | const Foot = tw.div`mt-8 flex justify-center`;
 39 | 
 40 | function useArticle() {
 41 |   const { id } = useParams();
 42 |   const [article, setArticle] = useState<ArticleModel>();
 43 | 
 44 |   const [loading, load] = useHandling(
 45 |     useCallback(async () => {
 46 |       const result = await github.getIssue(parseInt(id!, 10));
 47 |       setArticle(ArticleModel.from(result));
 48 |     }, [id]),
 49 |     true,
 50 |   );
 51 | 
 52 |   useEffect(() => {
 53 |     load();
 54 |   }, [id]);
 55 | 
 56 |   return [loading, article] as const;
 57 | }
 58 | 
 59 | function useCommentsQuery() {
 60 |   const { id } = useParams();
 61 |   const { page } = useQuery();
 62 | 
 63 |   return useMemo(
 64 |     () => ({
 65 |       issue: parseInt(id!, 10),
 66 |       page: parseInt(page ?? '1', 10),
 67 |       pageSize: parseInt(import.meta.env.VITE_COMMENT_PAGE_SIZE, 10),
 68 |     }),
 69 |     [id, page],
 70 |   );
 71 | }
 72 | 
 73 | function useComments() {
 74 |   const query = useCommentsQuery();
 75 |   const [comments, setComments] = useState<CommentModel[]>([]);
 76 | 
 77 |   const [loading, load] = useHandling(
 78 |     useCallback(async () => {
 79 |       const result = await github.listComments(query);
 80 | 
 81 |       setComments(result.map(CommentModel.from));
 82 |     }, [query]),
 83 |     true,
 84 |   );
 85 | 
 86 |   useEffect(() => {
 87 |     load();
 88 |   }, [query]);
 89 | 
 90 |   return [loading, comments, query] as const;
 91 | }
 92 | 
 93 | export default memo(function Article() {
 94 |   const navigate = useNavigate();
 95 |   const { t } = useTranslation();
 96 |   const [articleLoading, article] = useArticle();
 97 |   const [commentsLoading, comments, query] = useComments();
 98 | 
 99 |   const createdAt = useMemo(() => {
100 |     return article ? format(new Date(article.createdAt), t('dateFormat')) : '';
101 |   }, ['article']);
102 | 
103 |   const newCommentUrl = useMemo(() => {
104 |     return article ? `${article.htmlUrl}#new_comment_field` : '';
105 |   }, [article]);
106 | 
107 |   const getLabelLink = useCallback((label: string) => {
108 |     return `../${createQueryURL({ label, page: 1 })}`;
109 |   }, []);
110 | 
111 |   const onPageChange = useCallback((page: number) => {
112 |     navigate(createQueryURL({ page }));
113 |   }, []);
114 | 
115 |   return (
116 |     <Wrapper>
117 |       <article>
118 |         {articleLoading && (
119 |           <>
120 |             <Skeleton tw="h-8 w-1/3" />
121 |             <ParagraphSkeleton>
122 |               <Skeleton tw="w-1/2" />
123 |               <Skeleton tw="w-full" />
124 |               <Skeleton tw="w-4/5" />
125 |               <Skeleton tw="w-full" />
126 |               <Skeleton tw="w-3/5" />
127 |               <Skeleton tw="w-full h-40" />
128 |               <Skeleton tw="w-4/5" />
129 |               <Skeleton tw="w-full" />
130 |               <Skeleton tw="w-3/5" />
131 |               <Skeleton tw="w-full" />
132 |               <Skeleton tw="w-2/5" />
133 |             </ParagraphSkeleton>
134 |           </>
135 |         )}
136 | 
137 |         {article && (
138 |           <>
139 |             <Title>{article.title}</Title>
140 |             <Into>
141 |               <span>{createdAt}</span>
142 |               <span tw="flex items-center">
143 |                 {article.labels.map((label) => (
144 |                   <LabelItem key={label.id} label={label} getLink={getLabelLink} />
145 |                 ))}
146 |               </span>
147 |               <span tw="flex items-center">
148 |                 <IconComments />
149 |                 <span tw="ml-1">{article.comments}</span>
150 |               </span>
151 |             </Into>
152 |             <MarkdownHtml markdown={article.body} playground />
153 |           </>
154 |         )}
155 |       </article>
156 | 
157 |       <section tw="mt-8">
158 |         <CommentTitle>{t('comment.title')}</CommentTitle>
159 |         <CommentButton href={newCommentUrl}>{t('comment.btn')}</CommentButton>
160 | 
161 |         {commentsLoading && (
162 |           <div>
163 |             {Array.from({ length: 5 }).map((_, i) => (
164 |               <CommentSkeleton key={i} />
165 |             ))}
166 |           </div>
167 |         )}
168 | 
169 |         {!!comments.length && (
170 |           <div>
171 |             {comments.map((comment) => (
172 |               <CommentItem key={comment.id} comment={comment} />
173 |             ))}
174 |           </div>
175 |         )}
176 | 
177 |         <Foot>
178 |           <Pagination
179 |             page={query.page}
180 |             pageSize={query.pageSize}
181 |             total={article ? article.comments : 0}
182 |             onChange={onPageChange}
183 |           />
184 |         </Foot>
185 |       </section>
186 |     </Wrapper>
187 |   );
188 | });
189 | 


--------------------------------------------------------------------------------
/src/views/Articles.tsx:
--------------------------------------------------------------------------------
  1 | import React, { useCallback, useEffect, useMemo, useState } from 'react';
  2 | import { useTranslation } from 'react-i18next';
  3 | import { useLocation, useNavigate } from 'react-router-dom';
  4 | import tw from 'twin.macro';
  5 | 
  6 | import ArticleItem from '../components/ArticleItem';
  7 | import ArticleSkeleton from '../components/ArticleSkeleton';
  8 | import Pagination from '../components/Pagination';
  9 | import Skeleton from '../components/Skeleton';
 10 | import useHandling from '../hooks/use-handling';
 11 | import useQuery from '../hooks/use-query';
 12 | import ArticleModel from '../models/ArticleModel';
 13 | import CategoryModel from '../models/CategoryModel';
 14 | import github from '../services/github';
 15 | import { createQueryURL } from '../utils';
 16 | 
 17 | const Wrapper = tw.main`mx-auto w-full max-w-screen-lg px-8 py-12`;
 18 | 
 19 | const Title = tw.h2`text-2xl text-slate-600`;
 20 | 
 21 | const List = tw.div`mt-8`;
 22 | 
 23 | const Foot = tw.div`mt-8 flex justify-center`;
 24 | 
 25 | export type ArticlesProps = {
 26 |   milestone: number;
 27 | };
 28 | 
 29 | function useArticlesQuery() {
 30 |   const { labels, page } = useQuery();
 31 | 
 32 |   return useMemo(
 33 |     () => ({
 34 |       labels: labels ?? undefined,
 35 |       page: parseInt(page ?? '1', 10),
 36 |       pageSize: parseInt(import.meta.env.VITE_ARTICLE_PAGE_SIZE, 10),
 37 |     }),
 38 |     [labels, page],
 39 |   );
 40 | }
 41 | 
 42 | export default function Articles(props: ArticlesProps) {
 43 |   const { t } = useTranslation();
 44 |   const navigate = useNavigate();
 45 |   const query = useArticlesQuery();
 46 | 
 47 |   const [category, setCategory] = useState<CategoryModel>();
 48 |   const [articles, setArticles] = useState<ArticleModel[]>([]);
 49 |   const total = category?.articles ?? 0;
 50 | 
 51 |   const [loadingArticles, loadArticles] = useHandling(
 52 |     useCallback(async () => {
 53 |       if (category?.number !== props.milestone) {
 54 |         const milestones = await github.listMilestones();
 55 |         const milestone = milestones.find((m) => m.number === props.milestone);
 56 | 
 57 |         if (!milestone) {
 58 |           navigate('/404');
 59 |           return;
 60 |         }
 61 | 
 62 |         setCategory(CategoryModel.from(milestone));
 63 |       }
 64 | 
 65 |       const list = await github.listIssues({
 66 |         milestone: props.milestone,
 67 |         ...query,
 68 |       });
 69 | 
 70 |       setArticles(list.map(ArticleModel.from));
 71 |     }, [props.milestone, query]),
 72 |   );
 73 | 
 74 |   useEffect(() => {
 75 |     loadArticles();
 76 |   }, [props.milestone, query]);
 77 | 
 78 |   const title = useMemo(() => {
 79 |     return category ? t(`tab.${category.title.toLowerCase()}` as any) : '';
 80 |   }, [category]);
 81 | 
 82 |   const location = useLocation();
 83 |   const getArticleLink = useCallback((id: number) => `${location.pathname}/${id}`, [location]);
 84 | 
 85 |   const getLabelLink = useCallback((labels: string) => {
 86 |     return createQueryURL({ labels, page: 1 });
 87 |   }, []);
 88 | 
 89 |   const onPageChange = useCallback(
 90 |     (page: number) => {
 91 |       navigate(createQueryURL({ page, labels: query.labels }));
 92 |     },
 93 |     [query.labels, props.milestone],
 94 |   );
 95 | 
 96 |   return (
 97 |     <Wrapper>
 98 |       <Skeleton tw="h-8 w-24">
 99 |         <Title>{title}</Title>
100 |       </Skeleton>
101 | 
102 |       <List>
103 |         {loadingArticles
104 |           ? Array.from({ length: 8 }).map((_, i) => <ArticleSkeleton key={i} />)
105 |           : articles.map((article) => (
106 |               <ArticleItem
107 |                 key={article.id}
108 |                 article={article}
109 |                 getLink={getArticleLink}
110 |                 getLabelLink={getLabelLink}
111 |               />
112 |             ))}
113 |       </List>
114 | 
115 |       <Foot>
116 |         <Pagination
117 |           page={query.page}
118 |           pageSize={query.pageSize}
119 |           total={total}
120 |           onChange={onPageChange}
121 |         />
122 |       </Foot>
123 |     </Wrapper>
124 |   );
125 | }
126 | 


--------------------------------------------------------------------------------
/src/views/Home.tsx:
--------------------------------------------------------------------------------
 1 | import React from 'react';
 2 | import { useTranslation } from 'react-i18next';
 3 | import { Link } from 'react-router-dom';
 4 | import tw from 'twin.macro';
 5 | import IconArrowRight from '~icons/ri/arrow-right-line';
 6 | 
 7 | import ShapeEffect from '../components/ShapeEffect/ShapeEffect';
 8 | 
 9 | const Background = tw.div`absolute [z-index:0] top-0 left-0 w-full h-full [user-select:none] pointer-events-none opacity-50 blur-sm`;
10 | 
11 | const Foreground = tw.div`absolute [z-index:2] top-0 left-0 w-full h-full [user-select:none] pointer-events-none`;
12 | 
13 | const Wrapper = tw.main`px-8 py-20 w-full flex-1 flex flex-col justify-center`;
14 | 
15 | const Center = tw.div`relative [z-index:1] mx-auto max-w-screen-lg text-center`;
16 | 
17 | const Title = tw.h2`text-5xl text-slate-600 font-bold leading-10`;
18 | 
19 | const Description = tw.p`mt-6 text-3xl text-slate-400`;
20 | 
21 | const LinkButton = tw.button`
22 |   mt-12 py-3 px-6 inline-flex items-center
23 |   bg-blue-500 active:bg-blue-600 text-blue-50 text-center
24 |   gap-4 hover:gap-8
25 |   rounded-full outline-none transition-all
26 | `;
27 | 
28 | export default function Home() {
29 |   const { t } = useTranslation();
30 | 
31 |   return (
32 |     <Wrapper>
33 |       <Background>
34 |         <ShapeEffect count={12} sizes={[30, 60]} />
35 |       </Background>
36 |       <Foreground>
37 |         <ShapeEffect count={12} sizes={[40, 80]} />
38 |       </Foreground>
39 |       <Center>
40 |         <Title>{t('intro.title')}</Title>
41 |         <Description>{t('intro.description')}</Description>
42 |         <Link to="/posts">
43 |           <LinkButton>
44 |             <span>{t('intro.link')}</span>
45 |             <IconArrowRight />
46 |           </LinkButton>
47 |         </Link>
48 |       </Center>
49 |     </Wrapper>
50 |   );
51 | }
52 | 


--------------------------------------------------------------------------------
/src/views/Main.tsx:
--------------------------------------------------------------------------------
  1 | import mdDark from 'github-markdown-css/github-markdown-dark.css?raw';
  2 | import mdLight from 'github-markdown-css/github-markdown-light.css?raw';
  3 | import { changeLanguage } from 'i18next';
  4 | import prismLight from 'prism-themes/themes/prism-vs.css?raw';
  5 | import prismDark from 'prism-themes/themes/prism-vsc-dark-plus.css?raw';
  6 | import React, { useCallback, useEffect } from 'react';
  7 | import { useTranslation } from 'react-i18next';
  8 | import { Link, NavLink, Outlet } from 'react-router-dom';
  9 | import tw, { css, styled } from 'twin.macro';
 10 | import IconPosts from '~icons/ri/article-line';
 11 | import IconProjects from '~icons/ri/function-line';
 12 | import IconGithub from '~icons/ri/github-line';
 13 | import IconLanguage from '~icons/ri/global-line';
 14 | import IconEmail from '~icons/ri/mail-line';
 15 | import IconDark from '~icons/ri/moon-line';
 16 | import IconSnippets from '~icons/ri/sticky-note-line';
 17 | import IconLight from '~icons/ri/sun-line';
 18 | 
 19 | import useDarkMode, { DarkModeValueContext } from '../hooks/use-dark-mode';
 20 | import i18n from '../i18n';
 21 | import { loadThemeStyles } from '../utils';
 22 | 
 23 | const title = import.meta.env.VITE_TITLE;
 24 | const email = import.meta.env.VITE_EMAIL;
 25 | const githubUrl = import.meta.env.VITE_GITHUB_URL;
 26 | 
 27 | const Wrapper = styled.div`
 28 |   ${tw`relative pb-16 min-h-screen flex flex-col`}
 29 | `;
 30 | 
 31 | const Header = tw.header`h-20 w-full`;
 32 | 
 33 | const HeaderCenter = tw.div`mx-auto max-w-screen-lg flex px-8 items-center h-full text-slate-500 font-semibold`;
 34 | 
 35 | const TitleLink = styled(Link)`
 36 |   ${tw`text-lg`}
 37 | `;
 38 | 
 39 | const Title = tw.span`mx-0.5 text-blue-500`;
 40 | 
 41 | const Nav = tw.nav`grid gap-3 lg:gap-6 grid-flow-col ml-auto leading-5`;
 42 | 
 43 | const navItemStyle = tw`opacity-60 cursor-pointer hover:(opacity-100 text-blue-500)`;
 44 | 
 45 | const NavItem = styled.a`
 46 |   ${navItemStyle}
 47 | `;
 48 | 
 49 | const NavLinkItem = styled(NavLink)`
 50 |   ${navItemStyle}
 51 | 
 52 |   &.active {
 53 |     ${tw`opacity-100 text-blue-500`}
 54 |   }
 55 | `;
 56 | 
 57 | const Divider = tw.div`w-[1px] h-full bg-gray-200 dark:bg-gray-800`;
 58 | 
 59 | const Footer = tw.footer`
 60 |   absolute bottom-4 left-0 
 61 |   space-x-2 w-full
 62 |   text-sm text-center text-slate-300
 63 |   select-none
 64 | `;
 65 | 
 66 | const FooterCenter = tw.div`mx-auto max-w-screen-lg dark:text-slate-800`;
 67 | 
 68 | export default function Main() {
 69 |   const { t } = useTranslation();
 70 | 
 71 |   const [darkModeEnabled, setDarkModelEnabled] = useDarkMode();
 72 | 
 73 |   useEffect(() => {
 74 |     loadThemeStyles('prism-theme', darkModeEnabled ? prismDark : prismLight);
 75 |     loadThemeStyles('markdown-theme', darkModeEnabled ? mdDark : mdLight);
 76 |   }, [darkModeEnabled]);
 77 | 
 78 |   const onToggleDarkMode = useCallback(() => {
 79 |     setDarkModelEnabled(!darkModeEnabled);
 80 |   }, [darkModeEnabled]);
 81 | 
 82 |   const onToggleLanguage = useCallback(() => {
 83 |     changeLanguage(i18n.language === 'cn' ? 'en' : 'cn');
 84 |     localStorage.setItem('language', i18n.language);
 85 |   }, []);
 86 | 
 87 |   return (
 88 |     <DarkModeValueContext.Provider value={darkModeEnabled}>
 89 |       <Wrapper>
 90 |         <Header>
 91 |           <HeaderCenter>
 92 |             <TitleLink to="/">
 93 |               <span>://</span>
 94 |               <Title>{title}</Title>
 95 |             </TitleLink>
 96 | 
 97 |             <Nav>
 98 |               <NavLinkItem to="/posts">
 99 |                 <IconPosts tw="inline lg:hidden" />
100 |                 <span tw="hidden lg:inline">{t('tab.posts')}</span>
101 |               </NavLinkItem>
102 |               <NavLinkItem to="/snippets">
103 |                 <IconSnippets tw="inline lg:hidden" />
104 |                 <span tw="hidden lg:inline">{t('tab.snippets')}</span>
105 |               </NavLinkItem>
106 |               <NavLinkItem to="/projects">
107 |                 <IconProjects tw="inline lg:hidden" />
108 |                 <span tw="hidden lg:inline">{t('tab.projects')}</span>
109 |               </NavLinkItem>
110 | 
111 |               <Divider />
112 | 
113 |               <NavItem href={`mailto:${email}`}>
114 |                 <IconEmail />
115 |               </NavItem>
116 |               <NavItem href={githubUrl} target="_blank">
117 |                 <IconGithub />
118 |               </NavItem>
119 |               <NavItem onClick={onToggleLanguage}>
120 |                 <IconLanguage />
121 |               </NavItem>
122 |               <NavItem onClick={onToggleDarkMode}>
123 |                 {darkModeEnabled ? <IconLight /> : <IconDark />}
124 |               </NavItem>
125 |             </Nav>
126 |           </HeaderCenter>
127 |         </Header>
128 | 
129 |         <Outlet />
130 | 
131 |         <Footer>
132 |           <FooterCenter>
133 |             <a tw="hover:text-blue-500" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
134 |               CC BY-NC-SA 4.0
135 |             </a>
136 |             <span tw="ml-2">2016-present © varHarrie</span>
137 |           </FooterCenter>
138 |         </Footer>
139 |       </Wrapper>
140 |     </DarkModeValueContext.Provider>
141 |   );
142 | }
143 | 


--------------------------------------------------------------------------------
/src/views/Projects.tsx:
--------------------------------------------------------------------------------
 1 | import React, { useCallback, useEffect, useState } from 'react';
 2 | import { useTranslation } from 'react-i18next';
 3 | import tw from 'twin.macro';
 4 | 
 5 | import ProjectItem from '../components/ProjectItem';
 6 | import ProjectSkeleton from '../components/ProjectSkeleton';
 7 | import useHandling from '../hooks/use-handling';
 8 | import ProjectModel from '../models/ProjectModel';
 9 | import github, { Direction, RepositorySort, RepositoryType } from '../services/github';
10 | 
11 | const Wrapper = tw.main`mx-auto w-full max-w-screen-lg px-8 py-12`;
12 | 
13 | const Title = tw.h2`text-2xl text-slate-700`;
14 | 
15 | const List = tw.div`mt-8 grid grid-cols-1 lg:grid-cols-2 gap-2`;
16 | 
17 | export default function Projects() {
18 |   const { t } = useTranslation();
19 |   const [projects, setProjects] = useState<ProjectModel[]>([]);
20 | 
21 |   const [loadingProjects, loadProject] = useHandling(
22 |     useCallback(async () => {
23 |       const list = await github.listRepositories({
24 |         type: RepositoryType.All,
25 |         sort: RepositorySort.Pushed,
26 |         direction: Direction.Desc,
27 |         page: 1,
28 |         pageSize: 50,
29 |       });
30 | 
31 |       setProjects(
32 |         list
33 |           .map(ProjectModel.from)
34 |           .filter((p) => p.stargazersCount > 0 && !p.archived && !p.disabled)
35 |           .sort((a, b) => b.stargazersCount - a.stargazersCount),
36 |       );
37 |     }, []),
38 |     true,
39 |   );
40 | 
41 |   useEffect(() => {
42 |     loadProject();
43 |   }, []);
44 | 
45 |   return (
46 |     <Wrapper>
47 |       <Title>{t('projects.title')}</Title>
48 | 
49 |       {loadingProjects && (
50 |         <List>
51 |           {Array.from({ length: 10 }).map((_, i) => (
52 |             <ProjectSkeleton key={i} />
53 |           ))}
54 |         </List>
55 |       )}
56 | 
57 |       {!!projects.length && (
58 |         <List>
59 |           {projects.map((project) => (
60 |             <ProjectItem key={project.id} project={project} />
61 |           ))}
62 |         </List>
63 |       )}
64 |     </Wrapper>
65 |   );
66 | }
67 | 


--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 |   darkMode: 'class',
3 |   content: [],
4 |   theme: {
5 |     extend: {},
6 |   },
7 |   plugins: [],
8 | };
9 | 


--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ESNext",
 4 |     "useDefineForClassFields": true,
 5 |     "lib": ["DOM", "DOM.Iterable", "ESNext"],
 6 |     "allowJs": false,
 7 |     "skipLibCheck": true,
 8 |     "esModuleInterop": false,
 9 |     "allowSyntheticDefaultImports": true,
10 |     "strict": true,
11 |     "forceConsistentCasingInFileNames": true,
12 |     "module": "ESNext",
13 |     "moduleResolution": "Node",
14 |     "resolveJsonModule": true,
15 |     "isolatedModules": true,
16 |     "noEmit": true,
17 |     "jsx": "react-jsx",
18 |     "jsxImportSource": "@emotion/react",
19 |     "types": ["unplugin-icons/types/react"]
20 |   },
21 |   "include": ["src", "types"],
22 |   "references": [{ "path": "./tsconfig.node.json" }]
23 | }
24 | 


--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 |   "compilerOptions": {
3 |     "composite": true,
4 |     "module": "esnext",
5 |     "moduleResolution": "node"
6 |   },
7 |   "include": ["vite.config.ts"]
8 | }
9 | 


--------------------------------------------------------------------------------
/types/env.d.ts:
--------------------------------------------------------------------------------
 1 | interface ImportMetaEnv {
 2 |   VITE_APP_TITLE: string;
 3 |   VITE_GITHUB_URL: string;
 4 |   VITE_GITHUB_ACCESS_TOKEN_PART1: string;
 5 |   VITE_GITHUB_ACCESS_TOKEN_PART2: string;
 6 |   VITE_GITHUB_OWNER: string;
 7 |   VITE_GITHUB_REPO: string;
 8 |   VITE_GITHUB_MILESTONE_POSTS: string;
 9 |   VITE_GITHUB_MILESTONE_SNIPPETS: string;
10 |   VITE_ARTICLE_PAGE_SIZE: string;
11 |   VITE_COMMENT_PAGE_SIZE: string;
12 | }
13 | 


--------------------------------------------------------------------------------
/types/react-i18next.d.ts:
--------------------------------------------------------------------------------
1 | import { defaultNS, resources } from '../src/i18n';
2 | 
3 | declare module 'react-i18next' {
4 |   interface CustomTypeOptions {
5 |     defaultNS: typeof defaultNS;
6 |     resources: typeof resources['cn'];
7 |   }
8 | }
9 | 


--------------------------------------------------------------------------------
/types/twin.d.ts:
--------------------------------------------------------------------------------
 1 | import 'twin.macro';
 2 | 
 3 | import { css as cssImport, DOMAttributes } from '@emotion/react';
 4 | import { CSSInterpolation } from '@emotion/serialize';
 5 | import styledImport from '@emotion/styled';
 6 | 
 7 | declare module 'twin.macro' {
 8 |   // The styled and css imports
 9 |   export const styled: typeof styledImport;
10 |   export const css: typeof cssImport;
11 | }
12 | 
13 | declare module 'react' {
14 |   // The css prop
15 |   export interface HTMLAttributes<T> extends DOMAttributes<T> {
16 |     css?: CSSInterpolation;
17 |     tw?: string;
18 |   }
19 |   // The inline svg css prop
20 |   interface SVGProps extends SVGProps<SVGSVGElement> {
21 |     css?: CSSInterpolation;
22 |     tw?: string;
23 |   }
24 | }
25 | 


--------------------------------------------------------------------------------
/types/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="vite/client" />
2 | 


--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
 1 | import react from '@vitejs/plugin-react';
 2 | import Icons from 'unplugin-icons/vite';
 3 | import { defineConfig } from 'vite';
 4 | 
 5 | // https://vitejs.dev/config/
 6 | export default defineConfig({
 7 |   define: {
 8 |     // https://github.com/codesandbox/sandpack/pull/787#issuecomment-1450353368
 9 |     'process.env.SANDPACK_BARE_COMPONENTS': 'false',
10 |   },
11 |   optimizeDeps: {
12 |     esbuildOptions: {
13 |       target: 'es2020',
14 |     },
15 |   },
16 |   plugins: [
17 |     react({
18 |       babel: {
19 |         plugins: [
20 |           'babel-plugin-macros',
21 |           [
22 |             '@emotion/babel-plugin-jsx-pragmatic',
23 |             {
24 |               export: 'jsx',
25 |               import: '__cssprop',
26 |               module: '@emotion/react',
27 |             },
28 |           ],
29 |           ['@babel/plugin-transform-react-jsx', { pragma: '__cssprop' }, 'twin.macro'],
30 |         ],
31 |       },
32 |     }),
33 |     Icons({
34 |       compiler: 'jsx',
35 |       jsx: 'react',
36 |       scale: 1.2,
37 |     }),
38 |   ],
39 | });
40 | 


--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
   1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
   2 | # yarn lockfile v1
   3 | 
   4 | 
   5 | "@ampproject/remapping@^2.2.0":
   6 |   version "2.2.0"
   7 |   resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
   8 |   integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
   9 |   dependencies:
  10 |     "@jridgewell/gen-mapping" "^0.1.0"
  11 |     "@jridgewell/trace-mapping" "^0.3.9"
  12 | 
  13 | "@antfu/install-pkg@^0.1.1":
  14 |   version "0.1.1"
  15 |   resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5"
  16 |   integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==
  17 |   dependencies:
  18 |     execa "^5.1.1"
  19 |     find-up "^5.0.0"
  20 | 
  21 | "@antfu/utils@^0.7.2":
  22 |   version "0.7.2"
  23 |   resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.2.tgz#3bb6f37a6b188056fe9e2f363b6aa735ed65d7ca"
  24 |   integrity sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==
  25 | 
  26 | "@babel/code-frame@^7.0.0":
  27 |   version "7.16.7"
  28 |   resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
  29 |   integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
  30 |   dependencies:
  31 |     "@babel/highlight" "^7.16.7"
  32 | 
  33 | "@babel/code-frame@^7.18.6":
  34 |   version "7.18.6"
  35 |   resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
  36 |   integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
  37 |   dependencies:
  38 |     "@babel/highlight" "^7.18.6"
  39 | 
  40 | "@babel/compat-data@^7.20.5":
  41 |   version "7.21.0"
  42 |   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298"
  43 |   integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==
  44 | 
  45 | "@babel/core@^7.17.7", "@babel/core@^7.19.6", "@babel/core@^7.20.12":
  46 |   version "7.21.0"
  47 |   resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13"
  48 |   integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==
  49 |   dependencies:
  50 |     "@ampproject/remapping" "^2.2.0"
  51 |     "@babel/code-frame" "^7.18.6"
  52 |     "@babel/generator" "^7.21.0"
  53 |     "@babel/helper-compilation-targets" "^7.20.7"
  54 |     "@babel/helper-module-transforms" "^7.21.0"
  55 |     "@babel/helpers" "^7.21.0"
  56 |     "@babel/parser" "^7.21.0"
  57 |     "@babel/template" "^7.20.7"
  58 |     "@babel/traverse" "^7.21.0"
  59 |     "@babel/types" "^7.21.0"
  60 |     convert-source-map "^1.7.0"
  61 |     debug "^4.1.0"
  62 |     gensync "^1.0.0-beta.2"
  63 |     json5 "^2.2.2"
  64 |     semver "^6.3.0"
  65 | 
  66 | "@babel/generator@^7.17.7", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1":
  67 |   version "7.21.1"
  68 |   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd"
  69 |   integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==
  70 |   dependencies:
  71 |     "@babel/types" "^7.21.0"
  72 |     "@jridgewell/gen-mapping" "^0.3.2"
  73 |     "@jridgewell/trace-mapping" "^0.3.17"
  74 |     jsesc "^2.5.1"
  75 | 
  76 | "@babel/helper-annotate-as-pure@^7.18.6":
  77 |   version "7.18.6"
  78 |   resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
  79 |   integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
  80 |   dependencies:
  81 |     "@babel/types" "^7.18.6"
  82 | 
  83 | "@babel/helper-compilation-targets@^7.20.7":
  84 |   version "7.20.7"
  85 |   resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb"
  86 |   integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
  87 |   dependencies:
  88 |     "@babel/compat-data" "^7.20.5"
  89 |     "@babel/helper-validator-option" "^7.18.6"
  90 |     browserslist "^4.21.3"
  91 |     lru-cache "^5.1.1"
  92 |     semver "^6.3.0"
  93 | 
  94 | "@babel/helper-environment-visitor@^7.18.9":
  95 |   version "7.18.9"
  96 |   resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
  97 |   integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
  98 | 
  99 | "@babel/helper-function-name@^7.21.0":
 100 |   version "7.21.0"
 101 |   resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4"
 102 |   integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==
 103 |   dependencies:
 104 |     "@babel/template" "^7.20.7"
 105 |     "@babel/types" "^7.21.0"
 106 | 
 107 | "@babel/helper-hoist-variables@^7.18.6":
 108 |   version "7.18.6"
 109 |   resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
 110 |   integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
 111 |   dependencies:
 112 |     "@babel/types" "^7.18.6"
 113 | 
 114 | "@babel/helper-module-imports@^7.16.7":
 115 |   version "7.16.7"
 116 |   resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
 117 |   integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
 118 |   dependencies:
 119 |     "@babel/types" "^7.16.7"
 120 | 
 121 | "@babel/helper-module-imports@^7.18.6":
 122 |   version "7.18.6"
 123 |   resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
 124 |   integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
 125 |   dependencies:
 126 |     "@babel/types" "^7.18.6"
 127 | 
 128 | "@babel/helper-module-transforms@^7.21.0":
 129 |   version "7.21.0"
 130 |   resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.0.tgz#89a8f86ad748870e3d024e470b2e8405e869db67"
 131 |   integrity sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==
 132 |   dependencies:
 133 |     "@babel/helper-environment-visitor" "^7.18.9"
 134 |     "@babel/helper-module-imports" "^7.18.6"
 135 |     "@babel/helper-simple-access" "^7.20.2"
 136 |     "@babel/helper-split-export-declaration" "^7.18.6"
 137 |     "@babel/helper-validator-identifier" "^7.19.1"
 138 |     "@babel/template" "^7.20.7"
 139 |     "@babel/traverse" "^7.21.0"
 140 |     "@babel/types" "^7.21.0"
 141 | 
 142 | "@babel/helper-plugin-utils@^7.18.6":
 143 |   version "7.18.6"
 144 |   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz#9448974dd4fb1d80fefe72e8a0af37809cd30d6d"
 145 |   integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==
 146 | 
 147 | "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2":
 148 |   version "7.20.2"
 149 |   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629"
 150 |   integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==
 151 | 
 152 | "@babel/helper-simple-access@^7.20.2":
 153 |   version "7.20.2"
 154 |   resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9"
 155 |   integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==
 156 |   dependencies:
 157 |     "@babel/types" "^7.20.2"
 158 | 
 159 | "@babel/helper-split-export-declaration@^7.18.6":
 160 |   version "7.18.6"
 161 |   resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
 162 |   integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
 163 |   dependencies:
 164 |     "@babel/types" "^7.18.6"
 165 | 
 166 | "@babel/helper-string-parser@^7.19.4":
 167 |   version "7.19.4"
 168 |   resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
 169 |   integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
 170 | 
 171 | "@babel/helper-validator-identifier@^7.16.7":
 172 |   version "7.16.7"
 173 |   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
 174 |   integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
 175 | 
 176 | "@babel/helper-validator-identifier@^7.18.6":
 177 |   version "7.18.6"
 178 |   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
 179 |   integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
 180 | 
 181 | "@babel/helper-validator-identifier@^7.19.1":
 182 |   version "7.19.1"
 183 |   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
 184 |   integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
 185 | 
 186 | "@babel/helper-validator-option@^7.18.6":
 187 |   version "7.18.6"
 188 |   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
 189 |   integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
 190 | 
 191 | "@babel/helpers@^7.21.0":
 192 |   version "7.21.0"
 193 |   resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e"
 194 |   integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==
 195 |   dependencies:
 196 |     "@babel/template" "^7.20.7"
 197 |     "@babel/traverse" "^7.21.0"
 198 |     "@babel/types" "^7.21.0"
 199 | 
 200 | "@babel/highlight@^7.16.7":
 201 |   version "7.17.9"
 202 |   resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
 203 |   integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==
 204 |   dependencies:
 205 |     "@babel/helper-validator-identifier" "^7.16.7"
 206 |     chalk "^2.0.0"
 207 |     js-tokens "^4.0.0"
 208 | 
 209 | "@babel/highlight@^7.18.6":
 210 |   version "7.18.6"
 211 |   resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
 212 |   integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
 213 |   dependencies:
 214 |     "@babel/helper-validator-identifier" "^7.18.6"
 215 |     chalk "^2.0.0"
 216 |     js-tokens "^4.0.0"
 217 | 
 218 | "@babel/parser@^7.17.7", "@babel/parser@^7.21.2":
 219 |   version "7.21.2"
 220 |   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3"
 221 |   integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==
 222 | 
 223 | "@babel/parser@^7.20.7", "@babel/parser@^7.21.0":
 224 |   version "7.21.1"
 225 |   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.1.tgz#a8f81ee2fe872af23faea4b17a08fcc869de7bcc"
 226 |   integrity sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==
 227 | 
 228 | "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6":
 229 |   version "7.18.6"
 230 |   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0"
 231 |   integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
 232 |   dependencies:
 233 |     "@babel/helper-plugin-utils" "^7.18.6"
 234 | 
 235 | "@babel/plugin-transform-react-jsx-self@^7.18.6":
 236 |   version "7.21.0"
 237 |   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz#ec98d4a9baafc5a1eb398da4cf94afbb40254a54"
 238 |   integrity sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==
 239 |   dependencies:
 240 |     "@babel/helper-plugin-utils" "^7.20.2"
 241 | 
 242 | "@babel/plugin-transform-react-jsx-source@^7.19.6":
 243 |   version "7.19.6"
 244 |   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86"
 245 |   integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==
 246 |   dependencies:
 247 |     "@babel/helper-plugin-utils" "^7.19.0"
 248 | 
 249 | "@babel/plugin-transform-react-jsx@^7.21.0":
 250 |   version "7.21.0"
 251 |   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2"
 252 |   integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==
 253 |   dependencies:
 254 |     "@babel/helper-annotate-as-pure" "^7.18.6"
 255 |     "@babel/helper-module-imports" "^7.18.6"
 256 |     "@babel/helper-plugin-utils" "^7.20.2"
 257 |     "@babel/plugin-syntax-jsx" "^7.18.6"
 258 |     "@babel/types" "^7.21.0"
 259 | 
 260 | "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
 261 |   version "7.17.9"
 262 |   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
 263 |   integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
 264 |   dependencies:
 265 |     regenerator-runtime "^0.13.4"
 266 | 
 267 | "@babel/runtime@^7.18.3":
 268 |   version "7.18.6"
 269 |   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580"
 270 |   integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==
 271 |   dependencies:
 272 |     regenerator-runtime "^0.13.4"
 273 | 
 274 | "@babel/runtime@^7.20.6":
 275 |   version "7.21.0"
 276 |   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
 277 |   integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
 278 |   dependencies:
 279 |     regenerator-runtime "^0.13.11"
 280 | 
 281 | "@babel/template@^7.18.10", "@babel/template@^7.20.7":
 282 |   version "7.20.7"
 283 |   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
 284 |   integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
 285 |   dependencies:
 286 |     "@babel/code-frame" "^7.18.6"
 287 |     "@babel/parser" "^7.20.7"
 288 |     "@babel/types" "^7.20.7"
 289 | 
 290 | "@babel/traverse@^7.17.3":
 291 |   version "7.21.2"
 292 |   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75"
 293 |   integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==
 294 |   dependencies:
 295 |     "@babel/code-frame" "^7.18.6"
 296 |     "@babel/generator" "^7.21.1"
 297 |     "@babel/helper-environment-visitor" "^7.18.9"
 298 |     "@babel/helper-function-name" "^7.21.0"
 299 |     "@babel/helper-hoist-variables" "^7.18.6"
 300 |     "@babel/helper-split-export-declaration" "^7.18.6"
 301 |     "@babel/parser" "^7.21.2"
 302 |     "@babel/types" "^7.21.2"
 303 |     debug "^4.1.0"
 304 |     globals "^11.1.0"
 305 | 
 306 | "@babel/traverse@^7.21.0":
 307 |   version "7.21.0"
 308 |   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.0.tgz#0e1807abd5db98e6a19c204b80ed1e3f5bca0edc"
 309 |   integrity sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==
 310 |   dependencies:
 311 |     "@babel/code-frame" "^7.18.6"
 312 |     "@babel/generator" "^7.21.0"
 313 |     "@babel/helper-environment-visitor" "^7.18.9"
 314 |     "@babel/helper-function-name" "^7.21.0"
 315 |     "@babel/helper-hoist-variables" "^7.18.6"
 316 |     "@babel/helper-split-export-declaration" "^7.18.6"
 317 |     "@babel/parser" "^7.21.0"
 318 |     "@babel/types" "^7.21.0"
 319 |     debug "^4.1.0"
 320 |     globals "^11.1.0"
 321 | 
 322 | "@babel/types@^7.16.7":
 323 |   version "7.17.0"
 324 |   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
 325 |   integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
 326 |   dependencies:
 327 |     "@babel/helper-validator-identifier" "^7.16.7"
 328 |     to-fast-properties "^2.0.0"
 329 | 
 330 | "@babel/types@^7.17.0", "@babel/types@^7.21.2":
 331 |   version "7.21.2"
 332 |   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1"
 333 |   integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==
 334 |   dependencies:
 335 |     "@babel/helper-string-parser" "^7.19.4"
 336 |     "@babel/helper-validator-identifier" "^7.19.1"
 337 |     to-fast-properties "^2.0.0"
 338 | 
 339 | "@babel/types@^7.18.6":
 340 |   version "7.18.7"
 341 |   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.7.tgz#a4a2c910c15040ea52cdd1ddb1614a65c8041726"
 342 |   integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==
 343 |   dependencies:
 344 |     "@babel/helper-validator-identifier" "^7.18.6"
 345 |     to-fast-properties "^2.0.0"
 346 | 
 347 | "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0":
 348 |   version "7.21.0"
 349 |   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.0.tgz#1da00d89c2f18b226c9207d96edbeb79316a1819"
 350 |   integrity sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==
 351 |   dependencies:
 352 |     "@babel/helper-string-parser" "^7.19.4"
 353 |     "@babel/helper-validator-identifier" "^7.19.1"
 354 |     to-fast-properties "^2.0.0"
 355 | 
 356 | "@code-hike/classer@^0.0.0-aa6efee":
 357 |   version "0.0.0-e48fa74"
 358 |   resolved "https://registry.yarnpkg.com/@code-hike/classer/-/classer-0.0.0-e48fa74.tgz#17243ca84d5af303c51e62b378e8db65e01cd3f4"
 359 |   integrity sha512-CyPYvfl4K5Hp9uyhLhUemul56eiGOF0FNXh5ALzzK9VNhRmRmj1O0mKtLDpoccI8W90r9kQES/nW2FC8jVVieg==
 360 | 
 361 | "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.4.0":
 362 |   version "6.4.2"
 363 |   resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.4.2.tgz#938b25223bd21f97b2a6d85474643355f98b505b"
 364 |   integrity sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ==
 365 |   dependencies:
 366 |     "@codemirror/language" "^6.0.0"
 367 |     "@codemirror/state" "^6.0.0"
 368 |     "@codemirror/view" "^6.6.0"
 369 |     "@lezer/common" "^1.0.0"
 370 | 
 371 | "@codemirror/commands@^6.1.3":
 372 |   version "6.2.1"
 373 |   resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.2.1.tgz#ab5e979ad1458bbe395bf69ac601f461ac73cf08"
 374 |   integrity sha512-FFiNKGuHA5O8uC6IJE5apI5rT9gyjlw4whqy4vlcX0wE/myxL6P1s0upwDhY4HtMWLOwzwsp0ap3bjdQhvfDOA==
 375 |   dependencies:
 376 |     "@codemirror/language" "^6.0.0"
 377 |     "@codemirror/state" "^6.2.0"
 378 |     "@codemirror/view" "^6.0.0"
 379 |     "@lezer/common" "^1.0.0"
 380 | 
 381 | "@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.0.1":
 382 |   version "6.0.2"
 383 |   resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.0.2.tgz#b286d0226755a751f60599e1e2969d351aebbd4c"
 384 |   integrity sha512-4V4zmUOl2Glx0GWw0HiO1oGD4zvMlIQ3zx5hXOE6ipCjhohig2bhWRAasrZylH9pRNTcl1VMa59Lsl8lZWlTzw==
 385 |   dependencies:
 386 |     "@codemirror/autocomplete" "^6.0.0"
 387 |     "@codemirror/language" "^6.0.0"
 388 |     "@codemirror/state" "^6.0.0"
 389 |     "@lezer/css" "^1.0.0"
 390 | 
 391 | "@codemirror/lang-html@^6.4.0":
 392 |   version "6.4.2"
 393 |   resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.2.tgz#3c7117e45bae009bc7bc08eef8a79b5d05930d83"
 394 |   integrity sha512-bqCBASkteKySwtIbiV/WCtGnn/khLRbbiV5TE+d9S9eQJD7BA4c5dTRm2b3bVmSpilff5EYxvB4PQaZzM/7cNw==
 395 |   dependencies:
 396 |     "@codemirror/autocomplete" "^6.0.0"
 397 |     "@codemirror/lang-css" "^6.0.0"
 398 |     "@codemirror/lang-javascript" "^6.0.0"
 399 |     "@codemirror/language" "^6.4.0"
 400 |     "@codemirror/state" "^6.0.0"
 401 |     "@codemirror/view" "^6.2.2"
 402 |     "@lezer/common" "^1.0.0"
 403 |     "@lezer/css" "^1.1.0"
 404 |     "@lezer/html" "^1.3.0"
 405 | 
 406 | "@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.2":
 407 |   version "6.1.4"
 408 |   resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.1.4.tgz#8a41f4d213e1143b4eef6f65f8b77b349aaf894c"
 409 |   integrity sha512-OxLf7OfOZBTMRMi6BO/F72MNGmgOd9B0vetOLvHsDACFXayBzW8fm8aWnDM0yuy68wTK03MBf4HbjSBNRG5q7A==
 410 |   dependencies:
 411 |     "@codemirror/autocomplete" "^6.0.0"
 412 |     "@codemirror/language" "^6.6.0"
 413 |     "@codemirror/lint" "^6.0.0"
 414 |     "@codemirror/state" "^6.0.0"
 415 |     "@codemirror/view" "^6.0.0"
 416 |     "@lezer/common" "^1.0.0"
 417 |     "@lezer/javascript" "^1.0.0"
 418 | 
 419 | "@codemirror/language@^6.0.0", "@codemirror/language@^6.3.2", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0":
 420 |   version "6.6.0"
 421 |   resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.6.0.tgz#2204407174a38a68053715c19e28ad61f491779f"
 422 |   integrity sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg==
 423 |   dependencies:
 424 |     "@codemirror/state" "^6.0.0"
 425 |     "@codemirror/view" "^6.0.0"
 426 |     "@lezer/common" "^1.0.0"
 427 |     "@lezer/highlight" "^1.0.0"
 428 |     "@lezer/lr" "^1.0.0"
 429 |     style-mod "^4.0.0"
 430 | 
 431 | "@codemirror/lint@^6.0.0":
 432 |   version "6.2.0"
 433 |   resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.2.0.tgz#25cdab7425fcda1b38a9d63f230f833c8b6b369f"
 434 |   integrity sha512-KVCECmR2fFeYBr1ZXDVue7x3q5PMI0PzcIbA+zKufnkniMBo1325t0h1jM85AKp8l3tj67LRxVpZfgDxEXlQkg==
 435 |   dependencies:
 436 |     "@codemirror/state" "^6.0.0"
 437 |     "@codemirror/view" "^6.0.0"
 438 |     crelt "^1.0.5"
 439 | 
 440 | "@codemirror/state@^6.0.0", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0":
 441 |   version "6.2.0"
 442 |   resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.2.0.tgz#a0fb08403ced8c2a68d1d0acee926bd20be922f2"
 443 |   integrity sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==
 444 | 
 445 | "@codemirror/view@^6.0.0", "@codemirror/view@^6.2.2", "@codemirror/view@^6.6.0", "@codemirror/view@^6.7.1":
 446 |   version "6.9.1"
 447 |   resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.9.1.tgz#2ce4c528974b6172a5a4a738b7b0a0f04a4c1140"
 448 |   integrity sha512-bzfSjJn9dAADVpabLKWKNmMG4ibyTV2e3eOGowjElNPTdTkSbi6ixPYHm2u0ADcETfKsi2/R84Rkmi91dH9yEg==
 449 |   dependencies:
 450 |     "@codemirror/state" "^6.1.4"
 451 |     style-mod "^4.0.0"
 452 |     w3c-keyname "^2.2.4"
 453 | 
 454 | "@codesandbox/nodebox@0.1.4":
 455 |   version "0.1.4"
 456 |   resolved "https://registry.yarnpkg.com/@codesandbox/nodebox/-/nodebox-0.1.4.tgz#1c9ed4caf6cda764500aec3d46b245e2e9b88ccc"
 457 |   integrity sha512-+MR7JibjGjTRDmyQbL8Mliej6wakQP7q99+wGL/nOzd0Q3s+YWGQfv0QpYKbdMClKUTFJGvwzwOeqHVTkpWNCQ==
 458 |   dependencies:
 459 |     outvariant "^1.3.0"
 460 |     strict-event-emitter "^0.4.3"
 461 | 
 462 | "@codesandbox/sandpack-client@^2.0.26":
 463 |   version "2.0.26"
 464 |   resolved "https://registry.yarnpkg.com/@codesandbox/sandpack-client/-/sandpack-client-2.0.26.tgz#eaa8053cc7241a32ac91dea67796c3261caa20a8"
 465 |   integrity sha512-fVVGWfq72tV0Hu5jKo0rUnKP6tPnuDNtPM+HhvOpm12eeXAr7eImecdfSNZbnEcvR6onjXAyszoygI4xjFUJKg==
 466 |   dependencies:
 467 |     "@codesandbox/nodebox" "0.1.4"
 468 |     buffer "^6.0.3"
 469 |     dequal "^2.0.2"
 470 |     outvariant "1.3.0"
 471 | 
 472 | "@codesandbox/sandpack-react@^2.0.26":
 473 |   version "2.0.26"
 474 |   resolved "https://registry.yarnpkg.com/@codesandbox/sandpack-react/-/sandpack-react-2.0.26.tgz#ceb69ad4998b8def161be5986966fe7a55de8810"
 475 |   integrity sha512-cFbTY+iOLKL8sqU0SQmLl52EDwZ2XKBMt+Bz7KZn+2+etfZ+UEuciBTb+g11ElGk+KcQ3Q6fp0OdcJT6FwPwcQ==
 476 |   dependencies:
 477 |     "@code-hike/classer" "^0.0.0-aa6efee"
 478 |     "@codemirror/autocomplete" "^6.4.0"
 479 |     "@codemirror/commands" "^6.1.3"
 480 |     "@codemirror/lang-css" "^6.0.1"
 481 |     "@codemirror/lang-html" "^6.4.0"
 482 |     "@codemirror/lang-javascript" "^6.1.2"
 483 |     "@codemirror/language" "^6.3.2"
 484 |     "@codemirror/state" "^6.2.0"
 485 |     "@codemirror/view" "^6.7.1"
 486 |     "@codesandbox/sandpack-client" "^2.0.26"
 487 |     "@lezer/highlight" "^1.1.3"
 488 |     "@react-hook/intersection-observer" "^3.1.1"
 489 |     "@stitches/core" "^1.2.6"
 490 |     ansi-to-react "6.1.6"
 491 |     clean-set "^1.1.2"
 492 |     codesandbox-import-util-types "^2.2.3"
 493 |     dequal "^2.0.2"
 494 |     lz-string "^1.4.4"
 495 |     react-devtools-inline "4.4.0"
 496 |     react-is "^17.0.2"
 497 | 
 498 | "@emotion/babel-plugin-jsx-pragmatic@^0.2.0":
 499 |   version "0.2.0"
 500 |   resolved "https://registry.yarnpkg.com/@emotion/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-0.2.0.tgz#6fdd78600417973fa2610704693158181d8505b7"
 501 |   integrity sha512-VPfKAtb/bVyu5y+HzCPj9bb2nHnj9yX5mMAU7N0pIDcrFZo8aqDyHXLYF8BD7tY4pNL09N87dygVLKIkQvshJw==
 502 |   dependencies:
 503 |     "@babel/plugin-syntax-jsx" "^7.17.12"
 504 | 
 505 | "@emotion/babel-plugin@^11.10.6":
 506 |   version "11.10.6"
 507 |   resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead"
 508 |   integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==
 509 |   dependencies:
 510 |     "@babel/helper-module-imports" "^7.16.7"
 511 |     "@babel/runtime" "^7.18.3"
 512 |     "@emotion/hash" "^0.9.0"
 513 |     "@emotion/memoize" "^0.8.0"
 514 |     "@emotion/serialize" "^1.1.1"
 515 |     babel-plugin-macros "^3.1.0"
 516 |     convert-source-map "^1.5.0"
 517 |     escape-string-regexp "^4.0.0"
 518 |     find-root "^1.1.0"
 519 |     source-map "^0.5.7"
 520 |     stylis "4.1.3"
 521 | 
 522 | "@emotion/cache@^11.10.5":
 523 |   version "11.10.5"
 524 |   resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12"
 525 |   integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==
 526 |   dependencies:
 527 |     "@emotion/memoize" "^0.8.0"
 528 |     "@emotion/sheet" "^1.2.1"
 529 |     "@emotion/utils" "^1.2.0"
 530 |     "@emotion/weak-memoize" "^0.3.0"
 531 |     stylis "4.1.3"
 532 | 
 533 | "@emotion/hash@^0.9.0":
 534 |   version "0.9.0"
 535 |   resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7"
 536 |   integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==
 537 | 
 538 | "@emotion/is-prop-valid@^1.2.0":
 539 |   version "1.2.0"
 540 |   resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83"
 541 |   integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==
 542 |   dependencies:
 543 |     "@emotion/memoize" "^0.8.0"
 544 | 
 545 | "@emotion/memoize@^0.8.0":
 546 |   version "0.8.0"
 547 |   resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f"
 548 |   integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
 549 | 
 550 | "@emotion/react@^11.10.6":
 551 |   version "11.10.6"
 552 |   resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11"
 553 |   integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==
 554 |   dependencies:
 555 |     "@babel/runtime" "^7.18.3"
 556 |     "@emotion/babel-plugin" "^11.10.6"
 557 |     "@emotion/cache" "^11.10.5"
 558 |     "@emotion/serialize" "^1.1.1"
 559 |     "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
 560 |     "@emotion/utils" "^1.2.0"
 561 |     "@emotion/weak-memoize" "^0.3.0"
 562 |     hoist-non-react-statics "^3.3.1"
 563 | 
 564 | "@emotion/serialize@^1.1.1":
 565 |   version "1.1.1"
 566 |   resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0"
 567 |   integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==
 568 |   dependencies:
 569 |     "@emotion/hash" "^0.9.0"
 570 |     "@emotion/memoize" "^0.8.0"
 571 |     "@emotion/unitless" "^0.8.0"
 572 |     "@emotion/utils" "^1.2.0"
 573 |     csstype "^3.0.2"
 574 | 
 575 | "@emotion/sheet@^1.2.1":
 576 |   version "1.2.1"
 577 |   resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c"
 578 |   integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==
 579 | 
 580 | "@emotion/styled@^11.10.6":
 581 |   version "11.10.6"
 582 |   resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.6.tgz#d886afdc51ef4d66c787ebde848f3cc8b117ebba"
 583 |   integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==
 584 |   dependencies:
 585 |     "@babel/runtime" "^7.18.3"
 586 |     "@emotion/babel-plugin" "^11.10.6"
 587 |     "@emotion/is-prop-valid" "^1.2.0"
 588 |     "@emotion/serialize" "^1.1.1"
 589 |     "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
 590 |     "@emotion/utils" "^1.2.0"
 591 | 
 592 | "@emotion/unitless@^0.8.0":
 593 |   version "0.8.0"
 594 |   resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db"
 595 |   integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
 596 | 
 597 | "@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
 598 |   version "1.0.0"
 599 |   resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df"
 600 |   integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==
 601 | 
 602 | "@emotion/utils@^1.2.0":
 603 |   version "1.2.0"
 604 |   resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561"
 605 |   integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==
 606 | 
 607 | "@emotion/weak-memoize@^0.3.0":
 608 |   version "0.3.0"
 609 |   resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb"
 610 |   integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==
 611 | 
 612 | "@esbuild/android-arm64@0.16.17":
 613 |   version "0.16.17"
 614 |   resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23"
 615 |   integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==
 616 | 
 617 | "@esbuild/android-arm@0.16.17":
 618 |   version "0.16.17"
 619 |   resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2"
 620 |   integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==
 621 | 
 622 | "@esbuild/android-x64@0.16.17":
 623 |   version "0.16.17"
 624 |   resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e"
 625 |   integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==
 626 | 
 627 | "@esbuild/darwin-arm64@0.16.17":
 628 |   version "0.16.17"
 629 |   resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220"
 630 |   integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==
 631 | 
 632 | "@esbuild/darwin-x64@0.16.17":
 633 |   version "0.16.17"
 634 |   resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4"
 635 |   integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==
 636 | 
 637 | "@esbuild/freebsd-arm64@0.16.17":
 638 |   version "0.16.17"
 639 |   resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27"
 640 |   integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==
 641 | 
 642 | "@esbuild/freebsd-x64@0.16.17":
 643 |   version "0.16.17"
 644 |   resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72"
 645 |   integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==
 646 | 
 647 | "@esbuild/linux-arm64@0.16.17":
 648 |   version "0.16.17"
 649 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca"
 650 |   integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==
 651 | 
 652 | "@esbuild/linux-arm@0.16.17":
 653 |   version "0.16.17"
 654 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196"
 655 |   integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==
 656 | 
 657 | "@esbuild/linux-ia32@0.16.17":
 658 |   version "0.16.17"
 659 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54"
 660 |   integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==
 661 | 
 662 | "@esbuild/linux-loong64@0.16.17":
 663 |   version "0.16.17"
 664 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8"
 665 |   integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==
 666 | 
 667 | "@esbuild/linux-mips64el@0.16.17":
 668 |   version "0.16.17"
 669 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726"
 670 |   integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==
 671 | 
 672 | "@esbuild/linux-ppc64@0.16.17":
 673 |   version "0.16.17"
 674 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8"
 675 |   integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==
 676 | 
 677 | "@esbuild/linux-riscv64@0.16.17":
 678 |   version "0.16.17"
 679 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9"
 680 |   integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==
 681 | 
 682 | "@esbuild/linux-s390x@0.16.17":
 683 |   version "0.16.17"
 684 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87"
 685 |   integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==
 686 | 
 687 | "@esbuild/linux-x64@0.16.17":
 688 |   version "0.16.17"
 689 |   resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f"
 690 |   integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==
 691 | 
 692 | "@esbuild/netbsd-x64@0.16.17":
 693 |   version "0.16.17"
 694 |   resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775"
 695 |   integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==
 696 | 
 697 | "@esbuild/openbsd-x64@0.16.17":
 698 |   version "0.16.17"
 699 |   resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35"
 700 |   integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==
 701 | 
 702 | "@esbuild/sunos-x64@0.16.17":
 703 |   version "0.16.17"
 704 |   resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c"
 705 |   integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==
 706 | 
 707 | "@esbuild/win32-arm64@0.16.17":
 708 |   version "0.16.17"
 709 |   resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a"
 710 |   integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==
 711 | 
 712 | "@esbuild/win32-ia32@0.16.17":
 713 |   version "0.16.17"
 714 |   resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09"
 715 |   integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==
 716 | 
 717 | "@esbuild/win32-x64@0.16.17":
 718 |   version "0.16.17"
 719 |   resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091"
 720 |   integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==
 721 | 
 722 | "@ianvs/prettier-plugin-sort-imports@^3.7.1":
 723 |   version "3.7.1"
 724 |   resolved "https://registry.yarnpkg.com/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-3.7.1.tgz#260baf4bde78e6abf5dd1ab556f7ecf9054948b7"
 725 |   integrity sha512-XDnBUUruJY9KgNd7T2ZHnVPWo5B9NzVDCLEMm7HjXTA3rTtMg5Q46gYRjLvampDXSmN8+icu54aRE3IIT8U+1w==
 726 |   dependencies:
 727 |     "@babel/core" "^7.17.7"
 728 |     "@babel/generator" "^7.17.7"
 729 |     "@babel/parser" "^7.17.7"
 730 |     "@babel/traverse" "^7.17.3"
 731 |     "@babel/types" "^7.17.0"
 732 |     javascript-natural-sort "0.7.1"
 733 |     lodash.clone "^4.5.0"
 734 |     lodash.isequal "^4.5.0"
 735 | 
 736 | "@iconify-json/octicon@^1.1.33":
 737 |   version "1.1.33"
 738 |   resolved "https://registry.yarnpkg.com/@iconify-json/octicon/-/octicon-1.1.33.tgz#f3f531fe114bbb4158228171de61f8e9393dc76a"
 739 |   integrity sha512-hMZbFew+2AQ50vrRJx+Ngfj8G3+6Lwmc02CjhT5FvtF6rEy/BW9TC1Qn1bUp0w7OrXa9c/gt0I4UYhIA/k637A==
 740 |   dependencies:
 741 |     "@iconify/types" "*"
 742 | 
 743 | "@iconify-json/ri@^1.1.5":
 744 |   version "1.1.5"
 745 |   resolved "https://registry.yarnpkg.com/@iconify-json/ri/-/ri-1.1.5.tgz#569495ae788a3865805e7a17de553ab90d672ea7"
 746 |   integrity sha512-OrxKcKFHanTSPmU5esvSn5YfpNgjwJJ+6rkK1I1pIRCPXfuvmlTJGUjf+L5ZQHUiMWLQz+M2bqXx8iBUtW35Gg==
 747 |   dependencies:
 748 |     "@iconify/types" "*"
 749 | 
 750 | "@iconify-json/teenyicons@^1.1.5":
 751 |   version "1.1.5"
 752 |   resolved "https://registry.yarnpkg.com/@iconify-json/teenyicons/-/teenyicons-1.1.5.tgz#d379117c93c694a138291dc5a6e19f4d7bd84d83"
 753 |   integrity sha512-nhMUhmQIyuRh7ZMeG+P2OI8kYPly7kLgec52Ett4NvIOv9+dOkIK3Gzchvlcg/ZZlugQn/n/hAJiCgzcNnrWRQ==
 754 |   dependencies:
 755 |     "@iconify/types" "*"
 756 | 
 757 | "@iconify-json/vscode-icons@^1.1.22":
 758 |   version "1.1.22"
 759 |   resolved "https://registry.yarnpkg.com/@iconify-json/vscode-icons/-/vscode-icons-1.1.22.tgz#830fd2c29ff3fc47a8495a88809b73c0d37be47d"
 760 |   integrity sha512-lO0Sl2xApg/R7PlZJOiRbwuOQFXPRVbM8c+RHOMxWEUF0Hd/UiHBemYjdUDW5pr9QNmvv183rwJiBFHBvIeZ5A==
 761 |   dependencies:
 762 |     "@iconify/types" "*"
 763 | 
 764 | "@iconify/types@*":
 765 |   version "1.1.0"
 766 |   resolved "https://registry.yarnpkg.com/@iconify/types/-/types-1.1.0.tgz#dc15fc988b1b3fd558dd140a24ede7e0aac11280"
 767 |   integrity sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==
 768 | 
 769 | "@iconify/types@^2.0.0":
 770 |   version "2.0.0"
 771 |   resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57"
 772 |   integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==
 773 | 
 774 | "@iconify/utils@^2.1.2":
 775 |   version "2.1.4"
 776 |   resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.4.tgz#dd6fb39363e275fa9502b6e0f84f77032ef4041f"
 777 |   integrity sha512-7vzsYIvxv5Hng0MNEtSSnyMBD/+zqnORqmKiYsSgpMBGSz1r93URgBZHPYCZ1/gpoaVstYW4/SVLGCMJBNMCLQ==
 778 |   dependencies:
 779 |     "@antfu/install-pkg" "^0.1.1"
 780 |     "@antfu/utils" "^0.7.2"
 781 |     "@iconify/types" "^2.0.0"
 782 |     debug "^4.3.4"
 783 |     kolorist "^1.7.0"
 784 |     local-pkg "^0.4.3"
 785 | 
 786 | "@jridgewell/gen-mapping@^0.1.0":
 787 |   version "0.1.1"
 788 |   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
 789 |   integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
 790 |   dependencies:
 791 |     "@jridgewell/set-array" "^1.0.0"
 792 |     "@jridgewell/sourcemap-codec" "^1.4.10"
 793 | 
 794 | "@jridgewell/gen-mapping@^0.3.2":
 795 |   version "0.3.2"
 796 |   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
 797 |   integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
 798 |   dependencies:
 799 |     "@jridgewell/set-array" "^1.0.1"
 800 |     "@jridgewell/sourcemap-codec" "^1.4.10"
 801 |     "@jridgewell/trace-mapping" "^0.3.9"
 802 | 
 803 | "@jridgewell/resolve-uri@3.1.0":
 804 |   version "3.1.0"
 805 |   resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
 806 |   integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
 807 | 
 808 | "@jridgewell/resolve-uri@^3.0.3":
 809 |   version "3.0.5"
 810 |   resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
 811 |   integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
 812 | 
 813 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
 814 |   version "1.1.2"
 815 |   resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
 816 |   integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
 817 | 
 818 | "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.13":
 819 |   version "1.4.14"
 820 |   resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
 821 |   integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
 822 | 
 823 | "@jridgewell/sourcemap-codec@^1.4.10":
 824 |   version "1.4.11"
 825 |   resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
 826 |   integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
 827 | 
 828 | "@jridgewell/trace-mapping@^0.3.17":
 829 |   version "0.3.17"
 830 |   resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985"
 831 |   integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==
 832 |   dependencies:
 833 |     "@jridgewell/resolve-uri" "3.1.0"
 834 |     "@jridgewell/sourcemap-codec" "1.4.14"
 835 | 
 836 | "@jridgewell/trace-mapping@^0.3.9":
 837 |   version "0.3.14"
 838 |   resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
 839 |   integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
 840 |   dependencies:
 841 |     "@jridgewell/resolve-uri" "^3.0.3"
 842 |     "@jridgewell/sourcemap-codec" "^1.4.10"
 843 | 
 844 | "@lezer/common@^1.0.0":
 845 |   version "1.0.2"
 846 |   resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.0.2.tgz#8fb9b86bdaa2ece57e7d59e5ffbcb37d71815087"
 847 |   integrity sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng==
 848 | 
 849 | "@lezer/css@^1.0.0", "@lezer/css@^1.1.0":
 850 |   version "1.1.1"
 851 |   resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.1.tgz#c36dcb0789317cb80c3740767dd3b85e071ad082"
 852 |   integrity sha512-mSjx+unLLapEqdOYDejnGBokB5+AiJKZVclmud0MKQOKx3DLJ5b5VTCstgDDknR6iIV4gVrN6euzsCnj0A2gQA==
 853 |   dependencies:
 854 |     "@lezer/highlight" "^1.0.0"
 855 |     "@lezer/lr" "^1.0.0"
 856 | 
 857 | "@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3":
 858 |   version "1.1.3"
 859 |   resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.1.3.tgz#bf5a36c2ee227f526d74997ac91f7777e29bd25d"
 860 |   integrity sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==
 861 |   dependencies:
 862 |     "@lezer/common" "^1.0.0"
 863 | 
 864 | "@lezer/html@^1.3.0":
 865 |   version "1.3.3"
 866 |   resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.3.tgz#2eddae2ad000f9b184d9fc4686394d0fa0849993"
 867 |   integrity sha512-04Fyvu66DjV2EjhDIG1kfDdktn5Pfw56SXPrzKNQH5B2m7BDfc6bDsz+ZJG8dLS3kIPEKbyyq1Sm2/kjeG0+AA==
 868 |   dependencies:
 869 |     "@lezer/common" "^1.0.0"
 870 |     "@lezer/highlight" "^1.0.0"
 871 |     "@lezer/lr" "^1.0.0"
 872 | 
 873 | "@lezer/javascript@^1.0.0":
 874 |   version "1.4.1"
 875 |   resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.1.tgz#97a15042c76b5979af6a069fac83cf6485628cbf"
 876 |   integrity sha512-Hqx36DJeYhKtdpc7wBYPR0XF56ZzIp0IkMO/zNNj80xcaFOV4Oj/P7TQc/8k2TxNhzl7tV5tXS8ZOCPbT4L3nA==
 877 |   dependencies:
 878 |     "@lezer/highlight" "^1.1.3"
 879 |     "@lezer/lr" "^1.3.0"
 880 | 
 881 | "@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0":
 882 |   version "1.3.3"
 883 |   resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.3.3.tgz#0ac6c889f1235874f33c45a1b9785d7054f60708"
 884 |   integrity sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w==
 885 |   dependencies:
 886 |     "@lezer/common" "^1.0.0"
 887 | 
 888 | "@nodelib/fs.scandir@2.1.5":
 889 |   version "2.1.5"
 890 |   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
 891 |   integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
 892 |   dependencies:
 893 |     "@nodelib/fs.stat" "2.0.5"
 894 |     run-parallel "^1.1.9"
 895 | 
 896 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
 897 |   version "2.0.5"
 898 |   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
 899 |   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
 900 | 
 901 | "@nodelib/fs.walk@^1.2.3":
 902 |   version "1.2.8"
 903 |   resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
 904 |   integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
 905 |   dependencies:
 906 |     "@nodelib/fs.scandir" "2.1.5"
 907 |     fastq "^1.6.0"
 908 | 
 909 | "@react-hook/intersection-observer@^3.1.1":
 910 |   version "3.1.1"
 911 |   resolved "https://registry.yarnpkg.com/@react-hook/intersection-observer/-/intersection-observer-3.1.1.tgz#6b8fdb80d133c9c28bc8318368ecb3a1f8befc50"
 912 |   integrity sha512-OTDx8/wFaRvzFtKl1dEUEXSOqK2zVJHporiTTdC2xO++0e9FEx9wIrPis5q3lqtXeZH9zYGLbk+aB75qNFbbuw==
 913 |   dependencies:
 914 |     "@react-hook/passive-layout-effect" "^1.2.0"
 915 |     intersection-observer "^0.10.0"
 916 | 
 917 | "@react-hook/passive-layout-effect@^1.2.0":
 918 |   version "1.2.1"
 919 |   resolved "https://registry.yarnpkg.com/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz#c06dac2d011f36d61259aa1c6df4f0d5e28bc55e"
 920 |   integrity sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==
 921 | 
 922 | "@remix-run/router@1.3.3":
 923 |   version "1.3.3"
 924 |   resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.3.tgz#d6d531d69c0fa3a44fda7dc00b20d49b44549164"
 925 |   integrity sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==
 926 | 
 927 | "@stitches/core@^1.2.6":
 928 |   version "1.2.8"
 929 |   resolved "https://registry.yarnpkg.com/@stitches/core/-/core-1.2.8.tgz#dce3b8fdc764fbc6dbea30c83b73bfb52cf96173"
 930 |   integrity sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==
 931 | 
 932 | "@svgr/babel-plugin-add-jsx-attribute@^6.5.1":
 933 |   version "6.5.1"
 934 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba"
 935 |   integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==
 936 | 
 937 | "@svgr/babel-plugin-remove-jsx-attribute@*":
 938 |   version "6.5.0"
 939 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e"
 940 |   integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==
 941 | 
 942 | "@svgr/babel-plugin-remove-jsx-empty-expression@*":
 943 |   version "6.5.0"
 944 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8"
 945 |   integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==
 946 | 
 947 | "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1":
 948 |   version "6.5.1"
 949 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60"
 950 |   integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==
 951 | 
 952 | "@svgr/babel-plugin-svg-dynamic-title@^6.5.1":
 953 |   version "6.5.1"
 954 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4"
 955 |   integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==
 956 | 
 957 | "@svgr/babel-plugin-svg-em-dimensions@^6.5.1":
 958 |   version "6.5.1"
 959 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217"
 960 |   integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==
 961 | 
 962 | "@svgr/babel-plugin-transform-react-native-svg@^6.5.1":
 963 |   version "6.5.1"
 964 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305"
 965 |   integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==
 966 | 
 967 | "@svgr/babel-plugin-transform-svg-component@^6.5.1":
 968 |   version "6.5.1"
 969 |   resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250"
 970 |   integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==
 971 | 
 972 | "@svgr/babel-preset@^6.5.1":
 973 |   version "6.5.1"
 974 |   resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828"
 975 |   integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==
 976 |   dependencies:
 977 |     "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1"
 978 |     "@svgr/babel-plugin-remove-jsx-attribute" "*"
 979 |     "@svgr/babel-plugin-remove-jsx-empty-expression" "*"
 980 |     "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1"
 981 |     "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1"
 982 |     "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1"
 983 |     "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1"
 984 |     "@svgr/babel-plugin-transform-svg-component" "^6.5.1"
 985 | 
 986 | "@svgr/core@^6.5.1":
 987 |   version "6.5.1"
 988 |   resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a"
 989 |   integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==
 990 |   dependencies:
 991 |     "@babel/core" "^7.19.6"
 992 |     "@svgr/babel-preset" "^6.5.1"
 993 |     "@svgr/plugin-jsx" "^6.5.1"
 994 |     camelcase "^6.2.0"
 995 |     cosmiconfig "^7.0.1"
 996 | 
 997 | "@svgr/hast-util-to-babel-ast@^6.5.1":
 998 |   version "6.5.1"
 999 |   resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2"
1000 |   integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==
1001 |   dependencies:
1002 |     "@babel/types" "^7.20.0"
1003 |     entities "^4.4.0"
1004 | 
1005 | "@svgr/plugin-jsx@^6.5.1":
1006 |   version "6.5.1"
1007 |   resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072"
1008 |   integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==
1009 |   dependencies:
1010 |     "@babel/core" "^7.19.6"
1011 |     "@svgr/babel-preset" "^6.5.1"
1012 |     "@svgr/hast-util-to-babel-ast" "^6.5.1"
1013 |     svg-parser "^2.0.4"
1014 | 
1015 | "@types/linkify-it@*":
1016 |   version "3.0.2"
1017 |   resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9"
1018 |   integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==
1019 | 
1020 | "@types/markdown-it@^12.2.3":
1021 |   version "12.2.3"
1022 |   resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51"
1023 |   integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==
1024 |   dependencies:
1025 |     "@types/linkify-it" "*"
1026 |     "@types/mdurl" "*"
1027 | 
1028 | "@types/mdurl@*":
1029 |   version "1.0.2"
1030 |   resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
1031 |   integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==
1032 | 
1033 | "@types/parse-json@^4.0.0":
1034 |   version "4.0.0"
1035 |   resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
1036 |   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
1037 | 
1038 | "@types/prismjs@^1.26.0":
1039 |   version "1.26.0"
1040 |   resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654"
1041 |   integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==
1042 | 
1043 | "@types/prop-types@*":
1044 |   version "15.7.4"
1045 |   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
1046 |   integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
1047 | 
1048 | "@types/react-dom@^18.0.11":
1049 |   version "18.0.11"
1050 |   resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33"
1051 |   integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==
1052 |   dependencies:
1053 |     "@types/react" "*"
1054 | 
1055 | "@types/react-transition-group@^4.4.5":
1056 |   version "4.4.5"
1057 |   resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
1058 |   integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==
1059 |   dependencies:
1060 |     "@types/react" "*"
1061 | 
1062 | "@types/react@*":
1063 |   version "17.0.43"
1064 |   resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55"
1065 |   integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==
1066 |   dependencies:
1067 |     "@types/prop-types" "*"
1068 |     "@types/scheduler" "*"
1069 |     csstype "^3.0.2"
1070 | 
1071 | "@types/react@^18.0.28":
1072 |   version "18.0.28"
1073 |   resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065"
1074 |   integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==
1075 |   dependencies:
1076 |     "@types/prop-types" "*"
1077 |     "@types/scheduler" "*"
1078 |     csstype "^3.0.2"
1079 | 
1080 | "@types/scheduler@*":
1081 |   version "0.16.2"
1082 |   resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
1083 |   integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
1084 | 
1085 | "@vitejs/plugin-react@^3.1.0":
1086 |   version "3.1.0"
1087 |   resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz#d1091f535eab8b83d6e74034d01e27d73c773240"
1088 |   integrity sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==
1089 |   dependencies:
1090 |     "@babel/core" "^7.20.12"
1091 |     "@babel/plugin-transform-react-jsx-self" "^7.18.6"
1092 |     "@babel/plugin-transform-react-jsx-source" "^7.19.6"
1093 |     magic-string "^0.27.0"
1094 |     react-refresh "^0.14.0"
1095 | 
1096 | acorn-node@^1.8.2:
1097 |   version "1.8.2"
1098 |   resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
1099 |   integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
1100 |   dependencies:
1101 |     acorn "^7.0.0"
1102 |     acorn-walk "^7.0.0"
1103 |     xtend "^4.0.2"
1104 | 
1105 | acorn-walk@^7.0.0:
1106 |   version "7.2.0"
1107 |   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
1108 |   integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
1109 | 
1110 | acorn@^7.0.0:
1111 |   version "7.4.1"
1112 |   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
1113 |   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
1114 | 
1115 | acorn@^8.8.2:
1116 |   version "8.8.2"
1117 |   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
1118 |   integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
1119 | 
1120 | anser@^1.4.1:
1121 |   version "1.4.10"
1122 |   resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b"
1123 |   integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==
1124 | 
1125 | ansi-styles@^3.2.1:
1126 |   version "3.2.1"
1127 |   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1128 |   integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
1129 |   dependencies:
1130 |     color-convert "^1.9.0"
1131 | 
1132 | ansi-styles@^4.1.0:
1133 |   version "4.3.0"
1134 |   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
1135 |   integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
1136 |   dependencies:
1137 |     color-convert "^2.0.1"
1138 | 
1139 | ansi-to-react@6.1.6:
1140 |   version "6.1.6"
1141 |   resolved "https://registry.yarnpkg.com/ansi-to-react/-/ansi-to-react-6.1.6.tgz#d6fe15ecd4351df626a08121b1646adfe6c02ccb"
1142 |   integrity sha512-+HWn72GKydtupxX9TORBedqOMsJRiKTqaLUKW8txSBZw9iBpzPKLI8KOu4WzwD4R7hSv1zEspobY6LwlWvwZ6Q==
1143 |   dependencies:
1144 |     anser "^1.4.1"
1145 |     escape-carriage "^1.3.0"
1146 | 
1147 | anymatch@~3.1.2:
1148 |   version "3.1.2"
1149 |   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
1150 |   integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
1151 |   dependencies:
1152 |     normalize-path "^3.0.0"
1153 |     picomatch "^2.0.4"
1154 | 
1155 | arg@^5.0.2:
1156 |   version "5.0.2"
1157 |   resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
1158 |   integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
1159 | 
1160 | argparse@^2.0.1:
1161 |   version "2.0.1"
1162 |   resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
1163 |   integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
1164 | 
1165 | babel-plugin-macros@^3.1.0:
1166 |   version "3.1.0"
1167 |   resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
1168 |   integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
1169 |   dependencies:
1170 |     "@babel/runtime" "^7.12.5"
1171 |     cosmiconfig "^7.0.0"
1172 |     resolve "^1.19.0"
1173 | 
1174 | base64-js@^1.3.1:
1175 |   version "1.5.1"
1176 |   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
1177 |   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
1178 | 
1179 | binary-extensions@^2.0.0:
1180 |   version "2.2.0"
1181 |   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
1182 |   integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
1183 | 
1184 | braces@^3.0.2, braces@~3.0.2:
1185 |   version "3.0.2"
1186 |   resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
1187 |   integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
1188 |   dependencies:
1189 |     fill-range "^7.0.1"
1190 | 
1191 | browserslist@^4.21.3:
1192 |   version "4.21.5"
1193 |   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7"
1194 |   integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==
1195 |   dependencies:
1196 |     caniuse-lite "^1.0.30001449"
1197 |     electron-to-chromium "^1.4.284"
1198 |     node-releases "^2.0.8"
1199 |     update-browserslist-db "^1.0.10"
1200 | 
1201 | buffer@^6.0.3:
1202 |   version "6.0.3"
1203 |   resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
1204 |   integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
1205 |   dependencies:
1206 |     base64-js "^1.3.1"
1207 |     ieee754 "^1.2.1"
1208 | 
1209 | callsites@^3.0.0:
1210 |   version "3.1.0"
1211 |   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
1212 |   integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
1213 | 
1214 | camelcase-css@^2.0.1:
1215 |   version "2.0.1"
1216 |   resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
1217 |   integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
1218 | 
1219 | camelcase@^6.2.0:
1220 |   version "6.3.0"
1221 |   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
1222 |   integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
1223 | 
1224 | caniuse-lite@^1.0.30001449:
1225 |   version "1.0.30001457"
1226 |   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz#6af34bb5d720074e2099432aa522c21555a18301"
1227 |   integrity sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==
1228 | 
1229 | chalk@4.1.2:
1230 |   version "4.1.2"
1231 |   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
1232 |   integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
1233 |   dependencies:
1234 |     ansi-styles "^4.1.0"
1235 |     supports-color "^7.1.0"
1236 | 
1237 | chalk@^2.0.0:
1238 |   version "2.4.2"
1239 |   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1240 |   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
1241 |   dependencies:
1242 |     ansi-styles "^3.2.1"
1243 |     escape-string-regexp "^1.0.5"
1244 |     supports-color "^5.3.0"
1245 | 
1246 | chokidar@^3.5.3:
1247 |   version "3.5.3"
1248 |   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
1249 |   integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
1250 |   dependencies:
1251 |     anymatch "~3.1.2"
1252 |     braces "~3.0.2"
1253 |     glob-parent "~5.1.2"
1254 |     is-binary-path "~2.1.0"
1255 |     is-glob "~4.0.1"
1256 |     normalize-path "~3.0.0"
1257 |     readdirp "~3.6.0"
1258 |   optionalDependencies:
1259 |     fsevents "~2.3.2"
1260 | 
1261 | clean-set@^1.1.2:
1262 |   version "1.1.2"
1263 |   resolved "https://registry.yarnpkg.com/clean-set/-/clean-set-1.1.2.tgz#76d8bf238c3e27827bfa73073ecdfdc767187070"
1264 |   integrity sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==
1265 | 
1266 | codesandbox-import-util-types@^2.2.3:
1267 |   version "2.2.3"
1268 |   resolved "https://registry.yarnpkg.com/codesandbox-import-util-types/-/codesandbox-import-util-types-2.2.3.tgz#b354b2f732ad130e119ebd9ead3bda3be5981a54"
1269 |   integrity sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==
1270 | 
1271 | color-convert@^1.9.0:
1272 |   version "1.9.3"
1273 |   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
1274 |   integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1275 |   dependencies:
1276 |     color-name "1.1.3"
1277 | 
1278 | color-convert@^2.0.1:
1279 |   version "2.0.1"
1280 |   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
1281 |   integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
1282 |   dependencies:
1283 |     color-name "~1.1.4"
1284 | 
1285 | color-name@1.1.3:
1286 |   version "1.1.3"
1287 |   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
1288 |   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
1289 | 
1290 | color-name@^1.1.4, color-name@~1.1.4:
1291 |   version "1.1.4"
1292 |   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
1293 |   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1294 | 
1295 | convert-source-map@^1.5.0, convert-source-map@^1.7.0:
1296 |   version "1.8.0"
1297 |   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
1298 |   integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
1299 |   dependencies:
1300 |     safe-buffer "~5.1.1"
1301 | 
1302 | copy-text-to-clipboard@^3.0.1:
1303 |   version "3.0.1"
1304 |   resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c"
1305 |   integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==
1306 | 
1307 | cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
1308 |   version "7.0.1"
1309 |   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
1310 |   integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
1311 |   dependencies:
1312 |     "@types/parse-json" "^4.0.0"
1313 |     import-fresh "^3.2.1"
1314 |     parse-json "^5.0.0"
1315 |     path-type "^4.0.0"
1316 |     yaml "^1.10.0"
1317 | 
1318 | crelt@^1.0.5:
1319 |   version "1.0.5"
1320 |   resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94"
1321 |   integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==
1322 | 
1323 | cross-spawn@^7.0.3:
1324 |   version "7.0.3"
1325 |   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
1326 |   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
1327 |   dependencies:
1328 |     path-key "^3.1.0"
1329 |     shebang-command "^2.0.0"
1330 |     which "^2.0.1"
1331 | 
1332 | cssesc@^3.0.0:
1333 |   version "3.0.0"
1334 |   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
1335 |   integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
1336 | 
1337 | csstype@^3.0.2:
1338 |   version "3.0.11"
1339 |   resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33"
1340 |   integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==
1341 | 
1342 | d@1, d@^1.0.1:
1343 |   version "1.0.1"
1344 |   resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
1345 |   integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
1346 |   dependencies:
1347 |     es5-ext "^0.10.50"
1348 |     type "^1.0.1"
1349 | 
1350 | date-fns@^2.29.3:
1351 |   version "2.29.3"
1352 |   resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
1353 |   integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
1354 | 
1355 | debug@^4.1.0, debug@^4.3.4:
1356 |   version "4.3.4"
1357 |   resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
1358 |   integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
1359 |   dependencies:
1360 |     ms "2.1.2"
1361 | 
1362 | defined@^1.0.0:
1363 |   version "1.0.0"
1364 |   resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
1365 |   integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
1366 | 
1367 | dequal@^2.0.2:
1368 |   version "2.0.3"
1369 |   resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
1370 |   integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
1371 | 
1372 | detective@^5.2.1:
1373 |   version "5.2.1"
1374 |   resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034"
1375 |   integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==
1376 |   dependencies:
1377 |     acorn-node "^1.8.2"
1378 |     defined "^1.0.0"
1379 |     minimist "^1.2.6"
1380 | 
1381 | didyoumean@^1.2.2:
1382 |   version "1.2.2"
1383 |   resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
1384 |   integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
1385 | 
1386 | dlv@^1.1.3:
1387 |   version "1.1.3"
1388 |   resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
1389 |   integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
1390 | 
1391 | dom-helpers@^5.0.1:
1392 |   version "5.2.1"
1393 |   resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
1394 |   integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
1395 |   dependencies:
1396 |     "@babel/runtime" "^7.8.7"
1397 |     csstype "^3.0.2"
1398 | 
1399 | electron-to-chromium@^1.4.284:
1400 |   version "1.4.303"
1401 |   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.303.tgz#6c598653c52b2554f768d98374803236b8f022a8"
1402 |   integrity sha512-XaqiQhVsGO5ymf/Lg6XEGpv2h8b5AFqQDQ9fQckolNP2VtD2VL1pn1TIx1SSYsf0srfXVi2Sm7n/K3slJSX3ig==
1403 | 
1404 | entities@^4.4.0:
1405 |   version "4.4.0"
1406 |   resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
1407 |   integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
1408 | 
1409 | entities@~3.0.1:
1410 |   version "3.0.1"
1411 |   resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
1412 |   integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
1413 | 
1414 | error-ex@^1.3.1:
1415 |   version "1.3.2"
1416 |   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
1417 |   integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
1418 |   dependencies:
1419 |     is-arrayish "^0.2.1"
1420 | 
1421 | es5-ext@^0.10.35, es5-ext@^0.10.50:
1422 |   version "0.10.62"
1423 |   resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
1424 |   integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
1425 |   dependencies:
1426 |     es6-iterator "^2.0.3"
1427 |     es6-symbol "^3.1.3"
1428 |     next-tick "^1.1.0"
1429 | 
1430 | es6-iterator@^2.0.3:
1431 |   version "2.0.3"
1432 |   resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
1433 |   integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
1434 |   dependencies:
1435 |     d "1"
1436 |     es5-ext "^0.10.35"
1437 |     es6-symbol "^3.1.1"
1438 | 
1439 | es6-symbol@^3, es6-symbol@^3.1.1, es6-symbol@^3.1.3:
1440 |   version "3.1.3"
1441 |   resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
1442 |   integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
1443 |   dependencies:
1444 |     d "^1.0.1"
1445 |     ext "^1.1.2"
1446 | 
1447 | esbuild@^0.16.14:
1448 |   version "0.16.17"
1449 |   resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259"
1450 |   integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==
1451 |   optionalDependencies:
1452 |     "@esbuild/android-arm" "0.16.17"
1453 |     "@esbuild/android-arm64" "0.16.17"
1454 |     "@esbuild/android-x64" "0.16.17"
1455 |     "@esbuild/darwin-arm64" "0.16.17"
1456 |     "@esbuild/darwin-x64" "0.16.17"
1457 |     "@esbuild/freebsd-arm64" "0.16.17"
1458 |     "@esbuild/freebsd-x64" "0.16.17"
1459 |     "@esbuild/linux-arm" "0.16.17"
1460 |     "@esbuild/linux-arm64" "0.16.17"
1461 |     "@esbuild/linux-ia32" "0.16.17"
1462 |     "@esbuild/linux-loong64" "0.16.17"
1463 |     "@esbuild/linux-mips64el" "0.16.17"
1464 |     "@esbuild/linux-ppc64" "0.16.17"
1465 |     "@esbuild/linux-riscv64" "0.16.17"
1466 |     "@esbuild/linux-s390x" "0.16.17"
1467 |     "@esbuild/linux-x64" "0.16.17"
1468 |     "@esbuild/netbsd-x64" "0.16.17"
1469 |     "@esbuild/openbsd-x64" "0.16.17"
1470 |     "@esbuild/sunos-x64" "0.16.17"
1471 |     "@esbuild/win32-arm64" "0.16.17"
1472 |     "@esbuild/win32-ia32" "0.16.17"
1473 |     "@esbuild/win32-x64" "0.16.17"
1474 | 
1475 | escalade@^3.1.1:
1476 |   version "3.1.1"
1477 |   resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
1478 |   integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
1479 | 
1480 | escape-carriage@^1.3.0:
1481 |   version "1.3.0"
1482 |   resolved "https://registry.yarnpkg.com/escape-carriage/-/escape-carriage-1.3.0.tgz#71006b2d4da8cb6828686addafcb094239c742f3"
1483 |   integrity sha512-ATWi5MD8QlAGQOeMgI8zTp671BG8aKvAC0M7yenlxU4CRLGO/sKthxVUyjiOFKjHdIo+6dZZUNFgHFeVEaKfGQ==
1484 | 
1485 | escape-string-regexp@^1.0.5:
1486 |   version "1.0.5"
1487 |   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1488 |   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
1489 | 
1490 | escape-string-regexp@^4.0.0:
1491 |   version "4.0.0"
1492 |   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
1493 |   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
1494 | 
1495 | execa@^5.1.1:
1496 |   version "5.1.1"
1497 |   resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
1498 |   integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
1499 |   dependencies:
1500 |     cross-spawn "^7.0.3"
1501 |     get-stream "^6.0.0"
1502 |     human-signals "^2.1.0"
1503 |     is-stream "^2.0.0"
1504 |     merge-stream "^2.0.0"
1505 |     npm-run-path "^4.0.1"
1506 |     onetime "^5.1.2"
1507 |     signal-exit "^3.0.3"
1508 |     strip-final-newline "^2.0.0"
1509 | 
1510 | ext@^1.1.2:
1511 |   version "1.7.0"
1512 |   resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
1513 |   integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
1514 |   dependencies:
1515 |     type "^2.7.2"
1516 | 
1517 | fast-glob@^3.2.12:
1518 |   version "3.2.12"
1519 |   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
1520 |   integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
1521 |   dependencies:
1522 |     "@nodelib/fs.stat" "^2.0.2"
1523 |     "@nodelib/fs.walk" "^1.2.3"
1524 |     glob-parent "^5.1.2"
1525 |     merge2 "^1.3.0"
1526 |     micromatch "^4.0.4"
1527 | 
1528 | fastq@^1.6.0:
1529 |   version "1.13.0"
1530 |   resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
1531 |   integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
1532 |   dependencies:
1533 |     reusify "^1.0.4"
1534 | 
1535 | fill-range@^7.0.1:
1536 |   version "7.0.1"
1537 |   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
1538 |   integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
1539 |   dependencies:
1540 |     to-regex-range "^5.0.1"
1541 | 
1542 | find-root@^1.1.0:
1543 |   version "1.1.0"
1544 |   resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
1545 |   integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
1546 | 
1547 | find-up@^5.0.0:
1548 |   version "5.0.0"
1549 |   resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
1550 |   integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
1551 |   dependencies:
1552 |     locate-path "^6.0.0"
1553 |     path-exists "^4.0.0"
1554 | 
1555 | fsevents@~2.3.2:
1556 |   version "2.3.2"
1557 |   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
1558 |   integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
1559 | 
1560 | function-bind@^1.1.1:
1561 |   version "1.1.1"
1562 |   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1563 |   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1564 | 
1565 | gensync@^1.0.0-beta.2:
1566 |   version "1.0.0-beta.2"
1567 |   resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
1568 |   integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
1569 | 
1570 | get-stream@^6.0.0:
1571 |   version "6.0.1"
1572 |   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
1573 |   integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
1574 | 
1575 | github-markdown-css@^5.2.0:
1576 |   version "5.2.0"
1577 |   resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-5.2.0.tgz#9f9e30f16cbc1d3b76110667b7c36ca3d96c9cdc"
1578 |   integrity sha512-hq5RaCInSUZ48bImOZpkppW2/MT44StRgsbsZ8YA4vJFwLKB/Vo3k7R2t+pUGqO+ThG0QDMi96TewV/B3vyItg==
1579 | 
1580 | glob-parent@^5.1.2, glob-parent@~5.1.2:
1581 |   version "5.1.2"
1582 |   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
1583 |   integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
1584 |   dependencies:
1585 |     is-glob "^4.0.1"
1586 | 
1587 | glob-parent@^6.0.2:
1588 |   version "6.0.2"
1589 |   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
1590 |   integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
1591 |   dependencies:
1592 |     is-glob "^4.0.3"
1593 | 
1594 | globals@^11.1.0:
1595 |   version "11.12.0"
1596 |   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
1597 |   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
1598 | 
1599 | has-flag@^3.0.0:
1600 |   version "3.0.0"
1601 |   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
1602 |   integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
1603 | 
1604 | has-flag@^4.0.0:
1605 |   version "4.0.0"
1606 |   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
1607 |   integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1608 | 
1609 | has@^1.0.3:
1610 |   version "1.0.3"
1611 |   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
1612 |   integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1613 |   dependencies:
1614 |     function-bind "^1.1.1"
1615 | 
1616 | hoist-non-react-statics@^3.3.1:
1617 |   version "3.3.2"
1618 |   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
1619 |   integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
1620 |   dependencies:
1621 |     react-is "^16.7.0"
1622 | 
1623 | html-parse-stringify@^3.0.1:
1624 |   version "3.0.1"
1625 |   resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2"
1626 |   integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==
1627 |   dependencies:
1628 |     void-elements "3.1.0"
1629 | 
1630 | human-signals@^2.1.0:
1631 |   version "2.1.0"
1632 |   resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
1633 |   integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
1634 | 
1635 | i18next@^22.4.10:
1636 |   version "22.4.10"
1637 |   resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.10.tgz#cfbfc412c6bc83e3c16564f47e6a5c145255960e"
1638 |   integrity sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA==
1639 |   dependencies:
1640 |     "@babel/runtime" "^7.20.6"
1641 | 
1642 | ieee754@^1.2.1:
1643 |   version "1.2.1"
1644 |   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
1645 |   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
1646 | 
1647 | import-fresh@^3.2.1:
1648 |   version "3.3.0"
1649 |   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
1650 |   integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
1651 |   dependencies:
1652 |     parent-module "^1.0.0"
1653 |     resolve-from "^4.0.0"
1654 | 
1655 | intersection-observer@^0.10.0:
1656 |   version "0.10.0"
1657 |   resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.10.0.tgz#4d11d63c1ff67e21e62987be24d55218da1a1a69"
1658 |   integrity sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==
1659 | 
1660 | is-arrayish@^0.2.1:
1661 |   version "0.2.1"
1662 |   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
1663 |   integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
1664 | 
1665 | is-binary-path@~2.1.0:
1666 |   version "2.1.0"
1667 |   resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
1668 |   integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
1669 |   dependencies:
1670 |     binary-extensions "^2.0.0"
1671 | 
1672 | is-core-module@^2.8.1:
1673 |   version "2.8.1"
1674 |   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
1675 |   integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
1676 |   dependencies:
1677 |     has "^1.0.3"
1678 | 
1679 | is-core-module@^2.9.0:
1680 |   version "2.9.0"
1681 |   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
1682 |   integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
1683 |   dependencies:
1684 |     has "^1.0.3"
1685 | 
1686 | is-extglob@^2.1.1:
1687 |   version "2.1.1"
1688 |   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1689 |   integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
1690 | 
1691 | is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
1692 |   version "4.0.3"
1693 |   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
1694 |   integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
1695 |   dependencies:
1696 |     is-extglob "^2.1.1"
1697 | 
1698 | is-number@^7.0.0:
1699 |   version "7.0.0"
1700 |   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
1701 |   integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1702 | 
1703 | is-stream@^2.0.0:
1704 |   version "2.0.1"
1705 |   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
1706 |   integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
1707 | 
1708 | isexe@^2.0.0:
1709 |   version "2.0.0"
1710 |   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1711 |   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
1712 | 
1713 | javascript-natural-sort@0.7.1:
1714 |   version "0.7.1"
1715 |   resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
1716 |   integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==
1717 | 
1718 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
1719 |   version "4.0.0"
1720 |   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
1721 |   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
1722 | 
1723 | jsesc@^2.5.1:
1724 |   version "2.5.2"
1725 |   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
1726 |   integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
1727 | 
1728 | json-parse-even-better-errors@^2.3.0:
1729 |   version "2.3.1"
1730 |   resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
1731 |   integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
1732 | 
1733 | json5@^2.2.2:
1734 |   version "2.2.3"
1735 |   resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
1736 |   integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
1737 | 
1738 | kolorist@^1.7.0:
1739 |   version "1.7.0"
1740 |   resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.7.0.tgz#8e22bc470ea2d2743dbd461808f8b5246b19f5f4"
1741 |   integrity sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==
1742 | 
1743 | lilconfig@^2.0.5:
1744 |   version "2.0.5"
1745 |   resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25"
1746 |   integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==
1747 | 
1748 | lilconfig@^2.0.6:
1749 |   version "2.0.6"
1750 |   resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
1751 |   integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==
1752 | 
1753 | lines-and-columns@^1.1.6:
1754 |   version "1.2.4"
1755 |   resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
1756 |   integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
1757 | 
1758 | linkify-it@^4.0.1:
1759 |   version "4.0.1"
1760 |   resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec"
1761 |   integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==
1762 |   dependencies:
1763 |     uc.micro "^1.0.1"
1764 | 
1765 | local-pkg@^0.4.3:
1766 |   version "0.4.3"
1767 |   resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963"
1768 |   integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==
1769 | 
1770 | locate-path@^6.0.0:
1771 |   version "6.0.0"
1772 |   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
1773 |   integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
1774 |   dependencies:
1775 |     p-locate "^5.0.0"
1776 | 
1777 | lodash.clone@^4.5.0:
1778 |   version "4.5.0"
1779 |   resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
1780 |   integrity sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==
1781 | 
1782 | lodash.get@^4.4.2:
1783 |   version "4.4.2"
1784 |   resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
1785 |   integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
1786 | 
1787 | lodash.isequal@^4.5.0:
1788 |   version "4.5.0"
1789 |   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
1790 |   integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
1791 | 
1792 | lodash.merge@^4.6.2:
1793 |   version "4.6.2"
1794 |   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
1795 |   integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
1796 | 
1797 | loose-envify@^1.1.0, loose-envify@^1.4.0:
1798 |   version "1.4.0"
1799 |   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
1800 |   integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
1801 |   dependencies:
1802 |     js-tokens "^3.0.0 || ^4.0.0"
1803 | 
1804 | lru-cache@^5.1.1:
1805 |   version "5.1.1"
1806 |   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
1807 |   integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
1808 |   dependencies:
1809 |     yallist "^3.0.2"
1810 | 
1811 | lz-string@^1.4.4:
1812 |   version "1.4.4"
1813 |   resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
1814 |   integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==
1815 | 
1816 | magic-string@^0.27.0:
1817 |   version "0.27.0"
1818 |   resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3"
1819 |   integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==
1820 |   dependencies:
1821 |     "@jridgewell/sourcemap-codec" "^1.4.13"
1822 | 
1823 | markdown-it@^13.0.1:
1824 |   version "13.0.1"
1825 |   resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430"
1826 |   integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==
1827 |   dependencies:
1828 |     argparse "^2.0.1"
1829 |     entities "~3.0.1"
1830 |     linkify-it "^4.0.1"
1831 |     mdurl "^1.0.1"
1832 |     uc.micro "^1.0.5"
1833 | 
1834 | mdurl@^1.0.1:
1835 |   version "1.0.1"
1836 |   resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
1837 |   integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
1838 | 
1839 | merge-stream@^2.0.0:
1840 |   version "2.0.0"
1841 |   resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
1842 |   integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
1843 | 
1844 | merge2@^1.3.0:
1845 |   version "1.4.1"
1846 |   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
1847 |   integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
1848 | 
1849 | micromatch@^4.0.4, micromatch@^4.0.5:
1850 |   version "4.0.5"
1851 |   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
1852 |   integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
1853 |   dependencies:
1854 |     braces "^3.0.2"
1855 |     picomatch "^2.3.1"
1856 | 
1857 | mimic-fn@^2.1.0:
1858 |   version "2.1.0"
1859 |   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
1860 |   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
1861 | 
1862 | minimist@^1.2.6:
1863 |   version "1.2.6"
1864 |   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
1865 |   integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
1866 | 
1867 | ms@2.1.2:
1868 |   version "2.1.2"
1869 |   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1870 |   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1871 | 
1872 | nanoid@^3.3.4:
1873 |   version "3.3.4"
1874 |   resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
1875 |   integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
1876 | 
1877 | next-tick@^1.1.0:
1878 |   version "1.1.0"
1879 |   resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
1880 |   integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
1881 | 
1882 | node-releases@^2.0.8:
1883 |   version "2.0.10"
1884 |   resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f"
1885 |   integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==
1886 | 
1887 | normalize-path@^3.0.0, normalize-path@~3.0.0:
1888 |   version "3.0.0"
1889 |   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
1890 |   integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
1891 | 
1892 | npm-run-path@^4.0.1:
1893 |   version "4.0.1"
1894 |   resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
1895 |   integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
1896 |   dependencies:
1897 |     path-key "^3.0.0"
1898 | 
1899 | object-assign@^4.1.1:
1900 |   version "4.1.1"
1901 |   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1902 |   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
1903 | 
1904 | object-hash@^3.0.0:
1905 |   version "3.0.0"
1906 |   resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
1907 |   integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
1908 | 
1909 | onetime@^5.1.2:
1910 |   version "5.1.2"
1911 |   resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
1912 |   integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
1913 |   dependencies:
1914 |     mimic-fn "^2.1.0"
1915 | 
1916 | outvariant@1.3.0, outvariant@^1.3.0:
1917 |   version "1.3.0"
1918 |   resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.3.0.tgz#c39723b1d2cba729c930b74bf962317a81b9b1c9"
1919 |   integrity sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==
1920 | 
1921 | p-limit@^3.0.2:
1922 |   version "3.1.0"
1923 |   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
1924 |   integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
1925 |   dependencies:
1926 |     yocto-queue "^0.1.0"
1927 | 
1928 | p-locate@^5.0.0:
1929 |   version "5.0.0"
1930 |   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
1931 |   integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
1932 |   dependencies:
1933 |     p-limit "^3.0.2"
1934 | 
1935 | parent-module@^1.0.0:
1936 |   version "1.0.1"
1937 |   resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
1938 |   integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
1939 |   dependencies:
1940 |     callsites "^3.0.0"
1941 | 
1942 | parse-json@^5.0.0:
1943 |   version "5.2.0"
1944 |   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
1945 |   integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
1946 |   dependencies:
1947 |     "@babel/code-frame" "^7.0.0"
1948 |     error-ex "^1.3.1"
1949 |     json-parse-even-better-errors "^2.3.0"
1950 |     lines-and-columns "^1.1.6"
1951 | 
1952 | path-exists@^4.0.0:
1953 |   version "4.0.0"
1954 |   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
1955 |   integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1956 | 
1957 | path-key@^3.0.0, path-key@^3.1.0:
1958 |   version "3.1.1"
1959 |   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
1960 |   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1961 | 
1962 | path-parse@^1.0.7:
1963 |   version "1.0.7"
1964 |   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
1965 |   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
1966 | 
1967 | path-type@^4.0.0:
1968 |   version "4.0.0"
1969 |   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
1970 |   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
1971 | 
1972 | picocolors@^1.0.0:
1973 |   version "1.0.0"
1974 |   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
1975 |   integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
1976 | 
1977 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
1978 |   version "2.3.1"
1979 |   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
1980 |   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1981 | 
1982 | pify@^2.3.0:
1983 |   version "2.3.0"
1984 |   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
1985 |   integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
1986 | 
1987 | postcss-import@^14.1.0:
1988 |   version "14.1.0"
1989 |   resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0"
1990 |   integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==
1991 |   dependencies:
1992 |     postcss-value-parser "^4.0.0"
1993 |     read-cache "^1.0.0"
1994 |     resolve "^1.1.7"
1995 | 
1996 | postcss-js@^4.0.0:
1997 |   version "4.0.0"
1998 |   resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00"
1999 |   integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==
2000 |   dependencies:
2001 |     camelcase-css "^2.0.1"
2002 | 
2003 | postcss-load-config@^3.1.4:
2004 |   version "3.1.4"
2005 |   resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855"
2006 |   integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==
2007 |   dependencies:
2008 |     lilconfig "^2.0.5"
2009 |     yaml "^1.10.2"
2010 | 
2011 | postcss-nested@6.0.0:
2012 |   version "6.0.0"
2013 |   resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735"
2014 |   integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==
2015 |   dependencies:
2016 |     postcss-selector-parser "^6.0.10"
2017 | 
2018 | postcss-selector-parser@^6.0.10:
2019 |   version "6.0.10"
2020 |   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
2021 |   integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
2022 |   dependencies:
2023 |     cssesc "^3.0.0"
2024 |     util-deprecate "^1.0.2"
2025 | 
2026 | postcss-selector-parser@^6.0.11:
2027 |   version "6.0.11"
2028 |   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc"
2029 |   integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==
2030 |   dependencies:
2031 |     cssesc "^3.0.0"
2032 |     util-deprecate "^1.0.2"
2033 | 
2034 | postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
2035 |   version "4.2.0"
2036 |   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
2037 |   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
2038 | 
2039 | postcss@^8.0.9, postcss@^8.4.21:
2040 |   version "8.4.21"
2041 |   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
2042 |   integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
2043 |   dependencies:
2044 |     nanoid "^3.3.4"
2045 |     picocolors "^1.0.0"
2046 |     source-map-js "^1.0.2"
2047 | 
2048 | prettier@^2.8.4:
2049 |   version "2.8.4"
2050 |   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3"
2051 |   integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==
2052 | 
2053 | prism-themes@^1.9.0:
2054 |   version "1.9.0"
2055 |   resolved "https://registry.yarnpkg.com/prism-themes/-/prism-themes-1.9.0.tgz#19c034f3205f1e28d75d89728e54ccd745f7e3dd"
2056 |   integrity sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==
2057 | 
2058 | prismjs@^1.29.0:
2059 |   version "1.29.0"
2060 |   resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
2061 |   integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
2062 | 
2063 | prop-types@^15.6.2:
2064 |   version "15.8.1"
2065 |   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
2066 |   integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
2067 |   dependencies:
2068 |     loose-envify "^1.4.0"
2069 |     object-assign "^4.1.1"
2070 |     react-is "^16.13.1"
2071 | 
2072 | queue-microtask@^1.2.2:
2073 |   version "1.2.3"
2074 |   resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
2075 |   integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
2076 | 
2077 | quick-lru@^5.1.1:
2078 |   version "5.1.1"
2079 |   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
2080 |   integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
2081 | 
2082 | react-devtools-inline@4.4.0:
2083 |   version "4.4.0"
2084 |   resolved "https://registry.yarnpkg.com/react-devtools-inline/-/react-devtools-inline-4.4.0.tgz#e032a6eb17a9977b682306f84b46e683adf4bf68"
2085 |   integrity sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==
2086 |   dependencies:
2087 |     es6-symbol "^3"
2088 | 
2089 | react-dom@^18.2.0:
2090 |   version "18.2.0"
2091 |   resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
2092 |   integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
2093 |   dependencies:
2094 |     loose-envify "^1.1.0"
2095 |     scheduler "^0.23.0"
2096 | 
2097 | react-i18next@^12.2.0:
2098 |   version "12.2.0"
2099 |   resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.2.0.tgz#010e3f6070b8d700442947233352ebe4b252d7a1"
2100 |   integrity sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ==
2101 |   dependencies:
2102 |     "@babel/runtime" "^7.20.6"
2103 |     html-parse-stringify "^3.0.1"
2104 | 
2105 | react-is@^16.13.1, react-is@^16.7.0:
2106 |   version "16.13.1"
2107 |   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
2108 |   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
2109 | 
2110 | react-is@^17.0.2:
2111 |   version "17.0.2"
2112 |   resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
2113 |   integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
2114 | 
2115 | react-refresh@^0.14.0:
2116 |   version "0.14.0"
2117 |   resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
2118 |   integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
2119 | 
2120 | react-router-dom@^6.8.2:
2121 |   version "6.8.2"
2122 |   resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.2.tgz#a6654a3400be9aafd504d7125573568921b78b57"
2123 |   integrity sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==
2124 |   dependencies:
2125 |     "@remix-run/router" "1.3.3"
2126 |     react-router "6.8.2"
2127 | 
2128 | react-router@6.8.2:
2129 |   version "6.8.2"
2130 |   resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.2.tgz#98f83582a73f316a3287118b440f0cee30ed6f33"
2131 |   integrity sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==
2132 |   dependencies:
2133 |     "@remix-run/router" "1.3.3"
2134 | 
2135 | react-transition-group@^4.4.5:
2136 |   version "4.4.5"
2137 |   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
2138 |   integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
2139 |   dependencies:
2140 |     "@babel/runtime" "^7.5.5"
2141 |     dom-helpers "^5.0.1"
2142 |     loose-envify "^1.4.0"
2143 |     prop-types "^15.6.2"
2144 | 
2145 | react@^18.2.0:
2146 |   version "18.2.0"
2147 |   resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
2148 |   integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
2149 |   dependencies:
2150 |     loose-envify "^1.1.0"
2151 | 
2152 | read-cache@^1.0.0:
2153 |   version "1.0.0"
2154 |   resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
2155 |   integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
2156 |   dependencies:
2157 |     pify "^2.3.0"
2158 | 
2159 | readdirp@~3.6.0:
2160 |   version "3.6.0"
2161 |   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
2162 |   integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
2163 |   dependencies:
2164 |     picomatch "^2.2.1"
2165 | 
2166 | regenerator-runtime@^0.13.11:
2167 |   version "0.13.11"
2168 |   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
2169 |   integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
2170 | 
2171 | regenerator-runtime@^0.13.4:
2172 |   version "0.13.9"
2173 |   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
2174 |   integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
2175 | 
2176 | resolve-from@^4.0.0:
2177 |   version "4.0.0"
2178 |   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
2179 |   integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
2180 | 
2181 | resolve@^1.1.7, resolve@^1.22.1:
2182 |   version "1.22.1"
2183 |   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
2184 |   integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
2185 |   dependencies:
2186 |     is-core-module "^2.9.0"
2187 |     path-parse "^1.0.7"
2188 |     supports-preserve-symlinks-flag "^1.0.0"
2189 | 
2190 | resolve@^1.19.0:
2191 |   version "1.22.0"
2192 |   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
2193 |   integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
2194 |   dependencies:
2195 |     is-core-module "^2.8.1"
2196 |     path-parse "^1.0.7"
2197 |     supports-preserve-symlinks-flag "^1.0.0"
2198 | 
2199 | reusify@^1.0.4:
2200 |   version "1.0.4"
2201 |   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
2202 |   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
2203 | 
2204 | rollup@^3.10.0:
2205 |   version "3.17.2"
2206 |   resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.17.2.tgz#a4ecd29c488672a0606e41ef57474fad715750a9"
2207 |   integrity sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==
2208 |   optionalDependencies:
2209 |     fsevents "~2.3.2"
2210 | 
2211 | run-parallel@^1.1.9:
2212 |   version "1.2.0"
2213 |   resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
2214 |   integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
2215 |   dependencies:
2216 |     queue-microtask "^1.2.2"
2217 | 
2218 | safe-buffer@~5.1.1:
2219 |   version "5.1.2"
2220 |   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
2221 |   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
2222 | 
2223 | scheduler@^0.23.0:
2224 |   version "0.23.0"
2225 |   resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
2226 |   integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
2227 |   dependencies:
2228 |     loose-envify "^1.1.0"
2229 | 
2230 | semver@^6.3.0:
2231 |   version "6.3.0"
2232 |   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
2233 |   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
2234 | 
2235 | shebang-command@^2.0.0:
2236 |   version "2.0.0"
2237 |   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
2238 |   integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
2239 |   dependencies:
2240 |     shebang-regex "^3.0.0"
2241 | 
2242 | shebang-regex@^3.0.0:
2243 |   version "3.0.0"
2244 |   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
2245 |   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
2246 | 
2247 | signal-exit@^3.0.3:
2248 |   version "3.0.7"
2249 |   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
2250 |   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
2251 | 
2252 | source-map-js@^1.0.2:
2253 |   version "1.0.2"
2254 |   resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
2255 |   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
2256 | 
2257 | source-map@^0.5.7:
2258 |   version "0.5.7"
2259 |   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
2260 |   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
2261 | 
2262 | strict-event-emitter@^0.4.3:
2263 |   version "0.4.6"
2264 |   resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3"
2265 |   integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==
2266 | 
2267 | strip-final-newline@^2.0.0:
2268 |   version "2.0.0"
2269 |   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
2270 |   integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
2271 | 
2272 | style-mod@^4.0.0:
2273 |   version "4.0.0"
2274 |   resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01"
2275 |   integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==
2276 | 
2277 | stylis@4.1.3:
2278 |   version "4.1.3"
2279 |   resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7"
2280 |   integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==
2281 | 
2282 | supports-color@^5.3.0:
2283 |   version "5.5.0"
2284 |   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
2285 |   integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
2286 |   dependencies:
2287 |     has-flag "^3.0.0"
2288 | 
2289 | supports-color@^7.1.0:
2290 |   version "7.2.0"
2291 |   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
2292 |   integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
2293 |   dependencies:
2294 |     has-flag "^4.0.0"
2295 | 
2296 | supports-preserve-symlinks-flag@^1.0.0:
2297 |   version "1.0.0"
2298 |   resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
2299 |   integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
2300 | 
2301 | svg-parser@^2.0.4:
2302 |   version "2.0.4"
2303 |   resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
2304 |   integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
2305 | 
2306 | tailwindcss@^3.2.7:
2307 |   version "3.2.7"
2308 |   resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07"
2309 |   integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==
2310 |   dependencies:
2311 |     arg "^5.0.2"
2312 |     chokidar "^3.5.3"
2313 |     color-name "^1.1.4"
2314 |     detective "^5.2.1"
2315 |     didyoumean "^1.2.2"
2316 |     dlv "^1.1.3"
2317 |     fast-glob "^3.2.12"
2318 |     glob-parent "^6.0.2"
2319 |     is-glob "^4.0.3"
2320 |     lilconfig "^2.0.6"
2321 |     micromatch "^4.0.5"
2322 |     normalize-path "^3.0.0"
2323 |     object-hash "^3.0.0"
2324 |     picocolors "^1.0.0"
2325 |     postcss "^8.0.9"
2326 |     postcss-import "^14.1.0"
2327 |     postcss-js "^4.0.0"
2328 |     postcss-load-config "^3.1.4"
2329 |     postcss-nested "6.0.0"
2330 |     postcss-selector-parser "^6.0.11"
2331 |     postcss-value-parser "^4.2.0"
2332 |     quick-lru "^5.1.1"
2333 |     resolve "^1.22.1"
2334 | 
2335 | to-fast-properties@^2.0.0:
2336 |   version "2.0.0"
2337 |   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
2338 |   integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
2339 | 
2340 | to-regex-range@^5.0.1:
2341 |   version "5.0.1"
2342 |   resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
2343 |   integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
2344 |   dependencies:
2345 |     is-number "^7.0.0"
2346 | 
2347 | twin.macro@^3.1.0:
2348 |   version "3.1.0"
2349 |   resolved "https://registry.yarnpkg.com/twin.macro/-/twin.macro-3.1.0.tgz#2056a83f7e4043c03587e664477e92feefc8df0e"
2350 |   integrity sha512-7DSR/xdvSaAqhTM4JptBgI+1IzXQR5v+2hp0CDMmHMjlm44IBEewU8MeqPlXmFgQI06zpLyJMaKRbJu96drAJw==
2351 |   dependencies:
2352 |     "@babel/template" "^7.18.10"
2353 |     babel-plugin-macros "^3.1.0"
2354 |     chalk "4.1.2"
2355 |     lodash.get "^4.4.2"
2356 |     lodash.merge "^4.6.2"
2357 |     postcss-selector-parser "^6.0.10"
2358 | 
2359 | type@^1.0.1:
2360 |   version "1.2.0"
2361 |   resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
2362 |   integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
2363 | 
2364 | type@^2.7.2:
2365 |   version "2.7.2"
2366 |   resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
2367 |   integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
2368 | 
2369 | typescript@^4.9.5:
2370 |   version "4.9.5"
2371 |   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
2372 |   integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
2373 | 
2374 | uc.micro@^1.0.1, uc.micro@^1.0.5:
2375 |   version "1.0.6"
2376 |   resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
2377 |   integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
2378 | 
2379 | unplugin-icons@^0.15.3:
2380 |   version "0.15.3"
2381 |   resolved "https://registry.yarnpkg.com/unplugin-icons/-/unplugin-icons-0.15.3.tgz#0d7d0cbcd6c420c2638d6a95f9929e75e66f86e6"
2382 |   integrity sha512-YWgJqv5AahrokeOnta8uX/m1damZA6Rf6zPClgHg2Fa/45iyOe3Lj+Wn/Ba+CSsq9yBffn17YfKfJNyWCNZPvw==
2383 |   dependencies:
2384 |     "@antfu/install-pkg" "^0.1.1"
2385 |     "@antfu/utils" "^0.7.2"
2386 |     "@iconify/utils" "^2.1.2"
2387 |     debug "^4.3.4"
2388 |     kolorist "^1.7.0"
2389 |     local-pkg "^0.4.3"
2390 |     unplugin "^1.0.1"
2391 | 
2392 | unplugin@^1.0.1:
2393 |   version "1.1.0"
2394 |   resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.1.0.tgz#96a14aa52d7637a56a88dec6baf4a73902f2db87"
2395 |   integrity sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==
2396 |   dependencies:
2397 |     acorn "^8.8.2"
2398 |     chokidar "^3.5.3"
2399 |     webpack-sources "^3.2.3"
2400 |     webpack-virtual-modules "^0.5.0"
2401 | 
2402 | update-browserslist-db@^1.0.10:
2403 |   version "1.0.10"
2404 |   resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
2405 |   integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==
2406 |   dependencies:
2407 |     escalade "^3.1.1"
2408 |     picocolors "^1.0.0"
2409 | 
2410 | util-deprecate@^1.0.2:
2411 |   version "1.0.2"
2412 |   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
2413 |   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
2414 | 
2415 | vite@^4.1.4:
2416 |   version "4.1.4"
2417 |   resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0"
2418 |   integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==
2419 |   dependencies:
2420 |     esbuild "^0.16.14"
2421 |     postcss "^8.4.21"
2422 |     resolve "^1.22.1"
2423 |     rollup "^3.10.0"
2424 |   optionalDependencies:
2425 |     fsevents "~2.3.2"
2426 | 
2427 | void-elements@3.1.0:
2428 |   version "3.1.0"
2429 |   resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
2430 |   integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=
2431 | 
2432 | w3c-keyname@^2.2.4:
2433 |   version "2.2.6"
2434 |   resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f"
2435 |   integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==
2436 | 
2437 | webpack-sources@^3.2.3:
2438 |   version "3.2.3"
2439 |   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
2440 |   integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
2441 | 
2442 | webpack-virtual-modules@^0.5.0:
2443 |   version "0.5.0"
2444 |   resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c"
2445 |   integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==
2446 | 
2447 | which@^2.0.1:
2448 |   version "2.0.2"
2449 |   resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
2450 |   integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
2451 |   dependencies:
2452 |     isexe "^2.0.0"
2453 | 
2454 | xtend@^4.0.2:
2455 |   version "4.0.2"
2456 |   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
2457 |   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
2458 | 
2459 | yallist@^3.0.2:
2460 |   version "3.1.1"
2461 |   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
2462 |   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
2463 | 
2464 | yaml@^1.10.0, yaml@^1.10.2:
2465 |   version "1.10.2"
2466 |   resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
2467 |   integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
2468 | 
2469 | yocto-queue@^0.1.0:
2470 |   version "0.1.0"
2471 |   resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
2472 |   integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
2473 | 


--------------------------------------------------------------------------------