feat: 主题切换、路由

This commit is contained in:
Asam
2023-06-28 18:43:49 +08:00
parent f319e321f9
commit e00e9d0a87
22 changed files with 263 additions and 33 deletions

View File

@@ -20,5 +20,6 @@ module.exports = {
rules: { rules: {
indent: ['error', 2], indent: ['error', 2],
semi: ['error', 'always'], semi: ['error', 'always'],
'vue/attribute-hyphenation': 'off',
}, },
}; };

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title> <title>Rtc</title>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

View File

@@ -9,7 +9,10 @@
}, },
"dependencies": { "dependencies": {
"@vitejs/plugin-vue-jsx": "^3.0.1", "@vitejs/plugin-vue-jsx": "^3.0.1",
"vue": "^3.3.4" "@vueuse/core": "^10.2.0",
"theme-change": "^2.5.0",
"vue": "^3.3.4",
"vue-router": "4"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.3.1", "@types/node": "^20.3.1",

View File

@@ -2,6 +2,7 @@
import Layout from '@/layout/index.vue'; import Layout from '@/layout/index.vue';
</script> </script>
<!-- 这里后面可以加 provider区分登录和未登录页面 -->
<template> <template>
<Layout /> <Layout />
</template> </template>

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1687940032741" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="887" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M1023.560892 524.587752c0 114.331752-32.549236 217.148443-97.647709 308.450075-65.047295 91.301632-149.132822 154.455339-252.205404 189.512299-11.975662 2.303012-20.778286 0.716493-26.305515-4.759558a27.584966 27.584966 0 0 1-8.342021-20.471218V853.150798c0-44.166653-11.566238-76.511177-34.647536-96.982394a446.272549 446.272549 0 0 0 68.32269-12.282731c20.16415-5.476051 41.044792-14.329852 62.590748-26.612583a187.311643 187.311643 0 0 0 53.992837-45.446104c14.432209-18.014672 26.203159-41.914819 35.312851-71.751618 9.109692-29.8368 13.664538-64.074912 13.664538-102.765514 0-55.118754-17.554069-102.049021-52.61103-140.739623 16.376974-41.454216 14.636921-87.872703-5.373695-139.357815-12.436265-4.094244-30.399759-1.535341-53.941659 7.523172a355.17563 355.17563 0 0 0-61.311297 30.041513l-25.333132 16.376974a462.137743 462.137743 0 0 0-127.945112-17.707604 462.137743 462.137743 0 0 0-127.945111 17.758782 589.571074 589.571074 0 0 0-28.301459-18.424096c-11.77095-7.31846-30.34858-16.069906-55.681713-26.305515-25.281954-10.235609-44.422543-13.306292-57.31941-9.212048-19.498835 51.433935-21.085354 97.852421-4.606024 139.306637-35.108139 38.690602-52.713386 85.620869-52.713386 140.739623 0 38.690602 4.606024 72.826357 13.715716 102.458445 9.109692 29.58091 20.778286 53.481057 34.954605 71.700441a180.658498 180.658498 0 0 0 53.634591 45.753172c21.545957 12.282731 42.477777 21.18771 62.641926 26.612583 20.215328 5.527229 42.989557 9.621472 68.32269 12.333909-17.758781 16.376974-28.659705 39.867697-32.651593 70.369811a129.941055 129.941055 0 0 1-29.990334 10.235609 184.087426 184.087426 0 0 1-37.974109 3.428929c-14.688099 0-29.171485-4.913092-43.654872-14.688099-14.432209-9.826185-26.766117-24.053681-37.001726-42.682489a109.162769 109.162769 0 0 0-32.293346-35.517563c-13.101579-9.109692-24.104859-14.585743-33.009839-16.376974l-13.306292-2.047122c-9.314404 0-15.762838 1.023561-19.345301 3.070683-3.582463 2.047122-4.606024 4.606024-3.326572 7.83024a37.769397 37.769397 0 0 0 5.987831 9.570295 49.182101 49.182101 0 0 0 8.700267 8.188487l4.606024 3.377751c9.826185 4.606024 19.447657 13.255114 29.017952 25.998447 9.570294 12.743333 16.581686 24.360749 20.982998 34.80107l6.653146 15.71166c5.783119 17.298179 15.558126 31.320963 29.376197 42.017174 13.766894 10.747389 28.659705 17.554069 44.627255 20.471218 15.96755 2.968327 31.423319 4.606024 46.316131 4.810736 14.841633 0.204712 27.22672-0.562958 37.001726-2.405368l15.302235-2.712436c0 17.298179 0.102356 37.564685 0.358247 60.799517l0.307068 36.848192c0 8.188487-2.86597 15.046345-8.700268 20.471218-5.731941 5.527229-14.636921 7.113748-26.612583 4.810736-103.072582-35.056961-187.158109-98.261846-252.205404-189.512299C32.549236 741.736195 0 638.919504 0 524.587752c0-95.191163 22.876586-182.910331 68.629758-263.31104a516.028224 516.028224 0 0 1 186.288082-190.894106A491.309228 491.309228 0 0 1 511.780446 0.012795a491.309228 491.309228 0 0 1 256.913784 70.369811 516.028224 516.028224 0 0 1 186.236905 190.894106C1000.684306 341.626242 1023.560892 429.447767 1023.560892 524.587752z" p-id="888"></path></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1687940179852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1102" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M505.718589 1024a459.192825 459.192825 0 0 1-415.006346-264.772316L60.474829 694.420848l63.680514 32.576698a403.223285 403.223285 0 0 0 185.929774 44.879601A409.114815 409.114815 0 0 0 718.940012 363.195533 404.522887 404.522887 0 0 0 680.645063 190.608342l-30.150774-64.546915 63.593874 32.663338a457.719942 457.719942 0 0 1-207.936374 865.275235z m-335.643963-225.264405a408.594974 408.594974 0 1 0 580.489043-559.782046 453.041374 453.041374 0 0 1 17.328031 123.895423 458.326424 458.326424 0 0 1-457.806583 458.153143 452.781454 452.781454 0 0 1-140.010491-21.919959z" p-id="1103"></path><path d="M315.976648 726.737626l-18.887554-248.050766-164.183095-29.977494 164.616296-30.064134 30.757255-259.920467 30.757255 260.353668 165.396057 30.064134-164.616295 29.977494-19.407395 247.617565z m-46.265843-278.02826L320.395296 457.893223l8.057534 106.04755 8.057535-106.04755 50.684491-9.183857-50.251291-8.664015-8.664015-71.738049-8.664016 71.738049zM550.338269 383.036128l-11.0033-144.86234-121.296218-22.09324 121.296218-22.17988L562.987732 0l22.873001 193.900668 121.816059 22.17988-121.816059 22.09324-11.08994 144.86234z m4.591928-166.95558l7.451054 1.299603v2.859125-2.859125l7.364413-1.299603-6.757932-1.299602-0.606481-5.198409-0.606482 5.198409z" p-id="1104"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -1,2 +1,3 @@
export { default as SvgIcon } from './svg-icon.vue'; export { default as SvgIcon } from './svg-icon.vue';
export { default as MenuSide } from './menu-side.vue'; export { default as MenuSide } from './menu-side.vue';
export { default as NavIcons } from './nav-icons.vue';

View File

@@ -0,0 +1,40 @@
<script lang="ts" setup>
import { useSwitchTheme, ThemeEnum } from '@/hooks';
import { computed } from 'vue';
defineOptions({
name: 'NavIcons',
});
const { themeInfo, setTheme } = useSwitchTheme();
const themeIcon = computed(() =>
themeInfo.value === ThemeEnum.DARK ? 'moon' : 'sun'
);
const switchTheme = () =>
setTheme(themeIcon.value === 'moon' ? ThemeEnum.LIGHT : ThemeEnum.DARK);
</script>
<template>
<div>
<a
href="https://github.com/tl-open-source/tl-rtc-file"
class="cursor-pointer"
>
<svg-icon
name="github"
class="h-6 w-6 stroke-current"
hoverColor="#ffffffde"
/>
</a>
<button
class="btn-circle btn ml-6 border-0 bg-transparent"
@click="switchTheme"
>
<svg-icon :name="themeIcon" class="h-6 w-6 stroke-current" />
</button>
</div>
</template>
<style scoped></style>

View File

@@ -1,10 +1,11 @@
<template> <template>
<svg aria-hidden="true"> <svg aria-hidden="true" class="svg-icon">
<use :href="symbolId" :fill="color" /> <use :href="symbolId" :fill="color" />
</svg> </svg>
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType } from 'vue';
import { defineComponent, computed } from 'vue'; import { defineComponent, computed } from 'vue';
export default defineComponent({ export default defineComponent({
@@ -14,18 +15,34 @@ export default defineComponent({
type: String, type: String,
default: 'icon', default: 'icon',
}, },
hoverColor: {
type: String,
default: '',
},
name: { name: {
type: String, type: String,
required: true, required: true,
}, },
color: { color: {
type: String, type: String as PropType<string>,
default: '#333', default: '#A6ADBA',
}, },
}, },
setup(props) { setup(props) {
const symbolId = computed(() => `#${props.prefix}-${props.name}`); const symbolId = computed(() => `#${props.prefix}-${props.name}`);
return { symbolId };
const realHoverColor = computed(() => props.hoverColor || props.color);
return { symbolId, realHoverColor };
}, },
}); });
</script> </script>
<style scoped>
.svg-icon {
&:hover {
use {
fill: v-bind(realHoverColor);
}
}
}
</style>

