import FooterBar from '../FooterBar/FooterBar.vue'
import Logo from '../Logo/Logo.vue'
import CollapsibleList from '../CollapsibleList/CollapsibleList.vue'
import type { Meta, StoryObj } from '@storybook/vue3'
import { fn } from '@storybook/test'
import { mdiLinkedin, mdiFacebook, mdiYoutube } from '@mdi/js'
import imgUrl from '@/assets/amelipro/img/cartouche_nouveauTEL.svg'
import ameliProLogo from '@/assets/amelipro/img/logo-amelipro.svg'
import { useTheme } from 'vuetify'
import { addons } from '@storybook/manager-api'
const xIcon = 'M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z'
const items = [
{
text: 'Plan du site',
href: 'javascript:void(0)',
theme: 'cnam',
},
{
text: 'Aide et configuration',
href: 'javascript:void(0)',
theme: 'ap',
},
{
text: 'Conditions générales d\'utilisation',
href: 'javascript:void(0)',
},
{
text: 'Gestion des cookies',
href: 'javascript:void(0)',
theme: 'cnam',
},
{
text: 'Mentions légales',
href: 'javascript:void(0)',
},
]
const remboursementItems = [
{
text: 'Ce qui est remboursé',
href: 'https://www.ameli.fr/assure/remboursements/rembourse',
},
{
text: 'Ce qui reste à votre charge',
href: 'https://www.ameli.fr/assure/remboursements/reste-charge',
},
{
text: 'Être bien remboursé',
href: 'https://www.ameli.fr/assure/remboursements/etre-bien-rembourse',
},
]
const healthItems = [
{
text: 'Mon espace santé',
href: 'https://www.ameli.fr/assure/sante/mon-espace-sante',
},
{
text: 'Accomplir les bons gestes',
href: 'https://www.ameli.fr/assure/sante/bons-gestes',
},
{
text: 'Réagir en cas d’urgence',
href: 'https://www.ameli.fr/assure/sante/urgence',
},
{
text: 'Télésanté',
href: 'https://www.ameli.fr/assure/sante/telesante',
},
]
const currentYear = new Date().getFullYear()
const meta = {
title: 'Composants/Structure/FooterBar',
component: FooterBar,
decorators: [
(story, context) => ({
setup() {
const theme = useTheme()
theme.global.name.value = context.globals.theme
return story()
},
components: { story },
template: '',
}),
],
parameters: {
layout: 'fullscreen',
controls: { exclude: ['logoSize', 'onEvent'] },
actions: {
handles: ['event'],
},
},
argTypes: {
a11yCompliance: {
options: ['non-compliant', 'partially-compliant', 'fully-compliant'],
control: { type: 'select' },
default: 'fully-compliant',
description: 'Le niveau de conformité aux règles d’accessibilité de l’application.\n Cette mention est obligatoire, voir la documentation du RGAA.',
},
linkItems: {
control: {
type: 'object',
},
description: 'Les liens de navigation à afficher dans le pied de page.',
},
hideSitemapLink: {
control: {
type: 'boolean',
},
description: 'Masque le lien vers le Plan du site.',
},
hideHelpLink: {
control: {
type: 'boolean',
},
if: { global: 'theme', eq: 'ap' },
description: 'Masque le lien vers aide et configuation.',
},
hideCguLink: {
control: {
type: 'boolean',
},
description: 'Masque le lien vers les Conditions générales d’utilisation.',
},
hideCookiesLink: {
control: {
type: 'boolean',
},
description: 'Masque le lien vers la Gestion des cookies.',
},
hideLegalNoticeLink: {
control: {
type: 'boolean',
},
description: 'Masque le lien vers les Mentions légales.',
},
hideA11yLink: {
control: {
type: 'boolean',
},
description: 'Masque le lien vers la Déclaration d’accessibilité.',
},
hideLogo: {
control: {
type: 'boolean',
},
description: 'Masque le logo.',
},
hideSocialMediaLinks: {
control: {
type: 'boolean',
},
description: 'Masque la liste des réseaux sociaux.',
},
version: {
control: {
type: 'text',
},
description: 'Le numéro de version de l’application.',
},
socialMediaLinks: {
control: {
type: 'object',
},
description: 'Personnalisation de la liste des réseaux sociaux.',
},
light: {
control: {
type: 'boolean',
},
description: 'Use the light theme for the footer.',
},
backOffice: {
control: {
type: 'boolean',
},
if: { global: 'theme', eq: 'ap' },
description: 'Affichage du footer pour le back office.',
},
backOfficeText: {
control: {
type: 'text',
},
if: { global: 'theme', eq: 'ap' },
description: 'Nom du service en back office à afficher dans le footer.',
},
sitemapRoute: {
control: {
type: 'text',
},
description: 'La valeur de la prop `to` du lien vers le Plan du site.',
},
helpRoute: {
control: {
type: 'text',
},
if: { global: 'theme', eq: 'ap' },
description: 'La valeur de la prop `to` du lien vers aide et configuration.',
},
cguRoute: {
control: {
type: 'text',
},
description: 'La valeur de la prop `to` du lien vers les Conditions générales d’utilisation.',
},
cookiesRoute: {
control: {
type: 'text',
},
description: 'La valeur de la prop `to` du lien vers la Gestion des cookies..',
},
legalNoticeRoute: {
control: {
type: 'text',
},
description: 'La valeur de la prop `to` du lien vers les Mentions légales.',
},
a11yStatementRoute: {
control: {
type: 'text',
},
description: 'La valeur de la prop `to` du lien vers la Déclaration d’accessibilité.',
},
default: {
control: {
type: 'text',
},
description: 'Slot pour ajouter du contenu dans la partie centrale du pied de page.',
},
prepend: {
control: {
type: 'text',
},
description: 'Slot pour ajouter du contenu avant les liens du pied de page.',
},
append: {
control: {
type: 'text',
},
description: 'Slot pour ajouter du contenu après les liens du pied de page.',
},
logo: {
control: {
type: 'text',
},
description: 'Slot pour remplacer le logo.',
},
},
} satisfies Meta
export default meta
type Story = StoryObj
export const Default: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { exclude: ['logoSize', 'items', 'onEvent'] },
},
args: {
a11yCompliance: 'non-compliant',
items: items,
hideSitemapLink: false,
hideHelpLink: false,
hideCguLink: false,
hideCookiesLink: false,
hideLegalNoticeLink: false,
hideA11yLink: false,
hideLogo: false,
hideSocialMediaLinks: false,
backOffice: false,
backOfficeText: 'Ameli Pro Back Office',
socialMediaLinks: [
{
icon: mdiFacebook,
name: 'Facebook',
href: 'https://www.facebook.com',
},
{
icon: xIcon,
name: 'X',
href: 'https://x.com',
},
{
icon: mdiLinkedin,
name: 'LinkedIn',
href: 'https://www.linkedin.com',
},
],
light: false,
sitemapRoute: '/',
helpRoute: '/',
cguRoute: '/',
cookiesRoute: '/',
legalNoticeRoute: '/',
a11yStatementRoute: '/',
vuetifyOptions: {
footer: {
elevation: 3,
color: 'var(--footer-background)',
height: 'auto',
},
goTopBtn: {
density: 'compact',
icon: 'true',
variant: 'text',
elevation: 0,
},
goTopBtnIcon: {
color: 'primary',
},
},
onEvent: fn(),
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
`,
}
},
}
export const changeLinks: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['linkItems'] },
},
args: {
linkItems: [
{
text: 'Accueil',
href: '/',
},
{
text: 'Plan du site',
href: '/sitemap',
},
{
text: 'Conditions générales d\'utilisation',
href: '/cgu',
},
{
text: 'Aide',
href: 'https://www.ameli.fr/assure/aide',
ariaLabel: 'Aide (s’ouvre sur le site ameli.fr)',
openInNewTab: true,
},
],
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
`,
}
},
}
export const slotPrepend: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Texte ajouté
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['prepend'] },
},
args: {
items: items,
prepend: 'Texte ajouté',
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Texte ajouté
`,
}
},
}
export const slotAppend: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
{{ currentYear }}
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['append'] },
},
args: {
items: items,
append: '{{ currentYear }}',
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args, currentYear }
},
template: `
{{ currentYear }}
`,
}
},
}
export const extendedMode: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['default'] },
},
args: {
items: items,
default: 'Contenu supplémentaire.
',
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const slotLogo: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['logo'] },
},
args: {
items: items,
logo: '',
},
render: (args) => {
return {
components: { FooterBar, Logo },
setup() {
const theme = useTheme()
const channel = addons.getChannel()
channel.on('storybook-theme-change', (theme) => {
theme.name.value = theme
})
return { args, ameliProLogo, theme }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const collapsibleList: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['default'] },
},
args: {
items: items,
default: `
`,
},
render(args) {
return {
components: { FooterBar, CollapsibleList },
setup() {
return { args, remboursementItems, healthItems }
},
template: `
`,
}
},
}
export const hideSectionLogo: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['hideLogo'] },
},
args: {
items: items,
hideLogo: true,
},
render(args) {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const hideSectionSocialMediaLinks: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['hideSocialMediaLinks'] },
},
args: {
items: items,
hideSocialMediaLinks: true,
},
render(args) {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const customSocialMediaLinks: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['socialMediaLinks'] },
},
args: {
items: items,
socialMediaLinks: [
{
icon: mdiLinkedin,
name: 'LinkedIn',
href: 'https://www.linkedin.com',
},
{
icon: mdiFacebook,
name: 'Facebook',
href: 'https://www.facebook.com',
},
{
icon: xIcon,
name: 'X',
href: 'https://x.com',
},
{
icon: mdiYoutube,
name: 'YouTube',
href: 'https://youtube.com',
},
],
},
render(args) {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const lightTheme: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['light'] },
},
args: {
items: items,
light: true,
},
render(args) {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const customTheme: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Contenu supplémentaire.
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['vuetifyOptions'] },
},
args: {
items: items,
vuetifyOptions: {
footer: {
elevation: 3,
color: 'rgb(50, 53, 53)',
height: 'auto',
},
goTopBtn: {
color: 'rgb(50, 53, 53)',
},
},
},
render(args) {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
Contenu supplémentaire.
`,
}
},
}
export const BackOffice: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { exclude: ['logoSize', 'items'] },
},
args: {
a11yCompliance: 'non-compliant',
items: items,
version: '1.1.2',
backOffice: true,
backOfficeText: 'Ameli Pro Back Office',
socialMediaLinks: [
{
icon: mdiFacebook,
name: 'Facebook',
href: 'https://www.facebook.com',
},
{
icon: xIcon,
name: 'X',
href: 'https://x.com',
},
{
icon: mdiLinkedin,
name: 'LinkedIn',
href: 'https://www.linkedin.com',
},
],
light: false,
sitemapRoute: '/',
helpRoute: '/',
cguRoute: '/',
cookiesRoute: '/',
legalNoticeRoute: '/',
a11yStatementRoute: '/',
vuetifyOptions: {
footer: {
elevation: 3,
color: 'var(--footer-background)',
height: 'auto',
},
goTopBtn: {
density: 'compact',
icon: 'true',
variant: 'text',
elevation: 0,
},
goTopBtnIcon: {
color: 'primary',
},
},
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args }
},
template: `
`,
}
},
}
export const withPhoneNumber: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
controls: { include: ['prepend'] },
},
args: {
items: items,
},
render: (args) => {
return {
components: { FooterBar },
setup() {
return { args, imgUrl }
},
template: `
`,
}
},
}