├── .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": ["^@/(.*)$", "^[../]", "^[./]"], 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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 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 ", 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 | 18 | 19 | }> 20 | } /> 21 | }> 22 | } /> 23 | } /> 24 | 25 | }> 26 | } /> 27 | } /> 28 | 29 | } /> 30 | 31 | 32 | 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 | 34 | 35 | {createdAt} 36 | 37 | {article.title} 38 | 39 | 40 | 41 | 42 | 43 | {article.comments} 44 | 45 | 46 | {article.labels.map((label) => ( 47 | 48 | ))} 49 | 50 | 51 | 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 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | {Array.from({ length: labelCount }).map((_, i) => ( 34 | 35 | ))} 36 | 37 | 38 | 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 | 36 | 37 | Avatar 38 | 39 |
40 | {comment.user.login} 41 | {comment.authorAssociation === 'OWNER' && {t('comment.owner')}} 42 | 43 | {createdAt} 44 | 45 |
46 | 47 |
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 | 11 | 12 | 13 |
14 | 15 | 16 |
17 |
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 | 23 | 24 | {label.name} 25 | 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 => { 20 | const re = /(?\w+)="(?[^"]*)"/g; 21 | const args: Record = {}; 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(null); 75 | const playgrounds = useRef([]); 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('[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 | , 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 | 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) => { 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 | 69 | 70 | 71 | 72 | {pages.map((i) => ( 73 | 74 | {i} 75 | 76 | ))} 77 | 78 | 79 | 80 | 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` 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(); 45 | 46 | const onDragStart = useCallback((e: React.MouseEvent) => { 47 | dragHandlerRef.current = e.target as HTMLDivElement; 48 | 49 | const container = dragHandlerRef.current.parentElement; 50 | container?.querySelectorAll('.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('.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 | 100 | 101 | 110 | 116 | 126 | 135 | 141 | 148 | 149 | 150 | 151 | 152 | 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 = { 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 | 74 | 75 | 76 | 77 | {project.fullName} 78 | {project.description} 79 | 80 | 81 | 82 | {project.stargazersCount} 83 | 84 | 85 | 86 | {project.forksCount} 87 | 88 | 89 | 90 | {project.openIssuesCount} 91 | 92 | 93 | 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 | 25 | 26 | 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} 140 | 141 | {createdAt} 142 | 143 | {article.labels.map((label) => ( 144 | 145 | ))} 146 | 147 | 148 | 149 | {article.comments} 150 | 151 | 152 | 153 | 154 | )} 155 | 156 | 157 |
158 | {t('comment.title')} 159 | {t('comment.btn')} 160 | 161 | {commentsLoading && ( 162 |
163 | {Array.from({ length: 5 }).map((_, i) => ( 164 | 165 | ))} 166 |
167 | )} 168 | 169 | {!!comments.length && ( 170 |
171 | {comments.map((comment) => ( 172 | 173 | ))} 174 |
175 | )} 176 | 177 | 178 | 184 | 185 |
186 |
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(); 48 | const [articles, setArticles] = useState([]); 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 | 98 | 99 | {title} 100 | 101 | 102 | 103 | {loadingArticles 104 | ? Array.from({ length: 8 }).map((_, i) => ) 105 | : articles.map((article) => ( 106 | 112 | ))} 113 | 114 | 115 | 116 | 122 | 123 | 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 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 | {t('intro.title')} 41 | {t('intro.description')} 42 | 43 | 44 | {t('intro.link')} 45 | 46 | 47 | 48 |
49 |
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 | 89 | 90 |
91 | 92 | 93 | :// 94 | {title} 95 | 96 | 97 | 126 | 127 |
128 | 129 | 130 | 131 | 139 |
140 |
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([]); 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 | 47 | {t('projects.title')} 48 | 49 | {loadingProjects && ( 50 | 51 | {Array.from({ length: 10 }).map((_, i) => ( 52 | 53 | ))} 54 | 55 | )} 56 | 57 | {!!projects.length && ( 58 | 59 | {projects.map((project) => ( 60 | 61 | ))} 62 | 63 | )} 64 | 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 extends DOMAttributes { 16 | css?: CSSInterpolation; 17 | tw?: string; 18 | } 19 | // The inline svg css prop 20 | interface SVGProps extends SVGProps { 21 | css?: CSSInterpolation; 22 | tw?: string; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /types/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 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 | --------------------------------------------------------------------------------