@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.
Files changed (185) hide show
  1. package/dist/design-system-v3.d.ts +712 -27
  2. package/dist/design-system-v3.js +2715 -1485
  3. package/dist/design-system-v3.umd.cjs +10 -1
  4. package/dist/style.css +1 -1
  5. package/package.json +5 -2
  6. package/src/components/Alert/Alert.mdx +1 -1
  7. package/src/components/Alert/Alert.stories.ts +91 -1
  8. package/src/components/BackBtn/BackBtn.mdx +1 -1
  9. package/src/components/BackBtn/BackBtn.stories.ts +84 -1
  10. package/src/components/BackToTopBtn/BackToTopBtn.mdx +3 -3
  11. package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +172 -11
  12. package/src/components/CollapsibleList/CollapsibleList.mdx +2 -2
  13. package/src/components/CollapsibleList/CollapsibleList.stories.ts +37 -1
  14. package/src/components/CopyBtn/CopyBtn.mdx +1 -1
  15. package/src/components/CopyBtn/CopyBtn.stories.ts +120 -1
  16. package/src/components/CopyBtn/CopyBtn.vue +1 -1
  17. package/src/components/Customs/CustomInputSelect/CustomInputSelect.mdx +6 -8
  18. package/src/components/Customs/CustomInputSelect/CustomInputSelect.stories.ts +270 -4
  19. package/src/components/Customs/CustomInputSelect/CustomInputSelect.vue +80 -53
  20. package/src/components/Customs/CustomInputSelect/config.ts +10 -0
  21. package/src/components/Customs/CustomSelect/CustomSelect.mdx +3 -3
  22. package/src/components/Customs/CustomSelect/CustomSelect.stories.ts +158 -2
  23. package/src/components/Customs/CustomSelect/CustomSelect.vue +25 -6
  24. package/src/components/Customs/CustomTextField/CustomTextField.mdx +44 -0
  25. package/src/components/Customs/CustomTextField/CustomTextField.stories.ts +403 -0
  26. package/src/components/Customs/CustomTextField/CustomTextField.vue +110 -0
  27. package/src/components/Customs/CustomTextField/tests/CustomTextField.spec.ts +93 -0
  28. package/src/components/Customs/CustomTextField/tests/__snapshots__/CustomTextField.spec.ts.snap +59 -0
  29. package/src/components/Customs/CustomTextField/types.d.ts +3 -0
  30. package/src/components/DataList/DataList.mdx +77 -0
  31. package/src/components/DataList/DataList.stories.ts +960 -0
  32. package/src/components/DataList/DataList.vue +140 -0
  33. package/src/components/DataList/DataListLoading/DataListLoading.vue +56 -0
  34. package/src/components/DataList/DataListLoading/tests/DataListLoading.spec.ts +23 -0
  35. package/src/components/DataList/locales.ts +3 -0
  36. package/src/components/DataList/tests/DataList.spec.ts +194 -0
  37. package/src/components/DataList/types.d.ts +23 -0
  38. package/src/components/DataListGroup/DataListGroup.mdx +77 -0
  39. package/src/components/DataListGroup/DataListGroup.stories.ts +987 -0
  40. package/src/components/DataListGroup/DataListGroup.vue +59 -0
  41. package/src/components/DataListGroup/tests/DataListGroup.spec.ts +54 -0
  42. package/src/components/DataListGroup/tests/data/dataListGroupItems.ts +41 -0
  43. package/src/components/DataListGroup/types.d.ts +15 -0
  44. package/src/components/DataListItem/DataListItem.vue +135 -0
  45. package/src/components/DataListItem/config.ts +17 -0
  46. package/src/components/DataListItem/locales.ts +3 -0
  47. package/src/components/DataListItem/tests/DataListItem.spec.ts +156 -0
  48. package/src/components/DataListItem/types.d.ts +23 -0
  49. package/src/components/DownloadBtn/Accessibilite.mdx +14 -0
  50. package/src/components/DownloadBtn/Accessibilite.stories.ts +166 -0
  51. package/src/components/DownloadBtn/AccessibiliteItems.ts +129 -0
  52. package/src/components/DownloadBtn/DownloadBtn.mdx +5 -6
  53. package/src/components/DownloadBtn/DownloadBtn.stories.ts +207 -2
  54. package/src/components/DownloadBtn/constants/ExpertiseLevelEnum.ts +4 -0
  55. package/src/components/FooterBar/FooterBar.mdx +2 -2
  56. package/src/components/FooterBar/FooterBar.stories.ts +1 -1
  57. package/src/components/FranceConnectBtn/FranceConnectBtn.mdx +1 -1
  58. package/src/components/FranceConnectBtn/FranceConnectBtn.stories.ts +58 -1
  59. package/src/components/HeaderBar/HeaderBar.mdx +164 -45
  60. package/src/components/HeaderBar/HeaderBar.stories.ts +559 -15
  61. package/src/components/HeaderBar/HeaderBar.vue +60 -22
  62. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.mdx +433 -0
  63. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.stories.ts +1089 -0
  64. package/src/components/HeaderBar/{HeaderComplexMenu/HeaderComplexMenu.vue → HeaderBurgerMenu/HeaderBurgerMenu.vue} +74 -45
  65. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.mdx +38 -0
  66. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.stories.ts +89 -0
  67. package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuItem/tests/__snapshots__/HeaderMenuItem.spec.ts.snap +1 -1
  68. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.mdx +17 -0
  69. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.stories.ts +121 -0
  70. package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuSection/HeaderMenuSection.vue +2 -2
  71. package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuSection/tests/HeaderMenuSection.spec.ts +1 -3
  72. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.mdx +43 -0
  73. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.stories.ts +261 -0
  74. package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderSubMenu/HeaderSubMenu.vue +17 -3
  75. package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderSubMenu/tests/HeaderSubMenu.spec.ts +1 -1
  76. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.spec.ts +180 -0
  77. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/HeaderBurgerMenu.spec.ts.snap +13 -0
  78. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/HeaderComplexMenu.spec.ts.snap +13 -0
  79. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +62 -25
  80. package/src/components/HeaderBar/HeaderLogo/tests/HeaderLogo.spec.ts +49 -1
  81. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +19 -23
  82. package/src/components/HeaderBar/HeaderMenuBtn/tests/HeaderMenuBtn.spec.ts +70 -0
  83. package/src/components/HeaderBar/Usages.mdx +85 -0
  84. package/src/components/HeaderBar/consts.scss +0 -1
  85. package/src/components/HeaderBar/tests/HeaderBar.spec.ts +8 -2
  86. package/src/components/HeaderBar/tests/__snapshots__/HeaderBar.spec.ts.snap +5 -10
  87. package/src/components/HeaderLoading/HeaderLoading.mdx +28 -0
  88. package/src/components/HeaderLoading/HeaderLoading.stories.ts +62 -0
  89. package/src/components/HeaderLoading/HeaderLoading.vue +45 -0
  90. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +22 -0
  91. package/src/components/HeaderNavigationBar/HeaderNavigationBar.mdx +128 -0
  92. package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +784 -0
  93. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +194 -0
  94. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +74 -0
  95. package/src/components/HeaderNavigationBar/HorizontalNavbar/config.ts +18 -0
  96. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +127 -0
  97. package/src/components/HeaderNavigationBar/types.ts +7 -0
  98. package/src/components/HeaderToolbar/HeaderToolbar.mdx +31 -0
  99. package/src/components/HeaderToolbar/HeaderToolbar.stories.ts +343 -0
  100. package/src/components/HeaderToolbar/HeaderToolbar.vue +487 -0
  101. package/src/components/HeaderToolbar/tests/HeaderToolbar.spec.ts +196 -0
  102. package/src/components/HeaderToolbar/types.d.ts +20 -0
  103. package/src/components/LangBtn/LangBtn.mdx +1 -1
  104. package/src/components/LangBtn/LangBtn.stories.ts +125 -8
  105. package/src/components/Logo/Logo.mdx +2 -2
  106. package/src/components/Logo/Logo.stories.ts +147 -1
  107. package/src/components/LogoBrandSection/LogoBrandSection.mdx +14 -0
  108. package/src/components/LogoBrandSection/LogoBrandSection.stories.ts +158 -0
  109. package/src/components/LogoBrandSection/LogoBrandSection.vue +312 -0
  110. package/src/components/LogoBrandSection/assets/ameli-pro.svg +1 -0
  111. package/src/components/LogoBrandSection/assets/ameli.svg +1 -0
  112. package/src/components/LogoBrandSection/assets/cnam.svg +1 -0
  113. package/src/components/LogoBrandSection/assets/compte-ameli.svg +1 -0
  114. package/src/components/LogoBrandSection/dividerDimensionsMapping.ts +14 -0
  115. package/src/components/LogoBrandSection/locales.ts +14 -0
  116. package/src/components/LogoBrandSection/secondaryLogoMapping.ts +24 -0
  117. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +365 -0
  118. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +14 -0
  119. package/src/components/LogoBrandSection/types.ts +8 -0
  120. package/src/components/NotificationBar/NotificationBar.mdx +6 -6
  121. package/src/components/NotificationBar/NotificationBar.stories.ts +1 -1
  122. package/src/components/NotificationBar/NotificationBar.vue +2 -2
  123. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +1 -1
  124. package/src/components/PageContainer/PageContainer.mdx +1 -1
  125. package/src/components/PageContainer/PageContainer.stories.ts +86 -1
  126. package/src/components/PhoneField/PhoneField.mdx +49 -0
  127. package/src/components/PhoneField/PhoneField.stories.ts +869 -0
  128. package/src/components/PhoneField/PhoneField.vue +230 -0
  129. package/src/components/PhoneField/indicatifs.ts +104 -0
  130. package/src/components/PhoneField/locales.ts +4 -0
  131. package/src/components/PhoneField/tests/PhoneField.spec.ts +179 -0
  132. package/src/components/SkipLink/SkipLink.stories.ts +50 -1
  133. package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +28 -1
  134. package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +37 -1
  135. package/src/components/SubHeader/SubHeader.mdx +31 -0
  136. package/src/components/SubHeader/SubHeader.stories.ts +1032 -0
  137. package/src/components/SubHeader/SubHeader.vue +185 -0
  138. package/src/components/SubHeader/config.ts +12 -0
  139. package/src/components/SubHeader/locales.ts +3 -0
  140. package/src/components/SubHeader/tests/SubHeader.spec.ts +144 -0
  141. package/src/components/index.ts +24 -7
  142. package/src/composables/widthable/index.ts +29 -0
  143. package/src/composables/widthable/tests/widthable.spec.ts +52 -0
  144. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +2 -2
  145. package/src/main.ts +1 -0
  146. package/src/modules.d.ts +4 -0
  147. package/src/services/index.ts +1 -0
  148. package/src/stories/Demarrer/Accueil.mdx +10 -0
  149. package/src/stories/Demarrer/Accueil.stories.ts +76 -0
  150. package/src/stories/Demarrer/PolitiqueDeConfidentialite.mdx +9 -0
  151. package/src/stories/Demarrer/PolitiqueDeConfidentialite.stories.ts +20 -0
  152. package/src/stories/Fondamentaux/Accessibilite/Accessibilite.mdx +1 -2
  153. package/src/stories/Fondamentaux/Accessibilite/Accessibilite.stories.ts +1 -1
  154. package/src/stories/Fondamentaux/EcoConception/Econception.stories.ts +1 -1
  155. package/src/stories/GuideDuDev/moduleDeNotification.mdx +52 -48
  156. package/src/stories/GuideDuDev/vuetifyOptions.mdx +31 -28
  157. package/src/stories/Guidelines/CustomisationEtThemes.mdx +1 -1
  158. package/src/utils/functions/throttleDisplayFn/tests/throttleDisplayFn.spec.ts +47 -0
  159. package/src/utils/functions/throttleDisplayFn/throttleDisplayFn.ts +26 -0
  160. package/src/utils/rules/exactLength/index.ts +33 -0
  161. package/src/utils/rules/exactLength/locales.ts +6 -0
  162. package/src/utils/rules/required/index.ts +25 -0
  163. package/src/utils/rules/required/locales.ts +5 -0
  164. package/src/utils/rules/required/ruleMessageHelper.ts +14 -0
  165. package/src/utils/rules/required/tests/index.spec.ts +47 -0
  166. package/src/utils/rules/required/tests/rulesMessageHelper.spec.ts +22 -0
  167. package/src/utils/rules/types.d.ts +15 -0
  168. package/src/components/Beta/beta.mdx +0 -5
  169. package/src/components/Deprecated/deprecated.mdx +0 -5
  170. package/src/components/HeaderBar/HeaderComplexMenu/HeaderComplexMenu.stories.ts +0 -272
  171. package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuItem/HeaderMenuItem.stories.ts +0 -49
  172. package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuSection/HeaderMenuSection.stories.ts +0 -56
  173. package/src/components/HeaderBar/HeaderComplexMenu/HeaderSubMenu/HeaderSubMenu.stories.ts +0 -137
  174. package/src/components/HeaderBar/HeaderComplexMenu/tests/HeaderComplexMenu.spec.ts +0 -129
  175. package/src/components/HeaderBar/HeaderComplexMenu/tests/__snapshots__/HeaderComplexMenu.spec.ts.snap +0 -18
  176. package/src/stories/Home/Accueil.mdx +0 -7
  177. package/src/stories/Home/PolitiqueDeConfidentialite.mdx +0 -4
  178. package/src/stories/Home/synapse.webp +0 -0
  179. /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuItem/HeaderMenuItem.vue +0 -0
  180. /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/HeaderMenuItem/tests/HeaderMenuItem.spec.ts +0 -0
  181. /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/conts.ts +0 -0
  182. /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/locals.ts +0 -0
  183. /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/tests/useHandleSubMenus.spec.ts +0 -0
  184. /package/src/components/HeaderBar/{HeaderComplexMenu → HeaderBurgerMenu}/useHandleSubMenus.ts +0 -0
  185. /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 menuWrapper = ref<HTMLElement | null>(null)
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
- // todo debounce
17
- menuLeft.value = menuBtnWrapper.value!.getBoundingClientRect().left
18
- menuTop.value = menuBtnWrapper.value!.getBoundingClientRect().top
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
- window.addEventListener('scroll', positionMenu)
24
- window.addEventListener('resize', positionMenu)
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', positionMenu)
30
- window.removeEventListener('resize', positionMenu)
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 = ref(false)
48
+ const menuOpen = defineModel<boolean>({
49
+ default: false,
50
+ })
35
51
 
