onedirve and google drive

This commit is contained in:
Courtney Arnold 2026-08-14 17:30:31 -05:00
parent a9bcec09b1
commit 901ec678a3
12 changed files with 373 additions and 29 deletions

118
lib/theme/app_theme.dart Normal file
View file

@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
/// Light/dark [ThemeData] built from the forest-green palette in the
/// "Fuel Refund App" theme mockups (`themes_4.html`). Each scheme starts
/// from [ColorScheme.fromSeed] on the mockup's brand green — for full,
/// harmonious Material 3 role coverage (secondary/tertiary/error/etc.,
/// which the mockup doesn't specify) — then pins the roles the mockup
/// *does* specify (primary, surface tiers, text, outline) to its exact
/// values, so the dominant, most-visible colors match precisely.
class AppTheme {
AppTheme._();
// --- Light tokens (theme-light in themes_4.html) ---
static const _lightPrimary = Color(0xFF24603A); // --brand
static const _lightPrimaryInk = Color(0xFF1C5030); // --brand-ink
static const _lightSurface = Color(0xFFFFFFFF); // --screen / --surface
static const _lightSurfaceContainer = Color(0xFFF4F6F3); // --surface-2
static const _lightOnSurface = Color(0xFF14181A); // --text
static const _lightOnSurfaceVariant = Color(0xFF6A7377); // --text-2
static const _lightOutline = Color(0xFF8B9499); // --text-3
static const _lightOutlineVariant = Color(0xFFE9E9E4); // --line
// --- Dark tokens (theme-dark in themes_4.html) ---
static const _darkPrimary = Color(0xFF7BC47F); // --brand
static const _darkPrimaryInk = Color(0xFF9BD79E); // --brand-ink
static const _darkSurface = Color(0xFF101110); // --screen
static const _darkSurfaceContainer = Color(0xFF1A1C1A); // --surface
static const _darkSurfaceContainerHigh = Color(0xFF202320); // --surface-2
static const _darkOnSurface = Color(0xFFF2F4F1); // --text
static const _darkOnSurfaceVariant = Color(0xFF9AA39B); // --text-2
static const _darkOutline = Color(0xFF7E877F); // --text-3
static const _darkOutlineVariant = Color(0xFF262926); // --line
static ThemeData get light {
final colorScheme = ColorScheme.fromSeed(
seedColor: _lightPrimary,
brightness: Brightness.light,
).copyWith(
primary: _lightPrimary,
secondary: _lightPrimaryInk,
surface: _lightSurface,
surfaceContainerHighest: _lightSurfaceContainer,
onSurface: _lightOnSurface,
onSurfaceVariant: _lightOnSurfaceVariant,
outline: _lightOutline,
outlineVariant: _lightOutlineVariant,
);
return _themeFrom(colorScheme);
}
static ThemeData get dark {
final colorScheme = ColorScheme.fromSeed(
seedColor: _darkPrimary,
brightness: Brightness.dark,
).copyWith(
primary: _darkPrimary,
secondary: _darkPrimaryInk,
surface: _darkSurface,
surfaceContainer: _darkSurfaceContainer,
surfaceContainerHighest: _darkSurfaceContainerHigh,
onSurface: _darkOnSurface,
onSurfaceVariant: _darkOnSurfaceVariant,
outline: _darkOutline,
outlineVariant: _darkOutlineVariant,
);
return _themeFrom(colorScheme);
}
/// Component-level shaping shared by both brightnesses: the mockup's
/// rounded cards (14–15px), pill-shaped chips/badges, and hairline
/// dividers pulled from --line/--outlineVariant rather than Material's
/// default divider color.
static ThemeData _themeFrom(ColorScheme colorScheme) {
return ThemeData(
useMaterial3: true,
colorScheme: colorScheme,
scaffoldBackgroundColor: colorScheme.surface,
dividerTheme: DividerThemeData(color: colorScheme.outlineVariant, space: 1),
cardTheme: CardThemeData(
color: colorScheme.surfaceContainerHighest,
elevation: 0,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
),
chipTheme: ChipThemeData(
backgroundColor: colorScheme.primary.withValues(alpha: 0.10),
labelStyle: TextStyle(color: colorScheme.primary, fontWeight: FontWeight.w700),
shape: const StadiumBorder(),
side: BorderSide.none,
),
appBarTheme: AppBarTheme(
backgroundColor: colorScheme.surface,
foregroundColor: colorScheme.onSurface,
surfaceTintColor: Colors.transparent,
titleTextStyle: TextStyle(
color: colorScheme.onSurface,
fontSize: 18,
fontWeight: FontWeight.w700,
),
),
listTileTheme: ListTileThemeData(iconColor: colorScheme.onSurfaceVariant),
filledButtonTheme: FilledButtonThemeData(
style: FilledButton.styleFrom(
backgroundColor: colorScheme.primary,
foregroundColor: colorScheme.onPrimary,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: colorScheme.surfaceContainerHighest,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide.none,
),
),
);
}
}