├── 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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------