Les composants de mise en page définissent la structure globale de l'application. Ils sont responsables de l'agencement des différentes parties de l'interface utilisateur.
En-tête principal de l'application contenant la navigation et le logo.
flowchart TD
A[AppHeader]
A --> B[Logo]
A --> C[Menu Principal]
A --> D[Menu Utilisateur]
C --> E[Accueil]
C --> F[Services]
C --> G[Contact]
D --> H[Profil]
D --> I[Déconnexion]
| Nom | Type | Requis | Défaut | Description |
|---|---|---|---|---|
| transparent | boolean | Non | false | Rend l'en-tête transparent |
| fixed | boolean | Non | false | Fixe l'en-tête en haut de la page |
| Nom | Paramètres | Description |
|---|---|---|
| toggle-mobile-menu | boolean | Émis lorsque le menu mobile est ouvert/fermé |
Pied de page de l'application avec les liens utiles et les informations légales.
flowchart TD
A[AppFooter]
A --> B[Liens Rapides]
A --> C[Contact]
A --> D[Réseaux Sociaux]
A --> E[Mentions Légales]
B --> F[Accueil]
B --> G[Services]
B --> H[FAQ]
C --> I[Email]
C --> J[Téléphone]
D --> K[Facebook]
D --> L[Twitter]
D --> M[LinkedIn]
| Nom | Description |
|---|---|
| default | Contenu principal du pied de page |
| copyright | Section des droits d'auteur (par défaut : © 2023 Save France) |
<!-- app.vue -->
<template>
<div class="min-h-screen flex flex-col">
<AppHeader />
<main class="flex-grow">
<NuxtPage />
</main>
<AppFooter />
</div>
</template>
layouts/ :<!-- layouts/custom.vue -->
<template>
<div class="custom-layout">
<AppHeader :transparent="true" />
<div class="content">
<slot />
</div>
<AppFooter />
</div>
</template>
<style scoped>
.custom-layout {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.content {
flex: 1;
padding: 2rem 0;
}
</style>
<!-- pages/custom-page.vue -->
<template>
<div>
<h1>Page Personnalisée</h1>
<!-- Contenu de la page -->
</div>
</template>
<script setup>
definePageMeta({
layout: 'custom'
});
</script>
Les composants de mise en page s'adaptent automatiquement à la taille de l'écran :
Les couleurs et les espacements peuvent être personnalisés via les variables CSS :
:root {
--header-height: 4rem;
--footer-height: 8rem;
--primary-bg: #ffffff;
--text-color: #1a1a1a;
}
.dark {
--primary-bg: #1a1a1a;
--text-color: #ffffff;
}
Les textes sont gérés via Nuxt i18n. Pour modifier les textes :
// locales/fr.json
{
"header": {
"nav": {
"home": "Accueil",
"services": "Services",
"contact": "Contact"
}
},
"footer": {
"links": {
"about": "À propos",
"privacy": "Confidentialité",
"terms": "Conditions d'utilisation"
}
}
}
<header>, <footer>, <nav>)<template>
<AppHeader
:transparent="isHomePage"
@toggle-mobile-menu="isMobileMenuOpen = $event"
/>
<main
class="main-content"
:class="{ 'pt-16': isMobileMenuOpen }"
>
<slot />
</main>
<AppFooter>
<template #copyright>
<div class="text-center text-sm text-gray-500">
© {{ new Date().getFullYear() }} Save France. Tous droits réservés.
</div>
</template>
</AppFooter>
</template>
<script setup>
const route = useRoute();
const isMobileMenuOpen = ref(false);
const isHomePage = computed(() => route.path === '/');
</script>
<style scoped>
.main-content {
min-height: calc(100vh - var(--header-height) - var(--footer-height));
padding-top: var(--header-height);
transition: padding-top 0.3s ease;
}
</style>
nuxt.config.tsNuxtLink