36
52
  watch(menuOpen, async (newVal) => {
37
- document.documentElement.style.overflow = newVal ? 'hidden' : 'auto'
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!.focus()
59
+ innerBtn.value?.focus()
43
60
  }
44
61
  else {
45
- outerBtn.value!.focus()
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 === menuWrapper.value) return
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
- <Transition name="menu">
85
- <div
86
- v-show="menuOpen"
87
- class="overlay"
88
- >
111
+ <Teleport to="body">
112
+ <Transition name="menu">
89
113
  <div
90
- ref="menuWrapper"
91
- role="menu"
92
- class="menu-wrapper"
93
- :style="menuStyle"
114
+ v-if="menuOpen"
115
+ class="overlay"
94
116
  >
95
- <HeaderMenuBtn
96
- ref="innerBtn"
97
- v-model="menuOpen"
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
- <div class="header-menu">
109
- <slot />
110
- </div>
111
- </nav>
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
- </div>
114
- </Transition>
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: $menu-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-8ba695ac="" class="header-menu-item"><a>Test</a></li>"`;
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
+
@@ -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
+ }
@@ -13,11 +13,11 @@
13
13
  <template>
14
14
  <div class="header-menu-section">
15
15
  <div
16
- v-if="title"
16
+ v-if="$slots.title"
17
17
  :id="titleId"
18
18
  class="header-menu-section-title"
19
19
  >
20
- {{ title }}
20
+ <slot name="title" />
21
21
  </div>
22
22
  <ul
23
23
  :id="groupId"
@@ -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} />