diff --git a/apps/demo/auto-imports.d.ts b/apps/demo/auto-imports.d.ts
new file mode 100644
index 0000000..d8e5994
--- /dev/null
+++ b/apps/demo/auto-imports.d.ts
@@ -0,0 +1,94 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+// biome-ignore lint: disable
+export {}
+declare global {
+ const EffectScope: typeof import('vue').EffectScope
+ const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate
+ const computed: typeof import('vue').computed
+ const createApp: typeof import('vue').createApp
+ const createPinia: typeof import('pinia').createPinia
+ const customRef: typeof import('vue').customRef
+ const defineAsyncComponent: typeof import('vue').defineAsyncComponent
+ const defineComponent: typeof import('vue').defineComponent
+ const defineStore: typeof import('pinia').defineStore
+ const effectScope: typeof import('vue').effectScope
+ const getActivePinia: typeof import('pinia').getActivePinia
+ const getCurrentInstance: typeof import('vue').getCurrentInstance
+ const getCurrentScope: typeof import('vue').getCurrentScope
+ const getCurrentWatcher: typeof import('vue').getCurrentWatcher
+ const h: typeof import('vue').h
+ const inject: typeof import('vue').inject
+ const isProxy: typeof import('vue').isProxy
+ const isReactive: typeof import('vue').isReactive
+ const isReadonly: typeof import('vue').isReadonly
+ const isRef: typeof import('vue').isRef
+ const isShallow: typeof import('vue').isShallow
+ const mapActions: typeof import('pinia').mapActions
+ const mapGetters: typeof import('pinia').mapGetters
+ const mapState: typeof import('pinia').mapState
+ const mapStores: typeof import('pinia').mapStores
+ const mapWritableState: typeof import('pinia').mapWritableState
+ const markRaw: typeof import('vue').markRaw
+ const nextTick: typeof import('vue').nextTick
+ const onActivated: typeof import('vue').onActivated
+ const onBeforeMount: typeof import('vue').onBeforeMount
+ const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
+ const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
+ const onBeforeUnmount: typeof import('vue').onBeforeUnmount
+ const onBeforeUpdate: typeof import('vue').onBeforeUpdate
+ const onDeactivated: typeof import('vue').onDeactivated
+ const onErrorCaptured: typeof import('vue').onErrorCaptured
+ const onMounted: typeof import('vue').onMounted
+ const onRenderTracked: typeof import('vue').onRenderTracked
+ const onRenderTriggered: typeof import('vue').onRenderTriggered
+ const onScopeDispose: typeof import('vue').onScopeDispose
+ const onServerPrefetch: typeof import('vue').onServerPrefetch
+ const onUnmounted: typeof import('vue').onUnmounted
+ const onUpdated: typeof import('vue').onUpdated
+ const onWatcherCleanup: typeof import('vue').onWatcherCleanup
+ const provide: typeof import('vue').provide
+ const reactive: typeof import('vue').reactive
+ const readonly: typeof import('vue').readonly
+ const ref: typeof import('vue').ref
+ const resolveComponent: typeof import('vue').resolveComponent
+ const setActivePinia: typeof import('pinia').setActivePinia
+ const setMapStoreSuffix: typeof import('pinia').setMapStoreSuffix
+ const shallowReactive: typeof import('vue').shallowReactive
+ const shallowReadonly: typeof import('vue').shallowReadonly
+ const shallowRef: typeof import('vue').shallowRef
+ const storeToRefs: typeof import('pinia').storeToRefs
+ const toRaw: typeof import('vue').toRaw
+ const toRef: typeof import('vue').toRef
+ const toRefs: typeof import('vue').toRefs
+ const toValue: typeof import('vue').toValue
+ const triggerRef: typeof import('vue').triggerRef
+ const unref: typeof import('vue').unref
+ const useAttrs: typeof import('vue').useAttrs
+ const useCssModule: typeof import('vue').useCssModule
+ const useCssVars: typeof import('vue').useCssVars
+ const useDialog: typeof import('naive-ui').useDialog
+ const useId: typeof import('vue').useId
+ const useLink: typeof import('vue-router').useLink
+ const useLoadingBar: typeof import('naive-ui').useLoadingBar
+ const useMessage: typeof import('naive-ui').useMessage
+ const useModel: typeof import('vue').useModel
+ const useNotification: typeof import('naive-ui').useNotification
+ const useRoute: typeof import('vue-router').useRoute
+ const useRouter: typeof import('vue-router').useRouter
+ const useSlots: typeof import('vue').useSlots
+ const useTemplateRef: typeof import('vue').useTemplateRef
+ const watch: typeof import('vue').watch
+ const watchEffect: typeof import('vue').watchEffect
+ const watchPostEffect: typeof import('vue').watchPostEffect
+ const watchSyncEffect: typeof import('vue').watchSyncEffect
+}
+// for type re-export
+declare global {
+ // @ts-ignore
+ export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+ import('vue')
+}
diff --git a/apps/demo/components.d.ts b/apps/demo/components.d.ts
new file mode 100644
index 0000000..46ff78e
--- /dev/null
+++ b/apps/demo/components.d.ts
@@ -0,0 +1,44 @@
+/* eslint-disable */
+// @ts-nocheck
+// biome-ignore lint: disable
+// oxlint-disable
+// ------
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+import { GlobalComponents } from 'vue'
+
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+ export interface GlobalComponents {
+ NColorPicker: typeof import('naive-ui')['NColorPicker']
+ NConfigProvider: typeof import('naive-ui')['NConfigProvider']
+ NDialogProvider: typeof import('naive-ui')['NDialogProvider']
+ NLayout: typeof import('naive-ui')['NLayout']
+ NLayoutContent: typeof import('naive-ui')['NLayoutContent']
+ NLayoutHeader: typeof import('naive-ui')['NLayoutHeader']
+ NLayoutSider: typeof import('naive-ui')['NLayoutSider']
+ NLoadingBarProvider: typeof import('naive-ui')['NLoadingBarProvider']
+ NMessageProvider: typeof import('naive-ui')['NMessageProvider']
+ NNotificationProvider: typeof import('naive-ui')['NNotificationProvider']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ }
+}
+
+// For TSX support
+declare global {
+ const NColorPicker: typeof import('naive-ui')['NColorPicker']
+ const NConfigProvider: typeof import('naive-ui')['NConfigProvider']
+ const NDialogProvider: typeof import('naive-ui')['NDialogProvider']
+ const NLayout: typeof import('naive-ui')['NLayout']
+ const NLayoutContent: typeof import('naive-ui')['NLayoutContent']
+ const NLayoutHeader: typeof import('naive-ui')['NLayoutHeader']
+ const NLayoutSider: typeof import('naive-ui')['NLayoutSider']
+ const NLoadingBarProvider: typeof import('naive-ui')['NLoadingBarProvider']
+ const NMessageProvider: typeof import('naive-ui')['NMessageProvider']
+ const NNotificationProvider: typeof import('naive-ui')['NNotificationProvider']
+ const RouterLink: typeof import('vue-router')['RouterLink']
+ const RouterView: typeof import('vue-router')['RouterView']
+}
\ No newline at end of file
diff --git a/apps/demo/src/App.vue b/apps/demo/src/App.vue
index 346a48f..2fbb6fe 100644
--- a/apps/demo/src/App.vue
+++ b/apps/demo/src/App.vue
@@ -1,3 +1,9 @@
+
+
- Demo
+
+ Hello
+
diff --git a/apps/demo/src/main.ts b/apps/demo/src/main.ts
index 5e174f1..e7c9c7e 100644
--- a/apps/demo/src/main.ts
+++ b/apps/demo/src/main.ts
@@ -1,9 +1,12 @@
import './assets/style/tailwind.css';
-import { createApp } from 'vue';
import App from './App.vue';
import { createWebApp } from 'nanxing-admin';
-createWebApp();
-
-createApp(App).mount('#app');
+createWebApp(App, {
+ mount: '#app',
+ requestPrefix: '/api',
+ router: {
+ routes: [],
+ },
+});
diff --git a/apps/demo/vite.config.ts b/apps/demo/vite.config.ts
index 519cde0..3339626 100644
--- a/apps/demo/vite.config.ts
+++ b/apps/demo/vite.config.ts
@@ -1,27 +1,44 @@
import { fileURLToPath, URL } from 'node:url';
-
import { defineConfig } from 'vite';
-import vue from '@vitejs/plugin-vue';
-import vueJsx from '@vitejs/plugin-vue-jsx';
+import defineMainConfig from '../../vite.config';
+import { mergeConfig } from 'vite';
-import tailwindcss from '@tailwindcss/vite';
+export default defineConfig(
+ mergeConfig(defineMainConfig, {
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url)),
+ },
+ },
+ })
+);
// https://vitejs.dev/config/
-export default defineConfig({
- // base: 影响打包静态资源的路径
- base: './',
- plugins: [vue(), vueJsx(), tailwindcss()],
- resolve: {
- alias: {
- '@': fileURLToPath(new URL('./src', import.meta.url)),
- },
- },
- css: {
- preprocessorOptions: {
- scss: { api: 'modern-compiler' },
- },
- },
- server: {
- host: true,
- },
-});
+// export default defineConfig({
+// // base: 影响打包静态资源的路径
+// base: './',
+// plugins: [
+// vue(),
+// vueJsx(),
+// tailwindcss(),
+// AutoImport({
+// imports: ['vue', 'vue-router', 'pinia', { 'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar'] }],
+// }),
+// Components({
+// resolvers: [NaiveUiResolver()],
+// }),
+// ],
+// resolve: {
+// alias: {
+// '@': fileURLToPath(new URL('./src', import.meta.url)),
+// },
+// },
+// css: {
+// preprocessorOptions: {
+// scss: { api: 'modern-compiler' },
+// },
+// },
+// server: {
+// host: true,
+// },
+// });
diff --git a/package.json b/package.json
index 53248c0..348f52b 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,10 @@
"devDependencies": {
"@types/node": "^25.0.3",
"@vue/tsconfig": "^0.8.1",
+ "colord": "^2.9.3",
"typescript": "^5.9.3",
+ "unplugin-auto-import": "^20.3.0",
+ "unplugin-vue-components": "^30.0.0",
"vite": "^7.3.0",
"vue-tsc": "^3.2.1"
},
@@ -26,6 +29,7 @@
"@tsconfig/node18": "^18.2.6",
"@vitejs/plugin-vue": "^6.0.3",
"@vitejs/plugin-vue-jsx": "^5.1.3",
+ "naive-ui": "^2.43.2",
"nanxing-admin": "workspace:*",
"pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1",
diff --git a/packages/nanxing-admin/components/config-provider/ConfigProvider.vue b/packages/nanxing-admin/components/config-provider/ConfigProvider.vue
new file mode 100644
index 0000000..fc6fc53
--- /dev/null
+++ b/packages/nanxing-admin/components/config-provider/ConfigProvider.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/nanxing-admin/components/config-provider/index.ts b/packages/nanxing-admin/components/config-provider/index.ts
new file mode 100644
index 0000000..f636380
--- /dev/null
+++ b/packages/nanxing-admin/components/config-provider/index.ts
@@ -0,0 +1,3 @@
+import ConfigProvider from './ConfigProvider.vue';
+
+export const AppConfigProvider = ConfigProvider;
diff --git a/packages/nanxing-admin/components/index.ts b/packages/nanxing-admin/components/index.ts
new file mode 100644
index 0000000..2245ba1
--- /dev/null
+++ b/packages/nanxing-admin/components/index.ts
@@ -0,0 +1 @@
+export * from './config-provider';
diff --git a/packages/nanxing-admin/components/layouts/Provider.vue b/packages/nanxing-admin/components/layouts/Provider.vue
new file mode 100644
index 0000000..5cde980
--- /dev/null
+++ b/packages/nanxing-admin/components/layouts/Provider.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/packages/nanxing-admin/components/layouts/default/Index.vue b/packages/nanxing-admin/components/layouts/default/Index.vue
new file mode 100644
index 0000000..be76b02
--- /dev/null
+++ b/packages/nanxing-admin/components/layouts/default/Index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/nanxing-admin/components/layouts/index.ts b/packages/nanxing-admin/components/layouts/index.ts
new file mode 100644
index 0000000..ad569c4
--- /dev/null
+++ b/packages/nanxing-admin/components/layouts/index.ts
@@ -0,0 +1,6 @@
+import Provider from './Provider.vue';
+
+import Default from './default/index.vue';
+
+export const LayoutProvider = Provider;
+export const LayoutDefault = Default;
diff --git a/packages/nanxing-admin/core/constants.ts b/packages/nanxing-admin/core/constants.ts
new file mode 100644
index 0000000..e69de29
diff --git a/packages/nanxing-admin/core/createWebApp.ts b/packages/nanxing-admin/core/createWebApp.ts
new file mode 100644
index 0000000..72c1304
--- /dev/null
+++ b/packages/nanxing-admin/core/createWebApp.ts
@@ -0,0 +1,31 @@
+import { createApp, type App, type Component, type Plugin } from 'vue';
+import { createWebRouter, type WebRouterOptions } from './createWebRouter';
+import { createPinia } from 'pinia';
+import piniaPluginPersistedState from 'pinia-plugin-persistedstate';
+
+export interface WebAppOptions {
+ mount: string;
+ plugins?: Plugin[];
+ requestPrefix: string;
+ router: WebRouterOptions;
+}
+
+// 封装一个创建 Web 应用的函数
+// 用于替代 Vue 3 项目中的 main.ts 默认的应用逻辑
+export function createWebApp(rootComponent: Component, options: WebAppOptions): App {
+ const app = createApp(rootComponent);
+ const router = createWebRouter(options.router);
+
+ app.use(router);
+
+ if (options.plugins && options.plugins.length > 0) {
+ options.plugins.forEach((plugin) => {
+ app.use(plugin);
+ });
+ }
+
+ app.use(createPinia().use(piniaPluginPersistedState));
+
+ app.mount(options.mount);
+ return app;
+}
diff --git a/packages/nanxing-admin/core/createWebRouter.ts b/packages/nanxing-admin/core/createWebRouter.ts
new file mode 100644
index 0000000..0839f67
--- /dev/null
+++ b/packages/nanxing-admin/core/createWebRouter.ts
@@ -0,0 +1,50 @@
+import {
+ createMemoryHistory,
+ createRouter,
+ createWebHashHistory,
+ createWebHistory,
+ type Router,
+ type RouterHistory,
+ type RouterOptions,
+} from 'vue-router';
+import { setRouterTranslateGuard } from './router/guards';
+
+type RouterHistoryMode = 'hash' | 'history' | 'memory';
+type RouterHistoryFunction = (base?: string) => RouterHistory;
+
+function _useHistory(mode: RouterHistoryMode): RouterHistoryFunction {
+ const historyObject: Record = {
+ hash: createWebHashHistory,
+ history: createWebHistory,
+ memory: createMemoryHistory,
+ };
+ return historyObject[mode];
+}
+
+// 创建一个 Web 路由实例的函数
+// 默认是 history 模式
+export interface WebRouterOptions extends Omit {
+ mode?: RouterHistoryMode;
+ base?: string;
+ guards?: ((router: Router) => void)[];
+}
+export function createWebRouter(options: WebRouterOptions): Router {
+ const history = _useHistory(options?.mode || 'history')?.(options?.base);
+ const routes = options?.routes || [];
+ const scrollBehavior = options?.scrollBehavior || (() => ({ left: 0, top: 0 }));
+ const guards = [setRouterTranslateGuard].concat(options?.guards || []);
+
+ const router = createRouter({
+ history,
+ routes,
+ scrollBehavior,
+ });
+
+ if (guards && guards.length > 0) {
+ guards.forEach((guard) => {
+ guard(router);
+ });
+ }
+
+ return router;
+}
diff --git a/packages/nanxing-admin/core/router/guards.ts b/packages/nanxing-admin/core/router/guards.ts
new file mode 100644
index 0000000..9f0383c
--- /dev/null
+++ b/packages/nanxing-admin/core/router/guards.ts
@@ -0,0 +1,11 @@
+import { type ShallowRef, shallowRef } from 'vue';
+import { type LoadingBarApi } from 'naive-ui';
+import type { Router } from 'vue-router';
+
+export const loadingBarRef: ShallowRef = shallowRef(null);
+
+export function setRouterTranslateGuard(router: Router) {
+ console.log('Router translate guard set');
+ router.beforeEach(() => loadingBarRef.value?.start());
+ router.afterEach(() => loadingBarRef.value?.finish());
+}
diff --git a/packages/nanxing-admin/index.ts b/packages/nanxing-admin/index.ts
index 6c7f184..abc3eb1 100644
--- a/packages/nanxing-admin/index.ts
+++ b/packages/nanxing-admin/index.ts
@@ -1,3 +1,2 @@
-export function createWebApp() {
- console.log('Created web app');
-}
+export * from './core/createWebApp';
+export * from './components';
diff --git a/packages/nanxing-admin/stores/useLocalConfigStore.ts b/packages/nanxing-admin/stores/useLocalConfigStore.ts
new file mode 100644
index 0000000..a9d8eeb
--- /dev/null
+++ b/packages/nanxing-admin/stores/useLocalConfigStore.ts
@@ -0,0 +1,68 @@
+import type { GlobalThemeOverrides } from 'naive-ui';
+import { defineStore } from 'pinia';
+import { computed, shallowRef } from 'vue';
+import { colord } from 'colord';
+
+const LOCAL_FIXED_THEME_PRIMARY_COLOR = '#31A848FF';
+
+export const useLocalConfigStore = defineStore(
+ 'localConfig',
+ () => {
+ // 本地主题色配置
+ const { primaryColor, resetPrimaryColor, grayMode, toggleGrayMode, naiveThemeProps } = (function () {
+ const primaryColor = shallowRef(LOCAL_FIXED_THEME_PRIMARY_COLOR);
+
+ // naive-ui 主题色变更
+ const naiveThemeProps = computed((): GlobalThemeOverrides => {
+ const hsColor = colord(primaryColor.value).lighten(0.035);
+ const pColor = colord(primaryColor.value).darken(0.1);
+ return {
+ common: {
+ primaryColor: primaryColor.value,
+ primaryColorHover: hsColor.toHex(),
+ primaryColorPressed: pColor.toHex(),
+ primaryColorSuppl: hsColor.toHex(),
+ },
+ LoadingBar: {
+ colorLoading: primaryColor.value,
+ },
+ };
+ });
+
+ function resetPrimaryColor() {
+ primaryColor.value = LOCAL_FIXED_THEME_PRIMARY_COLOR;
+ }
+
+ const grayMode = shallowRef(false);
+ function toggleGrayMode() {
+ grayMode.value = !grayMode.value;
+ if (grayMode.value) {
+ document.documentElement.style.filter = 'grayscale(1)';
+ } else {
+ document.documentElement.style.filter = 'grayscale(0)';
+ }
+ }
+
+ return {
+ primaryColor,
+ resetPrimaryColor,
+ grayMode,
+ toggleGrayMode,
+ naiveThemeProps,
+ };
+ })();
+
+ // 布局配置
+
+ return {
+ primaryColor,
+ resetPrimaryColor,
+ grayMode,
+ toggleGrayMode,
+ naiveThemeProps,
+ };
+ },
+ {
+ persist: true,
+ }
+);
diff --git a/packages/nanxing-admin/tsconfig.json b/packages/nanxing-admin/tsconfig.json
index f26d8fe..2d8c52e 100644
--- a/packages/nanxing-admin/tsconfig.json
+++ b/packages/nanxing-admin/tsconfig.json
@@ -1,3 +1,4 @@
{
- "extends": "../../tsconfig.app.json"
+ "extends": "../../tsconfig.app.json",
+ "include": ["./**/*.vue", "./**/*.ts", "./**/*.tsx", "./**/*.js", "./**/*.jsx"]
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2511389..277e253 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,6 +20,9 @@ importers:
'@vitejs/plugin-vue-jsx':
specifier: ^5.1.3
version: 5.1.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.9.3))
+ naive-ui:
+ specifier: ^2.43.2
+ version: 2.43.2(vue@3.5.26(typescript@5.9.3))
nanxing-admin:
specifier: workspace:*
version: link:packages/nanxing-admin
@@ -45,9 +48,18 @@ importers:
'@vue/tsconfig':
specifier: ^0.8.1
version: 0.8.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))
+ colord:
+ specifier: ^2.9.3
+ version: 2.9.3
typescript:
specifier: ^5.9.3
version: 5.9.3
+ unplugin-auto-import:
+ specifier: ^20.3.0
+ version: 20.3.0
+ unplugin-vue-components:
+ specifier: ^30.0.0
+ version: 30.0.0(@babel/parser@7.28.5)(vue@3.5.26(typescript@5.9.3))
vite:
specifier: ^7.3.0
version: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
@@ -178,6 +190,19 @@ packages:
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
engines: {node: '>=6.9.0'}
+ '@css-render/plugin-bem@0.15.14':
+ resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==}
+ peerDependencies:
+ css-render: ~0.15.14
+
+ '@css-render/vue3-ssr@0.15.14':
+ resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==}
+ peerDependencies:
+ vue: ^3.0.11
+
+ '@emotion/hash@0.8.0':
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+
'@esbuild/aix-ppc64@0.27.2':
resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'}
@@ -350,6 +375,9 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@juggle/resize-observer@3.4.0':
+ resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
+
'@rolldown/pluginutils@1.0.0-beta.53':
resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==}
@@ -577,6 +605,15 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/katex@0.16.7':
+ resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.21':
+ resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==}
+
'@types/node@25.0.3':
resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
@@ -674,9 +711,17 @@ packages:
vue:
optional: true
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
alien-signals@3.1.2:
resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==}
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
baseline-browser-mapping@2.9.11:
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
hasBin: true
@@ -692,6 +737,19 @@ packages:
caniuse-lite@1.0.30001762:
resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==}
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ colord@2.9.3:
+ resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.2:
+ resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
@@ -699,9 +757,23 @@ packages:
resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
engines: {node: '>=18'}
+ css-render@0.15.14:
+ resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==}
+
+ csstype@3.0.11:
+ resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
+
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+ date-fns-tz@3.2.0:
+ resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==}
+ peerDependencies:
+ date-fns: ^3.0.0 || ^4.0.0
+
+ date-fns@4.1.0:
+ resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -738,9 +810,22 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ evtd@0.2.4:
+ resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==}
+
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
@@ -762,6 +847,10 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ highlight.js@11.11.1:
+ resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
+ engines: {node: '>=12.0.0'}
+
hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
@@ -776,6 +865,9 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
jsesc@3.1.0:
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
engines: {node: '>=6'}
@@ -860,6 +952,16 @@ packages:
resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
engines: {node: '>= 12.0.0'}
+ local-pkg@1.1.2:
+ resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+ engines: {node: '>=14'}
+
+ lodash-es@4.17.22:
+ resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@@ -869,12 +971,20 @@ packages:
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+ mlly@1.8.0:
+ resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+ naive-ui@2.43.2:
+ resolution: {integrity: sha512-YlLMnGrwGTOc+zMj90sG3ubaH5/7czsgLgGcjTLA981IUaz8r6t4WIujNt8r9PNr+dqv6XNEr0vxkARgPPjfBQ==}
+ peerDependencies:
+ vue: ^3.0.0
+
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -886,6 +996,9 @@ packages:
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
@@ -919,10 +1032,23 @@ packages:
typescript:
optional: true
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
@@ -931,6 +1057,12 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+ seemly@0.3.10:
+ resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==}
+
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -943,6 +1075,9 @@ packages:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
+ strip-literal@3.1.0:
+ resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
superjson@2.2.6:
resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
engines: {node: '>=16'}
@@ -958,20 +1093,68 @@ packages:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
+ treemate@0.3.11:
+ resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
+
typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
hasBin: true
+ ufo@1.6.1:
+ resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+ unimport@5.6.0:
+ resolution: {integrity: sha512-8rqAmtJV8o60x46kBAJKtHpJDJWkA2xcBqWKPI14MgUb05o1pnpnCnXSxedUXyeq7p8fR5g3pTo2BaswZ9lD9A==}
+ engines: {node: '>=18.12.0'}
+
+ unplugin-auto-import@20.3.0:
+ resolution: {integrity: sha512-RcSEQiVv7g0mLMMXibYVKk8mpteKxvyffGuDKqZZiFr7Oq3PB1HwgHdK5O7H4AzbhzHoVKG0NnMnsk/1HIVYzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': ^4.0.0
+ '@vueuse/core': '*'
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ '@vueuse/core':
+ optional: true
+
+ unplugin-utils@0.3.1:
+ resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
+ engines: {node: '>=20.19.0'}
+
+ unplugin-vue-components@30.0.0:
+ resolution: {integrity: sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/parser': ^7.15.8
+ '@nuxt/kit': ^3.2.2 || ^4.0.0
+ vue: 2 || 3
+ peerDependenciesMeta:
+ '@babel/parser':
+ optional: true
+ '@nuxt/kit':
+ optional: true
+
+ unplugin@2.3.11:
+ resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
+ engines: {node: '>=18.12.0'}
+
update-browserslist-db@1.2.3:
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
+ vdirs@0.1.8:
+ resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
+ peerDependencies:
+ vue: ^3.0.11
+
vite@7.3.0:
resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1012,6 +1195,11 @@ packages:
yaml:
optional: true
+ vooks@0.2.12:
+ resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
+ peerDependencies:
+ vue: ^3.0.0
+
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
@@ -1034,6 +1222,14 @@ packages:
typescript:
optional: true
+ vueuc@0.4.65:
+ resolution: {integrity: sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==}
+ peerDependencies:
+ vue: ^3.0.11
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
@@ -1206,6 +1402,16 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
+ '@css-render/plugin-bem@0.15.14(css-render@0.15.14)':
+ dependencies:
+ css-render: 0.15.14
+
+ '@css-render/vue3-ssr@0.15.14(vue@3.5.26(typescript@5.9.3))':
+ dependencies:
+ vue: 3.5.26(typescript@5.9.3)
+
+ '@emotion/hash@0.8.0': {}
+
'@esbuild/aix-ppc64@0.27.2':
optional: true
@@ -1303,6 +1509,8 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@juggle/resize-observer@3.4.0': {}
+
'@rolldown/pluginutils@1.0.0-beta.53': {}
'@rolldown/pluginutils@1.0.0-beta.57': {}
@@ -1445,6 +1653,14 @@ snapshots:
'@types/estree@1.0.8': {}
+ '@types/katex@0.16.7': {}
+
+ '@types/lodash-es@4.17.12':
+ dependencies:
+ '@types/lodash': 4.17.21
+
+ '@types/lodash@4.17.21': {}
+
'@types/node@25.0.3':
dependencies:
undici-types: 7.16.0
@@ -1597,8 +1813,12 @@ snapshots:
typescript: 5.9.3
vue: 3.5.26(typescript@5.9.3)
+ acorn@8.15.0: {}
+
alien-signals@3.1.2: {}
+ async-validator@4.2.5: {}
+
baseline-browser-mapping@2.9.11: {}
birpc@2.9.0: {}
@@ -1613,14 +1833,37 @@ snapshots:
caniuse-lite@1.0.30001762: {}
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ colord@2.9.3: {}
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.2: {}
+
convert-source-map@2.0.0: {}
copy-anything@4.0.5:
dependencies:
is-what: 5.5.0
+ css-render@0.15.14:
+ dependencies:
+ '@emotion/hash': 0.8.0
+ csstype: 3.0.11
+
+ csstype@3.0.11: {}
+
csstype@3.2.3: {}
+ date-fns-tz@3.2.0(date-fns@4.1.0):
+ dependencies:
+ date-fns: 4.1.0
+
+ date-fns@4.1.0: {}
+
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -1669,8 +1912,18 @@ snapshots:
escalade@3.2.0: {}
+ escape-string-regexp@5.0.0: {}
+
estree-walker@2.0.2: {}
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ evtd@0.2.4: {}
+
+ exsolve@1.0.8: {}
+
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
@@ -1682,6 +1935,8 @@ snapshots:
graceful-fs@4.2.11: {}
+ highlight.js@11.11.1: {}
+
hookable@5.5.3: {}
is-what@5.5.0: {}
@@ -1690,6 +1945,8 @@ snapshots:
js-tokens@4.0.0: {}
+ js-tokens@9.0.1: {}
+
jsesc@3.1.0: {}
json5@2.2.3: {}
@@ -1743,6 +2000,16 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.30.2
lightningcss-win32-x64-msvc: 1.30.2
+ local-pkg@1.1.2:
+ dependencies:
+ mlly: 1.8.0
+ pkg-types: 2.3.0
+ quansync: 0.2.11
+
+ lodash-es@4.17.22: {}
+
+ lodash@4.17.21: {}
+
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
@@ -1753,16 +2020,48 @@ snapshots:
mitt@3.0.1: {}
+ mlly@1.8.0:
+ dependencies:
+ acorn: 8.15.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.1
+
ms@2.1.3: {}
muggle-string@0.4.1: {}
+ naive-ui@2.43.2(vue@3.5.26(typescript@5.9.3)):
+ dependencies:
+ '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
+ '@css-render/vue3-ssr': 0.15.14(vue@3.5.26(typescript@5.9.3))
+ '@types/katex': 0.16.7
+ '@types/lodash': 4.17.21
+ '@types/lodash-es': 4.17.12
+ async-validator: 4.2.5
+ css-render: 0.15.14
+ csstype: 3.2.3
+ date-fns: 4.1.0
+ date-fns-tz: 3.2.0(date-fns@4.1.0)
+ evtd: 0.2.4
+ highlight.js: 11.11.1
+ lodash: 4.17.21
+ lodash-es: 4.17.22
+ seemly: 0.3.10
+ treemate: 0.3.11
+ vdirs: 0.1.8(vue@3.5.26(typescript@5.9.3))
+ vooks: 0.2.12(vue@3.5.26(typescript@5.9.3))
+ vue: 3.5.26(typescript@5.9.3)
+ vueuc: 0.4.65(vue@3.5.26(typescript@5.9.3))
+
nanoid@3.3.11: {}
node-releases@2.0.27: {}
path-browserify@1.0.1: {}
+ pathe@2.0.3: {}
+
perfect-debounce@1.0.0: {}
picocolors@1.1.1: {}
@@ -1782,12 +2081,28 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.0
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.2
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
postcss@8.5.6:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
+ quansync@0.2.11: {}
+
+ readdirp@4.1.2: {}
+
rfdc@1.4.1: {}
rollup@4.54.0:
@@ -1818,12 +2133,20 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.54.0
fsevents: 2.3.3
+ scule@1.3.0: {}
+
+ seemly@0.3.10: {}
+
semver@6.3.1: {}
source-map-js@1.2.1: {}
speakingurl@14.0.1: {}
+ strip-literal@3.1.0:
+ dependencies:
+ js-tokens: 9.0.1
+
superjson@2.2.6:
dependencies:
copy-anything: 4.0.5
@@ -1837,16 +2160,79 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
+ treemate@0.3.11: {}
+
typescript@5.9.3: {}
+ ufo@1.6.1: {}
+
undici-types@7.16.0: {}
+ unimport@5.6.0:
+ dependencies:
+ acorn: 8.15.0
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ pkg-types: 2.3.0
+ scule: 1.3.0
+ strip-literal: 3.1.0
+ tinyglobby: 0.2.15
+ unplugin: 2.3.11
+ unplugin-utils: 0.3.1
+
+ unplugin-auto-import@20.3.0:
+ dependencies:
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ picomatch: 4.0.3
+ unimport: 5.6.0
+ unplugin: 2.3.11
+ unplugin-utils: 0.3.1
+
+ unplugin-utils@0.3.1:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.3
+
+ unplugin-vue-components@30.0.0(@babel/parser@7.28.5)(vue@3.5.26(typescript@5.9.3)):
+ dependencies:
+ chokidar: 4.0.3
+ debug: 4.4.3
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ tinyglobby: 0.2.15
+ unplugin: 2.3.11
+ unplugin-utils: 0.3.1
+ vue: 3.5.26(typescript@5.9.3)
+ optionalDependencies:
+ '@babel/parser': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ unplugin@2.3.11:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ acorn: 8.15.0
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+
update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies:
browserslist: 4.28.1
escalade: 3.2.0
picocolors: 1.1.1
+ vdirs@0.1.8(vue@3.5.26(typescript@5.9.3)):
+ dependencies:
+ evtd: 0.2.4
+ vue: 3.5.26(typescript@5.9.3)
+
vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2):
dependencies:
esbuild: 0.27.2
@@ -1861,6 +2247,11 @@ snapshots:
jiti: 2.6.1
lightningcss: 1.30.2
+ vooks@0.2.12(vue@3.5.26(typescript@5.9.3)):
+ dependencies:
+ evtd: 0.2.4
+ vue: 3.5.26(typescript@5.9.3)
+
vscode-uri@3.1.0: {}
vue-router@4.6.4(vue@3.5.26(typescript@5.9.3)):
@@ -1884,4 +2275,17 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
+ vueuc@0.4.65(vue@3.5.26(typescript@5.9.3)):
+ dependencies:
+ '@css-render/vue3-ssr': 0.15.14(vue@3.5.26(typescript@5.9.3))
+ '@juggle/resize-observer': 3.4.0
+ css-render: 0.15.14
+ evtd: 0.2.4
+ seemly: 0.3.10
+ vdirs: 0.1.8(vue@3.5.26(typescript@5.9.3))
+ vooks: 0.2.12(vue@3.5.26(typescript@5.9.3))
+ vue: 3.5.26(typescript@5.9.3)
+
+ webpack-virtual-modules@0.6.2: {}
+
yallist@3.1.1: {}
diff --git a/tsconfig.app.json b/tsconfig.app.json
index 9f8d803..1d17765 100644
--- a/tsconfig.app.json
+++ b/tsconfig.app.json
@@ -5,7 +5,7 @@
"composite": true,
"noEmit": true,
"paths": {
- "@/*": ["./src"]
+ "@/*": ["./src/*"]
}
}
}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..04dffb2
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,34 @@
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+import vueJsx from '@vitejs/plugin-vue-jsx';
+
+import tailwindcss from '@tailwindcss/vite';
+
+import AutoImport from 'unplugin-auto-import/vite';
+import Components from 'unplugin-vue-components/vite';
+import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ // base: 影响打包静态资源的路径
+ base: './',
+ plugins: [
+ vue(),
+ vueJsx(),
+ tailwindcss(),
+ AutoImport({
+ imports: ['vue', 'vue-router', 'pinia', { 'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar'] }],
+ }),
+ Components({
+ resolvers: [NaiveUiResolver()],
+ }),
+ ],
+ css: {
+ preprocessorOptions: {
+ scss: { api: 'modern-compiler' },
+ },
+ },
+ server: {
+ host: true,
+ },
+});