@cnamts/synapse 0.0.3-alpha → 0.0.4-alpha
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/design-system-v3.d.ts +712 -27
- package/dist/design-system-v3.js +2715 -1485
- package/dist/design-system-v3.umd.cjs +10 -1
- package/dist/style.css +1 -1
- package/package.json +5 -2
- package/src/components/Alert/Alert.mdx +1 -1
- package/src/components/Alert/Alert.stories.ts +91 -1
- package/src/components/BackBtn/BackBtn.mdx +1 -1
- package/src/components/BackBtn/BackBtn.stories.ts +84 -1
- package/src/components/BackToTopBtn/BackToTopBtn.mdx +3 -3
- package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +172 -11
- package/src/components/CollapsibleList/CollapsibleList.mdx +2 -2
- package/src/components/CollapsibleList/CollapsibleList.stories.ts +37 -1
- package/src/components/CopyBtn/CopyBtn.mdx +1 -1
- package/src/components/CopyBtn/CopyBtn.stories.ts +120 -1
- package/src/components/CopyBtn/CopyBtn.vue +1 -1
- package/src/components/Customs/CustomInputSelect/CustomInputSelect.mdx +6 -8
- package/src/components/Customs/CustomInputSelect/CustomInputSelect.stories.ts +270 -4
- package/src/components/Customs/CustomInputSelect/CustomInputSelect.vue +80 -53
- package/src/components/Customs/CustomInputSelect/config.ts +10 -0
- package/src/components/Customs/CustomSelect/CustomSelect.mdx +3 -3
- package/src/components/Customs/CustomSelect/CustomSelect.stories.ts +158 -2
- package/src/components/Customs/CustomSelect/CustomSelect.vue +25 -6
- package/src/components/Customs/CustomTextField/CustomTextField.mdx +44 -0
- package/src/components/Customs/CustomTextField/CustomTextField.stories.ts +403 -0
- package/src/components/Customs/CustomTextField/CustomTextField.vue +110 -0
- package/src/components/Customs/CustomTextField/tests/CustomTextField.spec.ts +93 -0
- package/src/components/Customs/CustomTextField/tests/__snapshots__/CustomTextField.spec.ts.snap +59 -0
- package/src/components/Customs/CustomTextField/types.d.ts +3 -0
- package/src/components/DataList/DataList.mdx +77 -0
- package/src/components/DataList/DataList.stories.ts +960 -0
- package/src/components/DataList/DataList.vue +140 -0
- package/src/components/DataList/DataListLoading/DataListLoading.vue +56 -0
- package/src/components/DataList/DataListLoading/tests/DataListLoading.spec.ts +23 -0
- package/src/components/DataList/locales.ts +3 -0
- package/src/components/DataList/tests/DataList.spec.ts +194 -0
- package/src/components/DataList/types.d.ts +23 -0
- package/src/components/DataListGroup/DataListGroup.mdx +77 -0
- package/src/components/DataListGroup/DataListGroup.stories.ts +987 -0
- package/src/components/DataListGroup/DataListGroup.vue +59 -0
- package/src/components/DataListGroup/tests/DataListGroup.spec.ts +54 -0
- package/src/components/DataListGroup/tests/data/dataListGroupItems.ts +41 -0
- package/src/components/DataListGroup/types.d.ts +15 -0
- package/src/components/DataListItem/DataListItem.vue +135 -0
- package/src/components/DataListItem/config.ts +17 -0
- package/src/components/DataListItem/locales.ts +3 -0
- package/src/components/DataListItem/tests/DataListItem.spec.ts +156 -0
- package/src/components/DataListItem/types.d.ts +23 -0
- package/src/components/DownloadBtn/Accessibilite.mdx +14 -0
- package/src/components/DownloadBtn/Accessibilite.stories.ts +166 -0
- package/src/components/DownloadBtn/AccessibiliteItems.ts +129 -0
- package/src/components/DownloadBtn/DownloadBtn.mdx +5 -6
- package/src/components/DownloadBtn/DownloadBtn.stories.ts +207 -2
- package/src/components/DownloadBtn/constants/ExpertiseLevelEnum.ts +4 -0
- package/src/components/FooterBar/FooterBar.mdx +2 -2
- package/src/components/FooterBar/FooterBar.stories.ts +1 -1
- package/src/components/FranceConnectBtn/FranceConnectBtn.mdx +1 -1
- package/src/components/FranceConnectBtn/FranceConnectBtn.stories.ts +58 -1
- package/src/components/HeaderBar/HeaderBar.mdx +164 -45
- package/src/components/HeaderBar/HeaderBar.stories.ts +559 -15
- package/src/components/HeaderBar/HeaderBar.vue +60 -22
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.mdx +433 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.stories.ts +1089 -0
- package/src/components/HeaderBar/{HeaderComplexMenu/HeaderComplexMenu.vue → HeaderBurgerMenu/HeaderBurgerMenu.vue} +74 -45
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.mdx +38 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.stories.ts +89 -0
- package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuItem/tests/__snapshots__/HeaderMenuItem.spec.ts.snap +1 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.mdx +17 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.stories.ts +121 -0
- package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuSection/HeaderMenuSection.vue +2 -2
- package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuSection/tests/HeaderMenuSection.spec.ts +1 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.mdx +43 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.stories.ts +261 -0
- package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderSubMenu/HeaderSubMenu.vue +17 -3
- package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderSubMenu/tests/HeaderSubMenu.spec.ts +1 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +180 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/HeaderBurgerMenu.spec.ts.snap +13 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/HeaderComplexMenu.spec.ts.snap +13 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +62 -25
- package/src/components/HeaderBar/HeaderLogo/tests/HeaderLogo.spec.ts +49 -1
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +19 -23
- package/src/components/HeaderBar/HeaderMenuBtn/tests/HeaderMenuBtn.spec.ts +70 -0
- package/src/components/HeaderBar/Usages.mdx +85 -0
- package/src/components/HeaderBar/consts.scss +0 -1
- package/src/components/HeaderBar/tests/HeaderBar.spec.ts +8 -2
- package/src/components/HeaderBar/tests/__snapshots__/HeaderBar.spec.ts.snap +5 -10
- package/src/components/HeaderLoading/HeaderLoading.mdx +28 -0
- package/src/components/HeaderLoading/HeaderLoading.stories.ts +62 -0
- package/src/components/HeaderLoading/HeaderLoading.vue +45 -0
- package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +22 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.mdx +128 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +784 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +194 -0
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +74 -0
- package/src/components/HeaderNavigationBar/HorizontalNavbar/config.ts +18 -0
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +127 -0
- package/src/components/HeaderNavigationBar/types.ts +7 -0
- package/src/components/HeaderToolbar/HeaderToolbar.mdx +31 -0
- package/src/components/HeaderToolbar/HeaderToolbar.stories.ts +343 -0
- package/src/components/HeaderToolbar/HeaderToolbar.vue +487 -0
- package/src/components/HeaderToolbar/tests/HeaderToolbar.spec.ts +196 -0
- package/src/components/HeaderToolbar/types.d.ts +20 -0
- package/src/components/LangBtn/LangBtn.mdx +1 -1
- package/src/components/LangBtn/LangBtn.stories.ts +125 -8
- package/src/components/Logo/Logo.mdx +2 -2
- package/src/components/Logo/Logo.stories.ts +147 -1
- package/src/components/LogoBrandSection/LogoBrandSection.mdx +14 -0
- package/src/components/LogoBrandSection/LogoBrandSection.stories.ts +158 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +312 -0
- package/src/components/LogoBrandSection/assets/ameli-pro.svg +1 -0
- package/src/components/LogoBrandSection/assets/ameli.svg +1 -0
- package/src/components/LogoBrandSection/assets/cnam.svg +1 -0
- package/src/components/LogoBrandSection/assets/compte-ameli.svg +1 -0
- package/src/components/LogoBrandSection/dividerDimensionsMapping.ts +14 -0
- package/src/components/LogoBrandSection/locales.ts +14 -0
- package/src/components/LogoBrandSection/secondaryLogoMapping.ts +24 -0
- package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +365 -0
- package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +14 -0
- package/src/components/LogoBrandSection/types.ts +8 -0
- package/src/components/NotificationBar/NotificationBar.mdx +6 -6
- package/src/components/NotificationBar/NotificationBar.stories.ts +1 -1
- package/src/components/NotificationBar/NotificationBar.vue +2 -2
- package/src/components/NotificationBar/tests/NotificationBar.spec.ts +1 -1
- package/src/components/PageContainer/PageContainer.mdx +1 -1
- package/src/components/PageContainer/PageContainer.stories.ts +86 -1
- package/src/components/PhoneField/PhoneField.mdx +49 -0
- package/src/components/PhoneField/PhoneField.stories.ts +869 -0
- package/src/components/PhoneField/PhoneField.vue +230 -0
- package/src/components/PhoneField/indicatifs.ts +104 -0
- package/src/components/PhoneField/locales.ts +4 -0
- package/src/components/PhoneField/tests/PhoneField.spec.ts +179 -0
- package/src/components/SkipLink/SkipLink.stories.ts +50 -1
- package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +28 -1
- package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +37 -1
- package/src/components/SubHeader/SubHeader.mdx +31 -0
- package/src/components/SubHeader/SubHeader.stories.ts +1032 -0
- package/src/components/SubHeader/SubHeader.vue +185 -0
- package/src/components/SubHeader/config.ts +12 -0
- package/src/components/SubHeader/locales.ts +3 -0
- package/src/components/SubHeader/tests/SubHeader.spec.ts +144 -0
- package/src/components/index.ts +24 -7
- package/src/composables/widthable/index.ts +29 -0
- package/src/composables/widthable/tests/widthable.spec.ts +52 -0
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +2 -2
- package/src/main.ts +1 -0
- package/src/modules.d.ts +4 -0
- package/src/services/index.ts +1 -0
- package/src/stories/Demarrer/Accueil.mdx +10 -0
- package/src/stories/Demarrer/Accueil.stories.ts +76 -0
- package/src/stories/Demarrer/PolitiqueDeConfidentialite.mdx +9 -0
- package/src/stories/Demarrer/PolitiqueDeConfidentialite.stories.ts +20 -0
- package/src/stories/Fondamentaux/Accessibilite/Accessibilite.mdx +1 -2
- package/src/stories/Fondamentaux/Accessibilite/Accessibilite.stories.ts +1 -1
- package/src/stories/Fondamentaux/EcoConception/Econception.stories.ts +1 -1
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +52 -48
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +31 -28
- package/src/stories/Guidelines/CustomisationEtThemes.mdx +1 -1
- package/src/utils/functions/throttleDisplayFn/tests/throttleDisplayFn.spec.ts +47 -0
- package/src/utils/functions/throttleDisplayFn/throttleDisplayFn.ts +26 -0
- package/src/utils/rules/exactLength/index.ts +33 -0
- package/src/utils/rules/exactLength/locales.ts +6 -0
- package/src/utils/rules/required/index.ts +25 -0
- package/src/utils/rules/required/locales.ts +5 -0
- package/src/utils/rules/required/ruleMessageHelper.ts +14 -0
- package/src/utils/rules/required/tests/index.spec.ts +47 -0
- package/src/utils/rules/required/tests/rulesMessageHelper.spec.ts +22 -0
- package/src/utils/rules/types.d.ts +15 -0
- package/src/components/Beta/beta.mdx +0 -5
- package/src/components/Deprecated/deprecated.mdx +0 -5
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderComplexMenu.stories.ts +0 -272
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuItem/HeaderMenuItem.stories.ts +0 -49
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuSection/HeaderMenuSection.stories.ts +0 -56
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderSubMenu/HeaderSubMenu.stories.ts +0 -137
- package/src/components/HeaderBar/HeaderComplexMenu/tests/HeaderComplexMenu.spec.ts +0 -129
- package/src/components/HeaderBar/HeaderComplexMenu/tests/__snapshots__/HeaderComplexMenu.spec.ts.snap +0 -18
- package/src/stories/Home/Accueil.mdx +0 -7
- package/src/stories/Home/PolitiqueDeConfidentialite.mdx +0 -4
- package/src/stories/Home/synapse.webp +0 -0
- /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuItem/HeaderMenuItem.vue +0 -0
- /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuItem/tests/HeaderMenuItem.spec.ts +0 -0
- /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/conts.ts +0 -0
- /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/locals.ts +0 -0
- /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/tests/useHandleSubMenus.spec.ts +0 -0
- /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/useHandleSubMenus.ts +0 -0
- /package/src/components/Logo/{types.d.ts → types.ts} +0 -0
|
@@ -1,54 +1,73 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import throttleDisplayFn from '@/utils/functions/throttleDisplayFn/throttleDisplayFn'
|
|
2
3
|
import { computed, inject, nextTick, onMounted, onUnmounted, readonly, ref, watch, type CSSProperties, type Ref } from 'vue'
|
|
3
4
|
import HeaderMenuBtn from '../HeaderMenuBtn/HeaderMenuBtn.vue'
|
|
4
5
|
import { registerHeaderMenuKey } from '../consts'
|
|
6
|
+
import useHeaderResponsiveMode from '../useHeaderResponsiveMode'
|
|
5
7
|
import locals from './locals'
|
|
6
8
|
import useHandleSubMenus from './useHandleSubMenus'
|
|
7
9
|
|
|
8
|
-
const
|
|
10
|
+
const headerMenuWrapper = ref<HTMLElement | null>(null)
|
|
9
11
|
const menuBtnWrapper = ref<HTMLDivElement | null>(null)
|
|
10
12
|
const outerBtn = ref<HTMLElement | null>(null)
|
|
11
13
|
const innerBtn = ref<HTMLElement | null>(null)
|
|
12
14
|
const menuLeft = ref(0)
|
|
13
15
|
const menuTop = ref(0)
|
|
16
|
+
const menuHeight = ref('70vh')
|
|
14
17
|
|
|
15
18
|
function positionMenu() {
|
|
16
|
-
|
|
17
|
-
menuLeft.value =
|
|
18
|
-
menuTop.value =
|
|
19
|
+
const rect = menuBtnWrapper.value!.getBoundingClientRect()
|
|
20
|
+
menuLeft.value = rect.left
|
|
21
|
+
menuTop.value = rect.top
|
|
22
|
+
menuHeight.value = `calc(100vh - ${rect.top}px - 48px)`
|
|
23
|
+
}
|
|
24
|
+
const throttledPositionMenu = throttleDisplayFn(positionMenu, 16)
|
|
25
|
+
const optimizedPositionMenu = () => {
|
|
26
|
+
if (menuOpen.value) {
|
|
27
|
+
throttledPositionMenu()
|
|
28
|
+
}
|
|
19
29
|
}
|
|
20
30
|
|
|
21
31
|
onMounted(() => {
|
|
22
32
|
positionMenu()
|
|
23
|
-
|
|
24
|
-
window.addEventListener('
|
|
33
|
+
togglePageScroll()
|
|
34
|
+
window.addEventListener('scroll', optimizedPositionMenu)
|
|
35
|
+
window.addEventListener('resize', optimizedPositionMenu)
|
|
25
36
|
window.addEventListener('click', handleClickOutside, { capture: true })
|
|
26
37
|
})
|
|
27
38
|
|
|
28
39
|
onUnmounted(() => {
|
|
29
|
-
window.removeEventListener('scroll',
|
|
30
|
-
window.removeEventListener('resize',
|
|
40
|
+
window.removeEventListener('scroll', optimizedPositionMenu)
|
|
41
|
+
window.removeEventListener('resize', optimizedPositionMenu)
|
|
31
42
|
window.removeEventListener('click', handleClickOutside, { capture: true })
|
|
43
|
+
|
|
44
|
+
document.documentElement.style.overflow = 'auto'
|
|
45
|
+
document.body.style.overflow = 'auto'
|
|
32
46
|
})
|
|
33
47
|
|
|
34
|
-
const menuOpen =
|
|
48
|
+
const menuOpen = defineModel<boolean>({
|
|
49
|
+
default: false,
|
|
50
|
+
})
|
|
35
51
|
|
|
36
52
|
watch(menuOpen, async (newVal) => {
|
|
37
|
-
|
|
38
|
-
document.body.style.overflow = newVal ? 'hidden' : 'auto'
|
|
53
|
+
togglePageScroll()
|
|
39
54
|
|
|
40
55
|
if (newVal) {
|
|
56
|
+
positionMenu() // the menu position can have changed since the component was mounted
|
|
57
|
+
|
|
41
58
|
await nextTick()
|
|
42
|
-
innerBtn.value
|
|
59
|
+
innerBtn.value?.focus()
|
|
43
60
|
}
|
|
44
61
|
else {
|
|
45
|
-
outerBtn.value
|
|
62
|
+
outerBtn.value?.focus()
|
|
46
63
|
}
|
|
47
|
-
})
|
|
64
|
+
}, { immediate: true })
|
|
48
65
|
|
|
66
|
+
const { isDesktop } = useHeaderResponsiveMode()
|
|
49
67
|
const menuStyle = computed<CSSProperties>(() => ({
|
|
50
68
|
left: `${menuLeft.value}px`,
|
|
51
69
|
top: `${menuTop.value}px`,
|
|
70
|
+
height: isDesktop.value ? menuHeight.value : undefined,
|
|
52
71
|
}))
|
|
53
72
|
|
|
54
73
|
function handleClickOutside(event: MouseEvent | KeyboardEvent) {
|
|
@@ -57,17 +76,25 @@
|
|
|
57
76
|
// do not close menu if click is inside the menu
|
|
58
77
|
let walkElement = event.target as HTMLElement | null
|
|
59
78
|
while (walkElement && walkElement !== document.body) {
|
|
60
|
-
if (walkElement ===
|
|
79
|
+
if (walkElement === headerMenuWrapper.value) return
|
|
61
80
|
walkElement = walkElement.parentElement
|
|
62
81
|
}
|
|
63
82
|
|
|
83
|
+
event.stopPropagation()
|
|
64
84
|
menuOpen.value = false
|
|
65
85
|
}
|
|
66
86
|
|
|
87
|
+
function togglePageScroll() {
|
|
88
|
+
if (typeof window !== 'undefined') {
|
|
89
|
+
document.documentElement.style.overflow = menuOpen.value ? 'hidden' : 'auto'
|
|
90
|
+
document.body.style.overflow = menuOpen.value ? 'hidden' : 'auto'
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
67
94
|
const { haveOpenSubMenu } = useHandleSubMenus(readonly(menuOpen))
|
|
68
95
|
|
|
69
96
|
const registerHeaderMenu = inject<(menuOpen: Ref<boolean>) => void>(registerHeaderMenuKey)
|
|
70
|
-
if (registerHeaderMenu) registerHeaderMenu(menuOpen)
|
|
97
|
+
if (registerHeaderMenu) registerHeaderMenu(readonly(menuOpen))
|
|
71
98
|
</script>
|
|
72
99
|
<template>
|
|
73
100
|
<div
|
|
@@ -81,37 +108,39 @@
|
|
|
81
108
|
v-model="menuOpen"
|
|
82
109
|
/>
|
|
83
110
|
</div>
|
|
84
|
-
<
|
|
85
|
-
<
|
|
86
|
-
v-show="menuOpen"
|
|
87
|
-
class="overlay"
|
|
88
|
-
>
|
|
111
|
+
<Teleport to="body">
|
|
112
|
+
<Transition name="menu">
|
|
89
113
|
<div
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
class="menu-wrapper"
|
|
93
|
-
:style="menuStyle"
|
|
114
|
+
v-if="menuOpen"
|
|
115
|
+
class="overlay"
|
|
94
116
|
>
|
|
95
|
-
<
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
<nav
|
|
100
|
-
id="header-menu-wrapper"
|
|
101
|
-
class="header-menu-wrapper"
|
|
102
|
-
:class="{
|
|
103
|
-
'header-menu-wrapper--submenu-open': haveOpenSubMenu,
|
|
104
|
-
}"
|
|
105
|
-
role="navigation"
|
|
106
|
-
:aria-label="locals.publicMenu"
|
|
117
|
+
<div
|
|
118
|
+
role="menu"
|
|
119
|
+
class="menu-wrapper"
|
|
120
|
+
:style="menuStyle"
|
|
107
121
|
>
|
|
108
|
-
<
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
122
|
+
<HeaderMenuBtn
|
|
123
|
+
ref="innerBtn"
|
|
124
|
+
v-model="menuOpen"
|
|
125
|
+
/>
|
|
126
|
+
<nav
|
|
127
|
+
id="header-menu-wrapper"
|
|
128
|
+
ref="headerMenuWrapper"
|
|
129
|
+
class="header-menu-wrapper"
|
|
130
|
+
:class="{
|
|
131
|
+
'header-menu-wrapper--submenu-open': haveOpenSubMenu,
|
|
132
|
+
}"
|
|
133
|
+
role="navigation"
|
|
134
|
+
:aria-label="locals.publicMenu"
|
|
135
|
+
>
|
|
136
|
+
<div class="header-menu">
|
|
137
|
+
<slot />
|
|
138
|
+
</div>
|
|
139
|
+
</nav>
|
|
140
|
+
</div>
|
|
112
141
|
</div>
|
|
113
|
-
</
|
|
114
|
-
</
|
|
142
|
+
</Transition>
|
|
143
|
+
</Teleport>
|
|
115
144
|
</div>
|
|
116
145
|
</template>
|
|
117
146
|
|
|
@@ -124,6 +153,7 @@
|
|
|
124
153
|
position: fixed;
|
|
125
154
|
z-index: 1000;
|
|
126
155
|
background-color: rgba(3, 16, 37, .5);
|
|
156
|
+
backdrop-filter: blur(2px);
|
|
127
157
|
}
|
|
128
158
|
|
|
129
159
|
.menu-wrapper {
|
|
@@ -151,7 +181,6 @@
|
|
|
151
181
|
}
|
|
152
182
|
|
|
153
183
|
.header-menu-wrapper {
|
|
154
|
-
height: $menu-height;
|
|
155
184
|
width: $menu-width;
|
|
156
185
|
overflow: visible;
|
|
157
186
|
}
|
|
@@ -160,7 +189,7 @@
|
|
|
160
189
|
background-color: $neutral-white;
|
|
161
190
|
overflow-y : auto;
|
|
162
191
|
overflow-x: hidden;
|
|
163
|
-
height:
|
|
192
|
+
height: 100%;
|
|
164
193
|
}
|
|
165
194
|
}
|
|
166
195
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Controls, Canvas, Meta, Source } from "@storybook/blocks";
|
|
2
|
+
import * as HeaderMenuItemStories from "./HeaderMenuItem.stories";
|
|
3
|
+
|
|
4
|
+
<Meta of={HeaderMenuItemStories} />
|
|
5
|
+
|
|
6
|
+
# HeaderMenuItem
|
|
7
|
+
|
|
8
|
+
Le composant `HeaderMenuItem` est un composant de menu qui permet de wrapper un lien de navigation. Cela peut être un lien `a`, `router-link` ou `nuxt-link`.
|
|
9
|
+
Ce composant doit être utilisé dans un composant `HeaderMenuSection` afin de respecter la structure du menu et de garantir la bonne accessibilité de celui ci.
|
|
10
|
+
|
|
11
|
+
<Source
|
|
12
|
+
dark
|
|
13
|
+
code={`
|
|
14
|
+
<HeaderMenuSection>
|
|
15
|
+
<HeaderMenuItem>
|
|
16
|
+
<a href="/">Home</a>
|
|
17
|
+
</HeaderMenuItem>
|
|
18
|
+
<HeaderMenuItem>
|
|
19
|
+
<a href="/about">About</a>
|
|
20
|
+
</HeaderMenuItem>
|
|
21
|
+
<HeaderMenuItem>
|
|
22
|
+
<RouterLink to="/services">Services</RouterLink>
|
|
23
|
+
</HeaderMenuItem>
|
|
24
|
+
<HeaderMenuItem>
|
|
25
|
+
<NuxtLink to="/contact">Contact</NuxtLink>
|
|
26
|
+
</HeaderMenuItem>
|
|
27
|
+
</HeaderMenuSection>
|
|
28
|
+
`}
|
|
29
|
+
/>
|
|
30
|
+
|
|
31
|
+
Pour plus de détails sur le contexte d'utilisation de ce composant, veuillez consulter le composant `HeaderBurgerMenu`.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
<Canvas of={HeaderMenuItemStories.Default} />
|
|
35
|
+
|
|
36
|
+
## API
|
|
37
|
+
|
|
38
|
+
<Controls of={HeaderMenuItemStories.Default} />
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
2
|
+
import HeaderMenuItem from './HeaderMenuItem.vue'
|
|
3
|
+
import HeaderBurgerMenu from '../HeaderBurgerMenu.vue'
|
|
4
|
+
import HeaderBar from '../../HeaderBar.vue'
|
|
5
|
+
import HeaderMenuSection from '../HeaderMenuSection/HeaderMenuSection.vue'
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: 'Composants/Structure/HeaderBar/HeaderBurgerMenu/HeaderMenuItem',
|
|
9
|
+
component: HeaderMenuItem,
|
|
10
|
+
argTypes: {
|
|
11
|
+
default: {
|
|
12
|
+
control: { type: 'text' },
|
|
13
|
+
description: 'Le lien (`a`; `router-link`, `nuxt-link`) et son contenu',
|
|
14
|
+
table: {
|
|
15
|
+
type: { summary: '{}' },
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
parameters: {
|
|
20
|
+
layout: 'fullscreen',
|
|
21
|
+
},
|
|
22
|
+
} satisfies Meta<typeof HeaderMenuItem>
|
|
23
|
+
|
|
24
|
+
export default meta
|
|
25
|
+
|
|
26
|
+
type Story = StoryObj<typeof meta>
|
|
27
|
+
|
|
28
|
+
export const Default: Story = {
|
|
29
|
+
args: {
|
|
30
|
+
default: 'lorem ipsum',
|
|
31
|
+
},
|
|
32
|
+
render: (args) => {
|
|
33
|
+
return {
|
|
34
|
+
components: { HeaderMenuItem, HeaderBurgerMenu, HeaderBar, HeaderMenuSection },
|
|
35
|
+
setup() {
|
|
36
|
+
return { args }
|
|
37
|
+
},
|
|
38
|
+
template: `
|
|
39
|
+
<HeaderBar>
|
|
40
|
+
<template #menu>
|
|
41
|
+
<HeaderBurgerMenu>
|
|
42
|
+
<HeaderMenuSection>
|
|
43
|
+
<HeaderMenuItem>
|
|
44
|
+
<a href="">{{ args.default }}</a>
|
|
45
|
+
</HeaderMenuItem>
|
|
46
|
+
</HeaderMenuSection>
|
|
47
|
+
</HeaderBurgerMenu>
|
|
48
|
+
</template>
|
|
49
|
+
</HeaderBar>
|
|
50
|
+
`,
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
play: async ({ canvasElement }) => {
|
|
54
|
+
const menuBtn = canvasElement.querySelector('button')
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
menuBtn!.click()
|
|
57
|
+
}, 1000)
|
|
58
|
+
},
|
|
59
|
+
parameters: {
|
|
60
|
+
sourceCode: [
|
|
61
|
+
{
|
|
62
|
+
name: 'Template',
|
|
63
|
+
code: `
|
|
64
|
+
<Template>
|
|
65
|
+
<HeaderBar>
|
|
66
|
+
<template #menu>
|
|
67
|
+
<HeaderBurgerMenu>
|
|
68
|
+
<HeaderMenuSection>
|
|
69
|
+
<HeaderMenuItem>
|
|
70
|
+
<a href="">lorem ipsum</a>
|
|
71
|
+
</HeaderMenuItem>
|
|
72
|
+
</HeaderMenuSection>
|
|
73
|
+
</HeaderBurgerMenu>
|
|
74
|
+
</template>
|
|
75
|
+
</HeaderBar>
|
|
76
|
+
</Template>
|
|
77
|
+
`,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'Script',
|
|
81
|
+
code: `
|
|
82
|
+
<script setup>
|
|
83
|
+
import { HeaderBurgerMenu, HeaderBar, HeaderMenuSection, HeaderMenuItem } from '@cnamts/synapse'
|
|
84
|
+
</script>
|
|
85
|
+
`,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`HeaderMenuItem > should render the component 1`] = `"<li data-v-
|
|
3
|
+
exports[`HeaderMenuItem > should render the component 1`] = `"<li data-v-bc776fc3="" class="header-menu-item"><a>Test</a></li>"`;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Controls, Canvas, Meta, Source } from "@storybook/blocks";
|
|
2
|
+
import * as HeaderMenuSectionStories from "./HeaderMenuSection.stories";
|
|
3
|
+
|
|
4
|
+
<Meta of={HeaderMenuSectionStories} />
|
|
5
|
+
|
|
6
|
+
# HeaderMenuSection
|
|
7
|
+
|
|
8
|
+
Le composant `HeaderMenuSection` permet de regrouper des éléments de menu dans une section. Il s'utilise dans le composant `HeaderComplexMenu` ou `HeaderSubMenu` et doit contenir des éléments de menu (`HeaderMenuItem`).
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
<Canvas of={HeaderMenuSectionStories.Default} />
|
|
12
|
+
|
|
13
|
+
## API
|
|
14
|
+
|
|
15
|
+
<Controls of={HeaderMenuSectionStories.Default} />
|
|
16
|
+
|
|
17
|
+
|
package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.stories.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
2
|
+
import HeaderMenuSection from './HeaderMenuSection.vue'
|
|
3
|
+
import HeaderMenuItem from '../HeaderMenuItem/HeaderMenuItem.vue'
|
|
4
|
+
import HeaderBurgerMenu from '../HeaderBurgerMenu.vue'
|
|
5
|
+
import HeaderBar from '../../HeaderBar.vue'
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: 'Composants/Structure/HeaderBar/HeaderBurgerMenu/HeaderMenuSection',
|
|
9
|
+
component: HeaderMenuSection,
|
|
10
|
+
argTypes: {
|
|
11
|
+
title: {
|
|
12
|
+
description: 'Titre de la section',
|
|
13
|
+
control: { type: 'text' },
|
|
14
|
+
table: {
|
|
15
|
+
category: 'slots',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
default: {
|
|
19
|
+
control: { type: 'text' },
|
|
20
|
+
description: 'Contenu de la section, construit avec des composants `HeaderMenuItem`',
|
|
21
|
+
table: {
|
|
22
|
+
type: { summary: '{}' },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
parameters: {
|
|
27
|
+
layout: 'fullscreen',
|
|
28
|
+
},
|
|
29
|
+
} satisfies Meta<typeof HeaderMenuSection>
|
|
30
|
+
|
|
31
|
+
export default meta
|
|
32
|
+
|
|
33
|
+
type Story = StoryObj<typeof meta>
|
|
34
|
+
|
|
35
|
+
export const Default: Story = {
|
|
36
|
+
args: {
|
|
37
|
+
title: 'section 1',
|
|
38
|
+
},
|
|
39
|
+
render: (args) => {
|
|
40
|
+
return {
|
|
41
|
+
components: { HeaderMenuItem, HeaderBurgerMenu, HeaderBar, HeaderMenuSection },
|
|
42
|
+
setup() {
|
|
43
|
+
return { args }
|
|
44
|
+
},
|
|
45
|
+
template: `
|
|
46
|
+
<HeaderBar>
|
|
47
|
+
<template #menu>
|
|
48
|
+
<HeaderBurgerMenu>
|
|
49
|
+
<HeaderMenuSection>
|
|
50
|
+
<template #title>
|
|
51
|
+
{{ args.title }}
|
|
52
|
+
</template>
|
|
53
|
+
<HeaderMenuItem>
|
|
54
|
+
<a>lorem ipsum</a>
|
|
55
|
+
</HeaderMenuItem>
|
|
56
|
+
</HeaderMenuSection>
|
|
57
|
+
|
|
58
|
+
<HeaderMenuSection>
|
|
59
|
+
<template #title>
|
|
60
|
+
section 2
|
|
61
|
+
</template>
|
|
62
|
+
|
|
63
|
+
<HeaderMenuItem>
|
|
64
|
+
<a>lorem ipsum</a>
|
|
65
|
+
</HeaderMenuItem>
|
|
66
|
+
</HeaderMenuSection>
|
|
67
|
+
</HeaderBurgerMenu>
|
|
68
|
+
</template>
|
|
69
|
+
</HeaderBar>
|
|
70
|
+
`,
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
play: async ({ canvasElement }) => {
|
|
74
|
+
const menuBtn = canvasElement.querySelector('button')
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
menuBtn!.click()
|
|
77
|
+
}, 1000)
|
|
78
|
+
},
|
|
79
|
+
parameters: {
|
|
80
|
+
sourceCode: [
|
|
81
|
+
{
|
|
82
|
+
name: 'Template',
|
|
83
|
+
code: `
|
|
84
|
+
<Template>
|
|
85
|
+
<HeaderBar>
|
|
86
|
+
<template #menu>
|
|
87
|
+
<HeaderBurgerMenu>
|
|
88
|
+
<HeaderMenuSection>
|
|
89
|
+
<template #title>
|
|
90
|
+
{{ args.title }}
|
|
91
|
+
</template>
|
|
92
|
+
<HeaderMenuItem>
|
|
93
|
+
<a>lorem ipsum</a>
|
|
94
|
+
</HeaderMenuItem>
|
|
95
|
+
</HeaderMenuSection>
|
|
96
|
+
|
|
97
|
+
<HeaderMenuSection>
|
|
98
|
+
<template #title>
|
|
99
|
+
section 2
|
|
100
|
+
</template>
|
|
101
|
+
<HeaderMenuItem>
|
|
102
|
+
<a>lorem ipsum</a>
|
|
103
|
+
</HeaderMenuItem>
|
|
104
|
+
</HeaderMenuSection>
|
|
105
|
+
</HeaderBurgerMenu>
|
|
106
|
+
</template>
|
|
107
|
+
</HeaderBar>
|
|
108
|
+
</Template>
|
|
109
|
+
`,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'Script',
|
|
113
|
+
code: `
|
|
114
|
+
<script setup>
|
|
115
|
+
import { HeaderBurgerMenu, HeaderBar, HeaderMenuSection, HeaderMenuItem } from '@cnamts/synapse'
|
|
116
|
+
</script>
|
|
117
|
+
`,
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
}
|
|
@@ -5,10 +5,8 @@ import HeaderMenuSection from '../HeaderMenuSection.vue'
|
|
|
5
5
|
describe('HeaderMenuSection', () => {
|
|
6
6
|
it('should render the component', async () => {
|
|
7
7
|
const wrapper = mount(HeaderMenuSection, {
|
|
8
|
-
props: {
|
|
9
|
-
title: 'Section title',
|
|
10
|
-
},
|
|
11
8
|
slots: {
|
|
9
|
+
title: 'Section title',
|
|
12
10
|
default: [
|
|
13
11
|
'<li><a>Test 1</a></li>',
|
|
14
12
|
'<li><a>Test 2</a></li>',
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Controls, Canvas, Meta, Source } from "@storybook/blocks";
|
|
2
|
+
import * as HeaderSubMenuStories from "./HeaderSubMenu.stories";
|
|
3
|
+
|
|
4
|
+
<Meta of={HeaderSubMenuStories} />
|
|
5
|
+
|
|
6
|
+
# HeaderSubMenu
|
|
7
|
+
|
|
8
|
+
Le composant `HeaderSubMenu` est un sous-composant du composant `HeaderBurgerMenu` qui permet de créer un sous-menu dans le menu principal.
|
|
9
|
+
En mode mobile, les sous-menus s'affichent par dessus du menu parent, en mode desktop, les sous-menus s'affichent à droite du parent.
|
|
10
|
+
Les sous-menus peuvent être imbriqués pour créer des sous-sous-menus.
|
|
11
|
+
|
|
12
|
+
Le composant `HeaderSubMenu` doit être utilisé dans un composant `HeaderMenuItem` afin de respecter la structure du menu et de garantir la bonne accessibilité du menu.
|
|
13
|
+
On aura donc une structure de composant comme suit :
|
|
14
|
+
|
|
15
|
+
<Source
|
|
16
|
+
dark
|
|
17
|
+
code={`
|
|
18
|
+
<HeaderMenuBurger>
|
|
19
|
+
<HeaderMenuSection>
|
|
20
|
+
<HeaderMenuItem>
|
|
21
|
+
<HeaderSubMenu>
|
|
22
|
+
<template #title>
|
|
23
|
+
title
|
|
24
|
+
</template>
|
|
25
|
+
<HeaderMenuSection>
|
|
26
|
+
<HeaderMenuItem>
|
|
27
|
+
<a>lien de deuxième niveau</a>
|
|
28
|
+
</HeaderMenuItem>
|
|
29
|
+
</HeaderMenuSection>
|
|
30
|
+
</HeaderSubMenu>
|
|
31
|
+
</HeaderMenuItem>
|
|
32
|
+
</HeaderMenuSection>
|
|
33
|
+
</HeaderMenuBurger>
|
|
34
|
+
`}
|
|
35
|
+
/>
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<Canvas of={HeaderSubMenuStories.Default} />
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
<Controls of={HeaderSubMenuStories.Default} />
|