@oiij/naive-ui 0.0.74 → 0.0.76

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 (29) hide show
  1. package/README.md +132 -4
  2. package/dist/components/config-providers/ConfigProviders.vue.d.ts +2 -2
  3. package/dist/components/copy-button/CopyButton.vue.d.ts +4 -4
  4. package/dist/components/data-table-plus/DataTablePlus.vue.d.ts +44 -44
  5. package/dist/components/loading-provider/LoadingProvider.vue.d.ts +2 -2
  6. package/dist/components/preset-form/PresetForm.vue.d.ts +14 -14
  7. package/dist/components/preset-input/PresetInput.vue.d.ts +3 -3
  8. package/dist/components/preset-picker/PresetPicker.vue.d.ts +5 -5
  9. package/dist/components/preset-select/PresetSelect.vue.d.ts +27 -27
  10. package/dist/components/remote-request/RemoteRequest.vue.d.ts +10 -10
  11. package/dist/components/search-input/SearchInput.vue.d.ts +4 -4
  12. package/dist/components/toggle-input/ToggleInput.vue.d.ts +5 -5
  13. package/dist/components/tooltip-button/TooltipButton.vue.d.ts +4 -4
  14. package/dist/components/transition/BaseTransition.vue.d.ts +2 -2
  15. package/dist/components/type-writer/TypeWriter.vue.d.ts +4 -4
  16. package/dist/composables/index.d.ts +1 -0
  17. package/dist/composables/use-data-request.d.ts +58 -28
  18. package/dist/composables/use-data-request.js +23 -0
  19. package/dist/composables/use-loading.d.ts +4 -0
  20. package/dist/composables/use-loading.js +8 -0
  21. package/dist/composables/use-naive-form.d.ts +40 -17
  22. package/dist/composables/use-naive-form.js +45 -1
  23. package/dist/composables/use-naive-menu.d.ts +103 -0
  24. package/dist/composables/use-naive-menu.js +181 -0
  25. package/dist/composables/use-naive-theme.d.ts +32 -15
  26. package/dist/composables/use-naive-theme.js +13 -0
  27. package/dist/index.d.ts +2 -1
  28. package/dist/index.js +2 -1
  29. package/package.json +5 -3
