diff --git a/README.md b/README.md index 504be2a..10e2b88 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# first_attempt +# casha A new Flutter project. diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 3c306f7..5aca107 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } android { - namespace = "com.example.first_attempt" + namespace = "com.example.casha" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -21,7 +21,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.first_attempt" + applicationId = "com.kolo.casha" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9d80522..9f48c61 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - First Attempt + Casha CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -15,7 +15,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - first_attempt + Casha CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/app/router.dart b/lib/app/router.dart index 982f693..d9eaa07 100644 --- a/lib/app/router.dart +++ b/lib/app/router.dart @@ -4,13 +4,18 @@ import '../features/dashboard/screen.dart'; import '../features/add_transaction/screen.dart'; import '../features/categories/screen.dart'; import '../features/settings/screen.dart'; +import '../features/splash/screen.dart'; import '../shared/models/transaction.dart'; final _shellKey = GlobalKey(); final appRouter = GoRouter( - initialLocation: '/dashboard', + initialLocation: '/splash', routes: [ + GoRoute( + path: '/splash', + builder: (context, state) => const SplashScreen(), + ), ShellRoute( navigatorKey: _shellKey, builder: (context, state, child) => AppShell(child: child), diff --git a/lib/features/settings/screen.dart b/lib/features/settings/screen.dart index f7b7dc1..0f6047c 100644 --- a/lib/features/settings/screen.dart +++ b/lib/features/settings/screen.dart @@ -514,6 +514,37 @@ class _SettingsScreenState extends ConsumerState { ), ), const SizedBox(height: 32), + Padding( + padding: const EdgeInsets.only(bottom: 24), + child: Center( + child: RichText( + textAlign: TextAlign.center, + text: const TextSpan( + style: TextStyle(fontSize: 13, color: Colors.white30), + children: [ + TextSpan( + text: 'casha', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white38, + ), + ), + TextSpan( + text: ' powered with ❤️ by ', + style: TextStyle(fontStyle: FontStyle.italic), + ), + TextSpan( + text: 'kolo', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white38, + ), + ), + ], + ), + ), + ), + ), ], ), ), diff --git a/lib/features/splash/screen.dart b/lib/features/splash/screen.dart new file mode 100644 index 0000000..9c399bd --- /dev/null +++ b/lib/features/splash/screen.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _animation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1800), + ); + + _animation = CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + ); + + _controller.forward(); + + _controller.addStatusListener((status) { + if (status == AnimationStatus.completed) { + if (mounted) { + context.go('/dashboard'); + } + } + }); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xFF0F0F14), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Casha', + style: GoogleFonts.poppins( + fontSize: 42, + fontWeight: FontWeight.bold, + color: const Color(0xFF7C6DED), + ), + ), + const SizedBox(height: 24), + SizedBox( + width: 120, + child: AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return LinearProgressIndicator( + value: _animation.value, + backgroundColor: Colors.white.withOpacity(0.1), + valueColor: const AlwaysStoppedAnimation(Color(0xFF7C6DED)), + minHeight: 2, + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index f446b60..111ea5a 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -4,10 +4,10 @@ project(runner LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "first_attempt") +set(BINARY_NAME "casha") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.first_attempt") +set(APPLICATION_ID "com.example.casha") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/linux/runner/my_application.cc b/linux/runner/my_application.cc index 1a45479..8f22c43 100644 --- a/linux/runner/my_application.cc +++ b/linux/runner/my_application.cc @@ -45,11 +45,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "first_attempt"); + gtk_header_bar_set_title(header_bar, "casha"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "first_attempt"); + gtk_window_set_title(window, "casha"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 48ed12a..910db5c 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -64,7 +64,7 @@ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* first_attempt.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "first_attempt.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* casha.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "casha.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -131,7 +131,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* first_attempt.app */, + 33CC10ED2044A3C60003C045 /* casha.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -217,7 +217,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* first_attempt.app */; + productReference = 33CC10ED2044A3C60003C045 /* casha.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -388,7 +388,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.example.firstAttempt.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/first_attempt.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/first_attempt"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/casha.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/casha"; }; name = Debug; }; @@ -402,7 +402,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.example.firstAttempt.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/first_attempt.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/first_attempt"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/casha.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/casha"; }; name = Release; }; @@ -416,7 +416,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.example.firstAttempt.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/first_attempt.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/first_attempt"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/casha.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/casha"; }; name = Profile; }; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7c635c4..ccfe2b9 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -66,7 +66,7 @@ @@ -83,7 +83,7 @@ diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 2928a64..66d151c 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,7 +5,7 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = first_attempt +PRODUCT_NAME = casha // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = com.example.firstAttempt diff --git a/pubspec.yaml b/pubspec.yaml index f88a80e..74bfb92 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,4 +1,4 @@ -name: first_attempt +name: casha description: "Personal Finance Tracker" publish_to: 'none' version: 1.0.0+1 diff --git a/test/widget_test.dart b/test/widget_test.dart index 5a093bd..cb3348a 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:first_attempt/main.dart'; +import 'package:casha/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { diff --git a/web/index.html b/web/index.html index 4cb81e1..79340cf 100644 --- a/web/index.html +++ b/web/index.html @@ -23,13 +23,13 @@ - + - first_attempt + casha diff --git a/web/manifest.json b/web/manifest.json index 77733f0..1b4d837 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -1,6 +1,6 @@ { - "name": "first_attempt", - "short_name": "first_attempt", + "name": "Casha", + "short_name": "Casha", "start_url": ".", "display": "standalone", "background_color": "#0175C2", diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 3f44409..89ddc2e 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -1,10 +1,10 @@ # Project-level configuration. cmake_minimum_required(VERSION 3.14) -project(first_attempt LANGUAGES CXX) +project(casha LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "first_attempt") +set(BINARY_NAME "casha") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 8ccddcb..4bf9de6 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "first_attempt" "\0" + VALUE "FileDescription", "casha" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "first_attempt" "\0" + VALUE "InternalName", "casha" "\0" VALUE "LegalCopyright", "Copyright (C) 2026 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "first_attempt.exe" "\0" - VALUE "ProductName", "first_attempt" "\0" + VALUE "OriginalFilename", "casha.exe" "\0" + VALUE "ProductName", "casha" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 8bad57c..c27f362 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -27,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.Create(L"first_attempt", origin, size)) { + if (!window.Create(L"casha", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true);