@keyblade/pro-components 0.0.1-alpha.7 → 0.0.1-alpha.8

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.
@@ -1,6 +1,7 @@
1
1
  declare module 'vue' {
2
2
  interface GlobalComponents {
3
3
  KbProBreadcrumb: typeof import('./index')['ProBreadcrumb'];
4
+ KbProLayout: typeof import('./index')['ProLayout'];
4
5
  KbProMenu: typeof import('./index')['ProMenu'];
5
6
  KbProPageWrapper: typeof import('./index')['ProPageWrapper'];
6
7
  KbProReuseTabs: typeof import('./index')['ProReuseTabs'];
package/es/index.d.ts CHANGED
@@ -4,6 +4,8 @@ declare const _default: {
4
4
  };
5
5
  export default _default;
6
6
  export { default as ProBreadcrumb } from './pro-breadcrumb';
7
+ export { default as ProLayout } from './pro-layout';
8
+ export type { EProLayoutTheme } from './pro-layout';
7
9
  export { default as ProMenu } from './pro-menu';
8
10
  export type { IProMenuItem } from './pro-menu';
9
11
  export { default as ProPageWrapper } from './pro-page-wrapper';
package/es/index.js CHANGED
@@ -6,9 +6,12 @@ import { ProPageWrapper } from "./pro-page-wrapper/index.js";
6
6
  import { ProPageWrapper as ProPageWrapper2 } from "./pro-page-wrapper/index.js";
7
7
  import { ProReuseTabs } from "./pro-reuse-tabs/index.js";
8
8
  import { ProReuseTabs as ProReuseTabs2 } from "./pro-reuse-tabs/index.js";
9
+ import { ProLayout } from "./pro-layout/index.js";
10
+ import { ProLayout as ProLayout2 } from "./pro-layout/index.js";
9
11
  const index = {
10
12
  install(app) {
11
13
  app.use(ProBreadcrumb);
14
+ app.use(ProLayout);
12
15
  app.use(ProMenu);
13
16
  app.use(ProPageWrapper);
14
17
  app.use(ProReuseTabs);
@@ -16,6 +19,7 @@ const index = {
16
19
  };
17
20
  export {
18
21
  ProBreadcrumb2 as ProBreadcrumb,
22
+ ProLayout2 as ProLayout,
19
23
  ProMenu2 as ProMenu,
20
24
  ProPageWrapper2 as ProPageWrapper,
21
25
  ProReuseTabs2 as ProReuseTabs,
@@ -0,0 +1,5 @@
1
+ /** 主题 */
2
+ export declare enum EProLayoutTheme {
3
+ light = "light",
4
+ dark = "dark"
5
+ }
@@ -0,0 +1,8 @@
1
+ var EProLayoutTheme = /* @__PURE__ */ ((EProLayoutTheme2) => {
2
+ EProLayoutTheme2["light"] = "light";
3
+ EProLayoutTheme2["dark"] = "dark";
4
+ return EProLayoutTheme2;
5
+ })(EProLayoutTheme || {});
6
+ export {
7
+ EProLayoutTheme
8
+ };
@@ -0,0 +1,20 @@
1
+ import { type Ref } from 'vue';
2
+ import type { IProMenuItem } from '../../pro-menu';
3
+ export declare function useHooks(menuItems: Ref<IProMenuItem[]>, options: {
4
+ tabsMode: boolean;
5
+ }): {
6
+ menuSelectedKeys: Ref<string[]>;
7
+ menuOpenKeys: Ref<string[]>;
8
+ onMenuItemClick: (key: string) => void;
9
+ onSubMenuClick: (key: string, openKeys: string[]) => void;
10
+ activeMenuItem: Ref<IProMenuItem | undefined>;
11
+ breadcrumbItems: Ref<string[]>;
12
+ tabs: Ref<{
13
+ name: string;
14
+ title: string;
15
+ fullPath: string;
16
+ active: boolean;
17
+ }[]>;
18
+ onTabClick: (key: string) => void;
19
+ onTabDelete: (key: string) => void;
20
+ };
@@ -0,0 +1,148 @@
1
+ import { ref, watch } from "vue";
2
+ import { useRoute, useRouter } from "vue-router";
3
+ function useHooks(menuItems, options) {
4
+ const route = useRoute();
5
+ const router = useRouter();
6
+ const menuSelectedKeys = ref([]);
7
+ const menuOpenKeys = ref([]);
8
+ const onMenuItemClick = (key) => {
9
+ menuSelectedKeys.value = [key];
10
+ };
11
+ const onSubMenuClick = (key, openKeys) => {
12
+ menuOpenKeys.value = openKeys;
13
+ };
14
+ const activeMenuItem = ref();
15
+ const menuItemMap = ref({});
16
+ const breadcrumbItems = ref([]);
17
+ const tabs = ref([]);
18
+ const setBreadcrumbItems = () => {
19
+ var _a, _b;
20
+ const menuItemPaths = [];
21
+ const recursion = (_menuItem) => {
22
+ var _a2;
23
+ let find = false;
24
+ for (const i in _menuItem) {
25
+ if (_menuItem[i].name === ((_a2 = activeMenuItem.value) == null ? void 0 : _a2.name)) {
26
+ find = true;
27
+ menuItemPaths.push(_menuItem[i]);
28
+ }
29
+ const children = _menuItem[i].children;
30
+ if (children) {
31
+ const node = recursion(children);
32
+ if (node) {
33
+ menuItemPaths.push(_menuItem[i]);
34
+ }
35
+ }
36
+ }
37
+ return find;
38
+ };
39
+ recursion(menuItems.value);
40
+ const activeMenuItemPaths = menuItemPaths.reverse();
41
+ const parentMenuPaths = activeMenuItemPaths.filter((_, i) => i !== activeMenuItemPaths.length - 1);
42
+ const keySet = /* @__PURE__ */ new Set([...parentMenuPaths.map((v) => v.name), ...menuOpenKeys.value]);
43
+ menuOpenKeys.value = [...keySet];
44
+ const activeMenuItemTitles = activeMenuItemPaths.map((v) => v.title);
45
+ breadcrumbItems.value = ((_a = activeMenuItem.value) == null ? void 0 : _a.breadcrumbs) ? (_b = activeMenuItem.value) == null ? void 0 : _b.breadcrumbs : activeMenuItemTitles.length !== 0 ? activeMenuItemTitles : [];
46
+ };
47
+ function setTabs() {
48
+ const { name: menuItemName, title: menuItemTitle, noAffix } = activeMenuItem.value;
49
+ if (noAffix) {
50
+ return;
51
+ }
52
+ let findIndex = -1;
53
+ tabs.value.forEach((v, i) => {
54
+ v.active = false;
55
+ if (v.name === menuItemName) {
56
+ findIndex = i;
57
+ }
58
+ });
59
+ const newTab = {
60
+ name: menuItemName,
61
+ title: menuItemTitle ?? menuItemName,
62
+ fullPath: route.fullPath,
63
+ active: true
64
+ };
65
+ if (~findIndex) {
66
+ const findTab = tabs.value[findIndex];
67
+ if (findTab.fullPath === route.fullPath) {
68
+ findTab.active = true;
69
+ findTab.fullPath = route.fullPath;
70
+ } else {
71
+ tabs.value.splice(findIndex, 1);
72
+ setTimeout(() => {
73
+ tabs.value.push(newTab);
74
+ });
75
+ }
76
+ } else {
77
+ tabs.value.push(newTab);
78
+ }
79
+ }
80
+ const onTabClick = (key) => {
81
+ const findTabIndex = tabs.value.findIndex((v) => v.name === key);
82
+ const findTab = tabs.value[findTabIndex];
83
+ router.push(findTab.fullPath);
84
+ };
85
+ const onTabDelete = (key) => {
86
+ let activeIndex = -1;
87
+ let findTabIndex = -1;
88
+ tabs.value.forEach((tab, index) => {
89
+ if (tab.name === key) {
90
+ findTabIndex = index;
91
+ }
92
+ if (tab.active) {
93
+ activeIndex = index;
94
+ }
95
+ });
96
+ if (activeIndex === findTabIndex) {
97
+ let tab;
98
+ if (findTabIndex === 0) {
99
+ tab = tabs.value[findTabIndex + 1];
100
+ } else {
101
+ tab = tabs.value[findTabIndex - 1];
102
+ }
103
+ tab.active = true;
104
+ router.push(tab.fullPath);
105
+ }
106
+ tabs.value.splice(findTabIndex, 1);
107
+ };
108
+ watch(menuItems, () => {
109
+ const _menuItemMap = {};
110
+ const fn = (_menuItem) => {
111
+ _menuItem.forEach((menuItem) => {
112
+ if (menuItem.children && menuItem.children.length > 0) {
113
+ fn(menuItem.children);
114
+ }
115
+ delete menuItem["children"];
116
+ _menuItemMap[menuItem.name] = menuItem;
117
+ });
118
+ };
119
+ fn(JSON.parse(JSON.stringify(menuItems.value)));
120
+ menuItemMap.value = _menuItemMap;
121
+ }, { immediate: true });
122
+ watch(() => route.name, () => {
123
+ const routeName = route.name;
124
+ activeMenuItem.value = menuItemMap.value[routeName];
125
+ if (!(activeMenuItem == null ? void 0 : activeMenuItem.value)) {
126
+ return;
127
+ }
128
+ menuSelectedKeys.value = [activeMenuItem.value.name];
129
+ setBreadcrumbItems();
130
+ if (options.tabsMode) {
131
+ setTabs();
132
+ }
133
+ }, { immediate: true });
134
+ return {
135
+ menuSelectedKeys,
136
+ menuOpenKeys,
137
+ onMenuItemClick,
138
+ onSubMenuClick,
139
+ activeMenuItem,
140
+ breadcrumbItems,
141
+ tabs,
142
+ onTabClick,
143
+ onTabDelete
144
+ };
145
+ }
146
+ export {
147
+ useHooks
148
+ };
@@ -0,0 +1,6 @@
1
+ import type { Ref } from 'vue';
2
+ import { EProLayoutTheme } from '../enum';
3
+ export declare function useThemeHooks(initValue: EProLayoutTheme): {
4
+ currentTheme: Readonly<Ref<EProLayoutTheme>>;
5
+ onToggleCurrentTheme: () => void;
6
+ };
@@ -0,0 +1,41 @@
1
+ import { ref, watch, readonly } from "vue";
2
+ import { EProLayoutTheme } from "../enum.js";
3
+ function useThemeHooks(initValue) {
4
+ const themeStorageKey = "theme";
5
+ const theme = ref(localStorage.getItem(themeStorageKey) ?? initValue);
6
+ const setTheme = (_theme) => {
7
+ switch (_theme) {
8
+ case EProLayoutTheme.light:
9
+ document.body.removeAttribute("arco-theme");
10
+ break;
11
+ case EProLayoutTheme.dark:
12
+ document.body.setAttribute("arco-theme", "dark");
13
+ break;
14
+ }
15
+ theme.value = _theme;
16
+ localStorage.setItem(themeStorageKey, theme.value);
17
+ };
18
+ const onToggleTheme = () => {
19
+ switch (theme.value) {
20
+ case EProLayoutTheme.light:
21
+ setTheme(EProLayoutTheme.dark);
22
+ break;
23
+ case EProLayoutTheme.dark:
24
+ setTheme(EProLayoutTheme.light);
25
+ break;
26
+ }
27
+ };
28
+ watch(theme, () => {
29
+ setTheme(theme.value);
30
+ }, { immediate: true });
31
+ watch(() => initValue, () => {
32
+ setTheme(initValue);
33
+ });
34
+ return {
35
+ currentTheme: readonly(theme),
36
+ onToggleCurrentTheme: onToggleTheme
37
+ };
38
+ }
39
+ export {
40
+ useThemeHooks
41
+ };
@@ -0,0 +1,379 @@
1
+ import type { EProLayoutTheme } from './enum';
2
+ import type { IProMenuItem } from '../pro-menu';
3
+ import type { ComponentInternalInstance, ExtractPropTypes, PropType, VNodeProps, AllowedComponentProps, ComponentCustomProps, Slot, ComponentPublicInstance, ComponentOptionsBase, Ref, ComputedRef, ComponentOptionsMixin, DebuggerEvent, nextTick, WatchOptions, WatchStopHandle, ShallowUnwrapRef, ComponentCustomProperties, App } from 'vue';
4
+ declare const ProLayout: {
5
+ new (...args: any[]): {
6
+ $: ComponentInternalInstance;
7
+ $data: {};
8
+ $props: Partial<{
9
+ menuItems: IProMenuItem[];
10
+ headerTitle: string;
11
+ headerLogo: string;
12
+ headerRightItemSlotNames: string[];
13
+ hideThemeItem: boolean;
14
+ footerTitle: string;
15
+ theme: EProLayoutTheme;
16
+ tabsMode: boolean;
17
+ user: {
18
+ name: string;
19
+ avatar?: string | undefined;
20
+ };
21
+ }> & Omit<Readonly<ExtractPropTypes<{
22
+ menuItems: {
23
+ type: PropType<IProMenuItem[]>;
24
+ required: false;
25
+ default: () => never[];
26
+ };
27
+ headerTitle: {
28
+ type: PropType<string>;
29
+ required: false;
30
+ default: string;
31
+ };
32
+ headerLogo: {
33
+ type: PropType<string>;
34
+ required: false;
35
+ default: string;
36
+ };
37
+ headerRightItemSlotNames: {
38
+ type: PropType<string[]>;
39
+ required: false;
40
+ default: () => never[];
41
+ };
42
+ hideThemeItem: {
43
+ type: PropType<boolean>;
44
+ required: false;
45
+ default: boolean;
46
+ };
47
+ footerTitle: {
48
+ type: PropType<string>;
49
+ required: false;
50
+ default: string;
51
+ };
52
+ theme: {
53
+ type: PropType<EProLayoutTheme>;
54
+ required: false;
55
+ default: EProLayoutTheme;
56
+ };
57
+ tabsMode: {
58
+ type: PropType<boolean>;
59
+ required: false;
60
+ default: boolean;
61
+ };
62
+ user: {
63
+ type: PropType<{
64
+ name: string;
65
+ avatar?: string | undefined;
66
+ }>;
67
+ required: false;
68
+ default: undefined;
69
+ };
70
+ }>> & VNodeProps & AllowedComponentProps & ComponentCustomProps, "menuItems" | "headerTitle" | "headerLogo" | "headerRightItemSlotNames" | "hideThemeItem" | "footerTitle" | "theme" | "tabsMode" | "user">;
71
+ $attrs: {
72
+ [x: string]: unknown;
73
+ };
74
+ $refs: {
75
+ [x: string]: unknown;
76
+ };
77
+ $slots: Readonly<{
78
+ [name: string]: Slot | undefined;
79
+ }>;
80
+ $root: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
81
+ $parent: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null;
82
+ $emit: (event: string, ...args: any[]) => void;
83
+ $el: any;
84
+ $options: ComponentOptionsBase<Readonly<ExtractPropTypes<{
85
+ menuItems: {
86
+ type: PropType<IProMenuItem[]>;
87
+ required: false;
88
+ default: () => never[];
89
+ };
90
+ headerTitle: {
91
+ type: PropType<string>;
92
+ required: false;
93
+ default: string;
94
+ };
95
+ headerLogo: {
96
+ type: PropType<string>;
97
+ required: false;
98
+ default: string;
99
+ };
100
+ headerRightItemSlotNames: {
101
+ type: PropType<string[]>;
102
+ required: false;
103
+ default: () => never[];
104
+ };
105
+ hideThemeItem: {
106
+ type: PropType<boolean>;
107
+ required: false;
108
+ default: boolean;
109
+ };
110
+ footerTitle: {
111
+ type: PropType<string>;
112
+ required: false;
113
+ default: string;
114
+ };
115
+ theme: {
116
+ type: PropType<EProLayoutTheme>;
117
+ required: false;
118
+ default: EProLayoutTheme;
119
+ };
120
+ tabsMode: {
121
+ type: PropType<boolean>;
122
+ required: false;
123
+ default: boolean;
124
+ };
125
+ user: {
126
+ type: PropType<{
127
+ name: string;
128
+ avatar?: string | undefined;
129
+ }>;
130
+ required: false;
131
+ default: undefined;
132
+ };
133
+ }>>, {
134
+ prefixClsName: string;
135
+ props: any;
136
+ menuItems: Ref<IProMenuItem[]>;
137
+ slots: Readonly<{
138
+ [name: string]: Slot | undefined;
139
+ }>;
140
+ currentTheme: Readonly<Ref<EProLayoutTheme>>;
141
+ onToggleCurrentTheme: () => void;
142
+ menuSelectedKeys: Ref<string[]>;
143
+ menuOpenKeys: Ref<string[]>;
144
+ onMenuItemClick: (key: string) => void;
145
+ onSubMenuClick: (key: string, openKeys: string[]) => void;
146
+ activeMenuItem: Ref<IProMenuItem | undefined>;
147
+ breadcrumbItems: Ref<string[]>;
148
+ tabs: Ref<{
149
+ name: string;
150
+ title: string;
151
+ fullPath: string;
152
+ active: boolean;
153
+ }[]>;
154
+ onTabClick: (key: string) => void;
155
+ onTabDelete: (key: string) => void;
156
+ keepAliveKeys: ComputedRef<string[]>;
157
+ siderWidth: number;
158
+ siderCollapsedWidth: number;
159
+ siderWidthPx: string;
160
+ siderCollapsedWidthPx: string;
161
+ siderCollapsed: Ref<boolean>;
162
+ onSiderCollapse: (val: boolean) => void;
163
+ readonly EProLayoutTheme: typeof EProLayoutTheme;
164
+ }, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {
165
+ menuItems: IProMenuItem[];
166
+ headerTitle: string;
167
+ headerLogo: string;
168
+ headerRightItemSlotNames: string[];
169
+ hideThemeItem: boolean;
170
+ footerTitle: string;
171
+ theme: EProLayoutTheme;
172
+ tabsMode: boolean;
173
+ user: {
174
+ name: string;
175
+ avatar?: string | undefined;
176
+ };
177
+ }, {}, string> & {
178
+ beforeCreate?: ((() => void) | (() => void)[]) | undefined;
179
+ created?: ((() => void) | (() => void)[]) | undefined;
180
+ beforeMount?: ((() => void) | (() => void)[]) | undefined;
181
+ mounted?: ((() => void) | (() => void)[]) | undefined;
182
+ beforeUpdate?: ((() => void) | (() => void)[]) | undefined;
183
+ updated?: ((() => void) | (() => void)[]) | undefined;
184
+ activated?: ((() => void) | (() => void)[]) | undefined;
185
+ deactivated?: ((() => void) | (() => void)[]) | undefined;
186
+ beforeDestroy?: ((() => void) | (() => void)[]) | undefined;
187
+ beforeUnmount?: ((() => void) | (() => void)[]) | undefined;
188
+ destroyed?: ((() => void) | (() => void)[]) | undefined;
189
+ unmounted?: ((() => void) | (() => void)[]) | undefined;
190
+ renderTracked?: (((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[]) | undefined;
191
+ renderTriggered?: (((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[]) | undefined;
192
+ errorCaptured?: (((err: unknown, instance: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void) | ((err: unknown, instance: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}> | null, info: string) => boolean | void)[]) | undefined;
193
+ };
194
+ $forceUpdate: () => void;
195
+ $nextTick: typeof nextTick;
196
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (args_0: R, args_1: R) => any : (...args: any) => any, options?: WatchOptions<boolean> | undefined): WatchStopHandle;
197
+ } & Readonly<ExtractPropTypes<{
198
+ menuItems: {
199
+ type: PropType<IProMenuItem[]>;
200
+ required: false;
201
+ default: () => never[];
202
+ };
203
+ headerTitle: {
204
+ type: PropType<string>;
205
+ required: false;
206
+ default: string;
207
+ };
208
+ headerLogo: {
209
+ type: PropType<string>;
210
+ required: false;
211
+ default: string;
212
+ };
213
+ headerRightItemSlotNames: {
214
+ type: PropType<string[]>;
215
+ required: false;
216
+ default: () => never[];
217
+ };
218
+ hideThemeItem: {
219
+ type: PropType<boolean>;
220
+ required: false;
221
+ default: boolean;
222
+ };
223
+ footerTitle: {
224
+ type: PropType<string>;
225
+ required: false;
226
+ default: string;
227
+ };
228
+ theme: {
229
+ type: PropType<EProLayoutTheme>;
230
+ required: false;
231
+ default: EProLayoutTheme;
232
+ };
233
+ tabsMode: {
234
+ type: PropType<boolean>;
235
+ required: false;
236
+ default: boolean;
237
+ };
238
+ user: {
239
+ type: PropType<{
240
+ name: string;
241
+ avatar?: string | undefined;
242
+ }>;
243
+ required: false;
244
+ default: undefined;
245
+ };
246
+ }>> & ShallowUnwrapRef<{
247
+ prefixClsName: string;
248
+ props: any;
249
+ menuItems: Ref<IProMenuItem[]>;
250
+ slots: Readonly<{
251
+ [name: string]: Slot | undefined;
252
+ }>;
253
+ currentTheme: Readonly<Ref<EProLayoutTheme>>;
254
+ onToggleCurrentTheme: () => void;
255
+ menuSelectedKeys: Ref<string[]>;
256
+ menuOpenKeys: Ref<string[]>;
257
+ onMenuItemClick: (key: string) => void;
258
+ onSubMenuClick: (key: string, openKeys: string[]) => void;
259
+ activeMenuItem: Ref<IProMenuItem | undefined>;
260
+ breadcrumbItems: Ref<string[]>;
261
+ tabs: Ref<{
262
+ name: string;
263
+ title: string;
264
+ fullPath: string;
265
+ active: boolean;
266
+ }[]>;
267
+ onTabClick: (key: string) => void;
268
+ onTabDelete: (key: string) => void;
269
+ keepAliveKeys: ComputedRef<string[]>;
270
+ siderWidth: number;
271
+ siderCollapsedWidth: number;
272
+ siderWidthPx: string;
273
+ siderCollapsedWidthPx: string;
274
+ siderCollapsed: Ref<boolean>;
275
+ onSiderCollapse: (val: boolean) => void;
276
+ readonly EProLayoutTheme: typeof EProLayoutTheme;
277
+ }> & {} & ComponentCustomProperties & {};
278
+ __isFragment?: undefined;
279
+ __isTeleport?: undefined;
280
+ __isSuspense?: undefined;
281
+ } & ComponentOptionsBase<Readonly<ExtractPropTypes<{
282
+ menuItems: {
283
+ type: PropType<IProMenuItem[]>;
284
+ required: false;
285
+ default: () => never[];
286
+ };
287
+ headerTitle: {
288
+ type: PropType<string>;
289
+ required: false;
290
+ default: string;
291
+ };
292
+ headerLogo: {
293
+ type: PropType<string>;
294
+ required: false;
295
+ default: string;
296
+ };
297
+ headerRightItemSlotNames: {
298
+ type: PropType<string[]>;
299
+ required: false;
300
+ default: () => never[];
301
+ };
302
+ hideThemeItem: {
303
+ type: PropType<boolean>;
304
+ required: false;
305
+ default: boolean;
306
+ };
307
+ footerTitle: {
308
+ type: PropType<string>;
309
+ required: false;
310
+ default: string;
311
+ };
312
+ theme: {
313
+ type: PropType<EProLayoutTheme>;
314
+ required: false;
315
+ default: EProLayoutTheme;
316
+ };
317
+ tabsMode: {
318
+ type: PropType<boolean>;
319
+ required: false;
320
+ default: boolean;
321
+ };
322
+ user: {
323
+ type: PropType<{
324
+ name: string;
325
+ avatar?: string | undefined;
326
+ }>;
327
+ required: false;
328
+ default: undefined;
329
+ };
330
+ }>>, {
331
+ prefixClsName: string;
332
+ props: any;
333
+ menuItems: Ref<IProMenuItem[]>;
334
+ slots: Readonly<{
335
+ [name: string]: Slot | undefined;
336
+ }>;
337
+ currentTheme: Readonly<Ref<EProLayoutTheme>>;
338
+ onToggleCurrentTheme: () => void;
339
+ menuSelectedKeys: Ref<string[]>;
340
+ menuOpenKeys: Ref<string[]>;
341
+ onMenuItemClick: (key: string) => void;
342
+ onSubMenuClick: (key: string, openKeys: string[]) => void;
343
+ activeMenuItem: Ref<IProMenuItem | undefined>;
344
+ breadcrumbItems: Ref<string[]>;
345
+ tabs: Ref<{
346
+ name: string;
347
+ title: string;
348
+ fullPath: string;
349
+ active: boolean;
350
+ }[]>;
351
+ onTabClick: (key: string) => void;
352
+ onTabDelete: (key: string) => void;
353
+ keepAliveKeys: ComputedRef<string[]>;
354
+ siderWidth: number;
355
+ siderCollapsedWidth: number;
356
+ siderWidthPx: string;
357
+ siderCollapsedWidthPx: string;
358
+ siderCollapsed: Ref<boolean>;
359
+ onSiderCollapse: (val: boolean) => void;
360
+ readonly EProLayoutTheme: typeof EProLayoutTheme;
361
+ }, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {
362
+ menuItems: IProMenuItem[];
363
+ headerTitle: string;
364
+ headerLogo: string;
365
+ headerRightItemSlotNames: string[];
366
+ hideThemeItem: boolean;
367
+ footerTitle: string;
368
+ theme: EProLayoutTheme;
369
+ tabsMode: boolean;
370
+ user: {
371
+ name: string;
372
+ avatar?: string | undefined;
373
+ };
374
+ }, {}, string> & VNodeProps & AllowedComponentProps & ComponentCustomProps & {
375
+ install: (app: App) => void;
376
+ };
377
+ export * from './enum';
378
+ export { ProLayout };
379
+ export default ProLayout;
@@ -0,0 +1,25 @@
1
+ import _sfc_main from "./pro-layout.vue.js";
2
+ import "./pro-layout.vue2.js";
3
+ import { Layout, Space, Typography, Tooltip, Button, Dropdown, Avatar } from "@arco-design/web-vue";
4
+ import { ProMenu } from "../pro-menu/index.js";
5
+ import { ProReuseTabs } from "../pro-reuse-tabs/index.js";
6
+ import { ProPageWrapper } from "../pro-page-wrapper/index.js";
7
+ const ProLayout = Object.assign(_sfc_main, {
8
+ install: (app) => {
9
+ app.use(Layout);
10
+ app.use(Space);
11
+ app.use(Typography);
12
+ app.use(Tooltip);
13
+ app.use(Button);
14
+ app.use(Dropdown);
15
+ app.use(Avatar);
16
+ app.use(ProMenu);
17
+ app.use(ProReuseTabs);
18
+ app.use(ProPageWrapper);
19
+ app.component("KbProLayout", _sfc_main);
20
+ }
21
+ });
22
+ export {
23
+ ProLayout,
24
+ ProLayout as default
25
+ };
@@ -0,0 +1,147 @@
1
+ import type { DefineComponent, Ref, Slot, ComputedRef, ComponentOptionsMixin, VNodeProps, AllowedComponentProps, ComponentCustomProps, ExtractPropTypes, type PropType } from 'vue';
2
+ import type { IProMenuItem } from '../pro-menu';
3
+ import { EProLayoutTheme } from './enum';
4
+ declare const _sfc_main: DefineComponent<{
5
+ menuItems: {
6
+ type: PropType<IProMenuItem[]>;
7
+ required: false;
8
+ default: () => never[];
9
+ };
10
+ headerTitle: {
11
+ type: PropType<string>;
12
+ required: false;
13
+ default: string;
14
+ };
15
+ headerLogo: {
16
+ type: PropType<string>;
17
+ required: false;
18
+ default: string;
19
+ };
20
+ headerRightItemSlotNames: {
21
+ type: PropType<string[]>;
22
+ required: false;
23
+ default: () => never[];
24
+ };
25
+ hideThemeItem: {
26
+ type: PropType<boolean>;
27
+ required: false;
28
+ default: boolean;
29
+ };
30
+ footerTitle: {
31
+ type: PropType<string>;
32
+ required: false;
33
+ default: string;
34
+ };
35
+ theme: {
36
+ type: PropType<EProLayoutTheme>;
37
+ required: false;
38
+ default: EProLayoutTheme;
39
+ };
40
+ tabsMode: {
41
+ type: PropType<boolean>;
42
+ required: false;
43
+ default: boolean;
44
+ };
45
+ user: {
46
+ type: PropType<{
47
+ name: string;
48
+ avatar?: string | undefined;
49
+ }>;
50
+ required: false;
51
+ default: undefined;
52
+ };
53
+ }, {
54
+ prefixClsName: string;
55
+ props: any;
56
+ menuItems: Ref<IProMenuItem[]>;
57
+ slots: Readonly<{
58
+ [name: string]: Slot | undefined;
59
+ }>;
60
+ currentTheme: Readonly<Ref<EProLayoutTheme>>;
61
+ onToggleCurrentTheme: () => void;
62
+ menuSelectedKeys: Ref<string[]>;
63
+ menuOpenKeys: Ref<string[]>;
64
+ onMenuItemClick: (key: string) => void;
65
+ onSubMenuClick: (key: string, openKeys: string[]) => void;
66
+ activeMenuItem: Ref<IProMenuItem | undefined>;
67
+ breadcrumbItems: Ref<string[]>;
68
+ tabs: Ref<{
69
+ name: string;
70
+ title: string;
71
+ fullPath: string;
72
+ active: boolean;
73
+ }[]>;
74
+ onTabClick: (key: string) => void;
75
+ onTabDelete: (key: string) => void;
76
+ keepAliveKeys: ComputedRef<string[]>;
77
+ siderWidth: number;
78
+ siderCollapsedWidth: number;
79
+ siderWidthPx: string;
80
+ siderCollapsedWidthPx: string;
81
+ siderCollapsed: Ref<boolean>;
82
+ onSiderCollapse: (val: boolean) => void;
83
+ readonly EProLayoutTheme: typeof EProLayoutTheme;
84
+ }, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<{
85
+ menuItems: {
86
+ type: PropType<IProMenuItem[]>;
87
+ required: false;
88
+ default: () => never[];
89
+ };
90
+ headerTitle: {
91
+ type: PropType<string>;
92
+ required: false;
93
+ default: string;
94
+ };
95
+ headerLogo: {
96
+ type: PropType<string>;
97
+ required: false;
98
+ default: string;
99
+ };
100
+ headerRightItemSlotNames: {
101
+ type: PropType<string[]>;
102
+ required: false;
103
+ default: () => never[];
104
+ };
105
+ hideThemeItem: {
106
+ type: PropType<boolean>;
107
+ required: false;
108
+ default: boolean;
109
+ };
110
+ footerTitle: {
111
+ type: PropType<string>;
112
+ required: false;
113
+ default: string;
114
+ };
115
+ theme: {
116
+ type: PropType<EProLayoutTheme>;
117
+ required: false;
118
+ default: EProLayoutTheme;
119
+ };
120
+ tabsMode: {
121
+ type: PropType<boolean>;
122
+ required: false;
123
+ default: boolean;
124
+ };
125
+ user: {
126
+ type: PropType<{
127
+ name: string;
128
+ avatar?: string | undefined;
129
+ }>;
130
+ required: false;
131
+ default: undefined;
132
+ };
133
+ }>>, {
134
+ menuItems: IProMenuItem[];
135
+ headerTitle: string;
136
+ headerLogo: string;
137
+ headerRightItemSlotNames: string[];
138
+ hideThemeItem: boolean;
139
+ footerTitle: string;
140
+ theme: EProLayoutTheme;
141
+ tabsMode: boolean;
142
+ user: {
143
+ name: string;
144
+ avatar?: string | undefined;
145
+ };
146
+ }>;
147
+ export default _sfc_main;
@@ -0,0 +1,300 @@
1
+ import { defineComponent, useCssVars, toRefs, useSlots, provide, computed, ref, resolveComponent, openBlock, createBlock, normalizeClass, withCtx, createVNode, createElementVNode, createTextVNode, toDisplayString, createCommentVNode, createElementBlock, Fragment, renderList, unref, renderSlot, resolveDynamicComponent, KeepAlive } from "vue";
2
+ import { useHooks } from "./hooks/index.js";
3
+ import { EProLayoutTheme } from "./enum.js";
4
+ import { useThemeHooks } from "./hooks/theme.js";
5
+ const _hoisted_1 = ["src"];
6
+ const _hoisted_2 = { key: 0 };
7
+ const _hoisted_3 = { key: 0 };
8
+ const _hoisted_4 = ["src"];
9
+ const _sfc_main = /* @__PURE__ */ defineComponent({
10
+ __name: "pro-layout",
11
+ props: {
12
+ menuItems: {
13
+ type: Array,
14
+ required: false,
15
+ default: () => []
16
+ },
17
+ headerTitle: {
18
+ type: String,
19
+ required: false,
20
+ default: "KeyBlade Pro"
21
+ },
22
+ headerLogo: {
23
+ type: String,
24
+ required: false,
25
+ default: "http://p3-armor.byteimg.com/tos-cn-i-49unhts6dw/dfdba5317c0c20ce20e64fac803d52bc.svg~tplv-49unhts6dw-image.image"
26
+ },
27
+ headerRightItemSlotNames: {
28
+ type: Array,
29
+ required: false,
30
+ default: () => []
31
+ },
32
+ hideThemeItem: {
33
+ type: Boolean,
34
+ required: false,
35
+ default: false
36
+ },
37
+ footerTitle: {
38
+ type: String,
39
+ required: false,
40
+ default: "KeyBlade Pro"
41
+ },
42
+ theme: {
43
+ type: String,
44
+ required: false,
45
+ default: EProLayoutTheme.light
46
+ },
47
+ tabsMode: {
48
+ type: Boolean,
49
+ required: false,
50
+ default: true
51
+ },
52
+ user: {
53
+ type: Object,
54
+ required: false,
55
+ default: void 0
56
+ }
57
+ },
58
+ setup(__props) {
59
+ const props = __props;
60
+ useCssVars((_ctx) => ({
61
+ "9d934a56": siderWidthPx,
62
+ "473aa8e0": siderCollapsedWidthPx
63
+ }));
64
+ const prefixClsName = "keyblade-pro-layout";
65
+ const { menuItems } = toRefs(props);
66
+ const slots = useSlots();
67
+ const { currentTheme, onToggleCurrentTheme } = useThemeHooks(props.theme);
68
+ const {
69
+ menuSelectedKeys,
70
+ menuOpenKeys,
71
+ onMenuItemClick,
72
+ onSubMenuClick,
73
+ activeMenuItem,
74
+ breadcrumbItems,
75
+ tabs,
76
+ onTabClick,
77
+ onTabDelete
78
+ } = useHooks(menuItems, {
79
+ tabsMode: props.tabsMode
80
+ });
81
+ provide("ProBreadcrumbItems", breadcrumbItems);
82
+ const keepAliveKeys = computed(() => {
83
+ const keys = [];
84
+ tabs.value.forEach((tab) => {
85
+ var _a, _b;
86
+ if (tab.name === ((_a = activeMenuItem == null ? void 0 : activeMenuItem.value) == null ? void 0 : _a.name) && ((_b = activeMenuItem.value) == null ? void 0 : _b.ignoreCache)) {
87
+ return;
88
+ }
89
+ keys.push(tab.name);
90
+ });
91
+ return keys;
92
+ });
93
+ const siderWidth = 220;
94
+ const siderCollapsedWidth = 48;
95
+ const siderWidthPx = `${siderWidth}px`;
96
+ const siderCollapsedWidthPx = `${siderCollapsedWidth}px`;
97
+ const siderCollapsed = ref(false);
98
+ const onSiderCollapse = (val) => {
99
+ siderCollapsed.value = val;
100
+ };
101
+ return (_ctx, _cache) => {
102
+ const _component_a_typography_title = resolveComponent("a-typography-title");
103
+ const _component_a_space = resolveComponent("a-space");
104
+ const _component_icon_sun_fill = resolveComponent("icon-sun-fill");
105
+ const _component_icon_moon_fill = resolveComponent("icon-moon-fill");
106
+ const _component_a_button = resolveComponent("a-button");
107
+ const _component_a_tooltip = resolveComponent("a-tooltip");
108
+ const _component_icon_user = resolveComponent("icon-user");
109
+ const _component_a_avatar = resolveComponent("a-avatar");
110
+ const _component_a_dropdown = resolveComponent("a-dropdown");
111
+ const _component_a_layout_header = resolveComponent("a-layout-header");
112
+ const _component_kb_pro_menu = resolveComponent("kb-pro-menu");
113
+ const _component_a_layout_sider = resolveComponent("a-layout-sider");
114
+ const _component_kb_pro_reuse_tabs = resolveComponent("kb-pro-reuse-tabs");
115
+ const _component_router_view = resolveComponent("router-view");
116
+ const _component_kb_pro_page_wrapper = resolveComponent("kb-pro-page-wrapper");
117
+ const _component_a_layout_content = resolveComponent("a-layout-content");
118
+ const _component_a_layout_footer = resolveComponent("a-layout-footer");
119
+ const _component_a_layout = resolveComponent("a-layout");
120
+ return openBlock(), createBlock(_component_a_layout, {
121
+ class: normalizeClass(prefixClsName)
122
+ }, {
123
+ default: withCtx(() => [
124
+ createVNode(_component_a_layout_header, {
125
+ class: normalizeClass(`${prefixClsName}-header`)
126
+ }, {
127
+ default: withCtx(() => [
128
+ createElementVNode("div", {
129
+ class: normalizeClass(`${prefixClsName}-header-left`)
130
+ }, [
131
+ createVNode(_component_a_space, null, {
132
+ default: withCtx(() => [
133
+ createElementVNode("img", {
134
+ alt: "logo",
135
+ src: __props.headerLogo,
136
+ style: { "height": "28px" }
137
+ }, null, 8, _hoisted_1),
138
+ !siderCollapsed.value ? (openBlock(), createBlock(_component_a_typography_title, {
139
+ key: 0,
140
+ heading: 5,
141
+ style: { "margin": "0", "font-size": "18px" }
142
+ }, {
143
+ default: withCtx(() => [
144
+ createTextVNode(toDisplayString(__props.headerTitle), 1)
145
+ ]),
146
+ _: 1
147
+ })) : createCommentVNode("", true)
148
+ ]),
149
+ _: 1
150
+ })
151
+ ], 2),
152
+ createElementVNode("ul", {
153
+ class: normalizeClass(`${prefixClsName}-header-right`)
154
+ }, [
155
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.headerRightItemSlotNames, (slotName) => {
156
+ return openBlock(), createElementBlock(Fragment, { key: slotName }, [
157
+ unref(slots)[slotName] ? (openBlock(), createElementBlock("li", _hoisted_2, [
158
+ renderSlot(_ctx.$slots, slotName)
159
+ ])) : createCommentVNode("", true)
160
+ ], 64);
161
+ }), 128)),
162
+ !__props.hideThemeItem ? (openBlock(), createElementBlock("li", _hoisted_3, [
163
+ createVNode(_component_a_tooltip, { content: "切换主题" }, {
164
+ default: withCtx(() => [
165
+ createVNode(_component_a_button, {
166
+ class: normalizeClass(`${prefixClsName}-header-right-btn`),
167
+ type: "outline",
168
+ size: "medium",
169
+ shape: "circle",
170
+ onClick: unref(onToggleCurrentTheme)
171
+ }, {
172
+ icon: withCtx(() => [
173
+ unref(currentTheme) === unref(EProLayoutTheme).light ? (openBlock(), createBlock(_component_icon_sun_fill, { key: 0 })) : createCommentVNode("", true),
174
+ unref(currentTheme) === unref(EProLayoutTheme).dark ? (openBlock(), createBlock(_component_icon_moon_fill, { key: 1 })) : createCommentVNode("", true)
175
+ ]),
176
+ _: 1
177
+ }, 8, ["class", "onClick"])
178
+ ]),
179
+ _: 1
180
+ })
181
+ ])) : createCommentVNode("", true),
182
+ createElementVNode("li", null, [
183
+ createVNode(_component_a_dropdown, { trigger: "hover" }, {
184
+ content: withCtx(() => [
185
+ renderSlot(_ctx.$slots, "avatar-dropdown-content")
186
+ ]),
187
+ default: withCtx(() => [
188
+ createVNode(_component_a_avatar, {
189
+ size: 32,
190
+ style: { marginRight: "8px", cursor: "pointer" }
191
+ }, {
192
+ default: withCtx(() => {
193
+ var _a, _b;
194
+ return [
195
+ ((_a = __props.user) == null ? void 0 : _a.avatar) ? (openBlock(), createElementBlock("img", {
196
+ key: 0,
197
+ alt: "avatar",
198
+ src: (_b = __props.user) == null ? void 0 : _b.avatar
199
+ }, null, 8, _hoisted_4)) : (openBlock(), createBlock(_component_icon_user, { key: 1 }))
200
+ ];
201
+ }),
202
+ _: 1
203
+ })
204
+ ]),
205
+ _: 3
206
+ })
207
+ ])
208
+ ], 2)
209
+ ]),
210
+ _: 3
211
+ }, 8, ["class"]),
212
+ createVNode(_component_a_layout, null, {
213
+ default: withCtx(() => [
214
+ createVNode(_component_a_layout_sider, {
215
+ class: normalizeClass(`${prefixClsName}-sider`),
216
+ collapsible: true,
217
+ width: siderWidth,
218
+ breakpoint: "md",
219
+ collapsed: siderCollapsed.value,
220
+ "hide-trigger": true,
221
+ onCollapse: onSiderCollapse
222
+ }, {
223
+ default: withCtx(() => [
224
+ createVNode(_component_kb_pro_menu, {
225
+ collapsed: siderCollapsed.value,
226
+ "selected-keys": unref(menuSelectedKeys),
227
+ "open-keys": unref(menuOpenKeys),
228
+ items: unref(menuItems),
229
+ onCollapse: onSiderCollapse,
230
+ onMenuItemClick: unref(onMenuItemClick),
231
+ onSubMenuClick: unref(onSubMenuClick)
232
+ }, null, 8, ["collapsed", "selected-keys", "open-keys", "items", "onMenuItemClick", "onSubMenuClick"])
233
+ ]),
234
+ _: 1
235
+ }, 8, ["class", "collapsed"]),
236
+ createVNode(_component_a_layout, {
237
+ class: normalizeClass(`${prefixClsName}-body` + (siderCollapsed.value ? ` ${prefixClsName}-body-collapsed` : ""))
238
+ }, {
239
+ default: withCtx(() => [
240
+ createVNode(_component_a_layout_content, null, {
241
+ default: withCtx(() => {
242
+ var _a;
243
+ return [
244
+ __props.tabsMode && unref(tabs).length > 0 ? (openBlock(), createBlock(_component_kb_pro_reuse_tabs, {
245
+ key: 0,
246
+ tabs: unref(tabs),
247
+ onTabClick: unref(onTabClick),
248
+ onTabDelete: unref(onTabDelete)
249
+ }, null, 8, ["tabs", "onTabClick", "onTabDelete"])) : createCommentVNode("", true),
250
+ createVNode(_component_kb_pro_page_wrapper, {
251
+ "hide-page-wrapper": (_a = unref(activeMenuItem)) == null ? void 0 : _a.hidePageWrapper
252
+ }, {
253
+ default: withCtx(() => [
254
+ createVNode(_component_router_view, null, {
255
+ default: withCtx(({ Component, route }) => [
256
+ !__props.tabsMode ? (openBlock(), createBlock(resolveDynamicComponent(Component), {
257
+ key: route.fullPath
258
+ })) : (openBlock(), createBlock(KeepAlive, {
259
+ key: 1,
260
+ include: unref(keepAliveKeys),
261
+ max: 15
262
+ }, [
263
+ (openBlock(), createBlock(resolveDynamicComponent(Component), {
264
+ key: route.fullPath
265
+ }))
266
+ ], 1032, ["include"]))
267
+ ]),
268
+ _: 1
269
+ })
270
+ ]),
271
+ _: 1
272
+ }, 8, ["hide-page-wrapper"])
273
+ ];
274
+ }),
275
+ _: 1
276
+ }),
277
+ unref(slots)["footer"] !== void 0 ? renderSlot(_ctx.$slots, "footer", { key: 0 }) : (openBlock(), createBlock(_component_a_layout_footer, {
278
+ key: 1,
279
+ class: normalizeClass(`${prefixClsName}-body-footer`)
280
+ }, {
281
+ default: withCtx(() => [
282
+ createTextVNode(toDisplayString(__props.footerTitle), 1)
283
+ ]),
284
+ _: 1
285
+ }, 8, ["class"]))
286
+ ]),
287
+ _: 3
288
+ }, 8, ["class"])
289
+ ]),
290
+ _: 3
291
+ })
292
+ ]),
293
+ _: 3
294
+ });
295
+ };
296
+ }
297
+ });
298
+ export {
299
+ _sfc_main as default
300
+ };
@@ -0,0 +1,4 @@
1
+ const proLayout_vue_vue_type_style_index_0_lang = "";
2
+ export {
3
+ proLayout_vue_vue_type_style_index_0_lang as default
4
+ };
@@ -0,0 +1,6 @@
1
+ import _sfc_main from "./pro-layout.vue.js";
2
+ import { default as default2 } from "./pro-layout.vue.js";
3
+ import "./pro-layout.vue2.js";
4
+ export {
5
+ default2 as default
6
+ };
@@ -4,8 +4,8 @@ declare const ProPageWrapper: {
4
4
  $: ComponentInternalInstance;
5
5
  $data: {};
6
6
  $props: Partial<{
7
- hidePageWrapper: boolean;
8
7
  breadcrumbItems: string[];
8
+ hidePageWrapper: boolean;
9
9
  }> & Omit<Readonly<ExtractPropTypes<{
10
10
  hidePageWrapper: {
11
11
  type: PropType<boolean>;
@@ -17,7 +17,7 @@ declare const ProPageWrapper: {
17
17
  required: false;
18
18
  default: () => never[];
19
19
  };
20
- }>> & VNodeProps & AllowedComponentProps & ComponentCustomProps, "hidePageWrapper" | "breadcrumbItems">;
20
+ }>> & VNodeProps & AllowedComponentProps & ComponentCustomProps, "breadcrumbItems" | "hidePageWrapper">;
21
21
  $attrs: {
22
22
  [x: string]: unknown;
23
23
  };
@@ -46,8 +46,8 @@ declare const ProPageWrapper: {
46
46
  prefixClsName: string;
47
47
  prefixClsHideName: string;
48
48
  }, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {
49
- hidePageWrapper: boolean;
50
49
  breadcrumbItems: string[];
50
+ hidePageWrapper: boolean;
51
51
  }, {}, string> & {
52
52
  beforeCreate?: ((() => void) | (() => void)[]) | undefined;
53
53
  created?: ((() => void) | (() => void)[]) | undefined;
@@ -101,8 +101,8 @@ declare const ProPageWrapper: {
101
101
  prefixClsName: string;
102
102
  prefixClsHideName: string;
103
103
  }, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, {
104
- hidePageWrapper: boolean;
105
104
  breadcrumbItems: string[];
105
+ hidePageWrapper: boolean;
106
106
  }, {}, string> & VNodeProps & AllowedComponentProps & ComponentCustomProps & {
107
107
  install: (app: App) => void;
108
108
  };
@@ -29,7 +29,7 @@ declare const _sfc_main: DefineComponent<{
29
29
  default: () => never[];
30
30
  };
31
31
  }>>, {
32
- hidePageWrapper: boolean;
33
32
  breadcrumbItems: string[];
33
+ hidePageWrapper: boolean;
34
34
  }>;
35
35
  export default _sfc_main;
package/es/style.css CHANGED
@@ -1,8 +1,82 @@
1
- .keyblade-pro-page-wrapper {
2
- padding: 0 20px 20px 20px;
3
- }
4
1
  .keyblade-pro-reuse-tabs {
5
2
  position: relative;
6
3
  background-color: var(--color-bg-2);
7
4
  padding: 4px 20px;
8
5
  }
6
+ .keyblade-pro-layout {
7
+ width: 100%;
8
+ height: 100%;
9
+ }
10
+ .keyblade-pro-layout :global(.arco-layout-sider-trigger) {
11
+ border-top: 0;
12
+ }
13
+ .keyblade-pro-layout-header {
14
+ position: fixed;
15
+ top: 0;
16
+ left: 0;
17
+ width: 100%;
18
+ height: 60px;
19
+ z-index: 100;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ padding: 0 20px;
24
+ background-color: var(--color-bg-2);
25
+ border-bottom: 1px solid var(--color-border);
26
+ }
27
+ .keyblade-pro-layout-header-left {
28
+ cursor: pointer;
29
+ display: flex;
30
+ align-items: center;
31
+ }
32
+ .keyblade-pro-layout-header-right {
33
+ display: flex;
34
+ list-style: none;
35
+ }
36
+ .keyblade-pro-layout-header-right li {
37
+ display: flex;
38
+ align-items: center;
39
+ padding: 0 10px;
40
+ }
41
+ .keyblade-pro-layout-header-right .arco-btn-outline,
42
+ .keyblade-pro-layout-header-right-btn {
43
+ border-color: rgb(var(--gray-2));
44
+ color: rgb(var(--gray-8));
45
+ font-size: 16px;
46
+ }
47
+ .keyblade-pro-layout-sider {
48
+ padding-top: 60px;
49
+ position: fixed;
50
+ top: 0;
51
+ left: 0;
52
+ z-index: 99;
53
+ height: 100%;
54
+ transition: all 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
55
+ }
56
+ .keyblade-pro-layout-body {
57
+ padding-top: 60px;
58
+ padding-left: var(--9d934a56);
59
+ min-height: 100vh;
60
+ overflow-y: hidden;
61
+ background-color: var(--color-fill-2);
62
+ transition: padding 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
63
+ }
64
+ .keyblade-pro-layout-body-container {
65
+ background-color: var(--color-fill-2);
66
+ padding: 16px 20px 0;
67
+ display: flex;
68
+ }
69
+ .keyblade-pro-layout-body-footer {
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ height: 40px;
74
+ color: var(--color-text-2);
75
+ text-align: center;
76
+ }
77
+ .keyblade-pro-layout-body-collapsed {
78
+ padding-left: var(--473aa8e0);
79
+ }
80
+ .keyblade-pro-page-wrapper {
81
+ padding: 0 20px 20px 20px;
82
+ }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@keyblade/pro-components",
3
3
  "description": "KeyBlade Pro Components",
4
4
  "author": "yangshuai <704807396@qq.com>",
5
- "version": "0.0.1-alpha.7",
5
+ "version": "0.0.1-alpha.8",
6
6
  "private": false,
7
7
  "type": "module",
8
8
  "main": "es/index.js",
package/src/index.ts CHANGED
@@ -3,10 +3,12 @@ import { ProBreadcrumb } from './pro-breadcrumb'
3
3
  import { ProMenu } from './pro-menu'
4
4
  import { ProPageWrapper } from './pro-page-wrapper'
5
5
  import { ProReuseTabs } from './pro-reuse-tabs'
6
+ import { ProLayout } from './pro-layout'
6
7
 
7
8
  export default {
8
9
  install(app: App): void {
9
10
  app.use(ProBreadcrumb)
11
+ app.use(ProLayout)
10
12
  app.use(ProMenu)
11
13
  app.use(ProPageWrapper)
12
14
  app.use(ProReuseTabs)
@@ -16,6 +18,9 @@ export default {
16
18
  // 按组件导出
17
19
  export { default as ProBreadcrumb } from './pro-breadcrumb'
18
20
 
21
+ export { default as ProLayout } from './pro-layout'
22
+ export type { EProLayoutTheme } from './pro-layout'
23
+
19
24
  export { default as ProMenu } from './pro-menu'
20
25
  export type { IProMenuItem } from './pro-menu'
21
26