295 lines
9.1 KiB
Dart
295 lines
9.1 KiB
Dart
/// Design Tokens - Typographie
|
|
///
|
|
/// Système typographique sophistiqué basé sur les tendances 2024-2025
|
|
/// Hiérarchie claire et lisibilité optimale pour applications professionnelles
|
|
library typography_tokens;
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'color_tokens.dart';
|
|
|
|
/// Tokens typographiques - Système de texte moderne
|
|
class TypographyTokens {
|
|
TypographyTokens._();
|
|
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
// FAMILLES DE POLICES
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
/// Police principale - Roboto (Google Fonts, cross-platform)
|
|
static const String primaryFontFamily = 'Roboto';
|
|
|
|
/// Police display - Roboto (Google Fonts, titres)
|
|
static const String displayFontFamily = 'Roboto';
|
|
|
|
/// Police monospace - JetBrains Mono (code et données)
|
|
static const String monospaceFontFamily = 'JetBrains Mono';
|
|
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
// ÉCHELLE TYPOGRAPHIQUE - Basée sur Material Design 3
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
/// Display — Titres principaux (Roboto via GoogleFonts)
|
|
static TextStyle get displayLarge => GoogleFonts.roboto(
|
|
fontSize: 32.0,
|
|
fontWeight: FontWeight.w700,
|
|
letterSpacing: -0.5,
|
|
height: 1.2,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static TextStyle get displayMedium => GoogleFonts.roboto(
|
|
fontSize: 28.0,
|
|
fontWeight: FontWeight.w700,
|
|
letterSpacing: -0.25,
|
|
height: 1.25,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static TextStyle get displaySmall => GoogleFonts.roboto(
|
|
fontSize: 24.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.0,
|
|
height: 1.3,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
/// Headline - Titres de sections
|
|
static const TextStyle headlineLarge = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 32.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.0,
|
|
height: 1.25,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle headlineMedium = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 28.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.0,
|
|
height: 1.29,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle headlineSmall = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 24.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.0,
|
|
height: 1.33,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
/// Title - Titres de composants
|
|
static const TextStyle titleLarge = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 22.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.0,
|
|
height: 1.27,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle titleMedium = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 16.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.15,
|
|
height: 1.50,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle titleSmall = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.1,
|
|
height: 1.43,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
/// Label - Étiquettes et boutons
|
|
static const TextStyle labelLarge = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w500,
|
|
letterSpacing: 0.1,
|
|
height: 1.43,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle labelMedium = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 12.0,
|
|
fontWeight: FontWeight.w500,
|
|
letterSpacing: 0.5,
|
|
height: 1.33,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle labelSmall = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 11.0,
|
|
fontWeight: FontWeight.w500,
|
|
letterSpacing: 0.5,
|
|
height: 1.45,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
/// Body - Texte de contenu
|
|
static const TextStyle bodyLarge = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 16.0,
|
|
fontWeight: FontWeight.w400,
|
|
letterSpacing: 0.5,
|
|
height: 1.50,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle bodyMedium = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w400,
|
|
letterSpacing: 0.25,
|
|
height: 1.43,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle bodySmall = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 12.0,
|
|
fontWeight: FontWeight.w400,
|
|
letterSpacing: 0.4,
|
|
height: 1.33,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
// STYLES SPÉCIALISÉS - Interface UnionFlow
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
/// Navigation - Styles pour menu et navigation
|
|
static const TextStyle navigationLabel = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w500,
|
|
letterSpacing: 0.1,
|
|
height: 1.43,
|
|
color: ColorTokens.navigationUnselected,
|
|
);
|
|
|
|
static const TextStyle navigationLabelSelected = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.1,
|
|
height: 1.43,
|
|
color: ColorTokens.navigationSelected,
|
|
);
|
|
|
|
/// Cartes et composants
|
|
static const TextStyle cardTitle = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 18.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.0,
|
|
height: 1.33,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle cardSubtitle = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w400,
|
|
letterSpacing: 0.25,
|
|
height: 1.43,
|
|
color: ColorTokens.onSurfaceVariant,
|
|
);
|
|
|
|
static const TextStyle cardValue = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 24.0,
|
|
fontWeight: FontWeight.w700,
|
|
letterSpacing: 0.0,
|
|
height: 1.25,
|
|
color: ColorTokens.primary,
|
|
);
|
|
|
|
/// Boutons
|
|
static const TextStyle buttonLarge = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 16.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.1,
|
|
height: 1.25,
|
|
color: ColorTokens.onPrimary,
|
|
);
|
|
|
|
static const TextStyle buttonMedium = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.1,
|
|
height: 1.29,
|
|
color: ColorTokens.onPrimary,
|
|
);
|
|
|
|
static const TextStyle buttonSmall = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 12.0,
|
|
fontWeight: FontWeight.w600,
|
|
letterSpacing: 0.5,
|
|
height: 1.33,
|
|
color: ColorTokens.onPrimary,
|
|
);
|
|
|
|
/// Formulaires
|
|
static const TextStyle inputLabel = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w500,
|
|
letterSpacing: 0.1,
|
|
height: 1.43,
|
|
color: ColorTokens.onSurfaceVariant,
|
|
);
|
|
|
|
static const TextStyle inputText = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 16.0,
|
|
fontWeight: FontWeight.w400,
|
|
letterSpacing: 0.5,
|
|
height: 1.50,
|
|
color: ColorTokens.onSurface,
|
|
);
|
|
|
|
static const TextStyle inputHint = TextStyle(
|
|
fontFamily: primaryFontFamily,
|
|
fontSize: 16.0,
|
|
fontWeight: FontWeight.w400,
|
|
letterSpacing: 0.5,
|
|
height: 1.50,
|
|
color: ColorTokens.onSurfaceVariant,
|
|
);
|
|
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
// MÉTHODES UTILITAIRES
|
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
/// Applique une couleur à un style
|
|
static TextStyle withColor(TextStyle style, Color color) {
|
|
return style.copyWith(color: color);
|
|
}
|
|
|
|
/// Applique un poids de police
|
|
static TextStyle withWeight(TextStyle style, FontWeight weight) {
|
|
return style.copyWith(fontWeight: weight);
|
|
}
|
|
|
|
/// Applique une taille de police
|
|
static TextStyle withSize(TextStyle style, double size) {
|
|
return style.copyWith(fontSize: size);
|
|
}
|
|
}
|