@peng_kai/kit 0.1.17 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/admin/adminPlugin.ts +47 -0
  2. package/admin/components/filter/src/FilterDrawer.vue +153 -153
  3. package/admin/components/filter/src/FilterParam.vue +76 -78
  4. package/admin/components/filter/src/FilterReset.vue +2 -2
  5. package/admin/components/filter/src/useFilterParams.ts +75 -25
  6. package/admin/components/filter/src/useFilterQuery.ts +32 -16
  7. package/admin/components/rich-text/index.ts +2 -0
  8. package/admin/components/rich-text/src/RichText.vue +342 -0
  9. package/admin/components/rich-text/src/imageUploader.ts +34 -0
  10. package/admin/components/rich-text/src/type.d.ts +7 -0
  11. package/admin/components/scroll-nav/index.ts +1 -1
  12. package/admin/components/scroll-nav/src/ScrollNav.vue +59 -59
  13. package/admin/components/text/index.ts +13 -13
  14. package/admin/components/text/src/Amount.vue +121 -121
  15. package/admin/components/text/src/Datetime.vue +47 -48
  16. package/admin/components/text/src/Duration.vue +26 -26
  17. package/admin/components/text/src/Hash.vue +51 -51
  18. package/admin/components/text/src/createTagGetter.ts +13 -13
  19. package/admin/components/upload/index.ts +2 -0
  20. package/admin/components/upload/src/PictureCardUpload.vue +143 -0
  21. package/admin/components/upload/src/customRequests.ts +31 -0
  22. package/admin/defines/index.ts +1 -1
  23. package/admin/defines/route/helpers.ts +0 -1
  24. package/admin/defines/startup/defineStartup.ts +8 -1
  25. package/admin/defines/startup/index.ts +1 -1
  26. package/admin/defines/startup/{getStartups.ts → runStartup.ts} +16 -7
  27. package/admin/layout/large/Breadcrumb.vue +68 -69
  28. package/admin/layout/large/Content.vue +23 -24
  29. package/admin/layout/large/Menu.vue +68 -69
  30. package/admin/layout/large/PageTab.vue +70 -71
  31. package/admin/permission/index.ts +2 -4
  32. package/admin/permission/routerGuard.ts +41 -43
  33. package/admin/permission/vuePlugin.ts +46 -30
  34. package/admin/route-guards/collapseMenu.ts +3 -3
  35. package/admin/route-guards/index.ts +3 -3
  36. package/admin/route-guards/pageProgress.ts +27 -27
  37. package/admin/route-guards/pageTitle.ts +18 -19
  38. package/admin/{hooks/useMenu.ts → stores/createUseMenuStore.ts} +133 -128
  39. package/admin/{hooks/usePage.ts → stores/createUsePageStore.ts} +145 -141
  40. package/admin/stores/createUsePageTabStore.ts +43 -0
  41. package/admin/{permission/usePermission.ts → stores/createUsePermissionStore.ts} +57 -52
  42. package/admin/stores/index.ts +8 -0
  43. package/admin/styles/classCover.scss +8 -0
  44. package/admin/styles/globalCover.scss +54 -54
  45. package/antd/components/InputNumberRange.vue +59 -59
  46. package/antd/directives/formLabelAlign.ts +36 -36
  47. package/antd/hooks/useAntdDrawer.ts +73 -73
  48. package/antd/hooks/useAntdForm.helpers.ts +92 -8
  49. package/antd/hooks/useAntdForm.ts +55 -63
  50. package/antd/hooks/useAntdTable.ts +127 -115
  51. package/antd/index.ts +1 -1
  52. package/libs/a-calc.ts +1 -0
  53. package/libs/axios.ts +2 -0
  54. package/libs/bignumber.ts +2 -0
  55. package/libs/dayjs.ts +5 -0
  56. package/libs/echarts.ts +5 -0
  57. package/libs/localstorage-slim.ts +2 -0
  58. package/libs/lodash-es.ts +1 -0
  59. package/libs/pinia.ts +1 -0
  60. package/libs/vue-query.ts +1 -0
  61. package/libs/vueuse.ts +3 -0
  62. package/package.json +91 -58
  63. package/request/helpers.ts +68 -49
  64. package/request/interceptors/toLogin.ts +26 -26
  65. package/request/queryClient.ts +34 -21
  66. package/request/type.d.ts +92 -92
  67. package/stylelint.config.cjs +7 -7
  68. package/tsconfig.json +50 -50
  69. package/utils/upload/AwsS3.ts +68 -0
  70. package/utils/upload/fileHandlers.ts +27 -0
  71. package/utils/upload/index.ts +2 -0
  72. package/vite/index.d.ts +1 -0
  73. package/vite/index.mjs +27 -0
  74. package/vue/components/echarts/index.ts +1 -0
  75. package/vue/components/echarts/src/ECharts.vue +48 -0
  76. package/vue/components/index.ts +1 -0
  77. package/vue/components/infinite-query/index.ts +1 -1
  78. package/vue/components/infinite-query/src/InfiniteQuery.vue +199 -205
  79. package/vue/components/infinite-query/src/useCreateTrigger.ts +39 -39
  80. package/vue/components/test/KitTest.vue +9 -0
  81. package/vue/components/test/testStore.ts +11 -0
  82. package/admin/hooks/index.ts +0 -5
  83. package/admin/hooks/usePageTab.ts +0 -35
  84. package/kitDependencies.ts +0 -43
