@bobbykim/mcl-header 0.5.1 → 0.6.0
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.
- package/dist/index.d.ts +314 -0
- package/dist/mcl-header.js +793 -0
- package/dist/mcl-header.umd.cjs +2 -0
- package/package.json +28 -6
- package/CHANGELOG.md +0 -75
- package/index.d.ts +0 -4
- package/index.js +0 -4
- package/index.ts +0 -5
- package/lib/common/index.types.d.ts +0 -10
- package/lib/common/index.types.js +0 -1
- package/lib/common/index.types.ts +0 -12
- package/lib/mcl-header-a/MclHeaderA.vue +0 -251
- package/lib/mcl-header-a/MclHeaderA.vue.d.ts +0 -148
- package/lib/mcl-header-a/NavCollapse.vue +0 -165
- package/lib/mcl-header-a/NavCollapse.vue.d.ts +0 -78
- package/lib/mcl-header-a/NavDropdown.vue +0 -165
- package/lib/mcl-header-a/NavDropdown.vue.d.ts +0 -69
- package/lib/mcl-header-a/NavLink.vue +0 -91
- package/lib/mcl-header-a/NavLink.vue.d.ts +0 -62
- package/lib/mcl-header-b/MclHeaderB.vue +0 -270
- package/lib/mcl-header-b/MclHeaderB.vue.d.ts +0 -138
- package/lib/mcl-header-b/NavCollapseVertical.vue +0 -211
- package/lib/mcl-header-b/NavCollapseVertical.vue.d.ts +0 -73
- package/lib/mcl-header-b/NavLinkVertical.vue +0 -78
- package/lib/mcl-header-b/NavLinkVertical.vue.d.ts +0 -62
- package/tsconfig.json +0 -5
- package/tsconfig.ts.json +0 -9
- package/tsconfig.vue.json +0 -9
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type {
|
|
3
|
-
BodyText,
|
|
4
|
-
ColorPalette,
|
|
5
|
-
CtaTarget,
|
|
6
|
-
HeadingSize,
|
|
7
|
-
} from '@bobbykim/manguito-theme'
|
|
8
|
-
import generateClass, { HeaderVertical } from '@bobbykim/manguito-theme'
|
|
9
|
-
import { computed, ref } from 'vue'
|
|
10
|
-
import type { MenuCollapseType, MenuItemType } from '../common/index.types'
|
|
11
|
-
import NavCollapseVertical from './NavCollapseVertical.vue'
|
|
12
|
-
import NavLinkVertical from './NavLinkVertical.vue'
|
|
13
|
-
|
|
14
|
-
const props = withDefaults(
|
|
15
|
-
defineProps<{
|
|
16
|
-
logo: string
|
|
17
|
-
logoAlt?: string
|
|
18
|
-
title: string
|
|
19
|
-
titleSize?: HeadingSize
|
|
20
|
-
titleColor?: ColorPalette
|
|
21
|
-
titleBlockAsLink?: boolean
|
|
22
|
-
titleBlockLinkTarget?: CtaTarget
|
|
23
|
-
titleBlockLink: string
|
|
24
|
-
menuItems: Array<MenuItemType | MenuCollapseType>
|
|
25
|
-
menuItemAsLink?: boolean
|
|
26
|
-
menuTextSize?: BodyText
|
|
27
|
-
menuTextColor?: ColorPalette
|
|
28
|
-
menuTextBold?: boolean
|
|
29
|
-
displayHighlight?: boolean
|
|
30
|
-
highlightColor?: ColorPalette
|
|
31
|
-
bgColor?: ColorPalette
|
|
32
|
-
drawerBtnColor?: ColorPalette
|
|
33
|
-
drawerBtnBorder?: boolean
|
|
34
|
-
headerWidth?: number
|
|
35
|
-
}>(),
|
|
36
|
-
{
|
|
37
|
-
logoAlt: '',
|
|
38
|
-
titleBlockAsLink: false,
|
|
39
|
-
titleBlockLinkTarget: '_self',
|
|
40
|
-
titleSize: 'md',
|
|
41
|
-
titleColor: 'dark-3',
|
|
42
|
-
menuItemAsLink: false,
|
|
43
|
-
menuTextSize: 'md',
|
|
44
|
-
menuTextColor: 'dark-3',
|
|
45
|
-
menuTextBold: false,
|
|
46
|
-
displayHighlight: true,
|
|
47
|
-
highlightColor: 'primary',
|
|
48
|
-
bgColor: 'light-1',
|
|
49
|
-
drawerBtnColor: 'dark-1',
|
|
50
|
-
drawerBtnBorder: true,
|
|
51
|
-
headerWidth: 160,
|
|
52
|
-
}
|
|
53
|
-
)
|
|
54
|
-
const slots = defineSlots<{
|
|
55
|
-
default: any
|
|
56
|
-
'content-bottom': any
|
|
57
|
-
'mobile-bottom'(props: { headerClose: () => void }): any
|
|
58
|
-
}>()
|
|
59
|
-
const emit = defineEmits<{
|
|
60
|
-
(e: 'toggle-drawer', event: Event, open: boolean): void
|
|
61
|
-
(e: 'title-click', event: Event, url: string, target: CtaTarget): void
|
|
62
|
-
(e: 'menu-click', event: Event, item: MenuItemType): void
|
|
63
|
-
(e: 'collapse-click', event: Event, title: string, visible: boolean): void
|
|
64
|
-
}>()
|
|
65
|
-
const componentRef = ref<InstanceType<typeof HeaderVertical>>()
|
|
66
|
-
const collapseRef = ref<InstanceType<typeof NavCollapseVertical>[]>()
|
|
67
|
-
const handleDrawerClick = (e: Event, status: boolean) => {
|
|
68
|
-
emit('toggle-drawer', e, status)
|
|
69
|
-
}
|
|
70
|
-
const closeDrawer = (): void => {
|
|
71
|
-
componentRef.value?.headerClose()
|
|
72
|
-
}
|
|
73
|
-
const closeCollapse = (): void => {
|
|
74
|
-
for (let i = 0; i < collapseRef.value!.length; i++) {
|
|
75
|
-
collapseRef.value![i].closeCollapse()
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const handleTitleClick = (e: Event) => {
|
|
79
|
-
const { titleBlockAsLink, titleBlockLink, titleBlockLinkTarget } = props
|
|
80
|
-
if (!titleBlockAsLink) {
|
|
81
|
-
e.preventDefault()
|
|
82
|
-
}
|
|
83
|
-
emit('title-click', e, titleBlockLink, titleBlockLinkTarget)
|
|
84
|
-
closeDrawer()
|
|
85
|
-
closeCollapse()
|
|
86
|
-
}
|
|
87
|
-
const handleMenuClick = (e: Event, item: MenuItemType) => {
|
|
88
|
-
const { menuItemAsLink } = props
|
|
89
|
-
if (!menuItemAsLink) {
|
|
90
|
-
e.preventDefault()
|
|
91
|
-
}
|
|
92
|
-
emit('menu-click', e, item)
|
|
93
|
-
closeDrawer()
|
|
94
|
-
closeCollapse()
|
|
95
|
-
}
|
|
96
|
-
const handleCollapseMenuClick = (e: Event, title: string, visible: boolean) => {
|
|
97
|
-
emit('collapse-click', e, title, visible)
|
|
98
|
-
}
|
|
99
|
-
const titleTextClass = computed<string>(() => {
|
|
100
|
-
const { titleSize, titleColor } = props
|
|
101
|
-
const classArray = [
|
|
102
|
-
generateClass('H3', titleSize),
|
|
103
|
-
generateClass('TEXTCOLOR', titleColor),
|
|
104
|
-
]
|
|
105
|
-
return classArray.join(' ')
|
|
106
|
-
})
|
|
107
|
-
const hasChildren = (item: MenuItemType | MenuCollapseType) => {
|
|
108
|
-
const NavCollapse = item as MenuCollapseType
|
|
109
|
-
if (typeof NavCollapse.children === 'undefined') {
|
|
110
|
-
return false
|
|
111
|
-
}
|
|
112
|
-
return NavCollapse.children.length > 0
|
|
113
|
-
}
|
|
114
|
-
defineExpose({
|
|
115
|
-
headerClose: closeDrawer,
|
|
116
|
-
})
|
|
117
|
-
</script>
|
|
118
|
-
|
|
119
|
-
<template>
|
|
120
|
-
<HeaderVertical
|
|
121
|
-
:bg-color="bgColor"
|
|
122
|
-
:drawer-btn-color="drawerBtnColor"
|
|
123
|
-
:drawer-btn-border="drawerBtnBorder"
|
|
124
|
-
:header-width="headerWidth"
|
|
125
|
-
@toggle-drawer="handleDrawerClick"
|
|
126
|
-
ref="componentRef"
|
|
127
|
-
>
|
|
128
|
-
<template #default>
|
|
129
|
-
<slot name="default"></slot>
|
|
130
|
-
</template>
|
|
131
|
-
<template #content>
|
|
132
|
-
<div>
|
|
133
|
-
<!-- logo block -->
|
|
134
|
-
<div class="p-md text-center">
|
|
135
|
-
<a
|
|
136
|
-
:href="titleBlockLink"
|
|
137
|
-
:target="titleBlockLinkTarget"
|
|
138
|
-
@click="handleTitleClick"
|
|
139
|
-
>
|
|
140
|
-
<img
|
|
141
|
-
:src="logo"
|
|
142
|
-
:alt="logoAlt"
|
|
143
|
-
class="h-full inline-block max-h-xl"
|
|
144
|
-
/>
|
|
145
|
-
</a>
|
|
146
|
-
</div>
|
|
147
|
-
<!-- title block -->
|
|
148
|
-
<div>
|
|
149
|
-
<a
|
|
150
|
-
:href="titleBlockLink"
|
|
151
|
-
:target="titleBlockLinkTarget"
|
|
152
|
-
@click="handleTitleClick"
|
|
153
|
-
>
|
|
154
|
-
<h3
|
|
155
|
-
:class="titleTextClass"
|
|
156
|
-
class="text-center mb-md"
|
|
157
|
-
v-html="title"
|
|
158
|
-
></h3>
|
|
159
|
-
</a>
|
|
160
|
-
</div>
|
|
161
|
-
<!-- menu item block -->
|
|
162
|
-
<ul class="flex flex-col">
|
|
163
|
-
<li v-for="(item, index) in menuItems" :key="`menu-${index}`">
|
|
164
|
-
<NavLinkVertical
|
|
165
|
-
v-if="!hasChildren(item)"
|
|
166
|
-
:menu-item="(item as MenuItemType)"
|
|
167
|
-
:as-link="menuItemAsLink"
|
|
168
|
-
:text-color="menuTextColor"
|
|
169
|
-
:text-size="menuTextSize"
|
|
170
|
-
:font-bold="menuTextBold"
|
|
171
|
-
:d-hl="displayHighlight"
|
|
172
|
-
:hl-color="highlightColor"
|
|
173
|
-
@menu-click="handleMenuClick"
|
|
174
|
-
/>
|
|
175
|
-
<NavCollapseVertical
|
|
176
|
-
v-else
|
|
177
|
-
ref="collapseRef"
|
|
178
|
-
:nav-id="item.title"
|
|
179
|
-
nav-location="desktop"
|
|
180
|
-
:nav-accordion-group="title"
|
|
181
|
-
:menu-item="(item as MenuCollapseType)"
|
|
182
|
-
:as-link="menuItemAsLink"
|
|
183
|
-
:text-color="menuTextColor"
|
|
184
|
-
:text-size="menuTextSize"
|
|
185
|
-
:font-bold="menuTextBold"
|
|
186
|
-
:d-hl="displayHighlight"
|
|
187
|
-
:hl-color="highlightColor"
|
|
188
|
-
@child-click="handleMenuClick"
|
|
189
|
-
@label-click="handleCollapseMenuClick"
|
|
190
|
-
/>
|
|
191
|
-
</li>
|
|
192
|
-
</ul>
|
|
193
|
-
</div>
|
|
194
|
-
</template>
|
|
195
|
-
<template #content-bottom>
|
|
196
|
-
<div v-if="slots['content-bottom']">
|
|
197
|
-
<slot name="content-bottom"></slot>
|
|
198
|
-
</div>
|
|
199
|
-
</template>
|
|
200
|
-
<template #mobile-content="{ headerClose }">
|
|
201
|
-
<!-- mobile content -->
|
|
202
|
-
<div class="flex flex-col justify-between h-full">
|
|
203
|
-
<div>
|
|
204
|
-
<!-- logo block -->
|
|
205
|
-
<div class="p-md text-center">
|
|
206
|
-
<a
|
|
207
|
-
:href="titleBlockLink"
|
|
208
|
-
:target="titleBlockLinkTarget"
|
|
209
|
-
@click="handleTitleClick"
|
|
210
|
-
>
|
|
211
|
-
<img
|
|
212
|
-
:src="logo"
|
|
213
|
-
:alt="logoAlt"
|
|
214
|
-
class="h-full inline-block max-h-xl"
|
|
215
|
-
/>
|
|
216
|
-
</a>
|
|
217
|
-
</div>
|
|
218
|
-
<!-- title block -->
|
|
219
|
-
<div>
|
|
220
|
-
<a
|
|
221
|
-
:href="titleBlockLink"
|
|
222
|
-
:target="titleBlockLinkTarget"
|
|
223
|
-
@click="handleTitleClick"
|
|
224
|
-
>
|
|
225
|
-
<h3
|
|
226
|
-
:class="titleTextClass"
|
|
227
|
-
class="text-center mb-md"
|
|
228
|
-
v-html="title"
|
|
229
|
-
></h3>
|
|
230
|
-
</a>
|
|
231
|
-
</div>
|
|
232
|
-
<!-- menu item block -->
|
|
233
|
-
<ul class="flex flex-col">
|
|
234
|
-
<li v-for="(item, index) in menuItems" :key="`menu-${index}`">
|
|
235
|
-
<NavLinkVertical
|
|
236
|
-
v-if="!hasChildren(item)"
|
|
237
|
-
:menu-item="(item as MenuItemType)"
|
|
238
|
-
:as-link="menuItemAsLink"
|
|
239
|
-
:text-color="menuTextColor"
|
|
240
|
-
:text-size="menuTextSize"
|
|
241
|
-
:font-bold="menuTextBold"
|
|
242
|
-
:d-hl="displayHighlight"
|
|
243
|
-
:hl-color="highlightColor"
|
|
244
|
-
@menu-click="handleMenuClick"
|
|
245
|
-
/>
|
|
246
|
-
<NavCollapseVertical
|
|
247
|
-
v-else
|
|
248
|
-
:nav-id="item.title"
|
|
249
|
-
nav-location="mobile"
|
|
250
|
-
:nav-accordion-group="title"
|
|
251
|
-
:menu-item="(item as MenuCollapseType)"
|
|
252
|
-
:as-link="menuItemAsLink"
|
|
253
|
-
:text-color="menuTextColor"
|
|
254
|
-
:text-size="menuTextSize"
|
|
255
|
-
:font-bold="menuTextBold"
|
|
256
|
-
:d-hl="displayHighlight"
|
|
257
|
-
:hl-color="highlightColor"
|
|
258
|
-
@child-click="handleMenuClick"
|
|
259
|
-
@label-click="handleCollapseMenuClick"
|
|
260
|
-
/>
|
|
261
|
-
</li>
|
|
262
|
-
</ul>
|
|
263
|
-
</div>
|
|
264
|
-
<div v-if="slots['mobile-bottom']">
|
|
265
|
-
<slot name="mobile-bottom" :headerClose="headerClose"></slot>
|
|
266
|
-
</div>
|
|
267
|
-
</div>
|
|
268
|
-
</template>
|
|
269
|
-
</HeaderVertical>
|
|
270
|
-
</template>
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import type { BodyText, ColorPalette, CtaTarget, HeadingSize } from '@bobbykim/manguito-theme';
|
|
2
|
-
import type { MenuCollapseType, MenuItemType } from '../common/index.types';
|
|
3
|
-
declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
|
|
4
|
-
logo: string;
|
|
5
|
-
logoAlt?: string | undefined;
|
|
6
|
-
title: string;
|
|
7
|
-
titleSize?: HeadingSize | undefined;
|
|
8
|
-
titleColor?: ColorPalette | undefined;
|
|
9
|
-
titleBlockAsLink?: boolean | undefined;
|
|
10
|
-
titleBlockLinkTarget?: CtaTarget | undefined;
|
|
11
|
-
titleBlockLink: string;
|
|
12
|
-
menuItems: (MenuItemType | MenuCollapseType)[];
|
|
13
|
-
menuItemAsLink?: boolean | undefined;
|
|
14
|
-
menuTextSize?: BodyText | undefined;
|
|
15
|
-
menuTextColor?: ColorPalette | undefined;
|
|
16
|
-
menuTextBold?: boolean | undefined;
|
|
17
|
-
displayHighlight?: boolean | undefined;
|
|
18
|
-
highlightColor?: ColorPalette | undefined;
|
|
19
|
-
bgColor?: ColorPalette | undefined;
|
|
20
|
-
drawerBtnColor?: ColorPalette | undefined;
|
|
21
|
-
drawerBtnBorder?: boolean | undefined;
|
|
22
|
-
headerWidth?: number | undefined;
|
|
23
|
-
}>, {
|
|
24
|
-
logoAlt: string;
|
|
25
|
-
titleBlockAsLink: boolean;
|
|
26
|
-
titleBlockLinkTarget: string;
|
|
27
|
-
titleSize: string;
|
|
28
|
-
titleColor: string;
|
|
29
|
-
menuItemAsLink: boolean;
|
|
30
|
-
menuTextSize: string;
|
|
31
|
-
menuTextColor: string;
|
|
32
|
-
menuTextBold: boolean;
|
|
33
|
-
displayHighlight: boolean;
|
|
34
|
-
highlightColor: string;
|
|
35
|
-
bgColor: string;
|
|
36
|
-
drawerBtnColor: string;
|
|
37
|
-
drawerBtnBorder: boolean;
|
|
38
|
-
headerWidth: number;
|
|
39
|
-
}>, {
|
|
40
|
-
headerClose: () => void;
|
|
41
|
-
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
42
|
-
"toggle-drawer": (event: Event, open: boolean) => void;
|
|
43
|
-
"title-click": (event: Event, url: string, target: CtaTarget) => void;
|
|
44
|
-
"menu-click": (event: Event, item: MenuItemType) => void;
|
|
45
|
-
"collapse-click": (event: Event, title: string, visible: boolean) => void;
|
|
46
|
-
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
|
|
47
|
-
logo: string;
|
|
48
|
-
logoAlt?: string | undefined;
|
|
49
|
-
title: string;
|
|
50
|
-
titleSize?: HeadingSize | undefined;
|
|
51
|
-
titleColor?: ColorPalette | undefined;
|
|
52
|
-
titleBlockAsLink?: boolean | undefined;
|
|
53
|
-
titleBlockLinkTarget?: CtaTarget | undefined;
|
|
54
|
-
titleBlockLink: string;
|
|
55
|
-
menuItems: (MenuItemType | MenuCollapseType)[];
|
|
56
|
-
menuItemAsLink?: boolean | undefined;
|
|
57
|
-
menuTextSize?: BodyText | undefined;
|
|
58
|
-
menuTextColor?: ColorPalette | undefined;
|
|
59
|
-
menuTextBold?: boolean | undefined;
|
|
60
|
-
displayHighlight?: boolean | undefined;
|
|
61
|
-
highlightColor?: ColorPalette | undefined;
|
|
62
|
-
bgColor?: ColorPalette | undefined;
|
|
63
|
-
drawerBtnColor?: ColorPalette | undefined;
|
|
64
|
-
drawerBtnBorder?: boolean | undefined;
|
|
65
|
-
headerWidth?: number | undefined;
|
|
66
|
-
}>, {
|
|
67
|
-
logoAlt: string;
|
|
68
|
-
titleBlockAsLink: boolean;
|
|
69
|
-
titleBlockLinkTarget: string;
|
|
70
|
-
titleSize: string;
|
|
71
|
-
titleColor: string;
|
|
72
|
-
menuItemAsLink: boolean;
|
|
73
|
-
menuTextSize: string;
|
|
74
|
-
menuTextColor: string;
|
|
75
|
-
menuTextBold: boolean;
|
|
76
|
-
displayHighlight: boolean;
|
|
77
|
-
highlightColor: string;
|
|
78
|
-
bgColor: string;
|
|
79
|
-
drawerBtnColor: string;
|
|
80
|
-
drawerBtnBorder: boolean;
|
|
81
|
-
headerWidth: number;
|
|
82
|
-
}>>> & {
|
|
83
|
-
"onToggle-drawer"?: ((event: Event, open: boolean) => any) | undefined;
|
|
84
|
-
"onTitle-click"?: ((event: Event, url: string, target: CtaTarget) => any) | undefined;
|
|
85
|
-
"onMenu-click"?: ((event: Event, item: MenuItemType) => any) | undefined;
|
|
86
|
-
"onCollapse-click"?: ((event: Event, title: string, visible: boolean) => any) | undefined;
|
|
87
|
-
}, {
|
|
88
|
-
bgColor: ColorPalette;
|
|
89
|
-
drawerBtnColor: ColorPalette;
|
|
90
|
-
drawerBtnBorder: boolean;
|
|
91
|
-
headerWidth: number;
|
|
92
|
-
titleColor: ColorPalette;
|
|
93
|
-
menuTextSize: BodyText;
|
|
94
|
-
menuTextColor: ColorPalette;
|
|
95
|
-
menuTextBold: boolean;
|
|
96
|
-
displayHighlight: boolean;
|
|
97
|
-
highlightColor: ColorPalette;
|
|
98
|
-
logoAlt: string;
|
|
99
|
-
titleSize: HeadingSize;
|
|
100
|
-
titleBlockAsLink: boolean;
|
|
101
|
-
titleBlockLinkTarget: CtaTarget;
|
|
102
|
-
menuItemAsLink: boolean;
|
|
103
|
-
}, {}>, Readonly<{
|
|
104
|
-
default: any;
|
|
105
|
-
'content-bottom': any;
|
|
106
|
-
'mobile-bottom'(props: {
|
|
107
|
-
headerClose: () => void;
|
|
108
|
-
}): any;
|
|
109
|
-
}> & {
|
|
110
|
-
default: any;
|
|
111
|
-
'content-bottom': any;
|
|
112
|
-
'mobile-bottom'(props: {
|
|
113
|
-
headerClose: () => void;
|
|
114
|
-
}): any;
|
|
115
|
-
}>;
|
|
116
|
-
export default _default;
|
|
117
|
-
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
118
|
-
type __VLS_TypePropsToRuntimeProps<T> = {
|
|
119
|
-
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
120
|
-
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
121
|
-
} : {
|
|
122
|
-
type: import('vue').PropType<T[K]>;
|
|
123
|
-
required: true;
|
|
124
|
-
};
|
|
125
|
-
};
|
|
126
|
-
type __VLS_WithDefaults<P, D> = {
|
|
127
|
-
[K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
|
|
128
|
-
default: D[K];
|
|
129
|
-
}> : P[K];
|
|
130
|
-
};
|
|
131
|
-
type __VLS_Prettify<T> = {
|
|
132
|
-
[K in keyof T]: T[K];
|
|
133
|
-
} & {};
|
|
134
|
-
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
135
|
-
new (): {
|
|
136
|
-
$slots: S;
|
|
137
|
-
};
|
|
138
|
-
};
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type { BodyText, ColorPalette } from '@bobbykim/manguito-theme'
|
|
3
|
-
import generateClass, { Collapse, vCollapse } from '@bobbykim/manguito-theme'
|
|
4
|
-
import { computed, ref } from 'vue'
|
|
5
|
-
import type { MenuCollapseType, MenuItemType } from '../common/index.types'
|
|
6
|
-
type NavLocationType = 'desktop' | 'mobile'
|
|
7
|
-
const props = withDefaults(
|
|
8
|
-
defineProps<{
|
|
9
|
-
navId: string
|
|
10
|
-
navAccordionGroup: string
|
|
11
|
-
navLocation: NavLocationType
|
|
12
|
-
menuItem: MenuCollapseType
|
|
13
|
-
textColor?: ColorPalette
|
|
14
|
-
textSize?: BodyText
|
|
15
|
-
fontBold?: boolean
|
|
16
|
-
dHl?: boolean
|
|
17
|
-
hlColor?: ColorPalette
|
|
18
|
-
asLink?: boolean
|
|
19
|
-
}>(),
|
|
20
|
-
{
|
|
21
|
-
textColor: 'dark-3',
|
|
22
|
-
textSize: 'md',
|
|
23
|
-
fontBold: false,
|
|
24
|
-
dHl: true,
|
|
25
|
-
hlColor: 'primary',
|
|
26
|
-
asLink: true,
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
const toggle = ref<boolean>(false)
|
|
30
|
-
const collapseRef = ref<InstanceType<typeof Collapse>>()
|
|
31
|
-
const emit = defineEmits<{
|
|
32
|
-
(e: 'label-click', event: Event, title: string, open: boolean): void
|
|
33
|
-
(e: 'child-click', event: Event, item: MenuItemType): void
|
|
34
|
-
}>()
|
|
35
|
-
const toggleCollapse = (visible: boolean): void => {
|
|
36
|
-
toggle.value = visible
|
|
37
|
-
}
|
|
38
|
-
const closeCollapse = () => {
|
|
39
|
-
collapseRef.value?.close()
|
|
40
|
-
}
|
|
41
|
-
const handleCollapseLabelClick = (e: Event, title: string) => {
|
|
42
|
-
emit('label-click', e, title, toggle.value)
|
|
43
|
-
}
|
|
44
|
-
const handleChildClick = (e: Event, item: MenuItemType) => {
|
|
45
|
-
const { asLink } = props
|
|
46
|
-
if (!asLink) {
|
|
47
|
-
e.preventDefault()
|
|
48
|
-
}
|
|
49
|
-
emit('child-click', e, item)
|
|
50
|
-
collapseRef.value?.close()
|
|
51
|
-
closeCollapse()
|
|
52
|
-
}
|
|
53
|
-
const getNavId = computed<string>(() => {
|
|
54
|
-
const { navId, navLocation } = props
|
|
55
|
-
const navIdLower = navId.toLowerCase()
|
|
56
|
-
const navIdKebab = navIdLower.replaceAll(' ', '-')
|
|
57
|
-
return `nav-${navLocation}-${navIdKebab}`
|
|
58
|
-
})
|
|
59
|
-
const getAccordionGroup = computed<string>(() => {
|
|
60
|
-
const { navAccordionGroup, navLocation } = props
|
|
61
|
-
const agKebab = navAccordionGroup.toLowerCase().replaceAll(' ', '-')
|
|
62
|
-
return `nav-accordion-group-${navLocation}-${agKebab}`
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
const colorClass = computed<string>(() => {
|
|
66
|
-
const { textColor, textSize, dHl, hlColor, fontBold } = props
|
|
67
|
-
const classArray: string[] = [generateClass('BODYTEXT', textSize)]
|
|
68
|
-
if (!dHl) {
|
|
69
|
-
const nonHlTextClass: string[] = [
|
|
70
|
-
generateClass('TEXTCOLOR', textColor),
|
|
71
|
-
generateClass('HVTEXTCOLOR', hlColor),
|
|
72
|
-
generateClass('FCTEXTCOLOR', hlColor),
|
|
73
|
-
]
|
|
74
|
-
classArray.push(nonHlTextClass.join(' '))
|
|
75
|
-
}
|
|
76
|
-
if (dHl) {
|
|
77
|
-
const highlightColor: string = generateClass('BEFOREBG', hlColor)
|
|
78
|
-
const hlClass: string =
|
|
79
|
-
'before:inset-y-0 before:left-0 before:transition-[width] before:duration-300 before:ease-linear before:w-0 hover:before:w-full focus:before:w-full '
|
|
80
|
-
classArray.push(hlClass + highlightColor)
|
|
81
|
-
const hlTextClass: string[] = [
|
|
82
|
-
generateClass('TEXTCOLOR', hlColor),
|
|
83
|
-
generateClass('HVTEXTCOLOR', textColor),
|
|
84
|
-
generateClass('FCTEXTCOLOR', textColor),
|
|
85
|
-
]
|
|
86
|
-
classArray.push(hlTextClass.join(' '))
|
|
87
|
-
}
|
|
88
|
-
if (fontBold) {
|
|
89
|
-
classArray.push('font-bold')
|
|
90
|
-
}
|
|
91
|
-
return classArray.join(' ')
|
|
92
|
-
})
|
|
93
|
-
const collapseHighlightClass = computed<string>(() => {
|
|
94
|
-
const { dHl, hlColor, navLocation } = props
|
|
95
|
-
const classArray: string[] = []
|
|
96
|
-
if (!dHl) {
|
|
97
|
-
return ''
|
|
98
|
-
}
|
|
99
|
-
const classNames: string =
|
|
100
|
-
'before:absolute before:w-xs before:h-full before:bg-primary before:bg-opacity-70 '
|
|
101
|
-
const hlLocation: string =
|
|
102
|
-
navLocation === 'desktop' ? 'before:left-0 ' : 'before:right-0 '
|
|
103
|
-
classArray.push(classNames + hlLocation + generateClass('BEFOREBG', hlColor))
|
|
104
|
-
return classArray.join(' ')
|
|
105
|
-
})
|
|
106
|
-
const childItemColorClass = computed<string>(() => {
|
|
107
|
-
const { textColor, textSize, dHl, hlColor, fontBold, navLocation } = props
|
|
108
|
-
let childBodyText: BodyText =
|
|
109
|
-
textSize === 'xl'
|
|
110
|
-
? 'lg'
|
|
111
|
-
: textSize === 'lg'
|
|
112
|
-
? 'md'
|
|
113
|
-
: textSize === 'md'
|
|
114
|
-
? 'sm'
|
|
115
|
-
: 'xs'
|
|
116
|
-
const classArray: string[] = [
|
|
117
|
-
generateClass('TEXTCOLOR', textColor),
|
|
118
|
-
generateClass('BODYTEXT', childBodyText),
|
|
119
|
-
]
|
|
120
|
-
if (navLocation === 'mobile') {
|
|
121
|
-
classArray.push('text-end')
|
|
122
|
-
}
|
|
123
|
-
if (!dHl) {
|
|
124
|
-
const nonHlTextClass: string[] = [
|
|
125
|
-
generateClass('TEXTCOLOR', textColor),
|
|
126
|
-
generateClass('HVTEXTCOLOR', hlColor),
|
|
127
|
-
generateClass('FCTEXTCOLOR', hlColor),
|
|
128
|
-
]
|
|
129
|
-
classArray.push(nonHlTextClass.join(' '))
|
|
130
|
-
}
|
|
131
|
-
if (dHl) {
|
|
132
|
-
const highlightColor: string = generateClass('BEFOREBG', hlColor)
|
|
133
|
-
const hlClass: string =
|
|
134
|
-
'before:inset-y-0 before:duration-300 before:ease-linear before:w-0 hover:before:w-full focus:before:w-full before:bg-opacity-70 '
|
|
135
|
-
const hlLocation: string =
|
|
136
|
-
navLocation === 'desktop'
|
|
137
|
-
? 'before:left-0 before:transition-[width] '
|
|
138
|
-
: 'before:left-full hover:before:left-0 focus:before:left-0 before:transition-[all] '
|
|
139
|
-
classArray.push(hlClass + hlLocation + highlightColor)
|
|
140
|
-
const hlTextClass: string[] = [
|
|
141
|
-
generateClass('TEXTCOLOR', hlColor),
|
|
142
|
-
generateClass('HVTEXTCOLOR', textColor),
|
|
143
|
-
generateClass('FCTEXTCOLOR', textColor),
|
|
144
|
-
]
|
|
145
|
-
classArray.push(hlTextClass.join(' '))
|
|
146
|
-
}
|
|
147
|
-
if (fontBold) {
|
|
148
|
-
classArray.push('font-bold')
|
|
149
|
-
}
|
|
150
|
-
return classArray.join(' ')
|
|
151
|
-
})
|
|
152
|
-
defineExpose({
|
|
153
|
-
closeCollapse: closeCollapse,
|
|
154
|
-
})
|
|
155
|
-
</script>
|
|
156
|
-
|
|
157
|
-
<template>
|
|
158
|
-
<div>
|
|
159
|
-
<button
|
|
160
|
-
v-collapse:[getNavId]
|
|
161
|
-
class="px-xs py-2xs relative text-center block w-full before:absolute transition-colors duration-300 ease-linear"
|
|
162
|
-
@click="handleCollapseLabelClick($event, menuItem.title)"
|
|
163
|
-
:class="[colorClass]"
|
|
164
|
-
>
|
|
165
|
-
<div class="relative flex gap-2 items-center justify-center">
|
|
166
|
-
<span>{{ menuItem.title }}</span>
|
|
167
|
-
<svg
|
|
168
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
169
|
-
viewBox="0 0 448 512"
|
|
170
|
-
class="h-[0.8rem] fill-current"
|
|
171
|
-
:class="[
|
|
172
|
-
toggle ? 'rotate-180' : 'rotate-0',
|
|
173
|
-
'transition-transform duration-300 ease-in',
|
|
174
|
-
]"
|
|
175
|
-
>
|
|
176
|
-
<!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
|
177
|
-
<path
|
|
178
|
-
d="M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"
|
|
179
|
-
/>
|
|
180
|
-
</svg>
|
|
181
|
-
</div>
|
|
182
|
-
</button>
|
|
183
|
-
<Collapse
|
|
184
|
-
ref="collapseRef"
|
|
185
|
-
:id="getNavId"
|
|
186
|
-
:accordion="getAccordionGroup"
|
|
187
|
-
@open="toggleCollapse"
|
|
188
|
-
@close="toggleCollapse"
|
|
189
|
-
>
|
|
190
|
-
<ul class="relative" :class="[collapseHighlightClass]">
|
|
191
|
-
<li
|
|
192
|
-
v-for="(item, idx) in menuItem.children"
|
|
193
|
-
:key="idx"
|
|
194
|
-
:class="[navLocation === 'desktop' ? 'ml-xs' : 'mr-xs']"
|
|
195
|
-
>
|
|
196
|
-
<a
|
|
197
|
-
:href="item.url"
|
|
198
|
-
:target="item.target"
|
|
199
|
-
@click="handleChildClick($event, item)"
|
|
200
|
-
class="relative before:absolute w-full px-2xs py-3xs block overflow-x-hidden transition-colors duration-300 ease-linear"
|
|
201
|
-
:class="[childItemColorClass]"
|
|
202
|
-
>
|
|
203
|
-
<span class="relative">
|
|
204
|
-
{{ item.title }}
|
|
205
|
-
</span>
|
|
206
|
-
</a>
|
|
207
|
-
</li>
|
|
208
|
-
</ul>
|
|
209
|
-
</Collapse>
|
|
210
|
-
</div>
|
|
211
|
-
</template>
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { BodyText, ColorPalette } from '@bobbykim/manguito-theme';
|
|
2
|
-
import type { MenuCollapseType, MenuItemType } from '../common/index.types';
|
|
3
|
-
type NavLocationType = 'desktop' | 'mobile';
|
|
4
|
-
declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
|
|
5
|
-
navId: string;
|
|
6
|
-
navAccordionGroup: string;
|
|
7
|
-
navLocation: NavLocationType;
|
|
8
|
-
menuItem: MenuCollapseType;
|
|
9
|
-
textColor?: ColorPalette | undefined;
|
|
10
|
-
textSize?: BodyText | undefined;
|
|
11
|
-
fontBold?: boolean | undefined;
|
|
12
|
-
dHl?: boolean | undefined;
|
|
13
|
-
hlColor?: ColorPalette | undefined;
|
|
14
|
-
asLink?: boolean | undefined;
|
|
15
|
-
}>, {
|
|
16
|
-
textColor: string;
|
|
17
|
-
textSize: string;
|
|
18
|
-
fontBold: boolean;
|
|
19
|
-
dHl: boolean;
|
|
20
|
-
hlColor: string;
|
|
21
|
-
asLink: boolean;
|
|
22
|
-
}>, {
|
|
23
|
-
closeCollapse: () => void;
|
|
24
|
-
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
25
|
-
"label-click": (event: Event, title: string, open: boolean) => void;
|
|
26
|
-
"child-click": (event: Event, item: MenuItemType) => void;
|
|
27
|
-
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
|
|
28
|
-
navId: string;
|
|
29
|
-
navAccordionGroup: string;
|
|
30
|
-
navLocation: NavLocationType;
|
|
31
|
-
menuItem: MenuCollapseType;
|
|
32
|
-
textColor?: ColorPalette | undefined;
|
|
33
|
-
textSize?: BodyText | undefined;
|
|
34
|
-
fontBold?: boolean | undefined;
|
|
35
|
-
dHl?: boolean | undefined;
|
|
36
|
-
hlColor?: ColorPalette | undefined;
|
|
37
|
-
asLink?: boolean | undefined;
|
|
38
|
-
}>, {
|
|
39
|
-
textColor: string;
|
|
40
|
-
textSize: string;
|
|
41
|
-
fontBold: boolean;
|
|
42
|
-
dHl: boolean;
|
|
43
|
-
hlColor: string;
|
|
44
|
-
asLink: boolean;
|
|
45
|
-
}>>> & {
|
|
46
|
-
"onChild-click"?: ((event: Event, item: MenuItemType) => any) | undefined;
|
|
47
|
-
"onLabel-click"?: ((event: Event, title: string, open: boolean) => any) | undefined;
|
|
48
|
-
}, {
|
|
49
|
-
textColor: ColorPalette;
|
|
50
|
-
asLink: boolean;
|
|
51
|
-
textSize: BodyText;
|
|
52
|
-
fontBold: boolean;
|
|
53
|
-
dHl: boolean;
|
|
54
|
-
hlColor: ColorPalette;
|
|
55
|
-
}, {}>;
|
|
56
|
-
export default _default;
|
|
57
|
-
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
58
|
-
type __VLS_TypePropsToRuntimeProps<T> = {
|
|
59
|
-
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
60
|
-
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
61
|
-
} : {
|
|
62
|
-
type: import('vue').PropType<T[K]>;
|
|
63
|
-
required: true;
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
type __VLS_WithDefaults<P, D> = {
|
|
67
|
-
[K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
|
|
68
|
-
default: D[K];
|
|
69
|
-
}> : P[K];
|
|
70
|
-
};
|
|
71
|
-
type __VLS_Prettify<T> = {
|
|
72
|
-
[K in keyof T]: T[K];
|
|
73
|
-
} & {};
|