Просмотр исходного кода

Merge branch 'main' into milletpeak-fontsize

milletpeak 6 месяцев назад
Родитель
Сommit
1f1ba16ead
40 измененных файлов с 257 добавлено и 382 удалено
  1. 1 1
      apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue
  2. 1 1
      apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue
  3. 1 1
      apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue
  4. 1 4
      apps/web-tdesign/package.json
  5. 1 1
      apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue
  6. 1 0
      cspell.json
  7. 1 1
      docs/.vitepress/config/plugins/demo-preview.ts
  8. 1 1
      internal/lint-configs/commitlint-config/index.mjs
  9. 0 1
      internal/lint-configs/eslint-config/src/configs/command.ts
  10. 1 1
      internal/lint-configs/eslint-config/src/configs/node.ts
  11. 0 1
      internal/lint-configs/eslint-config/src/configs/perfectionist.ts
  12. 0 1
      internal/lint-configs/eslint-config/src/configs/turbo.ts
  13. 3 4
      internal/lint-configs/eslint-config/src/configs/typescript.ts
  14. 0 1
      internal/lint-configs/eslint-config/src/configs/vue.ts
  15. 3 0
      internal/lint-configs/eslint-config/tsconfig.json
  16. 1 0
      internal/tailwind-config/package.json
  17. 1 1
      internal/vite-config/src/config/application.ts
  18. 5 5
      package.json
  19. 0 2
      packages/@core/base/design/src/design-tokens/index.ts
  20. 0 2
      packages/@core/base/design/src/index.ts
  21. 2 6
      packages/@core/preferences/src/preferences.ts
  22. 10 8
      packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts
  23. 9 2
      packages/@core/ui-kit/popup-ui/src/modal/modal.vue
  24. 6 2
      packages/@core/ui-kit/popup-ui/src/modal/use-modal-draggable.ts
  25. 8 1
      packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuSubContent.vue
  26. 8 1
      packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuSubContent.vue
  27. 2 2
      packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue
  28. 1 9
      packages/effects/common-ui/src/components/icon-picker/icon-picker.vue
  29. 3 7
      packages/effects/common-ui/src/components/json-viewer/index.vue
  30. 4 6
      packages/effects/common-ui/src/components/resize/resize.vue
  31. 20 6
      packages/effects/hooks/src/use-pagination.ts
  32. 2 2
      packages/effects/layouts/src/basic/header/header.vue
  33. 1 1
      packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue
  34. 1 1
      packages/stores/shim-pinia.d.ts
  35. 1 1
      packages/stores/src/modules/tabbar.ts
  36. 1 1
      packages/utils/src/helpers/generate-menus.ts
  37. 1 1
      playground/src/views/dashboard/analytics/analytics-visits-sales.vue
  38. 1 2
      playground/src/views/system/menu/modules/form.vue
  39. 138 280
      pnpm-lock.yaml
  40. 16 14
      pnpm-workspace.yaml

+ 1 - 1
apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue

@@ -24,7 +24,7 @@ onMounted(() => {
           { name: '定制', value: 310 },
           { name: '技术支持', value: 274 },
           { name: '远程', value: 400 },
-        ].sort((a, b) => {
+        ].toSorted((a, b) => {
           return a.value - b.value;
         }),
         name: '商业占比',

+ 1 - 1
apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue

@@ -24,7 +24,7 @@ onMounted(() => {
           { name: '定制', value: 310 },
           { name: '技术支持', value: 274 },
           { name: '远程', value: 400 },
-        ].sort((a, b) => {
+        ].toSorted((a, b) => {
           return a.value - b.value;
         }),
         name: '商业占比',

+ 1 - 1
apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue

@@ -24,7 +24,7 @@ onMounted(() => {
           { name: '定制', value: 310 },
           { name: '技术支持', value: 274 },
           { name: '远程', value: 400 },
-        ].sort((a, b) => {
+        ].toSorted((a, b) => {
           return a.value - b.value;
         }),
         name: '商业占比',

+ 1 - 4
apps/web-tdesign/package.json

@@ -44,11 +44,8 @@
     "dayjs": "catalog:",
     "es-toolkit": "catalog:",
     "pinia": "catalog:",
-    "tdesign-vue-next": "^1.17.1",
+    "tdesign-vue-next": "catalog:",
     "vue": "catalog:",
     "vue-router": "catalog:"
-  },
-  "devDependencies": {
-    "@types/lodash-es": "^4.17.12"
   }
 }

+ 1 - 1
apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue

@@ -24,7 +24,7 @@ onMounted(() => {
           { name: '定制', value: 310 },
           { name: '技术支持', value: 274 },
           { name: '远程', value: 400 },
-        ].sort((a, b) => {
+        ].toSorted((a, b) => {
           return a.value - b.value;
         }),
         name: '商业占比',

+ 1 - 0
cspell.json

@@ -42,6 +42,7 @@
     "sortablejs",
     "styl",
     "taze",
+    "tdesign",
     "ui-kit",
     "uicons",
     "unplugin",

+ 1 - 1
docs/.vitepress/config/plugins/demo-preview.ts

@@ -84,7 +84,7 @@ export const demoPreviewPlugin = (md: MarkdownRenderer) => {
         return '';
       }
       const firstString = 'index.vue';
-      childFiles = childFiles.sort((a, b) => {
+      childFiles = childFiles.toSorted((a, b) => {
         if (a === firstString) return -1;
         if (b === firstString) return 1;
         return a.localeCompare(b, 'en', { sensitivity: 'base' });

+ 1 - 1
internal/lint-configs/commitlint-config/index.mjs

@@ -21,7 +21,7 @@ const scopeComplete = execSync('git status --porcelain || true')
   .trim()
   .split('\n')
   .find((r) => ~r.indexOf('M  src'))
-  ?.replace(/(\/)/g, '%%')
+  ?.replaceAll(/(\/)/g, '%%')
   ?.match(/src%%((\w|-)*)/)?.[1]
   ?.replace(/s$/, '');
 

+ 0 - 1
internal/lint-configs/eslint-config/src/configs/command.ts

@@ -3,7 +3,6 @@ import createCommand from 'eslint-plugin-command/config';
 export async function command() {
   return [
     {
-      // @ts-expect-error - no types
       ...createCommand(),
     },
   ];

+ 1 - 1
internal/lint-configs/eslint-config/src/configs/node.ts

@@ -35,7 +35,7 @@ export async function node(): Promise<Linter.Config[]> {
           'error',
           {
             ignores: [],
-            version: '>=18.0.0',
+            version: '>=20.12.0',
           },
         ],
         'n/prefer-global/buffer': ['error', 'never'],

+ 0 - 1
internal/lint-configs/eslint-config/src/configs/perfectionist.ts

@@ -4,7 +4,6 @@ import { interopDefault } from '../util';
 
 export async function perfectionist(): Promise<Linter.Config[]> {
   const perfectionistPlugin = await interopDefault(
-    // @ts-expect-error - no types
     import('eslint-plugin-perfectionist'),
   );
 

+ 0 - 1
internal/lint-configs/eslint-config/src/configs/turbo.ts

@@ -4,7 +4,6 @@ import { interopDefault } from '../util';
 
 export async function turbo(): Promise<Linter.Config[]> {
   const [pluginTurbo] = await Promise.all([
-    // @ts-expect-error - no types
     interopDefault(import('eslint-config-turbo')),
   ] as const);
 

+ 3 - 4
internal/lint-configs/eslint-config/src/configs/typescript.ts

@@ -5,7 +5,6 @@ import { interopDefault } from '../util';
 export async function typescript(): Promise<Linter.Config[]> {
   const [pluginTs, parserTs] = await Promise.all([
     interopDefault(import('@typescript-eslint/eslint-plugin')),
-    // @ts-expect-error missing types
     interopDefault(import('@typescript-eslint/parser')),
   ] as const);
 
@@ -27,11 +26,11 @@ export async function typescript(): Promise<Linter.Config[]> {
         },
       },
       plugins: {
-        '@typescript-eslint': pluginTs,
+        '@typescript-eslint': pluginTs as any,
       },
       rules: {
-        ...pluginTs.configs['eslint-recommended'].overrides?.[0].rules,
-        ...pluginTs.configs.strict.rules,
+        ...pluginTs.configs['eslint-recommended']?.overrides?.[0]?.rules,
+        ...pluginTs.configs.strict?.rules,
         '@typescript-eslint/ban-ts-comment': [
           'error',
           {

+ 0 - 1
internal/lint-configs/eslint-config/src/configs/vue.ts

@@ -6,7 +6,6 @@ export async function vue(): Promise<Linter.Config[]> {
   const [pluginVue, parserVue, parserTs] = await Promise.all([
     interopDefault(import('eslint-plugin-vue')),
     interopDefault(import('vue-eslint-parser')),
-    // @ts-expect-error missing types
     interopDefault(import('@typescript-eslint/parser')),
   ] as const);
 

+ 3 - 0
internal/lint-configs/eslint-config/tsconfig.json

@@ -1,6 +1,9 @@
 {
   "$schema": "https://json.schemastore.org/tsconfig",
   "extends": "@vben/tsconfig/node.json",
+  "compilerOptions": {
+    "moduleResolution": "bundler"
+  },
   "include": ["src"],
   "exclude": ["node_modules"]
 }

+ 1 - 0
internal/tailwind-config/package.json

@@ -53,6 +53,7 @@
     "@tailwindcss/typography": "catalog:",
     "autoprefixer": "catalog:",
     "cssnano": "catalog:",
+    "jiti": "catalog:",
     "postcss": "catalog:",
     "postcss-antd-fixes": "catalog:",
     "postcss-import": "catalog:",

+ 1 - 1
internal/vite-config/src/config/application.ts

@@ -114,7 +114,7 @@ function createCssOptions(injectGlobalScss = true): CSSOptions {
               }
               return content;
             },
-            api: 'modern',
+            // api: 'modern',
             importers: [new NodePackageImporter()],
           },
         }

+ 5 - 5
package.json

@@ -93,14 +93,14 @@
     "unbuild": "catalog:",
     "vite": "catalog:",
     "vitest": "catalog:",
-    "vue": "^3.5.24",
+    "vue": "catalog:",
     "vue-tsc": "catalog:"
   },
   "engines": {
-    "node": ">=20.10.0",
-    "pnpm": ">=9.12.0"
+    "node": ">=20.12.0",
+    "pnpm": ">=10.0.0"
   },
-  "packageManager": "pnpm@10.21.0",
+  "packageManager": "pnpm@10.22.0",
   "pnpm": {
     "peerDependencyRules": {
       "allowedVersions": {
@@ -112,7 +112,7 @@
       "@ctrl/tinycolor": "catalog:",
       "clsx": "catalog:",
       "esbuild": "0.25.3",
-      "jiti": "^2.6.1",
+      "jiti": "catalog:",
       "pinia": "catalog:",
       "vue": "catalog:"
     },

+ 0 - 2
packages/@core/base/design/src/design-tokens/index.ts

@@ -1,4 +1,2 @@
 import './default.css';
 import './dark.css';
-
-export {};

+ 0 - 2
packages/@core/base/design/src/index.ts

@@ -4,5 +4,3 @@ import './css/global.css';
 import './css/transition.css';
 import './css/nprogress.css';
 import './css/ui.css';
-
-export {};

+ 2 - 6
packages/@core/preferences/src/preferences.ts

@@ -224,12 +224,8 @@ class PreferenceManager {
       const dom = document.documentElement;
       const COLOR_WEAK = 'invert-mode';
       const COLOR_GRAY = 'grayscale-mode';
-      colorWeakMode
-        ? dom.classList.add(COLOR_WEAK)
-        : dom.classList.remove(COLOR_WEAK);
-      colorGrayMode
-        ? dom.classList.add(COLOR_GRAY)
-        : dom.classList.remove(COLOR_GRAY);
+      dom.classList.toggle(COLOR_WEAK, colorWeakMode);
+      dom.classList.toggle(COLOR_GRAY, colorGrayMode);
     }
   }
 }

+ 10 - 8
packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts

@@ -144,24 +144,26 @@ export async function vbenPrompt<T = any>(
 
   const modelValue = ref<T | undefined>(defaultValue);
   const inputComponentRef = ref<null | VNode>(null);
-  const staticContents: Component[] = [];
-
-  staticContents.push(h(VbenRenderContent, { content, renderBr: true }));
+  const staticContents: Component[] = [
+    h(VbenRenderContent, { content, renderBr: true }),
+  ];
 
   const modelPropName = _modelPropName || 'modelValue';
   const componentProps = { ..._componentProps };
 
   // 每次渲染时都会重新计算的内容函数
   const contentRenderer = () => {
-    const currentProps = { ...componentProps };
+    const currentProps = {
+      ...componentProps,
+      [modelPropName]: modelValue.value,
+      [`onUpdate:${modelPropName}`]: (val: T) => {
+        modelValue.value = val;
+      },
+    };
 
     // 设置当前值
-    currentProps[modelPropName] = modelValue.value;
 
     // 设置更新处理函数
-    currentProps[`onUpdate:${modelPropName}`] = (val: T) => {
-      modelValue.value = val;
-    };
 
     // 创建输入组件
     inputComponentRef.value = h(

+ 9 - 2
packages/@core/ui-kit/popup-ui/src/modal/modal.vue

@@ -104,6 +104,10 @@ const shouldDraggable = computed(
   () => draggable.value && !shouldFullscreen.value && header.value,
 );
 
+const shouldCentered = computed(
+  () => centered.value && !shouldFullscreen.value,
+);
+
 const getAppendTo = computed(() => {
   return appendToMain.value
     ? `#${ELEMENT_ID_MAIN_CONTENT}>div:not(.absolute)>div`
@@ -115,6 +119,7 @@ const { dragging, transform } = useModalDraggable(
   headerRef,
   shouldDraggable,
   getAppendTo,
+  shouldCentered,
 );
 
 const firstOpened = ref(false);
@@ -132,7 +137,9 @@ watch(
       dialogRef.value = innerContentRef.$el;
       // reopen modal reassign value
       const { offsetX, offsetY } = transform;
-      dialogRef.value.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
+      dialogRef.value.style.transform = shouldCentered.value
+        ? `translate(${offsetX}px, calc(-50% + ${offsetY}px))`
+        : `translate(${offsetX}px, ${offsetY}px)`;
     }
   },
   { immediate: true },
@@ -239,7 +246,7 @@ function handleClosed() {
             'shadow-3xl': !bordered,
             'left-0 top-0 size-full max-h-full !translate-x-0 !translate-y-0':
               shouldFullscreen,
-            'top-1/2 !-translate-y-1/2': centered && !shouldFullscreen,
+            'top-1/2': centered && !shouldFullscreen,
             'duration-300': !dragging,
             hidden: isClosed,
           },

+ 6 - 2
packages/@core/ui-kit/popup-ui/src/modal/use-modal-draggable.ts

@@ -14,6 +14,7 @@ export function useModalDraggable(
   dragRef: Ref<HTMLElement | undefined>,
   draggable: ComputedRef<boolean>,
   containerSelector?: ComputedRef<string | undefined>,
+  centered?: ComputedRef<boolean>,
 ) {
   const transform = reactive({
     offsetX: 0,
@@ -73,7 +74,10 @@ export function useModalDraggable(
       transform.offsetY = moveY;
 
       if (targetRef.value) {
-        targetRef.value.style.transform = `translate(${moveX}px, ${moveY}px)`;
+        const isCentered = centered?.value;
+        targetRef.value.style.transform = isCentered
+          ? `translate(${moveX}px, calc(-50% + ${moveY}px))`
+          : `translate(${moveX}px, ${moveY}px)`;
         dragging.value = true;
       }
     };
@@ -108,7 +112,7 @@ export function useModalDraggable(
 
     const target = unrefElement(targetRef);
     if (target) {
-      target.style.transform = 'none';
+      target.style.transform = '';
     }
   };
 

+ 8 - 1
packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuSubContent.vue

@@ -27,7 +27,14 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
     v-bind="forwarded"
     :class="
       cn(
-        'z-50 min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
+        'z-50 min-w-32 overflow-hidden rounded-md',
+        'border border-border',
+        'bg-popover p-1 text-popover-foreground shadow-lg',
+        'data-[state=open]:animate-in data-[state=closed]:animate-out',
+        'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
+        'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
+        'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',
+        'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
         props.class,
       )
     "

+ 8 - 1
packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuSubContent.vue

@@ -27,7 +27,14 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
     v-bind="forwarded"
     :class="
       cn(
-        'z-50 min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
+        'z-50 min-w-32 overflow-hidden rounded-md',
+        'border border-border',
+        'bg-popover p-1 text-popover-foreground shadow-lg',
+        'data-[state=open]:animate-in data-[state=closed]:animate-out',
+        'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
+        'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
+        'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',
+        'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
         props.class,
       )
     "

+ 2 - 2
packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue

@@ -220,7 +220,7 @@ function onSelect(item: FlattenedItem<Recordable<any>>, isSelected: boolean) {
         );
       })
       ?.parents?.filter((item) => !get(item, props.disabledField))
-      ?.reverse()
+      ?.toReversed()
       .forEach((p) => {
         const children = flattenData.value.filter((i) => {
           return (
@@ -380,7 +380,7 @@ defineExpose({
         <div class="flex items-center gap-1">
           <Checkbox
             v-if="multiple"
-            :checked="isSelected && !isNodeDisabled(item)"
+            :model-value="isSelected && !isNodeDisabled(item)"
             :disabled="isNodeDisabled(item)"
             :indeterminate="isIndeterminate && !isNodeDisabled(item)"
             @click="

+ 1 - 9
packages/effects/common-ui/src/components/icon-picker/icon-picker.vue

@@ -71,17 +71,10 @@ const modelValue = defineModel({ default: '', type: String });
 
 const visible = ref(false);
 const currentSelect = ref('');
-const currentPage = ref(1);
 const keyword = ref('');
 const keywordDebounce = refDebounced(keyword, 300);
 const innerIcons = ref<string[]>([]);
 
-/* 当检索关键词变化时,重置分页 */
-watch(keywordDebounce, () => {
-  currentPage.value = 1;
-  setCurrentPage(1);
-});
-
 watchDebounced(
   () => props.prefix,
   async (prefix) => {
@@ -122,7 +115,7 @@ const showList = computed(() => {
   );
 });
 
-const { paginationList, total, setCurrentPage } = usePagination(
+const { paginationList, total, setCurrentPage, currentPage } = usePagination(
   showList,
   props.pageSize,
 );
@@ -145,7 +138,6 @@ const handleClick = (icon: string) => {
 };
 
 const handlePageChange = (page: number) => {
-  currentPage.value = page;
   setCurrentPage(page);
 };
 

+ 3 - 7
packages/effects/common-ui/src/components/json-viewer/index.vue

@@ -55,16 +55,12 @@ function handleClick(event: MouseEvent) {
       return;
     }
     const param: JsonViewerValue = {
-      path: '',
-      value: '',
-      depth: 0,
       el: event.target,
+      path: pathNode.getAttribute('path') || '',
+      depth: Number(pathNode.getAttribute('depth')) || 0,
+      value: event.target.textContent || undefined,
     };
 
-    param.path = pathNode.getAttribute('path') || '';
-    param.depth = Number(pathNode.getAttribute('depth')) || 0;
-
-    param.value = event.target.textContent || undefined;
     param.value = JSON.parse(param.value);
     emit('valueClick', param);
   }

+ 4 - 6
packages/effects/common-ui/src/components/resize/resize.vue

@@ -618,13 +618,11 @@ const stickStyles = computed(() => (stick: string) => {
   const stickStyle = {
     width: `${stickSize.value / parentScaleX.value}px`,
     height: `${stickSize.value / parentScaleY.value}px`,
+    [styleMapping.y[stick[0] as 'b' | 'm' | 't'] as 'height' | 'width']:
+      `${stickSize.value / parentScaleX.value / -2}px`,
+    [styleMapping.x[stick[1] as 'l' | 'm' | 'r'] as 'height' | 'width']:
+      `${stickSize.value / parentScaleX.value / -2}px`,
   };
-  stickStyle[
-    styleMapping.y[stick[0] as 'b' | 'm' | 't'] as 'height' | 'width'
-  ] = `${stickSize.value / parentScaleX.value / -2}px`;
-  stickStyle[
-    styleMapping.x[stick[1] as 'l' | 'm' | 'r'] as 'height' | 'width'
-  ] = `${stickSize.value / parentScaleX.value / -2}px`;
   return stickStyle;
 });
 

+ 20 - 6
packages/effects/hooks/src/use-pagination.ts

@@ -1,6 +1,6 @@
 import type { Ref } from 'vue';
 
-import { computed, ref, unref } from 'vue';
+import { computed, ref, unref, watch } from 'vue';
 
 /**
  * Paginates an array of items
@@ -22,7 +22,11 @@ function pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {
   return ret;
 }
 
-export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
+export function usePagination<T = any>(
+  list: Ref<T[]>,
+  pageSize: number,
+  totalChangeToFirstPage = true,
+) {
   const currentPage = ref(1);
   const pageSizeRef = ref(pageSize);
 
@@ -38,11 +42,21 @@ export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
     return unref(list).length;
   });
 
+  if (totalChangeToFirstPage) {
+    watch(total, () => {
+      setCurrentPage(1);
+    });
+  }
+
   function setCurrentPage(page: number) {
-    if (page < 1 || page > unref(totalPages)) {
-      throw new Error('Invalid page number');
+    if (page === 1 && unref(totalPages) === 0) {
+      currentPage.value = 1;
+    } else {
+      if (page < 1 || page > unref(totalPages)) {
+        throw new Error('Invalid page number');
+      }
+      currentPage.value = page;
     }
-    currentPage.value = page;
   }
 
   function setPageSize(pageSize: number) {
@@ -54,5 +68,5 @@ export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
     currentPage.value = 1;
   }
 
-  return { setCurrentPage, total, setPageSize, paginationList };
+  return { setCurrentPage, total, setPageSize, paginationList, currentPage };
 }

+ 2 - 2
packages/effects/layouts/src/basic/header/header.vue

@@ -92,7 +92,7 @@ const rightSlots = computed(() => {
       list.push({ index: Number(name[2]), name: key });
     }
   });
-  return list.sort((a, b) => a.index - b.index);
+  return list.toSorted((a, b) => a.index - b.index);
 });
 
 const leftSlots = computed(() => {
@@ -111,7 +111,7 @@ const leftSlots = computed(() => {
       list.push({ index: Number(name[2]), name: key });
     }
   });
-  return list.sort((a, b) => a.index - b.index);
+  return list.toSorted((a, b) => a.index - b.index);
 });
 
 function clearPreferencesAndLogout() {

+ 1 - 1
packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue

@@ -66,7 +66,7 @@ function toggleTheme(event: MouseEvent) {
     ];
     const animate = document.documentElement.animate(
       {
-        clipPath: isDark.value ? [...clipPath].reverse() : clipPath,
+        clipPath: isDark.value ? [...clipPath].toReversed() : clipPath,
       },
       {
         duration: 450,

+ 1 - 1
packages/stores/shim-pinia.d.ts

@@ -6,4 +6,4 @@ declare module 'pinia' {
   ): (newModule: any) => any;
 }
 
-export {};
+export { acceptHMRUpdate };

+ 1 - 1
packages/stores/src/modules/tabbar.ts

@@ -504,7 +504,7 @@ export const useTabbarStore = defineStore('core-tabbar', {
     affixTabs(): TabDefinition[] {
       const affixTabs = this.tabs.filter((tab) => isAffixTab(tab));
 
-      return affixTabs.sort((a, b) => {
+      return affixTabs.toSorted((a, b) => {
         const orderA = (a.meta?.affixTabOrder ?? 0) as number;
         const orderB = (b.meta?.affixTabOrder ?? 0) as number;
         return orderA - orderB;

+ 1 - 1
packages/utils/src/helpers/generate-menus.ts

@@ -81,7 +81,7 @@ function generateMenus(
   });
 
   // 对菜单进行排序,避免order=0时被替换成999的问题
-  menus = menus.sort((a, b) => (a?.order ?? 999) - (b?.order ?? 999));
+  menus = menus.toSorted((a, b) => (a?.order ?? 999) - (b?.order ?? 999));
 
   // 过滤掉隐藏的菜单项
   return filterTree(menus, (menu) => !!menu.show);

+ 1 - 1
playground/src/views/dashboard/analytics/analytics-visits-sales.vue

@@ -24,7 +24,7 @@ onMounted(() => {
           { name: '定制', value: 310 },
           { name: '技术支持', value: 274 },
           { name: '远程', value: 400 },
-        ].sort((a, b) => {
+        ].toSorted((a, b) => {
           return a.value - b.value;
         }),
         name: '商业占比',

+ 1 - 2
playground/src/views/system/menu/modules/form.vue

@@ -107,7 +107,7 @@ const schema: VbenFormSchema[] = [
     componentProps() {
       // 不需要处理多语言时就无需这么做
       return {
-        addonAfter: titleSuffix.value,
+        ...(titleSuffix.value && { addonAfter: titleSuffix.value }),
         onChange({ target: { value } }: ChangeEvent) {
           titleSuffix.value = value && $te(value) ? $t(value) : undefined;
         },
@@ -442,7 +442,6 @@ const [Form, formApi] = useVbenForm({
   showDefaultActions: false,
   wrapperClass: 'grid-cols-2 gap-x-4',
 });
-
 const [Drawer, drawerApi] = useVbenDrawer({
   onConfirm: onSubmit,
   onOpenChange(isOpen) {

Разница между файлами не показана из-за своего большого размера
+ 138 - 280
pnpm-lock.yaml


+ 16 - 14
pnpm-workspace.yaml

@@ -22,7 +22,7 @@ catalog:
   '@commitlint/cli': ^19.8.1
   '@commitlint/config-conventional': ^19.8.1
   '@ctrl/tinycolor': ^4.1.0
-  '@eslint/js': ^9.30.1
+  '@eslint/js': ^9.39.1
   '@faker-js/faker': ^9.9.0
   '@iconify/json': ^2.2.406
   '@iconify/tailwind': ^1.2.0
@@ -90,22 +90,22 @@ catalog:
   dotenv: ^16.6.1
   echarts: ^6.0.0
   element-plus: ^2.10.2
-  eslint: ^9.30.1
+  eslint: ^9.39.1
   eslint-config-turbo: ^2.6.1
   eslint-plugin-command: ^3.3.1
   eslint-plugin-eslint-comments: ^3.2.0
   eslint-plugin-import-x: ^4.16.1
-  eslint-plugin-jsdoc: ^50.8.0
-  eslint-plugin-jsonc: ^2.20.1
-  eslint-plugin-n: ^17.20.0
+  eslint-plugin-jsdoc: ^61.2.1
+  eslint-plugin-jsonc: ^2.21.0
+  eslint-plugin-n: ^17.23.1
   eslint-plugin-no-only-tests: ^3.3.0
-  eslint-plugin-perfectionist: ^4.15.0
-  eslint-plugin-prettier: ^5.5.1
-  eslint-plugin-regexp: ^2.9.0
-  eslint-plugin-unicorn: ^59.0.1
-  eslint-plugin-unused-imports: ^4.1.4
+  eslint-plugin-perfectionist: ^4.15.1
+  eslint-plugin-prettier: ^5.5.4
+  eslint-plugin-regexp: ^2.10.0
+  eslint-plugin-unicorn: ^62.0.0
+  eslint-plugin-unused-imports: ^4.3.0
   eslint-plugin-vitest: ^0.5.4
-  eslint-plugin-vue: ^10.2.0
+  eslint-plugin-vue: ^10.5.1
   execa: ^9.6.0
   find-up: ^7.0.0
   get-port: ^7.1.0
@@ -114,8 +114,9 @@ catalog:
   happy-dom: ^17.6.3
   html-minifier-terser: ^7.2.0
   is-ci: ^4.1.0
+  jiti: ^2.6.1
   json-bigint: ^1.0.0
-  jsonc-eslint-parser: ^2.4.0
+  jsonc-eslint-parser: ^2.4.1
   jsonwebtoken: ^9.0.2
   lefthook: ^1.13.6
   lodash.clonedeep: ^4.5.0
@@ -163,6 +164,7 @@ catalog:
   tailwind-merge: ^2.6.0
   tailwindcss: ^3.4.18
   tailwindcss-animate: ^1.0.7
+  tdesign-vue-next: ^1.17.1
   theme-colors: ^0.1.0
   tippy.js: ^6.3.7
   turbo: ^2.6.1
@@ -176,7 +178,7 @@ catalog:
   vite-plugin-html: ^3.2.2
   vite-plugin-lazy-import: ^1.0.7
   vite-plugin-pwa: ^1.0.1
-  vite-plugin-vue-devtools: ^7.7.7
+  vite-plugin-vue-devtools: ^8.0.3
   vitepress: ^1.6.3
   vitepress-plugin-group-icons: ^1.6.1
   vitest: ^3.2.4
@@ -186,7 +188,7 @@ catalog:
   vue-json-viewer: ^3.0.4
   vue-router: ^4.5.1
   vue-tippy: ^6.7.1
-  vue-tsc: 2.2.10
+  vue-tsc: ^3.1.4
   vxe-pc-ui: ^4.10.22
   vxe-table: ^4.17.14
   watermark-js-plus: ^1.6.2

Некоторые файлы не были показаны из-за большого количества измененных файлов