View File

@@ -1,13 +1,7 @@
import { SetupContext } from 'vue'; import { SetupContext } from 'vue';
import { MenuSide, SvgIcon } from './base'; import { MenuSide, SvgIcon, NavIcons } from './base';
<SvgIcon export const NavHeader = () => {
name="nav-menu"
color="#A6ADBA"
class="stroke-curren inline-block h-5 w-5"
/>;
export function NavHeader() {
return ( return (
<div class="drawer"> <div class="drawer">
<input id="my-drawer-3" type="checkbox" class="drawer-toggle" /> <input id="my-drawer-3" type="checkbox" class="drawer-toggle" />
@@ -24,6 +18,7 @@ export function NavHeader() {
</label> </label>
</div> </div>
<div class="mx-2 flex-1 px-2">Web-Rtc</div> <div class="mx-2 flex-1 px-2">Web-Rtc</div>
<NavIcons class="flex-none pr-3" />
</div> </div>
</div> </div>
<div class="drawer-side"> <div class="drawer-side">
@@ -32,20 +27,27 @@ export function NavHeader() {
</div> </div>
</div> </div>
); );
} };
export function FullScreenBox( export type FullHeightFlexBoxProps = Partial<{
props: { dire: 'col' | 'row' }, dire: 'col' | 'row';
type: 'full' | 'screen';
}>;
export const FullHeightFlexBox = (
props: FullHeightFlexBoxProps,
ctx: SetupContext ctx: SetupContext
) { ) => {
const { dire } = props; const { dire = 'row', type = 'screen' } = props;
const height: Record<'full' | 'screen', string> = {
full: 'h-full',
screen: 'h-screen',
};
return ( return (
<div class={['flex', 'h-screen', `flex-${dire}`]}> <div class={['flex', height[type], `flex-${dire}`]}>
{ctx.slots.default?.()} {ctx.slots.default?.()}
</div> </div>
); );
} };
export function NavContent(_: unknown, ctx: SetupContext) {
return <div class="flex h-full">{ctx.slots.default?.()}</div>;
}

View File

@@ -0,0 +1 @@
export * from './useTheme';

View File

@@ -0,0 +1,42 @@
import { themeChange } from 'theme-change';
import { useLocalStorage, usePreferredDark } from '@vueuse/core';
import { onMounted, watch } from 'vue';
export enum ThemeEnum {
DARK = 'dark',
LIGHT = 'light',
}
export const useTheme = () => {
const isPreferredDark = usePreferredDark();
const themeInfo = useLocalStorage<ThemeEnum>(
'rtc-theme',
isPreferredDark ? ThemeEnum.DARK : ThemeEnum.LIGHT
);
const setTheme = (theme: ThemeEnum) => {
themeInfo.value = theme;
};
return {
themeInfo,
setTheme,
};
};
export const useSwitchTheme = () => {
const { themeInfo, setTheme } = useTheme();
watch(
() => themeInfo.value,
(v) => {
document.documentElement.setAttribute('data-theme', v);
},
{
immediate: true,
}
);
return { themeInfo, setTheme };
};

View File

@@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { MenuSide } from '@/components/base'; import { MenuSide } from '@/components/base';
import { NavHeader, FullScreenBox, NavContent } from '@/components/lib'; import { NavHeader, FullHeightFlexBox } from '@/components/lib';
defineOptions({ defineOptions({
name: 'LayoutIndex', name: 'LayoutIndex',
@@ -8,11 +8,11 @@ defineOptions({
</script> </script>
<template> <template>
<FullScreenBox dire="col"> <FullHeightFlexBox dire="col">
<NavHeader /> <NavHeader />
<NavContent> <FullHeightFlexBox type="full">
<MenuSide class="hidden lg:block" /> <MenuSide class="hidden lg:block" />
<div class="flex-1">content</div> <RouterView />
</NavContent> </FullHeightFlexBox>
</FullScreenBox> </FullHeightFlexBox>
</template> </template>

View File

@@ -1,12 +1,15 @@
import { createApp } from 'vue'; import { createApp } from 'vue';
import './assets/styles/index.css'; import './assets/styles/index.css';
import App from './App.vue';
import router from './routes';
import 'virtual:svg-icons-register'; import 'virtual:svg-icons-register';
import SvgIcon from '@/components/base/svg-icon.vue'; import SvgIcon from '@/components/base/svg-icon.vue';
import App from './App.vue';
function setup() { function setup() {
return createApp(App).component('svg-icon', SvgIcon); return createApp(App).use(router).component('svg-icon', SvgIcon);
} }
setup().mount('#app'); setup().mount('#app');

View File

@@ -0,0 +1,8 @@
import { createWebHistory, createRouter } from 'vue-router';
import { routes } from './router';
export default createRouter({
history: createWebHistory(),
routes,
});

View File

@@ -0,0 +1,4 @@
export const routes = [
{ path: '/', component: () => import('@/views/welcome.vue') },
{ path: '/chat', component: () => import('@/views/chat/chat.vue') },
];

View File

@@ -0,0 +1,11 @@
<script lang="ts" setup>
defineOptions({
name: 'ChatView',
});
</script>
<template>
<div>我是chat</div>
</template>
<style scoped></style>

View File

@@ -0,0 +1,11 @@
<script lang="ts" setup>
defineOptions({
name: 'SendFileView',
});
</script>
<template>
<div>发送文件</div>
</template>
<style scoped></style>

View File

@@ -0,0 +1,11 @@
<script lang="ts" setup>
defineOptions({
name: 'WelcomeView',
});
</script>
<template>
<div>Welcome</div>
</template>
<stylescoped></stylescoped>

View File

@@ -1,6 +1,10 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
export default { export default {
darkMode: 'class',
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
daisyui: {
themes: ['light', 'dark'],
},
theme: { theme: {
extend: {}, extend: {},
}, },

67
client/pnpm-lock.yaml generated
View File

@@ -12,6 +12,7 @@ importers:
'@typescript-eslint/parser': ^5.60.0 '@typescript-eslint/parser': ^5.60.0
'@vitejs/plugin-vue': ^4.2.3 '@vitejs/plugin-vue': ^4.2.3
'@vitejs/plugin-vue-jsx': ^3.0.1 '@vitejs/plugin-vue-jsx': ^3.0.1
'@vueuse/core': ^10.2.0
autoprefixer: ^10.4.14 autoprefixer: ^10.4.14
daisyui: ^3.1.6 daisyui: ^3.1.6
eslint: ^8.43.0 eslint: ^8.43.0
@@ -23,16 +24,21 @@ importers:
prettier: ^2.8.8 prettier: ^2.8.8
prettier-plugin-tailwindcss: ^0.3.0 prettier-plugin-tailwindcss: ^0.3.0
tailwindcss: ^3.3.2 tailwindcss: ^3.3.2
theme-change: ^2.5.0
typescript: ^5.1.3 typescript: ^5.1.3
vite: ^4.3.9 vite: ^4.3.9
vite-plugin-eslint: ^1.8.1 vite-plugin-eslint: ^1.8.1
vite-plugin-svg-icons: ^2.0.1 vite-plugin-svg-icons: ^2.0.1
vue: ^3.3.4 vue: ^3.3.4
vue-eslint-parser: ^9.3.1 vue-eslint-parser: ^9.3.1
vue-router: '4'
vue-tsc: ^1.8.1 vue-tsc: ^1.8.1
dependencies: dependencies:
'@vitejs/plugin-vue-jsx': 3.0.1_vite@4.3.9+vue@3.3.4 '@vitejs/plugin-vue-jsx': 3.0.1_vite@4.3.9+vue@3.3.4
'@vueuse/core': 10.2.0_vue@3.3.4
theme-change: 2.5.0
vue: 3.3.4 vue: 3.3.4
vue-router: 4.2.2_vue@3.3.4
devDependencies: devDependencies:
'@types/node': 20.3.2 '@types/node': 20.3.2
'@typescript-eslint/eslint-plugin': 5.60.1_emhilanx7rvvqwlixwztbx5x2m '@typescript-eslint/eslint-plugin': 5.60.1_emhilanx7rvvqwlixwztbx5x2m
@@ -687,6 +693,10 @@ packages:
'@types/node': 20.3.2 '@types/node': 20.3.2
dev: true dev: true
/@types/web-bluetooth/0.0.17:
resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==}
dev: false
/@typescript-eslint/eslint-plugin/5.60.1_emhilanx7rvvqwlixwztbx5x2m: /@typescript-eslint/eslint-plugin/5.60.1_emhilanx7rvvqwlixwztbx5x2m:
resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==} resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -919,6 +929,10 @@ packages:
'@vue/compiler-dom': 3.3.4 '@vue/compiler-dom': 3.3.4
'@vue/shared': 3.3.4 '@vue/shared': 3.3.4
/@vue/devtools-api/6.5.0:
resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
dev: false
/@vue/language-core/1.8.2_typescript@5.1.3: /@vue/language-core/1.8.2_typescript@5.1.3:
resolution: {integrity: sha512-QJujhmp89TRoWwzjn2sPMezG97+mNyaCTfznGHWNCE3LBsillZCBqAO7M7cxO8ee1V3r+qHjWytkoh3M4YkRJw==} resolution: {integrity: sha512-QJujhmp89TRoWwzjn2sPMezG97+mNyaCTfznGHWNCE3LBsillZCBqAO7M7cxO8ee1V3r+qHjWytkoh3M4YkRJw==}
peerDependencies: peerDependencies:
@@ -986,6 +1000,31 @@ packages:
- typescript - typescript
dev: true dev: true
/@vueuse/core/10.2.0_vue@3.3.4:
resolution: {integrity: sha512-aHBnoCteIS3hFu7ZZkVB93SanVDY6t4TIb7XDLxJT/HQdAZz+2RdIEJ8rj5LUoEJr7Damb5+sJmtpCwGez5ozQ==}
dependencies:
'@types/web-bluetooth': 0.0.17
'@vueuse/metadata': 10.2.0
'@vueuse/shared': 10.2.0_vue@3.3.4
vue-demi: 0.14.5_vue@3.3.4
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/metadata/10.2.0:
resolution: {integrity: sha512-IR7Mkq6QSgZ38q/2ZzOt+Zz1OpcEsnwE64WBumDQ+RGKrosFCtUA2zgRrOqDEzPBXrVB+4HhFkwDjQMu0fDBKw==}
dev: false
/@vueuse/shared/10.2.0_vue@3.3.4:
resolution: {integrity: sha512-dIeA8+g9Av3H5iF4NXR/sft4V6vys76CpZ6hxwj8eMXybXk2WRl3scSsOVi+kQ9SX38COR7AH7WwY83UcuxbSg==}
dependencies:
vue-demi: 0.14.5_vue@3.3.4
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/acorn-jsx/5.3.2_acorn@8.9.0: /acorn-jsx/5.3.2_acorn@8.9.0:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
@@ -3283,6 +3322,10 @@ packages:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
dev: true dev: true
/theme-change/2.5.0:
resolution: {integrity: sha512-B/UdsgdHAGhSKHTAQnxg/etN0RaMDpehuJmZIjLMDVJ6DGIliRHGD6pODi1CXLQAN9GV0GSyB3G6yCuK05PkPQ==}
dev: false
/thenify-all/1.6.0: /thenify-all/1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
@@ -3493,6 +3536,21 @@ packages:
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
/vue-demi/0.14.5_vue@3.3.4:
resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.3.4
dev: false
/vue-eslint-parser/9.3.1_eslint@8.43.0: /vue-eslint-parser/9.3.1_eslint@8.43.0:
resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==}
engines: {node: ^14.17.0 || >=16.0.0} engines: {node: ^14.17.0 || >=16.0.0}
@@ -3511,6 +3569,15 @@ packages:
- supports-color - supports-color
dev: true dev: true
/vue-router/4.2.2_vue@3.3.4:
resolution: {integrity: sha512-cChBPPmAflgBGmy3tBsjeoe3f3VOSG6naKyY5pjtrqLGbNEXdzCigFUHgBvp9e3ysAtFtEx7OLqcSDh/1Cq2TQ==}
peerDependencies:
vue: ^3.2.0
dependencies:
'@vue/devtools-api': 6.5.0
vue: 3.3.4
dev: false
/vue-template-compiler/2.7.14: /vue-template-compiler/2.7.14:
resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
dependencies: dependencies: