import type { Meta, StoryObj } from '@storybook/vue3' import HeaderNavigationBar from './HeaderNavigationBar.vue' import { VBtn } from 'vuetify/components' import BackBtn from '../BackBtn/BackBtn.vue' import { fn } from '@storybook/test' const meta = { title: 'Composants/Structure/HeaderBar/HeaderNavigationBar', component: HeaderNavigationBar, parameters: { layout: 'fullscreen', }, argTypes: { 'burgerMenu': { table: { category: 'props', type: { summary: 'boolean', }, defaultValue: { summary: 'false', }, }, control: { type: 'boolean' }, description: 'État du menu burger. Controllable avec `v-model:burger-menu`.', }, 'onUpdate:burgerMenu': { action: 'update:burgerMenu', table: { category: 'events', type: { summary: 'boolean', }, }, description: 'Emit lors de l\'ouverture ou la fermeture du menu.', }, 'items': { control: { type: 'object' }, description: 'Liste des items de navigation.', table: { type: { summary: 'Array<...>', detail: 'Array<{ label: string, href?: string, to?: string }>', }, }, }, 'homeAriaLabel': { control: { type: 'text' }, description: 'Aria label du logo.', table: { type: { summary: 'string', }, }, }, 'serviceTitle': { control: { type: 'text' }, description: 'Titre du service.', table: { type: { summary: 'string', }, }, }, 'serviceSubtitle': { control: { type: 'text' }, description: 'Sous-titre du service.', table: { type: { summary: 'string', }, }, }, '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: 'Activer le mode sticky.', table: { type: { summary: 'boolean', }, }, }, 'hideWhenDown': { control: { type: 'text' }, description: 'Masquer le header quand on scroll vers le bas.', table: { type: { summary: 'boolean', }, }, }, 'maxHorizontalMenuItems': { control: { type: 'number' }, description: 'Nombre maximum d\'items dans le menu horizontal avant de basculer sur le menu burger.', table: { type: { summary: 'number', }, }, }, 'logo': { control: { type: 'text' }, description: 'Remplacer le logo.', 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 a 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 a droite du header. Utile pour ajouter un menu secondaire par exemple.', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'navigation-bar-prepend': { control: { type: 'text' }, description: 'Contenu a gauche de la barre de navigation (desktop).', table: { type: { summary: '{}', }, }, }, 'navigation-bar-append': { control: { type: 'text' }, description: 'Contenu a droite de la barre de navigation (desktop).', table: { type: { summary: '{}', }, }, }, 'navigation-bar-content': { control: { type: 'text' }, description: 'Remplace le contenu de la barre de navigation (desktop).', table: { type: { summary: '{}', }, }, }, 'navigation-menu-prepend': { control: { type: 'text' }, description: 'Contenu en haut du menu de navigation (mobile).', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'navigation-menu-append': { control: { type: 'text' }, description: 'Contenu en bas du menu de navigation (mobile).', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'navigation-menu-content': { control: { type: 'text' }, description: 'Remplace le contenu du menu de navigation (mobile). Utiliser les composants `HeaderMenuSection` et `HeaderMenuItem`.', table: { type: { summary: '{ menu-open: boolean }', }, }, }, 'width': { control: { type: 'text' }, description: 'Largeur interne du header.', table: { type: { summary: 'string', }, defaultValue: { summary: '1712px', }, }, }, 'vuetifyOptions': { control: { type: 'object' }, description: 'Permet de personaliser les props des composants vuetify `VSheet`, `VTabs` et `VTab` utilisés en interne.', table: { category: 'props', type: { summary: 'object', detail: `{ sheet: Record, tabs: Record, tab: Record, }`, }, defaultValue: { summary: 'object', detail: `{ sheet: { theme: 'dark', dense: true, color: '#07275c', }, tabs: { height: '53', showArrows: true, }, tab: { baseColor: 'rgba(255, 255, 255, 0.7)', sliderColor: '#fff', ripple: false, }, }`, }, }, }, 'confirmTabChange': { control: { type: 'boolean' }, description: 'Si activé, une confirmation sera demandée avant de changer d\'onglet', table: { category: 'props', type: { summary: 'boolean', }, }, }, }, } satisfies Meta export default meta type Story = StoryObj export const Default: Story = { args: { headingLevelTitle: 1, items: [ { label: 'Home', href: '', }, { label: 'About', href: '', }, ], }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithScroll: Story = { args: { headingLevelTitle: 1, items: [ { label: 'Home', href: '', }, { label: 'About', href: '', }, ], }, decorators: [ () => ({ template: `
Contenu de la page
`, }), ], parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithManyItems: Story = { args: { headingLevelTitle: 1, items: [ { label: 'Home', href: '', }, { label: 'About', href: '', }, { label: 'Services', href: '', }, { label: 'Contact', href: '', }, { label: 'Blog', href: '', }, { label: 'Portfolio', href: '', }, { label: 'Team', href: '', }, { label: 'Careers', href: '', }, ], }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithSlots: Story = { args: { ...Default.args, }, render: (args) => { return { components: { HeaderNavigationBar, VBtn, BackBtn }, setup() { return { args } }, template: ` `, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithLogoSlot: Story = { args: { ...Default.args, }, render: (args) => { return { components: { HeaderNavigationBar, VBtn, BackBtn }, setup() { return { args } }, template: ` `, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithNavigationBarPrependSlot: Story = { args: { ...Default.args, burgerMenu: false, }, render: (args) => { return { components: { HeaderNavigationBar, VBtn, BackBtn }, setup() { return { args } }, template: ` `, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithNavigationBarAppendSlot: Story = { args: { ...Default.args, }, render: (args) => { return { components: { HeaderNavigationBar, VBtn, BackBtn }, setup() { return { args } }, template: ` `, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithNavigationMenuAppendSlot: Story = { args: { ...Default.args, 'maxHorizontalMenuItems': 0, 'onUpdate:burgerMenu': fn(), }, render: (args) => { return { components: { HeaderNavigationBar, VBtn, BackBtn }, setup() { return { args } }, template: `
`, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithVuetifyOptions: Story = { args: { ...Default.args, vuetifyOptions: { sheet: { color: 'pink', }, }, }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } export const WithTabConfirmation: Story = { args: { headingLevelTitle: 1, items: [ { label: 'Home', href: '/home' }, { label: 'Test avec href', href: '/test-avec-href' }, { label: 'Test sans href', href: '' }, ], confirmTabChange: true, }, render: (args) => { return { components: { HeaderNavigationBar }, setup() { const showCustomConfirmDialog = (message: string, callback: (confirmed: boolean) => void) => { // Simulation d'une boîte de dialogue personnalisée // Dans un cas réel, vous afficheriez votre propre composant de dialogue // Pour cette démo, on utilise encore window.confirm mais avec un préfixe const confirmed = window.confirm('Changer d\'onglet ?') console.log('Réponse de l\'utilisateur:', confirmed ? 'Accepté' : 'Refusé') callback(confirmed) } return { args, showCustomConfirmDialog } }, template: `

Cette démo montre comment intercepter l'événement confirm-tab-change et gérer la confirmation via votre propre UI.

Cliquez sur un onglet pour voir la boîte de dialogue de confirmation.

Consultez la console pour voir les logs de confirmation.

`, } }, parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, }