@@ -0,0 +1,31 @@
1
+ import type { UploadProps } from 'ant-design-vue';
2
+ import type { AwsS3 } from '../../../../utils/upload';
3
+
4
+ type UploadRequestOption = Parameters<NonNullable<UploadProps['customRequest']>>['0'];
5
+
6
+ export function createAwsS3Request(awsS3: AwsS3, rootPath?: string) {
7
+ return async (options: UploadRequestOption) => {
8
+ if (!(options.file instanceof File))
9
+ throw new Error('options.file 不是 File 对象');
10
+
11
+ const { uploader, fileURL } = await awsS3.upload(options.file, rootPath);
12
+
13
+ uploader.on('httpUploadProgress', (progress) => {
14
+ const percent = (progress.loaded ?? 0) / (progress.total ?? 1) * 100;
15
+ options.onProgress?.({ percent });
16
+ });
17
+
18
+ await uploader.done();
19
+ options.onSuccess?.({
20
+ uid: (options.file as any).uid,
21
+ name: fileURL.split('/').pop(),
22
+ url: fileURL,
23
+ });
24
+
25
+ return {
26
+ abort() {
27
+ uploader.abort();
28
+ },
29
+ };
30
+ };
31
+ }
@@ -1,4 +1,4 @@
1
1
  export { definePage } from './page';
2
2
  export { defineRoute, getRoutes } from './route';
3
3
  export { defineRouteGuard, getRouteGuards } from './route-guard';