@@ -0,0 +1,103 @@
1
+ import * as vue5 from "vue";
2
+ import { MaybeRefOrGetter, VNodeChild } from "vue";
3
+ import { MenuOption } from "naive-ui";
4
+ import { RouteRecordRaw } from "vue-router";
5
+
6
+ //#region src/composables/use-naive-menu.d.ts
7
+ /**
8
+ * 配置选项接口
9
+ * 用于定义 useNaiveMenu 组合函数的配置参数
10
+ */
11
+ type UseNaiveMenuOptions = {
12
+ /**
13
+ * 隐藏条件,可以是函数或字符串
14
+ * - 如果是函数,返回 true 时路由将不显示在菜单中
15
+ * - 如果是字符串,则从 route.meta 中获取对应属性的值
16
+ * @default 'hidden'
17
+ */
18
+ hidden?: ((route: RouteRecordRaw) => boolean | string) | string;
19
+ /**
20
+ * 根路由判断,可以是函数或字符串
21
+ * - 如果是函数,返回 true 时路由将作为顶级菜单
22
+ * - 如果是字符串,则从 route.meta 中获取对应属性的值
23
+ * @default 'root'
24
+ */
25
+ root?: ((route: RouteRecordRaw) => boolean | string) | string;
26
+ /**
27
+ * 标签字段名,从 route.meta 中获取对应属性的值作为菜单标签
28
+ * @default 'title'
29
+ */
30
+ labelField?: string;
31
+ /**
32
+ * 键字段名,从 route 中获取对应属性的值作为菜单键
33
+ * @default 'name'
34
+ */
35
+ keyField?: string;
36
+ /**
37
+ * 图标字段名,从 route.meta 中获取对应属性的值作为菜单图标
38
+ * @default 'icon'
39
+ */
40
+ iconField?: string;
41
+ /**
42
+ * 图标渲染函数,用于自定义图标渲染
43
+ */
44
+ renderIcon?: (icon: string) => VNodeChild;
45
+ /**
46
+ * 父路由元信息字段名
47
+ * @default 'parent'
48
+ */
49
+ parentField?: string;
50
+ /**
51
+ * 父路由文件路径
52
+ * @default ''
53
+ */
54
+ parentFilePath?: string;
55
+ /**
56
+ * 父路由元信息生成函数
57
+ */
58
+ parent?: (route: RouteRecordRaw) => Record<string, unknown>;
59
+ /**
60
+ * 自定义菜单选项创建函数
61
+ */
62
+ createMenuOption?: (route: RouteRecordRaw) => MenuOption;
63
+ };
64
+ /**
65
+ * 自动菜单组合函数
66
+ * 将路由配置转换为菜单配置,并提供扁平化的菜单选项
67
+ * @param routes 路由配置数组,可以是响应式或普通数组
68
+ * @param options 配置选项
69
+ * @returns 包含菜单选项和扁平化菜单选项的对象
70
+ *
71
+ * @example
72
+ * // 基本使用
73
+ * const { menuOptions, flattenedMenuOptions } = useNaiveMenu(routes)
74
+ *
75
+ * // 带配置选项(使用函数)
76
+ * const { menuOptions, flattenedMenuOptions } = useNaiveMenu(routes, {
77
+ * hidden: (route) => route.meta?.hidden,
78
+ * root: (route) => route.meta?.root,
79
+ * labelField: 'title',
80
+ * keyField: 'name',
81
+ * iconField: 'icon',
82
+ * renderIcon: (icon) => h('i', { class: icon })
83
+ * })
84
+ *
85
+ * // 带配置选项(使用字符串)
86
+ * const { menuOptions, flattenedMenuOptions } = useNaiveMenu(routes, {
87
+ * hidden: 'hidden',
88
+ * root: 'root',
89
+ * labelField: 'title',
90
+ * keyField: 'name',
91
+ * iconField: 'icon'
92
+ * })
93
+ */
94
+ declare function useNaiveMenu(routes: MaybeRefOrGetter<RouteRecordRaw[]>, options?: UseNaiveMenuOptions): {
95
+ menuOptions: vue5.ComputedRef<MenuOption[]>;
96
+ flattenedMenuOptions: vue5.ComputedRef<MenuOption[]>;
97
+ };
98
+ /**
99
+ * useNaiveMenu 返回类型
100
+ */
101
+ type UseNaiveMenuReturn = ReturnType<typeof useNaiveMenu>;
102
+ //#endregion
103
+ export { UseNaiveMenuOptions, UseNaiveMenuReturn, useNaiveMenu };
@@ -0,0 +1,181 @@
1
+ import { computed, toValue } from "vue";
2
+
3
+ //#region src/composables/use-naive-menu.ts
4
+ /**
5
+ * 获取配置值
6
+ * @param route 路由配置
7
+ * @param config 配置项,可以是函数或字符串
8
+ * @param returnType 返回类型,'meta' 从 meta 中获取,'route' 从路由本身获取
9
+ * @param defaultValue 默认值
10
+ * @returns 配置值或默认值
11
+ */
12
+ function getConfigValue(route, config, returnType, defaultValue) {
13
+ if (!config) return defaultValue;
14
+ if (typeof config === "function") return config(route);
15
+ if (returnType === "meta") return route.meta?.[config] ?? defaultValue;
16
+ return route?.[config] ?? defaultValue;
17
+ }
18
+ /**
19
+ * 创建单个菜单选项
20
+ * @param route 路由配置
21
+ * @param options 配置选项
22
+ * @returns 菜单选项
23
+ */
24
+ function createConfigMenuOption(route, options) {
25
+ const { labelField, keyField, iconField, renderIcon } = options ?? {};
26
+ const labelValue = getConfigValue(route, labelField, "meta");
27
+ const keyValue = getConfigValue(route, keyField, "route");
28
+ const iconValue = getConfigValue(route, iconField, "meta");
29
+ return {
30
+ label: labelValue ?? route.meta?.title ?? route.name ?? route.path,
31
+ key: keyValue ?? route.name?.toString() ?? route.path?.toString(),
32
+ icon: iconValue ? () => renderIcon?.(iconValue) : void 0,
33
+ meta: route.meta
34
+ };
35
+ }
36
+ /**
37
+ * 判断路由是否应该隐藏
38
+ * @param route 路由配置
39
+ * @param hidden 隐藏条件
40
+ * @returns 是否隐藏
41
+ */
42
+ function shouldHide(route, hidden) {
43
+ if (!hidden) return false;
44
+ const result = getConfigValue(route, hidden, "meta");
45
+ return typeof result === "boolean" ? result : !!result;
46
+ }
47
+ /**
48
+ * 判断路由是否为根路由
49
+ * @param route 路由配置
50
+ * @param root 根路由判断
51
+ * @returns 是否为根路由
52
+ */
53
+ function isRoot(route, root) {
54
+ if (!root) return false;
55
+ const result = getConfigValue(route, root, "meta");
56
+ return typeof result === "boolean" ? result : !!result;
57
+ }
58
+ /**
59
+ * 将路由配置转换为菜单配置的递归函数
60
+ * @param routes 路由配置数组
61
+ * @param options 配置选项
62
+ * @returns 菜单配置数组
63
+ */
64
+ function routes2menu(routes, options) {
65
+ const { hidden, root, createMenuOption } = options ?? {};
66
+ const menuOptions = [];
67
+ for (const route of routes ?? []) {
68
+ if (shouldHide(route, hidden)) continue;
69
+ const menu = typeof createMenuOption === "function" ? createMenuOption(route) : createConfigMenuOption(route, options);
70
+ if (route.children?.length) {
71
+ const rootChildren = route.children.filter((child) => isRoot(child, root));
72
+ const normalChildren = route.children.filter((child) => !isRoot(child, root));
73
+ if (normalChildren.length) menu.children = routes2menu(normalChildren, options);
74
+ if (rootChildren.length) {
75
+ const rootMenuOptions = rootChildren.filter((child) => !shouldHide(child, hidden)).map((child) => typeof createMenuOption === "function" ? createMenuOption(child) : createConfigMenuOption(child, options));
76
+ menuOptions.push(...rootMenuOptions);
77
+ }
78
+ }
79
+ menuOptions.push(menu);
80
+ }
81
+ return menuOptions;
82
+ }
83
+ /**
84
+ * 深度扁平化菜单选项
85
+ * @param menuOptions 菜单选项数组
86
+ * @returns 扁平化的菜单选项数组
87
+ */
88
+ function flattenDeepMenuOptions(menuOptions) {
89
+ return menuOptions.reduce((flattened, menu) => {
90
+ flattened.push(menu);
91
+ if (menu.children?.length) flattened.push(...flattenDeepMenuOptions(menu.children));
92
+ return flattened;
93
+ }, []);
94
+ }
95
+ /**
96
+ * 深度向上合并父路由元信息
97
+ * @param routes 路由配置数组
98
+ * @param parentField 父路由元信息字段名
99
+ * @param parentFilePath 父路由文件路径
100
+ * @param parent 父路由元信息生成函数
101
+ * @returns 处理后的路由配置数组
102
+ */
103
+ function deepUpRouteParentMeta(routes, parentField, parentFilePath, parent) {
104
+ return routes.map((route) => {
105
+ const emptyPathChild = route.children?.find((f) => f.path === parentFilePath);
106
+ if (emptyPathChild) {
107
+ if (typeof parent === "function") {
108
+ const parentMeta = parent(route);
109
+ route.meta = {
110
+ ...route.meta,
111
+ ...parentMeta
112
+ };
113
+ } else if (parentField) {
114
+ const parentMeta = emptyPathChild.meta?.[parentField];
115
+ route.meta = {
116
+ ...route.meta,
117
+ ...parentMeta
118
+ };
119
+ }
120
+ }
121
+ if (route.children?.length) route.children = deepUpRouteParentMeta(route.children, parentField, parentFilePath, parent);
122
+ return route;
123
+ });
124
+ }
125
+ /**
126
+ * 自动菜单组合函数
127
+ * 将路由配置转换为菜单配置,并提供扁平化的菜单选项
128
+ * @param routes 路由配置数组,可以是响应式或普通数组
129
+ * @param options 配置选项
130
+ * @returns 包含菜单选项和扁平化菜单选项的对象
131
+ *
132
+ * @example
133
+ * // 基本使用
134
+ * const { menuOptions, flattenedMenuOptions } = useNaiveMenu(routes)
135
+ *
136
+ * // 带配置选项(使用函数)
137
+ * const { menuOptions, flattenedMenuOptions } = useNaiveMenu(routes, {
138
+ * hidden: (route) => route.meta?.hidden,
139
+ * root: (route) => route.meta?.root,
140
+ * labelField: 'title',
141
+ * keyField: 'name',
142
+ * iconField: 'icon',
143
+ * renderIcon: (icon) => h('i', { class: icon })
144
+ * })
145
+ *
146
+ * // 带配置选项(使用字符串)
147
+ * const { menuOptions, flattenedMenuOptions } = useNaiveMenu(routes, {
148
+ * hidden: 'hidden',
149
+ * root: 'root',
150
+ * labelField: 'title',
151
+ * keyField: 'name',
152
+ * iconField: 'icon'
153
+ * })
154
+ */
155
+ function useNaiveMenu(routes, options) {
156
+ const { hidden = "hidden", root = "root", labelField = "title", keyField = "name", iconField = "icon", renderIcon, createMenuOption, parentField = "parent", parentFilePath = "", parent } = options ?? {};
157
+ /**
158
+ * 菜单选项
159
+ * 响应式计算属性,当路由或配置变化时自动更新
160
+ */
161
+ const menuOptions = computed(() => {
162
+ return routes2menu(deepUpRouteParentMeta(toValue(routes), parentField, parentFilePath, parent), {
163
+ hidden,
164
+ root,
165
+ labelField,
166
+ keyField,
167
+ iconField,
168
+ renderIcon,
169
+ createMenuOption
170
+ });
171
+ });
172
+ return {
173
+ menuOptions,
174
+ flattenedMenuOptions: computed(() => {
175
+ return flattenDeepMenuOptions(menuOptions.value);
176
+ })
177
+ };
178
+ }
179
+
180
+ //#endregion
181
+ export { useNaiveMenu };
@@ -4,23 +4,37 @@ import { GlobalThemeOverrides, NDateLocale, zhCN } from "naive-ui";
4
4
  import * as naive_ui_es_themes_interface0 from "naive-ui/es/themes/interface";
