CKT String|Colors

This commit is contained in:
Carlos Correia
2026-07-15 19:13:15 +01:00
parent 3214a07779
commit a8af2c6845
35 changed files with 1390 additions and 688 deletions

View File

@@ -1,9 +1,11 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import '../strings/common_strings.dart';
import 'tap_bounce.dart';
const Color _teal = Color(0xFF2F9E94);
const Color _accentPink = Color(0xFFFF55A7);
const Color _teal = AppColors.teal;
const Color _accentPink = AppColors.pink;
/// Diálogo de confirmação com a identidade visual do app (título rosa,
/// botões em pílula), usado para todas as confirmações destrutivas/decisórias.
@@ -11,7 +13,7 @@ Future<bool?> showConfirmDialog(
BuildContext context, {
required String title,
String? message,
String cancelLabel = 'Cancelar',
String cancelLabel = CommonStrings.cancel,
required String confirmLabel,
Color confirmColor = _teal,
}) {

View File

@@ -1,30 +0,0 @@
import 'package:flutter/material.dart';
/// Gradiente usado em todas as app bars da aplicação. Direção puramente
/// horizontal (não diagonal) de propósito: a app bar retrátil da Home é
/// alta (~190) enquanto as das outras abas são baixas (~56) — um gradiente
/// diagonal mostra proporções de cor bem diferentes consoante a altura,
/// fazendo a Home parecer mais "cheia de cor" que as outras. Na horizontal,
/// a transição depende só da largura (igual em todas as app bars), por
/// isso todas ficam visualmente idênticas.
const LinearGradient kAppBarGradient = LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Color(0xFF1C7A6E), Color(0xFF8FD4BB)],
);
/// Cor sólida (sem gradiente, de propósito) usada nos botões e cards verdes
/// da aplicação — botões de "Entrar"/"Criar conta", "Adicionar criança" e o
/// card "Vídeos educativos". Só as app bars usam gradiente ([kAppBarGradient]);
/// mantém-se como [LinearGradient] com as duas cores iguais para não obrigar
/// a mudar todos os `decoration: gradient: kGreenButtonGradient` existentes.
const LinearGradient kGreenButtonGradient = LinearGradient(
colors: [Color(0xFF2F9E94), Color(0xFF2F9E94)],
);
/// Gradiente rosa vivo do card do quiz na Home.
const LinearGradient kPinkHeroGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFFFF55A7), Color(0xFFE83E93)],
);

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
/// Notificação em formato de pílula flutuante (fundo branco, texto rosa,
/// cantos totalmente arredondados, com um pequeno "pop" de entrada), usada
@@ -62,7 +63,7 @@ class _AnimatedPill extends StatelessWidget {
message,
textAlign: TextAlign.center,
style: const TextStyle(
color: Color(0xFFFF55A7),
color: AppColors.pink,
fontWeight: FontWeight.w800,
fontSize: 14,
),

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import '../strings/privacy_strings.dart';
const Color kPrivacyTeal = Color(0xFF2F9E94);
const Color kPrivacyTeal = AppColors.teal;
/// Um dos itens de consentimento mostrados no ecrã de privacidade. Itens
/// com [required] a false (ex.: recolha de dados técnicos de utilização)
@@ -19,25 +21,14 @@ class PrivacyConsentItem {
/// Texto fixo dos consentimentos de privacidade, mostrado no cadastro.
const List<PrivacyConsentItem> kPrivacyConsentItems = [
PrivacyConsentItem(
id: 'health_data',
text:
'Confirmo que sou encarregado(a) de educação ou responsável legal '
'da criança avaliada e concordo com o processamento dos dados de '
'saúde que introduzo na Check-Teeth Kids, exclusivamente para gerar '
'o resultado da triagem digital.',
),
PrivacyConsentItem(id: 'health_data', text: PrivacyStrings.healthDataConsent),
PrivacyConsentItem(
id: 'privacy_policy',
text:
'Li e aceito os Termos e Condições apresentados anteriormente e as '
'condições de privacidade descritas nesta página.',
text: PrivacyStrings.privacyPolicyConsent,
),
PrivacyConsentItem(
id: 'tracking',
text:
'Ajude-nos a melhorar a Check-Teeth Kids, autorizando a recolha de '
'dados técnicos de utilização.',
text: PrivacyStrings.trackingConsent,
required: false,
),
];
@@ -66,7 +57,7 @@ class PrivacyHeader extends StatelessWidget {
),
const SizedBox(height: 16),
const Text(
'Política de Privacidade',
PrivacyStrings.headerTitle,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,

View File

@@ -1,30 +1,8 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import '../strings/terms_strings.dart';
const Color kTermsPink = Color(0xFFFF55A7);
/// Parágrafos dos Termos e Condições — texto fixo, igual em todo o app
/// (ecrã de bloqueio no cadastro e ecrã informativo em Ajustes).
const List<String> kTermsParagraphs = [
'© 2026, Francisca Salgado Ferreira Pacheco Silva. A aplicação, o método '
'de avaliação, arquitetura e conteúdos são propriedade intelectual '
'exclusiva da autora.',
'A Check-Teeth Kids é uma aplicação desenvolvida com o propósito de '
'promover a literacia em saúde oral infantil, através de conteúdos '
'educativos e de um quiz de triagem digital, com especial enfoque na '
'identificação precoce de sinais associados à má oclusão dentária.',
'Com base nas respostas fornecidas, é apresentado um resultado que '
'identifica sinais de má oclusão já instalados e fatores de risco '
'associados, destinado a auxiliar o utilizador na decisão de procurar '
'uma avaliação clínica especializada.',
'Esta ferramenta não tem como objetivo realizar diagnósticos clínicos, '
'nem substituir a avaliação por um profissional de saúde oral. '
'Destina-se exclusivamente a uma triagem inicial e informativa, '
'promovendo o encaminhamento atempado para um médico dentista '
'especialista (Odontopediatra ou Ortodontista).',
'Esta aplicação foi desenvolvida no âmbito de um projeto de dissertação '
'de Mestrado, encontrando-se numa fase de desenvolvimento e ainda sem '
'validação clínica formal concluída.',
];
const Color kTermsPink = AppColors.pink;
/// Emblema circular rosa + título "Termos e Condições", reutilizado nos
/// dois ecrãs que mostram este conteúdo.
@@ -50,7 +28,7 @@ class TermsHeader extends StatelessWidget {
),
const SizedBox(height: 16),
const Text(
'Termos e Condições',
TermsStrings.headerTitle,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
@@ -85,10 +63,10 @@ class TermsBody extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
for (var i = 0; i < kTermsParagraphs.length; i++) ...[
for (var i = 0; i < TermsStrings.paragraphs.length; i++) ...[
if (i > 0) const SizedBox(height: 14),
Text(
kTermsParagraphs[i],
TermsStrings.paragraphs[i],
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 13,