feat: add payment method

This commit is contained in:
2026-07-29 21:25:56 +02:00
parent cd75d3a474
commit 3cf4787e8c
14 changed files with 652 additions and 50 deletions
+319
View File
@@ -727,3 +727,322 @@ final ThemeData lightTheme = ThemeData(
),
),
);
// ---------------------------------------------------------------------------
// Ugly theme — intentionally repulsive
// ---------------------------------------------------------------------------
const _uglyFg = Color(0xFFFFF700);
const _uglyBg = Color(0xFF00FFFF);
const _uglySurface = Color(0xFFFF00FF);
const _uglyPrimary = Color(0xFFCCFF00);
const _uglySecondary = Color(0xFFFF1493);
const _uglyError = Color(0xFFFF6600);
final ThemeData uglyTheme = ThemeData(
useMaterial3: true,
brightness: Brightness.light,
colorScheme: const ColorScheme.light(
primary: _uglyPrimary,
secondary: _uglySecondary,
surface: _uglySurface,
error: _uglyError,
onPrimary: Color(0xFF0000FF),
onSecondary: _uglyFg,
onSurface: _uglyFg,
onError: Color(0xFF000000),
onSurfaceVariant: Color(0xFFFF0000),
),
scaffoldBackgroundColor: _uglyBg,
canvasColor: _uglyBg,
appBarTheme: const AppBarTheme(
elevation: 8,
shadowColor: Color(0xFFFF0000),
centerTitle: true,
backgroundColor: _uglySecondary,
foregroundColor: _uglyFg,
surfaceTintColor: _uglyError,
titleTextStyle: TextStyle(
fontSize: 30,
fontWeight: FontWeight.w900,
letterSpacing: 4,
color: _uglyFg,
fontFamily: 'monospace',
),
iconTheme: IconThemeData(color: _uglyBg, size: 30),
actionsIconTheme: IconThemeData(color: _uglyFg, size: 30),
toolbarHeight: 80,
),
iconButtonTheme: IconButtonThemeData(
style: IconButton.styleFrom(
backgroundColor: _uglyError,
foregroundColor: Colors.black,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(20),
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(0),
),
),
side: const BorderSide(color: _uglyPrimary, width: 3),
padding: const EdgeInsets.all(16),
),
),
cardTheme: CardThemeData(
color: _uglySurface,
elevation: 8,
shadowColor: _uglyPrimary,
margin: const EdgeInsets.symmetric(horizontal: 0, vertical: 18),
shape: RoundedRectangleBorder(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(4),
topRight: Radius.circular(30),
bottomLeft: Radius.circular(30),
bottomRight: Radius.circular(4),
),
side: const BorderSide(color: _uglySecondary, width: 4),
),
),
filledButtonTheme: FilledButtonThemeData(
style: FilledButton.styleFrom(
elevation: 4,
backgroundColor: _uglyPrimary,
foregroundColor: const Color(0xFF0000FF),
shadowColor: _uglyError,
disabledBackgroundColor: _uglyBg,
disabledForegroundColor: _uglyError,
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 22),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(2),
side: const BorderSide(color: _uglySecondary, width: 3),
),
textStyle: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w900,
letterSpacing: 3,
fontFamily: 'monospace',
),
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
elevation: 6,
backgroundColor: _uglyError,
foregroundColor: _uglyBg,
shadowColor: _uglyPrimary,
padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 20),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24),
side: const BorderSide(color: _uglyFg, width: 4),
),
textStyle: const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w900,
fontFamily: 'monospace',
),
),
),
outlinedButtonTheme: OutlinedButtonThemeData(
style: OutlinedButton.styleFrom(
foregroundColor: _uglyFg,
side: const BorderSide(color: _uglySecondary, width: 5),
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 18),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)),
textStyle: const TextStyle(
fontWeight: FontWeight.w900,
fontFamily: 'monospace',
),
),
),
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
foregroundColor: _uglyError,
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
textStyle: const TextStyle(fontWeight: FontWeight.w900, fontSize: 16),
),
),
inputDecorationTheme: const InputDecorationTheme(
filled: true,
fillColor: Color(0xFFAAFFAA),
hintStyle: TextStyle(
color: Color(0xFFFF0000),
fontWeight: FontWeight.w900,
fontStyle: FontStyle.italic,
fontFamily: 'monospace',
),
contentPadding: EdgeInsets.symmetric(horizontal: 24, vertical: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
bottomRight: Radius.circular(16),
),
borderSide: BorderSide(color: _uglySecondary, width: 4),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
bottomRight: Radius.circular(16),
),
borderSide: BorderSide(color: _uglyError, width: 4),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
bottomRight: Radius.circular(16),
),
borderSide: BorderSide(color: _uglyPrimary, width: 6),
),
),
dialogTheme: DialogThemeData(
backgroundColor: _uglySurface,
elevation: 16,
shadowColor: _uglyFg,
surfaceTintColor: _uglyError,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0),
side: const BorderSide(color: _uglyPrimary, width: 5),
),
titleTextStyle: const TextStyle(
color: _uglyFg,
fontSize: 26,
fontWeight: FontWeight.w900,
fontFamily: 'monospace',
),
contentTextStyle: const TextStyle(
color: _uglyBg,
fontWeight: FontWeight.w700,
height: 1.8,
),
),
floatingActionButtonTheme: const FloatingActionButtonThemeData(
backgroundColor: _uglySecondary,
foregroundColor: _uglyFg,
elevation: 8,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30),
bottomRight: Radius.circular(30),
),
side: BorderSide(color: _uglyPrimary, width: 4),
),
),
listTileTheme: ListTileThemeData(
tileColor: _uglyFg,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0),
side: const BorderSide(color: _uglySecondary, width: 3),
),
iconColor: _uglyBg,
textColor: _uglySurface,
contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
),
snackBarTheme: SnackBarThemeData(
backgroundColor: _uglyPrimary,
behavior: SnackBarBehavior.floating,
elevation: 8,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0),
side: const BorderSide(color: _uglySecondary, width: 4),
),
contentTextStyle: const TextStyle(
color: Color(0xFF0000FF),
fontWeight: FontWeight.w900,
fontFamily: 'monospace',
),
),
dividerTheme: const DividerThemeData(
color: _uglySecondary,
thickness: 5,
space: 8,
),
chipTheme: const ChipThemeData(
backgroundColor: _uglyError,
labelStyle: TextStyle(
color: _uglyFg,
fontWeight: FontWeight.w900,
fontSize: 14,
fontFamily: 'monospace',
),
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 10),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topRight: Radius.circular(20),
bottomLeft: Radius.circular(20),
),
side: BorderSide(color: _uglyPrimary, width: 3),
),
),
textTheme: const TextTheme(
displayLarge: TextStyle(
color: _uglyFg,
fontWeight: FontWeight.w900,
fontSize: 52,
letterSpacing: 5,
fontFamily: 'monospace',
),
headlineMedium: TextStyle(
color: _uglyPrimary,
fontWeight: FontWeight.w900,
fontSize: 34,
letterSpacing: 3,
fontFamily: 'monospace',
),
titleLarge: TextStyle(
color: _uglyFg,
fontWeight: FontWeight.w900,
fontSize: 26,
letterSpacing: 2,
fontFamily: 'monospace',
),
titleMedium: TextStyle(
color: _uglyPrimary,
fontWeight: FontWeight.w900,
fontSize: 20,
fontFamily: 'monospace',
),
bodyLarge: TextStyle(
color: _uglyFg,
fontSize: 18,
fontWeight: FontWeight.w700,
height: 1.8,
fontFamily: 'monospace',
),
bodyMedium: TextStyle(
color: _uglyBg,
fontWeight: FontWeight.w700,
fontSize: 14,
fontFamily: 'monospace',
),
bodySmall: TextStyle(
color: _uglyError,
fontWeight: FontWeight.w900,
fontSize: 12,
fontFamily: 'monospace',
),
labelLarge: TextStyle(
color: _uglySecondary,
fontWeight: FontWeight.w900,
fontSize: 16,
fontFamily: 'monospace',
),
),
);