606 lines
16 KiB
Markdown
606 lines
16 KiB
Markdown
# Xpeditis Design System
|
||
|
||
## 📐 Charte Graphique
|
||
|
||
Ce document définit la charte graphique officielle de Xpeditis pour assurer la cohérence visuelle de l'application.
|
||
|
||
---
|
||
|
||
## 🎨 Palette de Couleurs
|
||
|
||
### Couleurs Principales
|
||
|
||
| Nom | Hex | RGB | Usage |
|
||
|-----|-----|-----|-------|
|
||
| **Navy Blue** | `#10183A` | `rgb(16, 24, 58)` | Couleur principale, headers, textes importants |
|
||
| **Turquoise** | `#34CCCD` | `rgb(52, 204, 205)` | Couleur d'accent, CTAs, liens, highlights |
|
||
| **Green** | `#067224` | `rgb(6, 114, 36)` | Success states, confirmations, statuts positifs |
|
||
| **Light Gray** | `#F2F2F2` | `rgb(242, 242, 242)` | Backgrounds, sections, cards |
|
||
| **White** | `#FFFFFF` | `rgb(255, 255, 255)` | Backgrounds principaux, texte sur foncé |
|
||
|
||
### Couleurs Sémantiques (Dérivées)
|
||
|
||
```css
|
||
/* Success */
|
||
--color-success: #067224;
|
||
--color-success-light: #08a131;
|
||
--color-success-dark: #044f19;
|
||
|
||
/* Info (Turquoise) */
|
||
--color-info: #34CCCD;
|
||
--color-info-light: #5dd9da;
|
||
--color-info-dark: #2a9fa0;
|
||
|
||
/* Warning */
|
||
--color-warning: #f59e0b;
|
||
--color-warning-light: #fbbf24;
|
||
--color-warning-dark: #d97706;
|
||
|
||
/* Error */
|
||
--color-error: #dc2626;
|
||
--color-error-light: #ef4444;
|
||
--color-error-dark: #b91c1c;
|
||
|
||
/* Neutral (Navy Blue based) */
|
||
--color-neutral-900: #10183A;
|
||
--color-neutral-800: #1e2859;
|
||
--color-neutral-700: #2c3978;
|
||
--color-neutral-600: #3a4a97;
|
||
--color-neutral-500: #5a6bb8;
|
||
--color-neutral-400: #8590c9;
|
||
--color-neutral-300: #b0b6da;
|
||
--color-neutral-200: #dadbeb;
|
||
--color-neutral-100: #edeef5;
|
||
--color-neutral-50: #f8f9fc;
|
||
```
|
||
|
||
---
|
||
|
||
## 🔤 Typographie
|
||
|
||
### Polices Principales
|
||
|
||
#### **Manrope** - Titres et Headers
|
||
- **Usage**: Titres (H1-H6), labels importants, navigation
|
||
- **Poids disponibles**: 200 (ExtraLight), 300 (Light), 400 (Regular), 500 (Medium), 600 (SemiBold), 700 (Bold), 800 (ExtraBold)
|
||
- **Caractéristiques**: Police moderne, géométrique, excellent lisibilité
|
||
|
||
#### **Montserrat** - Corps de texte
|
||
- **Usage**: Paragraphes, corps de texte, descriptions, formulaires
|
||
- **Poids disponibles**: 100 (Thin), 200 (ExtraLight), 300 (Light), 400 (Regular), 500 (Medium), 600 (SemiBold), 700 (Bold), 800 (ExtraBold), 900 (Black)
|
||
- **Caractéristiques**: Police sans-serif classique, très lisible, polyvalente
|
||
|
||
### Hiérarchie Typographique
|
||
|
||
```css
|
||
/* Display - Manrope */
|
||
.text-display-lg {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 4.5rem; /* 72px */
|
||
font-weight: 800;
|
||
line-height: 1.1;
|
||
letter-spacing: -0.02em;
|
||
}
|
||
|
||
.text-display-md {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 3.75rem; /* 60px */
|
||
font-weight: 700;
|
||
line-height: 1.15;
|
||
letter-spacing: -0.02em;
|
||
}
|
||
|
||
.text-display-sm {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 3rem; /* 48px */
|
||
font-weight: 700;
|
||
line-height: 1.2;
|
||
letter-spacing: -0.01em;
|
||
}
|
||
|
||
/* Headings - Manrope */
|
||
.text-h1 {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 2.5rem; /* 40px */
|
||
font-weight: 700;
|
||
line-height: 1.25;
|
||
}
|
||
|
||
.text-h2 {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 2rem; /* 32px */
|
||
font-weight: 600;
|
||
line-height: 1.3;
|
||
}
|
||
|
||
.text-h3 {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 1.5rem; /* 24px */
|
||
font-weight: 600;
|
||
line-height: 1.35;
|
||
}
|
||
|
||
.text-h4 {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 1.25rem; /* 20px */
|
||
font-weight: 600;
|
||
line-height: 1.4;
|
||
}
|
||
|
||
.text-h5 {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 1.125rem; /* 18px */
|
||
font-weight: 500;
|
||
line-height: 1.45;
|
||
}
|
||
|
||
.text-h6 {
|
||
font-family: 'Manrope', sans-serif;
|
||
font-size: 1rem; /* 16px */
|
||
font-weight: 500;
|
||
line-height: 1.5;
|
||
}
|
||
|
||
/* Body - Montserrat */
|
||
.text-body-lg {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 1.125rem; /* 18px */
|
||
font-weight: 400;
|
||
line-height: 1.6;
|
||
}
|
||
|
||
.text-body {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 1rem; /* 16px */
|
||
font-weight: 400;
|
||
line-height: 1.6;
|
||
}
|
||
|
||
.text-body-sm {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 0.875rem; /* 14px */
|
||
font-weight: 400;
|
||
line-height: 1.55;
|
||
}
|
||
|
||
.text-body-xs {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 0.75rem; /* 12px */
|
||
font-weight: 400;
|
||
line-height: 1.5;
|
||
}
|
||
|
||
/* Labels and UI - Montserrat */
|
||
.text-label-lg {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 0.875rem; /* 14px */
|
||
font-weight: 600;
|
||
line-height: 1.4;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
}
|
||
|
||
.text-label {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 0.75rem; /* 12px */
|
||
font-weight: 600;
|
||
line-height: 1.4;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
}
|
||
|
||
.text-label-sm {
|
||
font-family: 'Montserrat', sans-serif;
|
||
font-size: 0.6875rem; /* 11px */
|
||
font-weight: 600;
|
||
line-height: 1.4;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Guidelines d'Utilisation
|
||
|
||
### Couleurs
|
||
|
||
#### Navy Blue (#10183A)
|
||
✅ **À utiliser pour:**
|
||
- Headers et navigation principale
|
||
- Titres importants (H1, H2)
|
||
- Texte sur fond clair
|
||
- Éléments de structure principale
|
||
|
||
❌ **À éviter:**
|
||
- Texte de petite taille (< 14px)
|
||
- Arrière-plans étendus (trop sombre)
|
||
|
||
#### Turquoise (#34CCCD)
|
||
✅ **À utiliser pour:**
|
||
- Boutons CTA principaux
|
||
- Liens et éléments interactifs
|
||
- Highlights et badges
|
||
- Icônes d'action
|
||
- Progress indicators
|
||
|
||
❌ **À éviter:**
|
||
- Texte long (fatigue visuelle)
|
||
- Messages d'erreur ou d'alerte
|
||
|
||
#### Green (#067224)
|
||
✅ **À utiliser pour:**
|
||
- Confirmations et success states
|
||
- Statuts "Confirmed", "Delivered"
|
||
- Badges de statut positif
|
||
- Icônes de validation
|
||
|
||
❌ **À éviter:**
|
||
- Éléments neutres
|
||
- CTAs principaux (réservé à turquoise)
|
||
|
||
#### Light Gray (#F2F2F2)
|
||
✅ **À utiliser pour:**
|
||
- Backgrounds de sections
|
||
- Cards et containers
|
||
- Séparateurs subtils
|
||
- Inputs désactivés
|
||
|
||
❌ **À éviter:**
|
||
- Texte principal
|
||
- Éléments nécessitant contraste élevé
|
||
|
||
### Typographie
|
||
|
||
#### Quand utiliser Manrope
|
||
- **Tous les titres** (H1-H6)
|
||
- **Navigation** (menu items)
|
||
- **Boutons** (button labels)
|
||
- **Table headers**
|
||
- **Dashboard KPI numbers**
|
||
- **Logos et branding**
|
||
|
||
#### Quand utiliser Montserrat
|
||
- **Tout le corps de texte**
|
||
- **Descriptions**
|
||
- **Labels de formulaires**
|
||
- **Messages d'aide**
|
||
- **Placeholders**
|
||
- **Table body content**
|
||
- **Tooltips**
|
||
|
||
---
|
||
|
||
## 📦 Intégration dans le Projet
|
||
|
||
### 1. Tailwind CSS Configuration
|
||
|
||
Modifier [tailwind.config.ts](tailwind.config.ts):
|
||
|
||
```typescript
|
||
import type { Config } from 'tailwindcss';
|
||
|
||
const config: Config = {
|
||
content: [
|
||
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
|
||
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
|
||
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
||
],
|
||
theme: {
|
||
extend: {
|
||
colors: {
|
||
// Primary colors
|
||
primary: {
|
||
DEFAULT: '#10183A',
|
||
navy: '#10183A',
|
||
},
|
||
accent: {
|
||
DEFAULT: '#34CCCD',
|
||
turquoise: '#34CCCD',
|
||
},
|
||
success: {
|
||
DEFAULT: '#067224',
|
||
light: '#08a131',
|
||
dark: '#044f19',
|
||
},
|
||
// Neutral scale (Navy-based)
|
||
neutral: {
|
||
50: '#f8f9fc',
|
||
100: '#edeef5',
|
||
200: '#dadbeb',
|
||
300: '#b0b6da',
|
||
400: '#8590c9',
|
||
500: '#5a6bb8',
|
||
600: '#3a4a97',
|
||
700: '#2c3978',
|
||
800: '#1e2859',
|
||
900: '#10183A',
|
||
},
|
||
background: {
|
||
DEFAULT: '#FFFFFF',
|
||
secondary: '#F2F2F2',
|
||
},
|
||
},
|
||
fontFamily: {
|
||
manrope: ['Manrope', 'sans-serif'],
|
||
montserrat: ['Montserrat', 'sans-serif'],
|
||
// Aliases for semantic usage
|
||
heading: ['Manrope', 'sans-serif'],
|
||
body: ['Montserrat', 'sans-serif'],
|
||
},
|
||
fontSize: {
|
||
// Display sizes
|
||
'display-lg': ['4.5rem', { lineHeight: '1.1', letterSpacing: '-0.02em', fontWeight: '800' }],
|
||
'display-md': ['3.75rem', { lineHeight: '1.15', letterSpacing: '-0.02em', fontWeight: '700' }],
|
||
'display-sm': ['3rem', { lineHeight: '1.2', letterSpacing: '-0.01em', fontWeight: '700' }],
|
||
|
||
// Heading sizes
|
||
'h1': ['2.5rem', { lineHeight: '1.25', fontWeight: '700' }],
|
||
'h2': ['2rem', { lineHeight: '1.3', fontWeight: '600' }],
|
||
'h3': ['1.5rem', { lineHeight: '1.35', fontWeight: '600' }],
|
||
'h4': ['1.25rem', { lineHeight: '1.4', fontWeight: '600' }],
|
||
'h5': ['1.125rem', { lineHeight: '1.45', fontWeight: '500' }],
|
||
'h6': ['1rem', { lineHeight: '1.5', fontWeight: '500' }],
|
||
|
||
// Body sizes
|
||
'body-lg': ['1.125rem', { lineHeight: '1.6', fontWeight: '400' }],
|
||
'body': ['1rem', { lineHeight: '1.6', fontWeight: '400' }],
|
||
'body-sm': ['0.875rem', { lineHeight: '1.55', fontWeight: '400' }],
|
||
'body-xs': ['0.75rem', { lineHeight: '1.5', fontWeight: '400' }],
|
||
|
||
// Label sizes
|
||
'label-lg': ['0.875rem', { lineHeight: '1.4', fontWeight: '600', letterSpacing: '0.05em' }],
|
||
'label': ['0.75rem', { lineHeight: '1.4', fontWeight: '600', letterSpacing: '0.05em' }],
|
||
'label-sm': ['0.6875rem', { lineHeight: '1.4', fontWeight: '600', letterSpacing: '0.05em' }],
|
||
},
|
||
},
|
||
},
|
||
plugins: [],
|
||
};
|
||
|
||
export default config;
|
||
```
|
||
|
||
### 2. Google Fonts Integration
|
||
|
||
Modifier [app/layout.tsx](app/layout.tsx):
|
||
|
||
```typescript
|
||
import { Manrope, Montserrat } from 'next/font/google';
|
||
|
||
const manrope = Manrope({
|
||
subsets: ['latin'],
|
||
weight: ['200', '300', '400', '500', '600', '700', '800'],
|
||
variable: '--font-manrope',
|
||
display: 'swap',
|
||
});
|
||
|
||
const montserrat = Montserrat({
|
||
subsets: ['latin'],
|
||
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
|
||
variable: '--font-montserrat',
|
||
display: 'swap',
|
||
});
|
||
|
||
export default function RootLayout({
|
||
children,
|
||
}: {
|
||
children: React.ReactNode;
|
||
}) {
|
||
return (
|
||
<html lang="fr" className={`${manrope.variable} ${montserrat.variable}`}>
|
||
<body className="font-body text-body text-neutral-900 bg-background">
|
||
{children}
|
||
</body>
|
||
</html>
|
||
);
|
||
}
|
||
```
|
||
|
||
### 3. Global CSS (app/globals.css)
|
||
|
||
```css
|
||
@tailwind base;
|
||
@tailwind components;
|
||
@tailwind utilities;
|
||
|
||
@layer base {
|
||
/* Set default font to Montserrat */
|
||
body {
|
||
@apply font-montserrat;
|
||
}
|
||
|
||
/* Apply Manrope to all headings */
|
||
h1, h2, h3, h4, h5, h6 {
|
||
@apply font-manrope;
|
||
}
|
||
|
||
h1 { @apply text-h1 text-primary-navy; }
|
||
h2 { @apply text-h2 text-primary-navy; }
|
||
h3 { @apply text-h3 text-neutral-800; }
|
||
h4 { @apply text-h4 text-neutral-800; }
|
||
h5 { @apply text-h5 text-neutral-700; }
|
||
h6 { @apply text-h6 text-neutral-700; }
|
||
}
|
||
|
||
@layer components {
|
||
/* Button styles */
|
||
.btn-primary {
|
||
@apply bg-accent-turquoise text-white font-manrope font-semibold px-6 py-3 rounded-lg hover:bg-accent-turquoise/90 transition-colors;
|
||
}
|
||
|
||
.btn-secondary {
|
||
@apply bg-primary-navy text-white font-manrope font-semibold px-6 py-3 rounded-lg hover:bg-neutral-800 transition-colors;
|
||
}
|
||
|
||
.btn-success {
|
||
@apply bg-success text-white font-manrope font-semibold px-6 py-3 rounded-lg hover:bg-success-dark transition-colors;
|
||
}
|
||
|
||
/* Card styles */
|
||
.card {
|
||
@apply bg-white rounded-lg shadow-md p-6;
|
||
}
|
||
|
||
.card-header {
|
||
@apply font-manrope font-semibold text-h4 text-primary-navy mb-4;
|
||
}
|
||
|
||
/* Badge styles */
|
||
.badge {
|
||
@apply inline-flex items-center px-3 py-1 rounded-full text-label font-montserrat;
|
||
}
|
||
|
||
.badge-success {
|
||
@apply badge bg-success/10 text-success;
|
||
}
|
||
|
||
.badge-info {
|
||
@apply badge bg-accent-turquoise/10 text-accent-turquoise;
|
||
}
|
||
|
||
/* Link styles */
|
||
.link {
|
||
@apply text-accent-turquoise hover:text-accent-turquoise/80 transition-colors underline-offset-2 hover:underline;
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🎨 Exemples d'Utilisation
|
||
|
||
### Exemple 1: Header Component
|
||
|
||
```tsx
|
||
export function Header() {
|
||
return (
|
||
<header className="bg-primary-navy text-white">
|
||
<div className="container mx-auto px-4 py-4 flex items-center justify-between">
|
||
<h1 className="font-heading text-h3 font-bold">Xpeditis</h1>
|
||
<nav className="flex gap-6 font-heading font-medium">
|
||
<a href="#" className="hover:text-accent-turquoise transition-colors">
|
||
Dashboard
|
||
</a>
|
||
<a href="#" className="hover:text-accent-turquoise transition-colors">
|
||
Bookings
|
||
</a>
|
||
</nav>
|
||
</div>
|
||
</header>
|
||
);
|
||
}
|
||
```
|
||
|
||
### Exemple 2: Card with Typography
|
||
|
||
```tsx
|
||
export function BookingCard() {
|
||
return (
|
||
<div className="card">
|
||
<h3 className="card-header">Booking Details</h3>
|
||
<div className="space-y-3">
|
||
<div>
|
||
<label className="text-label text-neutral-600 block mb-1">
|
||
BOOKING NUMBER
|
||
</label>
|
||
<p className="text-body font-semibold text-neutral-900">
|
||
WCM-2024-ABC123
|
||
</p>
|
||
</div>
|
||
<div>
|
||
<label className="text-label text-neutral-600 block mb-1">
|
||
STATUS
|
||
</label>
|
||
<span className="badge-success">CONFIRMED</span>
|
||
</div>
|
||
<div>
|
||
<label className="text-label text-neutral-600 block mb-1">
|
||
DESCRIPTION
|
||
</label>
|
||
<p className="text-body-sm text-neutral-700">
|
||
Maritime freight from Le Havre to Shanghai. Container type: 20FT.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|
||
```
|
||
|
||
### Exemple 3: Hero Section
|
||
|
||
```tsx
|
||
export function Hero() {
|
||
return (
|
||
<section className="bg-primary-navy text-white py-20">
|
||
<div className="container mx-auto px-4 text-center">
|
||
<h1 className="text-display-md font-heading mb-6">
|
||
Maritime Freight Made Simple
|
||
</h1>
|
||
<p className="text-body-lg font-body max-w-2xl mx-auto mb-8 text-neutral-200">
|
||
Book, track, and manage your LCL shipments with real-time rates
|
||
from the world's leading shipping lines.
|
||
</p>
|
||
<div className="flex gap-4 justify-center">
|
||
<button className="btn-primary">
|
||
Get Started
|
||
</button>
|
||
<button className="btn-secondary">
|
||
View Demo
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Accessibilité
|
||
|
||
### Contraste des Couleurs (WCAG AA Compliance)
|
||
|
||
| Combinaison | Ratio | Conforme |
|
||
|-------------|-------|----------|
|
||
| Navy (#10183A) sur White (#FFFFFF) | 14.2:1 | ✅ AAA |
|
||
| Turquoise (#34CCCD) sur White (#FFFFFF) | 2.8:1 | ⚠️ AA Large |
|
||
| Turquoise (#34CCCD) sur Navy (#10183A) | 5.1:1 | ✅ AA |
|
||
| Green (#067224) sur White (#FFFFFF) | 6.8:1 | ✅ AA |
|
||
| Navy (#10183A) sur Light Gray (#F2F2F2) | 13.5:1 | ✅ AAA |
|
||
|
||
**Recommandations:**
|
||
- Utiliser Turquoise uniquement pour les éléments interactifs (boutons, liens) ou texte large (≥18px)
|
||
- Préférer Navy Blue pour le texte principal
|
||
- Éviter Green pour le texte de petite taille sur fond blanc
|
||
|
||
### Taille Minimale des Polices
|
||
|
||
- **Texte principal**: 16px (1rem) minimum
|
||
- **Texte secondaire**: 14px (0.875rem) minimum
|
||
- **Labels/Captions**: 12px (0.75rem) minimum
|
||
|
||
---
|
||
|
||
## 🚀 Checklist d'Implémentation
|
||
|
||
- [ ] Installer les polices Google Fonts (Manrope + Montserrat)
|
||
- [ ] Configurer Tailwind avec les couleurs custom
|
||
- [ ] Configurer Tailwind avec les font families
|
||
- [ ] Ajouter les classes CSS globales
|
||
- [ ] Créer des composants Button avec les styles
|
||
- [ ] Créer des composants Card avec les styles
|
||
- [ ] Créer des composants Badge avec les styles
|
||
- [ ] Tester l'accessibilité des contrastes
|
||
- [ ] Documenter les composants dans Storybook (optionnel)
|
||
|
||
---
|
||
|
||
## 📚 Ressources
|
||
|
||
- [Manrope sur Google Fonts](https://fonts.google.com/specimen/Manrope)
|
||
- [Montserrat sur Google Fonts](https://fonts.google.com/specimen/Montserrat)
|
||
- [Tailwind CSS Documentation](https://tailwindcss.com/docs)
|
||
- [WCAG Contrast Checker](https://webaim.org/resources/contrastchecker/)
|