5
5
 
6
6
  //#region src/composables/use-naive-theme.d.ts
7
+ /**
8
+ * 语言包类型
9
+ * @template T 语言代码类型
10
+ */
7
11
  type Locales<T extends string = string> = Record<T, {
8
- name: string;
9
- dateLocale: NDateLocale;
12
+ /** 语言名称 */name: string; /** 日期本地化配置 */
13
+ dateLocale: NDateLocale; /** 语言包配置 */
10
14
  locale: typeof zhCN;
11
15
  }>;
16
+ /**
17
+ * 主题配置选项
18
+ * @template T 语言代码类型
19
+ */
12
20
  type UseNaiveThemeOptions<T extends string> = {
13
- language?: MaybeRefOrGetter<T>;
14
- darkMode?: MaybeRefOrGetter<boolean>;
15
- colors?: Colors;
16
- globalThemeOverrides?: GlobalThemeOverrides;
17
- locales?: Partial<Locales<T>>;
21
+ /** 语言代码,支持响应式引用或普通值 */language?: MaybeRefOrGetter<T>; /** 暗黑模式开关,支持响应式引用或普通值 */
22
+ darkMode?: MaybeRefOrGetter<boolean>; /** 主题颜色配置 */
23
+ colors?: Colors; /** 全局主题覆盖 */
24
+ globalThemeOverrides?: GlobalThemeOverrides; /** 自定义语言包 */
25
+ locales?: Partial<Locales<T>>; /** 暗黑模式颜色配置,支持对象或函数 */
18
26
  darkColors?: Colors | ((colors: Colors) => Colors);
19
27
  };
