@bobbykim/mcl-header 0.3.0 → 0.4.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/CHANGELOG.md CHANGED
@@ -3,6 +3,26 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.4.0](https://github.com/bobbykim89/manguito-component-library/compare/@bobbykim/mcl-header@0.3.0...@bobbykim/mcl-header@0.4.0) (2024-03-21)
7
+
8
+
9
+ ### Features
10
+
11
+ * code refactor ([8a025e7](https://github.com/bobbykim89/manguito-component-library/commit/8a025e7cf870ff3dd0cb35878a08793e99ec5cef))
12
+ * **mcl-header-a:** wip) update mcl-header-a ([344a13f](https://github.com/bobbykim89/manguito-component-library/commit/344a13f3cd25c6b02fc99866f19ae65bc89d9ec5))
13
+ * **mcl-header-b:** add mobile layout for mcl-header-b ([ca961ec](https://github.com/bobbykim89/manguito-component-library/commit/ca961ecbaecab1d2e879cb62e905e713878539c0))
14
+ * **mcl-header-b:** add more layouts for desktop screen ([bfd1c7e](https://github.com/bobbykim89/manguito-component-library/commit/bfd1c7e8ed3d9b839bea0dd1a7c3b5740a345c41))
15
+ * **mcl-header-b:** finalize mcl-header-a component ([4a6a627](https://github.com/bobbykim89/manguito-component-library/commit/4a6a6273e6675f8ddbd3a94b0fa21ad06ac7dcad))
16
+ * **mcl-header-b:** fix minor issues with mcl closing collapses in menu item click, update text color of menu items ([1ecfcf3](https://github.com/bobbykim89/manguito-component-library/commit/1ecfcf3ec474e6a6097a34bb9861cbb680280530))
17
+ * **mcl-header-b:** wip) adding story file for mcl-header-b ([2a80675](https://github.com/bobbykim89/manguito-component-library/commit/2a8067553df9a138398aef2a898ebdf3b4a9a268))
18
+ * **mcl-header:** code refactor ([a761b16](https://github.com/bobbykim89/manguito-component-library/commit/a761b16dbad92a680775fcf46692f02ac026d605))
19
+ * **mcl-header:** move deprecated items to deprecated folder in root dir, update configs, init mcl-header-b component ([19aa842](https://github.com/bobbykim89/manguito-component-library/commit/19aa842faa7f1594f7be030b97d5093014efe7cb))
20
+ * tsconfig update, slots and emits update ([c30ff80](https://github.com/bobbykim89/manguito-component-library/commit/c30ff804c961d205ac097e20cd51285a15ca8966))
21
+
22
+
23
+
24
+
25
+
6
26
  # [0.3.0](https://github.com/bobbykim89/manguito-component-library/compare/@bobbykim/mcl-header@0.2.0...@bobbykim/mcl-header@0.3.0) (2024-02-27)
7
27
 
8
28
 
package/README.md CHANGED
@@ -5,6 +5,7 @@
5
5
  [MCL Storybook Page](https://manguito-component-library.vercel.app/)
6
6
 
7
7
  - [MCL Header A](https://manguito-component-library.vercel.app/?path=/docs/sections-header-mclheadera--mclheadera)
8
+ - [MCL Header B](https://manguito-component-library.vercel.app/?path=/docs/sections-header-mclheaderb--mclheaderb)
8
9
 
9
10
  ## Install
10
11
 
package/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  import MclHeaderA from './lib/mcl-header-a/MclHeaderA.vue';
2
- export * from './lib/mcl-header-a/index.types';
3
- export { MclHeaderA };
2
+ import MclHeaderB from './lib/mcl-header-b/MclHeaderB.vue';
3
+ export * from './lib/common/index.types';
4
+ export { MclHeaderA, MclHeaderB };
package/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  import MclHeaderA from './lib/mcl-header-a/MclHeaderA.vue';
2
- export * from './lib/mcl-header-a/index.types';
3
- export { MclHeaderA };
2
+ import MclHeaderB from './lib/mcl-header-b/MclHeaderB.vue';
3
+ export * from './lib/common/index.types';
4
+ export { MclHeaderA, MclHeaderB };
package/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import MclHeaderA from './lib/mcl-header-a/MclHeaderA.vue'
2
- export * from './lib/mcl-header-a/index.types'
2
+ import MclHeaderB from './lib/mcl-header-b/MclHeaderB.vue'
3
+ export * from './lib/common/index.types'
3
4
 
4
- export { MclHeaderA }
5
+ export { MclHeaderA, MclHeaderB }
@@ -8,13 +8,3 @@ export interface MenuCollapseType {
8
8
  title: string;
9
9
  children: MenuItemType[];
10
10
  }
11
- export interface NavChildClickEventType {
12
- event: Event;
13
- item: MenuItemType;
14
- }
15
- export interface MenuEventType {
16
- event: Event;
17
- title: string;
18
- link: string;
19
- target?: CtaTarget;
20
- }
@@ -10,15 +10,3 @@ export interface MenuCollapseType {
10
10
  title: string
11
11
  children: MenuItemType[]
12
12
  }
13
-
14
- export interface NavChildClickEventType {
15
- event: Event
16
- item: MenuItemType
17
- }
18
-
19
- export interface MenuEventType {
20
- event: Event
21
- title: string
22
- link: string
23
- target?: CtaTarget
24
- }
@@ -5,34 +5,24 @@ import type {
5
5
  CtaTarget,
6
6
  HeadingSize,
7
7
  } from '@bobbykim/manguito-theme'
8
- import generateClass from '@bobbykim/manguito-theme'
9
- import { useWindowScroll } from '@vueuse/core'
10
- import { Transition, computed, ref, useSlots } from 'vue'
11
- import HamburgerMenu from '../common/HamburgerMenu.vue'
8
+ import generateClass, { HeaderHorizontal } from '@bobbykim/manguito-theme'
9
+ import { ref } from 'vue'
10
+ import type { MenuCollapseType, MenuItemType } from '../common/index.types'
12
11
  import NavCollapse from './NavCollapse.vue'
13
12
  import NavDropdown from './NavDropdown.vue'
14
13
  import NavLink from './NavLink.vue'
15
- import type {
16
- MenuCollapseType,
17
- MenuEventType,
18
- MenuItemType,
19
- NavChildClickEventType,
20
- } from './index.types'
21
14
 
22
15
  const props = withDefaults(
23
16
  defineProps<{
24
17
  logo: string
25
18
  logoSmall?: string
26
19
  logoAlt?: string
27
- logoAsLink?: boolean
28
- logoLink: string
29
- logoLinkTarget?: CtaTarget
30
20
  title: string
31
21
  titleSize?: HeadingSize
32
22
  titleColor?: ColorPalette
33
- titleAsLink?: boolean
34
- titleLink: string
35
- titleLinkTarget?: CtaTarget
23
+ titleBlockAsLink?: boolean
24
+ titleBlockLinkTarget?: CtaTarget
25
+ titleBlockLink: string
36
26
  menuItems: Array<MenuItemType | MenuCollapseType>
37
27
  menuItemAsLink?: boolean
38
28
  menuTextSize?: BodyText
@@ -42,19 +32,18 @@ const props = withDefaults(
42
32
  highlightColor?: ColorPalette
43
33
  bgColor?: ColorPalette
44
34
  mobileMenuBgColor?: ColorPalette
45
- secondaryColor?: ColorPalette
46
- hamburgerBorder?: boolean
35
+ drawerBtnColor?: ColorPalette
36
+ drawerBtnBorder?: boolean
47
37
  fadeInOnScroll?: boolean
48
38
  scrollDistance?: number
49
39
  }>(),
50
40
  {
51
- logoAsLink: true,
52
- logoLinkTarget: '_self',
41
+ logoAlt: '',
53
42
  titleSize: 'md',
54
43
  titleColor: 'dark-3',
55
- titleAsLink: true,
56
- titleLinkTarget: '_self',
57
- menuItemAsLink: true,
44
+ titleBlockAsLink: false,
45
+ titleBlockLinkTarget: '_self',
46
+ menuItemAsLink: false,
58
47
  menuTextSize: 'md',
59
48
  menuTextColor: 'dark-3',
60
49
  menuTextBold: false,
@@ -62,82 +51,51 @@ const props = withDefaults(
62
51
  highlightColor: 'primary',
63
52
  bgColor: 'light-1',
64
53
  mobileMenuBgColor: 'light-2',
65
- secondaryColor: 'dark-1',
66
- hamburgerBorder: true,
54
+ drawerBtnColor: 'dark-1',
55
+ drawerBtnBorder: true,
67
56
  fadeInOnScroll: true,
68
57
  scrollDistance: 50,
69
58
  }
70
59
  )
71
60
 
72
- const navOpen = ref<boolean>(false)
73
- const slots = useSlots()
74
- const emit = defineEmits([
75
- 'toggle-menu',
76
- 'menu-click',
77
- 'title-click',
78
- 'logo-click',
79
- ])
80
- const { y } = useWindowScroll()
81
-
82
- type EmitType = 'menu' | 'title' | 'logo'
61
+ const componentRef = ref<InstanceType<typeof HeaderHorizontal>>()
62
+ const slots = defineSlots<{
63
+ 'content-right': any
64
+ 'mobile-bottom'(props: { headerClose: () => void }): any
65
+ }>()
66
+ const emit = defineEmits<{
67
+ (e: 'toggle-drawer', event: Event, open: boolean): void
68
+ (e: 'title-click', event: Event, url: string, target: CtaTarget): void
69
+ (e: 'menu-click', event: Event, item: MenuItemType): void
70
+ (e: 'collapse-click', event: Event, title: string, visible: boolean): void
71
+ }>()
83
72
 
84
73
  const closeNav = (): void => {
85
- navOpen.value = false
86
- }
87
-
88
- const toggleNavButton = (e: Event): void => {
89
- navOpen.value = !navOpen.value
90
- emit('toggle-menu', e)
74
+ componentRef.value?.headerClose()
91
75
  }
92
76
 
93
- const navItemClick = (
94
- e: Event,
95
- title: string,
96
- link: string,
97
- target: CtaTarget = '_self',
98
- itemLink: boolean,
99
- emitType: EmitType
100
- ): void => {
101
- /**
102
- * @param {Event} e - $event
103
- * @param {string} link - menuItems[#].url / titleLink
104
- * @param {CtaTarget} target - menuItems[#].target / titleLinkTaget
105
- * @param {boolean} itemlink - menuItemAsLink /
106
- * @param {EmitType} emitType - Non prop value type EmitType
107
- */
108
- navOpen.value = false
109
- const menuEvent: MenuEventType = {
110
- event: e,
111
- title: title,
112
- link: link,
113
- target: target ? target : '_self',
114
- }
115
- if (!itemLink) {
77
+ const handleTitleClick = (e: Event): void => {
78
+ const { titleBlockAsLink, titleBlockLink, titleBlockLinkTarget } = props
79
+ if (!titleBlockAsLink) {
116
80
  e.preventDefault()
117
81
  }
118
- if (emitType === 'menu') {
119
- emit('menu-click', menuEvent)
120
- }
121
- if (emitType === 'title') {
122
- emit('title-click', menuEvent)
123
- }
124
- if (emitType === 'logo') {
125
- emit('logo-click', menuEvent)
126
- }
82
+ emit('title-click', e, titleBlockLink, titleBlockLinkTarget)
83
+ closeNav()
127
84
  }
128
- const navChildLinkClick = (e: NavChildClickEventType): void => {
129
- /**
130
- * @param {NavChildClickEventType} e - Event emitted from dropdown/collapse click events
131
- */
132
- const { title, url, target } = e.item
133
- navOpen.value = false
134
- const menuEvent: MenuEventType = {
135
- event: e.event,
136
- title,
137
- link: url,
138
- target: target ? target : '_self',
85
+ const handleMenuItemClick = (e: Event, item: MenuItemType): void => {
86
+ const { menuItemAsLink } = props
87
+ if (!menuItemAsLink) {
88
+ e.preventDefault()
139
89
  }
140
- emit('menu-click', menuEvent)
90
+ emit('menu-click', e, item)
91
+ closeNav()
92
+ }
93
+ const handleCollapsableMenuClick = (
94
+ e: Event,
95
+ title: string,
96
+ visible: boolean
97
+ ) => {
98
+ emit('collapse-click', e, title, visible)
141
99
  }
142
100
 
143
101
  const getTitleClass = (size: HeadingSize, color: ColorPalette): string => {
@@ -152,26 +110,6 @@ const getTitleClass = (size: HeadingSize, color: ColorPalette): string => {
152
110
  return classArray.join(' ')
153
111
  }
154
112
 
155
- /**
156
- * @TransitionFunctions
157
- * @param {HTMLElement} el - passed any since transition handlers don't accept HTMLElement (accepts Element)
158
- */
159
- const onEnter = (el: any) => {
160
- el.style.height = 'auto'
161
- const endWidth = getComputedStyle(el).height
162
- el.style.height = '0px'
163
- el.offsetHeight // force repaint
164
- el.style.height = endWidth
165
- }
166
- const onAfterEnter = (el: any) => {
167
- el.style.height = 'auto'
168
- }
169
- const onLeave = (el: any) => {
170
- el.style.height = getComputedStyle(el).height
171
- el.offsetHeight // force repaint
172
- el.style.height = '0px'
173
- }
174
-
175
113
  const hasChildren = (item: MenuItemType | MenuCollapseType) => {
176
114
  const NavCollapse = item as MenuCollapseType
177
115
  if (typeof NavCollapse.children === 'undefined') {
@@ -180,40 +118,27 @@ const hasChildren = (item: MenuItemType | MenuCollapseType) => {
180
118
  return NavCollapse.children.length > 0
181
119
  }
182
120
 
183
- const handleFadeInOnScroll = computed(() => {
184
- const { fadeInOnScroll, scrollDistance } = props
185
- if (!fadeInOnScroll) {
186
- return ''
187
- }
188
- return y.value >= scrollDistance
189
- ? 'lg:shadow-md bg-opacity-70'
190
- : 'bg-opacity-100'
121
+ defineExpose({
122
+ headerClose: closeNav,
191
123
  })
192
124
  </script>
193
125
 
194
126
  <template>
195
- <header
196
- class="w-full top-0 md:sticky items-center z-50 transition ease-in duration-500 delay-150"
197
- :class="[handleFadeInOnScroll, generateClass('BGCOLOR', bgColor)]"
127
+ <HeaderHorizontal
128
+ ref="componentRef"
129
+ :bg-color="bgColor"
130
+ :drawer-btn-border="drawerBtnBorder"
131
+ :drawer-btn-color="drawerBtnColor"
132
+ :fade-in-on-scroll="fadeInOnScroll"
133
+ :mobile-menu-bg-color="mobileMenuBgColor"
198
134
  >
199
- <nav
200
- class="flex flex-wrap items-center py-xs md:py-2xs mx-xs md:mx-sm align-middle justify-between sm:max-w-[640px] md:max-w-[768px] lg:max-w-[1024px] xl:max-w-[1280px] 2xl:max-w-[1536px]"
201
- >
135
+ <template #content>
202
136
  <div class="flex flex-shrink-0 items-center self-center">
203
137
  <div class="h-md md:h-lg lg:h-xl mr-2xs md:mr-sm align-middle">
204
138
  <a
205
- :href="logoLink"
206
- :target="logoLinkTarget"
207
- @click="
208
- navItemClick(
209
- $event,
210
- title,
211
- logoLink,
212
- logoLinkTarget,
213
- logoAsLink,
214
- 'logo'
215
- )
216
- "
139
+ :href="titleBlockLink"
140
+ :target="titleBlockLinkTarget"
141
+ @click="handleTitleClick"
217
142
  >
218
143
  <img
219
144
  :src="logo"
@@ -231,18 +156,9 @@ const handleFadeInOnScroll = computed(() => {
231
156
  </div>
232
157
  <div class="flex flex-col justify-center ml-2">
233
158
  <a
234
- :href="titleLink"
235
- :target="titleLinkTarget"
236
- @click="
237
- navItemClick(
238
- $event,
239
- title,
240
- titleLink,
241
- titleLinkTarget,
242
- titleAsLink,
243
- 'title'
244
- )
245
- "
159
+ :href="titleBlockLink"
160
+ :target="titleBlockLinkTarget"
161
+ @click="handleTitleClick"
246
162
  >
247
163
  <h2
248
164
  class="inline-block align-middle tracking-wider"
@@ -266,16 +182,7 @@ const handleFadeInOnScroll = computed(() => {
266
182
  :display-highlight="displayHighlight"
267
183
  :highlight-color="highlightColor"
268
184
  :as-link="menuItemAsLink"
269
- @nav-link="
270
- navItemClick(
271
- $event,
272
- item.title,
273
- (item as MenuItemType).url,
274
- (item as MenuItemType).target,
275
- menuItemAsLink,
276
- 'menu'
277
- )
278
- "
185
+ @nav-link="handleMenuItemClick"
279
186
  ></nav-link>
280
187
  <nav-dropdown
281
188
  v-else
@@ -286,97 +193,59 @@ const handleFadeInOnScroll = computed(() => {
286
193
  :display-highlight="displayHighlight"
287
194
  :highlight-color="highlightColor"
288
195
  :bg-color="bgColor"
289
- :hover-bg-color="secondaryColor"
290
196
  :as-link="menuItemAsLink"
291
- @nav-link="navChildLinkClick"
197
+ @child-click="handleMenuItemClick"
198
+ @label-click="handleCollapsableMenuClick"
292
199
  ></nav-dropdown>
293
200
  </li>
294
201
  </ul>
295
202
  </div>
296
203
  </div>
204
+ </template>
205
+ <template #content-right>
206
+ <div v-if="slots['content-right']" class="hidden lg:block">
207
+ <slot name="content-right"></slot>
208
+ </div>
209
+ </template>
210
+ <template #mobile-content="{ headerClose }">
297
211
  <div>
298
- <hamburger-menu
299
- :color="secondaryColor"
300
- :display-border="hamburgerBorder"
301
- class="block lg:hidden"
302
- @hbg-click="toggleNavButton"
303
- :toggle="navOpen"
304
- :nav-color="bgColor"
305
- ></hamburger-menu>
306
- <div v-if="slots['nav-slot']" class="hidden lg:block">
307
- <slot name="nav-slot"></slot>
212
+ <ul class="flex flex-col items-center justify-center p-xs">
213
+ <li
214
+ class="mb-2xs last:mb-0"
215
+ v-for="(item, index) in menuItems"
216
+ :key="`mobile-${index}`"
217
+ >
218
+ <nav-link
219
+ v-if="!hasChildren(item)"
220
+ :nav-item="(item as MenuItemType)"
221
+ :menu-text-color="menuTextColor"
222
+ :menu-text-size="menuTextSize"
223
+ :menu-text-bold="menuTextBold"
224
+ :display-highlight="displayHighlight"
225
+ :highlight-color="highlightColor"
226
+ :as-link="menuItemAsLink"
227
+ @nav-link="handleMenuItemClick"
228
+ ></nav-link>
229
+ <nav-collapse
230
+ v-else
231
+ :nav-id="item.title"
232
+ :nav-item="(item as MenuCollapseType)"
233
+ :menu-text-color="menuTextColor"
234
+ :menu-text-size="menuTextSize"
235
+ :menu-text-bold="menuTextBold"
236
+ :display-highlight="displayHighlight"
237
+ :highlight-color="highlightColor"
238
+ :nav-accordion-group="title"
239
+ :as-link="menuItemAsLink"
240
+ @child-click="handleMenuItemClick"
241
+ @label-click="handleCollapsableMenuClick"
242
+ ></nav-collapse>
243
+ </li>
244
+ </ul>
245
+ <div v-if="slots['mobile-bottom']">
246
+ <slot name="mobile-bottom" :header-close="closeNav"></slot>
308
247
  </div>
309
248
  </div>
310
- </nav>
311
- <!-- mobile menu -->
312
-
313
- <div class="overflow-hidden lg:hidden">
314
- <transition
315
- name="collapse"
316
- @enter="onEnter"
317
- @after-enter="onAfterEnter"
318
- @leave="onLeave"
319
- >
320
- <div
321
- class="bg-opacity-80 rounded-md my-2xs mx-xs overflow-hidden"
322
- v-if="navOpen"
323
- :class="generateClass('BGCOLOR', mobileMenuBgColor)"
324
- >
325
- <ul class="flex flex-col items-center justify-center p-xs">
326
- <li
327
- class="mb-2xs last:mb-0"
328
- v-for="(item, index) in menuItems"
329
- :key="`mobile-${index}`"
330
- >
331
- <nav-link
332
- v-if="!hasChildren(item)"
333
- :nav-item="(item as MenuItemType)"
334
- :menu-text-color="menuTextColor"
335
- :menu-text-size="menuTextSize"
336
- :menu-text-bold="menuTextBold"
337
- :display-highlight="displayHighlight"
338
- :highlight-color="highlightColor"
339
- :as-link="menuItemAsLink"
340
- @nav-link="
341
- navItemClick(
342
- $event,
343
- item.title,
344
- (item as MenuItemType).url,
345
- (item as MenuItemType).target,
346
- menuItemAsLink,
347
- 'menu'
348
- )
349
- "
350
- ></nav-link>
351
- <nav-collapse
352
- v-else
353
- :nav-id="item.title"
354
- :nav-item="(item as MenuCollapseType)"
355
- :menu-text-color="menuTextColor"
356
- :menu-text-size="menuTextSize"
357
- :menu-text-bold="menuTextBold"
358
- :display-highlight="displayHighlight"
359
- :highlight-color="highlightColor"
360
- :nav-accordion-group="title"
361
- :as-link="menuItemAsLink"
362
- @nav-link="navChildLinkClick"
363
- ></nav-collapse>
364
- </li>
365
- </ul>
366
- <div v-if="slots['mobile-slot']">
367
- <slot name="mobile-slot" :close-nav="closeNav"></slot>
368
- </div>
369
- </div>
370
- </transition>
371
- </div>
372
- </header>
249
+ </template>
250
+ </HeaderHorizontal>
373
251
  </template>
374
-
375
- <style lang="scss" scoped>
376
- .collapse-enter-active {
377
- transition: height 0.5s ease-in;
378
- }
379
- .collapse-leave-active {
380
- transition: height 0.5s ease-out;
381
- }
382
- </style>