CKT 1.0.1

This commit is contained in:
Carlos Correia
2026-07-15 02:40:22 +01:00
parent fb39e1f722
commit 9c21887fc7
49 changed files with 255 additions and 288 deletions

View File

@@ -25,24 +25,24 @@ class _CreditSection {
}
const List<_CreditSection> _kCreditSections = [
_CreditSection('Desenvolvimento', [
_CreditSection('Criadora original', [
_CreditPerson('Francisca Salgado Ferreira Pacheco Silva', 'Criadora original'),
]),
_CreditSection('Desenvolvimento informático', [
_CreditPerson('Carlos Correia', 'Desenvolvedor'),
_CreditPerson('Fabio Ceia', 'Desenvolvedor'),
_CreditPerson('Fábio Ceia', 'Desenvolvedor'),
_CreditPerson('Ruben Grandra', 'Desenvolvedor'),
_CreditPerson('Dinis Maria', 'Desenvolvedor'),
]),
_CreditSection('Idealização', [
_CreditPerson('Francisca Pacheco Silva', 'Idealizadora/Formanda'),
]),
_CreditSection('Orientação', [
_CreditPerson(
'João Carlos Rodrigues L. Nunes Miranda',
'Professor supervisor',
),
_CreditSection('Orientadores', [
_CreditPerson('Augusta Pureza Alves Silveira', 'Orientador(a)'),
_CreditPerson('Cristina Lopes Cardoso Silva', 'Orientador(a)'),
_CreditPerson('João Carlos Rodrigues L. Miranda', 'Orientador(a)'),
]),
_CreditSection('Instituição colaboradora', [
_CreditPerson('Universidade Fernando Pessoa', ''),
_CreditPerson(
'Escola Profissional da Vila do Conde',
'Escola Profissional de Vila do Conde',
'',
logoPath: 'assets/logo2.png',
),

View File

@@ -10,11 +10,12 @@ import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
import '../widgets/privacy_content.dart';
/// Ecrã de bloqueio mostrado logo após o cadastro (primeira vez), antes do
/// [TermsGateScreen] e antes de entrar na app. Só avança para o próximo
/// passo se o utilizador consentir os três itens de privacidade; se
/// recusar (botão ou seta de voltar), a conta acabada de criar é removida
/// (perfil apagado + sessão terminada) e volta-se ao login.
/// Ecrã de bloqueio mostrado logo após o cadastro (primeira vez), depois
/// de aceites os Termos ([TermsGateScreen]) e antes de entrar na app. Só
/// avança para a Home se o utilizador consentir os itens obrigatórios de
/// privacidade (o terceiro item é opcional); se recusar (botão ou seta de
/// voltar), a conta acabada de criar é removida (perfil apagado + sessão
/// terminada) e volta-se ao login.
class PrivacyGateScreen extends StatefulWidget {
const PrivacyGateScreen({
super.key,
@@ -33,7 +34,9 @@ class _PrivacyGateScreenState extends State<PrivacyGateScreen> {
final Set<String> _accepted = {};
bool _declining = false;
bool get _allAccepted => _accepted.length == kPrivacyConsentItems.length;
bool get _allAccepted => kPrivacyConsentItems
.where((item) => item.required)
.every((item) => _accepted.contains(item.id));
void _toggle(String id, bool value) {
setState(() {
@@ -242,8 +245,23 @@ class _PrivacyConsentRow extends StatelessWidget {
),
const SizedBox(width: 12),
Expanded(
child: Text(
item.text,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: item.required
? '(Obrigatório) '
: '(Opcional) ',
style: TextStyle(
fontWeight: FontWeight.w900,
color: item.required
? kPrivacyTeal
: Colors.black.withValues(alpha: 0.45),
),
),
TextSpan(text: item.text),
],
),
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w700,

View File

@@ -9,10 +9,11 @@ import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
import '../widgets/terms_content.dart';
/// Ecrã de bloqueio mostrado logo após o cadastro (primeira vez), antes de
/// entrar na app. Só avança para a Home se o utilizador aceitar os Termos;
/// se recusar (botão ou seta de voltar), a conta acabada de criar é
/// removida (perfil apagado + sessão terminada) e volta-se ao login.
/// Ecrã de bloqueio mostrado logo após o cadastro (primeira vez), antes do
/// [PrivacyGateScreen] e antes de entrar na app. Só avança para o próximo
/// passo se o utilizador aceitar os Termos; se recusar (botão ou seta de
/// voltar), a conta acabada de criar é removida (perfil apagado + sessão
/// terminada) e volta-se ao login.
class TermsGateScreen extends StatefulWidget {
const TermsGateScreen({
super.key,