28
+ /**
29
+ * 用于处理 Naive UI 主题的组合式 API
30
+ * @template T 语言代码类型
31
+ * @param options 配置选项
32
+ * @returns 主题管理对象
33
+ */
20
34
  declare function useNaiveTheme<T extends string>(options?: UseNaiveThemeOptions<T>): {
21
- language: Ref<T | undefined, T | undefined>;
22
- darkMode: Ref<boolean | undefined, boolean | undefined>;
23
- theme: ComputedRef<naive_ui_es_themes_interface0.BuiltInGlobalTheme | undefined>;
35
+ /** 语言代码引用 */language: Ref<T | undefined, T | undefined>; /** 暗黑模式引用 */
36
+ darkMode: Ref<boolean | undefined, boolean | undefined>; /** 当前主题 */
37
+ theme: ComputedRef<naive_ui_es_themes_interface0.BuiltInGlobalTheme | undefined>; /** 颜色配置引用 */
24
38
  colors: Ref<{
25
39
  primary?: string | undefined;
26
40
  info?: string | undefined;
@@ -33,19 +47,22 @@ declare function useNaiveTheme<T extends string>(options?: UseNaiveThemeOptions<
33
47
  success?: string | undefined;
34
48
  warning?: string | undefined;
35
49
  error?: string | undefined;
36
- }>;
50
+ }>; /** 计算后的主题颜色 */
37
51
  themeColors: ComputedRef<{
38
52
  primary?: string | undefined;
39
53
  info?: string | undefined;
40
54
  success?: string | undefined;
41
55
  warning?: string | undefined;
42
56
  error?: string | undefined;
43
- }>;
44
- themeOverrides: ComputedRef<GlobalThemeOverrides>;
45
- locales: Locales<T>;
46
- locale: ComputedRef<Locales<T>[T]>;
57
+ }>; /** 主题覆盖配置 */
58
+ themeOverrides: ComputedRef<GlobalThemeOverrides>; /** 合并后的语言包 */
59
+ locales: Locales<T>; /** 当前语言包 */
60
+ locale: ComputedRef<Locales<T>[T]>; /** 设置主题颜色 */
47
61
  setColor: (v: Partial<Colors>) => void;
