import type { Meta, StoryObj } from '@storybook/vue3' import { mdiAccountCircleOutline, mdiMagnify } from '@mdi/js' import { VBtn, VListItem, VListItemTitle } from 'vuetify/components' import HeaderToolbar from '../HeaderToolbar/HeaderToolbar.vue' import LogoBrandSection from '../LogoBrandSection/LogoBrandSection.vue' import SubHeader from '../SubHeader/SubHeader.vue' import UserMenuBtn from '../UserMenuBtn/UserMenuBtn.vue' import HeaderBar from './HeaderBar.vue' import SyIcon from '../Customs/SyIcon/SyIcon.vue' import { useTheme } from 'vuetify' import { addons } from '@storybook/manager-api' const meta = { title: 'Composants/Structure/HeaderBar', component: HeaderBar, parameters: { layout: 'fullscreen', }, argTypes: { 'serviceTitle': { control: { type: 'text' }, description: 'Le nom du service tel qu\'il sera affiché à coté du logo.', table: { type: { summary: 'string', }, }, }, 'serviceSubtitle': { control: { type: 'text' }, description: 'Le sous-titre du service.', table: { type: { summary: 'string', }, }, }, 'homeAriaLabel': { control: { type: 'text' }, description: 'Le texte de l\'attribut aria-label pour le logo du header.', table: { type: { summary: 'string', }, defaultValue: { summary: 'Logo de l\'Assurance Maladie, cliquez pour revenir à l\'accueil', }, }, }, 'homeLink': { control: { type: 'object' }, description: 'Le lien de retour vers la home. Renseigner soit `href` soit `to` pour avoir un lien de type `` ou ``.', table: { type: { summary: `{ href?: string, to?: RouteLocationRaw, ariaLabel?: string, }`, }, defaultValue: { summary: `{ href: '/' }`, }, }, }, 'sticky': { control: { type: 'boolean' }, description: 'Si le header doit rester collé en haut de la page lors du scroll.', table: { type: { summary: 'boolean', }, }, }, 'hideWhenDown': { control: { type: 'boolean' }, description: '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.', table: { type: { summary: 'boolean', }, }, }, 'prepend': { control: { type: 'text' }, description: 'Contenu additionnel en haut du header, suit le header quand `sticky`.', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'append': { control: { type: 'text' }, description: 'Contenu additionnel en bas du header, suit le header quand `sticky`.', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'menu': { control: { type: 'text' }, description: 'Slot destiner à accueillir un menu flottant. Voir le composant `HeaderBurgerMenu`.', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'logo': { control: { type: 'text' }, table: { type: { summary: `{ menu-open: boolean, home-aria-label: string, service-title: string, service-subtitle: string, }`, }, }, }, 'logo-brand-content': { control: { type: 'text' }, description: 'Le contenu à droite du logo de l\'assurance maladie. Peut être utilisé pour accoler un autre logo par exemple.', table: { type: { summary: `{ menu-open: boolean, home-aria-label: string, service-title: string, service-subtitle: string, }`, }, }, }, 'header-side': { control: { type: 'text' }, description: 'Contenu à droite du header. Utile pour ajouter un menu secondaire par exemple.', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'width': { control: { type: 'text' }, description: 'Largeur interne du header.', table: { type: { summary: 'string', }, defaultValue: { summary: '1712px', }, }, }, 'headingLevelTitle': { control: { type: 'select', options: [1, 2, 3, 4, 5, 6] }, description: 'Le niveau de titre pour le titre du service.', table: { type: { summary: '1 | 2 | 3 | 4 | 5 | 6', }, defaultValue: { summary: '1', }, }, }, }, } satisfies Meta export default meta type Story = StoryObj export const Default: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, decorators: [ () => ({ template: `
`, }), ], parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithRightMenu: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, render: (args) => { return { components: { HeaderBar, VBtn, SyIcon }, setup() { const searchIcon = mdiMagnify const accountIcon = mdiAccountCircleOutline return { args, searchIcon, accountIcon } }, template: `
`, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const CustomLogo: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', sticky: false, }, render: (args) => { return { components: { HeaderBar, LogoBrandSection }, setup() { const logo = { menuOpen: false, homeAriaLabel: 'Logo de l\'Assurance Maladie, cliquez pour revenir à l\'accueil', serviceTitle: 'Synapse', serviceSubtitle: 'Design System', } return { args, logo } }, template: `




`, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const CustomBrand: Story = { args: { headingLevelTitle: 1 }, render: (args) => { return { components: { HeaderBar }, setup() { return { args } }, template: ` `, } }, parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const Sticky: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, decorators: [ () => ({ template: `
Contenu de la page
`, }), ], parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithHeaderToolbar: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, render: (args) => { return { components: { HeaderBar, HeaderToolbar }, setup() { return { args } }, template: `
Contenu de la page
`, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithSubHeader: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, render: (args) => { return { components: { HeaderBar, SubHeader }, setup() { const searchIcon = mdiMagnify return { args, searchIcon } }, template: `
Contenu de la page
`, } }, parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const DefaultSlot: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, render: (args) => { return { components: { HeaderBar, UserMenuBtn, VListItem, VListItemTitle }, setup() { const listItems = [ { text: 'Item 1', value: 'item1' }, { text: 'Item 2', value: 'item2' }, { text: 'Item 3', value: 'item3' }, ] return { args, listItems } }, template: ` `, } }, parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const PrependSlot: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, render: (args) => { return { components: { HeaderBar }, setup() { return { args } }, template: ` `, } }, parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const AppendSlot: Story = { args: { headingLevelTitle: 1, serviceTitle: 'Synapse', serviceSubtitle: 'Design System', }, render: (args) => { return { components: { HeaderBar }, setup() { const theme = useTheme() const channel = addons.getChannel() channel.on('storybook-theme-change', (theme) => { theme.name.value = theme }) return { args, HeaderBar, theme } }, template: ` `, } }, parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, }