import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../data/learn_content.dart'; import '../../theme/app_theme.dart'; /// Screen to display full learn article content class LearnArticleScreen extends StatelessWidget { final String articleId; const LearnArticleScreen({super.key, required this.articleId}); @override Widget build(BuildContext context) { final article = LearnContent.getArticle(articleId); if (article == null) { return Scaffold( appBar: AppBar(title: const Text('Article Not Found')), body: const Center(child: Text('Article not found')), ); } return Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, appBar: AppBar( backgroundColor: Theme.of(context).scaffoldBackgroundColor, elevation: 0, leading: IconButton( icon: Icon(Icons.arrow_back, color: Theme.of(context).iconTheme.color), onPressed: () => Navigator.pop(context), ), title: Text( article.category, style: GoogleFonts.outfit( fontSize: 14, fontWeight: FontWeight.w500, color: Theme.of(context).textTheme.bodySmall?.color, ), ), centerTitle: true, ), body: SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title Text( article.title, style: GoogleFonts.outfit( fontSize: 26, fontWeight: FontWeight.w700, color: Theme.of(context).textTheme.headlineMedium?.color, height: 1.2, ), ), const SizedBox(height: 8), Text( article.subtitle, style: GoogleFonts.outfit( fontSize: 15, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), const SizedBox(height: 24), // Divider Container( height: 3, width: 40, decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary, borderRadius: BorderRadius.circular(2), ), ), const SizedBox(height: 24), // Sections ...article.sections.map((section) => _buildSection(context, section)), ], ), ), ); } Widget _buildSection(BuildContext context, LearnSection section) { return Padding( padding: const EdgeInsets.only(bottom: 24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (section.heading != null) ...[ Text( section.heading!, style: GoogleFonts.outfit( fontSize: 17, fontWeight: FontWeight.w600, color: Theme.of(context).textTheme.titleLarge?.color, ), ), const SizedBox(height: 10), ], _buildRichText(context, section.content), ], ), ); } Widget _buildRichText(BuildContext context, String content) { // Handle basic markdown-like formatting final List spans = []; final RegExp boldPattern = RegExp(r'\*\*(.*?)\*\*'); int currentIndex = 0; for (final match in boldPattern.allMatches(content)) { // Add text before the match if (match.start > currentIndex) { spans.add(TextSpan( text: content.substring(currentIndex, match.start), style: GoogleFonts.outfit( fontSize: 15, color: Theme.of(context).textTheme.bodyLarge?.color, height: 1.7, ), )); } // Add bold text spans.add(TextSpan( text: match.group(1), style: GoogleFonts.outfit( fontSize: 15, fontWeight: FontWeight.w600, color: Theme.of(context).textTheme.titleMedium?.color, height: 1.7, ), )); currentIndex = match.end; } // Add remaining text if (currentIndex < content.length) { spans.add(TextSpan( text: content.substring(currentIndex), style: GoogleFonts.outfit( fontSize: 15, color: Theme.of(context).textTheme.bodyLarge?.color, height: 1.7, ), )); } return RichText( text: TextSpan(children: spans), ); } }