@jetlinks-web/components 2.0.1 → 2.0.2-2

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,392 +1,395 @@
1
- import type {
2
- BreadcrumbRender,
3
- FormatMessage,
4
- HeaderContentRender,
5
- WithFalse,
6
- HeaderRender,
7
- RightContentRender,
8
- CollapsedButtonRender,
9
- MenuExtraRender,
10
- SubMenuItemRender,
11
- MenuContentRender,
12
- MenuItemRender,
13
- MenuHeaderRender,
14
- } from '../typings';
15
- import SiderMenu, { siderMenuProps } from '../SiderMenu/SiderMenu';
16
- import type { CSSProperties, ExtractPropTypes, PropType } from 'vue';
17
- import {
18
- computed,
19
- defineComponent,
20
- provide,
21
- reactive,
22
- watchEffect,
23
- toRefs,
24
- } from 'vue';
25
- import { defaultSettingProps } from '../defaultSettings';
26
- import { baseHeaderProps } from '../TopHeader';
27
- import Header, { headerViewProps } from './Header';
28
- import type { VueNode } from 'ant-design-vue/lib/_util/type';
29
- import useConfigInject from 'ant-design-vue/lib/_util/hooks/useConfigInject';
30
- import type { BreadcrumbProps, RouteContextProps } from '../RouteContext';
31
- import { pick } from 'lodash-es';
32
- import { defaultRouteContext, routeContextInjectKey } from '../RouteContext';
33
- import { getMenuFirstChildren, getSlot } from '../util';
34
- import { Layout, LayoutContent } from 'ant-design-vue';
35
-
36
- export const basicLayoutProps = {
37
- ...defaultSettingProps,
38
- ...siderMenuProps,
39
- ...baseHeaderProps,
40
- ...headerViewProps,
41
-
42
- pure: Boolean,
43
- loading: Boolean,
44
- locale: {
45
- type: [Function, Boolean] as PropType<WithFalse<FormatMessage>>,
46
- default() {
47
- return (s: string) => s;
48
- },
49
- },
50
- /**
51
- * 是否禁用移动端模式,有的管理系统不需要移动端模式,此属性设置为true即可
52
- */
53
- disableMobile: {
54
- type: Boolean,
55
- required: false,
56
- },
57
- isChildrenLayout: {
58
- type: Boolean,
59
- required: false,
60
- },
61
- /**
62
- * 兼用 content 的 margin
63
- */
64
- disableContentMargin: {
65
- type: Boolean,
66
- required: false,
67
- },
68
- colSize: {
69
- type: Number,
70
- required: false,
71
- },
72
- contentStyle: {
73
- type: [String, Object] as PropType<CSSProperties>,
74
- default: () => {
75
- return null;
76
- },
77
- },
78
- breadcrumb: {
79
- type: [Object, Function] as PropType<BreadcrumbProps>,
80
- default: () => null,
81
- },
82
- collapsedButtonRender: {
83
- type: [Function, Object, Boolean] as PropType<
84
- WithFalse<(collapsed?: boolean) => VueNode>
85
- >,
86
- default: () => undefined,
87
- },
88
- breadcrumbRender: {
89
- type: [Object, Function, Boolean] as PropType<BreadcrumbRender>,
90
- default() {
91
- return null;
92
- },
93
- },
94
- headerContentRender: {
95
- type: [Function, Object, Boolean] as PropType<HeaderContentRender>,
96
- default: () => undefined,
97
- },
98
- headerRender: {
99
- type: [Object, Function, Boolean] as PropType<HeaderRender>,
100
- default: () => undefined,
101
- },
102
- };
103
-
104
- export type BasicLayoutProps = Partial<
105
- ExtractPropTypes<typeof basicLayoutProps>
106
- >;
107
-
108
- export default defineComponent({
109
- name: 'JProLayout',
110
- inheritAttrs: false,
111
- props: basicLayoutProps,
112
- emits: [
113
- 'update:collapsed',
114
- 'update:open-keys',
115
- 'update:selected-keys',
116
- 'collapse',
117
- 'openKeys',
118
- 'select',
119
- 'menuHeaderClick',
120
- 'menuClick',
121
- 'backClick',
122
- ],
123
- setup(props, { emit, attrs, slots }) {
124
- const { prefixCls } = useConfigInject('layout', {});
125
- const isTop = computed(() => props.layout === 'top');
126
- const hasSide = computed(
127
- () => props.layout === 'mix' || props.layout === 'side' || false,
128
- );
129
- const hasSplitMenu = computed(
130
- () => props.layout === 'mix' && props.splitMenus,
131
- );
132
- const hasFlatMenu = computed(() => {
133
- return hasSide.value && hasSplitMenu.value;
134
- });
135
- const siderWidth = computed(() =>
136
- props.collapsed ? props.collapsedWidth : props.siderWidth,
137
- );
138
-
139
- const onCollapse = (collapsed: boolean) => {
140
- emit('update:collapsed', collapsed);
141
- emit('collapse', collapsed);
142
- };
143
- const onOpenKeys = (openKeys: string[] | false) => {
144
- emit('update:open-keys', openKeys);
145
- emit('openKeys', openKeys);
146
- };
147
- const onSelect = (selectedKeys: string[] | false) => {
148
- emit('update:selected-keys', selectedKeys);
149
- emit('select', selectedKeys);
150
- };
151
- const onMenuHeaderClick = (e: MouseEvent) => {
152
- emit('menuHeaderClick', e);
153
- };
154
- const onMenuClick = (args: any) => {
155
- emit('menuClick', args);
156
- };
157
- const onBack = (args: any) => {
158
- emit('backClick', args);
159
- };
160
-
161
- const baseClassName = computed(() => `${props.prefixCls}-basicLayout`);
162
-
163
- const className = computed(() => {
164
- return {
165
- [baseClassName.value]: true,
166
- [`${baseClassName.value}-top-menu`]: isTop.value,
167
- [`${baseClassName.value}-is-children`]: props.isChildrenLayout,
168
- [`${baseClassName.value}-fix-siderbar`]: props.fixSiderbar,
169
- [`${baseClassName.value}-${props.layout}`]: props.layout,
170
- };
171
- });
172
-
173
- const genLayoutStyle = reactive<CSSProperties>({
174
- position: 'relative',
175
- });
176
-
177
- watchEffect(() => {
178
- if (
179
- props.isChildrenLayout ||
180
- (props.contentStyle && props.contentStyle.minHeight)
181
- ) {
182
- genLayoutStyle.minHeight = 0;
183
- }
184
- });
185
-
186
- const headerRender = (
187
- p: BasicLayoutProps & {
188
- hasSiderMenu: boolean;
189
- headerRender: HeaderRender;
190
- rightContentRender: RightContentRender;
191
- },
192
- matchMenuKeys?: string[],
193
- ): VueNode | null => {
194
- if (p.headerRender === false || p.pure) {
195
- return null;
196
- }
197
- return <Header {...p} matchMenuKeys={matchMenuKeys || []} />;
198
- };
199
-
200
- const breadcrumb = computed<BreadcrumbProps>(() => ({
201
- ...props.breadcrumb,
202
- itemRender: getSlot<BreadcrumbRender>(
203
- slots,
204
- props,
205
- 'breadcrumbRender',
206
- ) as BreadcrumbRender,
207
- }));
208
-
209
- const flatMenuData = computed(
210
- () =>
211
- (hasFlatMenu.value &&
212
- props.selectedKeys &&
213
- getMenuFirstChildren(
214
- props.menuData,
215
- props.selectedKeys[0],
216
- )) ||
217
- [],
218
- );
219
-
220
- const routeContext = reactive<RouteContextProps>({
221
- ...defaultRouteContext,
222
- ...(pick(toRefs(props), [
223
- 'pure',
224
- 'locale',
225
- 'menuData',
226
- 'openKeys',
227
- 'selectedKeys',
228
- 'contentWidth',
229
- 'disableMobile',
230
- 'fixSiderbar',
231
- 'fixedHeader',
232
- 'headerHeight',
233
- ]) as any),
234
- siderWidth,
235
- breadcrumb,
236
- flatMenuData,
237
- hasSide,
238
- back: onBack,
239
- hasHeader: true,
240
- flatMenu: hasFlatMenu,
241
- });
242
- provide(routeContextInjectKey, routeContext);
243
-
244
- return () => {
245
- const {
246
- pure,
247
- onCollapse: propsOnCollapse,
248
- onOpenKeys: propsOnOpenKeys,
249
- onSelect: propsOnSelect,
250
- onMenuClick: propsOnMenuClick,
251
- ...restProps
252
- } = props;
253
-
254
- const collapsedButtonRender = getSlot<CollapsedButtonRender>(
255
- slots,
256
- props,
257
- 'collapsedButtonRender',
258
- );
259
- const headerContentRender = getSlot<HeaderContentRender>(
260
- slots,
261
- props,
262
- 'headerContentRender',
263
- );
264
- const rightContentRender = getSlot<RightContentRender>(
265
- slots,
266
- props,
267
- 'rightContentRender',
268
- );
269
- const customHeaderRender = getSlot<HeaderRender>(
270
- slots,
271
- props,
272
- 'headerRender',
273
- );
274
-
275
- // menu
276
- const menuHeaderRender = getSlot<MenuHeaderRender>(
277
- slots,
278
- props,
279
- 'menuHeaderRender',
280
- );
281
- const menuExtraRender = getSlot<MenuExtraRender>(
282
- slots,
283
- props,
284
- 'menuExtraRender',
285
- );
286
- const menuContentRender = getSlot<MenuContentRender>(
287
- slots,
288
- props,
289
- 'menuContentRender',
290
- );
291
- const menuItemRender = getSlot<MenuItemRender>(
292
- slots,
293
- props,
294
- 'menuItemRender',
295
- );
296
- const subMenuItemRender = getSlot<SubMenuItemRender>(
297
- slots,
298
- props,
299
- 'subMenuItemRender',
300
- );
301
-
302
- const headerDom = computed(() =>
303
- headerRender(
304
- {
305
- ...props,
306
- menuItemRender,
307
- subMenuItemRender,
308
- hasSiderMenu: !isTop.value,
309
- menuData: props.menuData,
310
- onCollapse,
311
- onOpenKeys,
312
- onSelect,
313
- onMenuHeaderClick,
314
- rightContentRender,
315
- collapsedButtonRender,
316
- headerTitleRender: menuHeaderRender,
317
- menuExtraRender,
318
- menuContentRender,
319
- headerContentRender,
320
- headerRender: customHeaderRender,
321
- theme: (props.theme || 'dark')
322
- .toLocaleLowerCase()
323
- .includes('dark')
324
- ? 'dark'
325
- : 'light',
326
- },
327
- props.matchMenuKeys,
328
- ),
329
- );
330
- routeContext.hasHeader = !!headerDom.value;
331
-
332
- const contentClassName = computed(() => {
333
- return {
334
- [`${baseClassName.value}-content`]: true,
335
- [`${baseClassName.value}-has-header`]: headerDom,
336
- [`${baseClassName.value}-content-disable-margin`]:
337
- props.disableContentMargin,
338
- };
339
- });
340
-
341
- return (
342
- <>
343
- {pure ? (
344
- slots.default?.()
345
- ) : (
346
- <div class={className.value}>
347
- <Layout
348
- style={{
349
- minHeight: '100vh',
350
- ...((attrs.style as CSSProperties) || {}),
351
- }}
352
- >
353
- {headerDom.value}
354
- <Layout
355
- style={genLayoutStyle}
356
- class={prefixCls.value}
357
- >
358
- {!isTop.value && (
359
- <SiderMenu
360
- {...restProps}
361
- menuHeaderRender={menuHeaderRender}
362
- menuExtraRender={menuExtraRender}
363
- menuContentRender={
364
- menuContentRender
365
- }
366
- menuItemRender={menuItemRender}
367
- subMenuItemRender={
368
- subMenuItemRender
369
- }
370
- collapsedButtonRender={
371
- collapsedButtonRender
372
- }
373
- onCollapse={onCollapse}
374
- onSelect={onSelect}
375
- onOpenKeys={onOpenKeys}
376
- onMenuClick={onMenuClick}
377
- />
378
- )}
379
- <Layout>
380
- <LayoutContent>
381
- {slots.default?.()}
382
- </LayoutContent>
383
- </Layout>
384
- </Layout>
385
- </Layout>
386
- </div>
387
- )}
388
- </>
389
- );
390
- };
391
- },
392
- });
1
+ import type {
2
+ BreadcrumbRender,
3
+ FormatMessage,
4
+ HeaderContentRender,
5
+ WithFalse,
6
+ HeaderRender,
7
+ RightContentRender,
8
+ CollapsedButtonRender,
9
+ MenuExtraRender,
10
+ SubMenuItemRender,
11
+ MenuContentRender,
12
+ MenuItemRender,
13
+ MenuHeaderRender,
14
+ } from '../typings';
15
+ import SiderMenu, { siderMenuProps } from '../SiderMenu/SiderMenu';
16
+ import type { CSSProperties, ExtractPropTypes, PropType } from 'vue';
17
+ import {
18
+ computed,
19
+ defineComponent,
20
+ provide,
21
+ reactive,
22
+ watchEffect,
23
+ toRefs,
24
+ h
25
+ } from 'vue';
26
+ import { defaultSettingProps } from '../defaultSettings';
27
+ import { baseHeaderProps } from '../TopHeader';
28
+ import Header, { headerViewProps } from './Header';
29
+ import type { VueNode } from 'ant-design-vue/es/_util/type';
30
+ import useConfigInject from 'ant-design-vue/es/_util/hooks/useConfigInject';
31
+ import type { BreadcrumbProps, RouteContextProps } from '../RouteContext';
32
+ import { pick } from 'lodash-es';
33
+ import { defaultRouteContext, routeContextInjectKey } from '../RouteContext';
34
+ import { getMenuFirstChildren, getSlot } from '../util';
35
+ import { Layout, LayoutContent } from 'ant-design-vue';
36
+
37
+ export const basicLayoutProps = {
38
+ ...defaultSettingProps,
39
+ ...siderMenuProps,
40
+ ...baseHeaderProps,
41
+ ...headerViewProps,
42
+
43
+ pure: Boolean,
44
+ loading: Boolean,
45
+ locale: {
46
+ type: [Function, Boolean] as PropType<WithFalse<FormatMessage>>,
47
+ default() {
48
+ return (s: string) => s;
49
+ },
50
+ },
51
+ /**
52
+ * 是否禁用移动端模式,有的管理系统不需要移动端模式,此属性设置为true即可
53
+ */
54
+ disableMobile: {
55
+ type: Boolean,
56
+ required: false,
57
+ },
58
+ isChildrenLayout: {
59
+ type: Boolean,
60
+ required: false,
61
+ },
62
+ /**
63
+ * 兼用 content 的 margin
64
+ */
65
+ disableContentMargin: {
66
+ type: Boolean,
67
+ required: false,
68
+ },
69
+ colSize: {
70
+ type: Number,
71
+ required: false,
72
+ },
73
+ contentStyle: {
74
+ type: [String, Object] as PropType<CSSProperties>,
75
+ default: () => {
76
+ return null;
77
+ },
78
+ },
79
+ breadcrumb: {
80
+ type: [Object, Function] as PropType<BreadcrumbProps>,
81
+ default: () => null,
82
+ },
83
+ collapsedButtonRender: {
84
+ type: [Function, Object, Boolean] as PropType<
85
+ WithFalse<(collapsed?: boolean) => VueNode>
86
+ >,
87
+ default: () => undefined,
88
+ },
89
+ breadcrumbRender: {
90
+ type: [Object, Function, Boolean] as PropType<BreadcrumbRender>,
91
+ default() {
92
+ return null;
93
+ },
94
+ },
95
+ headerContentRender: {
96
+ type: [Function, Object, Boolean] as PropType<HeaderContentRender>,
97
+ default: () => undefined,
98
+ },
99
+ headerRender: {
100
+ type: [Object, Function, Boolean] as PropType<HeaderRender>,
101
+ default: () => undefined,
102
+ },
103
+ };
104
+
105
+ export type BasicLayoutProps = Partial<
106
+ ExtractPropTypes<typeof basicLayoutProps>
107
+ >;
108
+
109
+ export default defineComponent({
110
+ name: 'JProLayout',
111
+ inheritAttrs: false,
112
+ props: basicLayoutProps,
113
+ emits: [
114
+ 'update:collapsed',
115
+ 'update:open-keys',
116
+ 'update:selected-keys',
117
+ 'collapse',
118
+ 'openKeys',
119
+ 'select',
120
+ 'menuHeaderClick',
121
+ 'menuClick',
122
+ 'backClick',
123
+ ],
124
+ setup(props, { emit, attrs, slots }) {
125
+ const { prefixCls } = useConfigInject('layout', {});
126
+ const isTop = computed(() => props.layout === 'top');
127
+ const hasSide = computed(
128
+ () => props.layout === 'mix' || props.layout === 'side' || false,
129
+ );
130
+ const hasSplitMenu = computed(
131
+ () => props.layout === 'mix' && props.splitMenus,
132
+ );
133
+ const hasFlatMenu = computed(() => {
134
+ return hasSide.value && hasSplitMenu.value;
135
+ });
136
+ const siderWidth = computed(() =>
137
+ props.collapsed ? props.collapsedWidth : props.siderWidth,
138
+ );
139
+
140
+ const onCollapse = (collapsed: boolean) => {
141
+ emit('update:collapsed', collapsed);
142
+ emit('collapse', collapsed);
143
+ };
144
+ const onOpenKeys = (openKeys: string[] | false) => {
145
+ emit('update:open-keys', openKeys);
146
+ emit('openKeys', openKeys);
147
+ };
148
+ const onSelect = (selectedKeys: string[] | false) => {
149
+ emit('update:selected-keys', selectedKeys);
150
+ emit('select', selectedKeys);
151
+ };
152
+ const onMenuHeaderClick = (e: MouseEvent) => {
153
+ emit('menuHeaderClick', e);
154
+ };
155
+ const onMenuClick = (args: any) => {
156
+ emit('menuClick', args);
157
+ };
158
+ const onBack = (args: any) => {
159
+ emit('backClick', args);
160
+ };
161
+
162
+ const baseClassName = computed(() => `${props.prefixCls}-basicLayout`);
163
+
164
+ const className = computed(() => {
165
+ return {
166
+ [baseClassName.value]: true,
167
+ [`${baseClassName.value}-top-menu`]: isTop.value,
168
+ [`${baseClassName.value}-is-children`]: props.isChildrenLayout,
169
+ [`${baseClassName.value}-fix-siderbar`]: props.fixSiderbar,
170
+ [`${baseClassName.value}-${props.layout}`]: props.layout,
171
+ };
172
+ });
173
+
174
+ const genLayoutStyle = reactive<CSSProperties>({
175
+ position: 'relative',
176
+ });
177
+
178
+ watchEffect(() => {
179
+ if (
180
+ props.isChildrenLayout ||
181
+ (props.contentStyle && props.contentStyle.minHeight)
182
+ ) {
183
+ genLayoutStyle.minHeight = 0;
184
+ }
185
+ });
186
+
187
+ const headerRender = (
188
+ p: BasicLayoutProps & {
189
+ hasSiderMenu: boolean;
190
+ headerRender: HeaderRender;
191
+ rightContentRender: RightContentRender;
192
+ },
193
+ matchMenuKeys?: string[],
194
+ ): VueNode | null => {
195
+ if (p.headerRender === false || p.pure) {
196
+ return null;
197
+ }
198
+ return h(Header, { ...p, matchMenuKeys: matchMenuKeys || []})
199
+
200
+ // <Header {...p} matchMenuKeys={matchMenuKeys || []} />;
201
+ };
202
+
203
+ const breadcrumb = computed<BreadcrumbProps>(() => ({
204
+ ...props.breadcrumb,
205
+ itemRender: getSlot<BreadcrumbRender>(
206
+ slots,
207
+ props,
208
+ 'breadcrumbRender',
209
+ ) as BreadcrumbRender,
210
+ }));
211
+
212
+ const flatMenuData = computed(
213
+ () =>
214
+ (hasFlatMenu.value &&
215
+ props.selectedKeys &&
216
+ getMenuFirstChildren(
217
+ props.menuData,
218
+ props.selectedKeys[0],
219
+ )) ||
220
+ [],
221
+ );
222
+
223
+ const routeContext = reactive<RouteContextProps>({
224
+ ...defaultRouteContext,
225
+ ...(pick(toRefs(props), [
226
+ 'pure',
227
+ 'locale',
228
+ 'menuData',
229
+ 'openKeys',
230
+ 'selectedKeys',
231
+ 'contentWidth',
232
+ 'disableMobile',
233
+ 'fixSiderbar',
234
+ 'fixedHeader',
235
+ 'headerHeight',
236
+ ]) as any),
237
+ siderWidth,
238
+ breadcrumb,
239
+ flatMenuData,
240
+ hasSide,
241
+ back: onBack,
242
+ hasHeader: true,
243
+ flatMenu: hasFlatMenu,
244
+ });
245
+ provide(routeContextInjectKey, routeContext);
246
+
247
+ return () => {
248
+ const {
249
+ pure,
250
+ onCollapse: propsOnCollapse,
251
+ onOpenKeys: propsOnOpenKeys,
252
+ onSelect: propsOnSelect,
253
+ onMenuClick: propsOnMenuClick,
254
+ ...restProps
255
+ } = props;
256
+
257
+ const collapsedButtonRender = getSlot<CollapsedButtonRender>(
258
+ slots,
259
+ props,
260
+ 'collapsedButtonRender',
261
+ );
262
+ const headerContentRender = getSlot<HeaderContentRender>(
263
+ slots,
264
+ props,
265
+ 'headerContentRender',
266
+ );
267
+ const rightContentRender = getSlot<RightContentRender>(
268
+ slots,
269
+ props,
270
+ 'rightContentRender',
271
+ );
272
+ const customHeaderRender = getSlot<HeaderRender>(
273
+ slots,
274
+ props,
275
+ 'headerRender',
276
+ );
277
+
278
+ // menu
279
+ const menuHeaderRender = getSlot<MenuHeaderRender>(
280
+ slots,
281
+ props,
282
+ 'menuHeaderRender',
283
+ );
284
+ const menuExtraRender = getSlot<MenuExtraRender>(
285
+ slots,
286
+ props,
287
+ 'menuExtraRender',
288
+ );
289
+ const menuContentRender = getSlot<MenuContentRender>(
290
+ slots,
291
+ props,
292
+ 'menuContentRender',
293
+ );
294
+ const menuItemRender = getSlot<MenuItemRender>(
295
+ slots,
296
+ props,
297
+ 'menuItemRender',
298
+ );
299
+ const subMenuItemRender = getSlot<SubMenuItemRender>(
300
+ slots,
301
+ props,
302
+ 'subMenuItemRender',
303
+ );
304
+
305
+ const headerDom = computed(() =>
306
+ headerRender(
307
+ {
308
+ ...props,
309
+ menuItemRender,
310
+ subMenuItemRender,
311
+ hasSiderMenu: !isTop.value,
312
+ menuData: props.menuData,
313
+ onCollapse,
314
+ onOpenKeys,
315
+ onSelect,
316
+ onMenuHeaderClick,
317
+ rightContentRender,
318
+ collapsedButtonRender,
319
+ headerTitleRender: menuHeaderRender,
320
+ menuExtraRender,
321
+ menuContentRender,
322
+ headerContentRender,
323
+ headerRender: customHeaderRender,
324
+ theme: (props.theme || 'dark')
325
+ .toLocaleLowerCase()
326
+ .includes('dark')
327
+ ? 'dark'
328
+ : 'light',
329
+ },
330
+ props.matchMenuKeys,
331
+ ),
332
+ );
333
+ routeContext.hasHeader = !!headerDom.value;
334
+
335
+ const contentClassName = computed(() => {
336
+ return {
337
+ [`${baseClassName.value}-content`]: true,
338
+ [`${baseClassName.value}-has-header`]: headerDom,
339
+ [`${baseClassName.value}-content-disable-margin`]:
340
+ props.disableContentMargin,
341
+ };
342
+ });
343
+
344
+ return (
345
+ <>
346
+ {pure ? (
347
+ slots.default?.()
348
+ ) : (
349
+ <div class={className.value}>
350
+ <Layout
351
+ style={{
352
+ minHeight: '100vh',
353
+ ...((attrs.style as CSSProperties) || {}),
354
+ }}
355
+ >
356
+ {headerDom.value}
357
+ <Layout
358
+ style={genLayoutStyle}
359
+ class={prefixCls.value}
360
+ >
361
+ {!isTop.value && (
362
+ <SiderMenu
363
+ {...restProps}
364
+ menuHeaderRender={menuHeaderRender}
365
+ menuExtraRender={menuExtraRender}
366
+ menuContentRender={
367
+ menuContentRender
368
+ }
369
+ menuItemRender={menuItemRender}
370
+ subMenuItemRender={
371
+ subMenuItemRender
372
+ }
373
+ collapsedButtonRender={
374
+ collapsedButtonRender
375
+ }
376
+ onCollapse={onCollapse}
377
+ onSelect={onSelect}
378
+ onOpenKeys={onOpenKeys}
379
+ onMenuClick={onMenuClick}
380
+ />
381
+ )}
382
+ <Layout>
383
+ <LayoutContent>
384
+ {slots.default?.()}
385
+ </LayoutContent>
386
+ </Layout>
387
+ </Layout>
388
+ </Layout>
389
+ </div>
390
+ )}
391
+ </>
392
+ );
393
+ };
394
+ },
395
+ });