Files
CheckTheethKids/lib/quiz/quiz_checklist_screen.dart
2026-07-14 18:23:03 +01:00

146 lines
5.8 KiB
Dart

import 'package:flutter/material.dart';
import '../widgets/entrance.dart';
import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
const Color _pink = Color(0xFFFF55A7);
const Color _teal = Color(0xFF2F9E94);
/// Ecrã intersticial informativo, mostrado a meio do quiz para preparar o
/// utilizador antes de continuar (ex.: logo a seguir a um vídeo-guia) —
/// um ícone, um título e uma lista de pontos com visto.
class QuizChecklistScreen extends StatelessWidget {
const QuizChecklistScreen({
super.key,
required this.heading,
required this.items,
required this.onAdvance,
this.icon = Icons.health_and_safety_rounded,
});
final String heading;
final List<String> items;
final void Function(BuildContext context) onAdvance;
final IconData icon;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
clipBehavior: Clip.none,
children: [
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
const LiquidWavesBackground(),
SafeArea(
child: Padding(
padding: const EdgeInsets.fromLTRB(24, 24, 24, 24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
FadeSlideIn(
child: Container(
width: 76,
height: 76,
decoration: BoxDecoration(
color: _teal.withValues(alpha: 0.12),
shape: BoxShape.circle,
),
child: Icon(icon, color: _teal, size: 36),
),
),
const SizedBox(height: 22),
FadeSlideIn(
delay: const Duration(milliseconds: 60),
child: Text(
heading,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.w900,
color: Colors.black87,
height: 1.25,
),
),
),
const SizedBox(height: 22),
for (var i = 0; i < items.length; i++) ...[
if (i > 0) const SizedBox(height: 14),
FadeSlideIn(
delay: Duration(milliseconds: 100 + 40 * i),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 22,
height: 22,
margin: const EdgeInsets.only(top: 1),
decoration: const BoxDecoration(
color: _teal,
shape: BoxShape.circle,
),
child: const Icon(
Icons.check_rounded,
size: 15,
color: Colors.white,
),
),
const SizedBox(width: 12),
Expanded(
child: Text(
items[i],
style: TextStyle(
fontSize: 14.5,
fontWeight: FontWeight.w700,
color: Colors.black.withValues(
alpha: 0.75,
),
height: 1.35,
),
),
),
],
),
),
],
],
),
),
),
FadeSlideIn(
delay: const Duration(milliseconds: 260),
child: TapBounce(
child: SizedBox(
width: double.infinity,
height: 52,
child: FilledButton(
style: FilledButton.styleFrom(
backgroundColor: _pink,
foregroundColor: Colors.white,
shape: const StadiumBorder(),
textStyle: const TextStyle(
fontWeight: FontWeight.w800,
fontSize: 16,
),
),
onPressed: () => onAdvance(context),
child: const Text('Avançar'),
),
),
),
),
],
),
),
),
],
),
);
}
}