├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── 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 ├── 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 └── .gitignore ├── .vscode └── settings.json ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ ├── Icon-512.png │ ├── Icon-maskable-192.png │ └── Icon-maskable-512.png ├── manifest.json └── index.html ├── assets ├── imgs │ ├── d1.png │ ├── d2.png │ ├── d3.png │ ├── d4.png │ ├── d5.png │ ├── d6.png │ ├── screenshot.png │ └── rome_colosseum.jpeg ├── icons │ ├── otology.png │ ├── gynecology.png │ ├── pulmonology.png │ └── gastroenterology.png ├── fonts │ ├── gilroy_black.otf │ ├── gilroy_bold.otf │ ├── gilroy_heavy.otf │ ├── gilroy_light.otf │ ├── gilroy_thin.otf │ ├── gilroy_medium.otf │ ├── gilroy_regular.otf │ ├── gilroy_extraBold.otf │ ├── gilroy_semiBold.otf │ └── gilroy_ultraLight.otf └── animations │ └── loading_anim.json ├── android ├── gradle.properties ├── 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 │ │ │ │ │ └── dr_flutter_template │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle └── build.gradle ├── lib ├── data │ └── models │ │ ├── specialty.dart │ │ └── doctor.dart ├── utils │ └── app_constant │ │ ├── colors.dart │ │ ├── app_gradient.dart │ │ └── app_data.dart ├── views │ └── doctor_appointment │ │ └── doctor_appointment_page.dart ├── component │ ├── doctor_specialties.dart │ ├── doctor_specialties_item.dart │ ├── doctor_appointment_body.dart │ ├── toolbar.dart │ └── doctor_item.dart ├── theme.dart └── main.dart ├── .gitignore ├── README.md ├── test └── widget_test.dart ├── pubspec.yaml ├── .metadata ├── analysis_options.yaml └── pubspec.lock /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "cupertino" 4 | ] 5 | } -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/web/favicon.png -------------------------------------------------------------------------------- /assets/imgs/d1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/d1.png -------------------------------------------------------------------------------- /assets/imgs/d2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/d2.png -------------------------------------------------------------------------------- /assets/imgs/d3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/d3.png -------------------------------------------------------------------------------- /assets/imgs/d4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/d4.png -------------------------------------------------------------------------------- /assets/imgs/d5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/d5.png -------------------------------------------------------------------------------- /assets/imgs/d6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/d6.png -------------------------------------------------------------------------------- /assets/icons/otology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/icons/otology.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/web/icons/Icon-512.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /assets/imgs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/screenshot.png -------------------------------------------------------------------------------- /assets/fonts/gilroy_black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_black.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_bold.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_heavy.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_heavy.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_light.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_thin.otf -------------------------------------------------------------------------------- /assets/icons/gynecology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/icons/gynecology.png -------------------------------------------------------------------------------- /assets/icons/pulmonology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/icons/pulmonology.png -------------------------------------------------------------------------------- /assets/fonts/gilroy_medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_medium.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_regular.otf -------------------------------------------------------------------------------- /assets/imgs/rome_colosseum.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/imgs/rome_colosseum.jpeg -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /assets/fonts/gilroy_extraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_extraBold.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_semiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_semiBold.otf -------------------------------------------------------------------------------- /assets/fonts/gilroy_ultraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/fonts/gilroy_ultraLight.otf -------------------------------------------------------------------------------- /assets/icons/gastroenterology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/assets/icons/gastroenterology.png -------------------------------------------------------------------------------- /lib/data/models/specialty.dart: -------------------------------------------------------------------------------- 1 | class Specialty{ 2 | final String name; 3 | final String iconPath; 4 | Specialty({required this.name,required this.iconPath}); 5 | } -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/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/alireza-rajaei/dr_flutter_template/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/dr_flutter_template/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.dr_flutter_template 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /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-7.4-all.zip 6 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/data/models/doctor.dart: -------------------------------------------------------------------------------- 1 | class Doctor{ 2 | final String fullName ; 3 | final String price ; 4 | final String picture ; 5 | final String time ; 6 | final String specialties ; 7 | final String gender ; 8 | 9 | Doctor(this.fullName, this.price, this.time, this.specialties, this.picture, this.gender); 10 | 11 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /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 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 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/utils/app_constant/colors.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | Color blueGray = const Color(0xFF2c343e); 4 | Color g11 = const Color(0xFFf9cebd); 5 | Color g12 = const Color(0xfffaa57a); 6 | Color g21 = const Color(0xFF8fd0d6); 7 | Color g22 = const Color(0xff61bdcc); 8 | Color g31 = const Color(0xFF7aa7d0); 9 | Color g32 = const Color(0xff72a4d5); 10 | Color g41 = const Color(0xff5b7c9a); 11 | Color g42 = const Color(0xff4c6a87); 12 | Color searchInput = const Color(0xff3b4252); 13 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.1.2' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /lib/utils/app_constant/app_gradient.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | import 'colors.dart'; 4 | 5 | class AppGradient{ 6 | static final Listgradient=[ 7 | LinearGradient( 8 | colors: [g11,g12], 9 | begin: Alignment.topRight, 10 | end: Alignment.bottomLeft 11 | ),LinearGradient( 12 | colors: [g21,g22], 13 | begin: Alignment.topRight, 14 | end: Alignment.bottomLeft 15 | ),LinearGradient( 16 | colors: [g31,g32], 17 | begin: Alignment.topRight, 18 | end: Alignment.bottomLeft 19 | ),LinearGradient( 20 | colors: [g41,g42], 21 | begin: Alignment.topRight, 22 | end: Alignment.bottomLeft 23 | ), 24 | ]; 25 | } -------------------------------------------------------------------------------- /lib/views/doctor_appointment/doctor_appointment_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../component/doctor_appointment_body.dart'; 4 | import '../../utils/app_constant/colors.dart'; 5 | 6 | class DoctorAppointmentPage extends StatefulWidget { 7 | const DoctorAppointmentPage({Key? key}) : super(key: key); 8 | 9 | @override 10 | _DoctorAppointmentPageState createState() => _DoctorAppointmentPageState(); 11 | } 12 | 13 | class _DoctorAppointmentPageState extends State { 14 | final ScrollController _scrollController = ScrollController(); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Scaffold( 19 | backgroundColor: blueGray, 20 | body: Container( 21 | padding: const EdgeInsets.only(top: 35), 22 | child: const DoctorAppointmentBody()), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /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 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dr_flutter_template", 3 | "short_name": "dr_flutter_template", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://github.com/alireza-rajaei/dr_flutter_template/blob/master/assets/imgs/screenshot.png) 2 | 3 | Installation 4 | 5 | ``` 6 | flutter pub get 7 | ``` 8 | Usage 9 | 10 | ``` 11 | flutter run 12 | ``` 13 | 14 | Dotor Booking App UI made with Flutter, Don't forget to star ⭐ the repo it motivates me to share more open source 15 | 16 | > You can also nominate me for Github Star developer program 17 | > https://github.com/alireza-rajaei 18 | 19 | ### License 20 | 21 | Copyright 2020 Alireza rajaei 22 | 23 | Licensed under the Apache License, Version 2.0 (the "License"); 24 | you may not use this file except in compliance with the License. 25 | You may obtain a copy of the License at 26 | 27 | http://www.apache.org/licenses/LICENSE-2.0 28 | 29 | Unless required by applicable law or agreed to in writing, software 30 | distributed under the License is distributed on an "AS IS" BASIS, 31 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 32 | See the License for the specific language governing permissions and 33 | limitations under the License. 34 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:dr_flutter_template/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: dr_flutter_template 2 | description: A new Flutter project. 3 | publish_to: "none" 4 | version: 1.0.0+1 5 | 6 | environment: 7 | sdk: ">=2.18.2 <3.0.0" 8 | dependencies: 9 | flutter: 10 | sdk: flutter 11 | cupertino_icons: ^1.0.2 12 | lottie: ^1.2.1 13 | 14 | dev_dependencies: 15 | flutter_test: 16 | sdk: flutter 17 | flutter_lints: ^1.0.0 18 | flutter: 19 | assets: 20 | - assets/icons/ 21 | - assets/animations/ 22 | - assets/imgs/ 23 | uses-material-design: true 24 | fonts: 25 | - family: gilroy 26 | fonts: 27 | - asset: assets/fonts/gilroy_ultraLight.otf 28 | weight: 100 29 | - asset: assets/fonts/gilroy_thin.otf 30 | weight: 200 31 | - asset: assets/fonts/gilroy_light.otf 32 | weight: 300 33 | - asset: assets/fonts/gilroy_regular.otf 34 | weight: 400 35 | - asset: assets/fonts/gilroy_medium.otf 36 | weight: 500 37 | - asset: assets/fonts/gilroy_semiBold.otf 38 | weight: 600 39 | - asset: assets/fonts/gilroy_bold.otf 40 | weight: 700 41 | - asset: assets/fonts/gilroy_extraBold.otf 42 | weight: 800 43 | - asset: assets/fonts/gilroy_black.otf 44 | weight: 900 45 | -------------------------------------------------------------------------------- /.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. 5 | 6 | version: 7 | revision: eb6d86ee27deecba4a83536aa20f366a6044895c 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: eb6d86ee27deecba4a83536aa20f366a6044895c 17 | base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 18 | - platform: android 19 | create_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 20 | base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 21 | - platform: ios 22 | create_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 23 | base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 24 | - platform: web 25 | create_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 26 | base_revision: eb6d86ee27deecba4a83536aa20f366a6044895c 27 | 28 | # User provided section 29 | 30 | # List of Local paths (relative to this file) that should be 31 | # ignored by the migrate tool. 32 | # 33 | # Files that are not part of the templates will be ignored by default. 34 | unmanaged_files: 35 | - 'lib/main.dart' 36 | - 'ios/Runner.xcodeproj/project.pbxproj' 37 | -------------------------------------------------------------------------------- /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 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /lib/utils/app_constant/app_data.dart: -------------------------------------------------------------------------------- 1 | import '../../data/models/doctor.dart'; 2 | import '../../data/models/specialty.dart'; 3 | 4 | class AppData { 5 | static final List specialties = [ 6 | Specialty(name: "Otology", iconPath: "assets/icons/otology.png"), 7 | Specialty( 8 | name: "Gastroenterology", 9 | iconPath: "assets/icons/gastroenterology.png"), 10 | Specialty(name: "Pulmonology", iconPath: "assets/icons/pulmonology.png"), 11 | Specialty(name: "Gynecology", iconPath: "assets/icons/gynecology.png"), 12 | Specialty(name: "Show All", iconPath: ""), 13 | ]; 14 | static final List doctors = [ 15 | Doctor('Brittany Andreoli, MD', '\$20.50', '08:00 AM - 01:00 PM', 16 | "Otology - Gastroenterology", 'assets/imgs/d1.png', "f"), 17 | Doctor('Hendrick Arnold, MD', '\$15.40', '02:00 PM - 08:00 PM', 18 | "Pulmonology - Gastroenterology", 'assets/imgs/d2.png', "m"), 19 | Doctor('Joyce Bellin, PA-C', '10.50', '08:00 AM - 12:00 AM', 20 | "Gynecology - Pulmonology", 'assets/imgs/d3.png', "f"), 21 | Doctor('Michael Burke, MD', '14.50', '08:00 AM - 12:00 AM', 22 | "Gynecology - Pulmonology", 'assets/imgs/d4.png', "m"), 23 | Doctor('Michael Burke, MD', '14.50', '08:00 AM - 12:00 AM', 24 | "Gynecology - Pulmonology", 'assets/imgs/d5.png', "m"), 25 | ]; 26 | 27 | static final List pics = [ 28 | "assets/imgs/rome_colosseum.jpeg", 29 | "assets/imgs/rome_colosseum.jpeg", 30 | "assets/imgs/rome_colosseum.jpeg", 31 | "assets/imgs/rome_colosseum.jpeg", 32 | "assets/imgs/rome_colosseum.jpeg" 33 | ]; 34 | } 35 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Dr Flutter Template 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | dr_flutter_template 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 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | UIApplicationSupportsIndirectInputEvents 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | dr_flutter_template 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion flutter.compileSdkVersion 30 | ndkVersion flutter.ndkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.example.dr_flutter_template" 48 | // You can update the following values to match your application needs. 49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. 50 | minSdkVersion flutter.minSdkVersion 51 | targetSdkVersion flutter.targetSdkVersion 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | } 55 | 56 | buildTypes { 57 | release { 58 | // TODO: Add your own signing config for the release build. 59 | // Signing with the debug keys for now, so `flutter run --release` works. 60 | signingConfig signingConfigs.debug 61 | } 62 | } 63 | } 64 | 65 | flutter { 66 | source '../..' 67 | } 68 | 69 | dependencies { 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /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/component/doctor_specialties.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../utils/app_constant/app_data.dart'; 4 | import 'doctor_specialties_item.dart'; 5 | 6 | class DoctorSpecialities extends StatefulWidget { 7 | const DoctorSpecialities({Key? key,required this.showAnimation}) : super(key: key); 8 | final bool showAnimation; 9 | @override 10 | _DoctorSpecialitiesState createState() => _DoctorSpecialitiesState(); 11 | } 12 | 13 | class _DoctorSpecialitiesState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | return SizedBox( 17 | width: MediaQuery.of(context).size.width, 18 | child: Column( 19 | crossAxisAlignment: CrossAxisAlignment.start, 20 | children: [ 21 | if(!widget.showAnimation) 22 | Padding( 23 | padding: const EdgeInsets.only(left: 20, right: 20, top: 20), 24 | child: Text( 25 | 'Hello AliReza', 26 | style: Theme.of(context).textTheme.headline3!.copyWith( 27 | fontWeight: FontWeight.w700, 28 | fontSize: 18, 29 | color: Colors.white.withOpacity(.3)), 30 | ), 31 | ), 32 | if(!widget.showAnimation) 33 | Padding( 34 | padding: const EdgeInsets.only(left: 20, right: 20, top: 10), 35 | child: Text( 36 | 'Medical specialties', 37 | style: Theme.of(context).textTheme.headline3!.copyWith( 38 | fontWeight: FontWeight.w700, 39 | fontSize: 23, 40 | color: Colors.white), 41 | ), 42 | ), 43 | Container( 44 | margin: const EdgeInsets.only(top: 20), 45 | height: 140, 46 | width: MediaQuery.of(context).size.width, 47 | child: ListView.separated( 48 | padding: const EdgeInsets.symmetric(horizontal: 20), 49 | shrinkWrap: true, 50 | scrollDirection: Axis.horizontal, 51 | itemBuilder: (context, index) { 52 | return DoctorSpecialtiesItem( 53 | index: index, 54 | specialty: AppData.specialties[index], 55 | showAnim: widget.showAnimation, 56 | ); 57 | }, 58 | separatorBuilder: (BuildContext context, int index) { 59 | return Container( 60 | width: 15, 61 | ); 62 | }, itemCount: AppData.specialties.length, 63 | ), 64 | ) 65 | ], 66 | ), 67 | ); 68 | } 69 | 70 | 71 | } 72 | 73 | -------------------------------------------------------------------------------- /lib/component/doctor_specialties_item.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | import '../data/models/specialty.dart'; 6 | import '../utils/app_constant/app_gradient.dart'; 7 | 8 | class DoctorSpecialtiesItem extends StatefulWidget { 9 | final int index; 10 | final Specialty specialty; 11 | final bool showAnim; 12 | 13 | const DoctorSpecialtiesItem({ 14 | Key? key, 15 | required this.index, 16 | required this.specialty, 17 | required this.showAnim, 18 | }) : super(key: key); 19 | 20 | @override 21 | _DoctorSpecialtiesItemState createState() => _DoctorSpecialtiesItemState(); 22 | } 23 | 24 | class _DoctorSpecialtiesItemState extends State { 25 | bool showAnimation = true; 26 | 27 | @override 28 | void initState() { 29 | super.initState(); 30 | } 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | if (widget.showAnim != showAnimation) { 35 | handleAnimation(); 36 | } 37 | return Column( 38 | children: [ 39 | AnimatedContainer( 40 | duration: const Duration(milliseconds: 200), 41 | height: showAnimation ? 40 : 0, 42 | ), 43 | AnimatedOpacity( 44 | duration: const Duration(milliseconds: 200), 45 | opacity: showAnimation ? 0 : 1, 46 | child: Container( 47 | height: 100, 48 | width: 100, 49 | decoration: BoxDecoration( 50 | borderRadius: BorderRadius.circular(15), 51 | gradient: AppGradient.gradient[widget.index % 4]), 52 | child: Column( 53 | mainAxisAlignment: MainAxisAlignment.center, 54 | crossAxisAlignment: CrossAxisAlignment.center, 55 | children: [ 56 | if (widget.specialty.iconPath.isNotEmpty) 57 | ImageIcon( 58 | AssetImage(widget.specialty.iconPath), 59 | color: Colors.white, 60 | size: 50, 61 | ), 62 | Padding( 63 | padding: EdgeInsets.only( 64 | top: widget.specialty.iconPath.isNotEmpty ? 8.0 : 0, 65 | ), 66 | child: Text( 67 | widget.specialty.name, 68 | style: Theme.of(context).textTheme.headline3!.copyWith( 69 | fontSize: 70 | widget.specialty.iconPath.isNotEmpty ? 11 : 15, 71 | fontWeight: FontWeight.w700, 72 | ), 73 | ), 74 | ) 75 | ], 76 | ), 77 | ), 78 | ), 79 | ], 80 | ); 81 | } 82 | 83 | Timer? _debounce; 84 | 85 | Future handleAnimation() async { 86 | if (_debounce?.isActive ?? false) _debounce?.cancel(); 87 | _debounce = Timer(Duration(milliseconds: ((widget.index) * 200)), () { 88 | setState(() { 89 | showAnimation = !showAnimation; 90 | }); 91 | }); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /lib/theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'utils/app_constant/colors.dart'; 4 | 5 | ThemeData darkThemeData(BuildContext context) { 6 | return ThemeData.dark().copyWith( 7 | // primaryColor: Colors.white, 8 | scaffoldBackgroundColor: blueGray, 9 | // appBarTheme: appBarThemeDark, 10 | cardColor: blueGray, 11 | iconTheme: IconThemeData(color: Colors.white.withOpacity(.5)), 12 | textTheme: TextTheme( 13 | bodyText1: const TextStyle( 14 | fontSize: 20.0, 15 | fontFamily: 'gilroy', 16 | fontWeight: FontWeight.w400, 17 | color: Colors.white), 18 | headline1: const TextStyle( 19 | fontSize: 24.0, 20 | fontFamily: 'gilroy', 21 | fontWeight: FontWeight.w700, 22 | color: Colors.white), 23 | headline2: const TextStyle( 24 | fontSize: 16.0, 25 | fontFamily: 'gilroy', 26 | fontWeight: FontWeight.w600, 27 | color: Colors.white), 28 | headline3: const TextStyle( 29 | fontSize: 16.0, 30 | fontFamily: 'gilroy', 31 | fontWeight: FontWeight.w400, 32 | color: Colors.white), 33 | headline4: const TextStyle( 34 | fontSize: 14.0, 35 | fontFamily: 'gilroy', 36 | fontWeight: FontWeight.w600, 37 | color: Colors.white), 38 | headline5: TextStyle( 39 | fontSize: 14.0, 40 | fontFamily: 'gilroy', 41 | fontWeight: FontWeight.w400, 42 | color: Colors.white.withOpacity(.5)), 43 | headline6: const TextStyle( 44 | fontSize: 12.0, 45 | fontFamily: 'gilroy', 46 | fontWeight: FontWeight.w400, 47 | color: Colors.white), 48 | bodyText2: const TextStyle( 49 | fontSize: 12.0, 50 | fontFamily: 'gilroy', 51 | fontWeight: FontWeight.w600, 52 | color: Colors.white), 53 | subtitle2: const TextStyle( 54 | fontSize: 12.0, 55 | fontFamily: 'gilroy', 56 | fontWeight: FontWeight.w400, 57 | color: Colors.white), 58 | ), 59 | inputDecorationTheme: InputDecorationTheme( 60 | hintStyle: TextStyle( 61 | fontSize: 12.0, 62 | fontFamily: 'gilroy', 63 | fontWeight: FontWeight.w400, 64 | color: Colors.white.withOpacity(.4)), 65 | counterStyle: const TextStyle( 66 | fontSize: 12.0, 67 | fontFamily: 'gilroy', 68 | fontWeight: FontWeight.w400, 69 | color: Colors.white), 70 | enabledBorder: InputBorder.none, 71 | focusedBorder: InputBorder.none, 72 | errorBorder: InputBorder.none, 73 | focusedErrorBorder: InputBorder.none), 74 | // colorScheme: ColorScheme.dark().copyWith( 75 | // primary: Colors.white.withOpacity(.4), secondary: secondaryColor, error: errorColor), 76 | // bottomNavigationBarTheme: BottomNavigationBarThemeData( 77 | // backgroundColor: backgroundDark, 78 | // selectedIconTheme: IconThemeData(color: Colors.white,size: 33), 79 | // unselectedIconTheme: IconThemeData(color: navigationBottomUnselectedIconDark,size: 33), 80 | // showUnselectedLabels: false, 81 | // showSelectedLabels: false, 82 | // type: BottomNavigationBarType.fixed, 83 | // ), 84 | ); 85 | } 86 | 87 | // final appBarThemeLight = AppBarTheme( 88 | // centerTitle: true, elevation: 0, backgroundColor: backgroundLight); 89 | // final appBarThemeDark = AppBarTheme( 90 | // centerTitle: true, elevation: 0, backgroundColor: contentColorLightTheme); 91 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:dr_flutter_template/theme.dart'; 2 | import 'package:dr_flutter_template/views/doctor_appointment/doctor_appointment_page.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | void main() { 6 | runApp(const MyApp()); 7 | } 8 | 9 | class MyApp extends StatelessWidget { 10 | const MyApp({super.key}); 11 | 12 | // This widget is the root of your application. 13 | @override 14 | Widget build(BuildContext context) { 15 | return MaterialApp( 16 | title: 'dr flutter template', 17 | theme: darkThemeData(context), 18 | home: const DoctorAppointmentPage(), 19 | ); 20 | } 21 | } 22 | 23 | class MyHomePage extends StatefulWidget { 24 | const MyHomePage({super.key, required this.title}); 25 | 26 | // This widget is the home page of your application. It is stateful, meaning 27 | // that it has a State object (defined below) that contains fields that affect 28 | // how it looks. 29 | 30 | // This class is the configuration for the state. It holds the values (in this 31 | // case the title) provided by the parent (in this case the App widget) and 32 | // used by the build method of the State. Fields in a Widget subclass are 33 | // always marked "final". 34 | 35 | final String title; 36 | 37 | @override 38 | State createState() => _MyHomePageState(); 39 | } 40 | 41 | class _MyHomePageState extends State { 42 | int _counter = 0; 43 | 44 | void _incrementCounter() { 45 | setState(() { 46 | // This call to setState tells the Flutter framework that something has 47 | // changed in this State, which causes it to rerun the build method below 48 | // so that the display can reflect the updated values. If we changed 49 | // _counter without calling setState(), then the build method would not be 50 | // called again, and so nothing would appear to happen. 51 | _counter++; 52 | }); 53 | } 54 | 55 | @override 56 | Widget build(BuildContext context) { 57 | // This method is rerun every time setState is called, for instance as done 58 | // by the _incrementCounter method above. 59 | // 60 | // The Flutter framework has been optimized to make rerunning build methods 61 | // fast, so that you can just rebuild anything that needs updating rather 62 | // than having to individually change instances of widgets. 63 | return Scaffold( 64 | appBar: AppBar( 65 | // Here we take the value from the MyHomePage object that was created by 66 | // the App.build method, and use it to set our appbar title. 67 | title: Text(widget.title), 68 | ), 69 | body: Center( 70 | // Center is a layout widget. It takes a single child and positions it 71 | // in the middle of the parent. 72 | child: Column( 73 | // Column is also a layout widget. It takes a list of children and 74 | // arranges them vertically. By default, it sizes itself to fit its 75 | // children horizontally, and tries to be as tall as its parent. 76 | // 77 | // Invoke "debug painting" (press "p" in the console, choose the 78 | // "Toggle Debug Paint" action from the Flutter Inspector in Android 79 | // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) 80 | // to see the wireframe for each widget. 81 | // 82 | // Column has various properties to control how it sizes itself and 83 | // how it positions its children. Here we use mainAxisAlignment to 84 | // center the children vertically; the main axis here is the vertical 85 | // axis because Columns are vertical (the cross axis would be 86 | // horizontal). 87 | mainAxisAlignment: MainAxisAlignment.center, 88 | children: [ 89 | const Text( 90 | 'You have pushed the button this many times:', 91 | ), 92 | Text( 93 | '$_counter', 94 | style: Theme.of(context).textTheme.headline4, 95 | ), 96 | ], 97 | ), 98 | ), 99 | floatingActionButton: FloatingActionButton( 100 | onPressed: _incrementCounter, 101 | tooltip: 'Increment', 102 | child: const Icon(Icons.add), 103 | ), // This trailing comma makes auto-formatting nicer for build methods. 104 | ); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /lib/component/doctor_appointment_body.dart: -------------------------------------------------------------------------------- 1 | import 'package:dr_flutter_template/component/toolbar.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:lottie/lottie.dart'; 5 | 6 | import '../../../utils/app_constant/colors.dart'; 7 | import '../utils/app_constant/app_data.dart'; 8 | import 'doctor_item.dart'; 9 | import 'doctor_specialties.dart'; 10 | 11 | class DoctorAppointmentBody extends StatefulWidget { 12 | const DoctorAppointmentBody({Key? key}) : super(key: key); 13 | 14 | @override 15 | _DoctorAppointmentBodyState createState() => _DoctorAppointmentBodyState(); 16 | } 17 | 18 | class _DoctorAppointmentBodyState extends State { 19 | bool showAnimation = true; 20 | @override 21 | void initState() { 22 | // TODO: implement initState 23 | super.initState(); 24 | handleAnimation(); 25 | } 26 | @override 27 | Widget build(BuildContext context) { 28 | return Stack( 29 | children: [ 30 | Column( 31 | children: [ 32 | const ToolbarBody( 33 | isOnTop: true, 34 | ), 35 | Expanded( 36 | child: SingleChildScrollView( 37 | child: Column( 38 | children: [ 39 | DoctorSpecialities( 40 | showAnimation: showAnimation, 41 | ), 42 | if(!showAnimation) 43 | Container( 44 | margin: const EdgeInsets.symmetric(horizontal: 20), 45 | color: Colors.white.withOpacity(.05), 46 | width: MediaQuery.of(context).size.width, 47 | height: 1, 48 | ), 49 | if (!showAnimation) 50 | Padding( 51 | padding: const EdgeInsets.only( 52 | left: 20.0, right: 20, top: 20), 53 | child: Row( 54 | children: [ 55 | Text( 56 | 'Top Doctor', 57 | style: Theme.of(context) 58 | .textTheme 59 | .headline3! 60 | .copyWith( 61 | fontWeight: FontWeight.w700, 62 | fontSize: 18, 63 | color: Colors.white.withOpacity(.7)), 64 | ), 65 | Expanded( 66 | child: Container(), 67 | ), 68 | Text( 69 | 'See All', 70 | style: Theme.of(context) 71 | .textTheme 72 | .headline3! 73 | .copyWith( 74 | fontWeight: FontWeight.w700, 75 | fontSize: 12, 76 | color: g21), 77 | ), 78 | ], 79 | ), 80 | ), 81 | ListView.separated( 82 | padding: const EdgeInsets.only(top: 20, bottom: 20), 83 | shrinkWrap: true, 84 | physics: const NeverScrollableScrollPhysics(), 85 | itemBuilder: (context, index) { 86 | return DoctorItem( 87 | doctor: AppData.doctors[index], 88 | index: index, 89 | showAnim: showAnimation, 90 | ); 91 | }, 92 | separatorBuilder: (context, index) { 93 | return Container( 94 | height: 10, 95 | ); 96 | }, 97 | itemCount: AppData.doctors.length, 98 | ) 99 | ], 100 | ), 101 | ), 102 | ), 103 | ], 104 | ), 105 | if (showAnimation) 106 | Padding( 107 | padding: const EdgeInsets.only(top: 0.0), 108 | child: Center( 109 | child: Lottie.asset( 110 | 'assets/animations/6bgdark.json', 111 | width: 25, 112 | height: 25, 113 | ), 114 | ), 115 | ), 116 | ], 117 | ); 118 | } 119 | 120 | Future handleAnimation() async { 121 | await Future.delayed( 122 | const Duration(milliseconds: 3000), 123 | ); 124 | setState(() { 125 | showAnimation=!showAnimation; 126 | }); 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "3.3.2" 11 | async: 12 | dependency: transitive 13 | description: 14 | name: async 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.9.0" 18 | boolean_selector: 19 | dependency: transitive 20 | description: 21 | name: boolean_selector 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.1.0" 25 | characters: 26 | dependency: transitive 27 | description: 28 | name: characters 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.2.1" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.1" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.16.0" 46 | crypto: 47 | dependency: transitive 48 | description: 49 | name: crypto 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "3.0.2" 53 | cupertino_icons: 54 | dependency: "direct main" 55 | description: 56 | name: cupertino_icons 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.0.5" 60 | fake_async: 61 | dependency: transitive 62 | description: 63 | name: fake_async 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.3.1" 67 | flutter: 68 | dependency: "direct main" 69 | description: flutter 70 | source: sdk 71 | version: "0.0.0" 72 | flutter_lints: 73 | dependency: "direct dev" 74 | description: 75 | name: flutter_lints 76 | url: "https://pub.dartlang.org" 77 | source: hosted 78 | version: "1.0.4" 79 | flutter_test: 80 | dependency: "direct dev" 81 | description: flutter 82 | source: sdk 83 | version: "0.0.0" 84 | lints: 85 | dependency: transitive 86 | description: 87 | name: lints 88 | url: "https://pub.dartlang.org" 89 | source: hosted 90 | version: "1.0.1" 91 | lottie: 92 | dependency: "direct main" 93 | description: 94 | name: lottie 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "1.4.3" 98 | matcher: 99 | dependency: transitive 100 | description: 101 | name: matcher 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "0.12.12" 105 | material_color_utilities: 106 | dependency: transitive 107 | description: 108 | name: material_color_utilities 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "0.1.5" 112 | meta: 113 | dependency: transitive 114 | description: 115 | name: meta 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "1.8.0" 119 | path: 120 | dependency: transitive 121 | description: 122 | name: path 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "1.8.2" 126 | sky_engine: 127 | dependency: transitive 128 | description: flutter 129 | source: sdk 130 | version: "0.0.99" 131 | source_span: 132 | dependency: transitive 133 | description: 134 | name: source_span 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "1.9.0" 138 | stack_trace: 139 | dependency: transitive 140 | description: 141 | name: stack_trace 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "1.10.0" 145 | stream_channel: 146 | dependency: transitive 147 | description: 148 | name: stream_channel 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "2.1.0" 152 | string_scanner: 153 | dependency: transitive 154 | description: 155 | name: string_scanner 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "1.1.1" 159 | term_glyph: 160 | dependency: transitive 161 | description: 162 | name: term_glyph 163 | url: "https://pub.dartlang.org" 164 | source: hosted 165 | version: "1.2.1" 166 | test_api: 167 | dependency: transitive 168 | description: 169 | name: test_api 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "0.4.12" 173 | typed_data: 174 | dependency: transitive 175 | description: 176 | name: typed_data 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.3.1" 180 | vector_math: 181 | dependency: transitive 182 | description: 183 | name: vector_math 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "2.1.2" 187 | sdks: 188 | dart: ">=2.18.2 <3.0.0" 189 | flutter: ">=3.3.0" 190 | -------------------------------------------------------------------------------- /lib/component/toolbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../../../utils/app_constant/colors.dart'; 5 | 6 | 7 | class ToolbarBody extends StatefulWidget { 8 | const ToolbarBody({Key? key,required this.isOnTop}) : super(key: key); 9 | final bool isOnTop; 10 | 11 | @override 12 | _ToolbarBodyState createState() => _ToolbarBodyState(); 13 | } 14 | 15 | class _ToolbarBodyState extends State { 16 | bool _showSearch = false; 17 | @override 18 | Widget build(BuildContext context) { 19 | return Container( 20 | color: blueGray, 21 | child: Column( 22 | children: [ 23 | Padding( 24 | padding: const EdgeInsets.symmetric(vertical: 3,horizontal: 20), 25 | child: Align( 26 | alignment: Alignment.topCenter, 27 | child: Container( 28 | height: 58, 29 | child: Stack( 30 | children: [ 31 | // if(widget.isOnTop) 32 | Align( 33 | alignment: Alignment.centerLeft, 34 | child: Row( 35 | children: [ 36 | AnimatedOpacity( 37 | 38 | opacity: widget.isOnTop ? 1: 0, 39 | duration: const Duration(milliseconds: 300), 40 | child: GestureDetector( 41 | onTap: (){}, 42 | child: SizedBox( 43 | width: 48, 44 | height: 48, 45 | child: Container( 46 | padding: const EdgeInsets.all(14), 47 | decoration: BoxDecoration( 48 | color: searchInput, 49 | shape: BoxShape.circle, 50 | border: Border.all( 51 | width: 1, 52 | color: Colors.white.withOpacity(.02))), 53 | child:const Icon( 54 | Icons.menu, 55 | size: 20, 56 | color: Colors.white, 57 | ) 58 | ), 59 | ), 60 | ), 61 | ), 62 | if ((!_showSearch ) ) 63 | Expanded( 64 | child: Container( 65 | alignment: Alignment.center, 66 | child: Padding( 67 | padding: const EdgeInsets.only(left: 10, right: 10), 68 | child: Text( 69 | "Find Your Doctor", 70 | style: Theme.of(context) 71 | .textTheme 72 | .headline2! 73 | .copyWith(fontSize: 21), 74 | maxLines: 1, 75 | overflow: TextOverflow.ellipsis, 76 | ), 77 | ), 78 | ), 79 | ), 80 | Container( 81 | width: 78, 82 | ) 83 | ], 84 | ), 85 | ), 86 | Align( 87 | alignment: Alignment.centerRight, 88 | child: AnimatedContainer( 89 | duration: const Duration(milliseconds: 400), 90 | curve: Curves.bounceOut, 91 | width: _showSearch == true 92 | ? MediaQuery.of(context).size.width - (widget.isOnTop ? 95 : 0) 93 | : 48, 94 | height: 48, 95 | decoration: BoxDecoration( 96 | borderRadius: BorderRadius.circular(100), 97 | color: searchInput, 98 | // gradient: AppGradient.gradient[1], 99 | border: Border.all( 100 | width: 1, color: Colors.white.withOpacity(.02))), 101 | child: Row( 102 | mainAxisAlignment: MainAxisAlignment.center, 103 | children: [ 104 | if (_showSearch) 105 | Container( 106 | height: double.infinity, 107 | width: 10, 108 | ), 109 | GestureDetector( 110 | onTap: () { 111 | setState(() { 112 | _showSearch = !_showSearch ; 113 | 114 | }); 115 | }, 116 | child: const Icon( 117 | Icons.search, 118 | size: 20, 119 | color: Colors.white, 120 | ), 121 | ), 122 | if (_showSearch) 123 | Container( 124 | height: double.infinity, 125 | width: 10, 126 | ), 127 | if (_showSearch) 128 | Expanded( 129 | child: TextFormField( 130 | // controller: widget.searchController, 131 | decoration: InputDecoration( 132 | hintText: "Find Your Doctor"), 133 | keyboardType: TextInputType.text, 134 | ), 135 | flex: 1, 136 | ) 137 | ], 138 | ), 139 | ), 140 | ), 141 | ], 142 | ), 143 | ), 144 | ), 145 | ), 146 | Container(width: MediaQuery.of(context).size.width, 147 | height: 1, 148 | color: Colors.white.withOpacity(.05) ,) 149 | ], 150 | ), 151 | ); } 152 | } 153 | -------------------------------------------------------------------------------- /lib/component/doctor_item.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import '../../../utils/app_constant/colors.dart'; 5 | import '../data/models/doctor.dart'; 6 | import '../utils/app_constant/app_gradient.dart'; 7 | 8 | class DoctorItem extends StatefulWidget { 9 | const DoctorItem( 10 | {Key? key, 11 | required this.doctor, 12 | required this.index, 13 | required this.showAnim}) 14 | : super(key: key); 15 | final Doctor doctor; 16 | final int index; 17 | final bool showAnim; 18 | 19 | @override 20 | _DoctorItemState createState() => _DoctorItemState(); 21 | } 22 | 23 | class _DoctorItemState extends State { 24 | bool showAnimation = true; 25 | 26 | @override 27 | void initState() { 28 | super.initState(); 29 | } 30 | 31 | @override 32 | Widget build(BuildContext context) { 33 | if (widget.showAnim != showAnimation) { 34 | handleAnimation(); 35 | } 36 | return AnimatedOpacity( 37 | duration: const Duration(milliseconds: 200), 38 | opacity: showAnimation ? 0 : 1, 39 | child: SingleChildScrollView( 40 | scrollDirection: Axis.horizontal, 41 | child: Row( 42 | children: [ 43 | AnimatedContainer( 44 | duration: const Duration(milliseconds: 200), 45 | width: showAnimation ? 80 : 20, 46 | ), 47 | Container( 48 | margin: const EdgeInsets.only(right: 20), 49 | padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), 50 | width: MediaQuery.of(context).size.width - 40, 51 | decoration: BoxDecoration( 52 | color: searchInput, 53 | borderRadius: BorderRadius.circular(20), 54 | ), 55 | child: Row( 56 | mainAxisAlignment: MainAxisAlignment.start, 57 | crossAxisAlignment: CrossAxisAlignment.start, 58 | children: [ 59 | Container( 60 | width: 60, 61 | height: 60, 62 | padding: const EdgeInsets.all(5), 63 | decoration: BoxDecoration( 64 | gradient: widget.doctor.gender == "m" 65 | ? AppGradient.gradient[1] 66 | : AppGradient.gradient[0], 67 | shape: BoxShape.circle), 68 | child: ClipRRect( 69 | borderRadius: BorderRadius.circular(100), 70 | child: Image.asset(widget.doctor.picture), 71 | ), 72 | ), 73 | Expanded( 74 | child: Padding( 75 | padding: const EdgeInsets.only(left: 10), 76 | child: Column( 77 | crossAxisAlignment: CrossAxisAlignment.stretch, 78 | mainAxisAlignment: MainAxisAlignment.start, 79 | children: [ 80 | Text( 81 | widget.doctor.fullName, 82 | style: Theme.of(context) 83 | .textTheme 84 | .headline3! 85 | .copyWith( 86 | fontSize: 16, 87 | fontWeight: FontWeight.w700, 88 | color: Colors.white.withOpacity(.8)), 89 | ), 90 | Padding( 91 | padding: const EdgeInsets.only(top: 5.0, bottom: 5), 92 | child: Text( 93 | widget.doctor.specialties, 94 | style: Theme.of(context) 95 | .textTheme 96 | .headline3! 97 | .copyWith( 98 | fontSize: 12, 99 | fontWeight: FontWeight.w500, 100 | color: Colors.white.withOpacity(.6)), 101 | ), 102 | ), 103 | Row( 104 | children: [ 105 | Icon( 106 | Icons.access_time_rounded, 107 | size: 20, 108 | color: g21, 109 | ), 110 | Padding( 111 | padding: const EdgeInsets.only( 112 | left: 5, 113 | ), 114 | child: Text( 115 | widget.doctor.time, 116 | style: Theme.of(context) 117 | .textTheme 118 | .headline3! 119 | .copyWith( 120 | fontSize: 12, 121 | fontWeight: FontWeight.w500, 122 | color: Colors.white.withOpacity(.8)), 123 | ), 124 | ) 125 | ], 126 | ), 127 | Padding( 128 | padding: const EdgeInsets.only(top: 10), 129 | child: Row( 130 | mainAxisAlignment: MainAxisAlignment.start, 131 | crossAxisAlignment: CrossAxisAlignment.center, 132 | children: [ 133 | Padding( 134 | padding: const EdgeInsets.only( 135 | left: 0, 136 | ), 137 | child: Text( 138 | widget.doctor.price, 139 | style: Theme.of(context) 140 | .textTheme 141 | .headline3! 142 | .copyWith( 143 | fontSize: 14, 144 | fontWeight: FontWeight.w700, 145 | color: 146 | Colors.white.withOpacity(.8)), 147 | ), 148 | ), 149 | Expanded(child: Container()), 150 | Container( 151 | padding: const EdgeInsets.symmetric( 152 | horizontal: 10), 153 | height: 30, 154 | decoration: BoxDecoration( 155 | borderRadius: BorderRadius.circular(20), 156 | gradient: widget.doctor.gender == "m" 157 | ? AppGradient.gradient[1] 158 | : AppGradient.gradient[0], 159 | ), 160 | child: Center( 161 | child: Text( 162 | 'Appointment', 163 | style: Theme.of(context) 164 | .textTheme 165 | .headline3! 166 | .copyWith( 167 | fontSize: 14, 168 | fontWeight: FontWeight.w700), 169 | )), 170 | ) 171 | ], 172 | ), 173 | ) 174 | ], 175 | ), 176 | ), 177 | ) 178 | ], 179 | ), 180 | ), 181 | ], 182 | ), 183 | ), 184 | ); 185 | } 186 | 187 | Timer? _debounce; 188 | Future handleAnimation() async { 189 | if (_debounce?.isActive ?? false) _debounce?.cancel(); 190 | _debounce = Timer(Duration(milliseconds: ((widget.index) * 200)), () { 191 | setState(() { 192 | showAnimation = !showAnimation; 193 | }); 194 | }); 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1300; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | DEVELOPMENT_TEAM = CSLN9D95H7; 292 | ENABLE_BITCODE = NO; 293 | INFOPLIST_FILE = Runner/Info.plist; 294 | LD_RUNPATH_SEARCH_PATHS = ( 295 | "$(inherited)", 296 | "@executable_path/Frameworks", 297 | ); 298 | PRODUCT_BUNDLE_IDENTIFIER = com.example.drFlutterTemplate; 299 | PRODUCT_NAME = "$(TARGET_NAME)"; 300 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 301 | SWIFT_VERSION = 5.0; 302 | VERSIONING_SYSTEM = "apple-generic"; 303 | }; 304 | name = Profile; 305 | }; 306 | 97C147031CF9000F007C117D /* Debug */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | ALWAYS_SEARCH_USER_PATHS = NO; 310 | CLANG_ANALYZER_NONNULL = YES; 311 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 312 | CLANG_CXX_LIBRARY = "libc++"; 313 | CLANG_ENABLE_MODULES = YES; 314 | CLANG_ENABLE_OBJC_ARC = YES; 315 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 316 | CLANG_WARN_BOOL_CONVERSION = YES; 317 | CLANG_WARN_COMMA = YES; 318 | CLANG_WARN_CONSTANT_CONVERSION = YES; 319 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 320 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 321 | CLANG_WARN_EMPTY_BODY = YES; 322 | CLANG_WARN_ENUM_CONVERSION = YES; 323 | CLANG_WARN_INFINITE_RECURSION = YES; 324 | CLANG_WARN_INT_CONVERSION = YES; 325 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 326 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 327 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 328 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 329 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 330 | CLANG_WARN_STRICT_PROTOTYPES = YES; 331 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 332 | CLANG_WARN_UNREACHABLE_CODE = YES; 333 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 334 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 335 | COPY_PHASE_STRIP = NO; 336 | DEBUG_INFORMATION_FORMAT = dwarf; 337 | ENABLE_STRICT_OBJC_MSGSEND = YES; 338 | ENABLE_TESTABILITY = YES; 339 | GCC_C_LANGUAGE_STANDARD = gnu99; 340 | GCC_DYNAMIC_NO_PIC = NO; 341 | GCC_NO_COMMON_BLOCKS = YES; 342 | GCC_OPTIMIZATION_LEVEL = 0; 343 | GCC_PREPROCESSOR_DEFINITIONS = ( 344 | "DEBUG=1", 345 | "$(inherited)", 346 | ); 347 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 348 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 349 | GCC_WARN_UNDECLARED_SELECTOR = YES; 350 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 351 | GCC_WARN_UNUSED_FUNCTION = YES; 352 | GCC_WARN_UNUSED_VARIABLE = YES; 353 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 354 | MTL_ENABLE_DEBUG_INFO = YES; 355 | ONLY_ACTIVE_ARCH = YES; 356 | SDKROOT = iphoneos; 357 | TARGETED_DEVICE_FAMILY = "1,2"; 358 | }; 359 | name = Debug; 360 | }; 361 | 97C147041CF9000F007C117D /* Release */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | CLANG_ANALYZER_NONNULL = YES; 366 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 367 | CLANG_CXX_LIBRARY = "libc++"; 368 | CLANG_ENABLE_MODULES = YES; 369 | CLANG_ENABLE_OBJC_ARC = YES; 370 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 371 | CLANG_WARN_BOOL_CONVERSION = YES; 372 | CLANG_WARN_COMMA = YES; 373 | CLANG_WARN_CONSTANT_CONVERSION = YES; 374 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 375 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 376 | CLANG_WARN_EMPTY_BODY = YES; 377 | CLANG_WARN_ENUM_CONVERSION = YES; 378 | CLANG_WARN_INFINITE_RECURSION = YES; 379 | CLANG_WARN_INT_CONVERSION = YES; 380 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 381 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 382 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 383 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 384 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 385 | CLANG_WARN_STRICT_PROTOTYPES = YES; 386 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 387 | CLANG_WARN_UNREACHABLE_CODE = YES; 388 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 389 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 390 | COPY_PHASE_STRIP = NO; 391 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 392 | ENABLE_NS_ASSERTIONS = NO; 393 | ENABLE_STRICT_OBJC_MSGSEND = YES; 394 | GCC_C_LANGUAGE_STANDARD = gnu99; 395 | GCC_NO_COMMON_BLOCKS = YES; 396 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 397 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 398 | GCC_WARN_UNDECLARED_SELECTOR = YES; 399 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 400 | GCC_WARN_UNUSED_FUNCTION = YES; 401 | GCC_WARN_UNUSED_VARIABLE = YES; 402 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 403 | MTL_ENABLE_DEBUG_INFO = NO; 404 | SDKROOT = iphoneos; 405 | SUPPORTED_PLATFORMS = iphoneos; 406 | SWIFT_COMPILATION_MODE = wholemodule; 407 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 408 | TARGETED_DEVICE_FAMILY = "1,2"; 409 | VALIDATE_PRODUCT = YES; 410 | }; 411 | name = Release; 412 | }; 413 | 97C147061CF9000F007C117D /* Debug */ = { 414 | isa = XCBuildConfiguration; 415 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 416 | buildSettings = { 417 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 418 | CLANG_ENABLE_MODULES = YES; 419 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 420 | DEVELOPMENT_TEAM = CSLN9D95H7; 421 | ENABLE_BITCODE = NO; 422 | INFOPLIST_FILE = Runner/Info.plist; 423 | LD_RUNPATH_SEARCH_PATHS = ( 424 | "$(inherited)", 425 | "@executable_path/Frameworks", 426 | ); 427 | PRODUCT_BUNDLE_IDENTIFIER = com.example.drFlutterTemplate; 428 | PRODUCT_NAME = "$(TARGET_NAME)"; 429 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 430 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 431 | SWIFT_VERSION = 5.0; 432 | VERSIONING_SYSTEM = "apple-generic"; 433 | }; 434 | name = Debug; 435 | }; 436 | 97C147071CF9000F007C117D /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 439 | buildSettings = { 440 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 441 | CLANG_ENABLE_MODULES = YES; 442 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 443 | DEVELOPMENT_TEAM = CSLN9D95H7; 444 | ENABLE_BITCODE = NO; 445 | INFOPLIST_FILE = Runner/Info.plist; 446 | LD_RUNPATH_SEARCH_PATHS = ( 447 | "$(inherited)", 448 | "@executable_path/Frameworks", 449 | ); 450 | PRODUCT_BUNDLE_IDENTIFIER = com.example.drFlutterTemplate; 451 | PRODUCT_NAME = "$(TARGET_NAME)"; 452 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 453 | SWIFT_VERSION = 5.0; 454 | VERSIONING_SYSTEM = "apple-generic"; 455 | }; 456 | name = Release; 457 | }; 458 | /* End XCBuildConfiguration section */ 459 | 460 | /* Begin XCConfigurationList section */ 461 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 462 | isa = XCConfigurationList; 463 | buildConfigurations = ( 464 | 97C147031CF9000F007C117D /* Debug */, 465 | 97C147041CF9000F007C117D /* Release */, 466 | 249021D3217E4FDB00AE95B9 /* Profile */, 467 | ); 468 | defaultConfigurationIsVisible = 0; 469 | defaultConfigurationName = Release; 470 | }; 471 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 472 | isa = XCConfigurationList; 473 | buildConfigurations = ( 474 | 97C147061CF9000F007C117D /* Debug */, 475 | 97C147071CF9000F007C117D /* Release */, 476 | 249021D4217E4FDB00AE95B9 /* Profile */, 477 | ); 478 | defaultConfigurationIsVisible = 0; 479 | defaultConfigurationName = Release; 480 | }; 481 | /* End XCConfigurationList section */ 482 | }; 483 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 484 | } 485 | -------------------------------------------------------------------------------- /assets/animations/loading_anim.json: -------------------------------------------------------------------------------- 1 | { 2 | "v": "5.5.3", 3 | "fr": 25, 4 | "ip": 0, 5 | "op": 40, 6 | "w": 24, 7 | "h": 24, 8 | "nm": "Comp 1", 9 | "ddd": 0, 10 | "assets": [], 11 | "layers": [ 12 | { 13 | "ddd": 0, 14 | "ind": 2, 15 | "ty": 4, 16 | "nm": "Layer 63 Outlines", 17 | "sr": 1, 18 | "ks": { 19 | "o": { 20 | "a": 0, 21 | "k": 100, 22 | "ix": 11 23 | }, 24 | "r": { 25 | "a": 0, 26 | "k": 90, 27 | "ix": 10 28 | }, 29 | "p": { 30 | "a": 0, 31 | "k": [ 32 | 10.5, 33 | 12.375, 34 | 0 35 | ], 36 | "ix": 2 37 | }, 38 | "a": { 39 | "a": 0, 40 | "k": [ 41 | 10.5, 42 | 12.99, 43 | 0 44 | ], 45 | "ix": 1 46 | }, 47 | "s": { 48 | "a": 0, 49 | "k": [ 50 | 86, 51 | 86, 52 | 100 53 | ], 54 | "ix": 6 55 | } 56 | }, 57 | "ao": 0, 58 | "ef": [ 59 | { 60 | "ty": 5, 61 | "nm": "Elastic Controller", 62 | "np": 5, 63 | "mn": "Pseudo/MDS Elastic Controller", 64 | "ix": 1, 65 | "en": 1, 66 | "ef": [ 67 | { 68 | "ty": 0, 69 | "nm": "Amplitude", 70 | "mn": "Pseudo/MDS Elastic Controller-0001", 71 | "ix": 1, 72 | "v": { 73 | "a": 0, 74 | "k": 20, 75 | "ix": 1 76 | } 77 | }, 78 | { 79 | "ty": 0, 80 | "nm": "Frequency", 81 | "mn": "Pseudo/MDS Elastic Controller-0002", 82 | "ix": 2, 83 | "v": { 84 | "a": 0, 85 | "k": 40, 86 | "ix": 2 87 | } 88 | }, 89 | { 90 | "ty": 0, 91 | "nm": "Decay", 92 | "mn": "Pseudo/MDS Elastic Controller-0003", 93 | "ix": 3, 94 | "v": { 95 | "a": 0, 96 | "k": 60, 97 | "ix": 3 98 | } 99 | } 100 | ] 101 | } 102 | ], 103 | "shapes": [ 104 | { 105 | "ty": "gr", 106 | "it": [ 107 | { 108 | "ty": "gr", 109 | "it": [ 110 | { 111 | "ind": 0, 112 | "ty": "sh", 113 | "ix": 1, 114 | "ks": { 115 | "a": 1, 116 | "k": [ 117 | { 118 | "i": { 119 | "x": 0.45, 120 | "y": 1 121 | }, 122 | "o": { 123 | "x": 0.55, 124 | "y": 0 125 | }, 126 | "t": 6, 127 | "s": [ 128 | { 129 | "i": [ 130 | [ 131 | 0, 132 | 0 133 | ], 134 | [ 135 | 0, 136 | 0 137 | ] 138 | ], 139 | "o": [ 140 | [ 141 | 0, 142 | 0 143 | ], 144 | [ 145 | 0, 146 | 0 147 | ] 148 | ], 149 | "v": [ 150 | [ 151 | 19.5, 152 | 15.76 153 | ], 154 | [ 155 | 1.5, 156 | 15.76 157 | ] 158 | ], 159 | "c": false 160 | } 161 | ] 162 | }, 163 | { 164 | "i": { 165 | "x": 0.833, 166 | "y": 1 167 | }, 168 | "o": { 169 | "x": 0.167, 170 | "y": 0 171 | }, 172 | "t": 17.2, 173 | "s": [ 174 | { 175 | "i": [ 176 | [ 177 | 0, 178 | 0 179 | ], 180 | [ 181 | 0, 182 | 0 183 | ] 184 | ], 185 | "o": [ 186 | [ 187 | 0, 188 | 0 189 | ], 190 | [ 191 | 0, 192 | 0 193 | ] 194 | ], 195 | "v": [ 196 | [ 197 | 9.875, 198 | 15.749 199 | ], 200 | [ 201 | 1.5, 202 | 15.76 203 | ] 204 | ], 205 | "c": false 206 | } 207 | ] 208 | }, 209 | { 210 | "t": 27, 211 | "s": [ 212 | { 213 | "i": [ 214 | [ 215 | 0, 216 | 0 217 | ], 218 | [ 219 | 0, 220 | 0 221 | ] 222 | ], 223 | "o": [ 224 | [ 225 | 0, 226 | 0 227 | ], 228 | [ 229 | 0, 230 | 0 231 | ] 232 | ], 233 | "v": [ 234 | [ 235 | 19.5, 236 | 15.76 237 | ], 238 | [ 239 | 1.5, 240 | 15.76 241 | ] 242 | ], 243 | "c": false 244 | } 245 | ] 246 | } 247 | ], 248 | "ix": 2, 249 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 250 | }, 251 | "nm": "Path 1", 252 | "mn": "ADBE Vector Shape - Group", 253 | "hd": false 254 | }, 255 | { 256 | "ty": "st", 257 | "c": { 258 | "a": 0, 259 | "k": [ 260 | 0.161000001197, 261 | 0.176000004189, 262 | 0.195999998205, 263 | 1 264 | ], 265 | "ix": 3 266 | }, 267 | "o": { 268 | "a": 0, 269 | "k": 100, 270 | "ix": 4 271 | }, 272 | "w": { 273 | "a": 0, 274 | "k": 1.5, 275 | "ix": 5 276 | }, 277 | "lc": 2, 278 | "lj": 2, 279 | "bm": 0, 280 | "nm": "Stroke 1", 281 | "mn": "ADBE Vector Graphic - Stroke", 282 | "hd": false 283 | }, 284 | { 285 | "ty": "tr", 286 | "p": { 287 | "a": 0, 288 | "k": [ 289 | 0, 290 | 0 291 | ], 292 | "ix": 2 293 | }, 294 | "a": { 295 | "a": 0, 296 | "k": [ 297 | 0, 298 | 0 299 | ], 300 | "ix": 1 301 | }, 302 | "s": { 303 | "a": 0, 304 | "k": [ 305 | 100, 306 | 100 307 | ], 308 | "ix": 3 309 | }, 310 | "r": { 311 | "a": 0, 312 | "k": 0, 313 | "ix": 6 314 | }, 315 | "o": { 316 | "a": 0, 317 | "k": 100, 318 | "ix": 7 319 | }, 320 | "sk": { 321 | "a": 0, 322 | "k": 0, 323 | "ix": 4 324 | }, 325 | "sa": { 326 | "a": 0, 327 | "k": 0, 328 | "ix": 5 329 | }, 330 | "nm": "Transform" 331 | } 332 | ], 333 | "nm": "Group 1", 334 | "np": 2, 335 | "cix": 2, 336 | "bm": 0, 337 | "ix": 1, 338 | "mn": "ADBE Vector Group", 339 | "hd": false 340 | }, 341 | { 342 | "ty": "gr", 343 | "it": [ 344 | { 345 | "ind": 0, 346 | "ty": "sh", 347 | "ix": 1, 348 | "ks": { 349 | "a": 1, 350 | "k": [ 351 | { 352 | "i": { 353 | "x": 0.45, 354 | "y": 1 355 | }, 356 | "o": { 357 | "x": 0.55, 358 | "y": 0 359 | }, 360 | "t": 8, 361 | "s": [ 362 | { 363 | "i": [ 364 | [ 365 | 0, 366 | 0 367 | ], 368 | [ 369 | 0, 370 | 0 371 | ], 372 | [ 373 | 0, 374 | 0 375 | ] 376 | ], 377 | "o": [ 378 | [ 379 | 0, 380 | 0 381 | ], 382 | [ 383 | 0, 384 | 0 385 | ], 386 | [ 387 | 0, 388 | 0 389 | ] 390 | ], 391 | "v": [ 392 | [ 393 | 1.86, 394 | -3.72 395 | ], 396 | [ 397 | -1.86, 398 | 0 399 | ], 400 | [ 401 | 1.86, 402 | 3.72 403 | ] 404 | ], 405 | "c": false 406 | } 407 | ] 408 | }, 409 | { 410 | "i": { 411 | "x": 0.45, 412 | "y": 1 413 | }, 414 | "o": { 415 | "x": 0.55, 416 | "y": 0 417 | }, 418 | "t": 16, 419 | "s": [ 420 | { 421 | "i": [ 422 | [ 423 | 0, 424 | 0 425 | ], 426 | [ 427 | 0, 428 | 0 429 | ], 430 | [ 431 | 0, 432 | 0 433 | ] 434 | ], 435 | "o": [ 436 | [ 437 | 0, 438 | 0 439 | ], 440 | [ 441 | 0, 442 | 0 443 | ], 444 | [ 445 | 0, 446 | 0 447 | ] 448 | ], 449 | "v": [ 450 | [ 451 | 2.11, 452 | 0.03 453 | ], 454 | [ 455 | -1.86, 456 | 0 457 | ], 458 | [ 459 | 2.079, 460 | 0.033 461 | ] 462 | ], 463 | "c": false 464 | } 465 | ] 466 | }, 467 | { 468 | "t": 25, 469 | "s": [ 470 | { 471 | "i": [ 472 | [ 473 | 0, 474 | 0 475 | ], 476 | [ 477 | 0, 478 | 0 479 | ], 480 | [ 481 | 0, 482 | 0 483 | ] 484 | ], 485 | "o": [ 486 | [ 487 | 0, 488 | 0 489 | ], 490 | [ 491 | 0, 492 | 0 493 | ], 494 | [ 495 | 0, 496 | 0 497 | ] 498 | ], 499 | "v": [ 500 | [ 501 | 1.86, 502 | -3.72 503 | ], 504 | [ 505 | -1.86, 506 | 0 507 | ], 508 | [ 509 | 1.86, 510 | 3.72 511 | ] 512 | ], 513 | "c": false 514 | } 515 | ] 516 | } 517 | ], 518 | "ix": 2, 519 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 520 | }, 521 | "nm": "Path 1", 522 | "mn": "ADBE Vector Shape - Group", 523 | "hd": false 524 | }, 525 | { 526 | "ty": "st", 527 | "c": { 528 | "a": 0, 529 | "k": [ 530 | 0.161000001197, 531 | 0.176000004189, 532 | 0.195999998205, 533 | 1 534 | ], 535 | "ix": 3 536 | }, 537 | "o": { 538 | "a": 0, 539 | "k": 100, 540 | "ix": 4 541 | }, 542 | "w": { 543 | "a": 0, 544 | "k": 1.5, 545 | "ix": 5 546 | }, 547 | "lc": 2, 548 | "lj": 2, 549 | "bm": 0, 550 | "nm": "Stroke 1", 551 | "mn": "ADBE Vector Graphic - Stroke", 552 | "hd": false 553 | }, 554 | { 555 | "ty": "tr", 556 | "p": { 557 | "a": 0, 558 | "k": [ 559 | 3.36, 560 | 15.76 561 | ], 562 | "ix": 2 563 | }, 564 | "a": { 565 | "a": 0, 566 | "k": [ 567 | 0, 568 | 0 569 | ], 570 | "ix": 1 571 | }, 572 | "s": { 573 | "a": 0, 574 | "k": [ 575 | 100, 576 | 100 577 | ], 578 | "ix": 3 579 | }, 580 | "r": { 581 | "a": 0, 582 | "k": 0, 583 | "ix": 6 584 | }, 585 | "o": { 586 | "a": 0, 587 | "k": 100, 588 | "ix": 7 589 | }, 590 | "sk": { 591 | "a": 0, 592 | "k": 0, 593 | "ix": 4 594 | }, 595 | "sa": { 596 | "a": 0, 597 | "k": 0, 598 | "ix": 5 599 | }, 600 | "nm": "Transform" 601 | } 602 | ], 603 | "nm": "Group 2", 604 | "np": 2, 605 | "cix": 2, 606 | "bm": 0, 607 | "ix": 2, 608 | "mn": "ADBE Vector Group", 609 | "hd": false 610 | }, 611 | { 612 | "ty": "tr", 613 | "p": { 614 | "a": 1, 615 | "k": [ 616 | { 617 | "i": { 618 | "x": 0.45, 619 | "y": 1 620 | }, 621 | "o": { 622 | "x": 0.55, 623 | "y": 0 624 | }, 625 | "t": 10, 626 | "s": [ 627 | 5.688, 628 | 18 629 | ], 630 | "to": [ 631 | 0, 632 | -1.207 633 | ], 634 | "ti": [ 635 | 0, 636 | 0 637 | ] 638 | }, 639 | { 640 | "i": { 641 | "x": 0.833, 642 | "y": 0.833 643 | }, 644 | "o": { 645 | "x": 0.55, 646 | "y": 0 647 | }, 648 | "t": 20, 649 | "s": [ 650 | 5.688, 651 | 10.76 652 | ], 653 | "to": [ 654 | 0, 655 | 0 656 | ], 657 | "ti": [ 658 | 0, 659 | -1.207 660 | ] 661 | }, 662 | { 663 | "t": 29, 664 | "s": [ 665 | 5.688, 666 | 18 667 | ] 668 | } 669 | ], 670 | "ix": 2, 671 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 672 | }, 673 | "a": { 674 | "a": 0, 675 | "k": [ 676 | 5.688, 677 | 15.76 678 | ], 679 | "ix": 1, 680 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller 2')(1), 200);\n freq = $bm_div(effect('Elastic Controller 2')(2), 30);\n decay = $bm_div(effect('Elastic Controller 2')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 681 | }, 682 | "s": { 683 | "a": 0, 684 | "k": [ 685 | 100, 686 | 100 687 | ], 688 | "ix": 3, 689 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller 2')(1), 200);\n freq = $bm_div(effect('Elastic Controller 2')(2), 30);\n decay = $bm_div(effect('Elastic Controller 2')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 690 | }, 691 | "r": { 692 | "a": 0, 693 | "k": 0, 694 | "ix": 6 695 | }, 696 | "o": { 697 | "a": 0, 698 | "k": 100, 699 | "ix": 7 700 | }, 701 | "sk": { 702 | "a": 0, 703 | "k": 0, 704 | "ix": 4 705 | }, 706 | "sa": { 707 | "a": 0, 708 | "k": 0, 709 | "ix": 5 710 | }, 711 | "nm": "Transform" 712 | } 713 | ], 714 | "nm": "Group 5", 715 | "np": 2, 716 | "cix": 2, 717 | "bm": 0, 718 | "ix": 1, 719 | "mn": "ADBE Vector Group", 720 | "hd": false 721 | }, 722 | { 723 | "ty": "gr", 724 | "it": [ 725 | { 726 | "ty": "gr", 727 | "it": [ 728 | { 729 | "ind": 0, 730 | "ty": "sh", 731 | "ix": 1, 732 | "ks": { 733 | "a": 1, 734 | "k": [ 735 | { 736 | "i": { 737 | "x": 0.45, 738 | "y": 1 739 | }, 740 | "o": { 741 | "x": 0.55, 742 | "y": 0 743 | }, 744 | "t": 6, 745 | "s": [ 746 | { 747 | "i": [ 748 | [ 749 | 0, 750 | 0 751 | ], 752 | [ 753 | 0, 754 | 0 755 | ] 756 | ], 757 | "o": [ 758 | [ 759 | 0, 760 | 0 761 | ], 762 | [ 763 | 0, 764 | 0 765 | ] 766 | ], 767 | "v": [ 768 | [ 769 | 1.5, 770 | 5.22 771 | ], 772 | [ 773 | 19.5, 774 | 5.22 775 | ] 776 | ], 777 | "c": false 778 | } 779 | ] 780 | }, 781 | { 782 | "i": { 783 | "x": 0.45, 784 | "y": 1 785 | }, 786 | "o": { 787 | "x": 0.55, 788 | "y": 0 789 | }, 790 | "t": 17.2, 791 | "s": [ 792 | { 793 | "i": [ 794 | [ 795 | 0, 796 | 0 797 | ], 798 | [ 799 | 0, 800 | 0 801 | ] 802 | ], 803 | "o": [ 804 | [ 805 | 0, 806 | 0 807 | ], 808 | [ 809 | 0, 810 | 0 811 | ] 812 | ], 813 | "v": [ 814 | [ 815 | 10.156, 816 | 5.231 817 | ], 818 | [ 819 | 19.5, 820 | 5.22 821 | ] 822 | ], 823 | "c": false 824 | } 825 | ] 826 | }, 827 | { 828 | "t": 27, 829 | "s": [ 830 | { 831 | "i": [ 832 | [ 833 | 0, 834 | 0 835 | ], 836 | [ 837 | 0, 838 | 0 839 | ] 840 | ], 841 | "o": [ 842 | [ 843 | 0, 844 | 0 845 | ], 846 | [ 847 | 0, 848 | 0 849 | ] 850 | ], 851 | "v": [ 852 | [ 853 | 1.5, 854 | 5.22 855 | ], 856 | [ 857 | 19.5, 858 | 5.22 859 | ] 860 | ], 861 | "c": false 862 | } 863 | ] 864 | } 865 | ], 866 | "ix": 2, 867 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 868 | }, 869 | "nm": "Path 1", 870 | "mn": "ADBE Vector Shape - Group", 871 | "hd": false 872 | }, 873 | { 874 | "ty": "st", 875 | "c": { 876 | "a": 0, 877 | "k": [ 878 | 0.161000001197, 879 | 0.176000004189, 880 | 0.195999998205, 881 | 1 882 | ], 883 | "ix": 3 884 | }, 885 | "o": { 886 | "a": 0, 887 | "k": 100, 888 | "ix": 4 889 | }, 890 | "w": { 891 | "a": 0, 892 | "k": 1.5, 893 | "ix": 5 894 | }, 895 | "lc": 2, 896 | "lj": 2, 897 | "bm": 0, 898 | "nm": "Stroke 1", 899 | "mn": "ADBE Vector Graphic - Stroke", 900 | "hd": false 901 | }, 902 | { 903 | "ty": "tr", 904 | "p": { 905 | "a": 0, 906 | "k": [ 907 | 0, 908 | 0 909 | ], 910 | "ix": 2 911 | }, 912 | "a": { 913 | "a": 0, 914 | "k": [ 915 | 0, 916 | 0 917 | ], 918 | "ix": 1 919 | }, 920 | "s": { 921 | "a": 0, 922 | "k": [ 923 | 100, 924 | 100 925 | ], 926 | "ix": 3 927 | }, 928 | "r": { 929 | "a": 0, 930 | "k": 0, 931 | "ix": 6 932 | }, 933 | "o": { 934 | "a": 0, 935 | "k": 100, 936 | "ix": 7 937 | }, 938 | "sk": { 939 | "a": 0, 940 | "k": 0, 941 | "ix": 4 942 | }, 943 | "sa": { 944 | "a": 0, 945 | "k": 0, 946 | "ix": 5 947 | }, 948 | "nm": "Transform" 949 | } 950 | ], 951 | "nm": "Group 3", 952 | "np": 2, 953 | "cix": 2, 954 | "bm": 0, 955 | "ix": 1, 956 | "mn": "ADBE Vector Group", 957 | "hd": false 958 | }, 959 | { 960 | "ty": "gr", 961 | "it": [ 962 | { 963 | "ind": 0, 964 | "ty": "sh", 965 | "ix": 1, 966 | "ks": { 967 | "a": 1, 968 | "k": [ 969 | { 970 | "i": { 971 | "x": 0.45, 972 | "y": 1 973 | }, 974 | "o": { 975 | "x": 0.55, 976 | "y": 0 977 | }, 978 | "t": 10, 979 | "s": [ 980 | { 981 | "i": [ 982 | [ 983 | 0, 984 | 0 985 | ], 986 | [ 987 | 0, 988 | 0 989 | ], 990 | [ 991 | 0, 992 | 0 993 | ] 994 | ], 995 | "o": [ 996 | [ 997 | 0, 998 | 0 999 | ], 1000 | [ 1001 | 0, 1002 | 0 1003 | ], 1004 | [ 1005 | 0, 1006 | 0 1007 | ] 1008 | ], 1009 | "v": [ 1010 | [ 1011 | -1.86, 1012 | 3.72 1013 | ], 1014 | [ 1015 | 1.86, 1016 | 0 1017 | ], 1018 | [ 1019 | -1.86, 1020 | -3.72 1021 | ] 1022 | ], 1023 | "c": false 1024 | } 1025 | ] 1026 | }, 1027 | { 1028 | "i": { 1029 | "x": 0.45, 1030 | "y": 1 1031 | }, 1032 | "o": { 1033 | "x": 0.55, 1034 | "y": 0 1035 | }, 1036 | "t": 19, 1037 | "s": [ 1038 | { 1039 | "i": [ 1040 | [ 1041 | 0, 1042 | 0 1043 | ], 1044 | [ 1045 | 0, 1046 | 0 1047 | ], 1048 | [ 1049 | 0, 1050 | 0 1051 | ] 1052 | ], 1053 | "o": [ 1054 | [ 1055 | 0, 1056 | 0 1057 | ], 1058 | [ 1059 | 0, 1060 | 0 1061 | ], 1062 | [ 1063 | 0, 1064 | 0 1065 | ] 1066 | ], 1067 | "v": [ 1068 | [ 1069 | -3.172, 1070 | 0.032 1071 | ], 1072 | [ 1073 | 1.86, 1074 | 0 1075 | ], 1076 | [ 1077 | -3.172, 1078 | 0.061 1079 | ] 1080 | ], 1081 | "c": false 1082 | } 1083 | ] 1084 | }, 1085 | { 1086 | "t": 28, 1087 | "s": [ 1088 | { 1089 | "i": [ 1090 | [ 1091 | 0, 1092 | 0 1093 | ], 1094 | [ 1095 | 0, 1096 | 0 1097 | ], 1098 | [ 1099 | 0, 1100 | 0 1101 | ] 1102 | ], 1103 | "o": [ 1104 | [ 1105 | 0, 1106 | 0 1107 | ], 1108 | [ 1109 | 0, 1110 | 0 1111 | ], 1112 | [ 1113 | 0, 1114 | 0 1115 | ] 1116 | ], 1117 | "v": [ 1118 | [ 1119 | -1.86, 1120 | 3.72 1121 | ], 1122 | [ 1123 | 1.86, 1124 | 0 1125 | ], 1126 | [ 1127 | -1.86, 1128 | -3.72 1129 | ] 1130 | ], 1131 | "c": false 1132 | } 1133 | ] 1134 | } 1135 | ], 1136 | "ix": 2, 1137 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 1138 | }, 1139 | "nm": "Path 1", 1140 | "mn": "ADBE Vector Shape - Group", 1141 | "hd": false 1142 | }, 1143 | { 1144 | "ty": "st", 1145 | "c": { 1146 | "a": 0, 1147 | "k": [ 1148 | 0.161000001197, 1149 | 0.176000004189, 1150 | 0.195999998205, 1151 | 1 1152 | ], 1153 | "ix": 3 1154 | }, 1155 | "o": { 1156 | "a": 0, 1157 | "k": 100, 1158 | "ix": 4 1159 | }, 1160 | "w": { 1161 | "a": 0, 1162 | "k": 1.5, 1163 | "ix": 5 1164 | }, 1165 | "lc": 2, 1166 | "lj": 2, 1167 | "bm": 0, 1168 | "nm": "Stroke 1", 1169 | "mn": "ADBE Vector Graphic - Stroke", 1170 | "hd": false 1171 | }, 1172 | { 1173 | "ty": "tr", 1174 | "p": { 1175 | "a": 0, 1176 | "k": [ 1177 | 17.64, 1178 | 5.22 1179 | ], 1180 | "ix": 2 1181 | }, 1182 | "a": { 1183 | "a": 0, 1184 | "k": [ 1185 | 0, 1186 | 0 1187 | ], 1188 | "ix": 1 1189 | }, 1190 | "s": { 1191 | "a": 0, 1192 | "k": [ 1193 | 100, 1194 | 100 1195 | ], 1196 | "ix": 3 1197 | }, 1198 | "r": { 1199 | "a": 0, 1200 | "k": 0, 1201 | "ix": 6 1202 | }, 1203 | "o": { 1204 | "a": 0, 1205 | "k": 100, 1206 | "ix": 7 1207 | }, 1208 | "sk": { 1209 | "a": 0, 1210 | "k": 0, 1211 | "ix": 4 1212 | }, 1213 | "sa": { 1214 | "a": 0, 1215 | "k": 0, 1216 | "ix": 5 1217 | }, 1218 | "nm": "Transform" 1219 | } 1220 | ], 1221 | "nm": "Group 4", 1222 | "np": 2, 1223 | "cix": 2, 1224 | "bm": 0, 1225 | "ix": 2, 1226 | "mn": "ADBE Vector Group", 1227 | "hd": false 1228 | }, 1229 | { 1230 | "ty": "tr", 1231 | "p": { 1232 | "a": 1, 1233 | "k": [ 1234 | { 1235 | "i": { 1236 | "x": 0.667, 1237 | "y": 1 1238 | }, 1239 | "o": { 1240 | "x": 0.333, 1241 | "y": 0 1242 | }, 1243 | "t": 11, 1244 | "s": [ 1245 | 14.828, 1246 | 5.22 1247 | ], 1248 | "to": [ 1249 | 0, 1250 | 1.667 1251 | ], 1252 | "ti": [ 1253 | 0, 1254 | 0 1255 | ] 1256 | }, 1257 | { 1258 | "i": { 1259 | "x": 0.833, 1260 | "y": 0.833 1261 | }, 1262 | "o": { 1263 | "x": 0.333, 1264 | "y": 0 1265 | }, 1266 | "t": 20, 1267 | "s": [ 1268 | 14.828, 1269 | 15.22 1270 | ], 1271 | "to": [ 1272 | 0, 1273 | 0 1274 | ], 1275 | "ti": [ 1276 | 0, 1277 | 1.667 1278 | ] 1279 | }, 1280 | { 1281 | "t": 29, 1282 | "s": [ 1283 | 14.828, 1284 | 5.22 1285 | ] 1286 | } 1287 | ], 1288 | "ix": 2, 1289 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 1290 | }, 1291 | "a": { 1292 | "a": 0, 1293 | "k": [ 1294 | 14.828, 1295 | 5.22 1296 | ], 1297 | "ix": 1, 1298 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 1299 | }, 1300 | "s": { 1301 | "a": 0, 1302 | "k": [ 1303 | 100, 1304 | 100 1305 | ], 1306 | "ix": 3, 1307 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 1308 | }, 1309 | "r": { 1310 | "a": 0, 1311 | "k": 0, 1312 | "ix": 6 1313 | }, 1314 | "o": { 1315 | "a": 0, 1316 | "k": 100, 1317 | "ix": 7 1318 | }, 1319 | "sk": { 1320 | "a": 0, 1321 | "k": 0, 1322 | "ix": 4, 1323 | "x": "var $bm_rt;\nvar amp, freq, decay, n, n, t, t, v;\ntry {\n amp = $bm_div(effect('Elastic Controller')(1), 200);\n freq = $bm_div(effect('Elastic Controller')(2), 30);\n decay = $bm_div(effect('Elastic Controller')(3), 10);\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n} catch (e$$4) {\n $bm_rt = value = value;\n}" 1324 | }, 1325 | "sa": { 1326 | "a": 0, 1327 | "k": 0, 1328 | "ix": 5 1329 | }, 1330 | "nm": "Transform" 1331 | } 1332 | ], 1333 | "nm": "Group 6", 1334 | "np": 2, 1335 | "cix": 2, 1336 | "bm": 0, 1337 | "ix": 2, 1338 | "mn": "ADBE Vector Group", 1339 | "hd": false 1340 | } 1341 | ], 1342 | "ip": 0, 1343 | "op": 40, 1344 | "st": 0, 1345 | "bm": 0 1346 | } 1347 | ], 1348 | "markers": [] 1349 | } --------------------------------------------------------------------------------