diff --git a/apps/backend-mock/middleware/1.api.ts b/apps/backend-mock/middleware/1.api.ts index 84e2ce0e..a2e5a09b 100644 --- a/apps/backend-mock/middleware/1.api.ts +++ b/apps/backend-mock/middleware/1.api.ts @@ -1,4 +1,8 @@ export default defineEventHandler((event) => { + event.node.res.setHeader( + 'Access-Control-Allow-Origin', + event.headers.get('Origin') ?? '*', + ); if (event.method === 'OPTIONS') { event.node.res.statusCode = 204; event.node.res.statusMessage = 'No Content.'; diff --git a/apps/backend-mock/nitro.config.ts b/apps/backend-mock/nitro.config.ts index c2d7297f..c0fc13e2 100644 --- a/apps/backend-mock/nitro.config.ts +++ b/apps/backend-mock/nitro.config.ts @@ -9,7 +9,8 @@ export default defineNitroConfig({ cors: true, headers: { 'Access-Control-Allow-Credentials': 'true', - 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Headers': + 'Accept, Authorization, Content-Length, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With', 'Access-Control-Allow-Methods': 'GET,HEAD,PUT,PATCH,POST,DELETE', 'Access-Control-Allow-Origin': '*', 'Access-Control-Expose-Headers': '*', diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts index b2d106e8..6abc2bbf 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-antd/src/bootstrap.ts @@ -2,6 +2,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; import { initTippy } from '@vben/common-ui'; +import { MotionPlugin } from '@vben/plugins/motion'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -49,6 +50,9 @@ async function bootstrap(namespace: string) { // 配置路由及路由守卫 app.use(router); + // 配置Motion插件 + app.use(MotionPlugin); + // 动态更新标题 watchEffect(() => { if (preferences.app.dynamicTitle) { diff --git a/docs/src/commercial/community.md b/docs/src/commercial/community.md index c5b7b7db..60d9f254 100644 --- a/docs/src/commercial/community.md +++ b/docs/src/commercial/community.md @@ -3,7 +3,7 @@ 社区交流群主要是为了方便大家交流,提问,解答问题,分享经验等。偏自助方式,如果你有问题,可以通过以下方式加入社区交流群: - [QQ频道](https://pd.qq.com/s/16p8lvvob):推荐!!!主要提供问题解答,分享经验等。 -- QQ群:[大群](https://qm.qq.com/q/MEmHoCLbG0),[1群](https://qm.qq.com/q/YacMHPYAMu)、[2群](https://qm.qq.com/q/ajVKZvFICk)、[3群](https://qm.qq.com/q/36zdwThP2E),[4群](https://qm.qq.com/q/sCzSlm3504),主要使用者的交流群。 +- QQ群:[大群](https://qm.qq.com/q/MEmHoCLbG0),[1群](https://qm.qq.com/q/YacMHPYAMu)、[2群](https://qm.qq.com/q/ajVKZvFICk)、[3群](https://qm.qq.com/q/36zdwThP2E),[4群](https://qm.qq.com/q/sCzSlm3504),[5群](https://qm.qq.com/q/ya9XrtbS6s),主要的使用者交流群。 - [Discord](https://discord.com/invite/VU62jTecad): 主要提供问题解答,分享经验等。 ::: tip diff --git a/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue b/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue index 31af2821..90019361 100644 --- a/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue +++ b/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue @@ -336,7 +336,7 @@ function autofocus() { > diff --git a/packages/effects/common-ui/package.json b/packages/effects/common-ui/package.json index 408424d3..aafb22ef 100644 --- a/packages/effects/common-ui/package.json +++ b/packages/effects/common-ui/package.json @@ -47,6 +47,7 @@ "vue": "catalog:", "vue-codemirror6": "1.3.4", "vue-json-pretty": "^2.4.0", + "vue-json-viewer": "catalog:", "vue-router": "catalog:", "vue-tippy": "catalog:" }, diff --git a/packages/effects/common-ui/src/components/count-to/count-to.vue b/packages/effects/common-ui/src/components/count-to/count-to.vue new file mode 100644 index 00000000..0d73e3a9 --- /dev/null +++ b/packages/effects/common-ui/src/components/count-to/count-to.vue @@ -0,0 +1,123 @@ + + + diff --git a/packages/effects/common-ui/src/components/count-to/index.ts b/packages/effects/common-ui/src/components/count-to/index.ts new file mode 100644 index 00000000..d942796e --- /dev/null +++ b/packages/effects/common-ui/src/components/count-to/index.ts @@ -0,0 +1,2 @@ +export { default as CountTo } from './count-to.vue'; +export * from './types'; diff --git a/packages/effects/common-ui/src/components/count-to/types.ts b/packages/effects/common-ui/src/components/count-to/types.ts new file mode 100644 index 00000000..0b3bd82d --- /dev/null +++ b/packages/effects/common-ui/src/components/count-to/types.ts @@ -0,0 +1,53 @@ +import type { CubicBezierPoints, EasingFunction } from '@vueuse/core'; + +import type { StyleValue } from 'vue'; + +import { TransitionPresets as TransitionPresetsData } from '@vueuse/core'; + +export type TransitionPresets = keyof typeof TransitionPresetsData; + +export const TransitionPresetsKeys = Object.keys( + TransitionPresetsData, +) as TransitionPresets[]; + +export interface CountToProps { + /** 初始值 */ + startVal?: number; + /** 当前值 */ + endVal: number; + /** 是否禁用动画 */ + disabled?: boolean; + /** 延迟动画开始的时间 */ + delay?: number; + /** 持续时间 */ + duration?: number; + /** 小数位数 */ + decimals?: number; + /** 小数点 */ + decimal?: string; + /** 分隔符 */ + separator?: string; + /** 前缀 */ + prefix?: string; + /** 后缀 */ + suffix?: string; + /** 过渡效果 */ + transition?: CubicBezierPoints | EasingFunction | TransitionPresets; + /** 整数部分的类名 */ + mainClass?: string; + /** 小数部分的类名 */ + decimalClass?: string; + /** 前缀部分的类名 */ + prefixClass?: string; + /** 后缀部分的类名 */ + suffixClass?: string; + + /** 整数部分的样式 */ + mainStyle?: StyleValue; + /** 小数部分的样式 */ + decimalStyle?: StyleValue; + /** 前缀部分的样式 */ + prefixStyle?: StyleValue; + /** 后缀部分的样式 */ + suffixStyle?: StyleValue; +} diff --git a/packages/effects/common-ui/src/components/index.ts b/packages/effects/common-ui/src/components/index.ts index dec30490..ca22c32a 100644 --- a/packages/effects/common-ui/src/components/index.ts +++ b/packages/effects/common-ui/src/components/index.ts @@ -2,9 +2,11 @@ export * from './api-component'; export * from './captcha'; export * from './code-mirror'; export * from './col-page'; +export * from './count-to'; export * from './ellipsis-text'; export * from './icon-picker'; export * from './json-preview'; +export * from './json-viewer'; export * from './markdown'; export * from './page'; export * from './resize'; diff --git a/packages/effects/common-ui/src/components/json-viewer/index.ts b/packages/effects/common-ui/src/components/json-viewer/index.ts new file mode 100644 index 00000000..1aec78bb --- /dev/null +++ b/packages/effects/common-ui/src/components/json-viewer/index.ts @@ -0,0 +1,3 @@ +export { default as JsonViewer } from './index.vue'; + +export * from './types'; diff --git a/packages/effects/common-ui/src/components/json-viewer/index.vue b/packages/effects/common-ui/src/components/json-viewer/index.vue new file mode 100644 index 00000000..aa1d90d3 --- /dev/null +++ b/packages/effects/common-ui/src/components/json-viewer/index.vue @@ -0,0 +1,98 @@ + + + diff --git a/packages/effects/common-ui/src/components/json-viewer/style.scss b/packages/effects/common-ui/src/components/json-viewer/style.scss new file mode 100644 index 00000000..73ce22b9 --- /dev/null +++ b/packages/effects/common-ui/src/components/json-viewer/style.scss @@ -0,0 +1,98 @@ +.default-json-theme { + font-family: Consolas, Menlo, Courier, monospace; + font-size: 14px; + color: hsl(var(--foreground)); + white-space: nowrap; + background: hsl(var(--background)); + + &.jv-container.boxed { + border: 1px solid hsl(var(--border)); + } + + .jv-ellipsis { + display: inline-block; + padding: 0 4px 2px; + font-size: 0.9em; + line-height: 0.9; + color: hsl(var(--secondary-foreground)); + vertical-align: 2px; + cursor: pointer; + user-select: none; + background-color: hsl(var(--secondary)); + border-radius: 3px; + } + + .jv-button { + color: hsl(var(--primary)); + } + + .jv-key { + color: hsl(var(--heavy-foreground)); + } + + .jv-item { + &.jv-array { + color: hsl(var(--heavy-foreground)); + } + + &.jv-boolean { + color: hsl(var(--red-400)); + } + + &.jv-function { + color: hsl(var(--destructive-foreground)); + } + + &.jv-number { + color: hsl(var(--info-foreground)); + } + + &.jv-number-float { + color: hsl(var(--info-foreground)); + } + + &.jv-number-integer { + color: hsl(var(--info-foreground)); + } + + &.jv-object { + color: hsl(var(--accent-darker)); + } + + &.jv-undefined { + color: hsl(var(--secondary-foreground)); + } + + &.jv-string { + color: hsl(var(--primary)); + word-break: break-word; + white-space: normal; + } + } + + &.jv-container .jv-code { + padding: 10px; + + &.boxed:not(.open) { + padding-bottom: 20px; + margin-bottom: 10px; + } + + &.open { + padding-bottom: 10px; + } + + .jv-toggle { + &::before { + padding: 0 2px; + border-radius: 2px; + } + + &:hover { + &::before { + background: hsl(var(--accent-foreground)); + } + } + } + } +} diff --git a/packages/effects/common-ui/src/components/json-viewer/types.ts b/packages/effects/common-ui/src/components/json-viewer/types.ts new file mode 100644 index 00000000..8f3a206e --- /dev/null +++ b/packages/effects/common-ui/src/components/json-viewer/types.ts @@ -0,0 +1,44 @@ +export interface JsonViewerProps { + /** 要展示的结构数据 */ + value: any; + /** 展开深度 */ + expandDepth?: number; + /** 是否可复制 */ + copyable?: boolean; + /** 是否排序 */ + sort?: boolean; + /** 显示边框 */ + boxed?: boolean; + /** 主题 */ + theme?: string; + /** 是否展开 */ + expanded?: boolean; + /** 时间格式化函数 */ + timeformat?: (time: Date | number | string) => string; + /** 预览模式 */ + previewMode?: boolean; + /** 显示数组索引 */ + showArrayIndex?: boolean; + /** 显示双引号 */ + showDoubleQuotes?: boolean; +} + +export interface JsonViewerAction { + action: string; + text: string; + trigger: HTMLElement; +} + +export interface JsonViewerValue { + value: any; + path: string; + depth: number; + el: HTMLElement; +} + +export interface JsonViewerToggle { + /** 鼠标事件 */ + event: MouseEvent; + /** 当前展开状态 */ + open: boolean; +} diff --git a/packages/effects/hooks/src/use-hover-toggle.ts b/packages/effects/hooks/src/use-hover-toggle.ts index c9bd7045..491b1f58 100644 --- a/packages/effects/hooks/src/use-hover-toggle.ts +++ b/packages/effects/hooks/src/use-hover-toggle.ts @@ -1,9 +1,12 @@ import type { Arrayable, MaybeElementRef } from '@vueuse/core'; + import type { Ref } from 'vue'; +import { computed, onUnmounted, ref, unref, watch } from 'vue'; + import { isFunction } from '@vben/utils'; -import { useMouseInElement } from '@vueuse/core'; -import { computed, onUnmounted, ref, watch } from 'vue'; + +import { useElementHover } from '@vueuse/core'; /** * 监测鼠标是否在元素内部,如果在元素内部则返回 true,否则返回 false @@ -15,15 +18,19 @@ export function useHoverToggle( refElement: Arrayable, delay: (() => number) | number = 500, ) { - const isOutsides: Array> = []; + const isHovers: Array> = []; const value = ref(false); const timer = ref | undefined>(); const refs = Array.isArray(refElement) ? refElement : [refElement]; refs.forEach((refEle) => { - const listener = useMouseInElement(refEle, { handleOutside: true }); - isOutsides.push(listener.isOutside); + const eleRef = computed(() => { + const ele = unref(refEle); + return ele instanceof Element ? ele : (ele?.$el as Element); + }); + const isHover = useElementHover(eleRef); + isHovers.push(isHover); }); - const isOutsideAll = computed(() => isOutsides.every((v) => v.value)); + const isOutsideAll = computed(() => isHovers.every((v) => !v.value)); function setValueDelay(val: boolean) { timer.value && clearTimeout(timer.value); diff --git a/packages/effects/plugins/package.json b/packages/effects/plugins/package.json index 997e6601..5c29e0f5 100644 --- a/packages/effects/plugins/package.json +++ b/packages/effects/plugins/package.json @@ -21,6 +21,10 @@ "./vxe-table": { "types": "./src/vxe-table/index.ts", "default": "./src/vxe-table/index.ts" + }, + "./motion": { + "types": "./src/motion/index.ts", + "default": "./src/motion/index.ts" } }, "dependencies": { @@ -34,6 +38,7 @@ "@vben/types": "workspace:*", "@vben/utils": "workspace:*", "@vueuse/core": "catalog:", + "@vueuse/motion": "catalog:", "echarts": "catalog:", "vue": "catalog:", "vxe-pc-ui": "catalog:", diff --git a/packages/effects/plugins/src/motion/index.ts b/packages/effects/plugins/src/motion/index.ts new file mode 100644 index 00000000..021465aa --- /dev/null +++ b/packages/effects/plugins/src/motion/index.ts @@ -0,0 +1,8 @@ +export * from './types'; + +export { + MotionComponent as Motion, + MotionDirective, + MotionGroupComponent as MotionGroup, + MotionPlugin, +} from '@vueuse/motion'; diff --git a/packages/effects/plugins/src/motion/types.ts b/packages/effects/plugins/src/motion/types.ts new file mode 100644 index 00000000..f08bf21e --- /dev/null +++ b/packages/effects/plugins/src/motion/types.ts @@ -0,0 +1,26 @@ +export const MotionPresets = [ + 'fade', + 'fadeVisible', + 'fadeVisibleOnce', + 'rollBottom', + 'rollLeft', + 'rollRight', + 'rollTop', + 'rollVisibleBottom', + 'rollVisibleLeft', + 'rollVisibleRight', + 'rollVisibleTop', + 'pop', + 'popVisible', + 'popVisibleOnce', + 'slideBottom', + 'slideLeft', + 'slideRight', + 'slideTop', + 'slideVisibleBottom', + 'slideVisibleLeft', + 'slideVisibleRight', + 'slideVisibleTop', +] as const; + +export type MotionPreset = (typeof MotionPresets)[number]; diff --git a/packages/locales/src/langs/en-US/ui.json b/packages/locales/src/langs/en-US/ui.json index d2a3d1cb..0afba7d5 100644 --- a/packages/locales/src/langs/en-US/ui.json +++ b/packages/locales/src/langs/en-US/ui.json @@ -25,6 +25,10 @@ "placeholder": "Select an icon", "search": "Search icon..." }, + "jsonViewer": { + "copy": "Copy", + "copied": "Copied" + }, "fallback": { "pageNotFound": "Oops! Page Not Found", "pageNotFoundDesc": "Sorry, we couldn't find the page you were looking for.", diff --git a/packages/locales/src/langs/zh-CN/ui.json b/packages/locales/src/langs/zh-CN/ui.json index 1d30d1d7..5ffae7b7 100644 --- a/packages/locales/src/langs/zh-CN/ui.json +++ b/packages/locales/src/langs/zh-CN/ui.json @@ -25,6 +25,10 @@ "placeholder": "选择一个图标", "search": "搜索图标..." }, + "jsonViewer": { + "copy": "复制", + "copied": "已复制" + }, "fallback": { "pageNotFound": "哎呀!未找到页面", "pageNotFoundDesc": "抱歉,我们无法找到您要找的页面。", diff --git a/playground/src/api/core/auth.ts b/playground/src/api/core/auth.ts index 71d9f994..b4627cbe 100644 --- a/playground/src/api/core/auth.ts +++ b/playground/src/api/core/auth.ts @@ -22,23 +22,29 @@ export namespace AuthApi { * 登录 */ export async function loginApi(data: AuthApi.LoginParams) { - return requestClient.post('/auth/login', data); + return requestClient.post('/auth/login', data, { + withCredentials: true, + }); } /** * 刷新accessToken */ export async function refreshTokenApi() { - return baseRequestClient.post('/auth/refresh', { - withCredentials: true, - }); + return baseRequestClient.post( + '/auth/refresh', + null, + { + withCredentials: true, + }, + ); } /** * 退出登录 */ export async function logoutApi() { - return baseRequestClient.post('/auth/logout', { + return baseRequestClient.post('/auth/logout', null, { withCredentials: true, }); } diff --git a/playground/src/api/request.ts b/playground/src/api/request.ts index 288dddd0..f674859a 100644 --- a/playground/src/api/request.ts +++ b/playground/src/api/request.ts @@ -111,3 +111,9 @@ export const requestClient = createRequestClient(apiURL, { }); export const baseRequestClient = new RequestClient({ baseURL: apiURL }); + +export interface PageFetchParams { + [key: string]: any; + pageNo?: number; + pageSize?: number; +} diff --git a/playground/src/bootstrap.ts b/playground/src/bootstrap.ts index b0c44175..bfa6e4cb 100644 --- a/playground/src/bootstrap.ts +++ b/playground/src/bootstrap.ts @@ -2,6 +2,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; import { initTippy } from '@vben/common-ui'; +import { MotionPlugin } from '@vben/plugins/motion'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -49,6 +50,9 @@ async function bootstrap(namespace: string) { // 配置@tanstack/vue-query app.use(VueQueryPlugin); + // 配置Motion插件 + app.use(MotionPlugin); + // 动态更新标题 watchEffect(() => { if (preferences.app.dynamicTitle) { diff --git a/playground/src/router/routes/modules/examples.ts b/playground/src/router/routes/modules/examples.ts index 7287f0dd..cc86838e 100644 --- a/playground/src/router/routes/modules/examples.ts +++ b/playground/src/router/routes/modules/examples.ts @@ -255,6 +255,33 @@ const routes: RouteRecordRaw[] = [ title: 'Tippy', }, }, + { + name: 'JsonViewer', + path: '/examples/json-viewer', + component: () => import('#/views/examples/json-viewer/index.vue'), + meta: { + icon: 'tabler:json', + title: 'JsonViewer', + }, + }, + { + name: 'Motion', + path: '/examples/motion', + component: () => import('#/views/examples/motion/index.vue'), + meta: { + icon: 'mdi:animation-play', + title: 'Motion', + }, + }, + { + name: 'CountTo', + path: '/examples/count-to', + component: () => import('#/views/examples/count-to/index.vue'), + meta: { + icon: 'mdi:animation-play', + title: 'CountTo', + }, + }, ], }, ]; diff --git a/playground/src/views/examples/count-to/index.vue b/playground/src/views/examples/count-to/index.vue new file mode 100644 index 00000000..ef690e9c --- /dev/null +++ b/playground/src/views/examples/count-to/index.vue @@ -0,0 +1,178 @@ + + diff --git a/playground/src/views/examples/json-viewer/data.ts b/playground/src/views/examples/json-viewer/data.ts new file mode 100644 index 00000000..2767e079 --- /dev/null +++ b/playground/src/views/examples/json-viewer/data.ts @@ -0,0 +1,66 @@ +export const json1 = { + additionalInfo: { + author: 'Your Name', + debug: true, + version: '1.3.10', + versionCode: 132, + }, + additionalNotes: 'This JSON is used for demonstration purposes', + tools: [ + { + description: 'Description of Tool 1', + name: 'Tool 1', + }, + { + description: 'Description of Tool 2', + name: 'Tool 2', + }, + { + description: 'Description of Tool 3', + name: 'Tool 3', + }, + { + description: 'Description of Tool 4', + name: 'Tool 4', + }, + ], +}; + +export const json2 = JSON.parse(` + { + "id": "chatcmpl-123", + "object": "chat.completion", + "created": 1677652288, + "model": "gpt-3.5-turbo-0613", + "system_fingerprint": "fp_44709d6fcb", + "choices": [{ + "index": 0, + "message": { + "role": "assistant", + "content": "Hello there, how may I assist you today?" + }, + "finish_reason": "stop" + }], + "usage": { + "prompt_tokens": 9, + "completion_tokens": 12, + "total_tokens": 21, + "debug_mode": true + }, + "debug": { + "startAt": "2021-08-01T00:00:00Z", + "logs": [ + { + "timestamp": "2021-08-01T00:00:00Z", + "message": "This is a debug message", + "extra":[ "extra1", "extra2" ] + }, + { + "timestamp": "2021-08-01T00:00:01Z", + "message": "This is another debug message", + "extra":[ "extra3", "extra4" ] + } + ] + } +} + `); diff --git a/playground/src/views/examples/json-viewer/index.vue b/playground/src/views/examples/json-viewer/index.vue new file mode 100644 index 00000000..a91e042d --- /dev/null +++ b/playground/src/views/examples/json-viewer/index.vue @@ -0,0 +1,51 @@ + + diff --git a/playground/src/views/examples/motion/index.vue b/playground/src/views/examples/motion/index.vue new file mode 100644 index 00000000..1faaa23b --- /dev/null +++ b/playground/src/views/examples/motion/index.vue @@ -0,0 +1,213 @@ + + diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 938f786d..de103d40 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -21,22 +21,22 @@ catalog: '@commitlint/cli': ^19.7.1 '@commitlint/config-conventional': ^19.7.1 '@ctrl/tinycolor': ^4.1.0 - '@eslint/js': ^9.19.0 - '@faker-js/faker': ^9.4.0 - '@iconify/json': ^2.2.302 + '@eslint/js': ^9.20.0 + '@faker-js/faker': ^9.5.0 + '@iconify/json': ^2.2.307 '@iconify/tailwind': ^1.2.0 '@iconify/vue': ^4.3.0 - '@intlify/core-base': ^11.1.0 + '@intlify/core-base': ^11.1.1 '@intlify/unplugin-vue-i18n': ^6.0.3 - '@jspm/generator': ^2.4.2 + '@jspm/generator': ^2.5.0 '@manypkg/get-packages': ^2.2.2 - '@nolebase/vitepress-plugin-git-changelog': ^2.12.1 + '@nolebase/vitepress-plugin-git-changelog': ^2.14.0 '@playwright/test': ^1.50.1 '@pnpm/workspace.read-manifest': ^1000.0.2 '@stylistic/stylelint-plugin': ^3.1.1 '@tailwindcss/nesting': 0.0.0-insiders.565cd3e '@tailwindcss/typography': ^0.5.16 - '@tanstack/vue-query': ^5.65.0 + '@tanstack/vue-query': ^5.66.3 '@tanstack/vue-store': ^0.7.0 '@types/archiver': ^6.0.3 '@types/eslint': ^9.6.1 @@ -45,13 +45,13 @@ catalog: '@types/lodash.clonedeep': ^4.5.9 '@types/lodash.get': ^4.4.9 '@types/lodash.isequal': ^4.5.8 - '@types/node': ^22.13.1 + '@types/node': ^22.13.4 '@types/nprogress': ^0.2.3 '@types/postcss-import': ^14.0.3 '@types/qrcode': ^1.5.5 '@types/sortablejs': ^1.15.8 - '@typescript-eslint/eslint-plugin': ^8.23.0 - '@typescript-eslint/parser': ^8.23.0 + '@typescript-eslint/eslint-plugin': ^8.24.0 + '@typescript-eslint/parser': ^8.24.0 '@vee-validate/zod': ^4.15.0 '@vite-pwa/vitepress': ^0.5.3 '@vitejs/plugin-vue': ^5.2.1 @@ -59,8 +59,9 @@ catalog: '@vue/reactivity': ^3.5.13 '@vue/shared': ^3.5.13 '@vue/test-utils': ^2.4.6 - '@vueuse/core': ^12.5.0 - '@vueuse/integrations': ^12.5.0 + '@vueuse/core': ^12.7.0 + '@vueuse/motion': ^2.2.6 + '@vueuse/integrations': ^12.7.0 ant-design-vue: ^4.2.6 archiver: ^7.0.1 autoprefixer: ^10.4.20 @@ -84,9 +85,9 @@ catalog: depcheck: ^1.4.7 dotenv: ^16.4.7 echarts: ^5.6.0 - element-plus: ^2.9.3 - eslint: ^9.19.0 - eslint-config-turbo: ^2.4.0 + element-plus: ^2.9.4 + eslint: ^9.20.1 + eslint-config-turbo: ^2.4.2 eslint-plugin-command: ^0.2.7 eslint-plugin-eslint-comments: ^3.2.0 eslint-plugin-import-x: ^4.6.1 @@ -94,7 +95,7 @@ catalog: eslint-plugin-jsonc: ^2.19.1 eslint-plugin-n: ^17.15.1 eslint-plugin-no-only-tests: ^3.3.0 - eslint-plugin-perfectionist: ^4.8.0 + eslint-plugin-perfectionist: ^4.9.0 eslint-plugin-prettier: ^5.2.3 eslint-plugin-regexp: ^2.7.0 eslint-plugin-unicorn: ^56.0.1 @@ -104,8 +105,8 @@ catalog: execa: ^9.5.2 find-up: ^7.0.0 get-port: ^7.1.0 - globals: ^15.14.0 - h3: ^1.14.0 + globals: ^15.15.0 + h3: ^1.15.0 happy-dom: ^16.8.1 html-minifier-terser: ^7.2.0 husky: ^9.1.7 @@ -126,22 +127,22 @@ catalog: pinia-plugin-persistedstate: ^4.2.0 pkg-types: ^1.3.1 playwright: ^1.50.1 - postcss: ^8.5.1 + postcss: ^8.5.2 postcss-antd-fixes: ^0.2.0 postcss-html: ^1.8.0 postcss-import: ^16.1.0 - postcss-preset-env: ^10.1.3 + postcss-preset-env: ^10.1.4 postcss-scss: ^4.0.9 - prettier: ^3.4.2 + prettier: ^3.5.1 prettier-plugin-tailwindcss: ^0.6.11 publint: ^0.2.12 qrcode: ^1.5.4 - radix-vue: ^1.9.13 + radix-vue: ^1.9.14 resolve.exports: ^2.0.3 rimraf: ^6.0.1 - rollup: ^4.34.2 + rollup: ^4.34.7 rollup-plugin-visualizer: ^5.14.0 - sass: ^1.83.4 + sass: ^1.85.0 sortablejs: ^1.15.6 stylelint: ^16.14.1 stylelint-config-recess-order: ^5.1.1 @@ -157,29 +158,30 @@ catalog: tailwindcss-animate: ^1.0.7 theme-colors: ^0.1.0 tippy.js: ^6.2.5 - turbo: ^2.4.0 + turbo: ^2.4.2 typescript: ^5.7.3 unbuild: ^3.3.1 - unplugin-element-plus: ^0.9.0 + unplugin-element-plus: ^0.9.1 vee-validate: ^4.15.0 - vite: ^6.0.11 + vite: ^6.1.0 vite-plugin-compression: ^0.5.1 vite-plugin-dts: ^4.5.0 vite-plugin-html: ^3.2.2 vite-plugin-lazy-import: ^1.0.7 vite-plugin-pwa: ^0.21.1 - vite-plugin-vue-devtools: ^7.7.1 + vite-plugin-vue-devtools: ^7.7.2 vitepress: ^1.6.3 vitepress-plugin-group-icons: ^1.3.5 vitest: ^2.1.9 vue: ^3.5.13 vue-eslint-parser: ^9.4.3 - vue-i18n: ^11.1.0 + vue-i18n: ^11.1.1 + vue-json-viewer: ^3.0.4 vue-router: ^4.5.0 vue-tippy: ^6.6.0 vue-tsc: 2.1.10 - vxe-pc-ui: ^4.3.79 + vxe-pc-ui: ^4.3.87 vxe-table: 4.10.0 - watermark-js-plus: ^1.5.7 - zod: ^3.24.1 + watermark-js-plus: ^1.5.8 + zod: ^3.24.2 zod-defaults: ^0.1.3