48
62
  };
63
+ /**
64
+ * useNaiveTheme 返回类型
65
+ */
49
66
  type UseNaiveThemeReturns = ReturnType<typeof useNaiveTheme>;
50
67
  //#endregion
51
68
  export { UseNaiveThemeOptions, UseNaiveThemeReturns, useNaiveTheme };
@@ -3,6 +3,9 @@ import { computed, ref, toValue, watchEffect } from "vue";
3
3
  import { darkTheme, dateEnUS, dateZhCN, enUS, zhCN } from "naive-ui";
4
4
 
5
5
  //#region src/composables/use-naive-theme.ts
6
+ /**
7
+ * 默认语言包映射
8
+ */
6
9
  const naiveLocaleMap = {
7
10
  "zh-CN": {
8
11
  name: "简体中文",
@@ -15,6 +18,12 @@ const naiveLocaleMap = {
15
18
  locale: enUS
16
19
  }
17
20
  };
21
+ /**
22
+ * 用于处理 Naive UI 主题的组合式 API
23
+ * @template T 语言代码类型
24
+ * @param options 配置选项
25
+ * @returns 主题管理对象
26
+ */
18
27
  function useNaiveTheme(options) {
19
28
  const { language, darkMode, colors, globalThemeOverrides, locales, darkColors } = options ?? {};
20
29
  const languageRef = ref(toValue(language));
@@ -40,6 +49,10 @@ function useNaiveTheme(options) {
40
49
  }
41
50
  return colorsRef.value;
42
51
  });
