├── ios ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── RunnerTests │ └── RunnerTests.swift ├── .gitignore ├── Podfile.lock └── Podfile ├── fonts ├── Leotaro-Free.otf ├── TT Hoves Pro Trial Bold.ttf ├── TT Hoves Pro Trial Thin.ttf ├── TT Hoves Pro Trial Black.ttf ├── TT Hoves Pro Trial Light.ttf ├── TT Hoves Pro Trial Medium.ttf ├── TT Hoves Pro Trial Regular.ttf ├── TT Hoves Pro Trial ExtraBold.ttf ├── TT Hoves Pro Trial Hairline.ttf └── TT Hoves Pro Trial ExtraLight.ttf ├── assets ├── images │ ├── Glowify-gallery-img-1.png │ ├── f6a5603cd8028babc9c5a74cc3327c99.png │ ├── 668adc4fcd57736f5c718ef0_product-06.png │ ├── 668adc4fcd57736f5c718ef6_product-12.png │ ├── 668adc4fcd57736f5c718ef9_product-18.png │ ├── lg_PFcFK51Hy0J0x8dk2hJTpjSQoTA6wsxcdfAwtFMS.png │ ├── coco-noir-chanel-pink-aesthetic-plrz6za4j9w81o44.png │ └── 8ebb1801-6af2-4a3b-b0c4-ae4a7de2b09d_removalai_preview.png └── icons │ ├── search-normal-1-svgrepo-com.svg │ ├── arrows-direction-down-2-svgrepo-com.svg │ └── shopping-bag-3-svgrepo-com.svg ├── android ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── cosmetics_store │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle.kts ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── build.gradle.kts └── settings.gradle.kts ├── lib ├── utils │ ├── curved_rect_tween.dart │ ├── colours.dart │ └── assets.dart ├── model │ └── product_model.dart ├── screens │ ├── onboarding-screen │ │ ├── widgets │ │ │ ├── oval_painter.dart │ │ │ ├── circle_painter.dart │ │ │ ├── star_one.dart │ │ │ ├── star_two.dart │ │ │ ├── perl_painter.dart │ │ │ ├── wavy_circle_painter.dart │ │ │ ├── background.dart │ │ │ ├── child_flower.dart │ │ │ ├── flower.dart │ │ │ ├── onboarding_content.dart │ │ │ ├── background_circle.dart │ │ │ └── onboarding_navigator.dart │ │ ├── onboarding_animation_screen.dart │ │ └── onboarding_screen.dart │ ├── product-details │ │ ├── widgets │ │ │ ├── product_image.dart │ │ │ ├── arrow_back_button.dart │ │ │ ├── star_painter.dart │ │ │ ├── details_background.dart │ │ │ └── details_card.dart │ │ └── product_details_screen.dart │ └── home-screen │ │ ├── widgets │ │ ├── products_grid.dart │ │ ├── home_app_bar.dart │ │ ├── offer_card.dart │ │ └── product_card.dart │ │ └── home_screen.dart ├── main.dart ├── routes │ ├── fade_transition.dart │ ├── slide_page_route.dart │ └── routes_generator.dart ├── widgets │ ├── app_text.dart │ ├── bouncing_button.dart │ └── rounded_image.dart └── circular_loading.dart ├── README.md ├── .gitignore ├── analysis_options.yaml ├── .metadata ├── pubspec.yaml └── pubspec.lock /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /fonts/Leotaro-Free.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/Leotaro-Free.otf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Bold.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Thin.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Black.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Light.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Medium.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Regular.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial ExtraBold.ttf -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial Hairline.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial Hairline.ttf -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /assets/images/Glowify-gallery-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/Glowify-gallery-img-1.png -------------------------------------------------------------------------------- /fonts/TT Hoves Pro Trial ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/fonts/TT Hoves Pro Trial ExtraLight.ttf -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /assets/images/f6a5603cd8028babc9c5a74cc3327c99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/f6a5603cd8028babc9c5a74cc3327c99.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /assets/images/668adc4fcd57736f5c718ef0_product-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/668adc4fcd57736f5c718ef0_product-06.png -------------------------------------------------------------------------------- /assets/images/668adc4fcd57736f5c718ef6_product-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/668adc4fcd57736f5c718ef6_product-12.png -------------------------------------------------------------------------------- /assets/images/668adc4fcd57736f5c718ef9_product-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/668adc4fcd57736f5c718ef9_product-18.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /assets/images/lg_PFcFK51Hy0J0x8dk2hJTpjSQoTA6wsxcdfAwtFMS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/lg_PFcFK51Hy0J0x8dk2hJTpjSQoTA6wsxcdfAwtFMS.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /assets/images/coco-noir-chanel-pink-aesthetic-plrz6za4j9w81o44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/coco-noir-chanel-pink-aesthetic-plrz6za4j9w81o44.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /assets/images/8ebb1801-6af2-4a3b-b0c4-ae4a7de2b09d_removalai_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SherazAsghar37/cosmetics_store/HEAD/assets/images/8ebb1801-6af2-4a3b-b0c4-ae4a7de2b09d_removalai_preview.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/cosmetics_store/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.cosmetics_store 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity : FlutterActivity() 6 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip 6 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | .cxx/ 9 | 10 | # Remember to never publicly share your keystore. 11 | # See https://flutter.dev/to/reference-keystore 12 | key.properties 13 | **/*.keystore 14 | **/*.jks 15 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /lib/utils/curved_rect_tween.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CurveRectTween extends RectTween { 4 | CurveRectTween({super.begin, super.end, required this.curve}); 5 | final Curve curve; 6 | 7 | @override 8 | Rect lerp(double t) { 9 | return super.lerp(curve.transform(t)) ?? Rect.zero; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | @main 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/model/product_model.dart: -------------------------------------------------------------------------------- 1 | class ProductModel { 2 | final String name; 3 | final String subTitle; 4 | final int reviews; 5 | final int stars; 6 | final int sizeInML; 7 | final double price; 8 | final String imagePath; 9 | 10 | ProductModel({ 11 | required this.name, 12 | required this.subTitle, 13 | required this.reviews, 14 | required this.stars, 15 | required this.sizeInML, 16 | required this.price, 17 | required this.imagePath, 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /assets/icons/search-normal-1-svgrepo-com.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/oval_painter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class OvalPainter extends CustomPainter { 4 | final Color color; 5 | OvalPainter(this.color); 6 | 7 | @override 8 | void paint(Canvas canvas, Size size) { 9 | final paint = 10 | Paint() 11 | ..color = color 12 | ..style = PaintingStyle.fill; 13 | 14 | final oval = Rect.fromLTWH(0, 0, size.width, size.height); 15 | canvas.drawOval(oval, paint); 16 | } 17 | 18 | @override 19 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 20 | } 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cosmetics_store 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) 13 | 14 | For help getting started with Flutter development, view the 15 | [online documentation](https://docs.flutter.dev/), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /android/build.gradle.kts: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() 9 | rootProject.layout.buildDirectory.value(newBuildDir) 10 | 11 | subprojects { 12 | val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) 13 | project.layout.buildDirectory.value(newSubprojectBuildDir) 14 | } 15 | subprojects { 16 | project.evaluationDependsOn(":app") 17 | } 18 | 19 | tasks.register("clean") { 20 | delete(rootProject.layout.buildDirectory) 21 | } 22 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /lib/screens/product-details/widgets/product_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/model/product_model.dart'; 2 | import 'package:cosmetics_store/utils/curved_rect_tween.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class ProductImage extends StatelessWidget { 6 | const ProductImage({super.key, required this.product}); 7 | 8 | final ProductModel product; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Hero( 13 | tag: product.imagePath, 14 | createRectTween: 15 | (begin, end) => CurveRectTween( 16 | begin: begin, 17 | end: end, 18 | curve: Curves.fastOutSlowIn, 19 | ), 20 | child: Image.asset(product.imagePath), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/routes/routes_generator.dart'; 2 | import 'package:cosmetics_store/screens/onboarding-screen/onboarding_animation_screen.dart'; 3 | import 'package:cosmetics_store/utils/colours.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | void main() { 7 | runApp(const MyApp()); 8 | } 9 | 10 | class MyApp extends StatelessWidget { 11 | const MyApp({super.key}); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return MaterialApp( 16 | title: 'Costmetics Store', 17 | theme: ThemeData( 18 | colorScheme: ColorScheme.fromSeed(seedColor: Colours.blackColor), 19 | ), 20 | onGenerateRoute: routesGenerator, 21 | home: OnboardingAnimationScreen(), 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/circle_painter.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/colours.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class CirclePainter extends CustomPainter { 5 | @override 6 | void paint(Canvas canvas, Size size) { 7 | final paint = 8 | Paint() 9 | ..color = Colours.whiteColor 10 | ..strokeWidth = 1 11 | ..style = PaintingStyle.stroke; 12 | final center = Offset(size.width / 2, size.height / 2); 13 | final radius = size.width * 0.5; 14 | final circlePath = 15 | Path()..addOval(Rect.fromCircle(center: center, radius: radius)); 16 | 17 | canvas.drawPath(circlePath, paint); 18 | } 19 | 20 | @override 21 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 22 | } 23 | -------------------------------------------------------------------------------- /lib/utils/colours.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | abstract class Colours { 4 | static const Color primaryColor = Color(0xFF1169FE); 5 | static const Color secondaryColor = Color(0xFF9F7AFD); 6 | static const Color backgroundColor = blackColor; 7 | 8 | static const Color blackColor = Color(0xFF070707); 9 | static const Color whiteColor = Color(0xFFFFFFFF); 10 | static const Color transparentColor = Colors.transparent; 11 | 12 | static const Color yellowColor = Colors.yellow; 13 | static const Color yellowLightColor = Color(0xFFF8FEAC); 14 | 15 | //TextColors 16 | static const Color primaryTextColor = Colors.white; 17 | static const Color primaryTextColorLight = Colors.white54; 18 | 19 | //cards 20 | static const Color cardBackgroundColor = Color(0xFF202020); 21 | } 22 | -------------------------------------------------------------------------------- /lib/routes/fade_transition.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class FadeInTransition extends PageRouteBuilder { 4 | final Widget widget; 5 | final int? duration; 6 | FadeInTransition({required this.widget, this.duration}) 7 | : super( 8 | pageBuilder: (context, animation, secondaryAnimation) => widget, 9 | transitionDuration: Duration(milliseconds: duration ?? 1500), 10 | transitionsBuilder: (context, animation, secondaryAnimation, child) { 11 | final opacityTween = Tween( 12 | begin: 0.0, 13 | end: 1.0, 14 | ).chain(CurveTween(curve: Curves.fastOutSlowIn)); 15 | final fadeAnimation = animation.drive(opacityTween); 16 | return FadeTransition(opacity: fadeAnimation, child: child); 17 | }, 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /assets/icons/arrows-direction-down-2-svgrepo-com.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | val flutterSdkPath = run { 3 | val properties = java.util.Properties() 4 | file("local.properties").inputStream().use { properties.load(it) } 5 | val flutterSdkPath = properties.getProperty("flutter.sdk") 6 | require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } 7 | flutterSdkPath 8 | } 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | } 18 | 19 | plugins { 20 | id("dev.flutter.flutter-plugin-loader") version "1.0.0" 21 | id("com.android.application") version "8.7.0" apply false 22 | id("org.jetbrains.kotlin.android") version "1.8.22" apply false 23 | } 24 | 25 | include(":app") 26 | -------------------------------------------------------------------------------- /lib/routes/slide_page_route.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SlidePageRoute extends PageRouteBuilder { 4 | final Widget widget; 5 | SlidePageRoute({required this.widget}) 6 | : super( 7 | pageBuilder: (context, animation, secondaryAnimation) => widget, 8 | transitionDuration: const Duration(milliseconds: 1500), 9 | transitionsBuilder: (context, animation, secondaryAnimation, child) { 10 | const begin = Offset(1.0, 0.0); 11 | const end = Offset.zero; 12 | const curve = Curves.fastOutSlowIn; 13 | 14 | final tween = Tween( 15 | begin: begin, 16 | end: end, 17 | ).chain(CurveTween(curve: curve)); 18 | 19 | final offsetAnimation = animation.drive(tween); 20 | return SlideTransition(position: offsetAnimation, child: child); 21 | }, 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 12.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .build/ 9 | .buildlog/ 10 | .history 11 | .svn/ 12 | .swiftpm/ 13 | migrate_working_dir/ 14 | 15 | # IntelliJ related 16 | *.iml 17 | *.ipr 18 | *.iws 19 | .idea/ 20 | 21 | # The .vscode folder contains launch configuration and tasks you configure in 22 | # VS Code which you may wish to be included in version control, so this line 23 | # is commented out by default. 24 | #.vscode/ 25 | 26 | # Flutter/Dart/Pub related 27 | **/doc/api/ 28 | **/ios/Flutter/.last_build_id 29 | .dart_tool/ 30 | .flutter-plugins 31 | .flutter-plugins-dependencies 32 | .pub-cache/ 33 | .pub/ 34 | /build/ 35 | 36 | # Symbolication related 37 | app.*.symbols 38 | 39 | # Obfuscation related 40 | app.*.map.json 41 | 42 | # Android Studio will place build artifacts here 43 | /android/app/debug 44 | /android/app/profile 45 | /android/app/release 46 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - path_provider_foundation (0.0.1): 4 | - Flutter 5 | - FlutterMacOS 6 | - sqflite_darwin (0.0.4): 7 | - Flutter 8 | - FlutterMacOS 9 | 10 | DEPENDENCIES: 11 | - Flutter (from `Flutter`) 12 | - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) 13 | - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) 14 | 15 | EXTERNAL SOURCES: 16 | Flutter: 17 | :path: Flutter 18 | path_provider_foundation: 19 | :path: ".symlinks/plugins/path_provider_foundation/darwin" 20 | sqflite_darwin: 21 | :path: ".symlinks/plugins/sqflite_darwin/darwin" 22 | 23 | SPEC CHECKSUMS: 24 | Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 25 | path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 26 | sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 27 | 28 | PODFILE CHECKSUM: 4305caec6b40dde0ae97be1573c53de1882a07e5 29 | 30 | COCOAPODS: 1.16.2 31 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/star_one.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/colours.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class StarOne extends CustomPainter { 5 | @override 6 | void paint(Canvas canvas, Size size) { 7 | final paint = 8 | Paint() 9 | ..color = Colours.whiteColor 10 | ..strokeWidth = 1 11 | ..style = PaintingStyle.stroke; 12 | final path = 13 | Path() 14 | ..moveTo(size.width * 0.2, 0) 15 | ..lineTo(size.width * 0.9, size.height) 16 | ..moveTo(size.width * 0.25, size.height * 0.95) 17 | ..lineTo(size.width * 0.8, size.height * 0.1) 18 | ..moveTo(size.width, size.height * 0.4) 19 | ..lineTo(0, size.height * 0.7) 20 | ..moveTo(size.width * 0.05, size.height * 0.4) 21 | ..lineTo(size.width * 0.95, size.height * 0.6) 22 | ..close(); 23 | 24 | canvas.drawPath(path, paint); 25 | } 26 | 27 | @override 28 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 29 | } 30 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/star_two.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/colours.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class StarTwo extends CustomPainter { 5 | @override 6 | void paint(Canvas canvas, Size size) { 7 | final paint = 8 | Paint() 9 | ..color = Colours.whiteColor 10 | ..strokeWidth = 1 11 | ..style = PaintingStyle.stroke; 12 | final path = 13 | Path() 14 | ..moveTo(size.width * 0.5, 0) 15 | ..lineTo(size.width * 0.5, size.height) 16 | ..moveTo(size.width * 0.15, size.height * 0.15) 17 | ..lineTo(size.width * 0.85, size.height * 0.85) 18 | ..moveTo(0, size.height * 0.5) 19 | ..lineTo(size.width, size.height * 0.5) 20 | ..moveTo(size.width * 0.85, size.height * 0.15) 21 | ..lineTo(size.width * 0.15, size.height * 0.85) 22 | ..close(); 23 | 24 | canvas.drawPath(path, paint); 25 | } 26 | 27 | @override 28 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 29 | } 30 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /lib/screens/product-details/widgets/arrow_back_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/colours.dart'; 2 | import 'package:cosmetics_store/widgets/bouncing_button.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_animate/flutter_animate.dart'; 5 | 6 | class ArrowBackButton extends StatelessWidget { 7 | const ArrowBackButton({super.key}); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return BouncingButton( 12 | onPressed: () { 13 | Navigator.pop(context); 14 | }, 15 | child: Container( 16 | width: 45, 17 | height: 45, 18 | decoration: BoxDecoration( 19 | color: Colours.cardBackgroundColor, 20 | borderRadius: BorderRadius.circular(18), 21 | ), 22 | child: Icon( 23 | Icons.arrow_back_rounded, 24 | color: Colours.whiteColor, 25 | size: 20, 26 | ), 27 | ), 28 | ) 29 | .animate(delay: 200.ms) 30 | .moveY(begin: 30, end: 0, duration: 800.ms, curve: Curves.fastOutSlowIn) 31 | .fade(duration: 800.ms, curve: Curves.fastOutSlowIn); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/perl_painter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PerlPainter extends CustomPainter { 4 | @override 5 | void paint(Canvas canvas, Size size) { 6 | final paint = 7 | Paint() 8 | ..color = Colors.white 9 | ..strokeWidth = 0.1 10 | ..style = PaintingStyle.fill 11 | ..maskFilter = const MaskFilter.blur(BlurStyle.solid, 1); 12 | 13 | final path = 14 | Path() 15 | ..moveTo(0, size.height) 16 | ..quadraticBezierTo( 17 | size.width * 1.1, 18 | size.height * 0.4, 19 | size.width * 0.9, 20 | size.height * 0.2, 21 | ) 22 | ..quadraticBezierTo( 23 | size.width * 0.7, 24 | 0, 25 | size.width * 0.45, 26 | size.height * 0.2, 27 | ) 28 | ..quadraticBezierTo( 29 | size.width * 0.25, 30 | size.height * 0.6, 31 | 0, 32 | size.height, 33 | ) 34 | ..close(); 35 | 36 | canvas.drawPath(path, paint); 37 | } 38 | 39 | @override 40 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 41 | } 42 | -------------------------------------------------------------------------------- /lib/widgets/app_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/colours.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class AppText extends StatelessWidget { 5 | final String text; 6 | final double fontSize; 7 | final Color color; 8 | final FontWeight fontWeight; 9 | final TextAlign textAlign; 10 | final TextOverflow? overflow; 11 | final int? maxLines; 12 | final double letterSpacing; 13 | final bool softWrap; 14 | final double? height; 15 | const AppText({ 16 | super.key, 17 | required this.text, 18 | this.fontSize = 15, 19 | this.color = Colours.primaryTextColor, 20 | this.fontWeight = FontWeight.normal, 21 | this.textAlign = TextAlign.start, 22 | this.overflow, 23 | this.maxLines, 24 | this.letterSpacing = 0, 25 | this.softWrap = true, 26 | this.height, 27 | }); 28 | 29 | @override 30 | Widget build(BuildContext context) { 31 | return Text( 32 | text, 33 | style: TextStyle( 34 | fontSize: fontSize, 35 | color: color, 36 | fontWeight: fontWeight, 37 | letterSpacing: letterSpacing, 38 | fontFamily: 'TT Hoves Pro Trial', 39 | height: height ?? 0, 40 | ), 41 | textAlign: textAlign, 42 | overflow: overflow, 43 | maxLines: maxLines, 44 | softWrap: softWrap, 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /lib/routes/routes_generator.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/model/product_model.dart'; 2 | import 'package:cosmetics_store/routes/fade_transition.dart'; 3 | import 'package:cosmetics_store/routes/slide_page_route.dart'; 4 | import 'package:cosmetics_store/screens/home-screen/home_screen.dart'; 5 | import 'package:cosmetics_store/screens/onboarding-screen/onboarding_animation_screen.dart'; 6 | import 'package:cosmetics_store/screens/onboarding-screen/onboarding_screen.dart'; 7 | import 'package:cosmetics_store/screens/product-details/product_details_screen.dart'; 8 | import 'package:flutter/material.dart'; 9 | 10 | Route routesGenerator(RouteSettings routeSettings) { 11 | switch (routeSettings.name) { 12 | case OnboardingAnimationScreen.routeName: 13 | return FadeInTransition(widget: OnboardingAnimationScreen()); 14 | case OnboardingScreen.routeName: 15 | return FadeInTransition(widget: const OnboardingScreen()); 16 | case HomeScreen.routeName: 17 | return SlidePageRoute(widget: HomeScreen()); 18 | case ProductDetailsScreen.routeName: 19 | return FadeInTransition( 20 | duration: 1000, 21 | widget: ProductDetailsScreen( 22 | product: routeSettings.arguments as ProductModel, 23 | ), 24 | ); 25 | 26 | default: 27 | return MaterialPageRoute( 28 | builder: 29 | (context) => 30 | const Scaffold(body: Center(child: Text("Screen not found"))), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/widgets/bouncing_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class BouncingButton extends StatefulWidget { 4 | final Widget child; 5 | final VoidCallback onPressed; 6 | 7 | const BouncingButton({ 8 | required this.child, 9 | required this.onPressed, 10 | super.key, 11 | }); 12 | 13 | @override 14 | State createState() => _BouncingButtonState(); 15 | } 16 | 17 | class _BouncingButtonState extends State 18 | with SingleTickerProviderStateMixin { 19 | late double _scale; 20 | late AnimationController _controller; 21 | 22 | @override 23 | void initState() { 24 | super.initState(); 25 | _controller = AnimationController( 26 | vsync: this, 27 | duration: const Duration(milliseconds: 100), 28 | lowerBound: 0.0, 29 | upperBound: 0.2, 30 | ); 31 | _controller.addListener(() { 32 | setState(() {}); 33 | }); 34 | } 35 | 36 | @override 37 | void dispose() { 38 | super.dispose(); 39 | _controller.dispose(); 40 | } 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | _scale = 1 - _controller.value; 45 | return Listener( 46 | onPointerDown: (PointerDownEvent event) { 47 | _controller.forward(); 48 | }, 49 | onPointerUp: (PointerUpEvent event) { 50 | _controller.reverse(); 51 | widget.onPressed(); 52 | }, 53 | child: Transform.scale(scale: _scale, child: widget.child), 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /assets/icons/shopping-bag-3-svgrepo-com.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /lib/screens/home-screen/widgets/products_grid.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/screens/home-screen/widgets/offer_card.dart'; 2 | import 'package:cosmetics_store/screens/home-screen/widgets/product_card.dart'; 3 | import 'package:cosmetics_store/utils/assets.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_animate/flutter_animate.dart'; 6 | import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; 7 | 8 | class ProductsGrid extends StatefulWidget { 9 | const ProductsGrid({super.key}); 10 | 11 | @override 12 | State createState() => _ProductsGridState(); 13 | } 14 | 15 | class _ProductsGridState extends State { 16 | final data = Assets.data; 17 | @override 18 | Widget build(BuildContext context) { 19 | return StaggeredGrid.count( 20 | crossAxisCount: 2, 21 | mainAxisSpacing: 15, 22 | crossAxisSpacing: 20, 23 | children: List.generate(data.length + 1, (index) { 24 | int i = index == 0 ? 0 : index - 1; 25 | final e = data.elementAt(i); 26 | return StaggeredGridTile.fit( 27 | crossAxisCellCount: 1, 28 | child: (index == 1 ? OfferCard() : ProductCard(product: e)) 29 | .animate(delay: 100.ms + (i * 150).ms) 30 | .moveX( 31 | begin: 150, 32 | end: 0, 33 | curve: Curves.fastOutSlowIn, 34 | duration: 1700.ms, 35 | ), 36 | ); 37 | }), 38 | ); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at https://dart.dev/lints. 17 | # 18 | # Instead of disabling a lint rule for the entire project in the 19 | # section below, it can also be suppressed for a single line of code 20 | # or a specific dart file by using the `// ignore: name_of_lint` and 21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 22 | # producing the lint. 23 | rules: 24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 26 | 27 | # Additional information about this file can be found at 28 | # https://dart.dev/guides/language/analysis-options 29 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '12.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | 33 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 34 | target 'RunnerTests' do 35 | inherit! :search_paths 36 | end 37 | end 38 | 39 | post_install do |installer| 40 | installer.pods_project.targets.each do |target| 41 | flutter_additional_ios_build_settings(target) 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /android/app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | id("kotlin-android") 4 | // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. 5 | id("dev.flutter.flutter-gradle-plugin") 6 | } 7 | 8 | android { 9 | namespace = "com.example.cosmetics_store" 10 | compileSdk = flutter.compileSdkVersion 11 | ndkVersion = flutter.ndkVersion 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_11 15 | targetCompatibility = JavaVersion.VERSION_11 16 | } 17 | 18 | kotlinOptions { 19 | jvmTarget = JavaVersion.VERSION_11.toString() 20 | } 21 | 22 | defaultConfig { 23 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 24 | applicationId = "com.example.cosmetics_store" 25 | // You can update the following values to match your application needs. 26 | // For more information, see: https://flutter.dev/to/review-gradle-config. 27 | minSdk = flutter.minSdkVersion 28 | targetSdk = flutter.targetSdkVersion 29 | versionCode = flutter.versionCode 30 | versionName = flutter.versionName 31 | } 32 | 33 | buildTypes { 34 | release { 35 | // TODO: Add your own signing config for the release build. 36 | // Signing with the debug keys for now, so `flutter run --release` works. 37 | signingConfig = signingConfigs.getByName("debug") 38 | } 39 | } 40 | } 41 | 42 | flutter { 43 | source = "../.." 44 | } 45 | -------------------------------------------------------------------------------- /lib/screens/product-details/widgets/star_painter.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math' as math; 2 | import 'package:cosmetics_store/utils/colours.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class StarPainter extends CustomPainter { 6 | @override 7 | void paint(Canvas canvas, Size size) { 8 | final Paint paint = Paint()..style = PaintingStyle.fill; 9 | 10 | paint.shader = LinearGradient( 11 | colors: [ 12 | Colours.yellowColor, 13 | Colours.yellowLightColor, 14 | Colours.yellowColor, 15 | ], 16 | begin: Alignment.centerLeft, 17 | end: Alignment.centerRight, 18 | ).createShader( 19 | Rect.fromCircle( 20 | center: Offset(size.width / 2, size.height / 2), 21 | radius: size.width / 2, 22 | ), 23 | ); 24 | 25 | final Path path = Path(); 26 | 27 | final double centerX = size.width / 2; 28 | final double centerY = size.height / 2; 29 | final double outerRadius = size.width / 2; 30 | final double innerRadius = outerRadius / 2.5; 31 | 32 | for (int i = 0; i < 8; i++) { 33 | // 45-degree steps 34 | final double angle = (math.pi / 4) * i; 35 | final double radius = (i.isEven) ? outerRadius : innerRadius; 36 | 37 | final double x = centerX + radius * math.cos(angle); 38 | final double y = centerY + radius * math.sin(angle); 39 | 40 | if (i == 0) { 41 | path.moveTo(x, y); 42 | } else { 43 | path.lineTo(x, y); 44 | } 45 | } 46 | 47 | path.close(); 48 | canvas.drawPath(path, paint); 49 | } 50 | 51 | @override 52 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 53 | } 54 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /lib/screens/home-screen/widgets/home_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/assets.dart'; 2 | import 'package:cosmetics_store/utils/colours.dart'; 3 | import 'package:cosmetics_store/widgets/rounded_image.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class HomeAppBar extends StatelessWidget { 7 | const HomeAppBar({super.key, required this.size}); 8 | 9 | final Size size; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return SizedBox( 14 | height: size.height * 0.13, 15 | child: Row( 16 | spacing: 60, 17 | crossAxisAlignment: CrossAxisAlignment.start, 18 | children: [ 19 | Expanded( 20 | child: Text( 21 | "Search the your best product", 22 | style: TextStyle( 23 | fontFamily: 'Leotaro', 24 | fontSize: 30, 25 | color: Colours.primaryTextColor, 26 | fontWeight: FontWeight.w600, 27 | height: 1.2, 28 | ), 29 | ), 30 | ), 31 | Column( 32 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 33 | children: [ 34 | RoundedImage( 35 | source: Assets.profilePicture, 36 | padding: EdgeInsets.all(10), 37 | borderRadius: 18, 38 | width: 45, 39 | ), 40 | RoundedImage( 41 | source: Assets.searchIcon, 42 | type: ImageSourceType.svg, 43 | padding: EdgeInsets.all(13), 44 | borderRadius: 16, 45 | width: 45, 46 | ), 47 | ], 48 | ), 49 | ], 50 | ), 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/screens/home-screen/home_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/screens/home-screen/widgets/home_app_bar.dart'; 2 | import 'package:cosmetics_store/screens/home-screen/widgets/products_grid.dart'; 3 | import 'package:cosmetics_store/utils/colours.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class HomeScreen extends StatefulWidget { 7 | static const String routeName = '/home-screen'; 8 | const HomeScreen({super.key}); 9 | 10 | @override 11 | State createState() => _HomeScreenState(); 12 | } 13 | 14 | class _HomeScreenState extends State { 15 | Color _backgroundColor = Colours.transparentColor; 16 | 17 | @override 18 | void initState() { 19 | super.initState(); 20 | Future.delayed(Duration(milliseconds: 800), () { 21 | setState(() { 22 | _backgroundColor = Colours.backgroundColor; 23 | }); 24 | }); 25 | } 26 | 27 | @override 28 | Widget build(BuildContext context) { 29 | final size = MediaQuery.sizeOf(context); 30 | return AnimatedContainer( 31 | duration: const Duration(milliseconds: 1500), 32 | curve: Curves.fastOutSlowIn, 33 | color: _backgroundColor, 34 | child: Scaffold( 35 | backgroundColor: Colors.transparent, // Set to transparent so it blends 36 | body: SafeArea( 37 | bottom: false, 38 | child: Padding( 39 | padding: EdgeInsets.symmetric(horizontal: 20), 40 | child: SingleChildScrollView( 41 | child: Column( 42 | children: [ 43 | SizedBox(height: 10), 44 | HomeAppBar(size: size), 45 | SizedBox(height: 40), 46 | ProductsGrid(), 47 | ], 48 | ), 49 | ), 50 | ), 51 | ), 52 | ), 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/screens/product-details/product_details_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/model/product_model.dart'; 2 | import 'package:cosmetics_store/screens/product-details/widgets/arrow_back_button.dart'; 3 | import 'package:cosmetics_store/screens/product-details/widgets/details_background.dart'; 4 | import 'package:cosmetics_store/screens/product-details/widgets/details_card.dart'; 5 | import 'package:cosmetics_store/screens/product-details/widgets/product_image.dart'; 6 | import 'package:cosmetics_store/utils/colours.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:flutter/scheduler.dart' show timeDilation; 9 | 10 | class ProductDetailsScreen extends StatelessWidget { 11 | static const String routeName = '/product-details-screen'; 12 | final ProductModel product; 13 | const ProductDetailsScreen({super.key, required this.product}); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | timeDilation = 1.5; 18 | final size = MediaQuery.sizeOf(context); 19 | return Scaffold( 20 | backgroundColor: Colours.backgroundColor, 21 | body: SafeArea( 22 | bottom: false, 23 | child: Stack( 24 | children: [ 25 | DetailsBackground(size: size), 26 | Padding( 27 | padding: EdgeInsets.symmetric(horizontal: 10), 28 | child: Column( 29 | crossAxisAlignment: CrossAxisAlignment.start, 30 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 31 | children: [ 32 | ArrowBackButton(), 33 | SizedBox(height: 20), 34 | ProductImage(product: product), 35 | DetailsCard(product: product), 36 | ], 37 | ), 38 | ), 39 | ], 40 | ), 41 | ), 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Cosmetics Store 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | cosmetics_store 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | CADisableMinimumFrameDurationOnPhone 45 | 46 | UIApplicationSupportsIndirectInputEvents 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: "35c388afb57ef061d06a39b537336c87e0e3d1b1" 8 | channel: "stable" 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 17 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 18 | - platform: android 19 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 20 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 21 | - platform: ios 22 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 23 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 24 | - platform: linux 25 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 26 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 27 | - platform: macos 28 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 29 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 30 | - platform: web 31 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 32 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 33 | - platform: windows 34 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 35 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /lib/screens/product-details/widgets/details_background.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | import 'package:cosmetics_store/utils/colours.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class DetailsBackground extends StatelessWidget { 6 | const DetailsBackground({super.key, required this.size}); 7 | 8 | final Size size; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Stack( 13 | children: [ 14 | Positioned( 15 | right: size.width * 0.1, 16 | bottom: size.height * 0.35, 17 | child: BackdropFilter( 18 | filter: ImageFilter.blur(sigmaX: 100, sigmaY: 100), 19 | child: Container( 20 | height: 200, 21 | width: 200, 22 | 23 | decoration: BoxDecoration( 24 | color: Colours.whiteColor.withValues(alpha: 0.3), 25 | borderRadius: BorderRadius.circular(100), 26 | ), 27 | ), 28 | ), 29 | ), 30 | Positioned( 31 | left: size.width * 0.1, 32 | bottom: size.height * 0.4, 33 | child: BackdropFilter( 34 | filter: ImageFilter.blur(sigmaX: 100, sigmaY: 100), 35 | child: Container( 36 | height: 200, 37 | width: 200, 38 | 39 | decoration: BoxDecoration( 40 | color: Colours.whiteColor.withValues(alpha: 0.3), 41 | borderRadius: BorderRadius.circular(100), 42 | ), 43 | ), 44 | ), 45 | ), 46 | Positioned( 47 | left: size.width * 0.2, 48 | bottom: size.height * 0.4, 49 | child: BackdropFilter( 50 | filter: ImageFilter.blur(sigmaX: 100, sigmaY: 100), 51 | child: SizedBox(height: 0, width: 0), 52 | ), 53 | ), 54 | ], 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/onboarding_animation_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/flower.dart'; 2 | import 'package:cosmetics_store/utils/colours.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class OnboardingAnimationScreen extends StatefulWidget { 6 | static const String routeName = '/onboarding_animation_screen'; 7 | const OnboardingAnimationScreen({super.key}); 8 | 9 | @override 10 | State createState() => 11 | _OnboardingAnimationScreenState(); 12 | } 13 | 14 | class _OnboardingAnimationScreenState extends State 15 | with TickerProviderStateMixin { 16 | @override 17 | Widget build(BuildContext context) { 18 | final size = MediaQuery.of(context).size; 19 | return Scaffold( 20 | backgroundColor: Colours.backgroundColor, 21 | body: Container( 22 | decoration: BoxDecoration( 23 | gradient: RadialGradient( 24 | colors: [ 25 | Colours.primaryColor.withValues(alpha: 0.5), 26 | Colours.transparentColor, 27 | ], 28 | stops: [0, 1], 29 | radius: 1.2, 30 | focalRadius: 0.2, 31 | center: Alignment(1.2, 0.6), 32 | ), 33 | ), 34 | child: Container( 35 | height: size.height, 36 | decoration: BoxDecoration( 37 | gradient: RadialGradient( 38 | colors: [ 39 | Colours.primaryColor.withValues(alpha: 0.5), 40 | Colours.transparentColor, 41 | ], 42 | stops: [0, 1], 43 | radius: 1.2, 44 | focalRadius: 0.2, 45 | center: Alignment(-1.2, -0.6), 46 | ), 47 | ), 48 | child: Center(child: Flower()), 49 | ), 50 | ), 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/screens/home-screen/widgets/offer_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/utils/colours.dart'; 2 | import 'package:cosmetics_store/widgets/app_text.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_animate/flutter_animate.dart'; 5 | 6 | class OfferCard extends StatelessWidget { 7 | const OfferCard({super.key}); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Container( 12 | height: 110, 13 | padding: EdgeInsets.symmetric(vertical: 15, horizontal: 15), 14 | decoration: BoxDecoration( 15 | gradient: LinearGradient( 16 | colors: [Colours.secondaryColor, Colours.primaryColor], 17 | transform: GradientRotation(0.5), 18 | begin: Alignment.topLeft, 19 | end: Alignment.bottomRight, 20 | ), 21 | borderRadius: BorderRadius.circular(25), 22 | ), 23 | child: Column( 24 | crossAxisAlignment: CrossAxisAlignment.start, 25 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 26 | children: [ 27 | AppText( 28 | text: "20%", 29 | fontSize: 45, 30 | fontWeight: FontWeight.w500, 31 | height: 1, 32 | ) 33 | .animate(delay: 700.ms) 34 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn) 35 | .moveY( 36 | begin: 50, 37 | end: 0, 38 | duration: 1000.ms, 39 | curve: Curves.fastOutSlowIn, 40 | ), 41 | AppText( 42 | text: "for a friend", 43 | fontSize: 28, 44 | fontWeight: FontWeight.w300, 45 | height: 1, 46 | ) 47 | .animate(delay: 750.ms) 48 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn) 49 | .moveY( 50 | begin: 50, 51 | end: 0, 52 | duration: 1000.ms, 53 | curve: Curves.fastOutSlowIn, 54 | ), 55 | ], 56 | ), 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/wavy_circle_painter.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math' as math; 2 | import 'package:cosmetics_store/utils/colours.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class WavyCirclePainter extends CustomPainter { 6 | @override 7 | void paint(Canvas canvas, Size size) { 8 | final Paint paint = Paint()..style = PaintingStyle.fill; 9 | 10 | paint.shader = LinearGradient( 11 | begin: Alignment.topRight, 12 | end: Alignment.bottomLeft, 13 | colors: [Colours.primaryColor, Colours.secondaryColor], 14 | ).createShader( 15 | Rect.fromCircle( 16 | center: Offset(size.width / 2, size.height / 2), 17 | radius: size.width / 2, 18 | ), 19 | ); 20 | 21 | double numberOfPoints = 9; 22 | double outerCurveRadius = size.width / 1.85; 23 | double innerCurveRadius = size.width / 2.5; 24 | 25 | double width = size.width; 26 | double halfWidth = width / 2; 27 | double radius = halfWidth / 1.12; 28 | 29 | double degreesPerStep = math.pi / numberOfPoints; 30 | double halfDegreesPerStep = degreesPerStep / 2; 31 | 32 | int counter = 0; 33 | double max = 2 * math.pi; 34 | 35 | var path = Path(); 36 | 37 | path.moveTo( 38 | halfWidth + radius * math.cos(0 + halfDegreesPerStep), 39 | halfWidth + radius * math.sin(0 + halfDegreesPerStep), 40 | ); 41 | 42 | for (double step = 0; step < max + 1; step += degreesPerStep) { 43 | if (counter.isEven) { 44 | path.quadraticBezierTo( 45 | halfWidth + outerCurveRadius * math.cos(step), 46 | halfWidth + outerCurveRadius * math.sin(step), 47 | halfWidth + radius * math.cos(step + halfDegreesPerStep), 48 | halfWidth + radius * math.sin(step + halfDegreesPerStep), 49 | ); 50 | } else { 51 | path.quadraticBezierTo( 52 | halfWidth + innerCurveRadius * math.cos(step), 53 | halfWidth + innerCurveRadius * math.sin(step), 54 | halfWidth + radius * math.cos(step + halfDegreesPerStep), 55 | halfWidth + radius * math.sin(step + halfDegreesPerStep), 56 | ); 57 | } 58 | counter++; 59 | } 60 | path.close(); 61 | canvas.drawPath(path, paint); 62 | } 63 | 64 | @override 65 | bool shouldRepaint(CustomPainter oldDelegate) => false; 66 | } 67 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lib/widgets/rounded_image.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:cached_network_image/cached_network_image.dart'; 3 | import 'package:cosmetics_store/utils/colours.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_svg/flutter_svg.dart'; 6 | 7 | enum ImageSourceType { asset, network, file, svg } 8 | 9 | class RoundedImage extends StatelessWidget { 10 | final EdgeInsets padding; 11 | final double width; 12 | final String source; 13 | final ImageSourceType type; 14 | final BoxFit fit; 15 | final Color color; 16 | final Color borderColor; 17 | final double borderRadius; 18 | const RoundedImage({ 19 | super.key, 20 | this.padding = const EdgeInsets.all(0), 21 | this.width = 50, 22 | required this.source, 23 | this.type = ImageSourceType.asset, 24 | this.fit = BoxFit.cover, 25 | this.color = Colours.whiteColor, 26 | this.borderColor = Colors.transparent, 27 | this.borderRadius = 25, 28 | }); 29 | 30 | Widget _buildImage() { 31 | switch (type) { 32 | case ImageSourceType.network: 33 | return CachedNetworkImage( 34 | imageUrl: source, 35 | width: width, 36 | height: width, 37 | fit: fit, 38 | ); 39 | 40 | case ImageSourceType.file: 41 | return Image.file( 42 | File(source), 43 | width: width, 44 | height: width, 45 | fit: fit, 46 | 47 | errorBuilder: (context, error, stackTrace) => _errorPlaceholder(), 48 | ); 49 | 50 | case ImageSourceType.svg: 51 | return SvgPicture.asset(source, width: width, height: width, fit: fit); 52 | 53 | case ImageSourceType.asset: 54 | return Image.asset( 55 | source, 56 | width: width, 57 | height: width, 58 | fit: fit, 59 | errorBuilder: (context, error, stackTrace) => _errorPlaceholder(), 60 | ); 61 | } 62 | } 63 | 64 | Widget _errorPlaceholder() { 65 | return Container( 66 | color: Colors.grey[300], 67 | child: Icon( 68 | Icons.image_not_supported, 69 | size: width * 0.5, 70 | color: Colors.grey[600], 71 | ), 72 | ); 73 | } 74 | 75 | @override 76 | Widget build(BuildContext context) { 77 | return Container( 78 | padding: padding, 79 | width: width, 80 | height: width, 81 | clipBehavior: Clip.antiAlias, 82 | decoration: BoxDecoration( 83 | borderRadius: BorderRadius.circular(borderRadius), 84 | color: color, 85 | border: 86 | borderColor == Colours.transparentColor 87 | ? null 88 | : Border.all(color: borderColor), 89 | ), 90 | child: ClipRRect(child: _buildImage()), 91 | ); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /lib/utils/assets.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/model/product_model.dart'; 2 | 3 | abstract class Assets { 4 | //images 5 | static const String product1 = 6 | 'assets/images/668adc4fcd57736f5c718ef0_product-06.png'; 7 | static const String product2 = 8 | 'assets/images/coco-noir-chanel-pink-aesthetic-plrz6za4j9w81o44.png'; 9 | static const String product3 = 10 | 'assets/images/lg_PFcFK51Hy0J0x8dk2hJTpjSQoTA6wsxcdfAwtFMS.png'; 11 | static const String product4 = 'assets/images/Glowify-gallery-img-1.png'; 12 | static const String product5 = 13 | 'assets/images/f6a5603cd8028babc9c5a74cc3327c99.png'; 14 | static const String product6 = 15 | 'assets/images/668adc4fcd57736f5c718ef6_product-12.png'; 16 | static const String product7 = 17 | 'assets/images/668adc4fcd57736f5c718ef9_product-18.png'; 18 | static const String profilePicture = 19 | 'assets/images/8ebb1801-6af2-4a3b-b0c4-ae4a7de2b09d_removalai_preview.png'; 20 | 21 | //icons 22 | static const String arrowForwardIcon = 23 | 'assets/icons/arrows-direction-down-2-svgrepo-com.svg'; 24 | static const String searchIcon = 25 | 'assets/icons/search-normal-1-svgrepo-com.svg'; 26 | static const String shoppingBagIcon = 27 | 'assets/icons/shopping-bag-3-svgrepo-com.svg'; 28 | 29 | static final List data = [ 30 | ProductModel( 31 | imagePath: Assets.product1, 32 | name: "Liquid Collagen", 33 | subTitle: "Skin regenration", 34 | price: 7.50, 35 | reviews: 10, 36 | sizeInML: 100, 37 | stars: 4, 38 | ), 39 | ProductModel( 40 | imagePath: Assets.product2, 41 | name: "Chanel: Noir", 42 | subTitle: "Nobel perfume", 43 | price: 99.99, 44 | reviews: 19, 45 | sizeInML: 250, 46 | stars: 5, 47 | ), 48 | ProductModel( 49 | imagePath: Assets.product3, 50 | name: "NYX: Concealer", 51 | subTitle: "Eyelid care", 52 | price: 24.99, 53 | reviews: 284, 54 | sizeInML: 100, 55 | stars: 5, 56 | ), 57 | ProductModel( 58 | imagePath: Assets.product4, 59 | name: "Recovery Complex", 60 | subTitle: "Night Care", 61 | price: 56.50, 62 | reviews: 223, 63 | sizeInML: 120, 64 | stars: 3, 65 | ), 66 | ProductModel( 67 | imagePath: Assets.product5, 68 | name: "Pure Wonder", 69 | subTitle: "Active Serum", 70 | price: 25.50, 71 | reviews: 56, 72 | sizeInML: 50, 73 | stars: 2, 74 | ), 75 | ProductModel( 76 | imagePath: Assets.product6, 77 | name: "Armani: Retainer", 78 | subTitle: "Skin care", 79 | price: 39.99, 80 | reviews: 140, 81 | sizeInML: 80, 82 | stars: 3, 83 | ), 84 | ProductModel( 85 | imagePath: Assets.product7, 86 | name: "Cosmetic", 87 | subTitle: "Repairing Spray", 88 | price: 50.0, 89 | reviews: 152, 90 | sizeInML: 100, 91 | stars: 3, 92 | ), 93 | ]; 94 | } 95 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/background.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:cosmetics_store/utils/colours.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_animate/flutter_animate.dart'; 6 | 7 | class Background extends StatelessWidget { 8 | final AnimationController controller; 9 | const Background({super.key, required this.controller}); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Stack( 14 | children: [ 15 | Positioned( 16 | top: 40, 17 | left: -80, 18 | child: _buildBlurredContainer( 19 | 300, 20 | 300, 21 | Colours.primaryColor, 22 | Alignment.centerLeft, 23 | Alignment.centerRight, 24 | controller, 25 | ), 26 | ), 27 | Positioned( 28 | bottom: 100, 29 | right: -130, 30 | child: _buildBlurredContainer( 31 | 300, 32 | 300, 33 | Colours.primaryColor, 34 | Alignment.centerLeft, 35 | Alignment.centerRight, 36 | controller, 37 | ), 38 | ), 39 | Positioned( 40 | left: -50, 41 | top: 250, 42 | child: _buildBlurredContainer( 43 | 150, 44 | 120, 45 | Colours.secondaryColor, 46 | Alignment.topRight, 47 | Alignment.bottomLeft, 48 | controller, 49 | ), 50 | ), 51 | Positioned( 52 | right: 0, 53 | bottom: 100, 54 | child: _buildBlurredContainer( 55 | 150, 56 | 120, 57 | Colours.secondaryColor, 58 | Alignment.topRight, 59 | Alignment.bottomLeft, 60 | controller, 61 | ), 62 | ), 63 | Positioned( 64 | right: 0, 65 | bottom: 00, 66 | child: _buildBlurredContainer( 67 | 0, 68 | 0, 69 | Colours.secondaryColor.withValues(alpha: 0.4), 70 | Alignment.topRight, 71 | Alignment.bottomLeft, 72 | controller, 73 | ), 74 | ), 75 | ], 76 | ); 77 | } 78 | 79 | Widget _buildBlurredContainer( 80 | double width, 81 | double height, 82 | Color color, 83 | Alignment begin, 84 | Alignment end, 85 | AnimationController controller, 86 | ) { 87 | return BackdropFilter( 88 | filter: ImageFilter.blur(sigmaX: 80, sigmaY: 80), 89 | child: Container( 90 | width: width, 91 | height: height, 92 | decoration: BoxDecoration( 93 | gradient: LinearGradient( 94 | colors: [color, color.withValues(alpha: 0.3)], 95 | ), 96 | borderRadius: BorderRadius.circular(height / 2), 97 | ), 98 | ) 99 | .animate(controller: controller, autoPlay: false) 100 | .fade( 101 | begin: 1, 102 | end: 0, 103 | duration: 1200.ms, 104 | curve: Curves.fastOutSlowIn, 105 | ), 106 | ); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/onboarding_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/background_circle.dart'; 2 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/onboarding_content.dart'; 3 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/onboarding_navigator.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/background.dart'; 6 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/child_flower.dart'; 7 | import 'package:cosmetics_store/utils/colours.dart'; 8 | 9 | class OnboardingScreen extends StatefulWidget { 10 | static const String routeName = '/onboarding_screen'; 11 | const OnboardingScreen({super.key}); 12 | 13 | @override 14 | State createState() => _OnboardingScreenState(); 15 | } 16 | 17 | class _OnboardingScreenState extends State 18 | with TickerProviderStateMixin { 19 | late AnimationController _controller1; 20 | late AnimationController _controller2; 21 | 22 | @override 23 | void initState() { 24 | _controller1 = AnimationController(vsync: this); 25 | _controller2 = AnimationController(vsync: this); 26 | super.initState(); 27 | } 28 | 29 | @override 30 | Widget build(BuildContext context) { 31 | final size = MediaQuery.of(context).size; 32 | 33 | return Scaffold( 34 | backgroundColor: Colours.backgroundColor, 35 | body: SizedBox( 36 | width: size.width, 37 | height: size.height, 38 | child: Stack( 39 | children: [ 40 | Background(controller: _controller1), 41 | 42 | BackgroundCircle(controller: _controller2), 43 | SafeArea( 44 | child: Padding( 45 | padding: const EdgeInsets.symmetric(horizontal: 10), 46 | child: Column( 47 | crossAxisAlignment: CrossAxisAlignment.start, 48 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 49 | spacing: 20, 50 | children: [ 51 | Column( 52 | crossAxisAlignment: CrossAxisAlignment.start, 53 | children: [ 54 | ChildFlower(controller: _controller2), 55 | SizedBox(height: size.height * 0.19), 56 | OnboardingContent( 57 | controller1: _controller1, 58 | controller2: _controller2, 59 | ), 60 | ], 61 | ), 62 | OnboardingNavigator( 63 | controller: _controller2, 64 | onLastPage: () async { 65 | _controller1.forward(); 66 | await Future.delayed( 67 | const Duration(milliseconds: 150), 68 | () { 69 | _controller2.forward(); 70 | }, 71 | ); 72 | }, 73 | ), 74 | ], 75 | ), 76 | ), 77 | ), 78 | ], 79 | ), 80 | ), 81 | ); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/child_flower.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | import 'package:cosmetics_store/utils/curved_rect_tween.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/perl_painter.dart'; 5 | import 'package:flutter/scheduler.dart' show timeDilation; 6 | import 'package:flutter_animate/flutter_animate.dart'; 7 | 8 | class ChildFlower extends StatelessWidget { 9 | final AnimationController controller; 10 | const ChildFlower({super.key, required this.controller}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | double childRadius = 14; 15 | double parentRadius = 35; 16 | timeDilation = 2; 17 | int count = 12; 18 | return Hero( 19 | tag: 'Perl', 20 | createRectTween: 21 | (begin, end) => CurveRectTween( 22 | begin: begin, 23 | end: end, 24 | curve: Curves.fastOutSlowIn, 25 | ), 26 | child: SizedBox( 27 | height: 3 * childRadius, 28 | width: 3 * childRadius, 29 | child: LayoutBuilder( 30 | builder: (context, constraints) { 31 | double radius = constraints.maxHeight / 3; 32 | 33 | double scaler = 34 | ((constraints.maxHeight - (3 * childRadius)) / 35 | ((3 * parentRadius) - (3 * childRadius))); 36 | double angleFactor = (2.2 + (scaler * (2.6 - 2.2))); 37 | double rotationFactor = (0.65 + (scaler * (0.7 - 0.65))); 38 | return SizedBox( 39 | height: constraints.maxHeight, 40 | width: constraints.maxHeight, 41 | child: Transform.rotate( 42 | angle: -(pi * 0.5), 43 | child: Stack( 44 | children: List.generate(count, (index) { 45 | double angle = (2 * pi / count) * index; 46 | double x = 47 | radius * 1.25 + 48 | (radius * rotationFactor) * cos(angle); 49 | double y = 50 | radius * 0.9 + 51 | (radius * rotationFactor) * sin(angle); 52 | 53 | Offset scale = (Offset(1, 1)); 54 | Offset move = Offset(5, -2); 55 | 56 | return Positioned( 57 | left: x, 58 | top: y, 59 | child: Transform.rotate( 60 | angle: pi / angleFactor + angle, 61 | child: Transform( 62 | transform: 63 | Matrix4.identity() 64 | ..scale(scale.dx, scale.dy) 65 | ..translate(move.dx, move.dy), 66 | alignment: Alignment.bottomCenter, 67 | child: CustomPaint( 68 | painter: PerlPainter(), 69 | size: Size((radius / 2), (radius)), 70 | ), 71 | ), 72 | ), 73 | ); 74 | }), 75 | ), 76 | ), 77 | ); 78 | }, 79 | ), 80 | ), 81 | ) 82 | .animate(controller: controller, autoPlay: false) 83 | .moveX( 84 | begin: 0, 85 | end: -200, 86 | duration: 700.ms, 87 | curve: Curves.fastOutSlowIn, 88 | ); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 43 | 49 | 50 | 51 | 52 | 53 | 64 | 66 | 72 | 73 | 74 | 75 | 81 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: cosmetics_store 2 | description: "A new Flutter project." 3 | # The following line prevents the package from being accidentally published to 4 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 5 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 6 | 7 | # The following defines the version and build number for your application. 8 | # A version number is three numbers separated by dots, like 1.2.43 9 | # followed by an optional build number separated by a +. 10 | # Both the version and the builder number may be overridden in flutter 11 | # build by specifying --build-name and --build-number, respectively. 12 | # In Android, build-name is used as versionName while build-number used as versionCode. 13 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 14 | # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. 15 | # Read more about iOS versioning at 16 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 17 | # In Windows, build-name is used as the major, minor, and patch parts 18 | # of the product and file versions while build-number is used as the build suffix. 19 | version: 1.0.0+1 20 | 21 | environment: 22 | sdk: ^3.7.0 23 | 24 | # Dependencies specify other packages that your package needs in order to work. 25 | # To automatically upgrade your package dependencies to the latest versions 26 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 27 | # dependencies can be manually updated by changing the version numbers below to 28 | # the latest version available on pub.dev. To see which dependencies have newer 29 | # versions available, run `flutter pub outdated`. 30 | dependencies: 31 | flutter: 32 | sdk: flutter 33 | 34 | # The following adds the Cupertino Icons font to your application. 35 | # Use with the CupertinoIcons class for iOS style icons. 36 | cupertino_icons: ^1.0.8 37 | cached_network_image: ^3.4.1 38 | flutter_svg: ^2.0.17 39 | flutter_animate: ^4.5.2 40 | flutter_staggered_grid_view: ^0.7.0 41 | 42 | dev_dependencies: 43 | flutter_test: 44 | sdk: flutter 45 | 46 | # The "flutter_lints" package below contains a set of recommended lints to 47 | # encourage good coding practices. The lint set provided by the package is 48 | # activated in the `analysis_options.yaml` file located at the root of your 49 | # package. See that file for information about deactivating specific lint 50 | # rules and activating additional ones. 51 | flutter_lints: ^5.0.0 52 | 53 | 54 | # For information on the generic Dart part of this file, see the 55 | # following page: https://dart.dev/tools/pub/pubspec 56 | 57 | # The following section is specific to Flutter packages. 58 | flutter: 59 | 60 | # The following line ensures that the Material Icons font is 61 | # included with your application, so that you can use the icons in 62 | # the material Icons class. 63 | uses-material-design: true 64 | 65 | # To add assets to your application, add an assets section, like this: 66 | assets: 67 | - assets/images/ 68 | - assets/icons/ 69 | 70 | # An image asset can refer to one or more resolution-specific "variants", see 71 | # https://flutter.dev/to/resolution-aware-images 72 | 73 | # For details regarding adding assets from package dependencies, see 74 | # https://flutter.dev/to/asset-from-package 75 | 76 | # To add custom fonts to your application, add a fonts section here, 77 | # in this "flutter" section. Each entry in this list should have a 78 | # "family" key with the font family name, and a "fonts" key with a 79 | # list giving the asset and other descriptors for the font. For 80 | # example: 81 | fonts: 82 | - family: TT Hoves Pro Trial 83 | fonts: 84 | - asset: fonts/TT Hoves Pro Trial Black.ttf 85 | - asset: fonts/TT Hoves Pro Trial Bold.ttf 86 | - asset: fonts/TT Hoves Pro Trial Light.ttf 87 | - asset: fonts/TT Hoves Pro Trial Medium.ttf 88 | - asset: fonts/TT Hoves Pro Trial Regular.ttf 89 | - asset: fonts/TT Hoves Pro Trial Thin.ttf 90 | - asset: fonts/TT Hoves Pro Trial ExtraBold.ttf 91 | - asset: fonts/TT Hoves Pro Trial ExtraLight.ttf 92 | - asset: fonts/TT Hoves Pro Trial Hairline.ttf 93 | 94 | - family: Leotaro 95 | fonts: 96 | - asset: fonts/Leotaro-Free.otf 97 | # 98 | # For details regarding fonts from package dependencies, 99 | # see https://flutter.dev/to/font-from-package 100 | -------------------------------------------------------------------------------- /lib/screens/home-screen/widgets/product_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/model/product_model.dart'; 2 | import 'package:cosmetics_store/screens/product-details/product_details_screen.dart'; 3 | import 'package:cosmetics_store/utils/assets.dart'; 4 | import 'package:cosmetics_store/utils/colours.dart'; 5 | import 'package:cosmetics_store/utils/curved_rect_tween.dart'; 6 | import 'package:cosmetics_store/widgets/app_text.dart'; 7 | import 'package:cosmetics_store/widgets/bouncing_button.dart'; 8 | import 'package:cosmetics_store/widgets/rounded_image.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_animate/flutter_animate.dart'; 11 | import 'package:flutter/scheduler.dart' show timeDilation; 12 | 13 | class ProductCard extends StatelessWidget { 14 | final ProductModel product; 15 | const ProductCard({super.key, required this.product}); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | timeDilation = 1; 20 | return Container( 21 | padding: EdgeInsets.symmetric(vertical: 15, horizontal: 15), 22 | decoration: BoxDecoration( 23 | color: Colours.cardBackgroundColor, 24 | borderRadius: BorderRadius.circular(25), 25 | ), 26 | height: 240, 27 | child: Column( 28 | crossAxisAlignment: CrossAxisAlignment.start, 29 | children: [ 30 | BouncingButton( 31 | onPressed: 32 | () => Navigator.pushNamed( 33 | context, 34 | ProductDetailsScreen.routeName, 35 | arguments: product, 36 | ), 37 | child: Hero( 38 | tag: product.imagePath, 39 | createRectTween: 40 | (begin, end) => CurveRectTween( 41 | begin: begin, 42 | end: end, 43 | curve: Curves.fastOutSlowIn, 44 | ), 45 | child: Row( 46 | mainAxisAlignment: MainAxisAlignment.center, 47 | children: [ 48 | RoundedImage( 49 | source: product.imagePath, 50 | width: 120, 51 | color: Colours.transparentColor, 52 | ), 53 | ], 54 | ), 55 | ), 56 | ) 57 | .animate(delay: 700.ms) 58 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn) 59 | .moveY( 60 | begin: 30, 61 | end: 0, 62 | duration: 1000.ms, 63 | curve: Curves.fastOutSlowIn, 64 | ), 65 | const SizedBox(height: 15), 66 | AppText(text: product.name, fontWeight: FontWeight.w500) 67 | .animate(delay: 750.ms) 68 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn) 69 | .moveY( 70 | begin: 30, 71 | end: 0, 72 | duration: 1000.ms, 73 | curve: Curves.fastOutSlowIn, 74 | ), 75 | SizedBox(height: 3), 76 | AppText( 77 | text: product.subTitle, 78 | fontWeight: FontWeight.w500, 79 | fontSize: 13, 80 | color: Colours.primaryTextColorLight, 81 | ) 82 | .animate(delay: 900.ms) 83 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn) 84 | .moveY( 85 | begin: 30, 86 | end: 0, 87 | duration: 1000.ms, 88 | curve: Curves.fastOutSlowIn, 89 | ), 90 | SizedBox(height: 5), 91 | Row( 92 | children: [ 93 | AppText( 94 | text: "\$${product.price.toStringAsFixed(2)}", 95 | fontWeight: FontWeight.w500, 96 | fontSize: 20, 97 | ), 98 | const Spacer(), 99 | RoundedImage( 100 | source: Assets.shoppingBagIcon, 101 | type: ImageSourceType.svg, 102 | width: 30, 103 | padding: EdgeInsets.all(2), 104 | ), 105 | ], 106 | ) 107 | .animate(delay: 700.ms) 108 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn) 109 | .moveY( 110 | begin: 30, 111 | end: 0, 112 | duration: 1000.ms, 113 | curve: Curves.fastOutSlowIn, 114 | ), 115 | ], 116 | ), 117 | ); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/flower.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | import 'package:cosmetics_store/screens/onboarding-screen/onboarding_screen.dart'; 4 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/perl_painter.dart'; 5 | import 'package:cosmetics_store/utils/curved_rect_tween.dart'; 6 | import 'package:flutter/material.dart'; 7 | 8 | class Flower extends StatefulWidget { 9 | const Flower({super.key}); 10 | 11 | @override 12 | State createState() => _FlowerState(); 13 | } 14 | 15 | class _FlowerState extends State with SingleTickerProviderStateMixin { 16 | late AnimationController _controller; 17 | late List> scaleAnimations; 18 | late List> moveAnimations; 19 | bool dataFetched = false; 20 | int count = 12; 21 | @override 22 | void initState() { 23 | super.initState(); 24 | 25 | _controller = AnimationController( 26 | vsync: this, 27 | duration: const Duration(milliseconds: 550 * 12), 28 | )..forward(); 29 | 30 | scaleAnimations = List.generate(count, (index) { 31 | final inc = ((index + 1) / count); 32 | return Tween(begin: Offset(0.1, 0), end: Offset(1, 1)).animate( 33 | CurvedAnimation( 34 | parent: _controller, 35 | curve: Interval( 36 | ((index * 0.7) / count), 37 | inc, 38 | curve: Curves.fastOutSlowIn, 39 | ), 40 | ), 41 | ); 42 | }); 43 | moveAnimations = List.generate(count, (index) { 44 | final inc = ((index + 1) / count); 45 | return Tween(begin: Offset(5, -2), end: Offset(5, -2)).animate( 46 | CurvedAnimation( 47 | parent: _controller, 48 | curve: Interval( 49 | ((index * 0.6) / count), 50 | inc, 51 | curve: Curves.fastOutSlowIn, 52 | ), 53 | ), 54 | ); 55 | }); 56 | 57 | //Data fetching 58 | WidgetsBinding.instance.addPostFrameCallback((_) async { 59 | await Future.delayed(const Duration(milliseconds: 2000), () { 60 | accelerateAnimation(); 61 | }); 62 | }); 63 | 64 | _controller.addListener(() async { 65 | if (_controller.isCompleted) { 66 | Navigator.pushReplacementNamed(context, OnboardingScreen.routeName); 67 | } 68 | }); 69 | } 70 | 71 | void accelerateAnimation() { 72 | if (dataFetched) return; 73 | dataFetched = true; 74 | 75 | double accelerationFactor = 0.3; 76 | 77 | final newDuration = Duration( 78 | milliseconds: 79 | (_controller.duration!.inMilliseconds * accelerationFactor).toInt(), 80 | ); 81 | 82 | _controller.duration = newDuration; 83 | _controller.forward(from: _controller.value); 84 | } 85 | 86 | @override 87 | void dispose() { 88 | _controller.dispose(); 89 | super.dispose(); 90 | } 91 | 92 | @override 93 | build(BuildContext context) { 94 | double radius = 35; 95 | return Hero( 96 | tag: 'Perl', 97 | createRectTween: 98 | (begin, end) => CurveRectTween( 99 | begin: begin, 100 | end: end, 101 | curve: Curves.fastOutSlowIn, 102 | ), 103 | child: SizedBox( 104 | height: 3 * radius, 105 | width: 3 * radius, 106 | child: Transform.rotate( 107 | angle: -(pi * 0.5), 108 | child: AnimatedBuilder( 109 | animation: _controller, 110 | builder: (context, child) { 111 | return Stack( 112 | children: List.generate(count, (index) { 113 | double angle = (2 * pi / count) * index; 114 | double x = radius * 1.25 + (radius * 0.7) * cos(angle); 115 | double y = radius * 0.9 + (radius * 0.7) * sin(angle); 116 | 117 | Offset scale = scaleAnimations[index].value; 118 | Offset move = moveAnimations[index].value; 119 | 120 | return Positioned( 121 | left: x, 122 | top: y, 123 | child: Transform.rotate( 124 | angle: pi / 2.6 + angle, 125 | child: Transform( 126 | transform: 127 | Matrix4.identity() 128 | ..scale(scale.dx, scale.dy) 129 | ..translate(move.dx, move.dy), 130 | alignment: Alignment.bottomCenter, 131 | child: CustomPaint( 132 | painter: PerlPainter(), 133 | size: Size(radius / 2, radius), 134 | ), 135 | ), 136 | ), 137 | ); 138 | }), 139 | ); 140 | }, 141 | ), 142 | ), 143 | ), 144 | ); 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/onboarding_content.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/widgets/app_text.dart'; 2 | import 'package:cosmetics_store/utils/colours.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_animate/flutter_animate.dart'; 5 | 6 | class OnboardingContent extends StatelessWidget { 7 | final AnimationController controller1; 8 | final AnimationController controller2; 9 | const OnboardingContent({ 10 | super.key, 11 | required this.controller1, 12 | required this.controller2, 13 | }); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | final size = MediaQuery.of(context).size; 18 | return Padding( 19 | padding: EdgeInsets.only(left: 15, right: 40), 20 | child: Column( 21 | crossAxisAlignment: CrossAxisAlignment.start, 22 | children: [ 23 | Column( 24 | crossAxisAlignment: CrossAxisAlignment.start, 25 | children: [ 26 | Text( 27 | "We Know all", 28 | style: TextStyle( 29 | fontFamily: 'Leotaro', 30 | fontSize: 40, 31 | color: Colours.primaryTextColor, 32 | fontWeight: FontWeight.w600, 33 | height: 1.2, 34 | ), 35 | ) 36 | .animate(delay: 900.ms) 37 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn) 38 | .moveY( 39 | begin: 30, 40 | end: 0, 41 | duration: 700.ms, 42 | curve: Curves.fastOutSlowIn, 43 | ), 44 | Text( 45 | "about beauty", 46 | style: TextStyle( 47 | fontFamily: 'Leotaro', 48 | fontSize: 40, 49 | color: Colours.primaryTextColor, 50 | fontWeight: FontWeight.w600, 51 | height: 1.2, 52 | ), 53 | ) 54 | .animate(delay: 950.ms) 55 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn) 56 | .moveY( 57 | begin: 30, 58 | end: 0, 59 | duration: 700.ms, 60 | curve: Curves.fastOutSlowIn, 61 | ), 62 | ], 63 | ) 64 | .animate(controller: controller1, autoPlay: false) 65 | .moveX( 66 | begin: 0, 67 | end: -size.width * 0.9, 68 | duration: 1200.ms, 69 | curve: Curves.fastOutSlowIn, 70 | ), 71 | 72 | SizedBox(height: 15), 73 | Column( 74 | crossAxisAlignment: CrossAxisAlignment.start, 75 | children: [ 76 | AppText( 77 | text: "Our experts select only the best", 78 | fontSize: 18, 79 | fontWeight: FontWeight.w500, 80 | ) 81 | .animate(delay: 1000.ms) 82 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn) 83 | .moveY( 84 | begin: 30, 85 | end: 0, 86 | duration: 700.ms, 87 | curve: Curves.fastOutSlowIn, 88 | ), 89 | AppText( 90 | text: "premium brand care products that will", 91 | fontSize: 18, 92 | fontWeight: FontWeight.w500, 93 | height: 1.7, 94 | ) 95 | .animate(delay: 1050.ms) 96 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn) 97 | .moveY( 98 | begin: 30, 99 | end: 0, 100 | duration: 700.ms, 101 | curve: Curves.fastOutSlowIn, 102 | ), 103 | AppText( 104 | text: "suit your skin type and needs.", 105 | fontSize: 18, 106 | fontWeight: FontWeight.w500, 107 | ) 108 | .animate(delay: 1100.ms) 109 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn) 110 | .moveY( 111 | begin: 30, 112 | end: 0, 113 | duration: 700.ms, 114 | curve: Curves.fastOutSlowIn, 115 | ), 116 | ], 117 | ) 118 | .animate(controller: controller2, autoPlay: false, delay: 3000.ms) 119 | .moveX( 120 | begin: 0, 121 | end: -size.width, 122 | duration: 1200.ms, 123 | curve: Curves.fastOutSlowIn, 124 | ), 125 | ], 126 | ), 127 | ); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/background_circle.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/circle_painter.dart'; 4 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/star_one.dart'; 5 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/star_two.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:flutter_animate/flutter_animate.dart'; 8 | 9 | class BackgroundCircle extends StatefulWidget { 10 | final AnimationController controller; 11 | const BackgroundCircle({super.key, required this.controller}); 12 | 13 | @override 14 | State createState() => _BackgroundCircleState(); 15 | } 16 | 17 | class _BackgroundCircleState extends State 18 | with SingleTickerProviderStateMixin { 19 | late AnimationController _controller; 20 | late Animation _animation; 21 | 22 | @override 23 | void initState() { 24 | super.initState(); 25 | 26 | _controller = AnimationController( 27 | duration: const Duration(seconds: 20), 28 | vsync: this, 29 | )..repeat(); 30 | 31 | _animation = Tween(begin: 2 * pi, end: 0).animate(_controller); 32 | } 33 | 34 | @override 35 | void dispose() { 36 | _controller.dispose(); 37 | super.dispose(); 38 | } 39 | 40 | @override 41 | Widget build(BuildContext context) { 42 | final size = MediaQuery.of(context).size; 43 | final circleRadius = size.width * 1.2 / 2; 44 | final center = Offset( 45 | ((size.width * 1.2) / 2) - (size.width * 1.2 - size.width) / 1.35, 46 | (size.height / 2) - 87, 47 | ); 48 | 49 | return Stack( 50 | children: [ 51 | Positioned( 52 | right: -(size.width * 1.2 - size.width) / 2, 53 | top: -70, 54 | child: CustomPaint( 55 | size: Size(size.width * 1.2, size.height), 56 | painter: CirclePainter(), 57 | ) 58 | .animate(delay: 800.ms) 59 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn) 60 | .scale( 61 | begin: Offset(0.8, 0.8), 62 | end: Offset(1, 1), 63 | duration: 700.ms, 64 | curve: Curves.fastOutSlowIn, 65 | ), 66 | ), 67 | AnimatedBuilder( 68 | animation: _animation, 69 | builder: (context, child) { 70 | return Stack( 71 | children: [ 72 | _buildOrbitingStar( 73 | center, 74 | circleRadius, 75 | _animation.value, 76 | StarOne(), 77 | 0, 78 | ) 79 | .animate(delay: 1400.ms) 80 | .scale( 81 | begin: Offset(0, 0), 82 | end: Offset(1, 1), 83 | duration: 500.ms, 84 | curve: Curves.fastOutSlowIn, 85 | ), 86 | _buildOrbitingStar( 87 | center, 88 | circleRadius, 89 | _animation.value + pi * 1.5, 90 | StarTwo(), 91 | 1, 92 | ) 93 | .animate(delay: 1450.ms) 94 | .scale( 95 | begin: Offset(0, 0), 96 | end: Offset(1, 1), 97 | duration: 500.ms, 98 | curve: Curves.fastOutSlowIn, 99 | ), 100 | _buildOrbitingStar( 101 | center, 102 | circleRadius, 103 | _animation.value + 2 * pi / 2.7, 104 | StarOne(), 105 | 2, 106 | ) 107 | .animate(delay: 1500.ms) 108 | .scale( 109 | begin: Offset(0, 0), 110 | end: Offset(1, 1), 111 | duration: 500.ms, 112 | curve: Curves.fastOutSlowIn, 113 | ), 114 | _buildOrbitingStar( 115 | center, 116 | circleRadius, 117 | _animation.value + pi, 118 | StarTwo(), 119 | 3, 120 | ) 121 | .animate(delay: 1550.ms) 122 | .scale( 123 | begin: Offset(0, 0), 124 | end: Offset(1, 1), 125 | duration: 500.ms, 126 | curve: Curves.fastOutSlowIn, 127 | ), 128 | ], 129 | ); 130 | }, 131 | ), 132 | ], 133 | ) 134 | .animate(controller: widget.controller, autoPlay: false) 135 | .moveX( 136 | begin: 0, 137 | end: -size.width * 1.5, 138 | duration: 1200.ms, 139 | curve: Curves.fastOutSlowIn, 140 | ); 141 | } 142 | 143 | Widget _buildOrbitingStar( 144 | Offset center, 145 | double radius, 146 | double angle, 147 | CustomPainter painter, 148 | int index, 149 | ) { 150 | double x = center.dx + radius * cos(angle); 151 | double y = center.dy + radius * sin(angle); 152 | 153 | return Positioned( 154 | left: x, 155 | top: y, 156 | child: CustomPaint( 157 | size: Size(index.isEven ? 30 : 35, 35), 158 | painter: painter, 159 | ), 160 | ); 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /lib/screens/product-details/widgets/details_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:cosmetics_store/model/product_model.dart'; 2 | import 'package:cosmetics_store/screens/product-details/widgets/star_painter.dart'; 3 | import 'package:cosmetics_store/utils/assets.dart'; 4 | import 'package:cosmetics_store/utils/colours.dart'; 5 | import 'package:cosmetics_store/widgets/app_text.dart'; 6 | import 'package:cosmetics_store/widgets/bouncing_button.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:flutter_animate/flutter_animate.dart'; 9 | import 'package:flutter_svg/flutter_svg.dart'; 10 | 11 | class DetailsCard extends StatelessWidget { 12 | const DetailsCard({super.key, required this.product}); 13 | 14 | final ProductModel product; 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Container( 19 | padding: EdgeInsets.symmetric(vertical: 25, horizontal: 25), 20 | margin: EdgeInsets.only(bottom: 20), 21 | decoration: BoxDecoration( 22 | color: Colours.cardBackgroundColor, 23 | borderRadius: BorderRadius.circular(30), 24 | ), 25 | child: Column( 26 | crossAxisAlignment: CrossAxisAlignment.start, 27 | children: [ 28 | Row( 29 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 30 | children: [ 31 | AppText( 32 | text: product.name, 33 | fontSize: 23, 34 | fontWeight: FontWeight.w500, 35 | ) 36 | .animate(delay: 300.ms) 37 | .moveY( 38 | begin: 50, 39 | end: 0, 40 | duration: 1000.ms, 41 | curve: Curves.fastOutSlowIn, 42 | ) 43 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn), 44 | AppText( 45 | text: "${product.reviews} reviews", 46 | fontWeight: FontWeight.w500, 47 | fontSize: 13, 48 | color: Colours.primaryTextColorLight, 49 | ) 50 | .animate(delay: 700.ms) 51 | .moveY( 52 | begin: 30, 53 | end: 0, 54 | duration: 800.ms, 55 | curve: Curves.fastOutSlowIn, 56 | ) 57 | .fade(duration: 800.ms, curve: Curves.fastOutSlowIn), 58 | ], 59 | ), 60 | SizedBox(height: 3), 61 | Row( 62 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 63 | children: [ 64 | AppText( 65 | text: "Max Size • ${product.sizeInML} ml", 66 | fontWeight: FontWeight.w500, 67 | fontSize: 13, 68 | color: Colours.primaryTextColorLight, 69 | ) 70 | .animate(delay: 300.ms) 71 | .moveY( 72 | begin: 50, 73 | end: 0, 74 | duration: 1000.ms, 75 | curve: Curves.fastOutSlowIn, 76 | ) 77 | .fade(duration: 1000.ms, curve: Curves.fastOutSlowIn), 78 | Row( 79 | children: List.generate( 80 | product.stars, 81 | (index) => Padding( 82 | padding: EdgeInsets.only(left: 5), 83 | child: CustomPaint( 84 | painter: StarPainter(), 85 | size: Size(15, 15), 86 | ), 87 | ), 88 | ), 89 | ) 90 | .animate(delay: 700.ms) 91 | .moveY( 92 | begin: 30, 93 | end: 0, 94 | duration: 800.ms, 95 | curve: Curves.fastOutSlowIn, 96 | ) 97 | .fade(duration: 800.ms, curve: Curves.fastOutSlowIn), 98 | ], 99 | ), 100 | SizedBox(height: 30), 101 | Row( 102 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 103 | children: [ 104 | AppText( 105 | text: "\$ ${product.price.toStringAsFixed(2)}", 106 | fontSize: 28, 107 | fontWeight: FontWeight.w600, 108 | ), 109 | BouncingButton( 110 | onPressed: () {}, 111 | child: Container( 112 | margin: EdgeInsets.only(left: 10), 113 | padding: EdgeInsets.symmetric( 114 | vertical: 7, 115 | horizontal: 28, 116 | ), 117 | decoration: BoxDecoration( 118 | color: Colours.whiteColor, 119 | borderRadius: BorderRadius.circular(17), 120 | ), 121 | child: SvgPicture.asset( 122 | Assets.shoppingBagIcon, 123 | colorFilter: ColorFilter.mode( 124 | Colours.blackColor, 125 | BlendMode.srcIn, 126 | ), 127 | width: 28, 128 | height: 28, 129 | ), 130 | ), 131 | ), 132 | ], 133 | ) 134 | .animate(delay: 900.ms) 135 | .moveY( 136 | begin: 30, 137 | end: 0, 138 | duration: 700.ms, 139 | curve: Curves.fastOutSlowIn, 140 | ) 141 | .fade(duration: 700.ms, curve: Curves.fastOutSlowIn), 142 | ], 143 | ), 144 | ) 145 | .animate(delay: 300.ms) 146 | .moveY( 147 | begin: 130, 148 | end: 0, 149 | duration: 1300.ms, 150 | curve: Curves.fastOutSlowIn, 151 | ) 152 | .fade(duration: 1300.ms, curve: Curves.fastOutSlowIn); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /lib/screens/onboarding-screen/widgets/onboarding_navigator.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math' as math; 2 | 3 | import 'package:cosmetics_store/screens/home-screen/home_screen.dart'; 4 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/oval_painter.dart'; 5 | import 'package:cosmetics_store/screens/onboarding-screen/widgets/wavy_circle_painter.dart'; 6 | import 'package:cosmetics_store/utils/assets.dart'; 7 | import 'package:cosmetics_store/utils/colours.dart'; 8 | import 'package:cosmetics_store/widgets/bouncing_button.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_animate/flutter_animate.dart'; 11 | import 'package:flutter_svg/svg.dart'; 12 | 13 | class OnboardingNavigator extends StatefulWidget { 14 | final VoidCallback onLastPage; 15 | final AnimationController controller; 16 | const OnboardingNavigator({ 17 | super.key, 18 | required this.onLastPage, 19 | required this.controller, 20 | }); 21 | 22 | @override 23 | State createState() => _OnboardingNavigatorState(); 24 | } 25 | 26 | class _OnboardingNavigatorState extends State { 27 | int currentIndex = 2; 28 | 29 | void onPageChanged(int index) { 30 | setState(() { 31 | currentIndex = index; 32 | }); 33 | } 34 | 35 | @override 36 | Widget build(BuildContext context) { 37 | final size = MediaQuery.of(context).size; 38 | return Padding( 39 | padding: const EdgeInsets.only(left: 15, right: 15), 40 | child: Row( 41 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 42 | children: [ 43 | Row( 44 | crossAxisAlignment: CrossAxisAlignment.center, 45 | children: List.generate( 46 | 3, 47 | (index) => Padding( 48 | padding: const EdgeInsets.only(right: 10), 49 | child: AnimatedSwitcher( 50 | duration: const Duration(milliseconds: 300), 51 | transitionBuilder: (child, animation) { 52 | return FadeTransition(opacity: animation, child: child); 53 | }, 54 | child: 55 | index == currentIndex 56 | ? SizedBox( 57 | key: ValueKey(index), 58 | width: 25, 59 | height: 12, 60 | child: CustomPaint( 61 | painter: OvalPainter(Colours.whiteColor), 62 | ), 63 | ) 64 | .animate(delay: 1550.ms + (index * 50).ms) 65 | .scale( 66 | begin: Offset(0, 0), 67 | end: Offset(1, 1), 68 | duration: 500.ms, 69 | curve: Curves.fastOutSlowIn, 70 | ) 71 | : Container( 72 | key: ValueKey(index), 73 | width: 12, 74 | height: 12, 75 | decoration: BoxDecoration( 76 | color: Colours.transparentColor, 77 | shape: BoxShape.circle, 78 | border: Border.all( 79 | width: 1.5, 80 | color: Colours.whiteColor, 81 | ), 82 | ), 83 | ) 84 | .animate(delay: 1550.ms + (index * 50).ms) 85 | .scale( 86 | begin: Offset(0, 0), 87 | end: Offset(1, 1), 88 | duration: 500.ms, 89 | curve: Curves.fastOutSlowIn, 90 | ), 91 | ), 92 | ), 93 | ), 94 | ) 95 | .animate(controller: widget.controller, autoPlay: false) 96 | .moveX( 97 | begin: 0, 98 | end: -200, 99 | duration: 700.ms, 100 | curve: Curves.fastOutSlowIn, 101 | ), 102 | BouncingButton( 103 | onPressed: () async { 104 | if (currentIndex == 2) { 105 | Navigator.pushNamed(context, HomeScreen.routeName); 106 | Future.delayed(const Duration(milliseconds: 300), () { 107 | widget.onLastPage(); 108 | }); 109 | } else { 110 | onPageChanged(currentIndex + 1); 111 | } 112 | }, 113 | child: Transform.rotate( 114 | angle: -10 * (math.pi / 180), 115 | child: CustomPaint( 116 | painter: WavyCirclePainter(), 117 | child: SizedBox( 118 | width: 80, 119 | height: 80, 120 | child: Center( 121 | child: Transform.rotate( 122 | angle: -30 * (math.pi / 180), 123 | child: SvgPicture.asset( 124 | Assets.arrowForwardIcon, 125 | width: 0, 126 | height: 30, 127 | colorFilter: ColorFilter.mode( 128 | Colours.whiteColor, 129 | BlendMode.srcIn, 130 | ), 131 | ) 132 | .animate(delay: 2200.ms) 133 | .move( 134 | begin: Offset(-30, -30), 135 | end: Offset(0, 0), 136 | duration: 600.ms, 137 | curve: Curves.fastOutSlowIn, 138 | ) 139 | .fade( 140 | duration: 600.ms, 141 | curve: Curves.fastOutSlowIn, 142 | ), 143 | ), 144 | ), 145 | ), 146 | ), 147 | ), 148 | ) 149 | .animate(delay: 1500.ms) 150 | .scale( 151 | begin: Offset(0, 0), 152 | end: Offset(1, 1), 153 | duration: 1200.ms, 154 | curve: Curves.fastOutSlowIn, 155 | ) 156 | .animate(controller: widget.controller, autoPlay: false) 157 | .moveX( 158 | begin: 0, 159 | end: -size.width, 160 | duration: 1000.ms, 161 | curve: Curves.fastOutSlowIn, 162 | ), 163 | ], 164 | ), 165 | ); 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /lib/circular_loading.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:math'; 3 | // import 'package:flutter/material.dart'; 4 | 5 | // class CircularAnimationScreen extends StatefulWidget { 6 | // const CircularAnimationScreen({super.key}); 7 | 8 | // @override 9 | // _CircularAnimationScreenState createState() => 10 | // _CircularAnimationScreenState(); 11 | // } 12 | 13 | // class _CircularAnimationScreenState extends State 14 | // with SingleTickerProviderStateMixin { 15 | // late AnimationController _controller; 16 | // late Animation _animation; 17 | // bool dataFetched = false; 18 | 19 | // @override 20 | // void initState() { 21 | // super.initState(); 22 | 23 | // // Animation controller with normal duration 24 | // _controller = AnimationController( 25 | // vsync: this, 26 | // duration: Duration(seconds: 10), 27 | // )..forward(); // Start the animation 28 | 29 | // // Linear animation initially 30 | // _animation = Tween(begin: 0, end: 1).animate(_controller); 31 | 32 | // // Simulate a delayed fetch 33 | // Future.delayed(Duration(seconds: 5), () { 34 | // accelerateAnimation(); 35 | // }); 36 | // } 37 | 38 | // void accelerateAnimation() { 39 | // if (dataFetched) return; 40 | // dataFetched = true; 41 | 42 | // double step = 0.01; // Small initial increment 43 | // Timer.periodic(Duration(milliseconds: 16), (timer) { 44 | // if (_controller.value >= 1.0) { 45 | // _controller.value = 1.0; 46 | // timer.cancel(); 47 | // return; 48 | // } 49 | // _controller.value += step; 50 | // step *= 1.2; // Exponential speed-up 51 | // }); 52 | // } 53 | 54 | // @override 55 | // void dispose() { 56 | // _controller.dispose(); 57 | // super.dispose(); 58 | // } 59 | 60 | // @override 61 | // Widget build(BuildContext context) { 62 | // return Scaffold( 63 | // backgroundColor: Colors.black, 64 | // body: Center( 65 | // child: AnimatedBuilder( 66 | // animation: _animation, 67 | // builder: (context, child) { 68 | // return CustomPaint( 69 | // painter: CircularDotPainter(_animation.value), 70 | // size: Size(200, 200), 71 | // ); 72 | // }, 73 | // ), 74 | // ), 75 | // ); 76 | // } 77 | // } 78 | 79 | // class CircularDotPainter extends CustomPainter { 80 | // final double progress; 81 | // CircularDotPainter(this.progress); 82 | 83 | // @override 84 | // void paint(Canvas canvas, Size size) { 85 | // final center = Offset(size.width / 2, size.height / 2); 86 | // final radius = size.width / 2.5; 87 | // final paint = 88 | // Paint() 89 | // ..color = Colors.blue 90 | // ..style = PaintingStyle.fill; 91 | 92 | // int dotCount = (progress * 50).toInt(); // Dots increase progressively 93 | 94 | // for (int i = 0; i < dotCount; i++) { 95 | // double angle = (i / 50) * 2 * pi; 96 | // double x = center.dx + radius * cos(angle); 97 | // double y = center.dy + radius * sin(angle); 98 | // canvas.drawCircle(Offset(x, y), 5, paint); 99 | // } 100 | // } 101 | 102 | // @override 103 | // bool shouldRepaint(CircularDotPainter oldDelegate) { 104 | // return oldDelegate.progress != progress; 105 | // } 106 | // } 107 | 108 | // import 'dart:async'; 109 | // import 'dart:math'; 110 | // import 'package:cosmetics_store/screens/onboarding-screen/widgets/perl_painter.dart'; 111 | // import 'package:flutter/material.dart'; 112 | // import 'package:flutter_animate/flutter_animate.dart'; 113 | 114 | // class OnboardingAnimationScreen extends StatefulWidget { 115 | // const OnboardingAnimationScreen({super.key}); 116 | 117 | // @override 118 | // State createState() => 119 | // _OnboardingAnimationScreenState(); 120 | // } 121 | 122 | // class _OnboardingAnimationScreenState extends State 123 | // with SingleTickerProviderStateMixin { 124 | // late AnimationController _controller; 125 | // late Animation scaleAnimation; 126 | // late Animation moveAnimation; 127 | // late Animation counterAnimation; 128 | // bool dataFetched = false; 129 | 130 | // @override 131 | // void initState() { 132 | // super.initState(); 133 | // _controller = AnimationController( 134 | // vsync: this, 135 | // duration: const Duration(seconds: 10), 136 | // ); 137 | 138 | // scaleAnimation = Tween( 139 | // begin: const Offset(-1, -1), 140 | // end: const Offset(1.0, 1.0), 141 | // ).animate(_controller); 142 | 143 | // counterAnimation = Tween( 144 | // begin: 0, 145 | // end: 12, 146 | // ).animate(_controller); 147 | 148 | // _controller.forward(); 149 | // Future.delayed(const Duration(seconds: 5), () { 150 | // accelerateAnimation(); 151 | // }); 152 | 153 | // } 154 | 155 | // void accelerateAnimation() { 156 | // if (dataFetched) return; 157 | // dataFetched = true; 158 | 159 | // double step = 0.01; 160 | // Timer.periodic(const Duration(milliseconds: 16), (timer) { 161 | // if (_controller.value >= 1.0) { 162 | // _controller.value = 1.0; 163 | // timer.cancel(); 164 | // return; 165 | // } 166 | // _controller.value += step; 167 | // step *= 1.2; 168 | // }); 169 | // } 170 | 171 | // @override 172 | // void dispose() { 173 | // _controller.dispose(); 174 | // super.dispose(); 175 | // } 176 | 177 | // @override 178 | // Widget build(BuildContext context) { 179 | // double radius = 40; 180 | // int count = 12; 181 | // int selected = 3; 182 | // double maxDelay = 1000; 183 | // double decayFactor = 0.25; 184 | 185 | // return Scaffold( 186 | // backgroundColor: Colors.blue[900], 187 | // body: Center( 188 | // child: Transform.rotate( 189 | // angle: -(pi * 0.5), 190 | // child: SizedBox( 191 | // height: 3 * radius, 192 | // width: 3 * radius, 193 | // child: Stack( 194 | // children: List.generate(count, (index) { 195 | // double angle = (2 * pi / count) * index; 196 | // double x = radius * 1.25 + (radius * 0.9) * cos(angle); 197 | // double y = radius + (radius * 0.9) * sin(angle); 198 | 199 | // final scale = counterAnimation.value > index 200 | // ? scaleAnimation 201 | // .chain(CurveTween(curve: Curves.easeInOut)) 202 | // .animate(_controller) 203 | // : Tween(begin: 0, end: 0).animate(_controller); 204 | 205 | // return Positioned( 206 | // left: x, 207 | // top: y, 208 | // child: Transform.scale( 209 | // scale: scale.value, 210 | // alignment: Alignment.bottomCenter, 211 | // child: Transform.rotate( 212 | // angle: pi / 3 + angle, 213 | // child: CustomPaint( 214 | // painter: PerlPainter(), 215 | // child: const SizedBox(height: 40, width: 20), 216 | // ), 217 | // ), 218 | // ), 219 | // ); 220 | // }), 221 | // ), 222 | // ), 223 | // ), 224 | // ), 225 | // ); 226 | // } 227 | // } 228 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | args: 5 | dependency: transitive 6 | description: 7 | name: args 8 | sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.7.0" 12 | async: 13 | dependency: transitive 14 | description: 15 | name: async 16 | sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.12.0" 20 | boolean_selector: 21 | dependency: transitive 22 | description: 23 | name: boolean_selector 24 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.1.2" 28 | cached_network_image: 29 | dependency: "direct main" 30 | description: 31 | name: cached_network_image 32 | sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "3.4.1" 36 | cached_network_image_platform_interface: 37 | dependency: transitive 38 | description: 39 | name: cached_network_image_platform_interface 40 | sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "4.1.1" 44 | cached_network_image_web: 45 | dependency: transitive 46 | description: 47 | name: cached_network_image_web 48 | sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.3.1" 52 | characters: 53 | dependency: transitive 54 | description: 55 | name: characters 56 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.4.0" 60 | clock: 61 | dependency: transitive 62 | description: 63 | name: clock 64 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "1.1.2" 68 | collection: 69 | dependency: transitive 70 | description: 71 | name: collection 72 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "1.19.1" 76 | crypto: 77 | dependency: transitive 78 | description: 79 | name: crypto 80 | sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "3.0.6" 84 | cupertino_icons: 85 | dependency: "direct main" 86 | description: 87 | name: cupertino_icons 88 | sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "1.0.8" 92 | fake_async: 93 | dependency: transitive 94 | description: 95 | name: fake_async 96 | sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "1.3.2" 100 | ffi: 101 | dependency: transitive 102 | description: 103 | name: ffi 104 | sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "2.1.4" 108 | file: 109 | dependency: transitive 110 | description: 111 | name: file 112 | sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "7.0.1" 116 | fixnum: 117 | dependency: transitive 118 | description: 119 | name: fixnum 120 | sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "1.1.1" 124 | flutter: 125 | dependency: "direct main" 126 | description: flutter 127 | source: sdk 128 | version: "0.0.0" 129 | flutter_animate: 130 | dependency: "direct main" 131 | description: 132 | name: flutter_animate 133 | sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5" 134 | url: "https://pub.dev" 135 | source: hosted 136 | version: "4.5.2" 137 | flutter_cache_manager: 138 | dependency: transitive 139 | description: 140 | name: flutter_cache_manager 141 | sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" 142 | url: "https://pub.dev" 143 | source: hosted 144 | version: "3.4.1" 145 | flutter_lints: 146 | dependency: "direct dev" 147 | description: 148 | name: flutter_lints 149 | sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" 150 | url: "https://pub.dev" 151 | source: hosted 152 | version: "5.0.0" 153 | flutter_shaders: 154 | dependency: transitive 155 | description: 156 | name: flutter_shaders 157 | sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2" 158 | url: "https://pub.dev" 159 | source: hosted 160 | version: "0.1.3" 161 | flutter_staggered_grid_view: 162 | dependency: "direct main" 163 | description: 164 | name: flutter_staggered_grid_view 165 | sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" 166 | url: "https://pub.dev" 167 | source: hosted 168 | version: "0.7.0" 169 | flutter_svg: 170 | dependency: "direct main" 171 | description: 172 | name: flutter_svg 173 | sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b 174 | url: "https://pub.dev" 175 | source: hosted 176 | version: "2.0.17" 177 | flutter_test: 178 | dependency: "direct dev" 179 | description: flutter 180 | source: sdk 181 | version: "0.0.0" 182 | http: 183 | dependency: transitive 184 | description: 185 | name: http 186 | sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f 187 | url: "https://pub.dev" 188 | source: hosted 189 | version: "1.3.0" 190 | http_parser: 191 | dependency: transitive 192 | description: 193 | name: http_parser 194 | sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" 195 | url: "https://pub.dev" 196 | source: hosted 197 | version: "4.1.2" 198 | leak_tracker: 199 | dependency: transitive 200 | description: 201 | name: leak_tracker 202 | sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec 203 | url: "https://pub.dev" 204 | source: hosted 205 | version: "10.0.8" 206 | leak_tracker_flutter_testing: 207 | dependency: transitive 208 | description: 209 | name: leak_tracker_flutter_testing 210 | sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 211 | url: "https://pub.dev" 212 | source: hosted 213 | version: "3.0.9" 214 | leak_tracker_testing: 215 | dependency: transitive 216 | description: 217 | name: leak_tracker_testing 218 | sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" 219 | url: "https://pub.dev" 220 | source: hosted 221 | version: "3.0.1" 222 | lints: 223 | dependency: transitive 224 | description: 225 | name: lints 226 | sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 227 | url: "https://pub.dev" 228 | source: hosted 229 | version: "5.1.1" 230 | matcher: 231 | dependency: transitive 232 | description: 233 | name: matcher 234 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 235 | url: "https://pub.dev" 236 | source: hosted 237 | version: "0.12.17" 238 | material_color_utilities: 239 | dependency: transitive 240 | description: 241 | name: material_color_utilities 242 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 243 | url: "https://pub.dev" 244 | source: hosted 245 | version: "0.11.1" 246 | meta: 247 | dependency: transitive 248 | description: 249 | name: meta 250 | sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c 251 | url: "https://pub.dev" 252 | source: hosted 253 | version: "1.16.0" 254 | octo_image: 255 | dependency: transitive 256 | description: 257 | name: octo_image 258 | sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" 259 | url: "https://pub.dev" 260 | source: hosted 261 | version: "2.1.0" 262 | path: 263 | dependency: transitive 264 | description: 265 | name: path 266 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 267 | url: "https://pub.dev" 268 | source: hosted 269 | version: "1.9.1" 270 | path_parsing: 271 | dependency: transitive 272 | description: 273 | name: path_parsing 274 | sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" 275 | url: "https://pub.dev" 276 | source: hosted 277 | version: "1.1.0" 278 | path_provider: 279 | dependency: transitive 280 | description: 281 | name: path_provider 282 | sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" 283 | url: "https://pub.dev" 284 | source: hosted 285 | version: "2.1.5" 286 | path_provider_android: 287 | dependency: transitive 288 | description: 289 | name: path_provider_android 290 | sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" 291 | url: "https://pub.dev" 292 | source: hosted 293 | version: "2.2.16" 294 | path_provider_foundation: 295 | dependency: transitive 296 | description: 297 | name: path_provider_foundation 298 | sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" 299 | url: "https://pub.dev" 300 | source: hosted 301 | version: "2.4.1" 302 | path_provider_linux: 303 | dependency: transitive 304 | description: 305 | name: path_provider_linux 306 | sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 307 | url: "https://pub.dev" 308 | source: hosted 309 | version: "2.2.1" 310 | path_provider_platform_interface: 311 | dependency: transitive 312 | description: 313 | name: path_provider_platform_interface 314 | sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" 315 | url: "https://pub.dev" 316 | source: hosted 317 | version: "2.1.2" 318 | path_provider_windows: 319 | dependency: transitive 320 | description: 321 | name: path_provider_windows 322 | sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 323 | url: "https://pub.dev" 324 | source: hosted 325 | version: "2.3.0" 326 | petitparser: 327 | dependency: transitive 328 | description: 329 | name: petitparser 330 | sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" 331 | url: "https://pub.dev" 332 | source: hosted 333 | version: "6.1.0" 334 | platform: 335 | dependency: transitive 336 | description: 337 | name: platform 338 | sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" 339 | url: "https://pub.dev" 340 | source: hosted 341 | version: "3.1.6" 342 | plugin_platform_interface: 343 | dependency: transitive 344 | description: 345 | name: plugin_platform_interface 346 | sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 347 | url: "https://pub.dev" 348 | source: hosted 349 | version: "2.1.8" 350 | rxdart: 351 | dependency: transitive 352 | description: 353 | name: rxdart 354 | sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" 355 | url: "https://pub.dev" 356 | source: hosted 357 | version: "0.28.0" 358 | sky_engine: 359 | dependency: transitive 360 | description: flutter 361 | source: sdk 362 | version: "0.0.0" 363 | source_span: 364 | dependency: transitive 365 | description: 366 | name: source_span 367 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" 368 | url: "https://pub.dev" 369 | source: hosted 370 | version: "1.10.1" 371 | sprintf: 372 | dependency: transitive 373 | description: 374 | name: sprintf 375 | sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" 376 | url: "https://pub.dev" 377 | source: hosted 378 | version: "7.0.0" 379 | sqflite: 380 | dependency: transitive 381 | description: 382 | name: sqflite 383 | sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 384 | url: "https://pub.dev" 385 | source: hosted 386 | version: "2.4.2" 387 | sqflite_android: 388 | dependency: transitive 389 | description: 390 | name: sqflite_android 391 | sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" 392 | url: "https://pub.dev" 393 | source: hosted 394 | version: "2.4.1" 395 | sqflite_common: 396 | dependency: transitive 397 | description: 398 | name: sqflite_common 399 | sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" 400 | url: "https://pub.dev" 401 | source: hosted 402 | version: "2.5.5" 403 | sqflite_darwin: 404 | dependency: transitive 405 | description: 406 | name: sqflite_darwin 407 | sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" 408 | url: "https://pub.dev" 409 | source: hosted 410 | version: "2.4.2" 411 | sqflite_platform_interface: 412 | dependency: transitive 413 | description: 414 | name: sqflite_platform_interface 415 | sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" 416 | url: "https://pub.dev" 417 | source: hosted 418 | version: "2.4.0" 419 | stack_trace: 420 | dependency: transitive 421 | description: 422 | name: stack_trace 423 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 424 | url: "https://pub.dev" 425 | source: hosted 426 | version: "1.12.1" 427 | stream_channel: 428 | dependency: transitive 429 | description: 430 | name: stream_channel 431 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 432 | url: "https://pub.dev" 433 | source: hosted 434 | version: "2.1.4" 435 | string_scanner: 436 | dependency: transitive 437 | description: 438 | name: string_scanner 439 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 440 | url: "https://pub.dev" 441 | source: hosted 442 | version: "1.4.1" 443 | synchronized: 444 | dependency: transitive 445 | description: 446 | name: synchronized 447 | sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" 448 | url: "https://pub.dev" 449 | source: hosted 450 | version: "3.3.1" 451 | term_glyph: 452 | dependency: transitive 453 | description: 454 | name: term_glyph 455 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 456 | url: "https://pub.dev" 457 | source: hosted 458 | version: "1.2.2" 459 | test_api: 460 | dependency: transitive 461 | description: 462 | name: test_api 463 | sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd 464 | url: "https://pub.dev" 465 | source: hosted 466 | version: "0.7.4" 467 | typed_data: 468 | dependency: transitive 469 | description: 470 | name: typed_data 471 | sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 472 | url: "https://pub.dev" 473 | source: hosted 474 | version: "1.4.0" 475 | uuid: 476 | dependency: transitive 477 | description: 478 | name: uuid 479 | sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff 480 | url: "https://pub.dev" 481 | source: hosted 482 | version: "4.5.1" 483 | vector_graphics: 484 | dependency: transitive 485 | description: 486 | name: vector_graphics 487 | sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" 488 | url: "https://pub.dev" 489 | source: hosted 490 | version: "1.1.18" 491 | vector_graphics_codec: 492 | dependency: transitive 493 | description: 494 | name: vector_graphics_codec 495 | sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" 496 | url: "https://pub.dev" 497 | source: hosted 498 | version: "1.1.13" 499 | vector_graphics_compiler: 500 | dependency: transitive 501 | description: 502 | name: vector_graphics_compiler 503 | sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" 504 | url: "https://pub.dev" 505 | source: hosted 506 | version: "1.1.16" 507 | vector_math: 508 | dependency: transitive 509 | description: 510 | name: vector_math 511 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 512 | url: "https://pub.dev" 513 | source: hosted 514 | version: "2.1.4" 515 | vm_service: 516 | dependency: transitive 517 | description: 518 | name: vm_service 519 | sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" 520 | url: "https://pub.dev" 521 | source: hosted 522 | version: "14.3.1" 523 | web: 524 | dependency: transitive 525 | description: 526 | name: web 527 | sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" 528 | url: "https://pub.dev" 529 | source: hosted 530 | version: "1.1.1" 531 | xdg_directories: 532 | dependency: transitive 533 | description: 534 | name: xdg_directories 535 | sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" 536 | url: "https://pub.dev" 537 | source: hosted 538 | version: "1.1.0" 539 | xml: 540 | dependency: transitive 541 | description: 542 | name: xml 543 | sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 544 | url: "https://pub.dev" 545 | source: hosted 546 | version: "6.5.0" 547 | sdks: 548 | dart: ">=3.7.0 <4.0.0" 549 | flutter: ">=3.27.0" 550 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 17387C2FC2210A933D801968 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E80E3D0199B5F0348AC05781 /* Pods_Runner.framework */; }; 12 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 13 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 14 | 4EAFE2E5B21958A7B1629919 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7548521CC5ECDEBC9B6C2FDA /* Pods_RunnerTests.framework */; }; 15 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 16 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 17 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 18 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 97C146E61CF9000F007C117D /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 97C146ED1CF9000F007C117D; 27 | remoteInfo = Runner; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXCopyFilesBuildPhase section */ 32 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 33 | isa = PBXCopyFilesBuildPhase; 34 | buildActionMask = 2147483647; 35 | dstPath = ""; 36 | dstSubfolderSpec = 10; 37 | files = ( 38 | ); 39 | name = "Embed Frameworks"; 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | /* End PBXCopyFilesBuildPhase section */ 43 | 44 | /* Begin PBXFileReference section */ 45 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 46 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 47 | 22481926249349F0104AF931 /* 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 = ""; }; 48 | 2C12219607FAA0E58A159212 /* 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 = ""; }; 49 | 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 50 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 52 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 53 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 54 | 7548521CC5ECDEBC9B6C2FDA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 76186EB6D864C4FA355EC132 /* 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 = ""; }; 56 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 57 | 80BCC6F90621AA41FAD417D6 /* 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 = ""; }; 58 | 96831C5812FB16A23902C681 /* 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 = ""; }; 59 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 60 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 61 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 63 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 64 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 65 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 66 | E80E3D0199B5F0348AC05781 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | F0D9450EC0295925581D8642 /* 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 = ""; }; 68 | /* End PBXFileReference section */ 69 | 70 | /* Begin PBXFrameworksBuildPhase section */ 71 | 64C77ACA23E389269B926F89 /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | 4EAFE2E5B21958A7B1629919 /* Pods_RunnerTests.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | 17387C2FC2210A933D801968 /* Pods_Runner.framework in Frameworks */, 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | /* End PBXFrameworksBuildPhase section */ 88 | 89 | /* Begin PBXGroup section */ 90 | 331C8082294A63A400263BE5 /* RunnerTests */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 331C807B294A618700263BE5 /* RunnerTests.swift */, 94 | ); 95 | path = RunnerTests; 96 | sourceTree = ""; 97 | }; 98 | 919DBB23A0FF47C8D26CDC35 /* Pods */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 76186EB6D864C4FA355EC132 /* Pods-Runner.debug.xcconfig */, 102 | 22481926249349F0104AF931 /* Pods-Runner.release.xcconfig */, 103 | 2C12219607FAA0E58A159212 /* Pods-Runner.profile.xcconfig */, 104 | F0D9450EC0295925581D8642 /* Pods-RunnerTests.debug.xcconfig */, 105 | 80BCC6F90621AA41FAD417D6 /* Pods-RunnerTests.release.xcconfig */, 106 | 96831C5812FB16A23902C681 /* Pods-RunnerTests.profile.xcconfig */, 107 | ); 108 | name = Pods; 109 | path = Pods; 110 | sourceTree = ""; 111 | }; 112 | 9740EEB11CF90186004384FC /* Flutter */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 116 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 117 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 118 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 119 | ); 120 | name = Flutter; 121 | sourceTree = ""; 122 | }; 123 | 97C146E51CF9000F007C117D = { 124 | isa = PBXGroup; 125 | children = ( 126 | 9740EEB11CF90186004384FC /* Flutter */, 127 | 97C146F01CF9000F007C117D /* Runner */, 128 | 97C146EF1CF9000F007C117D /* Products */, 129 | 331C8082294A63A400263BE5 /* RunnerTests */, 130 | 919DBB23A0FF47C8D26CDC35 /* Pods */, 131 | BA0B9DA0ECFA06A0F5B6D5B2 /* Frameworks */, 132 | ); 133 | sourceTree = ""; 134 | }; 135 | 97C146EF1CF9000F007C117D /* Products */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 97C146EE1CF9000F007C117D /* Runner.app */, 139 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */, 140 | ); 141 | name = Products; 142 | sourceTree = ""; 143 | }; 144 | 97C146F01CF9000F007C117D /* Runner */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 148 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 149 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 150 | 97C147021CF9000F007C117D /* Info.plist */, 151 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 152 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 153 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 154 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 155 | ); 156 | path = Runner; 157 | sourceTree = ""; 158 | }; 159 | BA0B9DA0ECFA06A0F5B6D5B2 /* Frameworks */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | E80E3D0199B5F0348AC05781 /* Pods_Runner.framework */, 163 | 7548521CC5ECDEBC9B6C2FDA /* Pods_RunnerTests.framework */, 164 | ); 165 | name = Frameworks; 166 | sourceTree = ""; 167 | }; 168 | /* End PBXGroup section */ 169 | 170 | /* Begin PBXNativeTarget section */ 171 | 331C8080294A63A400263BE5 /* RunnerTests */ = { 172 | isa = PBXNativeTarget; 173 | buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; 174 | buildPhases = ( 175 | 8313A388D0E76572FAF847D9 /* [CP] Check Pods Manifest.lock */, 176 | 331C807D294A63A400263BE5 /* Sources */, 177 | 331C807F294A63A400263BE5 /* Resources */, 178 | 64C77ACA23E389269B926F89 /* Frameworks */, 179 | ); 180 | buildRules = ( 181 | ); 182 | dependencies = ( 183 | 331C8086294A63A400263BE5 /* PBXTargetDependency */, 184 | ); 185 | name = RunnerTests; 186 | productName = RunnerTests; 187 | productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; 188 | productType = "com.apple.product-type.bundle.unit-test"; 189 | }; 190 | 97C146ED1CF9000F007C117D /* Runner */ = { 191 | isa = PBXNativeTarget; 192 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 193 | buildPhases = ( 194 | 20E146AEACC219783F055861 /* [CP] Check Pods Manifest.lock */, 195 | 9740EEB61CF901F6004384FC /* Run Script */, 196 | 97C146EA1CF9000F007C117D /* Sources */, 197 | 97C146EB1CF9000F007C117D /* Frameworks */, 198 | 97C146EC1CF9000F007C117D /* Resources */, 199 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 201 | EFFA8796403361563375BEC2 /* [CP] Embed Pods Frameworks */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | ); 207 | name = Runner; 208 | productName = Runner; 209 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 210 | productType = "com.apple.product-type.application"; 211 | }; 212 | /* End PBXNativeTarget section */ 213 | 214 | /* Begin PBXProject section */ 215 | 97C146E61CF9000F007C117D /* Project object */ = { 216 | isa = PBXProject; 217 | attributes = { 218 | BuildIndependentTargetsInParallel = YES; 219 | LastUpgradeCheck = 1510; 220 | ORGANIZATIONNAME = ""; 221 | TargetAttributes = { 222 | 331C8080294A63A400263BE5 = { 223 | CreatedOnToolsVersion = 14.0; 224 | TestTargetID = 97C146ED1CF9000F007C117D; 225 | }; 226 | 97C146ED1CF9000F007C117D = { 227 | CreatedOnToolsVersion = 7.3.1; 228 | LastSwiftMigration = 1100; 229 | }; 230 | }; 231 | }; 232 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 233 | compatibilityVersion = "Xcode 9.3"; 234 | developmentRegion = en; 235 | hasScannedForEncodings = 0; 236 | knownRegions = ( 237 | en, 238 | Base, 239 | ); 240 | mainGroup = 97C146E51CF9000F007C117D; 241 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 242 | projectDirPath = ""; 243 | projectRoot = ""; 244 | targets = ( 245 | 97C146ED1CF9000F007C117D /* Runner */, 246 | 331C8080294A63A400263BE5 /* RunnerTests */, 247 | ); 248 | }; 249 | /* End PBXProject section */ 250 | 251 | /* Begin PBXResourcesBuildPhase section */ 252 | 331C807F294A63A400263BE5 /* Resources */ = { 253 | isa = PBXResourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | 97C146EC1CF9000F007C117D /* Resources */ = { 260 | isa = PBXResourcesBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 264 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 265 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 266 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 267 | ); 268 | runOnlyForDeploymentPostprocessing = 0; 269 | }; 270 | /* End PBXResourcesBuildPhase section */ 271 | 272 | /* Begin PBXShellScriptBuildPhase section */ 273 | 20E146AEACC219783F055861 /* [CP] Check Pods Manifest.lock */ = { 274 | isa = PBXShellScriptBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | inputFileListPaths = ( 279 | ); 280 | inputPaths = ( 281 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 282 | "${PODS_ROOT}/Manifest.lock", 283 | ); 284 | name = "[CP] Check Pods Manifest.lock"; 285 | outputFileListPaths = ( 286 | ); 287 | outputPaths = ( 288 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 289 | ); 290 | runOnlyForDeploymentPostprocessing = 0; 291 | shellPath = /bin/sh; 292 | 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"; 293 | showEnvVarsInLog = 0; 294 | }; 295 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 296 | isa = PBXShellScriptBuildPhase; 297 | alwaysOutOfDate = 1; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | inputPaths = ( 302 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", 303 | ); 304 | name = "Thin Binary"; 305 | outputPaths = ( 306 | ); 307 | runOnlyForDeploymentPostprocessing = 0; 308 | shellPath = /bin/sh; 309 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 310 | }; 311 | 8313A388D0E76572FAF847D9 /* [CP] Check Pods Manifest.lock */ = { 312 | isa = PBXShellScriptBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | ); 316 | inputFileListPaths = ( 317 | ); 318 | inputPaths = ( 319 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 320 | "${PODS_ROOT}/Manifest.lock", 321 | ); 322 | name = "[CP] Check Pods Manifest.lock"; 323 | outputFileListPaths = ( 324 | ); 325 | outputPaths = ( 326 | "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", 327 | ); 328 | runOnlyForDeploymentPostprocessing = 0; 329 | shellPath = /bin/sh; 330 | 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"; 331 | showEnvVarsInLog = 0; 332 | }; 333 | 9740EEB61CF901F6004384FC /* Run Script */ = { 334 | isa = PBXShellScriptBuildPhase; 335 | alwaysOutOfDate = 1; 336 | buildActionMask = 2147483647; 337 | files = ( 338 | ); 339 | inputPaths = ( 340 | ); 341 | name = "Run Script"; 342 | outputPaths = ( 343 | ); 344 | runOnlyForDeploymentPostprocessing = 0; 345 | shellPath = /bin/sh; 346 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 347 | }; 348 | EFFA8796403361563375BEC2 /* [CP] Embed Pods Frameworks */ = { 349 | isa = PBXShellScriptBuildPhase; 350 | buildActionMask = 2147483647; 351 | files = ( 352 | ); 353 | inputFileListPaths = ( 354 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 355 | ); 356 | name = "[CP] Embed Pods Frameworks"; 357 | outputFileListPaths = ( 358 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | shellPath = /bin/sh; 362 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 363 | showEnvVarsInLog = 0; 364 | }; 365 | /* End PBXShellScriptBuildPhase section */ 366 | 367 | /* Begin PBXSourcesBuildPhase section */ 368 | 331C807D294A63A400263BE5 /* Sources */ = { 369 | isa = PBXSourcesBuildPhase; 370 | buildActionMask = 2147483647; 371 | files = ( 372 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, 373 | ); 374 | runOnlyForDeploymentPostprocessing = 0; 375 | }; 376 | 97C146EA1CF9000F007C117D /* Sources */ = { 377 | isa = PBXSourcesBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 381 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 382 | ); 383 | runOnlyForDeploymentPostprocessing = 0; 384 | }; 385 | /* End PBXSourcesBuildPhase section */ 386 | 387 | /* Begin PBXTargetDependency section */ 388 | 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { 389 | isa = PBXTargetDependency; 390 | target = 97C146ED1CF9000F007C117D /* Runner */; 391 | targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; 392 | }; 393 | /* End PBXTargetDependency section */ 394 | 395 | /* Begin PBXVariantGroup section */ 396 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 397 | isa = PBXVariantGroup; 398 | children = ( 399 | 97C146FB1CF9000F007C117D /* Base */, 400 | ); 401 | name = Main.storyboard; 402 | sourceTree = ""; 403 | }; 404 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 405 | isa = PBXVariantGroup; 406 | children = ( 407 | 97C147001CF9000F007C117D /* Base */, 408 | ); 409 | name = LaunchScreen.storyboard; 410 | sourceTree = ""; 411 | }; 412 | /* End PBXVariantGroup section */ 413 | 414 | /* Begin XCBuildConfiguration section */ 415 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 416 | isa = XCBuildConfiguration; 417 | buildSettings = { 418 | ALWAYS_SEARCH_USER_PATHS = NO; 419 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 420 | CLANG_ANALYZER_NONNULL = YES; 421 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 422 | CLANG_CXX_LIBRARY = "libc++"; 423 | CLANG_ENABLE_MODULES = YES; 424 | CLANG_ENABLE_OBJC_ARC = YES; 425 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 426 | CLANG_WARN_BOOL_CONVERSION = YES; 427 | CLANG_WARN_COMMA = YES; 428 | CLANG_WARN_CONSTANT_CONVERSION = YES; 429 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 430 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 431 | CLANG_WARN_EMPTY_BODY = YES; 432 | CLANG_WARN_ENUM_CONVERSION = YES; 433 | CLANG_WARN_INFINITE_RECURSION = YES; 434 | CLANG_WARN_INT_CONVERSION = YES; 435 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 436 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 437 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 438 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 439 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 440 | CLANG_WARN_STRICT_PROTOTYPES = YES; 441 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 442 | CLANG_WARN_UNREACHABLE_CODE = YES; 443 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 444 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 445 | COPY_PHASE_STRIP = NO; 446 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 447 | ENABLE_NS_ASSERTIONS = NO; 448 | ENABLE_STRICT_OBJC_MSGSEND = YES; 449 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 450 | GCC_C_LANGUAGE_STANDARD = gnu99; 451 | GCC_NO_COMMON_BLOCKS = YES; 452 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 453 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 454 | GCC_WARN_UNDECLARED_SELECTOR = YES; 455 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 456 | GCC_WARN_UNUSED_FUNCTION = YES; 457 | GCC_WARN_UNUSED_VARIABLE = YES; 458 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 459 | MTL_ENABLE_DEBUG_INFO = NO; 460 | SDKROOT = iphoneos; 461 | SUPPORTED_PLATFORMS = iphoneos; 462 | TARGETED_DEVICE_FAMILY = "1,2"; 463 | VALIDATE_PRODUCT = YES; 464 | }; 465 | name = Profile; 466 | }; 467 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 468 | isa = XCBuildConfiguration; 469 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 470 | buildSettings = { 471 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 472 | CLANG_ENABLE_MODULES = YES; 473 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 474 | DEVELOPMENT_TEAM = YQN396B582; 475 | ENABLE_BITCODE = NO; 476 | INFOPLIST_FILE = Runner/Info.plist; 477 | LD_RUNPATH_SEARCH_PATHS = ( 478 | "$(inherited)", 479 | "@executable_path/Frameworks", 480 | ); 481 | PRODUCT_BUNDLE_IDENTIFIER = com.example.cosmeticsStore; 482 | PRODUCT_NAME = "$(TARGET_NAME)"; 483 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 484 | SWIFT_VERSION = 5.0; 485 | VERSIONING_SYSTEM = "apple-generic"; 486 | }; 487 | name = Profile; 488 | }; 489 | 331C8088294A63A400263BE5 /* Debug */ = { 490 | isa = XCBuildConfiguration; 491 | baseConfigurationReference = F0D9450EC0295925581D8642 /* Pods-RunnerTests.debug.xcconfig */; 492 | buildSettings = { 493 | BUNDLE_LOADER = "$(TEST_HOST)"; 494 | CODE_SIGN_STYLE = Automatic; 495 | CURRENT_PROJECT_VERSION = 1; 496 | GENERATE_INFOPLIST_FILE = YES; 497 | MARKETING_VERSION = 1.0; 498 | PRODUCT_BUNDLE_IDENTIFIER = com.example.cosmeticsStore.RunnerTests; 499 | PRODUCT_NAME = "$(TARGET_NAME)"; 500 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 501 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 502 | SWIFT_VERSION = 5.0; 503 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 504 | }; 505 | name = Debug; 506 | }; 507 | 331C8089294A63A400263BE5 /* Release */ = { 508 | isa = XCBuildConfiguration; 509 | baseConfigurationReference = 80BCC6F90621AA41FAD417D6 /* Pods-RunnerTests.release.xcconfig */; 510 | buildSettings = { 511 | BUNDLE_LOADER = "$(TEST_HOST)"; 512 | CODE_SIGN_STYLE = Automatic; 513 | CURRENT_PROJECT_VERSION = 1; 514 | GENERATE_INFOPLIST_FILE = YES; 515 | MARKETING_VERSION = 1.0; 516 | PRODUCT_BUNDLE_IDENTIFIER = com.example.cosmeticsStore.RunnerTests; 517 | PRODUCT_NAME = "$(TARGET_NAME)"; 518 | SWIFT_VERSION = 5.0; 519 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 520 | }; 521 | name = Release; 522 | }; 523 | 331C808A294A63A400263BE5 /* Profile */ = { 524 | isa = XCBuildConfiguration; 525 | baseConfigurationReference = 96831C5812FB16A23902C681 /* Pods-RunnerTests.profile.xcconfig */; 526 | buildSettings = { 527 | BUNDLE_LOADER = "$(TEST_HOST)"; 528 | CODE_SIGN_STYLE = Automatic; 529 | CURRENT_PROJECT_VERSION = 1; 530 | GENERATE_INFOPLIST_FILE = YES; 531 | MARKETING_VERSION = 1.0; 532 | PRODUCT_BUNDLE_IDENTIFIER = com.example.cosmeticsStore.RunnerTests; 533 | PRODUCT_NAME = "$(TARGET_NAME)"; 534 | SWIFT_VERSION = 5.0; 535 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 536 | }; 537 | name = Profile; 538 | }; 539 | 97C147031CF9000F007C117D /* Debug */ = { 540 | isa = XCBuildConfiguration; 541 | buildSettings = { 542 | ALWAYS_SEARCH_USER_PATHS = NO; 543 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 544 | CLANG_ANALYZER_NONNULL = YES; 545 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 546 | CLANG_CXX_LIBRARY = "libc++"; 547 | CLANG_ENABLE_MODULES = YES; 548 | CLANG_ENABLE_OBJC_ARC = YES; 549 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 550 | CLANG_WARN_BOOL_CONVERSION = YES; 551 | CLANG_WARN_COMMA = YES; 552 | CLANG_WARN_CONSTANT_CONVERSION = YES; 553 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 554 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 555 | CLANG_WARN_EMPTY_BODY = YES; 556 | CLANG_WARN_ENUM_CONVERSION = YES; 557 | CLANG_WARN_INFINITE_RECURSION = YES; 558 | CLANG_WARN_INT_CONVERSION = YES; 559 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 560 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 561 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 562 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 563 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 564 | CLANG_WARN_STRICT_PROTOTYPES = YES; 565 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 566 | CLANG_WARN_UNREACHABLE_CODE = YES; 567 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 568 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 569 | COPY_PHASE_STRIP = NO; 570 | DEBUG_INFORMATION_FORMAT = dwarf; 571 | ENABLE_STRICT_OBJC_MSGSEND = YES; 572 | ENABLE_TESTABILITY = YES; 573 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 574 | GCC_C_LANGUAGE_STANDARD = gnu99; 575 | GCC_DYNAMIC_NO_PIC = NO; 576 | GCC_NO_COMMON_BLOCKS = YES; 577 | GCC_OPTIMIZATION_LEVEL = 0; 578 | GCC_PREPROCESSOR_DEFINITIONS = ( 579 | "DEBUG=1", 580 | "$(inherited)", 581 | ); 582 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 583 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 584 | GCC_WARN_UNDECLARED_SELECTOR = YES; 585 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 586 | GCC_WARN_UNUSED_FUNCTION = YES; 587 | GCC_WARN_UNUSED_VARIABLE = YES; 588 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 589 | MTL_ENABLE_DEBUG_INFO = YES; 590 | ONLY_ACTIVE_ARCH = YES; 591 | SDKROOT = iphoneos; 592 | TARGETED_DEVICE_FAMILY = "1,2"; 593 | }; 594 | name = Debug; 595 | }; 596 | 97C147041CF9000F007C117D /* Release */ = { 597 | isa = XCBuildConfiguration; 598 | buildSettings = { 599 | ALWAYS_SEARCH_USER_PATHS = NO; 600 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 601 | CLANG_ANALYZER_NONNULL = YES; 602 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 603 | CLANG_CXX_LIBRARY = "libc++"; 604 | CLANG_ENABLE_MODULES = YES; 605 | CLANG_ENABLE_OBJC_ARC = YES; 606 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 607 | CLANG_WARN_BOOL_CONVERSION = YES; 608 | CLANG_WARN_COMMA = YES; 609 | CLANG_WARN_CONSTANT_CONVERSION = YES; 610 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 611 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 612 | CLANG_WARN_EMPTY_BODY = YES; 613 | CLANG_WARN_ENUM_CONVERSION = YES; 614 | CLANG_WARN_INFINITE_RECURSION = YES; 615 | CLANG_WARN_INT_CONVERSION = YES; 616 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 617 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 618 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 619 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 620 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 621 | CLANG_WARN_STRICT_PROTOTYPES = YES; 622 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 623 | CLANG_WARN_UNREACHABLE_CODE = YES; 624 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 625 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 626 | COPY_PHASE_STRIP = NO; 627 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 628 | ENABLE_NS_ASSERTIONS = NO; 629 | ENABLE_STRICT_OBJC_MSGSEND = YES; 630 | ENABLE_USER_SCRIPT_SANDBOXING = NO; 631 | GCC_C_LANGUAGE_STANDARD = gnu99; 632 | GCC_NO_COMMON_BLOCKS = YES; 633 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 634 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 635 | GCC_WARN_UNDECLARED_SELECTOR = YES; 636 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 637 | GCC_WARN_UNUSED_FUNCTION = YES; 638 | GCC_WARN_UNUSED_VARIABLE = YES; 639 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 640 | MTL_ENABLE_DEBUG_INFO = NO; 641 | SDKROOT = iphoneos; 642 | SUPPORTED_PLATFORMS = iphoneos; 643 | SWIFT_COMPILATION_MODE = wholemodule; 644 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 645 | TARGETED_DEVICE_FAMILY = "1,2"; 646 | VALIDATE_PRODUCT = YES; 647 | }; 648 | name = Release; 649 | }; 650 | 97C147061CF9000F007C117D /* Debug */ = { 651 | isa = XCBuildConfiguration; 652 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 653 | buildSettings = { 654 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 655 | CLANG_ENABLE_MODULES = YES; 656 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 657 | DEVELOPMENT_TEAM = YQN396B582; 658 | ENABLE_BITCODE = NO; 659 | INFOPLIST_FILE = Runner/Info.plist; 660 | LD_RUNPATH_SEARCH_PATHS = ( 661 | "$(inherited)", 662 | "@executable_path/Frameworks", 663 | ); 664 | PRODUCT_BUNDLE_IDENTIFIER = com.example.cosmeticsStore; 665 | PRODUCT_NAME = "$(TARGET_NAME)"; 666 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 667 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 668 | SWIFT_VERSION = 5.0; 669 | VERSIONING_SYSTEM = "apple-generic"; 670 | }; 671 | name = Debug; 672 | }; 673 | 97C147071CF9000F007C117D /* Release */ = { 674 | isa = XCBuildConfiguration; 675 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 676 | buildSettings = { 677 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 678 | CLANG_ENABLE_MODULES = YES; 679 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 680 | DEVELOPMENT_TEAM = YQN396B582; 681 | ENABLE_BITCODE = NO; 682 | INFOPLIST_FILE = Runner/Info.plist; 683 | LD_RUNPATH_SEARCH_PATHS = ( 684 | "$(inherited)", 685 | "@executable_path/Frameworks", 686 | ); 687 | PRODUCT_BUNDLE_IDENTIFIER = com.example.cosmeticsStore; 688 | PRODUCT_NAME = "$(TARGET_NAME)"; 689 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 690 | SWIFT_VERSION = 5.0; 691 | VERSIONING_SYSTEM = "apple-generic"; 692 | }; 693 | name = Release; 694 | }; 695 | /* End XCBuildConfiguration section */ 696 | 697 | /* Begin XCConfigurationList section */ 698 | 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { 699 | isa = XCConfigurationList; 700 | buildConfigurations = ( 701 | 331C8088294A63A400263BE5 /* Debug */, 702 | 331C8089294A63A400263BE5 /* Release */, 703 | 331C808A294A63A400263BE5 /* Profile */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 709 | isa = XCConfigurationList; 710 | buildConfigurations = ( 711 | 97C147031CF9000F007C117D /* Debug */, 712 | 97C147041CF9000F007C117D /* Release */, 713 | 249021D3217E4FDB00AE95B9 /* Profile */, 714 | ); 715 | defaultConfigurationIsVisible = 0; 716 | defaultConfigurationName = Release; 717 | }; 718 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 719 | isa = XCConfigurationList; 720 | buildConfigurations = ( 721 | 97C147061CF9000F007C117D /* Debug */, 722 | 97C147071CF9000F007C117D /* Release */, 723 | 249021D4217E4FDB00AE95B9 /* Profile */, 724 | ); 725 | defaultConfigurationIsVisible = 0; 726 | defaultConfigurationName = Release; 727 | }; 728 | /* End XCConfigurationList section */ 729 | }; 730 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 731 | } 732 | --------------------------------------------------------------------------------