Przebudowanie aplikacji, usprawnione AI, dodanie combo buildera
Some checks failed
Build Linux App / build (push) Failing after 1m18s

This commit is contained in:
Kazimierz Ciołek
2026-07-06 23:44:17 +02:00
parent 9dcc4b87de
commit 6dd7213eb0
48 changed files with 3229 additions and 669 deletions

View File

@@ -28,12 +28,12 @@ class _WelcomeScreenState extends ConsumerState<WelcomeScreen> {
.read(aiModelSettingsControllerProvider.notifier)
.validateModels()
.then((_) {
if (!mounted) return;
final validated = ref
.read(aiModelSettingsControllerProvider)
.areModelsValidated;
if (validated) _navigateToApp();
});
if (!mounted) return;
final validated = ref
.read(aiModelSettingsControllerProvider)
.areModelsValidated;
if (validated) _navigateToApp();
});
});
}
@@ -47,11 +47,11 @@ class _WelcomeScreenState extends ConsumerState<WelcomeScreen> {
Widget build(BuildContext context) {
final modelState = ref.watch(aiModelSettingsControllerProvider);
ref.listen<AiModelSettingsState>(aiModelSettingsControllerProvider,
(prev, next) {
if (!_hasNavigated &&
next.areModelsValidated &&
!next.isDownloading) {
ref.listen<AiModelSettingsState>(aiModelSettingsControllerProvider, (
prev,
next,
) {
if (!_hasNavigated && next.areModelsValidated && !next.isDownloading) {
_navigateToApp();
}
});

View File

@@ -32,12 +32,12 @@ class DownloadProgress extends StatelessWidget {
),
const SizedBox(height: UIConstants.spacing24),
Text(
'Setting up AI models\u2026',
style: GoogleFonts.inter(
'SETTING UP AI MODELS\u2026',
style: GoogleFonts.chakraPetch(
fontSize: 22,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
letterSpacing: -0.3,
letterSpacing: 1,
),
),
const SizedBox(height: UIConstants.spacing8),
@@ -55,8 +55,7 @@ class DownloadProgress extends StatelessWidget {
value: modelState.progress,
minHeight: 6,
backgroundColor: AppColors.zinc800,
valueColor:
const AlwaysStoppedAnimation<Color>(AppColors.accent),
valueColor: const AlwaysStoppedAnimation<Color>(AppColors.accent),
),
),
const SizedBox(height: UIConstants.spacing12),
@@ -105,9 +104,7 @@ class ErrorBanner extends StatelessWidget {
decoration: BoxDecoration(
color: AppColors.destructiveMuted,
borderRadius: BorderRadius.circular(UIConstants.smallBorderRadius),
border: Border.all(
color: AppColors.destructive.withValues(alpha: 0.4),
),
border: Border.all(color: AppColors.destructive.withValues(alpha: 0.4)),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,

View File

@@ -46,19 +46,19 @@ class InitialPrompt extends StatelessWidget {
borderRadius: BorderRadius.circular(12),
),
child: const Icon(
Icons.fitness_center,
Icons.sports_martial_arts,
color: AppColors.accent,
size: 24,
),
),
const SizedBox(width: UIConstants.spacing12),
Text(
'TrainHub',
style: GoogleFonts.inter(
'TRAINHUB',
style: GoogleFonts.chakraPetch(
fontSize: 26,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
letterSpacing: -0.5,
letterSpacing: 2,
),
),
],
@@ -67,13 +67,13 @@ class InitialPrompt extends StatelessWidget {
Widget _buildHeadline() {
return Text(
'AI-powered coaching,\nright on your device.',
style: GoogleFonts.inter(
'AI-POWERED COACHING,\nRIGHT ON YOUR DEVICE.',
style: GoogleFonts.chakraPetch(
fontSize: 28,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
height: 1.25,
letterSpacing: -0.5,
letterSpacing: 0.5,
),
);
}
@@ -101,7 +101,7 @@ class InitialPrompt extends StatelessWidget {
SizedBox(height: UIConstants.spacing12),
FeatureRow(
icon: Icons.psychology_outlined,
label: 'Qwen 2.5 7B chat model for training advice.',
label: 'Qwen3 4B chat model for training advice.',
),
SizedBox(height: UIConstants.spacing12),
FeatureRow(
@@ -121,9 +121,7 @@ class InitialPrompt extends StatelessWidget {
decoration: BoxDecoration(
color: AppColors.accentMuted,
borderRadius: BorderRadius.circular(UIConstants.smallBorderRadius),
border: Border.all(
color: AppColors.accent.withValues(alpha: 0.3),
),
border: Border.all(color: AppColors.accent.withValues(alpha: 0.3)),
),
child: Row(
children: [
@@ -135,7 +133,7 @@ class InitialPrompt extends StatelessWidget {
const SizedBox(width: UIConstants.spacing12),
Expanded(
child: Text(
'The download is ~5 GB and only needs to happen once. '
'The download is ~2.7 GB and only needs to happen once. '
'You can skip now and download later from Settings.',
style: GoogleFonts.inter(
fontSize: 13,

View File

@@ -39,8 +39,7 @@ class _WelcomePrimaryButtonState extends State<WelcomePrimaryButton> {
child: Material(
color: Colors.transparent,
child: InkWell(
borderRadius:
BorderRadius.circular(UIConstants.smallBorderRadius),
borderRadius: BorderRadius.circular(UIConstants.smallBorderRadius),
onTap: widget.onPressed,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
@@ -75,8 +74,7 @@ class WelcomeSecondaryButton extends StatefulWidget {
final VoidCallback onPressed;
@override
State<WelcomeSecondaryButton> createState() =>
_WelcomeSecondaryButtonState();
State<WelcomeSecondaryButton> createState() => _WelcomeSecondaryButtonState();
}
class _WelcomeSecondaryButtonState extends State<WelcomeSecondaryButton> {
@@ -98,8 +96,7 @@ class _WelcomeSecondaryButtonState extends State<WelcomeSecondaryButton> {
child: Material(
color: Colors.transparent,
child: InkWell(
borderRadius:
BorderRadius.circular(UIConstants.smallBorderRadius),
borderRadius: BorderRadius.circular(UIConstants.smallBorderRadius),
onTap: widget.onPressed,
child: Center(
child: Text(