From b890ca689ed3dedca5d07e2787f3fe0abef396b8 Mon Sep 17 00:00:00 2001 From: Gleb Shalimov Date: Fri, 10 Jul 2026 12:57:17 +0300 Subject: [PATCH 1/3] up packages version --- analysis_options.yaml | 4 + ios/Flutter/Debug.xcconfig | 1 - ios/Flutter/Release.xcconfig | 1 - ios/Podfile | 43 ---- ios/Podfile.lock | 16 -- ios/Runner.xcodeproj/project.pbxproj | 113 ++-------- .../contents.xcworkspacedata | 3 - lib/generated/intl/messages_de.dart | 4 +- lib/generated/intl/messages_en.dart | 2 +- lib/generated/intl/messages_es.dart | 2 +- lib/generated/intl/messages_fr.dart | 2 +- lib/generated/intl/messages_it.dart | 2 +- lib/generated/intl/messages_ru.dart | 2 +- .../providers/game_provider.g.dart | 11 +- .../settings/language_provider.g.dart | 9 +- .../providers/settings/theme_provider.g.dart | 9 +- pubspec.lock | 196 ++++++++---------- pubspec.yaml | 24 +-- test/levels_solvability_test.dart | 34 +-- test/levels_uniqueness_test.dart | 23 +- 20 files changed, 166 insertions(+), 335 deletions(-) delete mode 100644 ios/Podfile delete mode 100644 ios/Podfile.lock diff --git a/analysis_options.yaml b/analysis_options.yaml index f9b3034..c2f450e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1 +1,5 @@ include: package:flutter_lints/flutter.yaml + +analyzer: + exclude: + - lib/generated/intl/** diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index ec97fc6..592ceee 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index c4855bf..592ceee 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile deleted file mode 100644 index 620e46e..0000000 --- a/ios/Podfile +++ /dev/null @@ -1,43 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '13.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index 64cf43c..0000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,16 +0,0 @@ -PODS: - - Flutter (1.0.0) - -DEPENDENCIES: - - Flutter (from `Flutter`) - -EXTERNAL SOURCES: - Flutter: - :path: Flutter - -SPEC CHECKSUMS: - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - -PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e - -COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a4068eb..d18bfd3 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,10 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 1A8D90BAC454B698BB62BFD8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4B536B7CA97494679082DF8 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 40721B8A6954C3F5F14131EF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA1DFB3A28996DC4BDC976C0 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -48,13 +46,10 @@ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 559A40D4352E4369510582FD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 5E8DAF2384F6AC335607A8C5 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9633389CD925885CBB096840 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,7 +57,6 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9B4EC0C89362A7D88A483624 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; BB037C432EB9E95E00B9966F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; }; BB037C442EB9E95E00B9966F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; }; BB0925E02EAC005900F74AD3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; }; @@ -73,10 +67,6 @@ BBBD74612ECF0053002F1E82 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; BBD60ACB2ECB0F8A00B715E0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; }; BBD60ACC2ECB0F8A00B715E0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = ""; }; - C18FC17907CDBD1EC174CBC0 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D4B536B7CA97494679082DF8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DA1DFB3A28996DC4BDC976C0 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ED8F6D18CB687E5729C76F56 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -84,7 +74,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1A8D90BAC454B698BB62BFD8 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -93,7 +82,6 @@ buildActionMask = 2147483647; files = ( 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, - 40721B8A6954C3F5F14131EF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -108,28 +96,6 @@ path = RunnerTests; sourceTree = ""; }; - 67342FD0C598EB5DF573F044 /* Frameworks */ = { - isa = PBXGroup; - children = ( - DA1DFB3A28996DC4BDC976C0 /* Pods_Runner.framework */, - D4B536B7CA97494679082DF8 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 8E7B55F1948E68B2D4F72A6E /* Pods */ = { - isa = PBXGroup; - children = ( - 9B4EC0C89362A7D88A483624 /* Pods-Runner.debug.xcconfig */, - 559A40D4352E4369510582FD /* Pods-Runner.release.xcconfig */, - C18FC17907CDBD1EC174CBC0 /* Pods-Runner.profile.xcconfig */, - ED8F6D18CB687E5729C76F56 /* Pods-RunnerTests.debug.xcconfig */, - 5E8DAF2384F6AC335607A8C5 /* Pods-RunnerTests.release.xcconfig */, - 9633389CD925885CBB096840 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -149,8 +115,6 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 8E7B55F1948E68B2D4F72A6E /* Pods */, - 67342FD0C598EB5DF573F044 /* Frameworks */, ); sourceTree = ""; }; @@ -185,7 +149,6 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 62A7D0BEAC93D037678B123D /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, 4F02A7030C2CF20FC602AE7F /* Frameworks */, @@ -204,7 +167,6 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8FC580ED5FB07A9C3CE2551A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -259,7 +221,7 @@ ); mainGroup = 97C146E51CF9000F007C117D; packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; @@ -309,50 +271,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 62A7D0BEAC93D037678B123D /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 8FC580ED5FB07A9C3CE2551A /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -432,6 +350,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphonesimulator*]" = arm64; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; @@ -464,6 +383,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = x86_64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -472,7 +392,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -487,7 +407,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 36; + CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = G4KB5U6326; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -497,7 +417,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.11.1; + MARKETING_VERSION = 1.11.2; PRODUCT_BUNDLE_IDENTIFIER = com.khlebobul.pegma; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -508,7 +428,6 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = ED8F6D18CB687E5729C76F56 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -526,7 +445,6 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5E8DAF2384F6AC335607A8C5 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -542,7 +460,6 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9633389CD925885CBB096840 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -560,6 +477,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphonesimulator*]" = arm64; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; @@ -592,6 +510,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = x86_64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -606,7 +525,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -618,6 +537,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=iphonesimulator*]" = arm64; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; @@ -650,6 +570,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = x86_64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -658,7 +579,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -675,7 +596,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 36; + CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = G4KB5U6326; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -685,7 +606,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.11.1; + MARKETING_VERSION = 1.11.2; PRODUCT_BUNDLE_IDENTIFIER = com.khlebobul.pegma; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -701,7 +622,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 36; + CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = G4KB5U6326; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -711,7 +632,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.11.1; + MARKETING_VERSION = 1.11.2; PRODUCT_BUNDLE_IDENTIFIER = com.khlebobul.pegma; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -756,7 +677,7 @@ /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 21a3cc1..1d526a1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,7 +4,4 @@ - - diff --git a/lib/generated/intl/messages_de.dart b/lib/generated/intl/messages_de.dart index 039c80b..95d8cf9 100644 --- a/lib/generated/intl/messages_de.dart +++ b/lib/generated/intl/messages_de.dart @@ -20,8 +20,8 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'de'; - static String m0(String appName) => - "der name ${appName} ist ein wortspiel, das kombiniert: \"peg\" (stift, spielstein) ist das hauptelement des spiels und \"theorema\", das mit mathematischer strenge und logik verbunden ist."; + static String m0(appName) => + "der name ${appName} ist ein wortspiel, das kombiniert: „peg“ (stift, spielstein) ist das hauptelement des spiels und „theorema“, das mit mathematischer strenge und logik verbunden ist."; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 50d91bb..27255bc 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -20,7 +20,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'en'; - static String m0(String appName) => + static String m0(appName) => "the name ${appName} is a play on words that combines: \"peg\" (peg, token) is the main element of the game and \"theorema\", which is associated with mathematical rigor and logic."; final messages = _notInlinedMessages(_notInlinedMessages); diff --git a/lib/generated/intl/messages_es.dart b/lib/generated/intl/messages_es.dart index 091ba65..550b3e1 100644 --- a/lib/generated/intl/messages_es.dart +++ b/lib/generated/intl/messages_es.dart @@ -20,7 +20,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'es'; - static String m0(String appName) => + static String m0(appName) => "el nombre ${appName} es un juego de palabras que combina: \"peg\" (clavija, ficha) que es el elemento principal del juego y \"theorema\", que se asocia con el rigor y la lógica matemática."; final messages = _notInlinedMessages(_notInlinedMessages); diff --git a/lib/generated/intl/messages_fr.dart b/lib/generated/intl/messages_fr.dart index ed8a223..6dd247e 100644 --- a/lib/generated/intl/messages_fr.dart +++ b/lib/generated/intl/messages_fr.dart @@ -20,7 +20,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'fr'; - static String m0(String appName) => + static String m0(appName) => "le nom ${appName} est un jeu de mots qui combine : \"peg\" (cheville, jeton) est l\'élément principal du jeu et \"theorema\", qui est associé à la rigueur mathématique et à la logique."; final messages = _notInlinedMessages(_notInlinedMessages); diff --git a/lib/generated/intl/messages_it.dart b/lib/generated/intl/messages_it.dart index e62f802..cc0d5b5 100644 --- a/lib/generated/intl/messages_it.dart +++ b/lib/generated/intl/messages_it.dart @@ -20,7 +20,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'it'; - static String m0(String appName) => + static String m0(appName) => "il nome ${appName} è un gioco di parole che combina: \"peg\" (piolo, pedina) - l’elemento principale del gioco - e \"theorema\", associato al rigore e alla logica matematica."; final messages = _notInlinedMessages(_notInlinedMessages); diff --git a/lib/generated/intl/messages_ru.dart b/lib/generated/intl/messages_ru.dart index 281f53f..2ac0a94 100644 --- a/lib/generated/intl/messages_ru.dart +++ b/lib/generated/intl/messages_ru.dart @@ -20,7 +20,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ru'; - static String m0(String appName) => + static String m0(appName) => "название ${appName} - это игра слов, которая объединяет: \"peg\" (колышек, фишка) - основной элемент игры и \"theorema\", что связано с математической строгостью и логикой."; final messages = _notInlinedMessages(_notInlinedMessages); diff --git a/lib/presentation/providers/game_provider.g.dart b/lib/presentation/providers/game_provider.g.dart index aa683ad..7799ad2 100644 --- a/lib/presentation/providers/game_provider.g.dart +++ b/lib/presentation/providers/game_provider.g.dart @@ -10,10 +10,10 @@ part of 'game_provider.dart'; // ignore_for_file: type=lint, type=warning @ProviderFor(Game) -const gameProvider = GameFamily._(); +final gameProvider = GameFamily._(); final class GameProvider extends $NotifierProvider { - const GameProvider._({ + GameProvider._({ required GameFamily super.from, required String super.argument, }) : super( @@ -61,7 +61,7 @@ String _$gameHash() => r'67b0add8aa53b4aa6af3c2089014dc02eb4f6e64'; final class GameFamily extends $Family with $ClassFamilyOverride { - const GameFamily._() + GameFamily._() : super( retry: null, name: r'gameProvider', @@ -84,8 +84,7 @@ abstract class _$Game extends $Notifier { GameState build(String levelId); @$mustCallSuper @override - void runBuild() { - final created = build(_$args); + WhenComplete runBuild() { final ref = this.ref as $Ref; final element = ref.element @@ -95,6 +94,6 @@ abstract class _$Game extends $Notifier { Object?, Object? >; - element.handleValue(ref, created); + return element.handleCreate(ref, () => build(_$args)); } } diff --git a/lib/presentation/providers/settings/language_provider.g.dart b/lib/presentation/providers/settings/language_provider.g.dart index 94e9033..ed1c182 100644 --- a/lib/presentation/providers/settings/language_provider.g.dart +++ b/lib/presentation/providers/settings/language_provider.g.dart @@ -10,11 +10,11 @@ part of 'language_provider.dart'; // ignore_for_file: type=lint, type=warning @ProviderFor(LanguageNotifier) -const languageProvider = LanguageNotifierProvider._(); +final languageProvider = LanguageNotifierProvider._(); final class LanguageNotifierProvider extends $AsyncNotifierProvider { - const LanguageNotifierProvider._() + LanguageNotifierProvider._() : super( from: null, argument: null, @@ -39,8 +39,7 @@ abstract class _$LanguageNotifier extends $AsyncNotifier { FutureOr build(); @$mustCallSuper @override - void runBuild() { - final created = build(); + WhenComplete runBuild() { final ref = this.ref as $Ref, ui.Locale>; final element = ref.element @@ -50,6 +49,6 @@ abstract class _$LanguageNotifier extends $AsyncNotifier { Object?, Object? >; - element.handleValue(ref, created); + return element.handleCreate(ref, build); } } diff --git a/lib/presentation/providers/settings/theme_provider.g.dart b/lib/presentation/providers/settings/theme_provider.g.dart index a6a573d..4d85e52 100644 --- a/lib/presentation/providers/settings/theme_provider.g.dart +++ b/lib/presentation/providers/settings/theme_provider.g.dart @@ -10,11 +10,11 @@ part of 'theme_provider.dart'; // ignore_for_file: type=lint, type=warning @ProviderFor(ThemeNotifier) -const themeProvider = ThemeNotifierProvider._(); +final themeProvider = ThemeNotifierProvider._(); final class ThemeNotifierProvider extends $AsyncNotifierProvider { - const ThemeNotifierProvider._() + ThemeNotifierProvider._() : super( from: null, argument: null, @@ -39,8 +39,7 @@ abstract class _$ThemeNotifier extends $AsyncNotifier { FutureOr build(); @$mustCallSuper @override - void runBuild() { - final created = build(); + WhenComplete runBuild() { final ref = this.ref as $Ref, ThemeMode>; final element = ref.element @@ -50,6 +49,6 @@ abstract class _$ThemeNotifier extends $AsyncNotifier { Object?, Object? >; - element.handleValue(ref, created); + return element.handleCreate(ref, build); } } diff --git a/pubspec.lock b/pubspec.lock index 167aab0..21bef19 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,34 +5,42 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d + sha256: a49d6cf99e8d8e7a8e93668d09ced0bbdb954d0b4fccc2f5f9241c6b87fad95c url: "https://pub.dev" source: hosted - version: "91.0.0" + version: "99.0.0" + analysis_server_plugin: + dependency: transitive + description: + name: analysis_server_plugin + sha256: "3960b28ee740004df39f85d5ebfc91785f7a90e51fd7c9a185e86a36b2f581b4" + url: "https://pub.dev" + source: hosted + version: "0.3.14" analyzer: dependency: transitive description: name: analyzer - sha256: a40a0cee526a7e1f387c6847bd8a5ccbf510a75952ef8a28338e989558072cb0 + sha256: "663efa951fb8a45e06f491223a604c93820598f20e6a99c25617a1576065e8b7" url: "https://pub.dev" source: hosted - version: "8.4.0" + version: "12.1.0" analyzer_buffer: dependency: transitive description: name: analyzer_buffer - sha256: aba2f75e63b3135fd1efaa8b6abefe1aa6e41b6bd9806221620fa48f98156033 + sha256: "445b77e2054fa3e8c8a8ef1b5e9e6b23bb8028fffd34b5e60eaef315b7750674" url: "https://pub.dev" source: hosted - version: "0.1.11" + version: "0.3.3" analyzer_plugin: dependency: transitive description: name: analyzer_plugin - sha256: "08cfefa90b4f4dd3b447bda831cecf644029f9f8e22820f6ee310213ebe2dd53" + sha256: "0057a98d64d7bb872b0c87dff6e73d2c2d80c77156e7a03f127a26f8aa240649" url: "https://pub.dev" source: hosted - version: "0.13.10" + version: "0.14.8" ansicolor: dependency: transitive description: @@ -77,10 +85,10 @@ packages: dependency: transitive description: name: build - sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + sha256: "45d14a0fb23e018d8287c32fc98d726ce466b231928ed9b9200f29bd3ccd39ae" url: "https://pub.dev" source: hosted - version: "4.0.6" + version: "4.0.7" build_config: dependency: transitive description: @@ -101,10 +109,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + sha256: "5367e521935b102bdf1e735d2aab461e36b2edca6517662d088dd04cc39f8d16" url: "https://pub.dev" source: hosted - version: "2.15.0" + version: "2.15.1" built_collection: dependency: transitive description: @@ -137,14 +145,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.4" - ci: - dependency: transitive - description: - name: ci - sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13" - url: "https://pub.dev" - source: hosted - version: "0.1.0" cli_config: dependency: transitive description: @@ -233,46 +233,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" - custom_lint: - dependency: transitive - description: - name: custom_lint - sha256: "751ee9440920f808266c3ec2553420dea56d3c7837dd2d62af76b11be3fcece5" - url: "https://pub.dev" - source: hosted - version: "0.8.1" - custom_lint_builder: - dependency: transitive - description: - name: custom_lint_builder - sha256: "1128db6f58e71d43842f3b9be7465c83f0c47f4dd8918f878dd6ad3b72a32072" - url: "https://pub.dev" - source: hosted - version: "0.8.1" - custom_lint_core: - dependency: transitive - description: - name: custom_lint_core - sha256: "85b339346154d5646952d44d682965dfe9e12cae5febd706f0db3aa5010d6423" - url: "https://pub.dev" - source: hosted - version: "0.8.1" - custom_lint_visitor: - dependency: transitive - description: - name: custom_lint_visitor - sha256: "91f2a81e9f0abb4b9f3bb529f78b6227ce6050300d1ae5b1e2c69c66c7a566d8" - url: "https://pub.dev" - source: hosted - version: "1.0.0+8.4.0" dart_style: dependency: transitive description: name: dart_style - sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b + sha256: a4c1ccfee44c7e75ed80484071a5c142a385345e658fd8bd7c4b5c97e7198f98 url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.8" fake_async: dependency: transitive description: @@ -289,6 +257,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + ffi_leak_tracker: + dependency: transitive + description: + name: ffi_leak_tracker + sha256: "4093d4ef9ca06ffe2786e73bfb25e22aa92112b9bb4ec941f11e3e6b61489a97" + url: "https://pub.dev" + source: hosted + version: "0.1.2" file: dependency: transitive description: @@ -335,10 +311,10 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: "9e2d6907f12cc7d23a846847615941bddee8709bf2bfd274acdf5e80bcf22fde" + sha256: "9255e1e3ad6e38906a1b4f8287678f95f378744c5b46b1985588543f3f19046e" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.3.2" flutter_svg: dependency: "direct main" description: @@ -393,10 +369,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "92d8cee7c57dff0a6c409c05597b460002434eccf7424a712283225b3962d03f" + sha256: "5922b2861e2235a3504896f0d6fa07d84141b480cf52eecd2f42cd25585a9e8a" url: "https://pub.dev" source: hosted - version: "17.2.3" + version: "17.3.0" graphs: dependency: transitive description: @@ -421,14 +397,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.3" - hotreloader: - dependency: transitive - description: - name: hotreloader - sha256: "66871df468fc24eee81f1a0a7cb98acc104716f9b7376d355437b48d633c4ebf" - url: "https://pub.dev" - source: hosted - version: "4.4.0" html: dependency: transitive description: @@ -497,10 +465,10 @@ packages: dependency: "direct main" description: name: intl_utils - sha256: "07469a81dcb011ab3708ed4a324403f0f556f2e3663b769006f92c9e62a0066a" + sha256: d6bc24bad6fa8b76b6bdb5d44de561b7a8088f375852f305b60b72cb608b27ce url: "https://pub.dev" source: hosted - version: "2.8.14" + version: "2.8.15" io: dependency: transitive description: @@ -657,18 +625,18 @@ packages: dependency: transitive description: name: package_info_plus - sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" + sha256: f5c435dc0e0d461e5b32471a870f769b6a1cc46930637efe24fbc535314e78ad url: "https://pub.dev" source: hosted - version: "9.0.1" + version: "10.2.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + sha256: db762cb2f4f25ee60fb6359773861b0f199e00b90d237bd85a76a1e806b46ef4 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "4.1.0" path: dependency: "direct main" description: @@ -801,66 +769,58 @@ packages: dependency: transitive description: name: riverpod - sha256: c406de02bff19d920b832bddfb8283548bfa05ce41c59afba57ce643e116aa59 + sha256: "17100416c51db7810c71a7bb2c34d1f881faa0074fd452afb0c4db6f8f126c76" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.3.2" riverpod_analyzer_utils: dependency: transitive description: name: riverpod_analyzer_utils - sha256: a0f68adb078b790faa3c655110a017f9a7b7b079a57bbd40f540e80dce5fcd29 + sha256: "3e275138862ccc22ed61444a1f9a840f753094c367f28f4123f50289cd204d68" url: "https://pub.dev" source: hosted - version: "1.0.0-dev.7" + version: "1.0.0-dev.10" riverpod_annotation: dependency: "direct main" description: name: riverpod_annotation - sha256: "7230014155777fc31ba3351bc2cb5a3b5717b11bfafe52b1553cb47d385f8897" + sha256: "674dbb26e2db3d9253166faf4758c796af14146b8fbcf5e7102bc8a04cd359b8" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "4.0.3" riverpod_generator: dependency: "direct dev" description: name: riverpod_generator - sha256: "49894543a42cf7a9954fc4e7366b6d3cb2e6ec0fa07775f660afcdd92d097702" + sha256: "54d790c3fee1ae281c448801bfdbfaa9fd961a9d3998494e0fcd9ee32184d7eb" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "4.0.4" riverpod_lint: dependency: "direct dev" description: name: riverpod_lint - sha256: "7ef9c43469e9b5ac4e4c3b24d7c30642e47ce1b12cd7dcdd643534db0a72ed13" - url: "https://pub.dev" - source: hosted - version: "3.0.3" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + sha256: "166f29492228dc471b6fe294092560ccd5545ed15c9fc155622455b58b2451a9" url: "https://pub.dev" source: hosted - version: "0.28.0" + version: "3.1.4" share_plus: dependency: "direct main" description: name: share_plus - sha256: "223873d106614442ea6f20db5a038685cc5b32a2fba81cdecaefbbae0523f7fa" + sha256: "9eee8283462d91a7a1c8bdb67d08874abd75a2f8fae3bc0ca033035e375fb3d8" url: "https://pub.dev" source: hosted - version: "12.0.2" + version: "13.2.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + sha256: "7f7ae28cf400d13f811e297ff37742dba83b79e0a6f5dce14eec0248274e6ce9" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "7.1.0" shared_preferences: dependency: "direct main" description: @@ -990,42 +950,42 @@ packages: dependency: "direct main" description: name: sqflite - sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + sha256: "58a799e6ac17dd32fbab93813d39ed835a75ccc0f8f85b8955fe318c6712b082" url: "https://pub.dev" source: hosted - version: "2.4.2+1" + version: "2.4.3" sqflite_android: dependency: transitive description: name: sqflite_android - sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + sha256: d0548f9d7422a2dae99ec6f8b0a3074463b132d216fa5ba0d230eeefc901983b url: "https://pub.dev" source: hosted - version: "2.4.2+3" + version: "2.4.3" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: f8a08a13fb8f0f8c590df89d745000bed44a673ed94bac846739e1a016875c21 + sha256: "5bf6a55c166e73bf651ba7ec3ed486e577620e3dc8f3a9c6a258a8031b624590" url: "https://pub.dev" source: hosted - version: "2.5.7" + version: "2.5.11" sqflite_darwin: dependency: transitive description: name: sqflite_darwin - sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + sha256: c86ca18b8f666bbf903924687fe21cc16fc385d086005067e26619ca530bef9f url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3+1" sqflite_platform_interface: dependency: transitive description: name: sqflite_platform_interface - sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + sha256: f84939f84350d92d04416f8bc4dc52d3896aec7716cc9e80cf0146342139dc50 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" stack_trace: dependency: transitive description: @@ -1070,10 +1030,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + sha256: "93b153dcb6a26dcddee6ca087dd634b53e38c10b5aa163e8e49501a776456153" url: "https://pub.dev" source: hosted - version: "3.4.0+1" + version: "3.4.1" talker: dependency: "direct main" description: @@ -1086,10 +1046,10 @@ packages: dependency: "direct main" description: name: talker_flutter - sha256: "54cbbf852101721664faf4a05639fd2fdefdc37178327990abea00390690d4bc" + sha256: "7e4b5fb520b4dadfc8db97e73a2a76ea5d6eda471a51489f3c0bd58b96a1ed43" url: "https://pub.dev" source: hosted - version: "5.1.16" + version: "5.1.17" talker_logger: dependency: transitive description: @@ -1150,10 +1110,10 @@ packages: dependency: "direct main" description: name: upgrader - sha256: "3fae4eb861c7e8567f91412d9ca4a287e024e58d6f79f98da79e3f6d78da74ba" + sha256: "6282524d4b664e48e24736ce343eedd115dcc1ce79198fc0bd46f14692e1f05e" url: "https://pub.dev" source: hosted - version: "12.5.0" + version: "13.5.0" url_launcher: dependency: "direct main" description: @@ -1318,10 +1278,10 @@ packages: dependency: transitive description: name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + sha256: ba6f4bba816c8d7e3c1580e170f3786d216951cc6b94babc3b814c08d2cb2738 url: "https://pub.dev" source: hosted - version: "5.15.0" + version: "6.3.0" xdg_directories: dependency: transitive description: @@ -1346,6 +1306,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.3" + yaml_edit: + dependency: transitive + description: + name: yaml_edit + sha256: "07c9e63ba42519745182b88ca12264a7ba2484d8239958778dfe4d44fe760488" + url: "https://pub.dev" + source: hosted + version: "2.2.4" sdks: - dart: ">=3.11.0 <4.0.0" - flutter: ">=3.41.0" + dart: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0" diff --git a/pubspec.yaml b/pubspec.yaml index 2e6bda8..83232ea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pegma description: "A free and cross-platform version of the classic Peg solitaire! Enjoy the timeless puzzle on your mobile device!" publish_to: 'none' -version: 1.11.1+36 +version: 1.11.2+37 environment: sdk: ^3.8.1 @@ -13,23 +13,23 @@ dependencies: flutter_localizations: sdk: flutter intl: ^0.20.2 - go_router: ^17.0.0 + go_router: ^17.3.0 flutter_svg: ^2.2.3 - share_plus: ^12.0.1 + share_plus: ^13.2.0 url_launcher: ^6.3.2 url_launcher_ios: ^6.3.6 - flutter_riverpod: ^3.0.3 - riverpod_annotation: ^3.0.3 + flutter_riverpod: ^3.3.2 + riverpod_annotation: ^4.0.3 shared_preferences: ^2.5.3 talker: ^5.1.0 talker_riverpod_logger: ^5.1.0 - talker_flutter: ^5.1.0 - intl_utils: ^2.8.11 + talker_flutter: ^5.1.17 + intl_utils: ^2.8.15 gaimon: ^1.4.1 - sqflite: ^2.4.2 + sqflite: ^2.4.3 path: ^1.9.1 in_app_review: ^2.0.11 - upgrader: ^12.3.0 + upgrader: ^13.5.0 dev_dependencies: @@ -37,9 +37,9 @@ dev_dependencies: sdk: flutter flutter_lints: ^6.0.0 flutter_launcher_icons: ^0.14.4 - build_runner: ^2.4.15 - riverpod_generator: ^3.0.3 - riverpod_lint: ^3.0.3 + build_runner: ^2.15.1 + riverpod_generator: ^4.0.4 + riverpod_lint: ^3.1.4 flutter_launcher_icons: android: "launcher_icon" diff --git a/test/levels_solvability_test.dart b/test/levels_solvability_test.dart index fdd25ff..173122f 100644 --- a/test/levels_solvability_test.dart +++ b/test/levels_solvability_test.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -9,16 +8,18 @@ void main() { group('Levels Solvability Test', () { test('all levels should be solvable', () async { - // Load manifest to get list of all levels - final manifestContent = await rootBundle.loadString('AssetManifest.json'); - final Map manifestMap = json.decode(manifestContent); - - final levelPaths = manifestMap.keys + final manifest = await AssetManifest.loadFromAssetBundle(rootBundle); + final levelPaths = manifest + .listAssets() .where((String key) => key.contains('lib/data/levels/level_')) .toList(); final levelIds = levelPaths.map((path) { - final levelId = path.split('/').last.replaceAll('level_', '').replaceAll('.json', ''); + final levelId = path + .split('/') + .last + .replaceAll('level_', '') + .replaceAll('.json', ''); return levelId; }).toList(); @@ -154,7 +155,10 @@ class PegSolitaireSolver { // Precompute all possible jump templates sorted by target centrality const directions = [ - [0, 2], [0, -2], [2, 0], [-2, 0], + [0, 2], + [0, -2], + [2, 0], + [-2, 0], ]; _allMoves = []; @@ -171,12 +175,14 @@ class PegSolitaireSolver { if (midIdx != null && tarIdx != null) { final dr = tr - centerR; final dc = tc - centerC; - _allMoves.add(_BitMove( - fromBit: 1 << i, - middleBit: 1 << midIdx, - targetBit: 1 << tarIdx, - targetDist: dr * dr + dc * dc, - )); + _allMoves.add( + _BitMove( + fromBit: 1 << i, + middleBit: 1 << midIdx, + targetBit: 1 << tarIdx, + targetDist: dr * dr + dc * dc, + ), + ); } } } diff --git a/test/levels_uniqueness_test.dart b/test/levels_uniqueness_test.dart index a1477e9..8ee34f3 100644 --- a/test/levels_uniqueness_test.dart +++ b/test/levels_uniqueness_test.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -9,16 +8,18 @@ void main() { group('Levels Uniqueness Test', () { test('all levels should be unique', () async { - // Load manifest to get list of all levels - final manifestContent = await rootBundle.loadString('AssetManifest.json'); - final Map manifestMap = json.decode(manifestContent); - - final levelPaths = manifestMap.keys + final manifest = await AssetManifest.loadFromAssetBundle(rootBundle); + final levelPaths = manifest + .listAssets() .where((String key) => key.contains('lib/data/levels/level_')) .toList(); final levelIds = levelPaths.map((path) { - final levelId = path.split('/').last.replaceAll('level_', '').replaceAll('.json', ''); + final levelId = path + .split('/') + .last + .replaceAll('level_', '') + .replaceAll('.json', ''); return levelId; }).toList(); @@ -84,11 +85,9 @@ void main() { }); test('should load all level files correctly', () async { - // Check that all level files can be loaded and parsed - final manifestContent = await rootBundle.loadString('AssetManifest.json'); - final Map manifestMap = json.decode(manifestContent); - - final levelPaths = manifestMap.keys + final manifest = await AssetManifest.loadFromAssetBundle(rootBundle); + final levelPaths = manifest + .listAssets() .where((String key) => key.contains('lib/data/levels/level_')) .toList(); From f4f5cbd94211be9863e7446f4f99a170dfb47e70 Mon Sep 17 00:00:00 2001 From: Gleb Shalimov Date: Sat, 11 Jul 2026 09:09:02 +0300 Subject: [PATCH 2/3] added spring press animations btns --- .../screens/home/home_screen.dart | 103 ++++++------- .../screens/home/side_menu_screen.dart | 19 +-- .../screens/info/about_screen.dart | 135 +++++++++--------- .../screens/info/story_screen.dart | 61 ++++---- .../widgets/common/app_bar_widget.dart | 14 +- lib/presentation/widgets/common/edgy.dart | 69 +++++++++ .../widgets/common/pressable.dart | 46 ++++++ .../widgets/game/game_bottom_bar.dart | 10 +- 8 files changed, 294 insertions(+), 163 deletions(-) create mode 100644 lib/presentation/widgets/common/edgy.dart create mode 100644 lib/presentation/widgets/common/pressable.dart diff --git a/lib/presentation/screens/home/home_screen.dart b/lib/presentation/screens/home/home_screen.dart index 4911e57..f9e3058 100644 --- a/lib/presentation/screens/home/home_screen.dart +++ b/lib/presentation/screens/home/home_screen.dart @@ -9,6 +9,8 @@ import 'package:pegma/core/router/app_router.dart'; import 'package:pegma/core/themes/app_theme.dart'; import 'package:pegma/presentation/providers/levels_provider.dart'; import 'package:pegma/presentation/providers/completed_levels_provider.dart'; +import 'package:pegma/presentation/widgets/common/edgy.dart'; +import 'package:pegma/presentation/widgets/common/pressable.dart'; import 'package:upgrader/upgrader.dart'; import '../../widgets/common/app_bar_widget.dart'; @@ -46,61 +48,62 @@ class _HomeScreenState extends ConsumerState { body: Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 900), - child: GridView.builder( - padding: const EdgeInsets.fromLTRB( - GeneralConsts.horizontalPadding, - 0, - GeneralConsts.horizontalPadding, - 50, - ), - gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 120, - crossAxisSpacing: 12.0, - mainAxisSpacing: 12.0, - childAspectRatio: 1.0, - ), - itemCount: levels.length, - itemBuilder: (context, index) { - final assetLevelId = levels[index]; - final isCompleted = completedLevels.contains(assetLevelId); + child: Edgy( + child: GridView.builder( + padding: const EdgeInsets.fromLTRB( + GeneralConsts.horizontalPadding, + 0, + GeneralConsts.horizontalPadding, + 50, + ), + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 120, + crossAxisSpacing: 12.0, + mainAxisSpacing: 12.0, + childAspectRatio: 1.0, + ), + itemCount: levels.length, + itemBuilder: (context, index) { + final assetLevelId = levels[index]; + final isCompleted = completedLevels.contains(assetLevelId); - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () async { - if (_isNavigating) return; - setState(() => _isNavigating = true); - await context.push('${AppRouter.game}/$assetLevelId'); - if (mounted) { - setState(() => _isNavigating = false); - } - }, - child: Stack( - alignment: Alignment.center, - children: [ - Center( - child: Text( - assetLevelId, - style: theme.menuTextStyle.copyWith( - color: theme.textColor, + return Pressable( + onTap: () async { + if (_isNavigating) return; + setState(() => _isNavigating = true); + await context.push('${AppRouter.game}/$assetLevelId'); + if (mounted) { + setState(() => _isNavigating = false); + } + }, + child: Stack( + alignment: Alignment.center, + children: [ + Center( + child: Text( + assetLevelId, + style: theme.menuTextStyle.copyWith( + color: theme.textColor, + ), ), ), - ), - if (isCompleted) - Positioned( - top: 6, - child: SvgPicture.asset( - CustomIcons.star, - height: 15, - colorFilter: ColorFilter.mode( - theme.textColor, - BlendMode.srcIn, + if (isCompleted) + Positioned( + top: 6, + child: SvgPicture.asset( + CustomIcons.star, + height: 15, + colorFilter: ColorFilter.mode( + theme.textColor, + BlendMode.srcIn, + ), ), ), - ), - ], - ), - ); - }, + ], + ), + ); + }, + ), ), ), ), diff --git a/lib/presentation/screens/home/side_menu_screen.dart b/lib/presentation/screens/home/side_menu_screen.dart index 2622b31..c9a36ca 100644 --- a/lib/presentation/screens/home/side_menu_screen.dart +++ b/lib/presentation/screens/home/side_menu_screen.dart @@ -7,6 +7,7 @@ import 'package:pegma/generated/l10n.dart'; import '../../../core/router/app_router.dart'; import '../../providers/first_launch_provider.dart'; import '../../widgets/common/app_bar_widget.dart'; +import '../../widgets/common/pressable.dart'; class SideMenuScreen extends ConsumerWidget { const SideMenuScreen({super.key}); @@ -73,16 +74,18 @@ class _MenuListItem extends StatelessWidget { @override Widget build(BuildContext context) { final theme = UIThemes.of(context); - return ListTile( - title: Text(title, style: theme.menuTextStyle), + return Pressable( onTap: onTap, - contentPadding: const EdgeInsets.symmetric( - horizontal: GeneralConsts.horizontalPadding, - vertical: GeneralConsts.verticalPadding, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: GeneralConsts.horizontalPadding, + vertical: GeneralConsts.verticalPadding, + ), + child: Align( + alignment: Alignment.centerLeft, + child: Text(title, style: theme.menuTextStyle), + ), ), - hoverColor: Colors.transparent, - focusColor: Colors.transparent, - splashColor: Colors.transparent, ); } } diff --git a/lib/presentation/screens/info/about_screen.dart b/lib/presentation/screens/info/about_screen.dart index e7d471f..b1cd198 100644 --- a/lib/presentation/screens/info/about_screen.dart +++ b/lib/presentation/screens/info/about_screen.dart @@ -11,6 +11,7 @@ import 'package:pegma/generated/l10n.dart'; import '../../widgets/common/app_bar_widget.dart'; import '../../widgets/common/info_paragraph.dart'; import '../../widgets/common/action_button.dart'; +import '../../widgets/common/edgy.dart'; class AboutScreen extends StatelessWidget { const AboutScreen({super.key}); @@ -42,83 +43,85 @@ class AboutScreen extends StatelessWidget { showBackButton: true, showMenuButton: false, ), - body: SingleChildScrollView( - padding: const EdgeInsets.all(GeneralConsts.horizontalPadding), + body: Edgy( + child: SingleChildScrollView( + padding: const EdgeInsets.all(GeneralConsts.horizontalPadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - InfoParagraph( - text: S.of(context).appDescription(GeneralConsts.appName), - padding: const EdgeInsets.only( - bottom: GeneralConsts.verticalPadding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InfoParagraph( + text: S.of(context).appDescription(GeneralConsts.appName), + padding: const EdgeInsets.only( + bottom: GeneralConsts.verticalPadding, + ), + ), + const SizedBox(height: 12), + if (MarketHelper.shouldShowRating()) + ActionButton(title: S.of(context).rateTheApp, onTap: _rateApp), + ActionButton( + title: S.of(context).shareWithFriends, + onTap: _shareApp, + ), + ActionButton( + title: S.of(context).projectWebsite, + onTap: () => launchLinkUrl(GeneralConsts.projectWebsite), + ), + ActionButton( + title: S.of(context).telegram, + onTap: () => launchLinkUrl(GeneralConsts.telegramUrl), ), - ), - const SizedBox(height: 12), - if (MarketHelper.shouldShowRating()) - ActionButton(title: S.of(context).rateTheApp, onTap: _rateApp), - ActionButton( - title: S.of(context).shareWithFriends, - onTap: _shareApp, - ), - ActionButton( - title: S.of(context).projectWebsite, - onTap: () => launchLinkUrl(GeneralConsts.projectWebsite), - ), - ActionButton( - title: S.of(context).telegram, - onTap: () => launchLinkUrl(GeneralConsts.telegramUrl), - ), - const SizedBox(height: 12), + const SizedBox(height: 12), - Padding( - padding: const EdgeInsets.only( - bottom: GeneralConsts.verticalPadding, - ), - child: RichText( - text: TextSpan( - style: theme.basicTextStyle.copyWith( - color: theme.secondaryTextColor, - ), - children: [ - TextSpan(text: S.of(context).funFact), - TextSpan( - text: GeneralConsts.fontstruct, - style: theme.basicTextStyle, - recognizer: TapGestureRecognizer() - ..onTap = () => launchLinkUrl(GeneralConsts.fontUrl), + Padding( + padding: const EdgeInsets.only( + bottom: GeneralConsts.verticalPadding, + ), + child: RichText( + text: TextSpan( + style: theme.basicTextStyle.copyWith( + color: theme.secondaryTextColor, ), - ], + children: [ + TextSpan(text: S.of(context).funFact), + TextSpan( + text: GeneralConsts.fontstruct, + style: theme.basicTextStyle, + recognizer: TapGestureRecognizer() + ..onTap = () => launchLinkUrl(GeneralConsts.fontUrl), + ), + ], + ), ), ), - ), - const SizedBox(height: 12), + const SizedBox(height: 12), - ActionButton( - title: S.of(context).githubRepository, - onTap: () => launchLinkUrl(GeneralConsts.githubRepository), - ), - ActionButton( - title: S.of(context).xTwitter, - onTap: () => launchLinkUrl(GeneralConsts.twitterUrl), - ), - ActionButton( - title: S.of(context).myWebsite, - onTap: () => launchLinkUrl(GeneralConsts.personalWebsite), - ), - ActionButton( - title: S.of(context).myOtherApps, - onTap: () => launchLinkUrl( - Platform.isIOS - ? GeneralConsts.otherAppsAppStoreLink - : GeneralConsts.otherAppsGooglePlayLink, + ActionButton( + title: S.of(context).githubRepository, + onTap: () => launchLinkUrl(GeneralConsts.githubRepository), + ), + ActionButton( + title: S.of(context).xTwitter, + onTap: () => launchLinkUrl(GeneralConsts.twitterUrl), + ), + ActionButton( + title: S.of(context).myWebsite, + onTap: () => launchLinkUrl(GeneralConsts.personalWebsite), + ), + ActionButton( + title: S.of(context).myOtherApps, + onTap: () => launchLinkUrl( + Platform.isIOS + ? GeneralConsts.otherAppsAppStoreLink + : GeneralConsts.otherAppsGooglePlayLink, + ), ), - ), - const SizedBox(height: 50), - ], + const SizedBox(height: 50), + ], + ), ), ), ); diff --git a/lib/presentation/screens/info/story_screen.dart b/lib/presentation/screens/info/story_screen.dart index 282c855..165a312 100644 --- a/lib/presentation/screens/info/story_screen.dart +++ b/lib/presentation/screens/info/story_screen.dart @@ -3,6 +3,7 @@ import 'package:pegma/core/constants/app_constants.dart'; import 'package:pegma/core/themes/app_theme.dart'; import 'package:pegma/generated/l10n.dart'; import '../../widgets/common/app_bar_widget.dart'; +import '../../widgets/common/edgy.dart'; import '../../widgets/common/info_paragraph.dart'; class StoryScreen extends StatelessWidget { @@ -19,33 +20,39 @@ class StoryScreen extends StatelessWidget { showBackButton: true, showMenuButton: false, ), - body: SingleChildScrollView( - padding: const EdgeInsets.all(GeneralConsts.horizontalPadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - InfoParagraph( - text: S - .of(context) - .pegSolitaireOrSolitaireOnPegsOriginatedInEuropeIn, - ), - InfoParagraph( - text: S.of(context).theEarliestDocumentedMentionOfTheGameIsIn1687, - ), - InfoParagraph( - text: S.of(context).theClassicBoardHasACrossShape77Squares33, - ), - InfoParagraph( - text: S.of(context).theGoalIsToRemoveAllPegsLeavingOnlyOne, - ), - InfoParagraph( - text: S.of(context).pegSolitaireIsNotOnlyAGameButAlsoA, - ), - InfoParagraph( - text: S.of(context).inThe19thCenturyTheGameSpreadAcrossEuropeAnd, - ), - SizedBox(height: 50), - ], + body: Edgy( + child: SingleChildScrollView( + padding: const EdgeInsets.all(GeneralConsts.horizontalPadding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InfoParagraph( + text: S + .of(context) + .pegSolitaireOrSolitaireOnPegsOriginatedInEuropeIn, + ), + InfoParagraph( + text: S + .of(context) + .theEarliestDocumentedMentionOfTheGameIsIn1687, + ), + InfoParagraph( + text: S.of(context).theClassicBoardHasACrossShape77Squares33, + ), + InfoParagraph( + text: S.of(context).theGoalIsToRemoveAllPegsLeavingOnlyOne, + ), + InfoParagraph( + text: S.of(context).pegSolitaireIsNotOnlyAGameButAlsoA, + ), + InfoParagraph( + text: S + .of(context) + .inThe19thCenturyTheGameSpreadAcrossEuropeAnd, + ), + SizedBox(height: 50), + ], + ), ), ), ); diff --git a/lib/presentation/widgets/common/app_bar_widget.dart b/lib/presentation/widgets/common/app_bar_widget.dart index f155080..28374eb 100644 --- a/lib/presentation/widgets/common/app_bar_widget.dart +++ b/lib/presentation/widgets/common/app_bar_widget.dart @@ -3,6 +3,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:pegma/core/constants/app_constants.dart'; import 'package:pegma/core/themes/app_theme.dart'; +import 'package:pegma/presentation/widgets/common/pressable.dart'; import '../../../core/router/app_router.dart'; class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { @@ -39,14 +40,15 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { return AppBar( backgroundColor: theme.bgColor, elevation: 0, + scrolledUnderElevation: 0, + surfaceTintColor: Colors.transparent, centerTitle: true, leading: showLeftArrowButton ? Padding( padding: const EdgeInsets.only( left: GeneralConsts.horizontalPadding, ), - child: GestureDetector( - behavior: HitTestBehavior.opaque, + child: Pressable( onTap: onBackButtonPressed, child: Container( width: 44, @@ -90,14 +92,15 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { return AppBar( backgroundColor: theme.bgColor, elevation: 0, + scrolledUnderElevation: 0, + surfaceTintColor: Colors.transparent, centerTitle: false, leading: showLeftArrowButton ? Padding( padding: const EdgeInsets.only( left: GeneralConsts.horizontalPadding, ), - child: GestureDetector( - behavior: HitTestBehavior.opaque, + child: Pressable( onTap: () { if (context.canPop()) { context.pop(); @@ -161,8 +164,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { }) { return Padding( padding: const EdgeInsets.only(right: GeneralConsts.horizontalPadding), - child: GestureDetector( - behavior: HitTestBehavior.opaque, + child: Pressable( onTap: isEnabled ? onTap : null, child: Container( width: 44, diff --git a/lib/presentation/widgets/common/edgy.dart b/lib/presentation/widgets/common/edgy.dart new file mode 100644 index 0000000..4c06490 --- /dev/null +++ b/lib/presentation/widgets/common/edgy.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +class Edgy extends StatefulWidget { + final Widget child; + final Axis axis; + final bool fadeStart; + final bool fadeEnd; + + const Edgy({ + super.key, + required this.child, + this.axis = Axis.vertical, + this.fadeStart = true, + this.fadeEnd = true, + }); + + @override + State createState() => _EdgyState(); +} + +class _EdgyState extends State { + bool _canScrollStart = false; + bool _canScrollEnd = true; + + bool _handleScroll(ScrollNotification notification) { + if (notification.metrics.axis != widget.axis) return false; + + final canScrollStart = notification.metrics.pixels > 0; + final canScrollEnd = + notification.metrics.pixels < notification.metrics.maxScrollExtent; + + if (canScrollStart != _canScrollStart || canScrollEnd != _canScrollEnd) { + setState(() { + _canScrollStart = canScrollStart; + _canScrollEnd = canScrollEnd; + }); + } + + return false; + } + + @override + Widget build(BuildContext context) { + final isVertical = widget.axis == Axis.vertical; + final fadeStart = widget.fadeStart && _canScrollStart; + final fadeEnd = widget.fadeEnd && _canScrollEnd; + + return ShaderMask( + shaderCallback: (bounds) { + return LinearGradient( + begin: isVertical ? Alignment.topCenter : Alignment.centerLeft, + end: isVertical ? Alignment.bottomCenter : Alignment.centerRight, + colors: [ + fadeStart ? const Color(0x00FFFFFF) : const Color(0xFFFFFFFF), + const Color(0xFFFFFFFF), + const Color(0xFFFFFFFF), + fadeEnd ? const Color(0x00FFFFFF) : const Color(0xFFFFFFFF), + ], + stops: const [0.0, 0.12, 0.88, 1.0], + ).createShader(bounds); + }, + blendMode: BlendMode.dstIn, + child: NotificationListener( + onNotification: _handleScroll, + child: widget.child, + ), + ); + } +} diff --git a/lib/presentation/widgets/common/pressable.dart b/lib/presentation/widgets/common/pressable.dart new file mode 100644 index 0000000..642bb48 --- /dev/null +++ b/lib/presentation/widgets/common/pressable.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:motor/motor.dart'; + +class Pressable extends StatefulWidget { + final VoidCallback? onTap; + final Widget child; + final double pressedScale; + + const Pressable({ + super.key, + this.onTap, + required this.child, + this.pressedScale = 0.96, + }); + + @override + State createState() => _PressableState(); +} + +class _PressableState extends State { + double _scale = 1; + + void _setPressed(bool pressed) { + if (widget.onTap == null) return; + setState(() => _scale = pressed ? widget.pressedScale : 1); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: widget.onTap, + onTapDown: (_) => _setPressed(true), + onTapUp: (_) => _setPressed(false), + onTapCancel: () => _setPressed(false), + child: SingleMotionBuilder( + motion: const CupertinoMotion.smooth(), + value: _scale, + builder: (context, scale, child) { + return Transform.scale(scale: scale, child: child); + }, + child: widget.child, + ), + ); + } +} diff --git a/lib/presentation/widgets/game/game_bottom_bar.dart b/lib/presentation/widgets/game/game_bottom_bar.dart index d9b07b6..ef7faa3 100644 --- a/lib/presentation/widgets/game/game_bottom_bar.dart +++ b/lib/presentation/widgets/game/game_bottom_bar.dart @@ -3,6 +3,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:gaimon/gaimon.dart'; import 'package:pegma/core/constants/app_constants.dart'; import 'package:pegma/core/themes/app_theme.dart'; +import 'package:pegma/presentation/widgets/common/pressable.dart'; class GameBottomBar extends StatelessWidget { final VoidCallback? onUndoPressed; @@ -34,8 +35,7 @@ class GameBottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, + child: Pressable( onTap: canRedo ? () { onRedoPressed?.call(); @@ -56,8 +56,7 @@ class GameBottomBar extends StatelessWidget { ), ), Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, + child: Pressable( onTap: () { onTutorialPressed?.call(); Gaimon.soft(); @@ -76,8 +75,7 @@ class GameBottomBar extends StatelessWidget { ), ), Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, + child: Pressable( onTap: canUndo ? () { onUndoPressed?.call(); From 9f4844697f912bd088029236a59e5526021752c1 Mon Sep 17 00:00:00 2001 From: Gleb Shalimov Date: Sat, 11 Jul 2026 09:09:16 +0300 Subject: [PATCH 3/3] update android files --- CHANGELOG.md | 19 +++++++++++++++++-- README.md | 2 +- android/gradle.properties | 4 ++++ .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle.kts | 4 ++-- pubspec.lock | 16 ++++++++++++++++ pubspec.yaml | 1 + 7 files changed, 42 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da4ca69..b2d1817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,23 @@ +## [1.11.2] + +#### Improvements + +- Added fading edges to scrollable level, about, and story screens. +- Added spring press animations for level tiles, app bar buttons, game controls, and side menu items. +- Fixed app bar color changes while scrolling. + +#### Technical Improvements + +- Updated package dependencies. +- Migrated iOS plugin integration from CocoaPods to Swift Package Manager. +- Raised the iOS deployment target to 15.0 for current Xcode compatibility. +- Updated Gradle, Android Gradle Plugin, and Kotlin versions. + ## [1.11.1] #### Technical Improvements -- Updated package dependencies +- Updated package dependencies. ## [1.11.0] @@ -208,4 +223,4 @@ ## [1.0.0] -- Initial release of **Pegma**. \ No newline at end of file +- Initial release of **Pegma**. diff --git a/README.md b/README.md index bff6141..127d0b4 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ A free and cross-platform version of the classic Peg solitaire! Enjoy the timele ## Credits -[shared_preferences](https://pub.dev/packages/shared_preferences) / [intl](https://pub.dev/packages/intl) / [url_launcher](https://pub.dev/packages/url_launcher) / [flutter_svg](https://pub.dev/packages/flutter_svg) / [talker](https://pub.dev/packages/talker) / [flutter_riverpod]( https://pub.dev/packages/flutter_riverpod) / [gaimon](https://pub.dev/packages/gaimon) / [sqflite](https://pub.dev/packages/sqflite) / [in_app_review](https://pub.dev/packages/in_app_review) / [upgrader](https://pub.dev/packages/upgrader) +[shared_preferences](https://pub.dev/packages/shared_preferences) / [intl](https://pub.dev/packages/intl) / [url_launcher](https://pub.dev/packages/url_launcher) / [flutter_svg](https://pub.dev/packages/flutter_svg) / [talker](https://pub.dev/packages/talker) / [flutter_riverpod]( https://pub.dev/packages/flutter_riverpod) / [gaimon](https://pub.dev/packages/gaimon) / [sqflite](https://pub.dev/packages/sqflite) / [in_app_review](https://pub.dev/packages/in_app_review) / [upgrader](https://pub.dev/packages/upgrader) / [motor](https://pub.dev/packages/motor) > [!NOTE] > Fun fact: I made the font specifically for this app myself for uniqueness and fun with [fontstruct](https://fontstruct.com/fontstructions/show/2728315/pegma-app). Feel free to use it diff --git a/android/gradle.properties b/android/gradle.properties index f018a61..475a628 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,7 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index ac3b479..e4ef43f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 43394ed..da20e6d 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -18,8 +18,8 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.9.1" apply false - id("org.jetbrains.kotlin.android") version "2.1.0" apply false + id("com.android.application") version "8.11.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false } include(":app") diff --git a/pubspec.lock b/pubspec.lock index 21bef19..26e1616 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -241,6 +241,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.8" + equatable: + dependency: transitive + description: + name: equatable + sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" + url: "https://pub.dev" + source: hosted + version: "2.1.0" fake_async: dependency: transitive description: @@ -581,6 +589,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.6.4" + motor: + dependency: "direct main" + description: + name: motor + sha256: cbd49f21b00e568c2b1a55f134ed803614a107782f4fea7769693bca32940c58 + url: "https://pub.dev" + source: hosted + version: "1.1.0" native_toolchain_c: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 83232ea..2a490a9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,6 +30,7 @@ dependencies: path: ^1.9.1 in_app_review: ^2.0.11 upgrader: ^13.5.0 + motor: ^1.1.0 dev_dependencies: