/// Shared string keys, timings, and layout breakpoints used across the app. library; /// Human-readable name shown in the splash screen, app bars, and About tile. const String kAppName = 'IngTrak'; /// Package / Android application id. const String kPackageName = 'com.example.myapp'; /// How long the splash screen stays visible before navigating to the shell. const Duration kSplashDuration = Duration(seconds: 2); /// Base URL for the personal ingtrak FastAPI backend. /// /// Override at build/run time: /// `flutter run --dart-define=API_BASE_URL=https://ingtrak.satoshinakamoto.win` /// /// Local defaults (when override omitted): /// - Android emulator → `http://10.0.2.2:8000` /// - Physical device on LAN → `http://192.168.x.x:8000` const String kApiBaseUrl = String.fromEnvironment( 'API_BASE_URL', defaultValue: 'https://ingtrak.satoshinakamoto.win', ); /// Enable Banking redirect derived from [kApiBaseUrl]. /// Must match backend `REDIRECT_URI` and the Control Panel whitelist. /// The app opens auth in a WebView and intercepts this callback path for `code`. String get kEnableBankingRedirectUri { final base = kApiBaseUrl.endsWith('/') ? kApiBaseUrl.substring(0, kApiBaseUrl.length - 1) : kApiBaseUrl; return '$base/api/connect/callback'; } /// Optional app-scheme bounce used after the http callback (not registered /// with Enable Banking). const String kBankRedirectScheme = 'ingtrak'; const String kBankRedirectHost = 'connected'; const String kBankRedirectUri = '$kBankRedirectScheme://$kBankRedirectHost'; /// SharedPreferences keys. abstract final class StorageKeys { static const themeMode = 'theme_mode'; static const useRemoteData = 'use_remote_data'; static const txMeta = 'tx_meta_v2'; static const txMetaLegacy = 'tx_meta_v1'; static const bankCache = 'bank_cache_v1'; } /// Named routes registered on [MaterialApp]. abstract final class AppRoutes { static const splash = '/'; static const shell = '/shell'; static const itemDetail = '/item'; static const addItem = '/add-item'; } /// Width thresholds used to adapt padding and card density. abstract final class Breakpoints { static const compact = 600.0; static const medium = 840.0; } /// Maximum content width on tablets / large phones so lists stay readable. const double kMaxContentWidth = 720.0;