diff --git a/fdroid/metadata/com.devasy.repforge.yml b/fdroid/metadata/com.devasy.repforge.yml new file mode 100644 index 0000000..7b0ab30 --- /dev/null +++ b/fdroid/metadata/com.devasy.repforge.yml @@ -0,0 +1,56 @@ +Categories: + - Sports & Health +License: Apache-2.0 +AuthorName: Devasy Patel +SourceCode: https://github.com/Devasy23/RepForge +IssueTracker: https://github.com/Devasy23/RepForge/issues + +AutoName: RepForge +Summary: Open-source workout logger with AI coaching and progress analytics +Description: |- + RepForge is a privacy-first workout logging app that helps you track sets, + reps, and weights across customizable routines. + + Features: + * Log workout sessions with sets, reps, and weights + * Visualise progress with charts (volume, strength curves) + * AI-powered set recommendations using linear regression + * Customisable exercise library with 50+ built-in exercises + * Goal tracking with ML-estimated completion dates + * Reusable workout routines + * Health Connect integration for sleep and heart rate readiness scores + * Optional AI Coach powered by Google Gemini (requires user-supplied API key) + * Full data export/import for portability + + All workout data is stored locally on-device using Hive. No account required. + No data is sent to any server unless you enable the optional AI Coach feature. + +RepoType: git +Repo: https://github.com/Devasy23/RepForge + +AntiFeatures: + NonFreeNet: + - description: > + The optional AI Coach and Routine Optimizer features send data to + Google's Gemini API (a proprietary cloud service). These features are + fully disabled unless the user provides their own Gemini API key in + Settings β†’ AI Settings. The app is fully functional as an offline + workout logger without configuring a key. + +Builds: + - versionName: 2.0.1 + versionCode: 21 + commit: v2.0.1 + subdir: workout-logger + gradle: + - release + prebuild: + - flutter pub get + build: + - flutter build apk --release --split-per-abi + +AutoUpdateMode: Version v%v +UpdateCheckMode: Tags +UpdateCheckData: workout-logger/pubspec.yaml|^version:\s+([\d.]+)\+|.| +CurrentVersion: 2.0.1 +CurrentVersionCode: 21 diff --git a/workout-logger/assets/fonts/Geist-Variable.ttf b/workout-logger/assets/fonts/Geist-Variable.ttf new file mode 100644 index 0000000..59f91f0 Binary files /dev/null and b/workout-logger/assets/fonts/Geist-Variable.ttf differ diff --git a/workout-logger/assets/fonts/GeistMono-Variable.ttf b/workout-logger/assets/fonts/GeistMono-Variable.ttf new file mode 100644 index 0000000..9a97f9b Binary files /dev/null and b/workout-logger/assets/fonts/GeistMono-Variable.ttf differ diff --git a/workout-logger/lib/screens/ai_coach_screen.dart b/workout-logger/lib/screens/ai_coach_screen.dart index 79f8145..69e3a36 100644 --- a/workout-logger/lib/screens/ai_coach_screen.dart +++ b/workout-logger/lib/screens/ai_coach_screen.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:gpt_markdown/gpt_markdown.dart'; import '../models/models.dart'; @@ -190,7 +189,7 @@ class _AiCoachViewState extends State<_AiCoachView> { children: [ Text( 'AI Coach', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -199,7 +198,7 @@ class _AiCoachViewState extends State<_AiCoachView> { ), Text( 'Powered by Gemini', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), @@ -297,7 +296,7 @@ class _AiCoachViewState extends State<_AiCoachView> { const SizedBox(height: AppSpacing.lg), Text( name != null && name.isNotEmpty ? 'Hey $name πŸ‘‹' : 'Your AI Coach', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 22, fontWeight: FontWeight.w700, @@ -308,7 +307,7 @@ class _AiCoachViewState extends State<_AiCoachView> { Text( 'Ask me anything β€” what to train today, how to break a plateau, reading your progress, anything.', textAlign: TextAlign.center, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 14, height: 1.5, @@ -393,7 +392,7 @@ class _AiCoachViewState extends State<_AiCoachView> { ), child: TextField( controller: _controller, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, ), @@ -402,7 +401,7 @@ class _AiCoachViewState extends State<_AiCoachView> { textCapitalization: TextCapitalization.sentences, decoration: InputDecoration( hintText: 'Ask your coach...', - hintStyle: GoogleFonts.geist( + hintStyle: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 14, ), @@ -515,7 +514,7 @@ class _ConversationsSheet extends StatelessWidget { children: [ Text( 'Conversations', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -534,7 +533,7 @@ class _ConversationsSheet extends StatelessWidget { const SizedBox(width: 4), Text( 'New chat', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.primary, fontSize: 13, fontWeight: FontWeight.w600, @@ -551,7 +550,7 @@ class _ConversationsSheet extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: AppSpacing.lg), child: Text( 'No saved conversations yet.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -630,7 +629,7 @@ class _ConversationTile extends StatelessWidget { conversation.title.isEmpty ? 'New chat' : conversation.title, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w500, @@ -672,7 +671,7 @@ class _SuggestionChip extends StatelessWidget { ), child: Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.primary, fontSize: 13, fontWeight: FontWeight.w500, @@ -740,7 +739,7 @@ class _MessageBubble extends StatelessWidget { child: isUser ? Text( message.text, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, height: 1.55, @@ -804,7 +803,7 @@ class _CoachMarkdown extends StatelessWidget { Widget build(BuildContext context) { return GptMarkdown( text, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, height: 1.55, diff --git a/workout-logger/lib/screens/ai_program_generator_screen.dart b/workout-logger/lib/screens/ai_program_generator_screen.dart index ded3dc5..9003bca 100644 --- a/workout-logger/lib/screens/ai_program_generator_screen.dart +++ b/workout-logger/lib/screens/ai_program_generator_screen.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../models/models.dart'; import '../services/ai/gemini_ai_service.dart'; @@ -196,7 +195,7 @@ class _AiProgramGeneratorScreenState extends State { children: [ Text( 'AI Program Generator', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -205,7 +204,7 @@ class _AiProgramGeneratorScreenState extends State { ), Text( 'Powered by Gemini', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), @@ -233,7 +232,7 @@ class _AiProgramGeneratorScreenState extends State { const SizedBox(width: 8), Text( 'Describe your program', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w700, @@ -250,7 +249,7 @@ class _AiProgramGeneratorScreenState extends State { ), child: TextField( controller: _promptCtrl, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, height: 1.5, @@ -261,7 +260,7 @@ class _AiProgramGeneratorScreenState extends State { decoration: InputDecoration( hintText: 'e.g. "12-week hypertrophy program, 4 days/week, push-pull split, intermediate level"', - hintStyle: GoogleFonts.geist( + hintStyle: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 13, height: 1.5, @@ -274,7 +273,7 @@ class _AiProgramGeneratorScreenState extends State { const SizedBox(height: AppSpacing.md), Text( 'QUICK PROMPTS', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 9, fontWeight: FontWeight.w600, @@ -300,7 +299,7 @@ class _AiProgramGeneratorScreenState extends State { ), child: Text( s, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 11, ), @@ -337,7 +336,7 @@ class _AiProgramGeneratorScreenState extends State { const SizedBox(height: AppSpacing.md), Text( _statusText, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 15, fontWeight: FontWeight.w600, @@ -346,7 +345,7 @@ class _AiProgramGeneratorScreenState extends State { const SizedBox(height: AppSpacing.xs), Text( 'Gemini is designing your training block…', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -367,7 +366,7 @@ class _AiProgramGeneratorScreenState extends State { Expanded( child: Text( _error!, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.error, fontSize: 13, ), @@ -415,7 +414,7 @@ class _AiProgramGeneratorScreenState extends State { children: [ Text( p.name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -425,7 +424,7 @@ class _AiProgramGeneratorScreenState extends State { if (p.description != null) Text( p.description!, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -456,7 +455,7 @@ class _AiProgramGeneratorScreenState extends State { const SizedBox(height: AppSpacing.md), Text( 'PHASES', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 9, fontWeight: FontWeight.w600, @@ -480,7 +479,7 @@ class _AiProgramGeneratorScreenState extends State { const SizedBox(width: 10), Text( phase.name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w500, @@ -489,7 +488,7 @@ class _AiProgramGeneratorScreenState extends State { const Spacer(), Text( 'Wk ${phase.startWeek}–${phase.endWeek}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 11, ), diff --git a/workout-logger/lib/screens/analytics_screen.dart b/workout-logger/lib/screens/analytics_screen.dart index 4a5016c..73b9764 100644 --- a/workout-logger/lib/screens/analytics_screen.dart +++ b/workout-logger/lib/screens/analytics_screen.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../models/models.dart'; import '../services/workout_provider.dart'; @@ -58,7 +57,7 @@ class _AnalyticsScreenState extends State { children: [ Text( 'INSIGHTS', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.textFaint, @@ -68,7 +67,7 @@ class _AnalyticsScreenState extends State { const SizedBox(height: 2), Text( 'Analytics', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 28, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -118,7 +117,7 @@ class _AnalyticsScreenState extends State { child: Text( _tabs[i], textAlign: TextAlign.center, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: active ? Colors.white : AppColors.textMuted, @@ -181,7 +180,7 @@ class _RecordsTabState extends State<_RecordsTab> { const SizedBox(height: 12), Text( 'No records yet', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 15, fontWeight: FontWeight.w600, @@ -190,7 +189,7 @@ class _RecordsTabState extends State<_RecordsTab> { const SizedBox(height: 4), Text( 'Finish a workout to set your first PRs', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 12), ), ], @@ -250,7 +249,7 @@ class _RecordsTabState extends State<_RecordsTab> { children: [ Text( '${allRecords.length} PRs', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 15, fontWeight: FontWeight.w700, @@ -271,7 +270,7 @@ class _RecordsTabState extends State<_RecordsTab> { ), child: Text( '$thisMonthCount this month', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.warning, fontSize: 11, fontWeight: FontWeight.w600, @@ -358,7 +357,7 @@ class _RecordsTabState extends State<_RecordsTab> { _sort == _RecordsSort.recent ? 'Recent' : 'Heaviest', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 11, fontWeight: FontWeight.w600, @@ -448,7 +447,7 @@ class _NewestPRHero extends StatelessWidget { children: [ Text( 'Latest PR', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.warning, fontSize: 10, fontWeight: FontWeight.w700, @@ -457,7 +456,7 @@ class _NewestPRHero extends StatelessWidget { ), Text( exerciseName, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 15, fontWeight: FontWeight.w700, @@ -465,7 +464,7 @@ class _NewestPRHero extends StatelessWidget { ), Text( dateStr, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, ), @@ -478,7 +477,7 @@ class _NewestPRHero extends StatelessWidget { children: [ Text( '${w % 1 == 0 ? w.toStringAsFixed(0) : w.toStringAsFixed(1)} ${settings.unitLabel}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.warning, fontSize: 18, fontWeight: FontWeight.w800, @@ -487,7 +486,7 @@ class _NewestPRHero extends StatelessWidget { ), Text( '${record.bestReps} reps', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 11, ), @@ -517,7 +516,7 @@ class _ExercisePRGroup extends StatelessWidget { padding: const EdgeInsets.only(bottom: 6, top: 4), child: Text( exerciseName, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, fontWeight: FontWeight.w700, @@ -563,7 +562,7 @@ class _FilterChip extends StatelessWidget { ), child: Text( label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: selected ? AppColors.primary : AppColors.textMuted, fontSize: 11, fontWeight: @@ -614,7 +613,7 @@ class _PRCard extends StatelessWidget { children: [ Text( exerciseName, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w600, @@ -622,7 +621,7 @@ class _PRCard extends StatelessWidget { ), Text( dateStr, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11), ), ], @@ -684,11 +683,11 @@ class _PRStat extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), const SizedBox(height: 2), Text(value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 13, fontWeight: FontWeight.w700)), diff --git a/workout-logger/lib/screens/heart_rate_detail_screen.dart b/workout-logger/lib/screens/heart_rate_detail_screen.dart index 047209e..695689d 100644 --- a/workout-logger/lib/screens/heart_rate_detail_screen.dart +++ b/workout-logger/lib/screens/heart_rate_detail_screen.dart @@ -4,7 +4,6 @@ // Week / Month / Year : daily/monthly min–max range bars with resting markers. import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -144,9 +143,9 @@ class _DayBody extends StatelessWidget { children: [ Text( 'All-day heart rate Β· 30-min bars', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), ), - Text('bpm', style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11)), + Text('bpm', style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11)), ], ), const SizedBox(height: 8), @@ -171,7 +170,7 @@ class _DayBody extends StatelessWidget { children: [ Container(width: 8, height: 8, decoration: BoxDecoration(color: c, borderRadius: BorderRadius.circular(2))), const SizedBox(width: 4), - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ); @@ -180,7 +179,7 @@ class _DayBody extends StatelessWidget { children: [ Container(width: 14, height: 2, color: c), const SizedBox(width: 4), - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ); } @@ -221,7 +220,7 @@ class _AggBody extends StatelessWidget { children: [ Text( '$unit range Β· resting ●', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), ), const SizedBox(height: 12), HrRangeChart(bars: bars, workoutDays: workoutDays), @@ -246,7 +245,7 @@ class _AggBody extends StatelessWidget { children: [ Container(width: 8, height: 8, decoration: BoxDecoration(color: c, borderRadius: BorderRadius.circular(2))), const SizedBox(width: 4), - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ); } @@ -272,12 +271,12 @@ class _Pill extends StatelessWidget { children: [ Text( label.toUpperCase(), - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 9, letterSpacing: 0.5), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 9, letterSpacing: 0.5), ), const SizedBox(height: 2), Text( value, - style: GoogleFonts.geistMono(color: color, fontSize: 16, fontWeight: FontWeight.w700), + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 16, fontWeight: FontWeight.w700), ), ], ), @@ -293,7 +292,7 @@ class _Empty extends StatelessWidget { Widget build(BuildContext context) => GlassCard( padding: const EdgeInsets.symmetric(vertical: 48, horizontal: 16), child: Center( - child: Text(message, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 13)), + child: Text(message, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 13)), ), ); } diff --git a/workout-logger/lib/screens/history_screen.dart b/workout-logger/lib/screens/history_screen.dart index a5aa3ab..7b6d5df 100644 --- a/workout-logger/lib/screens/history_screen.dart +++ b/workout-logger/lib/screens/history_screen.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../models/models.dart'; import '../services/workout_provider.dart'; @@ -137,12 +136,12 @@ class _HistoryScreenState extends State { const SizedBox(height: 12), Text( _query.isNotEmpty ? 'No results' : 'No Workout History', - style: GoogleFonts.geist(fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textMuted), ), const SizedBox(height: 4), Text( _query.isNotEmpty ? 'Try a different search term' : 'Complete a workout to see it here', - style: GoogleFonts.geist(fontSize: 13, color: AppColors.textFaint), + style: TextStyle(fontFamily: 'Geist', fontSize: 13, color: AppColors.textFaint), ), ], ), @@ -187,7 +186,7 @@ class _HistoryScreenState extends State { children: [ Text( 'LOG', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.textFaint, @@ -197,7 +196,7 @@ class _HistoryScreenState extends State { const SizedBox(height: 2), Text( 'History', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 28, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -323,7 +322,7 @@ class _HistoryScreenState extends State { children: [ Text( monthLabel, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -332,7 +331,7 @@ class _HistoryScreenState extends State { ), Text( '$monthSessions session${monthSessions == 1 ? '' : 's'}', - style: GoogleFonts.geist(fontSize: 11, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted), textAlign: TextAlign.center, ), ], @@ -387,7 +386,7 @@ class _SummaryCell extends StatelessWidget { children: [ Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 9, fontWeight: FontWeight.w600, color: AppColors.textFaint, @@ -397,7 +396,7 @@ class _SummaryCell extends StatelessWidget { const SizedBox(height: 4), Text( value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 22, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -405,7 +404,7 @@ class _SummaryCell extends StatelessWidget { ), Text( unit, - style: GoogleFonts.geist(fontSize: 10, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', fontSize: 10, color: AppColors.textMuted), ), ], ), @@ -442,10 +441,10 @@ class _SearchBar extends StatelessWidget { controller: controller, onChanged: onChanged, autofocus: true, - style: GoogleFonts.geist(color: AppColors.textPrimary, fontSize: 14), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14), decoration: InputDecoration( hintText: 'Search by date or exercise…', - hintStyle: GoogleFonts.geist(color: AppColors.textMuted, fontSize: 14), + hintStyle: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 14), prefixIcon: const Icon(Icons.search_rounded, color: AppColors.textMuted, size: 18), border: InputBorder.none, contentPadding: const EdgeInsets.symmetric(vertical: 12), @@ -482,7 +481,7 @@ class _MonthGroup extends StatelessWidget { children: [ Text( month, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textSoft, @@ -493,7 +492,7 @@ class _MonthGroup extends StatelessWidget { const SizedBox(width: 10), Text( '${sessions.length}', - style: GoogleFonts.geistMono(fontSize: 11, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'GeistMono', fontSize: 11, color: AppColors.textMuted), ), ], ), @@ -648,12 +647,12 @@ class _HistoryCard extends StatelessWidget { children: [ Text( dayAbbr.toUpperCase(), - style: GoogleFonts.geist(fontSize: 9, fontWeight: FontWeight.w600, color: AppColors.textMuted, letterSpacing: 0.6), + style: TextStyle(fontFamily: 'Geist', fontSize: 9, fontWeight: FontWeight.w600, color: AppColors.textMuted, letterSpacing: 0.6), ), const SizedBox(height: 2), Text( '$dayNum', - style: GoogleFonts.geistMono(fontSize: 20, fontWeight: FontWeight.w700, color: AppColors.textPrimary), + style: TextStyle(fontFamily: 'GeistMono', fontSize: 20, fontWeight: FontWeight.w700, color: AppColors.textPrimary), ), ], ), @@ -670,14 +669,14 @@ class _HistoryCard extends StatelessWidget { children: [ Text( routineName, - style: GoogleFonts.geist(fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary), + style: TextStyle(fontFamily: 'Geist', fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary), maxLines: 1, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 3), Text( '$exCount exercises Β· $setCount sets${duration > 0 ? ' Β· ${duration}m' : ''}', - style: GoogleFonts.geist(fontSize: 11, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted), ), ], ), @@ -691,13 +690,13 @@ class _HistoryCard extends StatelessWidget { children: [ Text( volStr, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.secondary, ), ), - Text(settings.unitLabel, style: GoogleFonts.geist(fontSize: 10, color: AppColors.textMuted)), + Text(settings.unitLabel, style: TextStyle(fontFamily: 'Geist', fontSize: 10, color: AppColors.textMuted)), ], ), ), diff --git a/workout-logger/lib/screens/home_screen.dart b/workout-logger/lib/screens/home_screen.dart index f46439f..4be9887 100644 --- a/workout-logger/lib/screens/home_screen.dart +++ b/workout-logger/lib/screens/home_screen.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../models/models.dart'; import '../services/workout_provider.dart'; @@ -248,7 +247,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( dateStr.toUpperCase(), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.textMuted, fontWeight: FontWeight.w500, @@ -258,7 +257,7 @@ class _DashboardTab extends StatelessWidget { const SizedBox(height: 4), RichText( text: TextSpan( - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 28, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -416,7 +415,7 @@ class _DashboardTab extends StatelessWidget { const SizedBox(width: 6), Text( 'STREAK', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.primary, @@ -432,7 +431,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( '$streak', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 56, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -443,7 +442,7 @@ class _DashboardTab extends StatelessWidget { const SizedBox(width: 6), Text( 'days', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 16, color: AppColors.textMuted, fontWeight: FontWeight.w500, @@ -456,7 +455,7 @@ class _DashboardTab extends StatelessWidget { streak == 0 ? 'Start your streak today' : 'Keep it going β€” you\'re on a roll', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, color: AppColors.textMuted, ), @@ -499,7 +498,7 @@ class _DashboardTab extends StatelessWidget { const SizedBox(width: 4), Text( isActive ? 'Resume' : 'Start', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: Colors.white, @@ -525,7 +524,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( weekDays[i], - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, color: AppColors.textFaint, fontWeight: FontWeight.w500, @@ -689,7 +688,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( 'Activity', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -697,7 +696,7 @@ class _DashboardTab extends StatelessWidget { ), Text( 'Last 14 weeks', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted, ), @@ -751,7 +750,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( 'Weekly muscle volume', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -759,7 +758,7 @@ class _DashboardTab extends StatelessWidget { ), Text( settings.unitLabel, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted, ), @@ -779,7 +778,7 @@ class _DashboardTab extends StatelessWidget { ? [ Text( 'No data yet', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.textMuted, ), @@ -801,14 +800,14 @@ class _DashboardTab extends StatelessWidget { children: [ Text( _capitalize(e.key.replaceAll('_', ' ')), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textSoft, ), ), Text( volStr, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 11, color: AppColors.textMuted, ), @@ -869,7 +868,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( 'Recent workouts', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -879,7 +878,7 @@ class _DashboardTab extends StatelessWidget { onTap: () => homeState?.switchTab(2), child: Text( 'See all', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.primary, fontWeight: FontWeight.w500, @@ -895,7 +894,7 @@ class _DashboardTab extends StatelessWidget { child: Center( child: Text( 'No workouts yet β€” start one!', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, color: AppColors.textMuted, ), @@ -940,7 +939,7 @@ class _DashboardTab extends StatelessWidget { s.routineId != null ? (provider.routines.cast().firstWhere((r) => r?.id == s.routineId, orElse: () => null)?.name ?? 'Workout') : 'Quick Workout', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -949,7 +948,7 @@ class _DashboardTab extends StatelessWidget { const SizedBox(height: 2), Text( '$dateStr Β· $exCount exercises Β· $setCount sets', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted, ), @@ -962,7 +961,7 @@ class _DashboardTab extends StatelessWidget { children: [ Text( volStr, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.secondary, @@ -970,7 +969,7 @@ class _DashboardTab extends StatelessWidget { ), Text( '${settings.unitLabel} vol', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, color: AppColors.textFaint, ), @@ -1034,7 +1033,7 @@ class _StatCard extends StatelessWidget { children: [ Text( item.label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted, fontWeight: FontWeight.w500, @@ -1054,7 +1053,7 @@ class _StatCard extends StatelessWidget { children: [ Text( item.value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 26, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -1063,7 +1062,7 @@ class _StatCard extends StatelessWidget { ), Text( item.unit, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textMuted, fontWeight: FontWeight.w400, @@ -1131,14 +1130,14 @@ class _RoutineSelectorSheet extends StatelessWidget { ), title: Text( 'Quick Start', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontWeight: FontWeight.w600, ), ), subtitle: Text( 'Empty workout, no routine', - style: GoogleFonts.geist(color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted), ), trailing: const Icon(Icons.play_arrow_rounded, color: AppColors.primary), onTap: onQuickStart, @@ -1161,14 +1160,14 @@ class _RoutineSelectorSheet extends StatelessWidget { ), title: Text( r.name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontWeight: FontWeight.w600, ), ), subtitle: Text( '${r.exerciseIds.length} exercises', - style: GoogleFonts.geist(color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted), ), trailing: const Icon( Icons.play_arrow_rounded, @@ -1288,7 +1287,7 @@ class _WeeklyInsightsCardState extends State<_WeeklyInsightsCard> { Expanded( child: Text( 'This Week\'s Insights', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w700, @@ -1319,7 +1318,7 @@ class _WeeklyInsightsCardState extends State<_WeeklyInsightsCard> { ) : Text( hasInsights ? 'Refresh' : 'Generate', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.primary, fontSize: 11, fontWeight: FontWeight.w600, @@ -1341,7 +1340,7 @@ class _WeeklyInsightsCardState extends State<_WeeklyInsightsCard> { else Text( insights, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 13, height: 1.6, @@ -1351,7 +1350,7 @@ class _WeeklyInsightsCardState extends State<_WeeklyInsightsCard> { const SizedBox(height: AppSpacing.sm), Text( 'Updated ${DateFormat('MMM d, h:mm a').format(updatedAt)}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 10, ), @@ -1361,7 +1360,7 @@ class _WeeklyInsightsCardState extends State<_WeeklyInsightsCard> { const SizedBox(height: AppSpacing.sm), Text( 'Tap Generate to get a personalised coaching summary for this week.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, height: 1.5, diff --git a/workout-logger/lib/screens/onboarding_screen.dart b/workout-logger/lib/screens/onboarding_screen.dart index 9bcbb9e..2837231 100644 --- a/workout-logger/lib/screens/onboarding_screen.dart +++ b/workout-logger/lib/screens/onboarding_screen.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../services/settings_provider.dart'; import '../theme/app_theme.dart'; @@ -95,7 +94,7 @@ class _WelcomePageState extends State { const SizedBox(height: AppSpacing.xl), Text( 'Welcome to\nRepForge', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 36, fontWeight: FontWeight.w800, color: AppColors.textPrimary, @@ -106,7 +105,7 @@ class _WelcomePageState extends State { const SizedBox(height: 12), Text( 'Track every rep. Beat every record.\nForge your best self.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 15, color: AppColors.textMuted, height: 1.5, @@ -115,7 +114,7 @@ class _WelcomePageState extends State { const Spacer(flex: 2), Text( 'WHAT SHOULD WE CALL YOU?', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.textFaint, @@ -127,14 +126,14 @@ class _WelcomePageState extends State { controller: _controller, autofocus: true, textCapitalization: TextCapitalization.words, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w500, ), decoration: InputDecoration( hintText: 'Your name', - hintStyle: GoogleFonts.geist(color: AppColors.textFaint), + hintStyle: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint), filled: true, fillColor: AppColors.glass2, border: OutlineInputBorder( @@ -240,7 +239,7 @@ class _VersionUpdateSheet extends StatelessWidget { children: [ Text( 'Updated to v$version', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -248,7 +247,7 @@ class _VersionUpdateSheet extends StatelessWidget { ), Text( 'RepForge is better than ever', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -321,7 +320,7 @@ class _WhatsNewItem extends StatelessWidget { children: [ Text( title, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w600, @@ -330,7 +329,7 @@ class _WhatsNewItem extends StatelessWidget { const SizedBox(height: 2), Text( description, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, height: 1.4, diff --git a/workout-logger/lib/screens/profile_screen.dart b/workout-logger/lib/screens/profile_screen.dart index 112c9bf..60ccf00 100644 --- a/workout-logger/lib/screens/profile_screen.dart +++ b/workout-logger/lib/screens/profile_screen.dart @@ -11,7 +11,6 @@ import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:intl/intl.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../services/workout_provider.dart'; import '../services/settings_provider.dart'; @@ -231,7 +230,7 @@ class _ProfileScreenState extends State ), title: Text( 'Import Backup', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontWeight: FontWeight.w700, ), @@ -239,14 +238,14 @@ class _ProfileScreenState extends State content: Text( 'This will merge the backup with your existing data. ' 'Select a .json RepForge backup file to continue.', - style: GoogleFonts.geist(color: AppColors.textSoft), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft), ), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: Text( 'Cancel', - style: GoogleFonts.geist(color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted), ), ), TextButton( @@ -254,7 +253,7 @@ class _ProfileScreenState extends State style: TextButton.styleFrom(foregroundColor: AppColors.primary), child: Text( 'Choose File', - style: GoogleFonts.geist(fontWeight: FontWeight.w600), + style: TextStyle(fontFamily: 'Geist', fontWeight: FontWeight.w600), ), ), ], @@ -322,7 +321,7 @@ class _ProfileScreenState extends State SnackBar( content: Text( message, - style: GoogleFonts.geist(color: AppColors.textPrimary), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary), ), backgroundColor: color, behavior: SnackBarBehavior.floating, @@ -484,7 +483,7 @@ class _ProfileScreenState extends State ), child: Text( 'v$_appVersion', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 11, fontWeight: FontWeight.w500, @@ -496,7 +495,7 @@ class _ProfileScreenState extends State const SizedBox(height: AppSpacing.md), Text( 'RepForge', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 30, fontWeight: FontWeight.w800, @@ -506,7 +505,7 @@ class _ProfileScreenState extends State const SizedBox(height: 2), Text( 'Settings & preferences', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 14, fontWeight: FontWeight.w400, diff --git a/workout-logger/lib/screens/routine_optimizer_screen.dart b/workout-logger/lib/screens/routine_optimizer_screen.dart index 366170c..166e649 100644 --- a/workout-logger/lib/screens/routine_optimizer_screen.dart +++ b/workout-logger/lib/screens/routine_optimizer_screen.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:gpt_markdown/gpt_markdown.dart'; import '../models/models.dart'; @@ -180,7 +179,7 @@ class _OptimizerViewState extends State<_OptimizerView> { children: [ Text( 'Optimize Routine', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -191,7 +190,7 @@ class _OptimizerViewState extends State<_OptimizerView> { widget.routine.name, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), @@ -292,7 +291,7 @@ class _OptimizerViewState extends State<_OptimizerView> { const SizedBox(height: AppSpacing.lg), Text( 'Analyzing your routine…', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 18, fontWeight: FontWeight.w700, @@ -303,7 +302,7 @@ class _OptimizerViewState extends State<_OptimizerView> { Text( 'Reviewing your history and building a personalized plan.', textAlign: TextAlign.center, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 14, height: 1.5, @@ -395,7 +394,7 @@ class _MessageBubble extends StatelessWidget { child: isUser ? Text( message.text, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, height: 1.55, @@ -461,7 +460,7 @@ class _OptimizerMarkdown extends StatelessWidget { Widget build(BuildContext context) { return GptMarkdown( text, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, height: 1.55, @@ -517,7 +516,7 @@ class _ConversationsSheet extends StatelessWidget { children: [ Text( 'Optimization History', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -529,7 +528,7 @@ class _ConversationsSheet extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: AppSpacing.lg), child: Text( 'No saved optimization sessions yet.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -617,7 +616,7 @@ class _ConversationTile extends StatelessWidget { : conversation.title, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w500, @@ -625,7 +624,7 @@ class _ConversationTile extends StatelessWidget { ), Text( '${conversation.messages.length} messages', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, ), diff --git a/workout-logger/lib/screens/routines_screen.dart b/workout-logger/lib/screens/routines_screen.dart index bad08e6..2218294 100644 --- a/workout-logger/lib/screens/routines_screen.dart +++ b/workout-logger/lib/screens/routines_screen.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../models/models.dart'; @@ -67,7 +66,7 @@ class RoutinesScreen extends StatelessWidget { children: [ Text( 'PROGRAMS', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.textFaint, @@ -77,7 +76,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(height: 2), Text( 'Routines', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 28, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -103,7 +102,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(width: 4), Text( 'New', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.primary, @@ -160,7 +159,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(width: 8), Text( 'UP NEXT Β· TODAY', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, fontWeight: FontWeight.w700, color: AppColors.primary, @@ -172,7 +171,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(height: 10), Text( routine.name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 22, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -182,7 +181,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(height: 4), Text( '$exCount exercises', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.textMuted, ), @@ -216,7 +215,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(width: 6), Text( 'Start workout', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: Colors.white, @@ -260,7 +259,7 @@ class RoutinesScreen extends StatelessWidget { children: [ Text( 'All Routines', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textSoft, @@ -275,7 +274,7 @@ class RoutinesScreen extends StatelessWidget { ), child: Text( '${routines.length}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 11, color: AppColors.textMuted, ), @@ -304,7 +303,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(height: 16), Text( 'No Routines Yet', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -313,7 +312,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(height: 6), Text( 'Create a routine to organize your workouts', - style: GoogleFonts.geist(fontSize: 13, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', fontSize: 13, color: AppColors.textMuted), textAlign: TextAlign.center, ), ], @@ -332,7 +331,7 @@ class RoutinesScreen extends StatelessWidget { children: [ Text( 'Programs', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 18, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -368,7 +367,7 @@ class RoutinesScreen extends StatelessWidget { children: [ Text( 'Browse Programs', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -376,7 +375,7 @@ class RoutinesScreen extends StatelessWidget { ), Text( 'Structured multi-week training plans', - style: GoogleFonts.geist(fontSize: 12, color: AppColors.textMuted), + style: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.textMuted), ), ], ), @@ -412,7 +411,7 @@ class RoutinesScreen extends StatelessWidget { const SizedBox(width: 6), Text( 'New Routine', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w500, color: AppColors.textMuted, @@ -473,7 +472,7 @@ class _RoutineCard extends StatelessWidget { children: [ Text( routine.name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -482,7 +481,7 @@ class _RoutineCard extends StatelessWidget { const SizedBox(height: 3), Text( '$exCount exercise${exCount == 1 ? '' : 's'}', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.textMuted, ), diff --git a/workout-logger/lib/screens/sleep_detail_screen.dart b/workout-logger/lib/screens/sleep_detail_screen.dart index ccc6f1c..13a38c1 100644 --- a/workout-logger/lib/screens/sleep_detail_screen.dart +++ b/workout-logger/lib/screens/sleep_detail_screen.dart @@ -5,7 +5,6 @@ // 8h goal line and workout-day highlights. import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -140,7 +139,7 @@ class _DayBody extends StatelessWidget { children: [ Text( 'Asleep Β· ${_fmt(_ist(snapshot.sleepStart))} – ${_fmt(_ist(snapshot.sleepEnd))} IST', - style: GoogleFonts.geist(color: AppColors.textMuted, fontSize: 12), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12), ), const SizedBox(height: 16), SleepHrDayView(snapshot: snapshot), @@ -180,11 +179,11 @@ class _AggBody extends StatelessWidget { children: [ Text( 'Sleep duration Β· $unit', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), ), Text( withData.isEmpty ? 'β€”' : 'avg $avgLabel', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w700, @@ -220,7 +219,7 @@ class _AggBody extends StatelessWidget { decoration: BoxDecoration(color: c, borderRadius: BorderRadius.circular(2)), ), const SizedBox(width: 4), - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ); @@ -229,7 +228,7 @@ class _AggBody extends StatelessWidget { children: [ Container(width: 14, height: 2, color: c), const SizedBox(width: 4), - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ); } @@ -252,7 +251,7 @@ class _Empty extends StatelessWidget { child: Center( child: Text( message, - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 13), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 13), ), ), ); diff --git a/workout-logger/lib/screens/widgets/analytics_overview.dart b/workout-logger/lib/screens/widgets/analytics_overview.dart index 8c4065f..cb2a286 100644 --- a/workout-logger/lib/screens/widgets/analytics_overview.dart +++ b/workout-logger/lib/screens/widgets/analytics_overview.dart @@ -9,7 +9,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:intl/intl.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/models.dart'; import '../../services/workout_provider.dart'; @@ -159,7 +158,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { children: [ Text( 'Volume Trend', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w600, @@ -168,7 +167,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { const SizedBox(height: 2), Text( '${settings.unitLabel} Β· per week', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), @@ -196,7 +195,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { const SizedBox(width: 2), Text( '${deltaPct.abs().toStringAsFixed(0)}% vs prev ${weeks}w', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: deltaPct >= 0 ? AppColors.success : AppColors.error, fontSize: 11, fontWeight: FontWeight.w600, @@ -232,7 +231,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { final ws = weekStartFor(i); return LineTooltipItem( '$volStr ${settings.unitLabel}', - GoogleFonts.geistMono( + TextStyle(fontFamily: 'GeistMono', color: AppColors.primary, fontSize: 13, fontWeight: FontWeight.w700, @@ -241,7 +240,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { TextSpan( text: '\nwk of ${DateFormat('MMM d').format(ws)}', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.normal, @@ -269,7 +268,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { padding: const EdgeInsets.only(top: 6), child: Text( DateFormat('d/M').format(weekStartFor(i)), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 9, ), @@ -284,7 +283,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { reservedSize: 40, getTitlesWidget: (v, _) => Text( _fmtK(v), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 9, ), @@ -306,7 +305,7 @@ class _VolumeTrendCardState extends State<_VolumeTrendCard> { direction: LabelDirection.horizontal, alignment: Alignment.topRight, padding: const EdgeInsets.only(right: 6, bottom: 2), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.warning, fontSize: 9, fontWeight: FontWeight.w600, @@ -388,7 +387,7 @@ class _RangeToggle extends StatelessWidget { ), child: Text( r.label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 11, fontWeight: FontWeight.w700, color: active ? Colors.white : AppColors.textMuted, @@ -557,7 +556,7 @@ class _MuscleFocusRow extends StatelessWidget { Expanded( child: Text( name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, fontWeight: FontWeight.w500, @@ -566,7 +565,7 @@ class _MuscleFocusRow extends StatelessWidget { ), Text( '${_fmtK(displayVol)} ${settings.unitLabel}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 11, ), @@ -591,7 +590,7 @@ class _MuscleFocusRow extends StatelessWidget { const SizedBox(width: 8), Text( '${recovery!.recoveryPercent}%', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 10, fontWeight: FontWeight.w600, color: _recoveryColor, @@ -663,7 +662,7 @@ class _FrequencyGrid extends StatelessWidget { child: Center( child: Text( '$count', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: active ? AppColors.primary : AppColors.textMuted, fontSize: 22, fontWeight: FontWeight.w700, @@ -674,7 +673,7 @@ class _FrequencyGrid extends StatelessWidget { const SizedBox(height: 6), Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, ), @@ -713,7 +712,7 @@ class _ChartCard extends StatelessWidget { children: [ Text( title, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w600, @@ -723,7 +722,7 @@ class _ChartCard extends StatelessWidget { const SizedBox(height: 2), Text( subtitle!, - style: GoogleFonts.geist(color: AppColors.textMuted, fontSize: 11), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11), ), ], if (isEmpty) ...[ @@ -750,9 +749,9 @@ class _EmptyChart extends StatelessWidget { const Icon(Icons.show_chart_rounded, size: 32, color: AppColors.textFaint), const SizedBox(height: 8), Text('No data yet', - style: GoogleFonts.geist(fontSize: 13, color: AppColors.textMuted)), + style: TextStyle(fontFamily: 'Geist', fontSize: 13, color: AppColors.textMuted)), Text('Complete workouts to see progress', - style: GoogleFonts.geist(fontSize: 11, color: AppColors.textFaint)), + style: TextStyle(fontFamily: 'Geist', fontSize: 11, color: AppColors.textFaint)), ], ), ); diff --git a/workout-logger/lib/screens/widgets/calendar_grid.dart b/workout-logger/lib/screens/widgets/calendar_grid.dart index 2858b43..0959025 100644 --- a/workout-logger/lib/screens/widgets/calendar_grid.dart +++ b/workout-logger/lib/screens/widgets/calendar_grid.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../theme/app_theme.dart'; class CalendarDayData { @@ -43,7 +42,7 @@ class CalendarMonthGrid extends StatelessWidget { child: Center( child: Text( d, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, fontWeight: FontWeight.w600, color: AppColors.textFaint, @@ -206,7 +205,7 @@ class _DayCell extends StatelessWidget { Center( child: Text( '$day', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 12, fontWeight: intensity > 0 ? FontWeight.w600 : FontWeight.w400, diff --git a/workout-logger/lib/screens/widgets/exercise_input_section.dart b/workout-logger/lib/screens/widgets/exercise_input_section.dart index 483674a..687809d 100644 --- a/workout-logger/lib/screens/widgets/exercise_input_section.dart +++ b/workout-logger/lib/screens/widgets/exercise_input_section.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/models.dart'; import '../../services/settings_provider.dart'; import '../../theme/app_theme.dart'; @@ -368,7 +367,7 @@ class _NumberInputCardState extends State<_NumberInputCard> { children: [ Text( widget.label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, fontWeight: FontWeight.w600, @@ -389,7 +388,7 @@ class _NumberInputCardState extends State<_NumberInputCard> { child: TextField( controller: _controller, focusNode: _focusNode, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 36, fontWeight: FontWeight.w700, @@ -687,7 +686,7 @@ class _PreviousSetsSection extends StatelessWidget { children: [ Text( 'THIS SESSION', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10, fontWeight: FontWeight.w600, @@ -820,7 +819,7 @@ class _LastSessionSection extends StatelessWidget { children: [ Text( 'LAST SESSION', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10, fontWeight: FontWeight.w600, diff --git a/workout-logger/lib/screens/widgets/exercise_progress_view.dart b/workout-logger/lib/screens/widgets/exercise_progress_view.dart index db7508a..b56ec6c 100644 --- a/workout-logger/lib/screens/widgets/exercise_progress_view.dart +++ b/workout-logger/lib/screens/widgets/exercise_progress_view.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:intl/intl.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/models.dart'; import '../../services/workout_provider.dart'; @@ -71,7 +70,7 @@ class _ExerciseProgressViewState extends State { child: Center( child: Text( 'Select an exercise above', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 14, ), @@ -173,7 +172,7 @@ class _ExerciseDropdown extends StatelessWidget { hasSelection ? getExerciseName(selected!) : 'Pick an exercise…', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: hasSelection ? AppColors.textPrimary : AppColors.textMuted, @@ -275,7 +274,7 @@ class _ExercisePickerSheetState extends State<_ExercisePickerSheet> { children: [ Text( 'Select Exercise', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 17, fontWeight: FontWeight.w700, @@ -284,7 +283,7 @@ class _ExercisePickerSheetState extends State<_ExercisePickerSheet> { const Spacer(), Text( '${widget.ids.length} logged', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 12, ), @@ -305,13 +304,13 @@ class _ExercisePickerSheetState extends State<_ExercisePickerSheet> { child: TextField( controller: _search, autofocus: true, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, ), decoration: InputDecoration( hintText: 'Search…', - hintStyle: GoogleFonts.geist( + hintStyle: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 14, ), @@ -345,7 +344,7 @@ class _ExercisePickerSheetState extends State<_ExercisePickerSheet> { ? Center( child: Text( 'No exercises match', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -382,7 +381,7 @@ class _ExercisePickerSheetState extends State<_ExercisePickerSheet> { Expanded( child: Text( name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: isSelected ? AppColors.primary : AppColors.textSoft, @@ -505,14 +504,14 @@ class _OneRMCard extends StatelessWidget { children: [ Text( 'Estimated 1RM', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), ), Text( settings.formatWeight(oneRM), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.primary, fontSize: 28, fontWeight: FontWeight.w800, @@ -527,14 +526,14 @@ class _OneRMCard extends StatelessWidget { children: [ Text( 'Epley formula', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, ), ), Text( 'Best across sets', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, ), @@ -578,7 +577,7 @@ class _GrowthCard extends StatelessWidget { children: [ Text( isGrowing ? 'Growing!' : 'Plateau', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: color, fontSize: 17, fontWeight: FontWeight.w700, @@ -588,7 +587,7 @@ class _GrowthCard extends StatelessWidget { isGrowing ? '+${settings.toDisplay(model.slope.abs() * 7).toStringAsFixed(1)} ${settings.unitLabel}/week' : 'Volume trend is flat', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, ), @@ -601,7 +600,7 @@ class _GrowthCard extends StatelessWidget { children: [ Text( 'RΒ² ${(model.r2 * 100).toStringAsFixed(0)}%', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 13, fontWeight: FontWeight.w700, @@ -609,7 +608,7 @@ class _GrowthCard extends StatelessWidget { ), Text( 'model fit', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, ), @@ -655,7 +654,7 @@ class _ChartSection extends StatelessWidget { chartMode == _ChartMode.volume ? 'Volume Progression' : 'Set Progression', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w600, @@ -708,7 +707,7 @@ class _ChartModeToggle extends StatelessWidget { ), child: Text( mode == _ChartMode.volume ? 'Volume' : 'Sets', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 11, fontWeight: FontWeight.w700, color: mode == value ? Colors.white : AppColors.textMuted, @@ -883,7 +882,7 @@ class _VolumeChart extends StatelessWidget { : ''; return LineTooltipItem( '$volStr ${settings.unitLabel}', - GoogleFonts.geistMono( + TextStyle(fontFamily: 'GeistMono', color: AppColors.secondary, fontSize: 13, fontWeight: FontWeight.w700, @@ -891,7 +890,7 @@ class _VolumeChart extends StatelessWidget { children: [ TextSpan( text: '\n$dateStr', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.normal, @@ -919,7 +918,7 @@ class _VolumeChart extends StatelessWidget { : v.toStringAsFixed(0); return Text( label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 9, ), @@ -942,7 +941,7 @@ class _VolumeChart extends StatelessWidget { direction: LabelDirection.horizontal, alignment: Alignment.topRight, padding: const EdgeInsets.only(right: 4, bottom: 2), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.warning, fontSize: 9, fontWeight: FontWeight.w600, @@ -1130,12 +1129,12 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { w % 1 == 0 ? w.toStringAsFixed(0) : w.toStringAsFixed(1); return BarTooltipItem( '$setLabel $wStr ${settings.unitLabel}', - GoogleFonts.geistMono( + TextStyle(fontFamily: 'GeistMono', color: _wc, fontSize: 12, fontWeight: FontWeight.w700), children: [ TextSpan( text: '\n$dateLabel', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10, fontWeight: FontWeight.normal), @@ -1145,12 +1144,12 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { } else { return BarTooltipItem( '$setLabel ${set.reps} reps', - GoogleFonts.geistMono( + TextStyle(fontFamily: 'GeistMono', color: _rc, fontSize: 12, fontWeight: FontWeight.w700), children: [ TextSpan( text: '\n$dateLabel', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10, fontWeight: FontWeight.normal), @@ -1256,7 +1255,7 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { leftTitles: AxisTitles( axisNameWidget: Text( settings.unitLabel, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: _wc, fontSize: 9, fontWeight: FontWeight.w700), @@ -1269,7 +1268,7 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { v >= 1000 ? '${(v / 1000).toStringAsFixed(1)}k' : v.toStringAsFixed(0), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: _wc.withValues(alpha: 0.7), fontSize: 9), ), @@ -1278,7 +1277,7 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { rightTitles: AxisTitles( axisNameWidget: Text( 'reps', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: _rc, fontSize: 9, fontWeight: FontWeight.w700), @@ -1291,7 +1290,7 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { final r = (v / scale).round(); if (r <= 0) return const Text(''); return Text('$r', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: _rc.withValues(alpha: 0.7), fontSize: 9)); }, @@ -1313,7 +1312,7 @@ class _SetProgressionChartState extends State<_SetProgressionChart> { return Padding( padding: const EdgeInsets.only(top: 6), child: Text(label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 9)), ); @@ -1368,7 +1367,7 @@ class _ToggleLegend extends StatelessWidget { const SizedBox(width: 5), Text( label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: active ? AppColors.textSoft : AppColors.textFaint, fontSize: 11, ), @@ -1411,7 +1410,7 @@ class _SetModeToggle extends StatelessWidget { ), child: Text( mode == _SetViewMode.recent ? 'Recent' : 'Weekly', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 10, fontWeight: FontWeight.w700, color: mode == value ? Colors.white : AppColors.textMuted, @@ -1447,7 +1446,7 @@ class _SessionHistory extends StatelessWidget { children: [ Text( 'Session History', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w600, @@ -1463,14 +1462,14 @@ class _SessionHistory extends StatelessWidget { children: [ Text( DateFormat('MMM d, yyyy').format(entry.date), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 13, ), ), Text( '${displayVol.toStringAsFixed(0)} ${settings.unitLabel}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w600, diff --git a/workout-logger/lib/screens/widgets/health_bar_chart.dart b/workout-logger/lib/screens/widgets/health_bar_chart.dart index 1974cd3..de0b1b2 100644 --- a/workout-logger/lib/screens/widgets/health_bar_chart.dart +++ b/workout-logger/lib/screens/widgets/health_bar_chart.dart @@ -9,7 +9,6 @@ import 'dart:math' show max; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/sleep_hr_models.dart'; import '../../theme/app_theme.dart'; @@ -251,7 +250,7 @@ class _HrDayPainter extends CustomPainter { final gridPaint = Paint() ..color = AppColors.glassBorder ..strokeWidth = 0.5; - final yStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final yStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); for (var v = (axisMin / 30).ceil() * 30.0; v <= axisMax; v += 30) { final y = yFor(v); canvas.drawLine(Offset(_padLeft, y), Offset(size.width - 4, y), gridPaint); @@ -293,7 +292,7 @@ class _HrDayPainter extends CustomPainter { } // X-axis time labels (12a / 6a / 12p / 6p / 11p). - final labelStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final labelStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); const marks = ['12a', '6a', '12p', '6p', '11p']; for (var i = 0; i < marks.length; i++) { final x = _padLeft + (i / (marks.length - 1)) * chartW; @@ -312,7 +311,7 @@ class _HrDayPainter extends CustomPainter { final mm = t.minute.toString().padLeft(2, '0'); final ap = t.hour < 12 ? 'AM' : 'PM'; final lines = ['$h12:$mm $ap', '${b.minBpm}–${b.maxBpm} bpm', 'avg ${b.avgBpm.round()}']; - final lineStyle = GoogleFonts.geistMono(color: Colors.white, fontSize: 9.5); + final lineStyle = TextStyle(fontFamily: 'GeistMono', color: Colors.white, fontSize: 9.5); final painters = lines .map((l) => TextPainter(text: TextSpan(text: l, style: lineStyle), textDirection: TextDirection.ltr)..layout()) .toList(); @@ -391,7 +390,7 @@ class _AggBarChartState extends State<_AggBarChart> { child: Center( child: Text( 'No data for this range.', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 12), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 12), ), ), ); @@ -468,7 +467,7 @@ class _AggPainter extends CustomPainter { final gridPaint = Paint() ..color = AppColors.glassBorder ..strokeWidth = 0.5; - final yStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final yStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); for (var v = (axisMin / gridStep).ceil() * gridStep; v <= axisMax; v += gridStep) { final y = yFor(v); canvas.drawLine(Offset(_padLeft, y), Offset(size.width - 4, y), gridPaint); @@ -491,7 +490,7 @@ class _AggPainter extends CustomPainter { } final baselineY = yFor(axisMin); - final labelStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final labelStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); final labelEvery = n > 16 ? 5 : (n > 10 ? 2 : 1); for (var i = 0; i < n; i++) { @@ -574,7 +573,7 @@ class _AggPainter extends CustomPainter { void _paintTooltip(Canvas canvas, Size size, int idx, double slotW, double Function(double) yFor) { final bar = bars[idx]; - final lineStyle = GoogleFonts.geistMono(color: Colors.white, fontSize: 9.5); + final lineStyle = TextStyle(fontFamily: 'GeistMono', color: Colors.white, fontSize: 9.5); final painters = bar.tooltip .map((l) => TextPainter( text: TextSpan(text: l, style: lineStyle), diff --git a/workout-logger/lib/screens/widgets/health_detail_shell.dart b/workout-logger/lib/screens/widgets/health_detail_shell.dart index 0529699..fbac10c 100644 --- a/workout-logger/lib/screens/widgets/health_detail_shell.dart +++ b/workout-logger/lib/screens/widgets/health_detail_shell.dart @@ -3,7 +3,6 @@ // Day/Week/Month/Year granularity toggle. The body is supplied by each screen. import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/sleep_hr_models.dart'; import '../../theme/app_theme.dart'; @@ -95,7 +94,7 @@ class HealthDetailShell extends StatelessWidget { const SizedBox(width: 5), Text( title, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -107,7 +106,7 @@ class HealthDetailShell extends StatelessWidget { const SizedBox(height: 1), Text( dateLabel, - style: GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 11), + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 11), ), ], ), @@ -189,7 +188,7 @@ class _GranularityToggle extends StatelessWidget { alignment: Alignment.center, child: Text( g.label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, fontWeight: FontWeight.w600, color: active ? AppColors.textPrimary : AppColors.textMuted, diff --git a/workout-logger/lib/screens/widgets/heart_rate_card.dart b/workout-logger/lib/screens/widgets/heart_rate_card.dart index 4487caf..ce77cf3 100644 --- a/workout-logger/lib/screens/widgets/heart_rate_card.dart +++ b/workout-logger/lib/screens/widgets/heart_rate_card.dart @@ -6,7 +6,6 @@ import 'dart:math' show max, min; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../../models/sleep_hr_models.dart'; @@ -47,7 +46,7 @@ class HeartRateCard extends StatelessWidget { const SizedBox(width: 5), Text( 'Heart rate', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w700, @@ -59,7 +58,7 @@ class HeartRateCard extends StatelessWidget { const SizedBox(height: 2), Text( 'Today Β· all-day', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11), ), ], ), @@ -92,7 +91,7 @@ class HeartRateCard extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: ['12a', '6a', '12p', '6p', 'now'] - .map((l) => Text(l, style: GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8))) + .map((l) => Text(l, style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8))) .toList(), ), ], @@ -116,14 +115,14 @@ class _MiniStat extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), const SizedBox(height: 1), RichText( text: TextSpan( children: [ TextSpan( text: value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 18, fontWeight: FontWeight.w700, @@ -132,7 +131,7 @@ class _MiniStat extends StatelessWidget { ), TextSpan( text: ' $unit', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10), ), ], ), diff --git a/workout-logger/lib/screens/widgets/muscle_detail_sheet.dart b/workout-logger/lib/screens/widgets/muscle_detail_sheet.dart index 832411b..1270ca1 100644 --- a/workout-logger/lib/screens/widgets/muscle_detail_sheet.dart +++ b/workout-logger/lib/screens/widgets/muscle_detail_sheet.dart @@ -8,7 +8,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widget_previews.dart'; import 'package:provider/provider.dart'; import 'package:fl_chart/fl_chart.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import '../../services/workout_provider.dart'; @@ -89,7 +88,7 @@ class MuscleDetailSheet extends StatelessWidget { Expanded( child: Text( name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 22, fontWeight: FontWeight.w800, @@ -117,7 +116,7 @@ class MuscleDetailSheet extends StatelessWidget { const SizedBox(width: 5), Text( recoveryLabel, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: recoveryColor, fontSize: 12, fontWeight: FontWeight.w700, @@ -137,7 +136,7 @@ class MuscleDetailSheet extends StatelessWidget { : recovery.isUnderRecovered ? 'Still fatigued β€” consider rest' : 'Recovering', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -153,7 +152,7 @@ class MuscleDetailSheet extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: AppSpacing.lg), child: Text( 'No sessions logged for this muscle in the last 7 days.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -200,7 +199,7 @@ class MuscleDetailSheet extends StatelessWidget { Expanded( child: Text( ex.name, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 13, fontWeight: FontWeight.w500, @@ -209,7 +208,7 @@ class MuscleDetailSheet extends StatelessWidget { ), Text( '$volStr ${settings.unitLabel}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 12, fontWeight: FontWeight.w600, @@ -299,7 +298,7 @@ class _VolumeTrendChartView extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: AppSpacing.md), child: Text( 'Not enough data yet.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -327,7 +326,7 @@ class _VolumeTrendChartView extends StatelessWidget { if (i != 0 && i != series.length - 1) return const SizedBox.shrink(); return Text( DateFormat('MMM d').format(series[i].weekStart), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 9, ), @@ -419,7 +418,7 @@ class _RecentSessionsView extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: AppSpacing.md), child: Text( 'No sessions recorded for this muscle yet.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -450,7 +449,7 @@ class _RecentSessionsView extends StatelessWidget { children: [ Text( _relativeDate(s.date), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.w600, @@ -459,7 +458,7 @@ class _RecentSessionsView extends StatelessWidget { const SizedBox(height: 2), Text( s.exerciseNames.join(' Β· '), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, fontWeight: FontWeight.w500, @@ -472,7 +471,7 @@ class _RecentSessionsView extends StatelessWidget { ), Text( '$volStr $unitLabel', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 12, fontWeight: FontWeight.w600, @@ -684,7 +683,7 @@ class _AiInsightSectionState extends State<_AiInsightSection> { const SizedBox(width: 5), Text( 'AI Insight', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.primary, fontSize: 11, fontWeight: FontWeight.w700, @@ -696,7 +695,7 @@ class _AiInsightSectionState extends State<_AiInsightSection> { const SizedBox(height: 6), Text( _insight!, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 13, height: 1.5, @@ -707,7 +706,7 @@ class _AiInsightSectionState extends State<_AiInsightSection> { onTap: () => _openCoach(context), child: Text( 'Continue in Coach β†’', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.secondary, fontSize: 12, fontWeight: FontWeight.w600, diff --git a/workout-logger/lib/screens/widgets/profile_sections.dart b/workout-logger/lib/screens/widgets/profile_sections.dart index 78000c5..55a0c0e 100644 --- a/workout-logger/lib/screens/widgets/profile_sections.dart +++ b/workout-logger/lib/screens/widgets/profile_sections.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../../services/debug_log_buffer.dart'; @@ -59,7 +58,7 @@ class _ProfileSection extends StatelessWidget { children: [ Text( title, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontWeight: FontWeight.w700, fontSize: 14, @@ -68,7 +67,7 @@ class _ProfileSection extends StatelessWidget { ), Text( subtitle, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, fontWeight: FontWeight.w400, @@ -174,7 +173,7 @@ class PreferencesSection extends StatelessWidget { ), child: Text( label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: selected ? AppColors.primary : AppColors.textSoft, fontWeight: selected ? FontWeight.w700 : FontWeight.w400, fontSize: 12, @@ -197,7 +196,7 @@ class PreferencesSection extends StatelessWidget { children: [ Text( 'Show estimated 1RM', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w500, @@ -206,7 +205,7 @@ class PreferencesSection extends StatelessWidget { const SizedBox(height: 2), Text( 'Display 1-rep max badge on completed sets', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -268,7 +267,7 @@ class HealthConnectSection extends StatelessWidget { children: [ Text( 'Sync workouts after finishing', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w500, @@ -277,7 +276,7 @@ class HealthConnectSection extends StatelessWidget { const SizedBox(height: 2), Text( 'Writes session + per-set reps to Health Connect', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -303,7 +302,7 @@ class HealthConnectSection extends StatelessWidget { const SizedBox(width: 8), Text( 'Connected β€” syncing after each workout', - style: GoogleFonts.geist(color: _hcColor, fontSize: 12), + style: TextStyle(fontFamily: 'Geist', color: _hcColor, fontSize: 12), ), ], ), @@ -319,7 +318,7 @@ class HealthConnectSection extends StatelessWidget { children: [ Text( 'Readiness insights', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w500, @@ -328,7 +327,7 @@ class HealthConnectSection extends StatelessWidget { const SizedBox(height: 2), Text( 'Reads sleep & heart data to score daily recovery', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -436,13 +435,13 @@ class CloudSyncSection extends StatelessWidget { ), child: TextField( enabled: false, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 12, ), decoration: InputDecoration( hintText: 'mongodb+srv://user:pass@cluster.mongodb.net/db', - hintStyle: GoogleFonts.geistMono( + hintStyle: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 12, ), @@ -462,7 +461,7 @@ class CloudSyncSection extends StatelessWidget { const SizedBox(height: AppSpacing.sm), Text( 'Cloud sync with custom MongoDB will be available in a future update.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, fontStyle: FontStyle.italic, @@ -557,7 +556,7 @@ class _SectionLabel extends StatelessWidget { Widget build(BuildContext context) { return Text( text, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 9, fontWeight: FontWeight.w600, @@ -609,7 +608,7 @@ class _UnitToggleButton extends StatelessWidget { child: Center( child: Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: selected ? AppColors.primary : AppColors.textSoft, fontWeight: selected ? FontWeight.w700 : FontWeight.w500, fontSize: 14, @@ -668,7 +667,7 @@ class _ActionTile extends StatelessWidget { children: [ Text( title, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w500, @@ -676,7 +675,7 @@ class _ActionTile extends StatelessWidget { ), Text( subtitle, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -727,7 +726,7 @@ class _InfoTile extends StatelessWidget { const SizedBox(width: 12), Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 13, ), @@ -735,7 +734,7 @@ class _InfoTile extends StatelessWidget { const Spacer(), Text( value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textSoft, fontSize: 12, fontWeight: FontWeight.w500, @@ -826,7 +825,7 @@ class _AiSettingsSectionState extends State { ), child: Text( 'Active', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.success, fontSize: 10, fontWeight: FontWeight.w600, @@ -854,13 +853,13 @@ class _AiSettingsSectionState extends State { enableSuggestions: false, autocorrect: false, keyboardType: TextInputType.visiblePassword, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 12, ), decoration: InputDecoration( hintText: 'AIza…', - hintStyle: GoogleFonts.geistMono( + hintStyle: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 12, ), @@ -889,7 +888,7 @@ class _AiSettingsSectionState extends State { const SizedBox(height: AppSpacing.sm), Text( 'Get a free key at aistudio.google.com. Stored locally on-device.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, fontStyle: FontStyle.italic, @@ -923,7 +922,7 @@ class _AiSettingsSectionState extends State { ), child: Text( label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: selected ? AppColors.primary : AppColors.textSoft, fontWeight: selected ? FontWeight.w700 : FontWeight.w400, fontSize: 11, @@ -962,7 +961,7 @@ class _AiSettingsSectionState extends State { ) : Text( 'Save API Key', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.primary, fontSize: 13, fontWeight: FontWeight.w600, @@ -981,7 +980,7 @@ class _AiSettingsSectionState extends State { onTap: () => context.read().resetUsage(), child: Text( 'Reset', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.accent, fontSize: 11, fontWeight: FontWeight.w600, @@ -1013,7 +1012,7 @@ class _AiSettingsSectionState extends State { const SizedBox(height: AppSpacing.sm), Text( 'Cumulative billable tokens across coach, program builder & insights.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, fontStyle: FontStyle.italic, @@ -1038,11 +1037,11 @@ class _UsageRow extends StatelessWidget { children: [ Text( label, - style: GoogleFonts.geist(color: AppColors.textMuted, fontSize: 12), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12), ), Text( value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 12, fontWeight: FontWeight.w600, @@ -1084,7 +1083,7 @@ class _DebugLogSheet extends StatelessWidget { children: [ Text( 'Debug Logs', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontWeight: FontWeight.w700, fontSize: 14, @@ -1095,7 +1094,7 @@ class _DebugLogSheet extends StatelessWidget { onPressed: () => DebugLogBuffer.instance.clear(), child: Text( 'Clear', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.accent, fontSize: 12, fontWeight: FontWeight.w600, @@ -1119,7 +1118,7 @@ class _DebugLogSheet extends StatelessWidget { return Center( child: Text( 'No logs yet', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 13), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 13), ), ); } @@ -1141,7 +1140,7 @@ class _DebugLogSheet extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 1), child: Text( line, - style: GoogleFonts.geistMono(fontSize: 10, color: color), + style: TextStyle(fontFamily: 'GeistMono', fontSize: 10, color: color), ), ); }, @@ -1170,7 +1169,7 @@ class _ComingSoonBadge extends StatelessWidget { ), child: Text( 'Soon', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.warning, fontSize: 10, fontWeight: FontWeight.w600, diff --git a/workout-logger/lib/screens/widgets/readiness_card.dart b/workout-logger/lib/screens/widgets/readiness_card.dart index 2c42625..521243e 100644 --- a/workout-logger/lib/screens/widgets/readiness_card.dart +++ b/workout-logger/lib/screens/widgets/readiness_card.dart @@ -5,7 +5,6 @@ // (or with the feature disabled) never see an empty state. import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../../models/models.dart'; @@ -62,7 +61,7 @@ class ReadinessCard extends StatelessWidget { children: [ Text( _headline(snapshot.band!), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w700, @@ -72,7 +71,7 @@ class ReadinessCard extends StatelessWidget { const SizedBox(height: 3), Text( _subtitle(snapshot), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), @@ -173,7 +172,7 @@ class _ScoreRing extends StatelessWidget { ), Text( '$score', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textPrimary, fontSize: 16, fontWeight: FontWeight.w700, @@ -213,7 +212,7 @@ class _ReadinessDetailsSheet extends StatelessWidget { const SizedBox(height: 18), Text( 'Readiness Β· ${snapshot.score}', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 18, fontWeight: FontWeight.w700, @@ -223,7 +222,7 @@ class _ReadinessDetailsSheet extends StatelessWidget { const SizedBox(height: 4), Text( 'As of $time, from your watch via Health Connect', - style: GoogleFonts.geist(color: AppColors.textMuted, fontSize: 12), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12), ), const SizedBox(height: 18), if (snapshot.sleepScore != null) @@ -252,7 +251,7 @@ class _ReadinessDetailsSheet extends StatelessWidget { 'Each factor compares last night and this morning to your own ' '14-day average β€” only dips below your normal lower the score. ' 'Accuracy improves after about 5 nights of watch data.', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, height: 1.5, @@ -294,7 +293,7 @@ class _ComponentRow extends StatelessWidget { children: [ Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 13, fontWeight: FontWeight.w600, @@ -302,7 +301,7 @@ class _ComponentRow extends StatelessWidget { ), Text( value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textMuted, fontSize: 12, ), diff --git a/workout-logger/lib/screens/widgets/rf_question_card.dart b/workout-logger/lib/screens/widgets/rf_question_card.dart index fbdd0eb..719131a 100644 --- a/workout-logger/lib/screens/widgets/rf_question_card.dart +++ b/workout-logger/lib/screens/widgets/rf_question_card.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/models.dart'; import '../../theme/app_theme.dart'; @@ -76,7 +75,7 @@ class _RFQuestionCardState extends State { const SizedBox(width: AppSpacing.xs), Text( 'QUICK QUESTIONS', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, fontWeight: FontWeight.w700, letterSpacing: 1.2, @@ -143,7 +142,7 @@ class _QuestionBlock extends StatelessWidget { children: [ Text( spec.question, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -167,13 +166,13 @@ class _QuestionBlock extends StatelessWidget { const SizedBox(height: AppSpacing.sm), TextField( controller: controller, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, color: AppColors.textPrimary, ), decoration: InputDecoration( hintText: 'Or type your own answer…', - hintStyle: GoogleFonts.geist( + hintStyle: TextStyle(fontFamily: 'Geist', fontSize: 12, color: AppColors.textFaint, ), @@ -243,7 +242,7 @@ class _OptionChip extends StatelessWidget { ), child: Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 12, fontWeight: selected ? FontWeight.w600 : FontWeight.w400, color: selected ? AppColors.secondary : AppColors.textSoft, diff --git a/workout-logger/lib/screens/widgets/rf_widgets.dart b/workout-logger/lib/screens/widgets/rf_widgets.dart index c99ea32..14ae34e 100644 --- a/workout-logger/lib/screens/widgets/rf_widgets.dart +++ b/workout-logger/lib/screens/widgets/rf_widgets.dart @@ -5,7 +5,6 @@ import 'dart:math' as math; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../theme/app_theme.dart'; // ── Route helper ────────────────────────────────────────────────────────────── @@ -286,7 +285,7 @@ class _NavItem extends StatelessWidget { const SizedBox(height: 4), Text( item.label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, fontWeight: active ? FontWeight.w600 : FontWeight.w500, color: active ? AppColors.textPrimary : AppColors.textMuted, diff --git a/workout-logger/lib/screens/widgets/sleep_hr_card.dart b/workout-logger/lib/screens/widgets/sleep_hr_card.dart index 3e1af45..e60ad59 100644 --- a/workout-logger/lib/screens/widgets/sleep_hr_card.dart +++ b/workout-logger/lib/screens/widgets/sleep_hr_card.dart @@ -6,7 +6,6 @@ import 'dart:math' show min; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../../models/sleep_hr_models.dart'; @@ -48,7 +47,7 @@ class SleepHrCard extends StatelessWidget { children: [ Text( 'Sleep heart rate', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 13, fontWeight: FontWeight.w700, @@ -58,7 +57,7 @@ class SleepHrCard extends StatelessWidget { const SizedBox(height: 2), Text( 'Last night Β· $startFmt – $endFmt', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, ), @@ -159,7 +158,7 @@ class _MiniStat extends StatelessWidget { children: [ Text( label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10, ), @@ -170,7 +169,7 @@ class _MiniStat extends StatelessWidget { children: [ TextSpan( text: value, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 18, fontWeight: FontWeight.w700, @@ -179,7 +178,7 @@ class _MiniStat extends StatelessWidget { ), TextSpan( text: ' $unit', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10, ), diff --git a/workout-logger/lib/screens/widgets/sleep_hr_charts.dart b/workout-logger/lib/screens/widgets/sleep_hr_charts.dart index 1c2c1e2..f50cd95 100644 --- a/workout-logger/lib/screens/widgets/sleep_hr_charts.dart +++ b/workout-logger/lib/screens/widgets/sleep_hr_charts.dart @@ -8,7 +8,6 @@ import 'dart:math' show min, max; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../models/sleep_hr_models.dart'; import '../../theme/app_theme.dart'; @@ -73,7 +72,7 @@ class SleepHrDayView extends StatelessWidget { Text( 'Heart rate during sleep Β· 10-min bars', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), ), const SizedBox(height: 8), _InteractiveBarChart(segments: snapshot.segments), @@ -85,7 +84,7 @@ class SleepHrDayView extends StatelessWidget { Text( 'HR range by stage', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, letterSpacing: 0.3), ), const SizedBox(height: 10), _StageDistributionChart( @@ -124,12 +123,12 @@ class _StatPill extends StatelessWidget { children: [ Text( label.toUpperCase(), - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 9, letterSpacing: 0.5), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 9, letterSpacing: 0.5), ), const SizedBox(height: 2), Text( value, - style: GoogleFonts.geistMono(color: color, fontSize: 14, fontWeight: FontWeight.w700), + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 14, fontWeight: FontWeight.w700), ), ], ), @@ -220,7 +219,7 @@ class _BarChartPainter extends CustomPainter { final gridPaint = Paint() ..color = AppColors.glassBorder ..strokeWidth = 0.5; - final yLabelStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final yLabelStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); final gridBpms = []; for (var b = (bpmMin ~/ 10) * 10; b <= bpmMax; b += 10) { @@ -271,7 +270,7 @@ class _BarChartPainter extends CustomPainter { } canvas.drawPath(path, avgPaint); - final xLabelStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final xLabelStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); for (var i = 0; i < n; i += 6) { final t = _toIst(segments[i].windowStart); final h = t.hour == 0 ? 12 : t.hour > 12 ? t.hour - 12 : t.hour; @@ -319,7 +318,7 @@ class _BarChartPainter extends CustomPainter { }[seg.stage] ?? seg.stage; final lines = ['$th:$tm–$eh:$em IST', '${seg.minBpm}–${seg.maxBpm} bpm', stageName]; - final lineStyle = GoogleFonts.geistMono(color: Colors.white, fontSize: 9.5); + final lineStyle = TextStyle(fontFamily: 'GeistMono', color: Colors.white, fontSize: 9.5); final painters = lines .map((l) => TextPainter( text: TextSpan(text: l, style: lineStyle), @@ -360,7 +359,7 @@ class _BarChartPainter extends CustomPainter { final stagePainter = TextPainter( text: TextSpan( text: stageName, - style: GoogleFonts.geistMono(color: color, fontSize: 9.5, fontWeight: FontWeight.w700), + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 9.5, fontWeight: FontWeight.w700), ), textDirection: TextDirection.ltr, )..layout(); @@ -430,7 +429,7 @@ class _Legend extends StatelessWidget { decoration: BoxDecoration(color: e.$2, borderRadius: BorderRadius.circular(2)), ), const SizedBox(width: 4), - Text(e.$1, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(e.$1, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], )), Row( @@ -438,7 +437,7 @@ class _Legend extends StatelessWidget { children: [ SizedBox(width: 14, height: 10, child: CustomPaint(painter: _DashLinePainter())), const SizedBox(width: 4), - Text('Avg trend', style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text('Avg trend', style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ), ], @@ -481,7 +480,7 @@ class _StageDistributionChart extends StatelessWidget { if (stats.isEmpty) { return Text( 'No stage HR data available.', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 12), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 12), ); } @@ -537,7 +536,7 @@ class _DistRow extends StatelessWidget { child: Text( label, textAlign: TextAlign.right, - style: GoogleFonts.geist(color: color, fontSize: 10, fontWeight: FontWeight.w600), + style: TextStyle(fontFamily: 'Geist', color: color, fontSize: 10, fontWeight: FontWeight.w600), ), ), const SizedBox(width: 8), @@ -591,7 +590,7 @@ class _DistRow extends StatelessWidget { top: 0, child: Text( '${stats.avgBpm.round()} bpm', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 8, fontWeight: FontWeight.w700, @@ -635,7 +634,7 @@ class _DistAxis extends StatelessWidget { left: (pct(t.toDouble()) * w - 10).clamp(0, w - 20), child: Text( '$t', - style: GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8), + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8), ), )) .toList(), @@ -701,7 +700,7 @@ class _DistLi extends StatelessWidget { children: [ swatch, const SizedBox(width: 4), - Text(label, style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 10)), + Text(label, style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 10)), ], ); } diff --git a/workout-logger/lib/screens/widgets/targets_tab.dart b/workout-logger/lib/screens/widgets/targets_tab.dart index 5cc1744..6cb2978 100644 --- a/workout-logger/lib/screens/widgets/targets_tab.dart +++ b/workout-logger/lib/screens/widgets/targets_tab.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import '../../models/models.dart'; @@ -81,7 +80,7 @@ class TargetsTab extends StatelessWidget { icon: const Icon(Icons.add_rounded, color: Colors.white), label: Text( 'New Target', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: Colors.white, fontWeight: FontWeight.w700, ), @@ -171,7 +170,7 @@ class _SummaryChip extends StatelessWidget { ), child: Text( label, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 11, fontWeight: FontWeight.w600, @@ -280,7 +279,7 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { Expanded( child: Text( widget.exerciseName, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 15, fontWeight: FontWeight.w600, @@ -303,7 +302,7 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { ), child: Text( _statusWord, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: _statusColor, fontSize: 10, fontWeight: FontWeight.w700, @@ -330,14 +329,14 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { Text( '${settings.toDisplay(t.currentValue).toStringAsFixed(1)} / ' '${settings.toDisplay(t.targetValue).toStringAsFixed(1)} ${settings.unitLabel}', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, ), ), Text( '${pct.toStringAsFixed(0)}%', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.primary, fontSize: 12, fontWeight: FontWeight.w700, @@ -356,7 +355,7 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { const SizedBox(width: 4), Text( 'Est. $etaStr', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), @@ -412,7 +411,7 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { const SizedBox(width: 4), Text( 'AI Tip', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.warning, fontSize: 11, fontWeight: FontWeight.w700, @@ -423,7 +422,7 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { const SizedBox(height: 4), Text( _nudge!, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, height: 1.5, @@ -434,7 +433,7 @@ class _TargetCardWithAiState extends State<_TargetCardWithAi> { onTap: _openCoach, child: Text( 'Continue in Coach β†’', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.secondary, fontSize: 11, fontWeight: FontWeight.w600, @@ -546,7 +545,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { ), Text( 'New Target', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 20, fontWeight: FontWeight.w800, @@ -556,7 +555,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { Text( 'EXERCISE', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.w700, @@ -578,12 +577,12 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { dropdownColor: AppColors.cardHigh, hint: Text( 'Select exercise…', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 14, ), ), - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, ), @@ -606,7 +605,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { const SizedBox(height: AppSpacing.md), Text( 'TARGET TYPE', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.w700, @@ -641,7 +640,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { child: Text( t.$2, textAlign: TextAlign.center, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: selected ? AppColors.primary : AppColors.textMuted, @@ -660,7 +659,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { const SizedBox(height: AppSpacing.md), Text( 'TARGET VALUE', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.w700, @@ -681,14 +680,14 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { FilteringTextInputFormatter.allow( RegExp(r'^\d*\.?\d*$')), ], - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, ), decoration: InputDecoration( hintText: 'e.g. 100', hintStyle: - GoogleFonts.geist(color: AppColors.textMuted), + TextStyle(fontFamily: 'Geist', color: AppColors.textMuted), border: InputBorder.none, contentPadding: const EdgeInsets.symmetric( horizontal: AppSpacing.md, @@ -711,7 +710,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { const SizedBox(width: 5), Text( 'Suggest a target based on my progress', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.primary, fontSize: 12, fontWeight: FontWeight.w600, @@ -740,7 +739,7 @@ class _CreateTargetSheetState extends State<_CreateTargetSheet> { Expanded( child: Text( _suggestionText!, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, height: 1.4, diff --git a/workout-logger/lib/screens/widgets/volume_chart.dart b/workout-logger/lib/screens/widgets/volume_chart.dart index ff779b7..e744bf7 100644 --- a/workout-logger/lib/screens/widgets/volume_chart.dart +++ b/workout-logger/lib/screens/widgets/volume_chart.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../theme/app_theme.dart'; class VolumeChart extends StatelessWidget { @@ -35,7 +34,7 @@ class VolumeChart extends StatelessWidget { children: labels .map((l) => Text( l, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: 9, color: AppColors.textFaint, ), diff --git a/workout-logger/lib/screens/widgets/wheel_picker.dart b/workout-logger/lib/screens/widgets/wheel_picker.dart index 56d83a0..7ef8f2a 100644 --- a/workout-logger/lib/screens/widgets/wheel_picker.dart +++ b/workout-logger/lib/screens/widgets/wheel_picker.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../theme/app_theme.dart'; /// Two-column wheel picker for weight + reps input. @@ -159,7 +158,7 @@ class _SingleWheelState extends State<_SingleWheel> { children: [ Text( widget.label, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, fontWeight: FontWeight.w600, color: AppColors.textMuted, @@ -169,7 +168,7 @@ class _SingleWheelState extends State<_SingleWheel> { if (widget.unit.isNotEmpty) Text( widget.unit, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 10, color: AppColors.textFaint, ), @@ -217,7 +216,7 @@ class _SingleWheelState extends State<_SingleWheel> { return Center( child: Text( widget.formatter(widget.values[i]), - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', fontSize: isCurrent ? 28 : 16, fontWeight: FontWeight.w600, color: isCurrent diff --git a/workout-logger/lib/screens/widgets/workout_header.dart b/workout-logger/lib/screens/widgets/workout_header.dart index 50665cb..729ae49 100644 --- a/workout-logger/lib/screens/widgets/workout_header.dart +++ b/workout-logger/lib/screens/widgets/workout_header.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../../theme/app_theme.dart'; import 'rf_widgets.dart'; @@ -111,7 +110,7 @@ class _WorkoutHeaderState extends State { children: [ Text( widget.exerciseName, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 17, fontWeight: FontWeight.w600, @@ -127,7 +126,7 @@ class _WorkoutHeaderState extends State { children: [ Text( 'Exercise ${widget.currentExerciseIndex + 1} of ${widget.totalExercises} Β· Set ${widget.setNumber}', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, ), @@ -157,7 +156,7 @@ class _WorkoutHeaderState extends State { const SizedBox(width: 4), Text( _elapsedLabel, - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textSoft, fontSize: 12, ), diff --git a/workout-logger/lib/screens/widgets/workout_hr_section.dart b/workout-logger/lib/screens/widgets/workout_hr_section.dart index c4b6df7..4dd59d0 100644 --- a/workout-logger/lib/screens/widgets/workout_hr_section.dart +++ b/workout-logger/lib/screens/widgets/workout_hr_section.dart @@ -8,7 +8,6 @@ import 'dart:math' show max, min; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../../models/models.dart'; @@ -83,9 +82,9 @@ class _WorkoutHrSectionState extends State { children: [ Text( 'HR across the session Β· βš‘ = exercise', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11), ), - Text('bpm', style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11)), + Text('bpm', style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11)), ], ), const SizedBox(height: 8), @@ -113,7 +112,7 @@ class _WorkoutHrSectionState extends State { alignment: Alignment.center, child: Text( _expanded ? 'Hide per-rest breakdown β–΄' : 'Show per-rest breakdown β–Ύ', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, fontWeight: FontWeight.w600, @@ -130,7 +129,7 @@ class _WorkoutHrSectionState extends State { Text( 'Per-rest recovery needs per-set timing, which this workout ' 'didn\'t record.', - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 11, height: 1.4), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 11, height: 1.4), ), ], ], @@ -177,7 +176,7 @@ class _RecoverySummary extends StatelessWidget { children: [ Text( '${analysis.restsRecovered}/${analysis.restCount}', - style: GoogleFonts.geistMono( + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.success, fontSize: 18, fontWeight: FontWeight.w700, @@ -187,7 +186,7 @@ class _RecoverySummary extends StatelessWidget { Expanded( child: RichText( text: TextSpan( - style: GoogleFonts.geist(color: AppColors.textMuted, fontSize: 11, height: 1.4), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 11, height: 1.4), children: [ const TextSpan( text: 'rests brought your HR down\n', @@ -238,7 +237,7 @@ class _RestRow extends StatelessWidget { children: [ Text( 'After set ${rest.afterSet} Β· rest ${rest.durationSec}s', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 12, fontWeight: FontWeight.w600, @@ -247,14 +246,14 @@ class _RestRow extends StatelessWidget { const SizedBox(height: 1), Text( 'peak ${rest.peakBpm} β†’ low ${rest.troughBpm} bpm${ok ? '' : ' Β· too short'}', - style: GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 10), + style: TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 10), ), ], ), ), Text( 'βˆ’${rest.recoveryBpm} bpm', - style: GoogleFonts.geistMono(color: color, fontSize: 14, fontWeight: FontWeight.w700), + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 14, fontWeight: FontWeight.w700), ), ], ), @@ -285,16 +284,16 @@ class _Pill extends StatelessWidget { children: [ Text( label.toUpperCase(), - style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 9, letterSpacing: 0.5), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 9, letterSpacing: 0.5), ), const SizedBox(height: 2), RichText( text: TextSpan(children: [ TextSpan( text: value, - style: GoogleFonts.geistMono(color: color, fontSize: 16, fontWeight: FontWeight.w700), + style: TextStyle(fontFamily: 'GeistMono', color: color, fontSize: 16, fontWeight: FontWeight.w700), ), - TextSpan(text: ' bpm', style: GoogleFonts.geist(color: AppColors.textFaint, fontSize: 9)), + TextSpan(text: ' bpm', style: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 9)), ]), ), ], @@ -337,7 +336,7 @@ class _CurvePainter extends CustomPainter { final grid = Paint() ..color = AppColors.glassBorder ..strokeWidth = 0.5; - final yStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final yStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); for (var v = (vmin / 20).ceil() * 20; v <= vmax; v += 20) { final yy = y(v.toDouble()); canvas.drawLine(Offset(_padLeft, yy), Offset(size.width - 4, yy), grid); @@ -402,7 +401,7 @@ class _CurvePainter extends CustomPainter { final tp = TextPainter( text: TextSpan( text: s.label, - style: GoogleFonts.geist(color: AppColors.textSoft, fontSize: 8, fontWeight: FontWeight.w600), + style: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 8, fontWeight: FontWeight.w600), ), textDirection: TextDirection.ltr, maxLines: 1, @@ -418,7 +417,7 @@ class _CurvePainter extends CustomPainter { } // X labels (minutes). - final xStyle = GoogleFonts.geistMono(color: AppColors.textFaint, fontSize: 8); + final xStyle = TextStyle(fontFamily: 'GeistMono', color: AppColors.textFaint, fontSize: 8); final totalMin = (spanMs / 60000).round(); final stepMin = totalMin <= 0 ? 1 : (totalMin / 4).ceil(); for (var m = 0; m <= totalMin; m += stepMin) { diff --git a/workout-logger/lib/screens/workout_flow_screen.dart b/workout-logger/lib/screens/workout_flow_screen.dart index b5dd37e..cdcab5b 100644 --- a/workout-logger/lib/screens/workout_flow_screen.dart +++ b/workout-logger/lib/screens/workout_flow_screen.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; -import 'package:google_fonts/google_fonts.dart'; import '../models/models.dart'; import '../services/workout_provider.dart'; @@ -410,7 +409,7 @@ class _WorkoutFlowScreenState extends State { const SizedBox(width: 6), Text( 'Prev', - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textMuted, @@ -453,7 +452,7 @@ class _WorkoutFlowScreenState extends State { child: Text( isLast ? 'Finish' : 'Next exercise', overflow: TextOverflow.ellipsis, - style: GoogleFonts.geist( + style: TextStyle(fontFamily: 'Geist', fontSize: 13, fontWeight: FontWeight.w600, color: Colors.white, diff --git a/workout-logger/lib/theme/app_theme.dart b/workout-logger/lib/theme/app_theme.dart index 7f02c15..5e2bcef 100644 --- a/workout-logger/lib/theme/app_theme.dart +++ b/workout-logger/lib/theme/app_theme.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; // ── AppColors ────────────────────────────────────────────────────────────── // Single source of truth for all colour tokens. Never use hex literals in @@ -121,7 +120,7 @@ class AppTheme { foregroundColor: AppColors.textPrimary, elevation: 0, centerTitle: false, - titleTextStyle: GoogleFonts.geist( + titleTextStyle: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 22, fontWeight: FontWeight.w700, @@ -144,7 +143,7 @@ class AppTheme { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(14), ), - textStyle: GoogleFonts.geist( + textStyle: TextStyle(fontFamily: 'Geist', fontSize: 14, fontWeight: FontWeight.w600, letterSpacing: 0.2, @@ -210,64 +209,64 @@ class AppTheme { static TextTheme _buildTextTheme() { return TextTheme( - headlineLarge: GoogleFonts.geist( + headlineLarge: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 32, fontWeight: FontWeight.w700, letterSpacing: -1.28, ), - headlineMedium: GoogleFonts.geist( + headlineMedium: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 28, fontWeight: FontWeight.w600, letterSpacing: -1.12, ), - headlineSmall: GoogleFonts.geist( + headlineSmall: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 22, fontWeight: FontWeight.w600, letterSpacing: -0.88, ), - titleLarge: GoogleFonts.geist( + titleLarge: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 17, fontWeight: FontWeight.w600, ), - titleMedium: GoogleFonts.geist( + titleMedium: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 14, fontWeight: FontWeight.w600, ), - titleSmall: GoogleFonts.geist( + titleSmall: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 13, fontWeight: FontWeight.w500, ), - bodyLarge: GoogleFonts.geist( + bodyLarge: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 16, ), - bodyMedium: GoogleFonts.geist( + bodyMedium: TextStyle(fontFamily: 'Geist', color: AppColors.textSoft, fontSize: 14, ), - bodySmall: GoogleFonts.geist( + bodySmall: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 12, ), - labelLarge: GoogleFonts.geist( + labelLarge: TextStyle(fontFamily: 'Geist', color: AppColors.textPrimary, fontSize: 11, fontWeight: FontWeight.w600, letterSpacing: 0.4, ), - labelMedium: GoogleFonts.geist( + labelMedium: TextStyle(fontFamily: 'Geist', color: AppColors.textMuted, fontSize: 10, fontWeight: FontWeight.w500, letterSpacing: 0.3, ), - labelSmall: GoogleFonts.geist( + labelSmall: TextStyle(fontFamily: 'Geist', color: AppColors.textFaint, fontSize: 9, fontWeight: FontWeight.w500, diff --git a/workout-logger/pubspec.yaml b/workout-logger/pubspec.yaml index d4a544d..74f1eba 100644 --- a/workout-logger/pubspec.yaml +++ b/workout-logger/pubspec.yaml @@ -52,9 +52,6 @@ dependencies: http: ^1.2.1 package_info_plus: ^8.3.1 - # Fonts β€” Geist Sans + Geist Mono (requires ^8.0.0 for Geist support) - google_fonts: ^8.0.0 - # Health Connect integration health_connector: ^3.9.1 @@ -105,25 +102,13 @@ flutter: # For details regarding adding assets from package dependencies, see # https://flutter.dev/to/asset-from-package - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package + fonts: + - family: Geist + fonts: + - asset: assets/fonts/Geist-Variable.ttf + - family: GeistMono + fonts: + - asset: assets/fonts/GeistMono-Variable.ttf flutter_launcher_icons: android: true