@cnamts/synapse 0.0.2-alpha → 0.0.3-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/README.md +1 -1
- package/dist/design-system-v3.js +957 -4826
- package/dist/design-system-v3.umd.cjs +1 -2
- package/dist/style.css +1 -1
- package/package.json +29 -29
- package/src/components/Alert/Alert.vue +8 -8
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +2 -2
- package/src/components/HeaderBar/HeaderBar.mdx +137 -0
- package/src/components/HeaderBar/HeaderBar.stories.ts +159 -0
- package/src/components/HeaderBar/HeaderBar.vue +238 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderComplexMenu.stories.ts +272 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderComplexMenu.vue +205 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuItem/HeaderMenuItem.stories.ts +49 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuItem/HeaderMenuItem.vue +51 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuItem/tests/HeaderMenuItem.spec.ts +16 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuItem/tests/__snapshots__/HeaderMenuItem.spec.ts.snap +3 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuSection/HeaderMenuSection.stories.ts +56 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuSection/HeaderMenuSection.vue +51 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderMenuSection/tests/HeaderMenuSection.spec.ts +33 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderSubMenu/HeaderSubMenu.stories.ts +137 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderSubMenu/HeaderSubMenu.vue +180 -0
- package/src/components/HeaderBar/HeaderComplexMenu/HeaderSubMenu/tests/HeaderSubMenu.spec.ts +63 -0
- package/src/components/HeaderBar/HeaderComplexMenu/conts.ts +1 -0
- package/src/components/HeaderBar/HeaderComplexMenu/locals.ts +4 -0
- package/src/components/HeaderBar/HeaderComplexMenu/tests/HeaderComplexMenu.spec.ts +129 -0
- package/src/components/HeaderBar/HeaderComplexMenu/tests/__snapshots__/HeaderComplexMenu.spec.ts.snap +18 -0
- package/src/components/HeaderBar/HeaderComplexMenu/tests/useHandleSubMenus.spec.ts +158 -0
- package/src/components/HeaderBar/HeaderComplexMenu/useHandleSubMenus.ts +49 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +106 -0
- package/src/components/HeaderBar/HeaderLogo/locales.ts +3 -0
- package/src/components/HeaderBar/HeaderLogo/logos/Logo-mobile.vue +117 -0
- package/src/components/HeaderBar/HeaderLogo/logos/Logo.vue +279 -0
- package/src/components/HeaderBar/HeaderLogo/tests/HeaderLogo.spec.ts +71 -0
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +88 -0
- package/src/components/HeaderBar/HeaderMenuBtn/locals.ts +4 -0
- package/src/components/HeaderBar/consts.scss +7 -0
- package/src/components/HeaderBar/consts.ts +2 -0
- package/src/components/HeaderBar/locales.ts +3 -0
- package/src/components/HeaderBar/tests/HeaderBar.spec.ts +210 -0
- package/src/components/HeaderBar/tests/__snapshots__/HeaderBar.spec.ts.snap +50 -0
- package/src/components/HeaderBar/tests/useHeaderResponsiveMode.spec.ts +26 -0
- package/src/components/HeaderBar/tests/useScrollDirection.spec.ts +34 -0
- package/src/components/HeaderBar/useHeaderResponsiveMode.ts +25 -0
- package/src/components/HeaderBar/useScrollDirection.ts +26 -0
- package/src/components/NotificationBar/NotificationBar.vue +5 -7
- package/src/components/PageContainer/PageContainer.vue +0 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
2
|
+
|
|
3
|
+
import HeaderBar from './HeaderBar.vue'
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: 'Components/HeaderBar',
|
|
7
|
+
component: HeaderBar,
|
|
8
|
+
argTypes: {
|
|
9
|
+
'serviceTitle': {
|
|
10
|
+
control: { type: 'text' },
|
|
11
|
+
description: 'Le nom du service tel qu\'il sera affiché a coté du logo.',
|
|
12
|
+
table: {
|
|
13
|
+
type: {
|
|
14
|
+
summary: 'string',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
'serviceSubtitle': {
|
|
19
|
+
control: { type: 'text' },
|
|
20
|
+
description: 'Le sous-titre du service.',
|
|
21
|
+
table: {
|
|
22
|
+
type: {
|
|
23
|
+
summary: 'string',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
'homeAriaLabel': {
|
|
28
|
+
control: { type: 'text' },
|
|
29
|
+
description: 'Le texte de l\'attribut aria-label pour le logo du header.',
|
|
30
|
+
table: {
|
|
31
|
+
type: {
|
|
32
|
+
summary: 'string',
|
|
33
|
+
},
|
|
34
|
+
defaultValue: {
|
|
35
|
+
summary:
|
|
36
|
+
'Logo de l\'Assurance Maladie, cliquez pour revenir à l\'accueil',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
'sticky': {
|
|
41
|
+
control: { type: 'boolean' },
|
|
42
|
+
description:
|
|
43
|
+
'Si le header doit rester collé en haut de la page lors du scroll.',
|
|
44
|
+
table: {
|
|
45
|
+
type: {
|
|
46
|
+
summary: 'boolean',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
'hideWhenDown': {
|
|
51
|
+
control: { type: 'boolean' },
|
|
52
|
+
description:
|
|
53
|
+
'Si le header doit se cacher lors du scroll vers le bas en mode mobile. \n Cette propriété est ignorée en mode desktop. \n Présuppose que le header est en mode sticky.',
|
|
54
|
+
table: {
|
|
55
|
+
type: {
|
|
56
|
+
summary: 'boolean',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
'prepend': {
|
|
61
|
+
control: { type: 'text' },
|
|
62
|
+
table: {
|
|
63
|
+
type: {
|
|
64
|
+
summary: '{ menu-open: boolean }',
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
'append': {
|
|
69
|
+
control: { type: 'text' },
|
|
70
|
+
table: {
|
|
71
|
+
type: {
|
|
72
|
+
summary: '{ menu-open: boolean }',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
'menu': {
|
|
77
|
+
control: { type: 'text' },
|
|
78
|
+
table: {
|
|
79
|
+
type: {
|
|
80
|
+
summary: '{ menu-open: boolean }',
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
'logo': {
|
|
85
|
+
control: { type: 'text' },
|
|
86
|
+
table: {
|
|
87
|
+
type: {
|
|
88
|
+
summary: `{
|
|
89
|
+
menu-open: boolean,
|
|
90
|
+
home-aria-label: string,
|
|
91
|
+
service-title: string,
|
|
92
|
+
service-subtitle: string,
|
|
93
|
+
}`,
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
'header-side': {
|
|
98
|
+
control: { type: 'text' },
|
|
99
|
+
table: {
|
|
100
|
+
type: {
|
|
101
|
+
summary: '{ menu-open: boolean }',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
} satisfies Meta<typeof HeaderBar>
|
|
107
|
+
|
|
108
|
+
export default meta
|
|
109
|
+
|
|
110
|
+
type Story = StoryObj<typeof meta>
|
|
111
|
+
|
|
112
|
+
export const Default: Story = {
|
|
113
|
+
args: {
|
|
114
|
+
serviceTitle: 'Synapse',
|
|
115
|
+
serviceSubtitle: 'Design System',
|
|
116
|
+
},
|
|
117
|
+
decorators: [
|
|
118
|
+
() => ({
|
|
119
|
+
template: `<div class="position: relative"><story/></div>`,
|
|
120
|
+
}),
|
|
121
|
+
],
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export const Sticky: Story = {
|
|
125
|
+
args: {
|
|
126
|
+
serviceTitle: 'Synapse',
|
|
127
|
+
serviceSubtitle: 'Design System',
|
|
128
|
+
},
|
|
129
|
+
decorators: [
|
|
130
|
+
() => ({
|
|
131
|
+
template: `<div class="position: relative">
|
|
132
|
+
<story/>
|
|
133
|
+
<div
|
|
134
|
+
style="height: 200vh; background-color: #f5f5f5; margin: auto; margin-top: 2rem; max-width: 1200px; padding: 1em;"
|
|
135
|
+
>Contenu de la page</div>
|
|
136
|
+
</div>`,
|
|
137
|
+
}),
|
|
138
|
+
],
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export const WithExternalTopMenu: Story = {
|
|
142
|
+
args: {
|
|
143
|
+
serviceTitle: 'Synapse',
|
|
144
|
+
serviceSubtitle: 'Design System',
|
|
145
|
+
},
|
|
146
|
+
decorators: [
|
|
147
|
+
() => ({
|
|
148
|
+
template: `<div class="position: relative">
|
|
149
|
+
<div style="background-color: orange; margin:auto; max-width: 1712px; padding: 1rem 4rem">
|
|
150
|
+
Menu supèrieur externe au composant
|
|
151
|
+
</div>
|
|
152
|
+
<story/>
|
|
153
|
+
<div
|
|
154
|
+
style="height: 200vh; background-color: #f5f5f5; margin: auto; margin-top: 2rem; max-width: 1200px; padding: 1em;"
|
|
155
|
+
>Contenu de la page</div>
|
|
156
|
+
</div>`,
|
|
157
|
+
}),
|
|
158
|
+
],
|
|
159
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, onMounted, onUnmounted, provide, ref, watch, type CSSProperties, type Ref } from 'vue'
|
|
3
|
+
import HeaderLogo from './HeaderLogo/HeaderLogo.vue'
|
|
4
|
+
import { registerHeaderMenuKey } from './consts'
|
|
5
|
+
import { locales } from './locales'
|
|
6
|
+
import useHeaderResponsiveMode from './useHeaderResponsiveMode'
|
|
7
|
+
import useScrollDirection from './useScrollDirection'
|
|
8
|
+
|
|
9
|
+
const menuOpen = ref<boolean>()
|
|
10
|
+
|
|
11
|
+
type SlotProps = {
|
|
12
|
+
menuOpen: boolean | undefined
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type LogoProps = {
|
|
16
|
+
homeAriaLabel?: string
|
|
17
|
+
serviceTitle?: string
|
|
18
|
+
serviceSubtitle?: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
defineSlots<{
|
|
22
|
+
'prepend': (props: SlotProps) => unknown
|
|
23
|
+
'append': (props: SlotProps) => unknown
|
|
24
|
+
'menu': (props: SlotProps) => unknown
|
|
25
|
+
'logo': (props: SlotProps & LogoProps) => unknown
|
|
26
|
+
'header-side': (props: SlotProps) => unknown
|
|
27
|
+
}>()
|
|
28
|
+
|
|
29
|
+
const props = withDefaults(defineProps<{
|
|
30
|
+
/** Keep the header visible */
|
|
31
|
+
sticky?: boolean
|
|
32
|
+
/**
|
|
33
|
+
* Show the header at sticky only when the user scroll up in mobile
|
|
34
|
+
* Need 'sticky' at true,
|
|
35
|
+
*/
|
|
36
|
+
hideWhenDown?: boolean
|
|
37
|
+
} & LogoProps>(),
|
|
38
|
+
{
|
|
39
|
+
sticky: true,
|
|
40
|
+
hideWhenDown: false,
|
|
41
|
+
homeAriaLabel: locales.homeAriaLabel,
|
|
42
|
+
serviceTitle: undefined,
|
|
43
|
+
serviceSubtitle: undefined,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
function registerHeaderMenu(childMenuStatus: Ref<boolean>) {
|
|
47
|
+
watch(childMenuStatus, (newVal) => {
|
|
48
|
+
menuOpen.value = newVal
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
provide(registerHeaderMenuKey, registerHeaderMenu)
|
|
52
|
+
|
|
53
|
+
const header = ref<HTMLElement | null>(null)
|
|
54
|
+
const headerSticky = ref<HTMLElement | null>(null)
|
|
55
|
+
|
|
56
|
+
/** The height of the header to reserve */
|
|
57
|
+
const headerMinHeight = ref('auto')
|
|
58
|
+
/** The position of the header (when static) from the top of the page */
|
|
59
|
+
const headerOffset = ref(0)
|
|
60
|
+
/** Is the top of the header visible in the viewport when static */
|
|
61
|
+
const isTopOfHeaderVisible = ref(true)
|
|
62
|
+
/** Is the header out of the viewport */
|
|
63
|
+
const isScrollBelowHeader = ref(false)
|
|
64
|
+
/** Activate the hide animation */
|
|
65
|
+
const shouldAnimateHideHeader = ref(false)
|
|
66
|
+
|
|
67
|
+
function handleScroll() {
|
|
68
|
+
const headerRec = header.value!.getBoundingClientRect()
|
|
69
|
+
headerOffset.value = headerRec.top + window.scrollY
|
|
70
|
+
headerMinHeight.value = isTopOfHeaderVisible.value ? 'auto' : `${header.value!.offsetHeight}px`
|
|
71
|
+
isTopOfHeaderVisible.value = window.scrollY <= headerOffset.value
|
|
72
|
+
isScrollBelowHeader.value = window.scrollY > headerOffset.value + headerRec.height
|
|
73
|
+
|
|
74
|
+
// activate the header animation with a delay to avoid a flicker effect when the user scroll down
|
|
75
|
+
shouldAnimateHideHeader.value = window.scrollY > headerOffset.value + (headerRec.height * 2)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
onMounted(() => {
|
|
79
|
+
handleScroll()
|
|
80
|
+
window.addEventListener('scroll', handleScroll)
|
|
81
|
+
window.addEventListener('resize', handleScroll)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
onUnmounted(() => {
|
|
85
|
+
window.removeEventListener('scroll', handleScroll)
|
|
86
|
+
window.removeEventListener('resize', handleScroll)
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
const headerStyle = computed<CSSProperties>(() => {
|
|
90
|
+
return {
|
|
91
|
+
minHeight: headerMinHeight.value,
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
const { scrollDirection } = useScrollDirection()
|
|
96
|
+
const { isDesktop } = useHeaderResponsiveMode()
|
|
97
|
+
|
|
98
|
+
const headerStickyStyle = computed<CSSProperties>(() => {
|
|
99
|
+
if (
|
|
100
|
+
props.hideWhenDown
|
|
101
|
+
&& !isDesktop.value
|
|
102
|
+
&& !menuOpen.value
|
|
103
|
+
) {
|
|
104
|
+
const staticHeader = (
|
|
105
|
+
(scrollDirection.value === '' && isTopOfHeaderVisible.value)
|
|
106
|
+
|| (scrollDirection.value === 'bottom' && !isScrollBelowHeader.value)
|
|
107
|
+
|| (scrollDirection.value === 'top' && isTopOfHeaderVisible.value)
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
const hide = (
|
|
111
|
+
scrollDirection.value === 'bottom'
|
|
112
|
+
&& isScrollBelowHeader.value
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
position: staticHeader ? 'relative' : 'fixed',
|
|
117
|
+
top: staticHeader ? 'auto' : '0',
|
|
118
|
+
transform: hide ? 'translateY(-100%)' : 'none',
|
|
119
|
+
transition: shouldAnimateHideHeader.value ? 'transform 0.3s ease' : 'none',
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
position: !isTopOfHeaderVisible.value && props.sticky ? 'fixed' : 'relative',
|
|
125
|
+
top: !isTopOfHeaderVisible.value && props.sticky ? '0' : 'auto',
|
|
126
|
+
transform: 'none',
|
|
127
|
+
transition: 'none',
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<template>
|
|
133
|
+
<header
|
|
134
|
+
ref="header"
|
|
135
|
+
class="header"
|
|
136
|
+
:style="headerStyle"
|
|
137
|
+
>
|
|
138
|
+
<div
|
|
139
|
+
ref="headerSticky"
|
|
140
|
+
class="sticky-header"
|
|
141
|
+
:style="headerStickyStyle"
|
|
142
|
+
>
|
|
143
|
+
<div
|
|
144
|
+
v-if="$slots.prepend"
|
|
145
|
+
class="header-prepend"
|
|
146
|
+
>
|
|
147
|
+
<slot
|
|
148
|
+
name="prepend"
|
|
149
|
+
:menu-open
|
|
150
|
+
/>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="inner-header d-flex">
|
|
153
|
+
<slot
|
|
154
|
+
name="menu"
|
|
155
|
+
:menu-open
|
|
156
|
+
/>
|
|
157
|
+
|
|
158
|
+
<div class="header-logo">
|
|
159
|
+
<slot
|
|
160
|
+
name="logo"
|
|
161
|
+
:menu-open
|
|
162
|
+
:home-aria-label
|
|
163
|
+
:service-title
|
|
164
|
+
:service-subtitle
|
|
165
|
+
>
|
|
166
|
+
<HeaderLogo
|
|
167
|
+
:aria-label="homeAriaLabel"
|
|
168
|
+
:service-title="serviceTitle"
|
|
169
|
+
:service-subtitle="serviceSubtitle"
|
|
170
|
+
/>
|
|
171
|
+
</slot>
|
|
172
|
+
</div>
|
|
173
|
+
<div
|
|
174
|
+
v-if="$slots['header-side']"
|
|
175
|
+
class="header-side"
|
|
176
|
+
>
|
|
177
|
+
<slot
|
|
178
|
+
name="header-side"
|
|
179
|
+
:menu-open
|
|
180
|
+
/>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
<div
|
|
184
|
+
v-if="$slots.append"
|
|
185
|
+
class="header-append"
|
|
186
|
+
>
|
|
187
|
+
<slot
|
|
188
|
+
name="append"
|
|
189
|
+
:menu-open
|
|
190
|
+
/>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
</header>
|
|
194
|
+
</template>
|
|
195
|
+
|
|
196
|
+
<style lang="scss" scoped>
|
|
197
|
+
@use '@/assets/tokens.scss' as *;
|
|
198
|
+
@use './consts' as *;
|
|
199
|
+
|
|
200
|
+
.header {
|
|
201
|
+
top: 0;
|
|
202
|
+
width: 100%;
|
|
203
|
+
height: $header-height;
|
|
204
|
+
max-width: $header-max-width;
|
|
205
|
+
margin: 0 auto;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.sticky-header {
|
|
209
|
+
background-color: $neutral-white;
|
|
210
|
+
border-bottom: solid 1px $blue-lighten-80;
|
|
211
|
+
width: 100%;
|
|
212
|
+
height: $header-height;
|
|
213
|
+
max-width: $header-max-width;
|
|
214
|
+
z-index: 1000;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.inner-header {
|
|
218
|
+
display: flex;
|
|
219
|
+
align-items: center;
|
|
220
|
+
height: 100%;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.header-logo {
|
|
224
|
+
margin-left: 2rem;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.header-side {
|
|
228
|
+
display: flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
margin-left: auto;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@media screen and (min-width: $header-breakpoint) {
|
|
234
|
+
.header, .sticky-header {
|
|
235
|
+
height: $header-height-desktop;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
</style>
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import HeaderMenu from './HeaderComplexMenu.vue'
|
|
2
|
+
import HeaderBar from '../HeaderBar.vue'
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
4
|
+
import HeaderMenuSection from './HeaderMenuSection/HeaderMenuSection.vue'
|
|
5
|
+
import HeaderSubMenu from './HeaderSubMenu/HeaderSubMenu.vue'
|
|
6
|
+
import HeaderMenuItem from './HeaderMenuItem/HeaderMenuItem.vue'
|
|
7
|
+
import { VBtn } from 'vuetify/components'
|
|
8
|
+
import { mdiMapMarker } from '@mdi/js'
|
|
9
|
+
|
|
10
|
+
const meta = {
|
|
11
|
+
title: 'Components/HeaderBar/HeaderComplexMenu',
|
|
12
|
+
component: HeaderMenu,
|
|
13
|
+
parameters: {
|
|
14
|
+
layout: 'fullscreen',
|
|
15
|
+
},
|
|
16
|
+
} satisfies Meta<typeof HeaderMenu>
|
|
17
|
+
|
|
18
|
+
export default meta
|
|
19
|
+
|
|
20
|
+
type Story = StoryObj<typeof meta>
|
|
21
|
+
|
|
22
|
+
export const Default: Story = {
|
|
23
|
+
args: {},
|
|
24
|
+
render: (args) => {
|
|
25
|
+
return {
|
|
26
|
+
components: { HeaderMenu, HeaderBar },
|
|
27
|
+
setup() {
|
|
28
|
+
return { args }
|
|
29
|
+
},
|
|
30
|
+
template: `
|
|
31
|
+
<HeaderBar>
|
|
32
|
+
<template #menu>
|
|
33
|
+
<HeaderMenu>
|
|
34
|
+
<p>lorem ipsum</p>
|
|
35
|
+
</HeaderMenu>
|
|
36
|
+
</template>
|
|
37
|
+
</HeaderBar>
|
|
38
|
+
`,
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const Populated: Story = {
|
|
44
|
+
args: {},
|
|
45
|
+
render: (args) => {
|
|
46
|
+
return {
|
|
47
|
+
components: { HeaderMenuItem, HeaderMenu, HeaderBar, HeaderSubMenu, HeaderMenuSection, VBtn },
|
|
48
|
+
setup() {
|
|
49
|
+
return { args }
|
|
50
|
+
},
|
|
51
|
+
template: `
|
|
52
|
+
<HeaderBar>
|
|
53
|
+
<template #menu>
|
|
54
|
+
<HeaderMenu>
|
|
55
|
+
<HeaderMenuSection title="section 1">
|
|
56
|
+
<HeaderMenuItem>
|
|
57
|
+
<a>Item 1</a>
|
|
58
|
+
</HeaderMenuItem>
|
|
59
|
+
<HeaderMenuItem>
|
|
60
|
+
<a>Item 2</a>
|
|
61
|
+
</HeaderMenuItem>
|
|
62
|
+
<headerMenuItem>
|
|
63
|
+
<HeaderSubMenu>
|
|
64
|
+
<template #title>
|
|
65
|
+
Menu de premier niveau 1
|
|
66
|
+
</template>
|
|
67
|
+
<HeaderMenuSection title="Section">
|
|
68
|
+
<HeaderMenuItem>
|
|
69
|
+
<a>Item</a>
|
|
70
|
+
</HeaderMenuItem>
|
|
71
|
+
<HeaderSubMenu>
|
|
72
|
+
<template #title>
|
|
73
|
+
Menu de deuxième niveau 1
|
|
74
|
+
</template>
|
|
75
|
+
<HeaderMenuItem>
|
|
76
|
+
<a>Item</a>
|
|
77
|
+
</HeaderMenuItem>
|
|
78
|
+
</HeaderSubMenu>
|
|
79
|
+
</HeaderMenuSection>
|
|
80
|
+
</HeaderSubMenu>
|
|
81
|
+
</headerMenuItem>
|
|
82
|
+
</HeaderMenuSection>
|
|
83
|
+
<HeaderMenuSection title="section 2">
|
|
84
|
+
<headerMenuItem>
|
|
85
|
+
<HeaderSubMenu>
|
|
86
|
+
<template #title>
|
|
87
|
+
Menu de premier niveau 2
|
|
88
|
+
</template>
|
|
89
|
+
<HeaderMenuItem>
|
|
90
|
+
<a>Item 1</a>
|
|
91
|
+
</HeaderMenuItem>
|
|
92
|
+
<HeaderMenuItem>
|
|
93
|
+
<HeaderSubMenu>
|
|
94
|
+
<template #title>
|
|
95
|
+
Menu de deuxième niveau 2
|
|
96
|
+
</template>
|
|
97
|
+
<HeaderMenuItem>
|
|
98
|
+
<a>Item 1</a>
|
|
99
|
+
</HeaderMenuItem>
|
|
100
|
+
</HeaderSubMenu>
|
|
101
|
+
</HeaderMenuItem>
|
|
102
|
+
<HeaderMenuItem>
|
|
103
|
+
<HeaderSubMenu>
|
|
104
|
+
<template #title>
|
|
105
|
+
Menu de deuxième niveau 3
|
|
106
|
+
</template>
|
|
107
|
+
<HeaderMenuSection title="section 1">
|
|
108
|
+
<HeaderMenuItem>
|
|
109
|
+
<a>Item 1</a>
|
|
110
|
+
</HeaderMenuItem>
|
|
111
|
+
</HeaderMenuSection>
|
|
112
|
+
</HeaderSubMenu>
|
|
113
|
+
</HeaderMenuItem>
|
|
114
|
+
</HeaderSubMenu>
|
|
115
|
+
</headerMenuItem>
|
|
116
|
+
<HeaderMenuItem>
|
|
117
|
+
<a>Item 3</a>
|
|
118
|
+
</HeaderMenuItem>
|
|
119
|
+
</HeaderMenuSection>
|
|
120
|
+
<div class="pa-4">
|
|
121
|
+
<p class="font-weight-bold">Veillez vous connecter</p>
|
|
122
|
+
<VBtn variant="tonal" class="mt-4 font-weight-medium" color="primary">Je me connecte</VBtn>
|
|
123
|
+
</div>
|
|
124
|
+
</HeaderMenu>
|
|
125
|
+
</template>
|
|
126
|
+
</HeaderBar>
|
|
127
|
+
`,
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const Generated: Story = {
|
|
133
|
+
args: {
|
|
134
|
+
},
|
|
135
|
+
render: (args) => {
|
|
136
|
+
return {
|
|
137
|
+
components: { HeaderMenu, HeaderBar, HeaderMenuSection, HeaderSubMenu, HeaderMenuItem },
|
|
138
|
+
setup() {
|
|
139
|
+
const menu = [
|
|
140
|
+
{
|
|
141
|
+
title: 'Vous informer',
|
|
142
|
+
items: [
|
|
143
|
+
{ title: 'Actualités', href: 'https://www.ameli.fr/assure/actualites' },
|
|
144
|
+
{
|
|
145
|
+
subMenuTitle: 'Droits et démarches',
|
|
146
|
+
subMenuSubtitle: 'selon votre situation',
|
|
147
|
+
sections: [
|
|
148
|
+
{
|
|
149
|
+
title: undefined,
|
|
150
|
+
items: [
|
|
151
|
+
{ title: 'Les essentiels de l’assuré', href: 'https://www.ameli.fr/assure/droits-demarches/principes' },
|
|
152
|
+
{ title: 'Parentalité, couple', href: 'https://www.ameli.fr/assure/droits-demarches/famille' },
|
|
153
|
+
{ title: 'Fin de vie, deuil', href: 'https://www.ameli.fr/assure/droits-demarches/fin-de-vie-deuil' },
|
|
154
|
+
{ title: 'Etudes et stages', href: 'https://www.ameli.fr/assure/droits-demarches/etudes-stages' },
|
|
155
|
+
{ title: 'Vie professionnelle, retraite', href: 'https://www.ameli.fr/assure/droits-demarches/vie-professionnelle-retraite' },
|
|
156
|
+
{ title: 'Difficultés d\'accès aux droits et aux soins', href: 'https://www.ameli.fr/assure/droits-demarches/difficultes-acces-droits-soins' },
|
|
157
|
+
{ title: 'Maladie, accident, hospitalisation', href: 'https://www.ameli.fr/assure/droits-demarches/maladie-accident-hospitalisation' },
|
|
158
|
+
{ title: 'invalidité, handicap', href: 'https://www.ameli.fr/assure/droits-demarches/invalidite-handicap' },
|
|
159
|
+
{ title: 'situations particumlières', href: 'https://www.ameli.fr/assure/droits-demarches/situations-particulieres' },
|
|
160
|
+
{ title: 'réclamation, médiation, recours', href: 'https://www.ameli.fr/assure/droits-demarches/reclamation-mediation-voies-de-recours' },
|
|
161
|
+
{ title: 'Europe, international', href: 'https://www.ameli.fr/assure/droits-demarches/europe-international' },
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
subMenuTitle: 'Remboursements',
|
|
168
|
+
subMenuSubtitle: 'prestations et aides',
|
|
169
|
+
sections: [
|
|
170
|
+
{
|
|
171
|
+
title: undefined,
|
|
172
|
+
items: [
|
|
173
|
+
{ title: 'Ce qui est remboursé', href: 'https://www.ameli.fr/assure/remboursements/rembourse' },
|
|
174
|
+
{ title: 'ce qui reste à votre charge', href: 'https://www.ameli.fr/assure/remboursements/reste-charge' },
|
|
175
|
+
{ title: 'Être bien remboursé', href: 'https://www.ameli.fr/assure/remboursements/etre-bien-rembourse' },
|
|
176
|
+
{ title: 'Indemnités journalières maladie, maternité, paternité', href: 'https://www.ameli.fr/assure/remboursements/indemnites-journalieres-maladie-maternite-paternite' },
|
|
177
|
+
{ title: 'Accident du travail : prise en charge et indemnités journalières', href: 'https://www.ameli.fr/assure/remboursements/accident-travail' },
|
|
178
|
+
{ title: 'Maladie professionnelle : prise en charge et indemnités journalières', href: 'https://www.ameli.fr/assure/remboursements/maladie-professionnelle' },
|
|
179
|
+
{ title: 'Pensions, allocations et rentes', href: 'https://www.ameli.fr/assure/remboursements/pensions-allocations-rentes' },
|
|
180
|
+
{ title: 'Incapacité permanente', href: 'https://www.ameli.fr/assure/remboursements/incapacite-permanente' },
|
|
181
|
+
{ title: 'Complémentaire santé solidaire : vous n\'avez rien à payer dans la plupart des cas ', href: 'https://www.ameli.fr/assure/remboursements/cmu-aides-financieres/complementaire-sante-solidaire' },
|
|
182
|
+
{ title: 'Aide médicale de l\'État et soins urgents', href: 'https://www.ameli.fr/assure/remboursements/aide-medicale-etat-soins-urgents' },
|
|
183
|
+
{ title: 'Compte ameli, mode d\'emploi', href: 'https://www.ameli.fr/assure/remboursements/suivre-remboursements' },
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
subMenuTitle: 'Maladies et prévention',
|
|
190
|
+
sections: [
|
|
191
|
+
{
|
|
192
|
+
title: undefined,
|
|
193
|
+
items: [
|
|
194
|
+
{ title: 'Tous les thèmes de santé', href: 'https://www.ameli.fr/assure/sante/themes' },
|
|
195
|
+
{ title: 'L\'Assurance Maladie vous accompagne', href: 'https://www.ameli.fr/assure/remboursements/reste-charge' },
|
|
196
|
+
{ title: 'Mon espace santé', href: 'https://www.ameli.fr/assure/sante/mon-espace-sante' },
|
|
197
|
+
{ title: 'Mon bilan prévention', href: 'https://www.ameli.fr/assure/sante/mon-bilan-prevention' },
|
|
198
|
+
{ title: 'Réagir en cas \'urgence ', href: 'https://www.ameli.fr/assure/sante/urgence' },
|
|
199
|
+
{ title: 'Accomplir les bons gestes ', href: 'https://www.ameli.fr/assure/sante/bons-gestes' },
|
|
200
|
+
{ title: 'Médicaments et vaccins', href: 'https://www.ameli.fr/assure/sante/medicaments' },
|
|
201
|
+
{ title: 'Déroulement d\'un examen', href: 'https://www.ameli.fr/assure/sante/examen' },
|
|
202
|
+
{ title: 'Certificat médical : dans quels cas et pour qui est-il obligatoire ?', href: 'https://www.ameli.fr/assure/sante/certificat-medical-quand-et-pour-qui' },
|
|
203
|
+
{ title: 'Devenir parent', href: 'https://www.ameli.fr/assure/sante/devenir-parent' },
|
|
204
|
+
{ title: 'Enfants', href: 'https://www.ameli.fr/assure/sante/enfants' },
|
|
205
|
+
{ title: 'Jeunes 16-25 ans', href: 'https://www.ameli.fr/assure/sante/jeunes-16-25-ans' },
|
|
206
|
+
{ title: 'Seniors', href: 'https://www.ameli.fr/assure/sante/seniors' },
|
|
207
|
+
{ title: 'Télésanté, la santé à distance', href: 'https://www.ameli.fr/assure/sante/telesante' },
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
title: 'Besoin d\'aide',
|
|
216
|
+
items: [
|
|
217
|
+
{
|
|
218
|
+
title: 'Contacter l\'Assurance Maladie',
|
|
219
|
+
subtitle: 'obtenir une attestation, envoyer une feuille de soins, contacter sa caisse, etc.',
|
|
220
|
+
href: 'https://www.ameli.fr/assure/adresses-contacts',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
title: 'Trouver un professionnel de santé',
|
|
224
|
+
subtitle: 'médecins, infirmiers...',
|
|
225
|
+
href: 'https://www.ameli.fr/assure/adresses-contacts' },
|
|
226
|
+
{ title: 'Télécharger un formulaire (ex: cerfa)', href: 'https://www.ameli.fr/assure/droits-demarches/formulaires' },
|
|
227
|
+
{ title: 'Consulter le forum', href: 'https://forum-assures.ameli.fr/' },
|
|
228
|
+
{ title: 'Sourds et malentendants', href: 'https://elioz.fr/elioz-connect/annuaire/assurance-maladie-annuaire/' },
|
|
229
|
+
],
|
|
230
|
+
},
|
|
231
|
+
]
|
|
232
|
+
return { args, menu, marker: mdiMapMarker }
|
|
233
|
+
},
|
|
234
|
+
template: `
|
|
235
|
+
<HeaderBar>
|
|
236
|
+
<template #menu>
|
|
237
|
+
<HeaderMenu>
|
|
238
|
+
<HeaderMenuSection v-for="section in menu" :key="section.title" :title="section.title">
|
|
239
|
+
<HeaderMenuItem v-for="item in section.items" :key="item.title">
|
|
240
|
+
<HeaderSubMenu v-if="item.subMenuTitle">
|
|
241
|
+
<template #title>
|
|
242
|
+
{{ item.subMenuTitle }}
|
|
243
|
+
<em v-if="item.subMenuSubtitle" style="font-style: normal; color: #757777;">{{ item.subMenuSubtitle }}</em>
|
|
244
|
+
</template>
|
|
245
|
+
<HeaderMenuSection v-for="subSection in item.sections" :key="subSection.title" :title="subSection.title">
|
|
246
|
+
<HeaderMenuItem v-for="subItem in subSection.items" :key="subItem.title">
|
|
247
|
+
<a :href="subItem.href">{{ subItem.title }}</a>
|
|
248
|
+
</HeaderMenuItem>
|
|
249
|
+
</HeaderMenuSection>
|
|
250
|
+
</HeaderSubMenu>
|
|
251
|
+
<a v-else :href="item.href">
|
|
252
|
+
{{ item.title }}
|
|
253
|
+
<em v-if="item.subtitle" style="font-style: normal; color: #757777;">{{ item.subtitle }}</em>
|
|
254
|
+
</a>
|
|
255
|
+
</HeaderMenuItem>
|
|
256
|
+
</HeaderMenuSection>
|
|
257
|
+
<h2 class="border-b-sm mb-2" style="font-size: 1.1rem; padding: 40px 16px 8px 20px;">Votre caisse</h2>
|
|
258
|
+
<div style="padding: 16px 50px 16px 20px;">
|
|
259
|
+
<div class="d-flex align-center ga-2 font-weight-bold">
|
|
260
|
+
<VIcon aria-label="Localisation" role="img" aria-hidden="false" color="primary">{{marker}}</VIcon>
|
|
261
|
+
<p>Vous n'avez pas sélectionné votre caisse</p>
|
|
262
|
+
</div>
|
|
263
|
+
<VBtn class="mt-3 mb-4 font-weight-bold text-capitalize" base-color="primary" density="comfortable" flat height="37">Sélectionner</VBtn>
|
|
264
|
+
<p class="mb-8">Les pages d'ameli seront alors enrichies des informations locales de votre caisse (contacts, événements régionaux, etc.) </p>
|
|
265
|
+
</div>
|
|
266
|
+
</HeaderMenu>
|
|
267
|
+
</template>
|
|
268
|
+
</HeaderBar>
|
|
269
|
+
`,
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
}
|