theme static method

String theme({
  1. required bool useGradient,
})

Implementation

static String theme({required bool useGradient}) {
  final gradientImport =
      useGradient ? "import '../tokens/app_gradients.dart';\n" : '';
  final gradientField = useGradient
      ? '\n  static const Gradient primaryGradient = AppGradients.primary;\n'
      : '';
  final gradientNote = useGradient
      ? '\n  /// Gradients available via AppGradients (see app_gradients.dart).'
      : '';
  return '''
import 'package:flutter/material.dart';

import '../tokens/app_colors.dart';
import '../tokens/app_radius.dart';
import '../tokens/app_spacing.dart';
import '../tokens/app_typography.dart';
$gradientImport
import 'app_theme_extensions.dart';
/// App-wide ThemeData (light + dark).$gradientNote
class AppTheme {
AppTheme._();
$gradientField
static List<ThemeExtension<dynamic>> get _lightExtensions => <ThemeExtension<dynamic>>[
      AppSurfaceTheme.light,
      AppShadowTheme.light,
      AppBlurTheme.tokens,
      AppBorderTheme.light,
      AppMotionTheme.tokens,
      AppComponentTheme.tokens,
    ];

static List<ThemeExtension<dynamic>> get _darkExtensions => <ThemeExtension<dynamic>>[
      AppSurfaceTheme.dark,
      AppShadowTheme.dark,
      AppBlurTheme.tokens,
      AppBorderTheme.dark,
      AppMotionTheme.tokens,
      AppComponentTheme.tokens,
    ];

static ThemeData get light => ThemeData(
      useMaterial3: true,
      brightness: Brightness.light,
      colorScheme: const ColorScheme.light(
        primary: AppColors.primary,
        onPrimary: AppColors.onPrimary,
        secondary: AppColors.secondary,
        onSecondary: AppColors.onSecondary,
        surface: AppColors.surface,
        onSurface: AppColors.textPrimary,
        error: AppColors.error,
        onError: AppColors.onPrimary,
        outline: AppColors.outline,
      ),
      scaffoldBackgroundColor: AppColors.background,
      appBarTheme: const AppBarTheme(
        backgroundColor: AppColors.surface,
        foregroundColor: AppColors.textPrimary,
        elevation: 0,
        centerTitle: false,
      ),
      textTheme: const TextTheme(
        headlineLarge: AppTypography.display,
        headlineMedium: AppTypography.headline,
        headlineSmall: AppTypography.title,
        bodyMedium: AppTypography.body,
        bodySmall: AppTypography.caption,
        labelLarge: AppTypography.button,
      ),
      elevatedButtonTheme: ElevatedButtonThemeData(
        style: ElevatedButton.styleFrom(
          backgroundColor: AppColors.primary,
          foregroundColor: AppColors.onPrimary,
          minimumSize: const Size(48, 48),
          padding: const EdgeInsets.symmetric(
            horizontal: AppSpacing.lg,
            vertical: AppSpacing.sm,
          ),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(AppRadius.md),
          ),
          textStyle: AppTypography.button,
        ),
      ),
      inputDecorationTheme: InputDecorationTheme(
        filled: true,
        fillColor: AppColors.surfaceVariant,
        border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(AppRadius.md),
          borderSide: const BorderSide(color: AppColors.outlineVariant),
        ),
        focusedBorder: OutlineInputBorder(
          borderRadius: BorderRadius.circular(AppRadius.md),
          borderSide: const BorderSide(color: AppColors.primary, width: 2),
        ),
        errorBorder: OutlineInputBorder(
          borderRadius: BorderRadius.circular(AppRadius.md),
          borderSide: const BorderSide(color: AppColors.error),
        ),
        contentPadding: const EdgeInsets.symmetric(
          horizontal: AppSpacing.md,
          vertical: AppSpacing.sm,
        ),
      ),
      extensions: _lightExtensions,
    );

static ThemeData get dark => ThemeData(
      useMaterial3: true,
      brightness: Brightness.dark,
      colorScheme: const ColorScheme.dark(
        primary: AppColorsDark.primary,
        onPrimary: AppColorsDark.onPrimary,
        secondary: AppColorsDark.secondary,
        onSecondary: AppColorsDark.onSecondary,
        surface: AppColorsDark.surface,
        onSurface: AppColorsDark.textPrimary,
        error: AppColorsDark.error,
        onError: AppColorsDark.onPrimary,
        outline: AppColorsDark.outline,
      ),
      scaffoldBackgroundColor: AppColorsDark.background,
      appBarTheme: const AppBarTheme(
        backgroundColor: AppColorsDark.surface,
        foregroundColor: AppColorsDark.textPrimary,
        elevation: 0,
        centerTitle: false,
      ),
      extensions: _darkExtensions,
    );
}
''';
}