52
+ /**
53
+ * 设置主题颜色
54
+ * @param v 颜色配置
55
+ */
43
56
  function setColor(v) {
44
57
  colorsRef.value = {
45
58
  ...colorsRef.value,
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { DataObject, DataRequestFields, UseDataRequestOptions, UseDataRequestPagination, UseDataRequestReturns, useDataRequest } from "./composables/use-data-request.js";
2
2
  import { useLoading } from "./composables/use-loading.js";
3
3
  import { UseNaiveFormClearRules, UseNaiveFormOptions, UseNaiveFormReturns, UseNaiveFormRules, useNaiveForm } from "./composables/use-naive-form.js";
4
+ import { UseNaiveMenuOptions, UseNaiveMenuReturn, useNaiveMenu } from "./composables/use-naive-menu.js";
4
5
  import { UseNaiveThemeOptions, UseNaiveThemeReturns, useNaiveTheme } from "./composables/use-naive-theme.js";
5
6
  import "./composables/index.js";
6
- export { DataObject, DataRequestFields, UseDataRequestOptions, UseDataRequestPagination, UseDataRequestReturns, UseNaiveFormClearRules, UseNaiveFormOptions, UseNaiveFormReturns, UseNaiveFormRules, UseNaiveThemeOptions, UseNaiveThemeReturns, useDataRequest, useLoading, useNaiveForm, useNaiveTheme };
7
+ export { DataObject, DataRequestFields, UseDataRequestOptions, UseDataRequestPagination, UseDataRequestReturns, UseNaiveFormClearRules, UseNaiveFormOptions, UseNaiveFormReturns, UseNaiveFormRules, UseNaiveMenuOptions, UseNaiveMenuReturn, UseNaiveThemeOptions, UseNaiveThemeReturns, useDataRequest, useLoading, useNaiveForm, useNaiveMenu, useNaiveTheme };
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { useDataRequest } from "./composables/use-data-request.js";
2
2
  import { useLoading } from "./composables/use-loading.js";
3
3
  import { useNaiveForm } from "./composables/use-naive-form.js";
4
+ import { useNaiveMenu } from "./composables/use-naive-menu.js";
4
5
  import { useNaiveTheme } from "./composables/use-naive-theme.js";
5
6
 
6
- export { useDataRequest, useLoading, useNaiveForm, useNaiveTheme };
7
+ export { useDataRequest, useLoading, useNaiveForm, useNaiveMenu, useNaiveTheme };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oiij/naive-ui",
3
3
  "type": "module",
4
- "version": "0.0.74",
4
+ "version": "0.0.76",
5
5
  "description": "Some Composable Functions And Components for Vue 3",
6
6
  "author": "oiij",
7
7
  "license": "MIT",
@@ -45,9 +45,10 @@
45
45
  "vue": "^3.5.27",
46
46
  "vue-component-type-helpers": "^3.2.4",
47
47
  "vue-hooks-plus": "^2.4.1",
48
+ "vue-router": "^5.0.2",
48
49
  "@oiij/css-render": "0.0.10",
49
50
  "@oiij/markdown-it": "0.0.12",
50
- "@oiij/use": "0.0.43"
51
+ "@oiij/use": "0.0.44"
51
52
  },
52
53
  "devDependencies": {
53
54
  "@types/prismjs": "^1.26.5",
@@ -60,8 +61,9 @@
60
61
  "vue": "^3.5.27",
61
62
  "vue-component-type-helpers": "^3.2.4",
62
63
  "vue-hooks-plus": "^2.4.1",
64
+ "vue-router": "^5.0.2",
63
65
  "@oiij/css-render": "0.0.10",
64
- "@oiij/use": "0.0.43",
66
+ "@oiij/use": "0.0.44",
65
67
  "@oiij/markdown-it": "0.0.12"
66
68
  },
67
69
  "publishConfig": {