4
- export { defineStartup, getStartups } from './startup';
4
+ export { defineStartup, runStartup } from './startup';
@@ -38,7 +38,6 @@ export function getMenusByRouter(router: Router) {
38
38
 
39
39
  export function printRounesNameInterface(routes: { name: PropertyKey }[]) {
40
40
  console.groupCollapsed('路由命名');
41
- console.log('复制以下内容到 AppRouteNames');
42
41
  const routesName = new Set();
43
42
  routes.forEach((route) => {
44
43
  if (typeof route.name === 'string')
@@ -1,6 +1,13 @@
1
1
  import type { App } from 'vue';
2
2
 
3
- export type StartupFn = (app: App) => void | Promise<void>;
3
+ export interface IHooks {
4
+ onMount: (cb: () => void) => void
5
+ }
6
+
7
+ export type StartupFn = (
8
+ app: App,
9
+ hooks: IHooks
10
+ ) => (void | Promise<void>);
4
11
 
5
12
  export const StartupSymbol = Symbol('app-startup');
6
13
 
@@ -1,2 +1,2 @@
1
1
  export { defineStartup } from './defineStartup';
2
- export { getStartups } from './getStartups';
2
+ export { runStartup } from './runStartup';
@@ -1,11 +1,13 @@
1
+ import type { App } from 'vue';
1
2
  import { ENV } from '../../../utils';
2
3
  import { StartupSymbol } from './defineStartup';
3
4
  import type { StartupFn } from './defineStartup';
4
5
 
5
- export async function getStartups() {
6
- const moduleLoaders = getStartups.modules as Record<string, Function>;
6
+ export async function runStartup(app: App) {
7
+ const moduleLoaders = runStartup.modules as Record<string, Function>;
7
8
  const startupPaths: string[] = [];
8
- const startups: Array<StartupFn> = [];
9
+ const onMountCallbacks: Function[] = [];
10
+ (app as any).deps = {};
9
11
 
10
12
  for (const [path, moduleLoader] of Object.entries(moduleLoaders)) {
11
13
  const module: any = await moduleLoader();
@@ -15,16 +17,23 @@ export async function getStartups() {
15
17
  continue;
16
18
 
17
19
  startupPaths.push(path);
18
- startups.push(plugin);
20
+
21
+ /* create 钩子 */
22
+ await plugin(app, {
23
+ onMount(cb) {
24
+ cb && onMountCallbacks.push(cb);
25
+ },
26
+ });
19
27
  }
20
28
 
29
+ /* mount 钩子 */
30
+ onMountCallbacks.forEach(cb => cb());
31
+
21
32
  // 输出 App 插件
22
33
  if (!ENV.isProd) {
23
34
  console.groupCollapsed('启动时');
24
35
  console.table(startupPaths.map(path => ({ path })), ['path']);
25
36
  console.groupEnd();
26
37
  }
27
-
28
- return startups;
29
38
  }
30
- getStartups.modules = {} as any;
39
+ runStartup.modules = {} as any;
@@ -1,69 +1,68 @@
1
- <script lang="ts">
2
- import { computed } from 'vue';
3
- import type { VNode } from 'vue';
4
- import { Breadcrumb as ABreadcrumb } from 'ant-design-vue';
5
- import type { Route as AntdBreadcrumbRoute } from 'ant-design-vue/es/breadcrumb/Breadcrumb';
6
- import type { IBreadcrumb } from '../../hooks';
7
- import { getDependencies } from '../../../kitDependencies';
8
-
9
- interface IBreadcrumbRoute extends AntdBreadcrumbRoute {
10
- icon?: VNode | null
11
- trigger?: () => void
12
- }
13
-
14
- function _buildRoute(breadcrumb: IBreadcrumb): IBreadcrumbRoute {
15
- return {
16
- breadcrumbName: breadcrumb.title,
17
- path: breadcrumb.title,
18
- icon: breadcrumb.icon,
19
- children: breadcrumb.children?.map(child => _buildRoute(child)),
20
- trigger: breadcrumb.trigger,
21
- };
22
- }
23
- </script>
24
-
25
- <script setup lang="ts">
26
- const { usePage } = getDependencies();
27
- const { currentPageState } = usePage();
28
- const routes = computed(() => {
29
- let breadcrumbs: IBreadcrumbRoute[] = [];
30
-
31
- if (!currentPageState.value)
32
- return breadcrumbs;
33
-
34
- breadcrumbs = currentPageState.value.breadcrumbs.map(breadcrumb => _buildRoute(breadcrumb));
35
-
36
- breadcrumbs.push({
37
- path: currentPageState.value.title,
38
- breadcrumbName: currentPageState.value.title,
39
- icon: currentPageState.value.icon,
40
- });
41
-
42
- return breadcrumbs;
43
- });
44
- </script>
45
-
46
- <template>
47
- <ABreadcrumb class="breadcrumb" :routes="routes">
48
- <template #itemRender="{ route }: {route: IBreadcrumbRoute}">
49
- <div @click="route.trigger?.()">
50
- <component :is="route.icon" v-if="route.icon" class="mb-0.2em mr-0.2em" />
51
- <span>{{ route.breadcrumbName }}</span>
52
- </div>
53
- </template>
54
- </ABreadcrumb>
55
- </template>
56
-
57
- <style lang="scss" scoped>
58
- .breadcrumb {
59
- font-size: 1rem;
60
-
61
- :deep(.ant-dropdown-trigger) {
62
- height: 1.6em;
63
- }
64
-
65
- :deep(.anticon-down) {
66
- display: none;
67
- }
68
- }
69
- </style>
1
+ <script lang="ts">
2
+ import { computed } from 'vue';
3
+ import type { VNode } from 'vue';
4
+ import { Breadcrumb as ABreadcrumb } from 'ant-design-vue';
5
+ import type { Route as AntdBreadcrumbRoute } from 'ant-design-vue/es/breadcrumb/Breadcrumb';
6
+ import { adminPlugin } from '../../adminPlugin';
7
+ import type { IBreadcrumb } from '../../stores/createUsePageStore';
8
+
9
+ interface IBreadcrumbRoute extends AntdBreadcrumbRoute {
10
+ icon?: VNode | null
11
+ trigger?: () => void
12
+ }
13
+
14
+ function _buildRoute(breadcrumb: IBreadcrumb): IBreadcrumbRoute {
15
+ return {
16
+ breadcrumbName: breadcrumb.title,
17
+ path: breadcrumb.title,
18
+ icon: breadcrumb.icon,
19
+ children: breadcrumb.children?.map(child => _buildRoute(child)),
20
+ trigger: breadcrumb.trigger,
21
+ };
22
+ }
23
+ </script>
24
+
25
+ <script setup lang="ts">
26
+ const pageStore = adminPlugin.deps.usePageStore();
27
+ const routes = computed(() => {
28
+ let breadcrumbs: IBreadcrumbRoute[] = [];
29
+
30
+ if (!pageStore.currentPageState)
31
+ return breadcrumbs;
32
+
33
+ breadcrumbs = pageStore.currentPageState.breadcrumbs.map(breadcrumb => _buildRoute(breadcrumb));
34
+
35
+ breadcrumbs.push({
36
+ path: pageStore.currentPageState.title,
37
+ breadcrumbName: pageStore.currentPageState.title,
38
+ icon: pageStore.currentPageState.icon,
39
+ });
40
+
41
+ return breadcrumbs;
42
+ });
43
+ </script>
44
+
45
+ <template>
46
+ <ABreadcrumb class="breadcrumb" :routes="routes">
47
+ <template #itemRender="{ route }: {route: IBreadcrumbRoute}">
48
+ <div @click="route.trigger?.()">
49
+ <component :is="route.icon" v-if="route.icon" class="mb-0.2em mr-0.2em" />
50
+ <span>{{ route.breadcrumbName }}</span>
51
+ </div>
52
+ </template>
53
+ </ABreadcrumb>
54
+ </template>
55
+
56
+ <style lang="scss" scoped>
57
+ .breadcrumb {
58
+ font-size: 1rem;
59
+
60
+ :deep(.ant-dropdown-trigger) {
61
+ height: 1.6em;
62
+ }
63
+
64
+ :deep(.anticon-down) {
65
+ display: none;
66
+ }
67
+ }
68
+ </style>
@@ -1,24 +1,23 @@
1
- <script setup lang="ts">
2
- import { getDependencies } from '../../../kitDependencies';
3
-
4
- const { usePage } = getDependencies();
5
- const { pageCacheList, setPage } = usePage();
6
- </script>
7
-
8
- <template>
9
- <RouterView #default="{ Component, route }">
10
- <KeepAlive :include="pageCacheList">
11
- <Suspense>
12
- <component :is="setPage(Component, route)" :key="(Component.type as any).name" />
13
- <template #fallback>
14
- <div class="flex justify-center items-center h-70">
15
- <div class="flex items-center">
16
- <i class="i-svg-spinners:180-ring-with-bg block color-primary scale-125 mr-2" />
17
- <span class="text-gray">正在加载...</span>
18
- </div>
19
- </div>
20
- </template>
21
- </Suspense>
22
- </KeepAlive>
23
- </RouterView>
24
- </template>
1
+ <script setup lang="ts">
2
+ import { adminPlugin } from '../../adminPlugin';
3
+
4
+ const pageStore = adminPlugin.deps.usePageStore();
5
+ </script>
6
+
7
+ <template>
8
+ <RouterView #default="{ Component, route }">
9
+ <KeepAlive :include="pageStore.pageCacheList">
10
+ <Suspense>
11
+ <component :is="pageStore.setPage(Component, route)" :key="(Component.type as any).name" />
12
+ <template #fallback>
13
+ <div class="flex justify-center items-center h-70">
14
+ <div class="flex items-center">
15
+ <i class="i-svg-spinners:180-ring-with-bg block color-primary scale-125 mr-2" />
16
+ <span class="text-gray">正在加载...</span>
17
+ </div>
18
+ </div>
19
+ </template>
20
+ </Suspense>
21
+ </KeepAlive>
22
+ </RouterView>
23
+ </template>
@@ -1,69 +1,68 @@
1
- <script lang="ts">
2
- import { computed, ref, watch } from 'vue';
3
- import { Menu as AMenu } from 'ant-design-vue';
4
- import type { ItemType } from 'ant-design-vue';
5
- import type { TMenu } from '../../hooks';
6
- import { getDependencies } from '../../../kitDependencies';
7
-
8
- function formatMenu(menu: TMenu): ItemType {
9
- return {
10
- key: menu.key,
11
- title: menu.label,
12
- label: menu.label,
13
- icon: menu.icon ?? undefined,
14
- onClick: (e) => {
15
- (e as any).stopPropagation();
16
- menu.trigger();
17
- },
18
- children: menu.children?.map(formatMenu),
19
- };
20
- }
21
- </script>
22
-
23
- <script setup lang="ts">
24
- const { useRouter, useMenu } = getDependencies();
25
- const router = useRouter();
26
- const { menus, getMenuPath } = useMenu();
27
- const items = computed(() => menus.map(formatMenu));
28
- const openKeys = ref<string[]>([]);
29
- const selectedKeys = ref<string[]>([]);
30
-
31
- watch(
32
- () => router?.currentRoute.value,
33
- (route) => {
34
- if (!route)
35
- return;
36
-
37
- const menuPath = getMenuPath(route.name as string);
38
- openKeys.value = menuPath.map(menu => menu.key);
39
- selectedKeys.value = [openKeys.value.pop()!];
40
- },
41
- { immediate: true },
42
- );
43
- </script>
44
-
45
- <template>
46
- <AMenu
47
- class="menu"
48
- :items="items"
49
- :openKeys="openKeys"
50
- :selectedKeys="selectedKeys"
51
- :inlineIndent="16"
52
- mode="inline"
53
- />
54
- </template>
55
-
56
- <style lang="scss" scoped>
57
- .menu {
58
- border-inline-end: none !important;
59
-
60
- &.ant-menu-inline-collapsed {
61
- width: var(--app-siderbar-width);
62
- }
63
-
64
- &,
65
- .ant-menu {
66
- background-color: transparent;
67
- }
68
- }
69
- </style>
1
+ <script lang="ts">
2
+ import { computed, ref, watch } from 'vue';
3
+ import { Menu as AMenu } from 'ant-design-vue';
4
+ import type { ItemType } from 'ant-design-vue';
5
+ import { adminPlugin } from '../../adminPlugin';
6
+ import type { TMenu } from '../../stores/createUseMenuStore';
7
+
8
+ function formatMenu(menu: TMenu): ItemType {
9
+ return {
10
+ key: menu.key,
11
+ title: menu.label,
12
+ label: menu.label,
13
+ icon: menu.icon ?? undefined,
14
+ onClick: (e) => {
15
+ (e as any).stopPropagation();
16
+ menu.trigger();
17
+ },
18
+ children: menu.children?.map(formatMenu),
19
+ };
20
+ }
21
+ </script>
22
+
23
+ <script setup lang="ts">
24
+ const { router, useMenuStore } = adminPlugin.deps;
25
+ const menuStore = useMenuStore();
26
+ const items = computed(() => menuStore.menus.map(formatMenu));
27
+ const openKeys = ref<string[]>([]);
28
+ const selectedKeys = ref<string[]>([]);
29
+
30
+ watch(
31
+ () => router?.currentRoute.value,
32
+ (route) => {
33
+ if (!route)
34
+ return;
35
+
36
+ const menuPath = menuStore.getMenuPath(route.name as string);
37
+ openKeys.value = menuPath.map(menu => menu.key);
38
+ selectedKeys.value = [openKeys.value.pop()!];
39
+ },
40
+ { immediate: true },
41
+ );
42
+ </script>
43
+
44
+ <template>
45
+ <AMenu
46
+ class="menu"
47
+ :items="items"
48
+ :openKeys="openKeys"
49
+ :selectedKeys="selectedKeys"
50
+ :inlineIndent="16"
51
+ mode="inline"
52
+ />
53
+ </template>
54
+
55
+ <style lang="scss" scoped>
56
+ .menu {
57
+ border-inline-end: none !important;
58
+
59
+ &.ant-menu-inline-collapsed {
60
+ width: var(--app-siderbar-width);
61
+ }
62
+
63
+ &,
64
+ .ant-menu {
65
+ background-color: transparent;
66
+ }
67
+ }
68
+ </style>
@@ -1,71 +1,70 @@
1
- <script setup lang="ts">
2
- import { TabPane as ATabPane, Tabs as ATabs } from 'ant-design-vue';
3
- import { getDependencies } from '../../../kitDependencies';
4
-
5
- const { usePageTab } = getDependencies();
6
- const { activeTab, tabList, openTab, closeTab } = usePageTab();
7
- </script>
8
-
9
- <template>
10
- <ATabs
11
- class="app-page-tabs"
12
- :activeKey="activeTab"
13
- type="editable-card"
14
- size="small"
15
- :animated="false"
16
- :hideAdd="true"
17
- :tabBarGutter="4"
18
- @tabClick="(openTab as any)"
19
- @edit="(closeTab as any)"
20
- >
21
- <ATabPane v-for="tab of tabList" :key="tab.key" :tab="tab.title">
22
- <template #closeIcon>
23
- <i class="i-icon-park-outline:close" />
24
- </template>
25
- </ATabPane>
26
- </ATabs>
27
- </template>
28
-
29
- <style scoped lang="scss">
30
- .app-page-tabs {
31
- :deep(.ant-tabs-nav) {
32
- margin: 0;
33
- }
34
-
35
- :deep(.ant-tabs-nav::before) {
36
- display: none;
37
- }
38
-
39
- :deep(.ant-tabs-tab) {
40
- --uno: 'border-rd-3px! text-14px p-[3px_1px_3px_8px]! select-none';
41
- }
42
-
43
- :deep(.ant-tabs-tab .ant-tabs-tab-btn) {
44
- transform: translateX(8px);
45
- }
46
-
47
- :deep(.ant-tabs-tab-active) {
48
- --uno: 'border-[currentColor]!';
49
- }
50
-
51
- :deep(.ant-tabs-tab-remove) {
52
- display: flex;
53
- height: 100%;
54
- align-items: center;
55
- margin: 0;
56
- opacity: 0;
57
- transition: all 150ms;
58
- }
59
-
60
- :deep(.ant-tabs-tab:hover .ant-tabs-tab-btn),
61
- :deep(.ant-tabs-tab-active .ant-tabs-tab-btn) {
62
- transform: translateX(0);
63
- }
64
-
65
- :deep(.ant-tabs-tab:hover .ant-tabs-tab-remove),
66
- :deep(.ant-tabs-tab-active .ant-tabs-tab-remove) {
67
- margin-left: 0;
68
- opacity: 1;
69
- }
70
- }
71
- </style>
1
+ <script setup lang="ts">
2
+ import { TabPane as ATabPane, Tabs as ATabs } from 'ant-design-vue';
3
+ import { adminPlugin } from '../../adminPlugin';
4
+
5
+ const pageTabStore = adminPlugin.deps.usePageTabStore();
6
+ </script>
7
+
8
+ <template>
9
+ <ATabs
10
+ class="app-page-tabs"
11
+ :activeKey="pageTabStore.activeTab"
12
+ type="editable-card"
13
+ size="small"
14
+ :animated="false"
15
+ :hideAdd="true"
16
+ :tabBarGutter="4"
17
+ @tabClick="(pageTabStore.openTab as any)"
18
+ @edit="(pageTabStore.closeTab as any)"
19
+ >
20
+ <ATabPane v-for="tab of pageTabStore.tabList" :key="tab.key" :tab="tab.title">
21
+ <template #closeIcon>
22
+ <i class="i-icon-park-outline:close" />
23
+ </template>
24
+ </ATabPane>
25
+ </ATabs>
26
+ </template>
27
+
28
+ <style scoped lang="scss">
29
+ .app-page-tabs {
30
+ :deep(.ant-tabs-nav) {
31
+ margin: 0;
32
+ }
33
+
34
+ :deep(.ant-tabs-nav::before) {
35
+ display: none;
36
+ }
37
+
38
+ :deep(.ant-tabs-tab) {
39
+ --uno: 'border-rd-3px! text-14px p-[3px_1px_3px_8px]! select-none';
40
+ }
41
+
42
+ :deep(.ant-tabs-tab .ant-tabs-tab-btn) {
43
+ transform: translateX(8px);
44
+ }
45
+
46
+ :deep(.ant-tabs-tab-active) {
47
+ --uno: 'border-[currentColor]!';
48
+ }
49
+
50
+ :deep(.ant-tabs-tab-remove) {
51
+ display: flex;
52
+ height: 100%;
53
+ align-items: center;
54
+ margin: 0;
55
+ opacity: 0;
56
+ transition: all 150ms;
57
+ }
58
+
59
+ :deep(.ant-tabs-tab:hover .ant-tabs-tab-btn),
60
+ :deep(.ant-tabs-tab-active .ant-tabs-tab-btn) {
61
+ transform: translateX(0);
62
+ }
63
+
64
+ :deep(.ant-tabs-tab:hover .ant-tabs-tab-remove),
65
+ :deep(.ant-tabs-tab-active .ant-tabs-tab-remove) {
66
+ margin-left: 0;
67
+ opacity: 1;
68
+ }
69
+ }
70
+ </style>
@@ -1,4 +1,2 @@
1
- export { setupPermissionRouterGuard } from './routerGuard';
2
- export { setupPermissionPlugin } from './vuePlugin';
3
- export { usePermission } from './usePermission';
4
- export type { THasPermissionsFn } from './vuePlugin';
1
+ export { setupPermissionRouterGuard } from './routerGuard';
2
+ export { setupPermissionPlugin } from './vuePlugin';