diff --git a/Application Product/Source/README.md b/Application Product/Source/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/Application Product/Source/source/.gitignore b/Application Product/Source/source/.gitignore
new file mode 100755
index 0000000..d009f5a
--- /dev/null
+++ b/Application Product/Source/source/.gitignore
@@ -0,0 +1,50 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Firebase – this is necessary if you use Firebase since it could otherwise
+# lead to leaking of private certificates to your repository, which is no bueno.
+.firebase/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/Application Product/Source/source/.metadata b/Application Product/Source/source/.metadata
new file mode 100755
index 0000000..140b929
--- /dev/null
+++ b/Application Product/Source/source/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: 4d7946a68d26794349189cf21b3f68cc6fe61dcb
+ channel: stable
+
+project_type: app
diff --git a/Application Product/Source/source/README.md b/Application Product/Source/source/README.md
new file mode 100755
index 0000000..805480a
--- /dev/null
+++ b/Application Product/Source/source/README.md
@@ -0,0 +1,7 @@
+# UVita
+
+A new Flutter project.
+
+## Getting Started
+
+FlutterFlow projects are built to run on the Flutter _stable_ release.
diff --git a/Application Product/Source/source/analysis_options.yaml b/Application Product/Source/source/analysis_options.yaml
new file mode 100755
index 0000000..102df89
--- /dev/null
+++ b/Application Product/Source/source/analysis_options.yaml
@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at https://dart.dev/lints.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+ unnecessary_string_escapes: false
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
\ No newline at end of file
diff --git a/Application Product/Source/source/android/.gitignore b/Application Product/Source/source/android/.gitignore
new file mode 100755
index 0000000..0a741cb
--- /dev/null
+++ b/Application Product/Source/source/android/.gitignore
@@ -0,0 +1,11 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
diff --git a/Application Product/Source/source/android/app/build.gradle b/Application Product/Source/source/android/app/build.gradle
new file mode 100755
index 0000000..39385be
--- /dev/null
+++ b/Application Product/Source/source/android/app/build.gradle
@@ -0,0 +1,79 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+
+
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+android {
+ compileSdkVersion 34
+
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ lintOptions {
+ disable 'InvalidPackage'
+ checkReleaseBuilds false
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.mycompany.uvita"
+ minSdkVersion 21
+ targetSdkVersion 34
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ signingConfigs {
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+ storePassword keystoreProperties['storePassword']
+ }
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10"
+}
diff --git a/Application Product/Source/source/android/app/src/debug/AndroidManifest.xml b/Application Product/Source/source/android/app/src/debug/AndroidManifest.xml
new file mode 100755
index 0000000..a9118bb
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/main/AndroidManifest.xml b/Application Product/Source/source/android/app/src/main/AndroidManifest.xml
new file mode 100755
index 0000000..1e54b39
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt b/Application Product/Source/source/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt
new file mode 100755
index 0000000..b00eced
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/kotlin/com/example/my_project/MainActivity.kt
@@ -0,0 +1,6 @@
+package com.mycompany.uvita
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/Application Product/Source/source/android/app/src/main/res/drawable/launch_background.xml b/Application Product/Source/source/android/app/src/main/res/drawable/launch_background.xml
new file mode 100755
index 0000000..f74085f
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..db77bb4
Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..17987b7
Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..09d4391
Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..d5f1c8d
Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/Application Product/Source/source/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Application Product/Source/source/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..4d6372e
Binary files /dev/null and b/Application Product/Source/source/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/Application Product/Source/source/android/app/src/main/res/values-night-v31/styles.xml b/Application Product/Source/source/android/app/src/main/res/values-night-v31/styles.xml
new file mode 100755
index 0000000..f93aa34
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/res/values-night-v31/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/main/res/values-night/styles.xml b/Application Product/Source/source/android/app/src/main/res/values-night/styles.xml
new file mode 100755
index 0000000..f93aa34
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/main/res/values-v31/styles.xml b/Application Product/Source/source/android/app/src/main/res/values-v31/styles.xml
new file mode 100755
index 0000000..d74aa35
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/res/values-v31/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/main/res/values/strings.xml b/Application Product/Source/source/android/app/src/main/res/values/strings.xml
new file mode 100755
index 0000000..ae55af4
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+
+ UVita
+
+
\ No newline at end of file
diff --git a/Application Product/Source/source/android/app/src/main/res/values/styles.xml b/Application Product/Source/source/android/app/src/main/res/values/styles.xml
new file mode 100755
index 0000000..d74aa35
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/android/app/src/profile/AndroidManifest.xml b/Application Product/Source/source/android/app/src/profile/AndroidManifest.xml
new file mode 100755
index 0000000..a9118bb
--- /dev/null
+++ b/Application Product/Source/source/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/Application Product/Source/source/android/build.gradle b/Application Product/Source/source/android/build.gradle
new file mode 100755
index 0000000..cf9fba7
--- /dev/null
+++ b/Application Product/Source/source/android/build.gradle
@@ -0,0 +1,18 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/Application Product/Source/source/android/gradle.properties b/Application Product/Source/source/android/gradle.properties
new file mode 100755
index 0000000..498c33b
--- /dev/null
+++ b/Application Product/Source/source/android/gradle.properties
@@ -0,0 +1,4 @@
+org.gradle.jvmargs=-Xmx4608m
+android.useAndroidX=true
+android.enableJetifier=true
+android.enableR8=true
diff --git a/Application Product/Source/source/android/gradle/wrapper/gradle-wrapper.properties b/Application Product/Source/source/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100755
index 0000000..6b66533
--- /dev/null
+++ b/Application Product/Source/source/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
diff --git a/Application Product/Source/source/android/settings.gradle b/Application Product/Source/source/android/settings.gradle
new file mode 100755
index 0000000..6153427
--- /dev/null
+++ b/Application Product/Source/source/android/settings.gradle
@@ -0,0 +1,27 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }()
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+plugins {
+ id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+ id "com.android.application" version "7.3.0" apply false
+ id "org.jetbrains.kotlin.android" version "1.8.10" apply false
+
+
+}
+
+include ":app"
\ No newline at end of file
diff --git a/Application Product/Source/source/assets/audios/favicon.png b/Application Product/Source/source/assets/audios/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/audios/favicon.png differ
diff --git a/Application Product/Source/source/assets/fonts/favicon.png b/Application Product/Source/source/assets/fonts/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/fonts/favicon.png differ
diff --git a/Application Product/Source/source/assets/images/230302-AWS-services.jpg b/Application Product/Source/source/assets/images/230302-AWS-services.jpg
new file mode 100755
index 0000000..563f414
Binary files /dev/null and b/Application Product/Source/source/assets/images/230302-AWS-services.jpg differ
diff --git a/Application Product/Source/source/assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp b/Application Product/Source/source/assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp
new file mode 100755
index 0000000..89f794b
Binary files /dev/null and b/Application Product/Source/source/assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp differ
diff --git a/Application Product/Source/source/assets/images/Settings_(4).png b/Application Product/Source/source/assets/images/Settings_(4).png
new file mode 100755
index 0000000..517457e
Binary files /dev/null and b/Application Product/Source/source/assets/images/Settings_(4).png differ
diff --git a/Application Product/Source/source/assets/images/VZIc6KAR_400x400.jpg b/Application Product/Source/source/assets/images/VZIc6KAR_400x400.jpg
new file mode 100755
index 0000000..5936be8
Binary files /dev/null and b/Application Product/Source/source/assets/images/VZIc6KAR_400x400.jpg differ
diff --git a/Application Product/Source/source/assets/images/app_launcher_icon.png b/Application Product/Source/source/assets/images/app_launcher_icon.png
new file mode 100755
index 0000000..fef18ef
Binary files /dev/null and b/Application Product/Source/source/assets/images/app_launcher_icon.png differ
diff --git a/Application Product/Source/source/assets/images/favicon.png b/Application Product/Source/source/assets/images/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/images/favicon.png differ
diff --git a/Application Product/Source/source/assets/images/images.jpg b/Application Product/Source/source/assets/images/images.jpg
new file mode 100755
index 0000000..2854232
Binary files /dev/null and b/Application Product/Source/source/assets/images/images.jpg differ
diff --git a/Application Product/Source/source/assets/images/sun-eye.jpg b/Application Product/Source/source/assets/images/sun-eye.jpg
new file mode 100755
index 0000000..d524e08
Binary files /dev/null and b/Application Product/Source/source/assets/images/sun-eye.jpg differ
diff --git a/Application Product/Source/source/assets/images/ultraviolet_radiation_hero_image.jpg b/Application Product/Source/source/assets/images/ultraviolet_radiation_hero_image.jpg
new file mode 100755
index 0000000..833541e
Binary files /dev/null and b/Application Product/Source/source/assets/images/ultraviolet_radiation_hero_image.jpg differ
diff --git a/Application Product/Source/source/assets/lottie_animations/favicon.png b/Application Product/Source/source/assets/lottie_animations/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/lottie_animations/favicon.png differ
diff --git a/Application Product/Source/source/assets/pdfs/favicon.png b/Application Product/Source/source/assets/pdfs/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/pdfs/favicon.png differ
diff --git a/Application Product/Source/source/assets/rive_animations/favicon.png b/Application Product/Source/source/assets/rive_animations/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/rive_animations/favicon.png differ
diff --git a/Application Product/Source/source/assets/videos/favicon.png b/Application Product/Source/source/assets/videos/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/Application Product/Source/source/assets/videos/favicon.png differ
diff --git a/Application Product/Source/source/ios/.gitignore b/Application Product/Source/source/ios/.gitignore
new file mode 100755
index 0000000..eb86478
--- /dev/null
+++ b/Application Product/Source/source/ios/.gitignore
@@ -0,0 +1,33 @@
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+build/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/Application Product/Source/source/ios/Flutter/AppFrameworkInfo.plist b/Application Product/Source/source/ios/Flutter/AppFrameworkInfo.plist
new file mode 100755
index 0000000..748aee7
--- /dev/null
+++ b/Application Product/Source/source/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 14.0.0
+
+
diff --git a/Application Product/Source/source/ios/Flutter/Debug.xcconfig b/Application Product/Source/source/ios/Flutter/Debug.xcconfig
new file mode 100755
index 0000000..e8efba1
--- /dev/null
+++ b/Application Product/Source/source/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/Application Product/Source/source/ios/Flutter/Release.xcconfig b/Application Product/Source/source/ios/Flutter/Release.xcconfig
new file mode 100755
index 0000000..399e934
--- /dev/null
+++ b/Application Product/Source/source/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/Application Product/Source/source/ios/ImageNotification/Info.plist b/Application Product/Source/source/ios/ImageNotification/Info.plist
new file mode 100755
index 0000000..9f28060
--- /dev/null
+++ b/Application Product/Source/source/ios/ImageNotification/Info.plist
@@ -0,0 +1,31 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ ImageNotification
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.usernotifications.service
+ NSExtensionPrincipalClass
+ $(PRODUCT_MODULE_NAME).NotificationService
+
+
+
diff --git a/Application Product/Source/source/ios/ImageNotification/NotificationService.swift b/Application Product/Source/source/ios/ImageNotification/NotificationService.swift
new file mode 100755
index 0000000..d16342e
--- /dev/null
+++ b/Application Product/Source/source/ios/ImageNotification/NotificationService.swift
@@ -0,0 +1,27 @@
+import FirebaseMessaging
+import UserNotifications
+
+class NotificationService: UNNotificationServiceExtension {
+
+ var contentHandler: ((UNNotificationContent) -> Void)?
+ var bestAttemptContent: UNMutableNotificationContent?
+
+ override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
+ self.contentHandler = contentHandler
+ bestAttemptContent = request.content
+ .mutableCopy() as? UNMutableNotificationContent
+ guard let bestAttemptContent = bestAttemptContent else { return }
+ FIRMessagingExtensionHelper().populateNotificationContent(
+ bestAttemptContent,
+ withContentHandler: contentHandler)
+ }
+
+ override func serviceExtensionTimeWillExpire() {
+ // Called just before the extension will be terminated by the system.
+ // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
+ if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
+ contentHandler(bestAttemptContent)
+ }
+ }
+
+}
diff --git a/Application Product/Source/source/ios/Podfile b/Application Product/Source/source/ios/Podfile
new file mode 100755
index 0000000..8f4bfd9
--- /dev/null
+++ b/Application Product/Source/source/ios/Podfile
@@ -0,0 +1,45 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '14.0.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks! :linkage => :static
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ target.build_configurations.each do |config|
+ config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
+
+ end
+ end
+end
diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/project.pbxproj b/Application Product/Source/source/ios/Runner.xcodeproj/project.pbxproj
new file mode 100755
index 0000000..af6066a
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,513 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 44A671D52BC7AFBA0042F967 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 6436409A27A31CD800820AF7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6436409C27A31CD800820AF7 /* InfoPlist.strings */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ 6436409C27A31CD800820AF7 /* InfoPlist.strings */,
+ 44A671D42BC7AFBA0042F967 /* PrivacyInfo.xcprivacy */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1020;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 44A671D52BC7AFBA0042F967 /* PrivacyInfo.xcprivacy in Resources */,
+ 6436409A27A31CD800820AF7 /* InfoPlist.strings in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.mycompany.uvita;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.mycompany.uvita;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/Flutter",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.mycompany.uvita;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100755
index 0000000..1d526a1
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100755
index 0000000..18d9810
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100755
index 0000000..f9b0d7c
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/Application Product/Source/source/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/Application Product/Source/source/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100755
index 0000000..a28140c
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner.xcworkspace/contents.xcworkspacedata b/Application Product/Source/source/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100755
index 0000000..1d526a1
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100755
index 0000000..18d9810
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100755
index 0000000..f9b0d7c
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/Application Product/Source/source/ios/Runner/AppDelegate.swift b/Application Product/Source/source/ios/Runner/AppDelegate.swift
new file mode 100755
index 0000000..f52eb22
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/AppDelegate.swift
@@ -0,0 +1,14 @@
+import UIKit
+
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100755
index 0000000..d36b1fa
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..dc9ada4
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..28c6bf0
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..f091b6b
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cde121
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..d0ef06e
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..dcdc230
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..c8f9ed8
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..75b2d16
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..c4df70d
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..6a84f41
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..d0e1f58
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100755
index 0000000..0bedcf2
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100755
index 0000000..89c2725
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+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.
\ No newline at end of file
diff --git a/Application Product/Source/source/ios/Runner/Base.lproj/LaunchScreen.storyboard b/Application Product/Source/source/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100755
index 0000000..f2e259c
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner/Base.lproj/Main.storyboard b/Application Product/Source/source/ios/Runner/Base.lproj/Main.storyboard
new file mode 100755
index 0000000..f3c2851
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner/Info.plist b/Application Product/Source/source/ios/Runner/Info.plist
new file mode 100755
index 0000000..8a08a46
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Info.plist
@@ -0,0 +1,70 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ UVita
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ UVita
+ CFBundlePackageType
+ APPL
+
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ uvita.com
+ CFBundleURLSchemes
+
+ uvita
+
+
+
+ FlutterDeepLinkingEnabled
+
+
+
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+
+
+
+
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner/PrivacyInfo.xcprivacy b/Application Product/Source/source/ios/Runner/PrivacyInfo.xcprivacy
new file mode 100755
index 0000000..0c67376
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/PrivacyInfo.xcprivacy
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/Application Product/Source/source/ios/Runner/Runner-Bridging-Header.h b/Application Product/Source/source/ios/Runner/Runner-Bridging-Header.h
new file mode 100755
index 0000000..308a2a5
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/Application Product/Source/source/ios/Runner/Runner.entitlements b/Application Product/Source/source/ios/Runner/Runner.entitlements
new file mode 100755
index 0000000..6631ffa
--- /dev/null
+++ b/Application Product/Source/source/ios/Runner/Runner.entitlements
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/Application Product/Source/source/lib/analyst/analyst_model.dart b/Application Product/Source/source/lib/analyst/analyst_model.dart
new file mode 100755
index 0000000..5571f77
--- /dev/null
+++ b/Application Product/Source/source/lib/analyst/analyst_model.dart
@@ -0,0 +1,66 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/widget/advice/advice_widget.dart';
+import '/widget/advice_copy/advice_copy_widget.dart';
+import '/widget/box/box_widget.dart';
+import '/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart';
+import '/widget/healthy/healthy_widget.dart';
+import '/widget/healthy_copy/healthy_copy_widget.dart';
+import '/widget/material_card2/material_card2_widget.dart';
+import '/widget/temp_and_u_v/temp_and_u_v_widget.dart';
+import '/widget/time_count/time_count_widget.dart';
+import 'analyst_widget.dart' show AnalystWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class AnalystModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this page.
+
+ // Model for Time_Count component.
+ late TimeCountModel timeCountModel;
+ // Model for box component.
+ late BoxModel boxModel;
+ // Model for TempAndUV component.
+ late TempAndUVModel tempAndUVModel;
+ // Model for Dashboard01RecentActivity component.
+ late Dashboard01RecentActivityModel dashboard01RecentActivityModel;
+ // Model for MaterialCard2 component.
+ late MaterialCard2Model materialCard2Model;
+ // Model for Advice component.
+ late AdviceModel adviceModel;
+ // Model for AdviceCopy component.
+ late AdviceCopyModel adviceCopyModel;
+ // Model for HealthyCopy component.
+ late HealthyCopyModel healthyCopyModel;
+ // Model for Healthy component.
+ late HealthyModel healthyModel;
+
+ @override
+ void initState(BuildContext context) {
+ timeCountModel = createModel(context, () => TimeCountModel());
+ boxModel = createModel(context, () => BoxModel());
+ tempAndUVModel = createModel(context, () => TempAndUVModel());
+ dashboard01RecentActivityModel =
+ createModel(context, () => Dashboard01RecentActivityModel());
+ materialCard2Model = createModel(context, () => MaterialCard2Model());
+ adviceModel = createModel(context, () => AdviceModel());
+ adviceCopyModel = createModel(context, () => AdviceCopyModel());
+ healthyCopyModel = createModel(context, () => HealthyCopyModel());
+ healthyModel = createModel(context, () => HealthyModel());
+ }
+
+ @override
+ void dispose() {
+ timeCountModel.dispose();
+ boxModel.dispose();
+ tempAndUVModel.dispose();
+ dashboard01RecentActivityModel.dispose();
+ materialCard2Model.dispose();
+ adviceModel.dispose();
+ adviceCopyModel.dispose();
+ healthyCopyModel.dispose();
+ healthyModel.dispose();
+ }
+}
diff --git a/Application Product/Source/source/lib/analyst/analyst_widget.dart b/Application Product/Source/source/lib/analyst/analyst_widget.dart
new file mode 100755
index 0000000..a833983
--- /dev/null
+++ b/Application Product/Source/source/lib/analyst/analyst_widget.dart
@@ -0,0 +1,127 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/widget/advice/advice_widget.dart';
+import '/widget/advice_copy/advice_copy_widget.dart';
+import '/widget/box/box_widget.dart';
+import '/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart';
+import '/widget/healthy/healthy_widget.dart';
+import '/widget/healthy_copy/healthy_copy_widget.dart';
+import '/widget/material_card2/material_card2_widget.dart';
+import '/widget/temp_and_u_v/temp_and_u_v_widget.dart';
+import '/widget/time_count/time_count_widget.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'analyst_model.dart';
+export 'analyst_model.dart';
+
+class AnalystWidget extends StatefulWidget {
+ const AnalystWidget({super.key});
+
+ @override
+ State createState() => _AnalystWidgetState();
+}
+
+class _AnalystWidgetState extends State {
+ late AnalystModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => AnalystModel());
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: () => FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: Color(0xFFDDDCDC),
+ body: SafeArea(
+ top: true,
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding: EdgeInsets.all(22.0),
+ child: wrapWithModel(
+ model: _model.timeCountModel,
+ updateCallback: () => safeSetState(() {}),
+ child: TimeCountWidget(),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.all(2.0),
+ child: wrapWithModel(
+ model: _model.boxModel,
+ updateCallback: () => safeSetState(() {}),
+ child: BoxWidget(),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.all(6.0),
+ child: wrapWithModel(
+ model: _model.tempAndUVModel,
+ updateCallback: () => safeSetState(() {}),
+ child: TempAndUVWidget(),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.all(4.0),
+ child: wrapWithModel(
+ model: _model.dashboard01RecentActivityModel,
+ updateCallback: () => safeSetState(() {}),
+ child: Dashboard01RecentActivityWidget(),
+ ),
+ ),
+ wrapWithModel(
+ model: _model.materialCard2Model,
+ updateCallback: () => safeSetState(() {}),
+ child: MaterialCard2Widget(),
+ ),
+ Padding(
+ padding: EdgeInsets.all(20.0),
+ child: wrapWithModel(
+ model: _model.adviceModel,
+ updateCallback: () => safeSetState(() {}),
+ child: AdviceWidget(),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.all(20.0),
+ child: wrapWithModel(
+ model: _model.adviceCopyModel,
+ updateCallback: () => safeSetState(() {}),
+ child: AdviceCopyWidget(),
+ ),
+ ),
+ wrapWithModel(
+ model: _model.healthyCopyModel,
+ updateCallback: () => safeSetState(() {}),
+ child: HealthyCopyWidget(),
+ ),
+ wrapWithModel(
+ model: _model.healthyModel,
+ updateCallback: () => safeSetState(() {}),
+ child: HealthyWidget(),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/components/card35_news_article_model.dart b/Application Product/Source/source/lib/components/card35_news_article_model.dart
new file mode 100755
index 0000000..c63b57e
--- /dev/null
+++ b/Application Product/Source/source/lib/components/card35_news_article_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'card35_news_article_widget.dart' show Card35NewsArticleWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class Card35NewsArticleModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/components/card35_news_article_widget.dart b/Application Product/Source/source/lib/components/card35_news_article_widget.dart
new file mode 100755
index 0000000..db0e1d9
--- /dev/null
+++ b/Application Product/Source/source/lib/components/card35_news_article_widget.dart
@@ -0,0 +1,184 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'card35_news_article_model.dart';
+export 'card35_news_article_model.dart';
+
+class Card35NewsArticleWidget extends StatefulWidget {
+ const Card35NewsArticleWidget({super.key});
+
+ @override
+ State createState() =>
+ _Card35NewsArticleWidgetState();
+}
+
+class _Card35NewsArticleWidgetState extends State {
+ late Card35NewsArticleModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => Card35NewsArticleModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ height: 160.0,
+ child: Stack(
+ alignment: AlignmentDirectional(0.0, 1.0),
+ children: [
+ Align(
+ alignment: AlignmentDirectional(0.0, -1.0),
+ child: ClipRRect(
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(0.0),
+ topLeft: Radius.circular(8.0),
+ topRight: Radius.circular(8.0),
+ ),
+ child: Image.asset(
+ 'assets/images/230302-AWS-services.jpg',
+ width: double.infinity,
+ height: 130.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ Align(
+ alignment: AlignmentDirectional(0.0, 1.0),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 24.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Icon(
+ Icons.grid_on_rounded,
+ color: Color(0xFF9A0F0F),
+ size: 24.0,
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Text(
+ 'NASA NEWS',
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: 'Inter',
+ color: Color(0xFFAE1010),
+ fontSize: 23.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ ),
+ ],
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 12.0),
+ child: Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ colors: [
+ FlutterFlowTheme.of(context).primary,
+ FlutterFlowTheme.of(context).secondary,
+ FlutterFlowTheme.of(context).alternate
+ ],
+ stops: [0.0, 0.3, 1.0],
+ begin: AlignmentDirectional(1.0, 0.98),
+ end: AlignmentDirectional(-1.0, -0.98),
+ ),
+ shape: BoxShape.circle,
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(2.0),
+ child: Container(
+ width: 40.0,
+ height: 40.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ shape: BoxShape.circle,
+ ),
+ child: Icon(
+ Icons.chevron_right_rounded,
+ color: FlutterFlowTheme.of(context)
+ .primaryText,
+ size: 32.0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 8.0, 0.0, 0.0),
+ child: Text(
+ 'Explore Open Data on AWS',
+ style: FlutterFlowTheme.of(context).titleLarge.override(
+ fontFamily: 'Inter Tight',
+ fontSize: 24.0,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 0.0),
+ child: Text(
+ 'NASA partners with Amazon Web Services (AWS) to offer high-value scientific datasets for faster research. The data spans multiple fields and is suitable for AI training, supporting NASA\'s commitment to open science.sss',
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ fontSize: 19.0,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/components/card38_location_details_model.dart b/Application Product/Source/source/lib/components/card38_location_details_model.dart
new file mode 100755
index 0000000..7c78c0d
--- /dev/null
+++ b/Application Product/Source/source/lib/components/card38_location_details_model.dart
@@ -0,0 +1,16 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'card38_location_details_widget.dart' show Card38LocationDetailsWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class Card38LocationDetailsModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/components/card38_location_details_widget.dart b/Application Product/Source/source/lib/components/card38_location_details_widget.dart
new file mode 100755
index 0000000..710a466
--- /dev/null
+++ b/Application Product/Source/source/lib/components/card38_location_details_widget.dart
@@ -0,0 +1,208 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'card38_location_details_model.dart';
+export 'card38_location_details_model.dart';
+
+class Card38LocationDetailsWidget extends StatefulWidget {
+ const Card38LocationDetailsWidget({super.key});
+
+ @override
+ State createState() =>
+ _Card38LocationDetailsWidgetState();
+}
+
+class _Card38LocationDetailsWidgetState
+ extends State {
+ late Card38LocationDetailsModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => Card38LocationDetailsModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 12.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 3.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(12.0),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(12.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(10.0),
+ child: Image.asset(
+ 'assets/images/VZIc6KAR_400x400.jpg',
+ width: 94.0,
+ height: 93.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(12.0, 8.0, 0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'NASA NEWS',
+ style:
+ FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ fontSize: 21.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 4.0, 0.0, 0.0),
+ child: SelectionArea(
+ child: Text(
+ 'Astromaterials Data System',
+ style: FlutterFlowTheme.of(context)
+ .bodySmall
+ .override(
+ fontFamily: 'Inter',
+ color: Color(0xFFB40404),
+ fontSize: 23.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ ),
+ )),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Icon(
+ Icons.check_circle_outline_rounded,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ ],
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 0.0),
+ child: Text(
+ 'OSIRIS-REx has returned samples from asteroid Bennu, now available in NASA\'s Astromaterials Data System (Astromat). Explore data from Bennu, lunar samples, meteorites, and more with 40+ years of searchable archives',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ fontSize: 21.0,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 4.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 0.0),
+ child: SelectionArea(
+ child: Text(
+ 'Last Activity',
+ style: FlutterFlowTheme.of(context).labelSmall.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ )),
+ ),
+ Expanded(
+ child: Align(
+ alignment: AlignmentDirectional(-1.0, 0.0),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 4.0, 8.0, 0.0, 0.0),
+ child: SelectionArea(
+ child: Text(
+ 'Yesterday, 4:21pm',
+ textAlign: TextAlign.start,
+ style:
+ FlutterFlowTheme.of(context).bodySmall.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ )),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ FFButtonWidget(
+ onPressed: () {
+ print('Button pressed ...');
+ },
+ text: 'NEWS',
+ options: FFButtonOptions(
+ height: 40.0,
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 0.0),
+ iconPadding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ color: Color(0xFFFFCF00),
+ textStyle: FlutterFlowTheme.of(context).titleSmall.override(
+ fontFamily: 'Inter Tight',
+ color: Colors.white,
+ letterSpacing: 0.0,
+ ),
+ elevation: 2.0,
+ borderSide: BorderSide(
+ color: Colors.transparent,
+ width: 1.0,
+ ),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/components/notifi_model.dart b/Application Product/Source/source/lib/components/notifi_model.dart
new file mode 100755
index 0000000..949062b
--- /dev/null
+++ b/Application Product/Source/source/lib/components/notifi_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'notifi_widget.dart' show NotifiWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class NotifiModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/components/notifi_widget.dart b/Application Product/Source/source/lib/components/notifi_widget.dart
new file mode 100755
index 0000000..8f4b37a
--- /dev/null
+++ b/Application Product/Source/source/lib/components/notifi_widget.dart
@@ -0,0 +1,185 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'notifi_model.dart';
+export 'notifi_model.dart';
+
+class NotifiWidget extends StatefulWidget {
+ const NotifiWidget({super.key});
+
+ @override
+ State createState() => _NotifiWidgetState();
+}
+
+class _NotifiWidgetState extends State {
+ late NotifiModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => NotifiModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 1.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0.0,
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(12.0),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ flex: 4,
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 12.0, 12.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ width: 44.0,
+ height: 44.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ shape: BoxShape.circle,
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(2.0),
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(40.0),
+ child: Image.network(
+ 'https://images.unsplash.com/photo-1474176857210-7287d38d27c6?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NTB8fHVzZXJzfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=900&q=60',
+ width: 36.0,
+ height: 36.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 12.0, 0.0, 0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 4.0, 0.0, 0.0),
+ child: Text(
+ 'Andrew Hernandez',
+ style: FlutterFlowTheme.of(context)
+ .bodyLarge
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Text(
+ 'Jan. 28th, 4:30pm',
+ style: FlutterFlowTheme.of(context)
+ .labelSmall
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 4.0, 0.0, 0.0),
+ child: Text(
+ '@username',
+ style: FlutterFlowTheme.of(context)
+ .bodySmall
+ .override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context)
+ .primary,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 4.0, 0.0, 0.0),
+ child: Text(
+ 'FlutterFlow is a visual development platform that allows you to easily create beautiful and responsive user interfaces for your mobile and web applications. ',
+ style: FlutterFlowTheme.of(context)
+ .labelSmall
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 20.0, 0.0, 0.0),
+ child: Container(
+ width: 12.0,
+ height: 12.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondary,
+ shape: BoxShape.circle,
+ ),
+ alignment: AlignmentDirectional(0.0, 0.0),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_animations.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_animations.dart
new file mode 100755
index 0000000..81dd980
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_animations.dart
@@ -0,0 +1,112 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_animate/flutter_animate.dart';
+
+enum AnimationTrigger {
+ onPageLoad,
+ onActionTrigger,
+}
+
+class AnimationInfo {
+ AnimationInfo({
+ required this.trigger,
+ required this.effectsBuilder,
+ this.loop = false,
+ this.reverse = false,
+ this.applyInitialState = true,
+ });
+ final AnimationTrigger trigger;
+ final List Function()? effectsBuilder;
+ final bool applyInitialState;
+ final bool loop;
+ final bool reverse;
+ late AnimationController controller;
+
+ List? _effects;
+ List get effects => _effects ??= effectsBuilder!();
+
+ void maybeUpdateEffects(List? updatedEffects) {
+ if (updatedEffects != null) {
+ _effects = updatedEffects;
+ }
+ }
+}
+
+void createAnimation(AnimationInfo animation, TickerProvider vsync) {
+ final newController = AnimationController(vsync: vsync);
+ animation.controller = newController;
+}
+
+void setupAnimations(Iterable animations, TickerProvider vsync) {
+ animations.forEach((animation) => createAnimation(animation, vsync));
+}
+
+extension AnimatedWidgetExtension on Widget {
+ Widget animateOnPageLoad(
+ AnimationInfo animationInfo, {
+ List? effects,
+ }) {
+ animationInfo.maybeUpdateEffects(effects);
+ return Animate(
+ effects: animationInfo.effects,
+ child: this,
+ onPlay: (controller) => animationInfo.loop
+ ? controller.repeat(reverse: animationInfo.reverse)
+ : null,
+ onComplete: (controller) => !animationInfo.loop && animationInfo.reverse
+ ? controller.reverse()
+ : null,
+ );
+ }
+
+ Widget animateOnActionTrigger(
+ AnimationInfo animationInfo, {
+ List? effects,
+ bool hasBeenTriggered = false,
+ }) {
+ animationInfo.maybeUpdateEffects(effects);
+ return hasBeenTriggered || animationInfo.applyInitialState
+ ? Animate(
+ controller: animationInfo.controller,
+ autoPlay: false,
+ effects: animationInfo.effects,
+ child: this)
+ : this;
+ }
+}
+
+class TiltEffect extends Effect {
+ const TiltEffect({
+ Duration? delay,
+ Duration? duration,
+ Curve? curve,
+ Offset? begin,
+ Offset? end,
+ }) : super(
+ delay: delay,
+ duration: duration,
+ curve: curve,
+ begin: begin ?? const Offset(0.0, 0.0),
+ end: end ?? const Offset(0.0, 0.0),
+ );
+
+ @override
+ Widget build(
+ BuildContext context,
+ Widget child,
+ AnimationController controller,
+ EffectEntry entry,
+ ) {
+ Animation animation = buildAnimation(controller, entry);
+ return getOptimizedBuilder(
+ animation: animation,
+ builder: (_, __) => Transform(
+ transform: Matrix4.identity()
+ ..setEntry(3, 2, 0.001)
+ ..rotateX(animation.value.dx)
+ ..rotateY(animation.value.dy),
+ alignment: Alignment.center,
+ child: child,
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_calendar.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_calendar.dart
new file mode 100755
index 0000000..bcbe673
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_calendar.dart
@@ -0,0 +1,325 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:intl/intl.dart';
+import 'package:table_calendar/table_calendar.dart';
+
+DateTime kFirstDay = DateTime(1970, 1, 1);
+DateTime kLastDay = DateTime(2100, 1, 1);
+
+extension DateTimeExtension on DateTime {
+ DateTime get startOfDay => DateTime(year, month, day);
+
+ DateTime get endOfDay => DateTime(year, month, day, 23, 59);
+}
+
+class FlutterFlowCalendar extends StatefulWidget {
+ const FlutterFlowCalendar({
+ Key? key,
+ required this.color,
+ this.onChange,
+ this.initialDate,
+ this.weekFormat = false,
+ this.weekStartsMonday = false,
+ this.twoRowHeader = false,
+ this.iconColor,
+ this.dateStyle,
+ this.dayOfWeekStyle,
+ this.inactiveDateStyle,
+ this.selectedDateStyle,
+ this.titleStyle,
+ this.rowHeight,
+ this.locale,
+ }) : super(key: key);
+
+ final bool weekFormat;
+ final bool weekStartsMonday;
+ final bool twoRowHeader;
+ final Color color;
+ final void Function(DateTimeRange?)? onChange;
+ final DateTime? initialDate;
+ final Color? iconColor;
+ final TextStyle? dateStyle;
+ final TextStyle? dayOfWeekStyle;
+ final TextStyle? inactiveDateStyle;
+ final TextStyle? selectedDateStyle;
+ final TextStyle? titleStyle;
+ final double? rowHeight;
+ final String? locale;
+
+ @override
+ State createState() => _FlutterFlowCalendarState();
+}
+
+class _FlutterFlowCalendarState extends State {
+ late DateTime focusedDay;
+ late DateTime selectedDay;
+ late DateTimeRange selectedRange;
+
+ @override
+ void initState() {
+ super.initState();
+ focusedDay = widget.initialDate ?? DateTime.now();
+ selectedDay = widget.initialDate ?? DateTime.now();
+ selectedRange = DateTimeRange(
+ start: selectedDay.startOfDay,
+ end: selectedDay.endOfDay,
+ );
+ SchedulerBinding.instance
+ .addPostFrameCallback((_) => setSelectedDay(selectedRange.start));
+ }
+
+ CalendarFormat get calendarFormat =>
+ widget.weekFormat ? CalendarFormat.week : CalendarFormat.month;
+
+ StartingDayOfWeek get startingDayOfWeek => widget.weekStartsMonday
+ ? StartingDayOfWeek.monday
+ : StartingDayOfWeek.sunday;
+
+ Color get color => widget.color;
+
+ Color get lightColor => widget.color.withOpacity(0.85);
+
+ Color get lighterColor => widget.color.withOpacity(0.60);
+
+ void setSelectedDay(
+ DateTime? newSelectedDay, [
+ DateTime? newSelectedEnd,
+ ]) {
+ final newRange = newSelectedDay == null
+ ? null
+ : DateTimeRange(
+ start: newSelectedDay.startOfDay,
+ end: newSelectedEnd ?? newSelectedDay.endOfDay,
+ );
+ setState(() {
+ selectedDay = newSelectedDay ?? selectedDay;
+ selectedRange = newRange ?? selectedRange;
+ if (widget.onChange != null) {
+ widget.onChange!(newRange);
+ }
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) => Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.center,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ CalendarHeader(
+ focusedDay: focusedDay,
+ onLeftChevronTap: () => setState(
+ () => focusedDay = widget.weekFormat
+ ? _previousWeek(focusedDay)
+ : _previousMonth(focusedDay),
+ ),
+ onRightChevronTap: () => setState(
+ () => focusedDay = widget.weekFormat
+ ? _nextWeek(focusedDay)
+ : _nextMonth(focusedDay),
+ ),
+ onTodayButtonTap: () => setState(() => focusedDay = DateTime.now()),
+ titleStyle: widget.titleStyle,
+ iconColor: widget.iconColor,
+ locale: widget.locale,
+ twoRowHeader: widget.twoRowHeader,
+ ),
+ TableCalendar(
+ focusedDay: focusedDay,
+ selectedDayPredicate: (date) => isSameDay(selectedDay, date),
+ firstDay: kFirstDay,
+ lastDay: kLastDay,
+ calendarFormat: calendarFormat,
+ headerVisible: false,
+ locale: widget.locale,
+ rowHeight: widget.rowHeight ?? MediaQuery.sizeOf(context).width / 7,
+ calendarStyle: CalendarStyle(
+ defaultTextStyle:
+ widget.dateStyle ?? const TextStyle(color: Color(0xFF5A5A5A)),
+ weekendTextStyle: widget.dateStyle ??
+ const TextStyle(color: const Color(0xFF5A5A5A)),
+ holidayTextStyle: widget.dateStyle ??
+ const TextStyle(color: const Color(0xFF5C6BC0)),
+ selectedTextStyle:
+ const TextStyle(color: Color(0xFFFAFAFA), fontSize: 16.0)
+ .merge(widget.selectedDateStyle),
+ todayTextStyle:
+ const TextStyle(color: Color(0xFFFAFAFA), fontSize: 16.0)
+ .merge(widget.selectedDateStyle),
+ outsideTextStyle: const TextStyle(color: Color(0xFF9E9E9E))
+ .merge(widget.inactiveDateStyle),
+ selectedDecoration: BoxDecoration(
+ color: color,
+ shape: BoxShape.circle,
+ ),
+ todayDecoration: BoxDecoration(
+ color: lighterColor,
+ shape: BoxShape.circle,
+ ),
+ markerDecoration: BoxDecoration(
+ color: lightColor,
+ shape: BoxShape.circle,
+ ),
+ markersMaxCount: 3,
+ canMarkersOverflow: true,
+ ),
+ availableGestures: AvailableGestures.horizontalSwipe,
+ startingDayOfWeek: startingDayOfWeek,
+ daysOfWeekStyle: DaysOfWeekStyle(
+ weekdayStyle: const TextStyle(color: Color(0xFF616161))
+ .merge(widget.dayOfWeekStyle),
+ weekendStyle: const TextStyle(color: Color(0xFF616161))
+ .merge(widget.dayOfWeekStyle),
+ ),
+ onPageChanged: (focused) {
+ if (focusedDay.startOfDay != focused.startOfDay) {
+ setState(() => focusedDay = focused);
+ }
+ },
+ onDaySelected: (newSelectedDay, focused) {
+ if (!isSameDay(selectedDay, newSelectedDay)) {
+ setSelectedDay(newSelectedDay);
+ if (focusedDay.startOfDay != focused.startOfDay) {
+ setState(() => focusedDay = focused);
+ }
+ }
+ },
+ ),
+ ],
+ );
+}
+
+class CalendarHeader extends StatelessWidget {
+ const CalendarHeader({
+ Key? key,
+ required this.focusedDay,
+ required this.onLeftChevronTap,
+ required this.onRightChevronTap,
+ required this.onTodayButtonTap,
+ this.iconColor,
+ this.titleStyle,
+ this.locale,
+ this.twoRowHeader = false,
+ }) : super(key: key);
+
+ final DateTime focusedDay;
+ final VoidCallback onLeftChevronTap;
+ final VoidCallback onRightChevronTap;
+ final VoidCallback onTodayButtonTap;
+ final Color? iconColor;
+ final TextStyle? titleStyle;
+ final String? locale;
+ final bool twoRowHeader;
+
+ @override
+ Widget build(BuildContext context) => Container(
+ decoration: const BoxDecoration(),
+ margin: const EdgeInsets.all(0),
+ padding: const EdgeInsets.symmetric(vertical: 8),
+ child: twoRowHeader ? _buildTwoRowHeader() : _buildOneRowHeader(),
+ );
+
+ Widget _buildTwoRowHeader() => Column(
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ const SizedBox(width: 16),
+ _buildDateWidget(),
+ ],
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: _buildCustomIconButtons(),
+ ),
+ ],
+ );
+
+ Widget _buildOneRowHeader() => Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ const SizedBox(width: 16),
+ _buildDateWidget(),
+ ..._buildCustomIconButtons(),
+ ],
+ );
+
+ Widget _buildDateWidget() => Expanded(
+ child: Text(
+ DateFormat.yMMMM(locale).format(focusedDay),
+ style: const TextStyle(fontSize: 17).merge(titleStyle),
+ ),
+ );
+
+ List _buildCustomIconButtons() => [
+ CustomIconButton(
+ icon: Icon(Icons.calendar_today, color: iconColor),
+ onTap: onTodayButtonTap,
+ ),
+ CustomIconButton(
+ icon: Icon(Icons.chevron_left, color: iconColor),
+ onTap: onLeftChevronTap,
+ ),
+ CustomIconButton(
+ icon: Icon(Icons.chevron_right, color: iconColor),
+ onTap: onRightChevronTap,
+ ),
+ ];
+}
+
+class CustomIconButton extends StatelessWidget {
+ const CustomIconButton({
+ Key? key,
+ required this.icon,
+ required this.onTap,
+ this.margin = const EdgeInsets.symmetric(horizontal: 4),
+ this.padding = const EdgeInsets.all(10),
+ }) : super(key: key);
+
+ final Icon icon;
+ final VoidCallback onTap;
+ final EdgeInsetsGeometry margin;
+ final EdgeInsetsGeometry padding;
+
+ @override
+ Widget build(BuildContext context) => Padding(
+ padding: margin,
+ child: InkWell(
+ onTap: onTap,
+ borderRadius: BorderRadius.circular(100),
+ child: Padding(
+ padding: padding,
+ child: Icon(
+ icon.icon,
+ color: icon.color,
+ size: icon.size,
+ ),
+ ),
+ ),
+ );
+}
+
+DateTime _previousWeek(DateTime week) {
+ return week.subtract(const Duration(days: 7));
+}
+
+DateTime _nextWeek(DateTime week) {
+ return week.add(const Duration(days: 7));
+}
+
+DateTime _previousMonth(DateTime month) {
+ if (month.month == 1) {
+ return DateTime(month.year - 1, 12);
+ } else {
+ return DateTime(month.year, month.month - 1);
+ }
+}
+
+DateTime _nextMonth(DateTime month) {
+ if (month.month == 12) {
+ return DateTime(month.year + 1, 1);
+ } else {
+ return DateTime(month.year, month.month + 1);
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_charts.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_charts.dart
new file mode 100755
index 0000000..159d769
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_charts.dart
@@ -0,0 +1,547 @@
+import 'dart:math';
+
+import 'package:fl_chart/fl_chart.dart';
+import 'package:flutter/material.dart';
+import 'package:intl/intl.dart';
+
+export 'package:fl_chart/fl_chart.dart'
+ show BarAreaData, FlDotData, LineChartBarData, BarChartAlignment;
+
+class FlutterFlowLineChart extends StatelessWidget {
+ const FlutterFlowLineChart({
+ Key? key,
+ required this.data,
+ required this.xAxisLabelInfo,
+ required this.yAxisLabelInfo,
+ required this.axisBounds,
+ this.chartStylingInfo = const ChartStylingInfo(),
+ }) : super(key: key);
+
+ final List data;
+ final AxisLabelInfo xAxisLabelInfo;
+ final AxisLabelInfo yAxisLabelInfo;
+ final AxisBounds axisBounds;
+ final ChartStylingInfo chartStylingInfo;
+
+ List get dataWithSpots =>
+ data.map((d) => d.settings.copyWith(spots: d.spots)).toList();
+
+ @override
+ Widget build(BuildContext context) => LineChart(
+ LineChartData(
+ lineTouchData: LineTouchData(
+ handleBuiltInTouches: chartStylingInfo.enableTooltip,
+ touchTooltipData: LineTouchTooltipData(
+ getTooltipColor: (group) =>
+ chartStylingInfo.tooltipBackgroundColor ?? Colors.black,
+ ),
+ ),
+ gridData: FlGridData(show: chartStylingInfo.showGrid),
+ borderData: FlBorderData(
+ border: Border.all(
+ color: chartStylingInfo.borderColor,
+ width: chartStylingInfo.borderWidth,
+ ),
+ show: chartStylingInfo.showBorder,
+ ),
+ titlesData: getTitlesData(
+ xAxisLabelInfo,
+ yAxisLabelInfo,
+ ),
+ lineBarsData: dataWithSpots,
+ minX: axisBounds.minX,
+ minY: axisBounds.minY,
+ maxX: axisBounds.maxX,
+ maxY: axisBounds.maxY,
+ backgroundColor: chartStylingInfo.backgroundColor,
+ ),
+ );
+}
+
+class FlutterFlowBarChart extends StatelessWidget {
+ const FlutterFlowBarChart({
+ Key? key,
+ required this.barData,
+ required this.xLabels,
+ required this.xAxisLabelInfo,
+ required this.yAxisLabelInfo,
+ required this.axisBounds,
+ this.stacked = false,
+ this.barWidth,
+ this.barBorderRadius,
+ this.barSpace,
+ this.groupSpace,
+ this.alignment = BarChartAlignment.center,
+ this.chartStylingInfo = const ChartStylingInfo(),
+ }) : super(key: key);
+
+ final List barData;
+ final List xLabels;
+ final AxisLabelInfo xAxisLabelInfo;
+ final AxisLabelInfo yAxisLabelInfo;
+ final AxisBounds axisBounds;
+ final bool stacked;
+ final double? barWidth;
+ final BorderRadius? barBorderRadius;
+ final double? barSpace;
+ final double? groupSpace;
+ final BarChartAlignment alignment;
+ final ChartStylingInfo chartStylingInfo;
+
+ Map> get dataMap => xLabels.asMap().map((key, value) =>
+ MapEntry(key, barData.map((data) => data.data[key]).toList()));
+
+ List get groups => dataMap.entries.map((entry) {
+ final groupInt = entry.key;
+ final groupData = entry.value;
+ return BarChartGroupData(
+ x: groupInt,
+ barsSpace: barSpace,
+ barRods: groupData.asMap().entries.map((rod) {
+ final rodInt = rod.key;
+ final rodSettings = barData[rodInt];
+ final rodValue = rod.value;
+ return BarChartRodData(
+ toY: rodValue,
+ color: rodSettings.color,
+ width: barWidth,
+ borderRadius: barBorderRadius,
+ borderSide: BorderSide(
+ width: rodSettings.borderWidth,
+ color: rodSettings.borderColor,
+ ),
+ );
+ }).toList());
+ }).toList();
+
+ List get stacks => dataMap.entries.map((entry) {
+ final groupInt = entry.key;
+ final stackData = entry.value;
+ return BarChartGroupData(
+ x: groupInt,
+ barsSpace: barSpace,
+ barRods: [
+ BarChartRodData(
+ toY: sum(stackData),
+ width: barWidth,
+ borderRadius: barBorderRadius,
+ rodStackItems: stackData.asMap().entries.map((stack) {
+ final stackInt = stack.key;
+ final stackSettings = barData[stackInt];
+ final start =
+ stackInt == 0 ? 0.0 : sum(stackData.sublist(0, stackInt));
+ return BarChartRodStackItem(
+ start,
+ start + stack.value,
+ stackSettings.color,
+ BorderSide(
+ width: stackSettings.borderWidth,
+ color: stackSettings.borderColor,
+ ),
+ );
+ }).toList(),
+ )
+ ],
+ );
+ }).toList();
+
+ double sum(List list) => list.reduce((a, b) => a + b);
+
+ @override
+ Widget build(BuildContext context) {
+ return BarChart(
+ BarChartData(
+ barTouchData: BarTouchData(
+ handleBuiltInTouches: chartStylingInfo.enableTooltip,
+ touchTooltipData: BarTouchTooltipData(
+ getTooltipColor: (group) =>
+ chartStylingInfo.tooltipBackgroundColor ?? Colors.black,
+ ),
+ ),
+ alignment: alignment,
+ gridData: FlGridData(show: chartStylingInfo.showGrid),
+ borderData: FlBorderData(
+ border: Border.all(
+ color: chartStylingInfo.borderColor,
+ width: chartStylingInfo.borderWidth,
+ ),
+ show: chartStylingInfo.showBorder,
+ ),
+ titlesData: getTitlesData(
+ xAxisLabelInfo,
+ yAxisLabelInfo,
+ getXTitlesWidget: (val, _) => Text(
+ xLabels[val.toInt()],
+ style: xAxisLabelInfo.labelTextStyle,
+ ),
+ ),
+ barGroups: stacked ? stacks : groups,
+ groupsSpace: groupSpace,
+ minY: axisBounds.minY,
+ maxY: axisBounds.maxY,
+ backgroundColor: chartStylingInfo.backgroundColor,
+ ),
+ );
+ }
+}
+
+enum PieChartSectionLabelType {
+ none,
+ value,
+ percent,
+}
+
+class FlutterFlowPieChart extends StatelessWidget {
+ const FlutterFlowPieChart({
+ Key? key,
+ required this.data,
+ this.donutHoleRadius = 0,
+ this.donutHoleColor = Colors.transparent,
+ this.sectionLabelType = PieChartSectionLabelType.none,
+ this.sectionLabelStyle,
+ this.labelFormatter = const LabelFormatter(),
+ }) : super(key: key);
+
+ final FFPieChartData data;
+ final double donutHoleRadius;
+ final Color donutHoleColor;
+ final PieChartSectionLabelType sectionLabelType;
+ final TextStyle? sectionLabelStyle;
+ final LabelFormatter labelFormatter;
+
+ double get sumOfValues => data.data.reduce((a, b) => a + b);
+
+ @override
+ Widget build(BuildContext context) => PieChart(
+ PieChartData(
+ centerSpaceRadius: donutHoleRadius,
+ centerSpaceColor: donutHoleColor,
+ sectionsSpace: 0,
+ sections: data.data.asMap().entries.map(
+ (section) {
+ String? title;
+ final index = section.key;
+ final sectionData = section.value;
+ final colorsLength = data.colors.length;
+ final otherPropsLength = data.radius.length;
+ switch (sectionLabelType) {
+ case PieChartSectionLabelType.value:
+ title = formatLabel(labelFormatter, sectionData);
+ break;
+ case PieChartSectionLabelType.percent:
+ title =
+ '${formatLabel(labelFormatter, sectionData / sumOfValues * 100)}%';
+ break;
+ default:
+ break;
+ }
+ return PieChartSectionData(
+ value: sectionData,
+ color: data.colors[index % colorsLength],
+ radius: otherPropsLength == 1
+ ? data.radius.first
+ : data.radius[index],
+ borderSide: BorderSide(
+ color: (otherPropsLength == 1
+ ? data.borderColor?.first
+ : data.borderColor?.elementAt(index)) ??
+ Colors.transparent,
+ width: (otherPropsLength == 1
+ ? data.borderWidth?.first
+ : data.borderWidth?.elementAt(index)) ??
+ 0.0,
+ ),
+ showTitle: sectionLabelType != PieChartSectionLabelType.none,
+ titleStyle: sectionLabelStyle,
+ title: title,
+ );
+ },
+ ).toList(),
+ ),
+ );
+}
+
+class FlutterFlowChartLegendWidget extends StatelessWidget {
+ const FlutterFlowChartLegendWidget({
+ Key? key,
+ required this.entries,
+ this.width,
+ this.height,
+ this.textStyle,
+ this.padding,
+ this.backgroundColor = Colors.transparent,
+ this.borderRadius,
+ this.borderWidth = 1.0,
+ this.borderColor = const Color(0xFF000000),
+ this.indicatorSize = 10,
+ this.indicatorBorderRadius,
+ this.textPadding = const EdgeInsets.all(0),
+ }) : super(key: key);
+
+ final List entries;
+ final double? width;
+ final double? height;
+ final TextStyle? textStyle;
+ final EdgeInsetsGeometry? padding;
+ final Color backgroundColor;
+ final BorderRadius? borderRadius;
+ final double borderWidth;
+ final Color borderColor;
+ final double indicatorSize;
+ final BorderRadius? indicatorBorderRadius;
+ final EdgeInsetsGeometry textPadding;
+
+ @override
+ Widget build(BuildContext context) => Container(
+ width: width,
+ height: height,
+ padding: padding,
+ decoration: BoxDecoration(
+ color: backgroundColor,
+ borderRadius: borderRadius,
+ border: Border.all(
+ color: borderColor,
+ width: borderWidth,
+ ),
+ ),
+ child: Column(
+ children: entries
+ .map(
+ (entry) => Row(
+ children: [
+ Container(
+ height: indicatorSize,
+ width: indicatorSize,
+ decoration: BoxDecoration(
+ color: entry.color,
+ borderRadius: indicatorBorderRadius,
+ ),
+ ),
+ Padding(
+ padding: textPadding,
+ child: Text(
+ entry.name,
+ style: textStyle,
+ ),
+ )
+ ],
+ ),
+ )
+ .toList(),
+ ),
+ );
+}
+
+class LegendEntry {
+ const LegendEntry(this.color, this.name);
+
+ final Color color;
+ final String name;
+}
+
+class ChartStylingInfo {
+ const ChartStylingInfo({
+ this.backgroundColor = Colors.white,
+ this.showGrid = false,
+ this.enableTooltip = false,
+ this.tooltipBackgroundColor,
+ this.borderColor = Colors.black,
+ this.borderWidth = 1.0,
+ this.showBorder = true,
+ });
+
+ final Color backgroundColor;
+ final bool showGrid;
+ final bool enableTooltip;
+ final Color? tooltipBackgroundColor;
+ final Color borderColor;
+ final double borderWidth;
+ final bool showBorder;
+}
+
+class AxisLabelInfo {
+ const AxisLabelInfo({
+ this.title = '',
+ this.titleTextStyle,
+ this.showLabels = false,
+ this.labelTextStyle,
+ this.labelInterval,
+ this.labelFormatter = const LabelFormatter(),
+ this.reservedSize,
+ });
+
+ final String title;
+ final TextStyle? titleTextStyle;
+ final bool showLabels;
+ final TextStyle? labelTextStyle;
+ final double? labelInterval;
+ final LabelFormatter labelFormatter;
+ final double? reservedSize;
+}
+
+class LabelFormatter {
+ const LabelFormatter({
+ this.numberFormat,
+ });
+
+ final String Function(double)? numberFormat;
+ NumberFormat get defaultFormat => NumberFormat()..significantDigits = 2;
+}
+
+class AxisBounds {
+ const AxisBounds({this.minX, this.minY, this.maxX, this.maxY});
+
+ final double? minX;
+ final double? minY;
+ final double? maxX;
+ final double? maxY;
+}
+
+class FFLineChartData {
+ const FFLineChartData({
+ required this.xData,
+ required this.yData,
+ required this.settings,
+ });
+
+ final List xData;
+ final List yData;
+ final LineChartBarData settings;
+
+ List get spots {
+ final x = _dataToDouble(xData);
+ final y = _dataToDouble(yData);
+ assert(x.length == y.length, 'X and Y data must be the same length');
+
+ return Iterable.generate(min(x.length, y.length))
+ .where((i) => x[i] != null && y[i] != null)
+ .map((i) => FlSpot(x[i]!, y[i]!))
+ .toList();
+ }
+}
+
+class FFBarChartData {
+ const FFBarChartData({
+ required this.yData,
+ required this.color,
+ this.borderWidth = 0,
+ this.borderColor = Colors.transparent,
+ });
+
+ final List yData;
+ final Color color;
+ final double borderWidth;
+ final Color borderColor;
+
+ List get data => _dataToDouble(yData).map((e) => e ?? 0.0).toList();
+}
+
+class FFPieChartData {
+ const FFPieChartData({
+ required this.values,
+ required this.colors,
+ required this.radius,
+ this.borderWidth,
+ this.borderColor,
+ });
+
+ final List values;
+ final List colors;
+ final List radius;
+ final List? borderWidth;
+ final List? borderColor;
+
+ List get data => _dataToDouble(values).map((e) => e ?? 0.0).toList();
+}
+
+List _dataToDouble(List data) {
+ if (data.isEmpty) {
+ return [];
+ }
+ if (data.first is double) {
+ return data.map((d) => d as double).toList();
+ }
+ if (data.first is int) {
+ return data.map((d) => (d as int).toDouble()).toList();
+ }
+ if (data.first is DateTime) {
+ return data
+ .map((d) => (d as DateTime).millisecondsSinceEpoch.toDouble())
+ .toList();
+ }
+ if (data.first is String) {
+ // First try to parse as doubles
+ if (double.tryParse(data.first as String) != null) {
+ return data.map((d) => double.tryParse(d as String)).toList();
+ }
+ if (int.tryParse(data.first as String) != null) {
+ return data.map((d) => int.tryParse(d as String)?.toDouble()).toList();
+ }
+ if (DateTime.tryParse(data.first as String) != null) {
+ return data
+ .map((d) =>
+ DateTime.tryParse(d as String)?.millisecondsSinceEpoch.toDouble())
+ .toList();
+ }
+ }
+ return [];
+}
+
+FlTitlesData getTitlesData(
+ AxisLabelInfo xAxisLabelInfo,
+ AxisLabelInfo yAxisLabelInfo, {
+ Widget Function(double, TitleMeta)? getXTitlesWidget,
+}) =>
+ FlTitlesData(
+ bottomTitles: AxisTitles(
+ axisNameWidget: xAxisLabelInfo.title.isEmpty
+ ? null
+ : Text(
+ xAxisLabelInfo.title,
+ style: xAxisLabelInfo.titleTextStyle,
+ ),
+ axisNameSize: xAxisLabelInfo.titleTextStyle?.fontSize != null
+ ? xAxisLabelInfo.titleTextStyle!.fontSize! + 12
+ : 16,
+ sideTitles: SideTitles(
+ getTitlesWidget: (val, _) => getXTitlesWidget != null
+ ? getXTitlesWidget(val, _)
+ : Text(
+ formatLabel(xAxisLabelInfo.labelFormatter, val),
+ style: xAxisLabelInfo.labelTextStyle,
+ ),
+ showTitles: xAxisLabelInfo.showLabels,
+ interval: xAxisLabelInfo.labelInterval,
+ reservedSize: xAxisLabelInfo.reservedSize ?? 22,
+ ),
+ ),
+ rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
+ topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
+ leftTitles: AxisTitles(
+ axisNameWidget: yAxisLabelInfo.title.isEmpty
+ ? null
+ : Text(
+ yAxisLabelInfo.title,
+ style: yAxisLabelInfo.titleTextStyle,
+ ),
+ axisNameSize: yAxisLabelInfo.titleTextStyle?.fontSize != null
+ ? yAxisLabelInfo.titleTextStyle!.fontSize! + 12
+ : 16,
+ sideTitles: SideTitles(
+ getTitlesWidget: (val, _) => Text(
+ formatLabel(yAxisLabelInfo.labelFormatter, val),
+ style: yAxisLabelInfo.labelTextStyle,
+ ),
+ showTitles: yAxisLabelInfo.showLabels,
+ interval: yAxisLabelInfo.labelInterval,
+ reservedSize: yAxisLabelInfo.reservedSize ?? 22,
+ ),
+ ),
+ );
+
+String formatLabel(LabelFormatter formatter, double value) {
+ if (formatter.numberFormat != null) {
+ return formatter.numberFormat!(value);
+ }
+ return formatter.defaultFormat.format(value);
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_icon_button.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_icon_button.dart
new file mode 100755
index 0000000..50f339f
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_icon_button.dart
@@ -0,0 +1,170 @@
+import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+
+class FlutterFlowIconButton extends StatefulWidget {
+ const FlutterFlowIconButton({
+ Key? key,
+ required this.icon,
+ this.borderColor,
+ this.borderRadius,
+ this.borderWidth,
+ this.buttonSize,
+ this.fillColor,
+ this.disabledColor,
+ this.disabledIconColor,
+ this.hoverColor,
+ this.hoverIconColor,
+ this.onPressed,
+ this.showLoadingIndicator = false,
+ }) : super(key: key);
+
+ final Widget icon;
+ final double? borderRadius;
+ final double? buttonSize;
+ final Color? fillColor;
+ final Color? disabledColor;
+ final Color? disabledIconColor;
+ final Color? hoverColor;
+ final Color? hoverIconColor;
+ final Color? borderColor;
+ final double? borderWidth;
+ final bool showLoadingIndicator;
+ final Function()? onPressed;
+
+ @override
+ State createState() => _FlutterFlowIconButtonState();
+}
+
+class _FlutterFlowIconButtonState extends State {
+ bool loading = false;
+ late double? iconSize;
+ late Color? iconColor;
+ late Widget effectiveIcon;
+
+ @override
+ void initState() {
+ super.initState();
+ _updateIcon();
+ }
+
+ @override
+ void didUpdateWidget(FlutterFlowIconButton oldWidget) {
+ super.didUpdateWidget(oldWidget);
+ _updateIcon();
+ }
+
+ void _updateIcon() {
+ final isFontAwesome = widget.icon is FaIcon;
+ if (isFontAwesome) {
+ FaIcon icon = widget.icon as FaIcon;
+ effectiveIcon = FaIcon(
+ icon.icon,
+ size: icon.size,
+ );
+ iconSize = icon.size;
+ iconColor = icon.color;
+ } else {
+ Icon icon = widget.icon as Icon;
+ effectiveIcon = Icon(
+ icon.icon,
+ size: icon.size,
+ );
+ iconSize = icon.size;
+ iconColor = icon.color;
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ ButtonStyle style = ButtonStyle(
+ shape: MaterialStateProperty.resolveWith(
+ (states) {
+ return RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(widget.borderRadius ?? 0),
+ side: BorderSide(
+ color: widget.borderColor ?? Colors.transparent,
+ width: widget.borderWidth ?? 0,
+ ),
+ );
+ },
+ ),
+ iconColor: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.disabled) &&
+ widget.disabledIconColor != null) {
+ return widget.disabledIconColor;
+ }
+ if (states.contains(MaterialState.hovered) &&
+ widget.hoverIconColor != null) {
+ return widget.hoverIconColor;
+ }
+ return iconColor;
+ },
+ ),
+ backgroundColor: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.disabled) &&
+ widget.disabledColor != null) {
+ return widget.disabledColor;
+ }
+ if (states.contains(MaterialState.hovered) &&
+ widget.hoverColor != null) {
+ return widget.hoverColor;
+ }
+
+ return widget.fillColor;
+ },
+ ),
+ overlayColor: MaterialStateProperty.resolveWith((states) {
+ if (states.contains(MaterialState.pressed)) {
+ return null;
+ }
+ return widget.hoverColor == null ? null : Colors.transparent;
+ }),
+ );
+
+ return SizedBox(
+ width: widget.buttonSize,
+ height: widget.buttonSize,
+ child: Theme(
+ data: ThemeData.from(
+ colorScheme: Theme.of(context).colorScheme,
+ useMaterial3: true,
+ ),
+ child: IgnorePointer(
+ ignoring: (widget.showLoadingIndicator && loading),
+ child: IconButton(
+ icon: (widget.showLoadingIndicator && loading)
+ ? Container(
+ width: iconSize,
+ height: iconSize,
+ child: CircularProgressIndicator(
+ valueColor: AlwaysStoppedAnimation(
+ iconColor ?? Colors.white,
+ ),
+ ),
+ )
+ : effectiveIcon,
+ onPressed: widget.onPressed == null
+ ? null
+ : () async {
+ if (loading) {
+ return;
+ }
+ setState(() => loading = true);
+ try {
+ await widget.onPressed!();
+ } finally {
+ if (mounted) {
+ setState(() => loading = false);
+ }
+ }
+ },
+ splashRadius: widget.buttonSize,
+ style: style,
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_model.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_model.dart
new file mode 100755
index 0000000..a2bf7f8
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_model.dart
@@ -0,0 +1,168 @@
+import 'package:collection/collection.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:provider/provider.dart';
+import 'flutter_flow_util.dart';
+
+Widget wrapWithModel({
+ required T model,
+ required Widget child,
+ required VoidCallback updateCallback,
+ bool updateOnChange = false,
+}) {
+ // Set the component to optionally update the page on updates.
+ model.setOnUpdate(
+ onUpdate: updateCallback,
+ updateOnChange: updateOnChange,
+ );
+ // Models for components within a page will be disposed by the page's model,
+ // so we don't want the component widget to dispose them until the page is
+ // itself disposed.
+ model.disposeOnWidgetDisposal = false;
+ // Wrap in a Provider so that the model can be accessed by the component.
+ return Provider.value(
+ value: model,
+ child: child,
+ );
+}
+
+T createModel(
+ BuildContext context,
+ T Function() defaultBuilder,
+) {
+ final model = context.read() ?? defaultBuilder();
+ model._init(context);
+ return model;
+}
+
+abstract class FlutterFlowModel {
+ // Initialization methods
+ bool _isInitialized = false;
+ void initState(BuildContext context);
+ void _init(BuildContext context) {
+ if (!_isInitialized) {
+ initState(context);
+ _isInitialized = true;
+ }
+ if (context.widget is W) _widget = context.widget as W;
+ }
+
+ // The widget associated with this model. This is useful for accessing the
+ // parameters of the widget, for example.
+ W? _widget;
+ W? get widget => _widget;
+
+ // Dispose methods
+ // Whether to dispose this model when the corresponding widget is
+ // disposed. By default this is true for pages and false for components,
+ // as page/component models handle the disposal of their children.
+ bool disposeOnWidgetDisposal = true;
+ void dispose();
+ void maybeDispose() {
+ if (disposeOnWidgetDisposal) {
+ dispose();
+ }
+ // Remove reference to widget for garbage collection purposes.
+ _widget = null;
+ }
+
+ // Whether to update the containing page / component on updates.
+ bool updateOnChange = false;
+ // Function to call when the model receives an update.
+ VoidCallback _updateCallback = () {};
+ void onUpdate() => updateOnChange ? _updateCallback() : () {};
+ FlutterFlowModel setOnUpdate({
+ bool updateOnChange = false,
+ required VoidCallback onUpdate,
+ }) =>
+ this
+ .._updateCallback = onUpdate
+ ..updateOnChange = updateOnChange;
+ // Update the containing page when this model received an update.
+ void updatePage(VoidCallback callback) {
+ callback();
+ _updateCallback();
+ }
+}
+
+class FlutterFlowDynamicModels {
+ FlutterFlowDynamicModels(this.defaultBuilder);
+
+ final T Function() defaultBuilder;
+ final Map _childrenModels = {};
+ final Map _childrenIndexes = {};
+ Set? _activeKeys;
+
+ T getModel(String uniqueKey, int index) {
+ _updateActiveKeys(uniqueKey);
+ _childrenIndexes[uniqueKey] = index;
+ return _childrenModels[uniqueKey] ??= defaultBuilder();
+ }
+
+ List getValues(S? Function(T) getValue) {
+ return _childrenIndexes.entries
+ // Sort keys by index.
+ .sorted((a, b) => a.value.compareTo(b.value))
+ .where((e) => _childrenModels[e.key] != null)
+ // Map each model to the desired value and return as list. In order
+ // to preserve index order, rather than removing null values we provide
+ // default values (for types with reasonable defaults).
+ .map((e) => getValue(_childrenModels[e.key]!) ?? _getDefaultValue()!)
+ .toList();
+ }
+
+ S? getValueAtIndex(int index, S? Function(T) getValue) {
+ final uniqueKey =
+ _childrenIndexes.entries.firstWhereOrNull((e) => e.value == index)?.key;
+ return getValueForKey(uniqueKey, getValue);
+ }
+
+ S? getValueForKey(String? uniqueKey, S? Function(T) getValue) {
+ final model = _childrenModels[uniqueKey];
+ return model != null ? getValue(model) : null;
+ }
+
+ void dispose() => _childrenModels.values.forEach((model) => model.dispose());
+
+ void _updateActiveKeys(String uniqueKey) {
+ final shouldResetActiveKeys = _activeKeys == null;
+ _activeKeys ??= {};
+ _activeKeys!.add(uniqueKey);
+
+ if (shouldResetActiveKeys) {
+ // Add a post-frame callback to remove and dispose of unused models after
+ // we're done building, then reset `_activeKeys` to null so we know to do
+ // this again next build.
+ SchedulerBinding.instance.addPostFrameCallback((_) {
+ _childrenIndexes.removeWhere((k, _) => !_activeKeys!.contains(k));
+ _childrenModels.keys
+ .toSet()
+ .difference(_activeKeys!)
+ // Remove and dispose of unused models since they are not being used
+ // elsewhere and would not otherwise be disposed.
+ .forEach((k) => _childrenModels.remove(k)?.maybeDispose());
+ _activeKeys = null;
+ });
+ }
+ }
+}
+
+T? _getDefaultValue() {
+ switch (T) {
+ case int:
+ return 0 as T;
+ case double:
+ return 0.0 as T;
+ case String:
+ return '' as T;
+ case bool:
+ return false as T;
+ default:
+ return null as T;
+ }
+}
+
+extension TextValidationExtensions on String? Function(BuildContext, String?)? {
+ String? Function(String?)? asValidator(BuildContext context) =>
+ this != null ? (val) => this!(context, val) : null;
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_theme.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_theme.dart
new file mode 100755
index 0000000..6bb4cbe
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_theme.dart
@@ -0,0 +1,353 @@
+// ignore_for_file: overridden_fields, annotate_overrides
+
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+
+import 'package:shared_preferences/shared_preferences.dart';
+
+const kThemeModeKey = '__theme_mode__';
+SharedPreferences? _prefs;
+
+abstract class FlutterFlowTheme {
+ static Future initialize() async =>
+ _prefs = await SharedPreferences.getInstance();
+ static ThemeMode get themeMode {
+ final darkMode = _prefs?.getBool(kThemeModeKey);
+ return darkMode == null
+ ? ThemeMode.system
+ : darkMode
+ ? ThemeMode.dark
+ : ThemeMode.light;
+ }
+
+ static void saveThemeMode(ThemeMode mode) => mode == ThemeMode.system
+ ? _prefs?.remove(kThemeModeKey)
+ : _prefs?.setBool(kThemeModeKey, mode == ThemeMode.dark);
+
+ static FlutterFlowTheme of(BuildContext context) {
+ return Theme.of(context).brightness == Brightness.dark
+ ? DarkModeTheme()
+ : LightModeTheme();
+ }
+
+ @Deprecated('Use primary instead')
+ Color get primaryColor => primary;
+ @Deprecated('Use secondary instead')
+ Color get secondaryColor => secondary;
+ @Deprecated('Use tertiary instead')
+ Color get tertiaryColor => tertiary;
+
+ late Color primary;
+ late Color secondary;
+ late Color tertiary;
+ late Color alternate;
+ late Color primaryText;
+ late Color secondaryText;
+ late Color primaryBackground;
+ late Color secondaryBackground;
+ late Color accent1;
+ late Color accent2;
+ late Color accent3;
+ late Color accent4;
+ late Color success;
+ late Color warning;
+ late Color error;
+ late Color info;
+
+ @Deprecated('Use displaySmallFamily instead')
+ String get title1Family => displaySmallFamily;
+ @Deprecated('Use displaySmall instead')
+ TextStyle get title1 => typography.displaySmall;
+ @Deprecated('Use headlineMediumFamily instead')
+ String get title2Family => typography.headlineMediumFamily;
+ @Deprecated('Use headlineMedium instead')
+ TextStyle get title2 => typography.headlineMedium;
+ @Deprecated('Use headlineSmallFamily instead')
+ String get title3Family => typography.headlineSmallFamily;
+ @Deprecated('Use headlineSmall instead')
+ TextStyle get title3 => typography.headlineSmall;
+ @Deprecated('Use titleMediumFamily instead')
+ String get subtitle1Family => typography.titleMediumFamily;
+ @Deprecated('Use titleMedium instead')
+ TextStyle get subtitle1 => typography.titleMedium;
+ @Deprecated('Use titleSmallFamily instead')
+ String get subtitle2Family => typography.titleSmallFamily;
+ @Deprecated('Use titleSmall instead')
+ TextStyle get subtitle2 => typography.titleSmall;
+ @Deprecated('Use bodyMediumFamily instead')
+ String get bodyText1Family => typography.bodyMediumFamily;
+ @Deprecated('Use bodyMedium instead')
+ TextStyle get bodyText1 => typography.bodyMedium;
+ @Deprecated('Use bodySmallFamily instead')
+ String get bodyText2Family => typography.bodySmallFamily;
+ @Deprecated('Use bodySmall instead')
+ TextStyle get bodyText2 => typography.bodySmall;
+
+ String get displayLargeFamily => typography.displayLargeFamily;
+ TextStyle get displayLarge => typography.displayLarge;
+ String get displayMediumFamily => typography.displayMediumFamily;
+ TextStyle get displayMedium => typography.displayMedium;
+ String get displaySmallFamily => typography.displaySmallFamily;
+ TextStyle get displaySmall => typography.displaySmall;
+ String get headlineLargeFamily => typography.headlineLargeFamily;
+ TextStyle get headlineLarge => typography.headlineLarge;
+ String get headlineMediumFamily => typography.headlineMediumFamily;
+ TextStyle get headlineMedium => typography.headlineMedium;
+ String get headlineSmallFamily => typography.headlineSmallFamily;
+ TextStyle get headlineSmall => typography.headlineSmall;
+ String get titleLargeFamily => typography.titleLargeFamily;
+ TextStyle get titleLarge => typography.titleLarge;
+ String get titleMediumFamily => typography.titleMediumFamily;
+ TextStyle get titleMedium => typography.titleMedium;
+ String get titleSmallFamily => typography.titleSmallFamily;
+ TextStyle get titleSmall => typography.titleSmall;
+ String get labelLargeFamily => typography.labelLargeFamily;
+ TextStyle get labelLarge => typography.labelLarge;
+ String get labelMediumFamily => typography.labelMediumFamily;
+ TextStyle get labelMedium => typography.labelMedium;
+ String get labelSmallFamily => typography.labelSmallFamily;
+ TextStyle get labelSmall => typography.labelSmall;
+ String get bodyLargeFamily => typography.bodyLargeFamily;
+ TextStyle get bodyLarge => typography.bodyLarge;
+ String get bodyMediumFamily => typography.bodyMediumFamily;
+ TextStyle get bodyMedium => typography.bodyMedium;
+ String get bodySmallFamily => typography.bodySmallFamily;
+ TextStyle get bodySmall => typography.bodySmall;
+
+ Typography get typography => ThemeTypography(this);
+}
+
+class LightModeTheme extends FlutterFlowTheme {
+ @Deprecated('Use primary instead')
+ Color get primaryColor => primary;
+ @Deprecated('Use secondary instead')
+ Color get secondaryColor => secondary;
+ @Deprecated('Use tertiary instead')
+ Color get tertiaryColor => tertiary;
+
+ late Color primary = const Color(0xFF4B39EF);
+ late Color secondary = const Color(0xFF39D2C0);
+ late Color tertiary = const Color(0xFFEE8B60);
+ late Color alternate = const Color(0xFFE0E3E7);
+ late Color primaryText = const Color(0xFF14181B);
+ late Color secondaryText = const Color(0xFF57636C);
+ late Color primaryBackground = const Color(0xFFF1F4F8);
+ late Color secondaryBackground = const Color(0xFFFFFFFF);
+ late Color accent1 = const Color(0x4C4B39EF);
+ late Color accent2 = const Color(0x4D39D2C0);
+ late Color accent3 = const Color(0x4DEE8B60);
+ late Color accent4 = const Color(0xCCFFFFFF);
+ late Color success = const Color(0xFF249689);
+ late Color warning = const Color(0xFFF9CF58);
+ late Color error = const Color(0xFFFF5963);
+ late Color info = const Color(0xFFFFFFFF);
+}
+
+abstract class Typography {
+ String get displayLargeFamily;
+ TextStyle get displayLarge;
+ String get displayMediumFamily;
+ TextStyle get displayMedium;
+ String get displaySmallFamily;
+ TextStyle get displaySmall;
+ String get headlineLargeFamily;
+ TextStyle get headlineLarge;
+ String get headlineMediumFamily;
+ TextStyle get headlineMedium;
+ String get headlineSmallFamily;
+ TextStyle get headlineSmall;
+ String get titleLargeFamily;
+ TextStyle get titleLarge;
+ String get titleMediumFamily;
+ TextStyle get titleMedium;
+ String get titleSmallFamily;
+ TextStyle get titleSmall;
+ String get labelLargeFamily;
+ TextStyle get labelLarge;
+ String get labelMediumFamily;
+ TextStyle get labelMedium;
+ String get labelSmallFamily;
+ TextStyle get labelSmall;
+ String get bodyLargeFamily;
+ TextStyle get bodyLarge;
+ String get bodyMediumFamily;
+ TextStyle get bodyMedium;
+ String get bodySmallFamily;
+ TextStyle get bodySmall;
+}
+
+class ThemeTypography extends Typography {
+ ThemeTypography(this.theme);
+
+ final FlutterFlowTheme theme;
+
+ String get displayLargeFamily => 'Inter Tight';
+ TextStyle get displayLarge => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 64.0,
+ );
+ String get displayMediumFamily => 'Inter Tight';
+ TextStyle get displayMedium => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 44.0,
+ );
+ String get displaySmallFamily => 'Inter Tight';
+ TextStyle get displaySmall => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 36.0,
+ );
+ String get headlineLargeFamily => 'Inter Tight';
+ TextStyle get headlineLarge => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 32.0,
+ );
+ String get headlineMediumFamily => 'Inter Tight';
+ TextStyle get headlineMedium => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 28.0,
+ );
+ String get headlineSmallFamily => 'Inter Tight';
+ TextStyle get headlineSmall => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 24.0,
+ );
+ String get titleLargeFamily => 'Inter Tight';
+ TextStyle get titleLarge => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 20.0,
+ );
+ String get titleMediumFamily => 'Inter Tight';
+ TextStyle get titleMedium => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 18.0,
+ );
+ String get titleSmallFamily => 'Inter Tight';
+ TextStyle get titleSmall => GoogleFonts.getFont(
+ 'Inter Tight',
+ color: theme.primaryText,
+ fontWeight: FontWeight.w600,
+ fontSize: 16.0,
+ );
+ String get labelLargeFamily => 'Inter';
+ TextStyle get labelLarge => GoogleFonts.getFont(
+ 'Inter',
+ color: theme.secondaryText,
+ fontWeight: FontWeight.normal,
+ fontSize: 16.0,
+ );
+ String get labelMediumFamily => 'Inter';
+ TextStyle get labelMedium => GoogleFonts.getFont(
+ 'Inter',
+ color: theme.secondaryText,
+ fontWeight: FontWeight.normal,
+ fontSize: 14.0,
+ );
+ String get labelSmallFamily => 'Inter';
+ TextStyle get labelSmall => GoogleFonts.getFont(
+ 'Inter',
+ color: theme.secondaryText,
+ fontWeight: FontWeight.normal,
+ fontSize: 12.0,
+ );
+ String get bodyLargeFamily => 'Inter';
+ TextStyle get bodyLarge => GoogleFonts.getFont(
+ 'Inter',
+ color: theme.primaryText,
+ fontWeight: FontWeight.normal,
+ fontSize: 16.0,
+ );
+ String get bodyMediumFamily => 'Inter';
+ TextStyle get bodyMedium => GoogleFonts.getFont(
+ 'Inter',
+ color: theme.primaryText,
+ fontWeight: FontWeight.normal,
+ fontSize: 14.0,
+ );
+ String get bodySmallFamily => 'Inter';
+ TextStyle get bodySmall => GoogleFonts.getFont(
+ 'Inter',
+ color: theme.primaryText,
+ fontWeight: FontWeight.normal,
+ fontSize: 12.0,
+ );
+}
+
+class DarkModeTheme extends FlutterFlowTheme {
+ @Deprecated('Use primary instead')
+ Color get primaryColor => primary;
+ @Deprecated('Use secondary instead')
+ Color get secondaryColor => secondary;
+ @Deprecated('Use tertiary instead')
+ Color get tertiaryColor => tertiary;
+
+ late Color primary = const Color(0xFF4B39EF);
+ late Color secondary = const Color(0xFF39D2C0);
+ late Color tertiary = const Color(0xFFEE8B60);
+ late Color alternate = const Color(0xFF262D34);
+ late Color primaryText = const Color(0xFFFFFFFF);
+ late Color secondaryText = const Color(0xFF95A1AC);
+ late Color primaryBackground = const Color(0xFF1D2428);
+ late Color secondaryBackground = const Color(0xFF14181B);
+ late Color accent1 = const Color(0x4C4B39EF);
+ late Color accent2 = const Color(0x4D39D2C0);
+ late Color accent3 = const Color(0x4DEE8B60);
+ late Color accent4 = const Color(0xB2262D34);
+ late Color success = const Color(0xFF249689);
+ late Color warning = const Color(0xFFF9CF58);
+ late Color error = const Color(0xFFFF5963);
+ late Color info = const Color(0xFFFFFFFF);
+}
+
+extension TextStyleHelper on TextStyle {
+ TextStyle override({
+ String? fontFamily,
+ Color? color,
+ double? fontSize,
+ FontWeight? fontWeight,
+ double? letterSpacing,
+ FontStyle? fontStyle,
+ bool useGoogleFonts = true,
+ TextDecoration? decoration,
+ double? lineHeight,
+ List? shadows,
+ }) =>
+ useGoogleFonts
+ ? GoogleFonts.getFont(
+ fontFamily!,
+ color: color ?? this.color,
+ fontSize: fontSize ?? this.fontSize,
+ letterSpacing: letterSpacing ?? this.letterSpacing,
+ fontWeight: fontWeight ?? this.fontWeight,
+ fontStyle: fontStyle ?? this.fontStyle,
+ decoration: decoration,
+ height: lineHeight,
+ shadows: shadows,
+ )
+ : copyWith(
+ fontFamily: fontFamily,
+ color: color,
+ fontSize: fontSize,
+ letterSpacing: letterSpacing,
+ fontWeight: fontWeight,
+ fontStyle: fontStyle,
+ decoration: decoration,
+ height: lineHeight,
+ shadows: shadows,
+ );
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_util.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_util.dart
new file mode 100755
index 0000000..7728c0f
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_util.dart
@@ -0,0 +1,427 @@
+import 'dart:io';
+
+import 'package:flutter/foundation.dart' show kIsWeb;
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:collection/collection.dart';
+import 'package:from_css_color/from_css_color.dart';
+import 'dart:math' show pow, pi, sin;
+import 'package:intl/intl.dart';
+import 'package:json_path/json_path.dart';
+import 'package:timeago/timeago.dart' as timeago;
+import 'package:url_launcher/url_launcher.dart';
+
+import '../main.dart';
+
+import 'lat_lng.dart';
+
+export 'lat_lng.dart';
+export 'place.dart';
+export 'uploaded_file.dart';
+export 'flutter_flow_model.dart';
+export 'dart:math' show min, max;
+export 'dart:typed_data' show Uint8List;
+export 'dart:convert' show jsonEncode, jsonDecode;
+export 'package:intl/intl.dart';
+export 'package:page_transition/page_transition.dart';
+export 'nav/nav.dart';
+
+T valueOrDefault(T? value, T defaultValue) =>
+ (value is String && value.isEmpty) || value == null ? defaultValue : value;
+
+String dateTimeFormat(String format, DateTime? dateTime, {String? locale}) {
+ if (dateTime == null) {
+ return '';
+ }
+ if (format == 'relative') {
+ return timeago.format(dateTime, locale: locale, allowFromNow: true);
+ }
+ return DateFormat(format, locale).format(dateTime);
+}
+
+Future launchURL(String url) async {
+ var uri = Uri.parse(url);
+ try {
+ await launchUrl(uri);
+ } catch (e) {
+ throw 'Could not launch $uri: $e';
+ }
+}
+
+Color colorFromCssString(String color, {Color? defaultColor}) {
+ try {
+ return fromCssColor(color);
+ } catch (_) {}
+ return defaultColor ?? Colors.black;
+}
+
+enum FormatType {
+ decimal,
+ percent,
+ scientific,
+ compact,
+ compactLong,
+ custom,
+}
+
+enum DecimalType {
+ automatic,
+ periodDecimal,
+ commaDecimal,
+}
+
+String formatNumber(
+ num? value, {
+ required FormatType formatType,
+ DecimalType? decimalType,
+ String? currency,
+ bool toLowerCase = false,
+ String? format,
+ String? locale,
+}) {
+ if (value == null) {
+ return '';
+ }
+ var formattedValue = '';
+ switch (formatType) {
+ case FormatType.decimal:
+ switch (decimalType!) {
+ case DecimalType.automatic:
+ formattedValue = NumberFormat.decimalPattern().format(value);
+ break;
+ case DecimalType.periodDecimal:
+ if (currency != null) {
+ formattedValue = NumberFormat('#,##0.00', 'en_US').format(value);
+ } else {
+ formattedValue = NumberFormat.decimalPattern('en_US').format(value);
+ }
+ break;
+ case DecimalType.commaDecimal:
+ if (currency != null) {
+ formattedValue = NumberFormat('#,##0.00', 'es_PA').format(value);
+ } else {
+ formattedValue = NumberFormat.decimalPattern('es_PA').format(value);
+ }
+ break;
+ }
+ break;
+ case FormatType.percent:
+ formattedValue = NumberFormat.percentPattern().format(value);
+ break;
+ case FormatType.scientific:
+ formattedValue = NumberFormat.scientificPattern().format(value);
+ if (toLowerCase) {
+ formattedValue = formattedValue.toLowerCase();
+ }
+ break;
+ case FormatType.compact:
+ formattedValue = NumberFormat.compact().format(value);
+ break;
+ case FormatType.compactLong:
+ formattedValue = NumberFormat.compactLong().format(value);
+ break;
+ case FormatType.custom:
+ final hasLocale = locale != null && locale.isNotEmpty;
+ formattedValue =
+ NumberFormat(format, hasLocale ? locale : null).format(value);
+ }
+
+ if (formattedValue.isEmpty) {
+ return value.toString();
+ }
+
+ if (currency != null) {
+ final currencySymbol = currency.isNotEmpty
+ ? currency
+ : NumberFormat.simpleCurrency().format(0.0).substring(0, 1);
+ formattedValue = '$currencySymbol$formattedValue';
+ }
+
+ return formattedValue;
+}
+
+DateTime get getCurrentTimestamp => DateTime.now();
+DateTime dateTimeFromSecondsSinceEpoch(int seconds) {
+ return DateTime.fromMillisecondsSinceEpoch(seconds * 1000);
+}
+
+extension DateTimeConversionExtension on DateTime {
+ int get secondsSinceEpoch => (millisecondsSinceEpoch / 1000).round();
+}
+
+extension DateTimeComparisonOperators on DateTime {
+ bool operator <(DateTime other) => isBefore(other);
+ bool operator >(DateTime other) => isAfter(other);
+ bool operator <=(DateTime other) => this < other || isAtSameMomentAs(other);
+ bool operator >=(DateTime other) => this > other || isAtSameMomentAs(other);
+}
+
+T? castToType(dynamic value) {
+ if (value == null) {
+ return null;
+ }
+ switch (T) {
+ case double:
+ // Doubles may be stored as ints in some cases.
+ return value.toDouble() as T;
+ case int:
+ // Likewise, ints may be stored as doubles. If this is the case
+ // (i.e. no decimal value), return the value as an int.
+ if (value is num && value.toInt() == value) {
+ return value.toInt() as T;
+ }
+ break;
+ default:
+ break;
+ }
+ return value as T;
+}
+
+dynamic getJsonField(
+ dynamic response,
+ String jsonPath, [
+ bool isForList = false,
+]) {
+ final field = JsonPath(jsonPath).read(response);
+ if (field.isEmpty) {
+ return null;
+ }
+ if (field.length > 1) {
+ return field.map((f) => f.value).toList();
+ }
+ final value = field.first.value;
+ if (isForList) {
+ return value is! Iterable
+ ? [value]
+ : (value is List ? value : value.toList());
+ }
+ return value;
+}
+
+Rect? getWidgetBoundingBox(BuildContext context) {
+ try {
+ final renderBox = context.findRenderObject() as RenderBox?;
+ return renderBox!.localToGlobal(Offset.zero) & renderBox.size;
+ } catch (_) {
+ return null;
+ }
+}
+
+bool get isAndroid => !kIsWeb && Platform.isAndroid;
+bool get isiOS => !kIsWeb && Platform.isIOS;
+bool get isWeb => kIsWeb;
+
+const kBreakpointSmall = 479.0;
+const kBreakpointMedium = 767.0;
+const kBreakpointLarge = 991.0;
+bool isMobileWidth(BuildContext context) =>
+ MediaQuery.sizeOf(context).width < kBreakpointSmall;
+bool responsiveVisibility({
+ required BuildContext context,
+ bool phone = true,
+ bool tablet = true,
+ bool tabletLandscape = true,
+ bool desktop = true,
+}) {
+ final width = MediaQuery.sizeOf(context).width;
+ if (width < kBreakpointSmall) {
+ return phone;
+ } else if (width < kBreakpointMedium) {
+ return tablet;
+ } else if (width < kBreakpointLarge) {
+ return tabletLandscape;
+ } else {
+ return desktop;
+ }
+}
+
+const kTextValidatorUsernameRegex = r'^[a-zA-Z][a-zA-Z0-9_-]{2,16}$';
+// https://stackoverflow.com/a/201378
+const kTextValidatorEmailRegex =
+ "^(?:[a-zA-Z0-9!#\$%&\'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#\$%&\'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])\$";
+const kTextValidatorWebsiteRegex =
+ r'(https?:\/\/)?(www\.)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,10}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)|(https?:\/\/)?(www\.)?(?!ww)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,10}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)';
+
+extension FFTextEditingControllerExt on TextEditingController? {
+ String get text => this == null ? '' : this!.text;
+ set text(String newText) => this?.text = newText;
+}
+
+extension IterableExt on Iterable {
+ List sortedList(
+ {S Function(T)? keyOf, bool desc = false}) {
+ final sortedAscending = toList()
+ ..sort(keyOf == null ? null : ((a, b) => keyOf(a).compareTo(keyOf(b))));
+ if (desc) {
+ return sortedAscending.reversed.toList();
+ }
+ return sortedAscending;
+ }
+
+ List mapIndexed(S Function(int, T) func) => toList()
+ .asMap()
+ .map((index, value) => MapEntry(index, func(index, value)))
+ .values
+ .toList();
+}
+
+void setDarkModeSetting(BuildContext context, ThemeMode themeMode) =>
+ MyApp.of(context).setThemeMode(themeMode);
+
+void showSnackbar(
+ BuildContext context,
+ String message, {
+ bool loading = false,
+ int duration = 4,
+}) {
+ ScaffoldMessenger.of(context).hideCurrentSnackBar();
+ ScaffoldMessenger.of(context).showSnackBar(
+ SnackBar(
+ content: Row(
+ children: [
+ if (loading)
+ Padding(
+ padding: EdgeInsetsDirectional.only(end: 10.0),
+ child: Container(
+ height: 20,
+ width: 20,
+ child: const CircularProgressIndicator(
+ color: Colors.white,
+ ),
+ ),
+ ),
+ Text(message),
+ ],
+ ),
+ duration: Duration(seconds: duration),
+ ),
+ );
+}
+
+extension FFStringExt on String {
+ String maybeHandleOverflow({int? maxChars, String replacement = ''}) =>
+ maxChars != null && length > maxChars
+ ? replaceRange(maxChars, null, replacement)
+ : this;
+}
+
+extension ListFilterExt on Iterable {
+ List get withoutNulls => where((s) => s != null).map((e) => e!).toList();
+}
+
+extension MapFilterExtensions on Map {
+ Map get withoutNulls => Map.fromEntries(
+ entries
+ .where((e) => e.value != null)
+ .map((e) => MapEntry(e.key, e.value as T)),
+ );
+}
+
+extension MapListContainsExt on List {
+ bool containsMap(dynamic map) => map is Map
+ ? any((e) => e is Map && const DeepCollectionEquality().equals(e, map))
+ : contains(map);
+}
+
+extension ListDivideExt on Iterable {
+ Iterable> get enumerate => toList().asMap().entries;
+
+ List divide(Widget t, {bool Function(int)? filterFn}) => isEmpty
+ ? []
+ : (enumerate
+ .map((e) => [e.value, if (filterFn == null || filterFn(e.key)) t])
+ .expand((i) => i)
+ .toList()
+ ..removeLast());
+
+ List around(Widget t) => addToStart(t).addToEnd(t);
+
+ List addToStart(Widget t) =>
+ enumerate.map((e) => e.value).toList()..insert(0, t);
+
+ List addToEnd(Widget t) =>
+ enumerate.map((e) => e.value).toList()..add(t);
+
+ List paddingTopEach(double val) =>
+ map((w) => Padding(padding: EdgeInsets.only(top: val), child: w))
+ .toList();
+}
+
+extension StatefulWidgetExtensions on State {
+ /// Check if the widget exist before safely setting state.
+ void safeSetState(VoidCallback fn) {
+ if (mounted) {
+ // ignore: invalid_use_of_protected_member
+ setState(fn);
+ }
+ }
+}
+
+// For iOS 16 and below, set the status bar color to match the app's theme.
+// https://github.com/flutter/flutter/issues/41067
+Brightness? _lastBrightness;
+void fixStatusBarOniOS16AndBelow(BuildContext context) {
+ if (!isiOS) {
+ return;
+ }
+ final brightness = Theme.of(context).brightness;
+ if (_lastBrightness != brightness) {
+ _lastBrightness = brightness;
+ SystemChrome.setSystemUIOverlayStyle(
+ SystemUiOverlayStyle(
+ statusBarBrightness: brightness,
+ systemStatusBarContrastEnforced: true,
+ ),
+ );
+ }
+}
+
+extension ListUniqueExt on Iterable {
+ List unique(dynamic Function(T) getKey) {
+ var distinctSet = {};
+ var distinctList = [];
+ for (var item in this) {
+ if (distinctSet.add(getKey(item))) {
+ distinctList.add(item);
+ }
+ }
+ return distinctList;
+ }
+}
+
+String roundTo(double value, int decimalPoints) {
+ final power = pow(10, decimalPoints);
+ return ((value * power).round() / power).toString();
+}
+
+double computeGradientAlignmentX(double evaluatedAngle) {
+ evaluatedAngle %= 360;
+ final rads = evaluatedAngle * pi / 180;
+ double x;
+ if (evaluatedAngle < 45 || evaluatedAngle > 315) {
+ x = sin(2 * rads);
+ } else if (45 <= evaluatedAngle && evaluatedAngle <= 135) {
+ x = 1;
+ } else if (135 <= evaluatedAngle && evaluatedAngle <= 225) {
+ x = sin(-2 * rads);
+ } else {
+ x = -1;
+ }
+ return double.parse(roundTo(x, 2));
+}
+
+double computeGradientAlignmentY(double evaluatedAngle) {
+ evaluatedAngle %= 360;
+ final rads = evaluatedAngle * pi / 180;
+ double y;
+ if (evaluatedAngle < 45 || evaluatedAngle > 315) {
+ y = -1;
+ } else if (45 <= evaluatedAngle && evaluatedAngle <= 135) {
+ y = sin(-2 * rads);
+ } else if (135 <= evaluatedAngle && evaluatedAngle <= 225) {
+ y = 1;
+ } else {
+ y = sin(2 * rads);
+ }
+ return double.parse(roundTo(y, 2));
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_web_view.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_web_view.dart
new file mode 100755
index 0000000..e9a76da
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_web_view.dart
@@ -0,0 +1,119 @@
+import 'dart:io';
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/gestures.dart';
+import 'package:flutter/material.dart';
+import 'package:webview_flutter/webview_flutter.dart' hide NavigationDecision;
+import 'package:webview_flutter_android/webview_flutter_android.dart';
+import 'package:webviewx_plus/webviewx_plus.dart';
+import 'package:url_launcher/url_launcher.dart';
+import 'package:file_picker/file_picker.dart';
+
+import 'flutter_flow_util.dart';
+
+class FlutterFlowWebView extends StatefulWidget {
+ const FlutterFlowWebView({
+ Key? key,
+ required this.content,
+ this.width,
+ this.height,
+ this.bypass = false,
+ this.horizontalScroll = false,
+ this.verticalScroll = false,
+ this.html = false,
+ }) : super(key: key);
+
+ final String content;
+ final double? height;
+ final double? width;
+ final bool bypass;
+ final bool horizontalScroll;
+ final bool verticalScroll;
+ final bool html;
+
+ @override
+ _FlutterFlowWebViewState createState() => _FlutterFlowWebViewState();
+}
+
+class _FlutterFlowWebViewState extends State {
+ @override
+ Widget build(BuildContext context) => WebViewX(
+ key: webviewKey,
+ width: widget.width ?? MediaQuery.sizeOf(context).width,
+ height: widget.height ?? MediaQuery.sizeOf(context).height,
+ ignoreAllGestures: false,
+ initialContent: widget.content,
+ initialMediaPlaybackPolicy:
+ AutoMediaPlaybackPolicy.requireUserActionForAllMediaTypes,
+ initialSourceType: widget.html
+ ? SourceType.html
+ : widget.bypass
+ ? SourceType.urlBypass
+ : SourceType.url,
+ javascriptMode: JavascriptMode.unrestricted,
+ onWebViewCreated: (controller) async {
+ if (controller.connector is WebViewController && isAndroid) {
+ final androidController =
+ controller.connector.platform as AndroidWebViewController;
+ await androidController.setOnShowFileSelector(_androidFilePicker);
+ }
+ },
+ navigationDelegate: (request) async {
+ if (isAndroid) {
+ if (request.content.source
+ .startsWith('https://api.whatsapp.com/send?phone')) {
+ String url = request.content.source;
+
+ await launchUrl(
+ Uri.parse(url),
+ mode: LaunchMode.externalApplication,
+ );
+ return NavigationDecision.prevent;
+ }
+ }
+ return NavigationDecision.navigate;
+ },
+ webSpecificParams: const WebSpecificParams(
+ webAllowFullscreenContent: true,
+ ),
+ mobileSpecificParams: MobileSpecificParams(
+ debuggingEnabled: false,
+ gestureNavigationEnabled: true,
+ mobileGestureRecognizers: {
+ if (widget.verticalScroll)
+ Factory(
+ () => VerticalDragGestureRecognizer(),
+ ),
+ if (widget.horizontalScroll)
+ Factory(
+ () => HorizontalDragGestureRecognizer(),
+ ),
+ },
+ androidEnableHybridComposition: true,
+ ),
+ );
+
+ Key get webviewKey => Key(
+ [
+ widget.content,
+ widget.width,
+ widget.height,
+ widget.bypass,
+ widget.horizontalScroll,
+ widget.verticalScroll,
+ widget.html,
+ ].map((s) => s?.toString() ?? '').join(),
+ );
+
+ Future> _androidFilePicker(
+ final FileSelectorParams params,
+ ) async {
+ final result = await FilePicker.platform.pickFiles();
+
+ if (result != null && result.files.single.path != null) {
+ final file = File(result.files.single.path!);
+ return [file.uri.toString()];
+ }
+ return [];
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/flutter_flow_widgets.dart b/Application Product/Source/source/lib/flutter_flow/flutter_flow_widgets.dart
new file mode 100755
index 0000000..64401b5
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/flutter_flow_widgets.dart
@@ -0,0 +1,288 @@
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_size_text/auto_size_text.dart';
+
+class FFButtonOptions {
+ const FFButtonOptions({
+ this.textAlign,
+ this.textStyle,
+ this.elevation,
+ this.height,
+ this.width,
+ this.padding,
+ this.color,
+ this.disabledColor,
+ this.disabledTextColor,
+ this.splashColor,
+ this.iconSize,
+ this.iconColor,
+ this.iconPadding,
+ this.borderRadius,
+ this.borderSide,
+ this.hoverColor,
+ this.hoverBorderSide,
+ this.hoverTextColor,
+ this.hoverElevation,
+ this.maxLines,
+ });
+
+ final TextAlign? textAlign;
+ final TextStyle? textStyle;
+ final double? elevation;
+ final double? height;
+ final double? width;
+ final EdgeInsetsGeometry? padding;
+ final Color? color;
+ final Color? disabledColor;
+ final Color? disabledTextColor;
+ final int? maxLines;
+ final Color? splashColor;
+ final double? iconSize;
+ final Color? iconColor;
+ final EdgeInsetsGeometry? iconPadding;
+ final BorderRadius? borderRadius;
+ final BorderSide? borderSide;
+ final Color? hoverColor;
+ final BorderSide? hoverBorderSide;
+ final Color? hoverTextColor;
+ final double? hoverElevation;
+}
+
+class FFButtonWidget extends StatefulWidget {
+ const FFButtonWidget({
+ super.key,
+ required this.text,
+ required this.onPressed,
+ this.icon,
+ this.iconData,
+ required this.options,
+ this.showLoadingIndicator = true,
+ });
+
+ final String text;
+ final Widget? icon;
+ final IconData? iconData;
+ final Function()? onPressed;
+ final FFButtonOptions options;
+ final bool showLoadingIndicator;
+
+ @override
+ State createState() => _FFButtonWidgetState();
+}
+
+class _FFButtonWidgetState extends State {
+ bool loading = false;
+
+ int get maxLines => widget.options.maxLines ?? 1;
+ String? get text =>
+ widget.options.textStyle?.fontSize == 0 ? null : widget.text;
+
+ @override
+ Widget build(BuildContext context) {
+ Widget textWidget = loading
+ ? SizedBox(
+ width: widget.options.width == null
+ ? _getTextWidth(text, widget.options.textStyle, maxLines)
+ : null,
+ child: Center(
+ child: SizedBox(
+ width: 23,
+ height: 23,
+ child: CircularProgressIndicator(
+ valueColor: AlwaysStoppedAnimation(
+ widget.options.textStyle?.color ?? Colors.white,
+ ),
+ ),
+ ),
+ ),
+ )
+ : AutoSizeText(
+ text ?? '',
+ style:
+ text == null ? null : widget.options.textStyle?.withoutColor(),
+ textAlign: widget.options.textAlign,
+ maxLines: maxLines,
+ overflow: TextOverflow.ellipsis,
+ );
+
+ final onPressed = widget.onPressed != null
+ ? (widget.showLoadingIndicator
+ ? () async {
+ if (loading) {
+ return;
+ }
+ setState(() => loading = true);
+ try {
+ await widget.onPressed!();
+ } finally {
+ if (mounted) {
+ setState(() => loading = false);
+ }
+ }
+ }
+ : () => widget.onPressed!())
+ : null;
+
+ ButtonStyle style = ButtonStyle(
+ shape: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.hovered) &&
+ widget.options.hoverBorderSide != null) {
+ return RoundedRectangleBorder(
+ borderRadius:
+ widget.options.borderRadius ?? BorderRadius.circular(8),
+ side: widget.options.hoverBorderSide!,
+ );
+ }
+ return RoundedRectangleBorder(
+ borderRadius:
+ widget.options.borderRadius ?? BorderRadius.circular(8),
+ side: widget.options.borderSide ?? BorderSide.none,
+ );
+ },
+ ),
+ foregroundColor: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.disabled) &&
+ widget.options.disabledTextColor != null) {
+ return widget.options.disabledTextColor;
+ }
+ if (states.contains(MaterialState.hovered) &&
+ widget.options.hoverTextColor != null) {
+ return widget.options.hoverTextColor;
+ }
+ return widget.options.textStyle?.color ?? Colors.white;
+ },
+ ),
+ backgroundColor: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.disabled) &&
+ widget.options.disabledColor != null) {
+ return widget.options.disabledColor;
+ }
+ if (states.contains(MaterialState.hovered) &&
+ widget.options.hoverColor != null) {
+ return widget.options.hoverColor;
+ }
+ return widget.options.color;
+ },
+ ),
+ overlayColor: MaterialStateProperty.resolveWith((states) {
+ if (states.contains(MaterialState.pressed)) {
+ return widget.options.splashColor;
+ }
+ return widget.options.hoverColor == null ? null : Colors.transparent;
+ }),
+ padding: MaterialStateProperty.all(widget.options.padding ??
+ const EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0)),
+ elevation: MaterialStateProperty.resolveWith(
+ (states) {
+ if (states.contains(MaterialState.hovered) &&
+ widget.options.hoverElevation != null) {
+ return widget.options.hoverElevation!;
+ }
+ return widget.options.elevation ?? 2.0;
+ },
+ ),
+ );
+
+ if ((widget.icon != null || widget.iconData != null) && !loading) {
+ Widget icon = widget.icon ??
+ FaIcon(
+ widget.iconData!,
+ size: widget.options.iconSize,
+ color: widget.options.iconColor,
+ );
+
+ if (text == null) {
+ return Container(
+ height: widget.options.height,
+ width: widget.options.width,
+ decoration: BoxDecoration(
+ border: Border.fromBorderSide(
+ widget.options.borderSide ?? BorderSide.none,
+ ),
+ borderRadius:
+ widget.options.borderRadius ?? BorderRadius.circular(8),
+ ),
+ child: IconButton(
+ splashRadius: 1.0,
+ icon: Padding(
+ padding: widget.options.iconPadding ?? EdgeInsets.zero,
+ child: icon,
+ ),
+ onPressed: onPressed,
+ style: style,
+ ),
+ );
+ }
+ return SizedBox(
+ height: widget.options.height,
+ width: widget.options.width,
+ child: ElevatedButton.icon(
+ icon: Padding(
+ padding: widget.options.iconPadding ?? EdgeInsets.zero,
+ child: icon,
+ ),
+ label: textWidget,
+ onPressed: onPressed,
+ style: style,
+ ),
+ );
+ }
+
+ return SizedBox(
+ height: widget.options.height,
+ width: widget.options.width,
+ child: ElevatedButton(
+ onPressed: onPressed,
+ style: style,
+ child: textWidget,
+ ),
+ );
+ }
+}
+
+extension _WithoutColorExtension on TextStyle {
+ TextStyle withoutColor() => TextStyle(
+ inherit: inherit,
+ color: null,
+ backgroundColor: backgroundColor,
+ fontSize: fontSize,
+ fontWeight: fontWeight,
+ fontStyle: fontStyle,
+ letterSpacing: letterSpacing,
+ wordSpacing: wordSpacing,
+ textBaseline: textBaseline,
+ height: height,
+ leadingDistribution: leadingDistribution,
+ locale: locale,
+ foreground: foreground,
+ background: background,
+ shadows: shadows,
+ fontFeatures: fontFeatures,
+ decoration: decoration,
+ decorationColor: decorationColor,
+ decorationStyle: decorationStyle,
+ decorationThickness: decorationThickness,
+ debugLabel: debugLabel,
+ fontFamily: fontFamily,
+ fontFamilyFallback: fontFamilyFallback,
+ // The _package field is private so unfortunately we can't set it here,
+ // but it's almost always unset anyway.
+ // package: _package,
+ overflow: overflow,
+ );
+}
+
+// Slightly hacky method of getting the layout width of the provided text.
+double? _getTextWidth(String? text, TextStyle? style, int maxLines) =>
+ text != null
+ ? (TextPainter(
+ text: TextSpan(text: text, style: style),
+ textDirection: TextDirection.ltr,
+ maxLines: maxLines,
+ )..layout())
+ .size
+ .width
+ : null;
diff --git a/Application Product/Source/source/lib/flutter_flow/lat_lng.dart b/Application Product/Source/source/lib/flutter_flow/lat_lng.dart
new file mode 100755
index 0000000..9e7b8ea
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/lat_lng.dart
@@ -0,0 +1,19 @@
+class LatLng {
+ const LatLng(this.latitude, this.longitude);
+ final double latitude;
+ final double longitude;
+
+ @override
+ String toString() => 'LatLng(lat: $latitude, lng: $longitude)';
+
+ String serialize() => '$latitude,$longitude';
+
+ @override
+ int get hashCode => latitude.hashCode + longitude.hashCode;
+
+ @override
+ bool operator ==(other) =>
+ other is LatLng &&
+ latitude == other.latitude &&
+ longitude == other.longitude;
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/nav/nav.dart b/Application Product/Source/source/lib/flutter_flow/nav/nav.dart
new file mode 100755
index 0000000..763ba80
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/nav/nav.dart
@@ -0,0 +1,293 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:page_transition/page_transition.dart';
+import 'package:provider/provider.dart';
+
+import '/index.dart';
+import '/main.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/lat_lng.dart';
+import '/flutter_flow/place.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'serialization_util.dart';
+
+export 'package:go_router/go_router.dart';
+export 'serialization_util.dart';
+
+const kTransitionInfoKey = '__transition_info__';
+
+class AppStateNotifier extends ChangeNotifier {
+ AppStateNotifier._();
+
+ static AppStateNotifier? _instance;
+ static AppStateNotifier get instance => _instance ??= AppStateNotifier._();
+
+ bool showSplashImage = true;
+
+ void stopShowingSplashImage() {
+ showSplashImage = false;
+ notifyListeners();
+ }
+}
+
+GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
+ initialLocation: '/',
+ debugLogDiagnostics: true,
+ refreshListenable: appStateNotifier,
+ errorBuilder: (context, state) => appStateNotifier.showSplashImage
+ ? Builder(
+ builder: (context) => Container(
+ color: Colors.transparent,
+ child: Image.asset(
+ 'assets/images/Settings_(4).png',
+ fit: BoxFit.cover,
+ ),
+ ),
+ )
+ : NavBarPage(),
+ routes: [
+ FFRoute(
+ name: '_initialize',
+ path: '/',
+ builder: (context, _) => appStateNotifier.showSplashImage
+ ? Builder(
+ builder: (context) => Container(
+ color: Colors.transparent,
+ child: Image.asset(
+ 'assets/images/Settings_(4).png',
+ fit: BoxFit.cover,
+ ),
+ ),
+ )
+ : NavBarPage(),
+ ),
+ FFRoute(
+ name: 'HomePage',
+ path: '/homePage',
+ builder: (context, params) => params.isEmpty
+ ? NavBarPage(initialPage: 'HomePage')
+ : HomePageWidget(),
+ ),
+ FFRoute(
+ name: 'Analyst',
+ path: '/analyst',
+ builder: (context, params) => params.isEmpty
+ ? NavBarPage(initialPage: 'Analyst')
+ : AnalystWidget(),
+ ),
+ FFRoute(
+ name: 'Infomation',
+ path: '/infomation',
+ builder: (context, params) => params.isEmpty
+ ? NavBarPage(initialPage: 'Infomation')
+ : InfomationWidget(),
+ ),
+ FFRoute(
+ name: 'setting',
+ path: '/setting',
+ builder: (context, params) => params.isEmpty
+ ? NavBarPage(initialPage: 'setting')
+ : SettingWidget(),
+ ),
+ FFRoute(
+ name: 'NEWS',
+ path: '/news',
+ builder: (context, params) =>
+ params.isEmpty ? NavBarPage(initialPage: 'NEWS') : NewsWidget(),
+ )
+ ].map((r) => r.toRoute(appStateNotifier)).toList(),
+ );
+
+extension NavParamExtensions on Map {
+ Map get withoutNulls => Map.fromEntries(
+ entries
+ .where((e) => e.value != null)
+ .map((e) => MapEntry(e.key, e.value!)),
+ );
+}
+
+extension NavigationExtensions on BuildContext {
+ void safePop() {
+ // If there is only one route on the stack, navigate to the initial
+ // page instead of popping.
+ if (canPop()) {
+ pop();
+ } else {
+ go('/');
+ }
+ }
+}
+
+extension _GoRouterStateExtensions on GoRouterState {
+ Map get extraMap =>
+ extra != null ? extra as Map : {};
+ Map get allParams => {}
+ ..addAll(pathParameters)
+ ..addAll(uri.queryParameters)
+ ..addAll(extraMap);
+ TransitionInfo get transitionInfo => extraMap.containsKey(kTransitionInfoKey)
+ ? extraMap[kTransitionInfoKey] as TransitionInfo
+ : TransitionInfo.appDefault();
+}
+
+class FFParameters {
+ FFParameters(this.state, [this.asyncParams = const {}]);
+
+ final GoRouterState state;
+ final Map Function(String)> asyncParams;
+
+ Map futureParamValues = {};
+
+ // Parameters are empty if the params map is empty or if the only parameter
+ // present is the special extra parameter reserved for the transition info.
+ bool get isEmpty =>
+ state.allParams.isEmpty ||
+ (state.allParams.length == 1 &&
+ state.extraMap.containsKey(kTransitionInfoKey));
+ bool isAsyncParam(MapEntry param) =>
+ asyncParams.containsKey(param.key) && param.value is String;
+ bool get hasFutures => state.allParams.entries.any(isAsyncParam);
+ Future completeFutures() => Future.wait(
+ state.allParams.entries.where(isAsyncParam).map(
+ (param) async {
+ final doc = await asyncParams[param.key]!(param.value)
+ .onError((_, __) => null);
+ if (doc != null) {
+ futureParamValues[param.key] = doc;
+ return true;
+ }
+ return false;
+ },
+ ),
+ ).onError((_, __) => [false]).then((v) => v.every((e) => e));
+
+ dynamic getParam(
+ String paramName,
+ ParamType type, {
+ bool isList = false,
+ }) {
+ if (futureParamValues.containsKey(paramName)) {
+ return futureParamValues[paramName];
+ }
+ if (!state.allParams.containsKey(paramName)) {
+ return null;
+ }
+ final param = state.allParams[paramName];
+ // Got parameter from `extras`, so just directly return it.
+ if (param is! String) {
+ return param;
+ }
+ // Return serialized value.
+ return deserializeParam(
+ param,
+ type,
+ isList,
+ );
+ }
+}
+
+class FFRoute {
+ const FFRoute({
+ required this.name,
+ required this.path,
+ required this.builder,
+ this.requireAuth = false,
+ this.asyncParams = const {},
+ this.routes = const [],
+ });
+
+ final String name;
+ final String path;
+ final bool requireAuth;
+ final Map Function(String)> asyncParams;
+ final Widget Function(BuildContext, FFParameters) builder;
+ final List routes;
+
+ GoRoute toRoute(AppStateNotifier appStateNotifier) => GoRoute(
+ name: name,
+ path: path,
+ pageBuilder: (context, state) {
+ fixStatusBarOniOS16AndBelow(context);
+ final ffParams = FFParameters(state, asyncParams);
+ final page = ffParams.hasFutures
+ ? FutureBuilder(
+ future: ffParams.completeFutures(),
+ builder: (context, _) => builder(context, ffParams),
+ )
+ : builder(context, ffParams);
+ final child = page;
+
+ final transitionInfo = state.transitionInfo;
+ return transitionInfo.hasTransition
+ ? CustomTransitionPage(
+ key: state.pageKey,
+ child: child,
+ transitionDuration: transitionInfo.duration,
+ transitionsBuilder:
+ (context, animation, secondaryAnimation, child) =>
+ PageTransition(
+ type: transitionInfo.transitionType,
+ duration: transitionInfo.duration,
+ reverseDuration: transitionInfo.duration,
+ alignment: transitionInfo.alignment,
+ child: child,
+ ).buildTransitions(
+ context,
+ animation,
+ secondaryAnimation,
+ child,
+ ),
+ )
+ : MaterialPage(key: state.pageKey, child: child);
+ },
+ routes: routes,
+ );
+}
+
+class TransitionInfo {
+ const TransitionInfo({
+ required this.hasTransition,
+ this.transitionType = PageTransitionType.fade,
+ this.duration = const Duration(milliseconds: 300),
+ this.alignment,
+ });
+
+ final bool hasTransition;
+ final PageTransitionType transitionType;
+ final Duration duration;
+ final Alignment? alignment;
+
+ static TransitionInfo appDefault() => TransitionInfo(hasTransition: false);
+}
+
+class RootPageContext {
+ const RootPageContext(this.isRootPage, [this.errorRoute]);
+ final bool isRootPage;
+ final String? errorRoute;
+
+ static bool isInactiveRootPage(BuildContext context) {
+ final rootPageContext = context.read();
+ final isRootPage = rootPageContext?.isRootPage ?? false;
+ final location = GoRouterState.of(context).uri.toString();
+ return isRootPage &&
+ location != '/' &&
+ location != rootPageContext?.errorRoute;
+ }
+
+ static Widget wrap(Widget child, {String? errorRoute}) => Provider.value(
+ value: RootPageContext(true, errorRoute),
+ child: child,
+ );
+}
+
+extension GoRouterLocationExtension on GoRouter {
+ String getCurrentLocation() {
+ final RouteMatch lastMatch = routerDelegate.currentConfiguration.last;
+ final RouteMatchList matchList = lastMatch is ImperativeRouteMatch
+ ? lastMatch.matches
+ : routerDelegate.currentConfiguration;
+ return matchList.uri.toString();
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/nav/serialization_util.dart b/Application Product/Source/source/lib/flutter_flow/nav/serialization_util.dart
new file mode 100755
index 0000000..959e30a
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/nav/serialization_util.dart
@@ -0,0 +1,206 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:from_css_color/from_css_color.dart';
+
+import '../../flutter_flow/lat_lng.dart';
+import '../../flutter_flow/place.dart';
+import '../../flutter_flow/uploaded_file.dart';
+
+/// SERIALIZATION HELPERS
+
+String dateTimeRangeToString(DateTimeRange dateTimeRange) {
+ final startStr = dateTimeRange.start.millisecondsSinceEpoch.toString();
+ final endStr = dateTimeRange.end.millisecondsSinceEpoch.toString();
+ return '$startStr|$endStr';
+}
+
+String placeToString(FFPlace place) => jsonEncode({
+ 'latLng': place.latLng.serialize(),
+ 'name': place.name,
+ 'address': place.address,
+ 'city': place.city,
+ 'state': place.state,
+ 'country': place.country,
+ 'zipCode': place.zipCode,
+ });
+
+String uploadedFileToString(FFUploadedFile uploadedFile) =>
+ uploadedFile.serialize();
+
+String? serializeParam(
+ dynamic param,
+ ParamType paramType, {
+ bool isList = false,
+}) {
+ try {
+ if (param == null) {
+ return null;
+ }
+ if (isList) {
+ final serializedValues = (param as Iterable)
+ .map((p) => serializeParam(p, paramType, isList: false))
+ .where((p) => p != null)
+ .map((p) => p!)
+ .toList();
+ return json.encode(serializedValues);
+ }
+ String? data;
+ switch (paramType) {
+ case ParamType.int:
+ data = param.toString();
+ case ParamType.double:
+ data = param.toString();
+ case ParamType.String:
+ data = param;
+ case ParamType.bool:
+ data = param ? 'true' : 'false';
+ case ParamType.DateTime:
+ data = (param as DateTime).millisecondsSinceEpoch.toString();
+ case ParamType.DateTimeRange:
+ data = dateTimeRangeToString(param as DateTimeRange);
+ case ParamType.LatLng:
+ data = (param as LatLng).serialize();
+ case ParamType.Color:
+ data = (param as Color).toCssString();
+ case ParamType.FFPlace:
+ data = placeToString(param as FFPlace);
+ case ParamType.FFUploadedFile:
+ data = uploadedFileToString(param as FFUploadedFile);
+ case ParamType.JSON:
+ data = json.encode(param);
+
+ default:
+ data = null;
+ }
+ return data;
+ } catch (e) {
+ print('Error serializing parameter: $e');
+ return null;
+ }
+}
+
+/// END SERIALIZATION HELPERS
+
+/// DESERIALIZATION HELPERS
+
+DateTimeRange? dateTimeRangeFromString(String dateTimeRangeStr) {
+ final pieces = dateTimeRangeStr.split('|');
+ if (pieces.length != 2) {
+ return null;
+ }
+ return DateTimeRange(
+ start: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.first)),
+ end: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.last)),
+ );
+}
+
+LatLng? latLngFromString(String? latLngStr) {
+ final pieces = latLngStr?.split(',');
+ if (pieces == null || pieces.length != 2) {
+ return null;
+ }
+ return LatLng(
+ double.parse(pieces.first.trim()),
+ double.parse(pieces.last.trim()),
+ );
+}
+
+FFPlace placeFromString(String placeStr) {
+ final serializedData = jsonDecode(placeStr) as Map;
+ final data = {
+ 'latLng': serializedData.containsKey('latLng')
+ ? latLngFromString(serializedData['latLng'] as String)
+ : const LatLng(0.0, 0.0),
+ 'name': serializedData['name'] ?? '',
+ 'address': serializedData['address'] ?? '',
+ 'city': serializedData['city'] ?? '',
+ 'state': serializedData['state'] ?? '',
+ 'country': serializedData['country'] ?? '',
+ 'zipCode': serializedData['zipCode'] ?? '',
+ };
+ return FFPlace(
+ latLng: data['latLng'] as LatLng,
+ name: data['name'] as String,
+ address: data['address'] as String,
+ city: data['city'] as String,
+ state: data['state'] as String,
+ country: data['country'] as String,
+ zipCode: data['zipCode'] as String,
+ );
+}
+
+FFUploadedFile uploadedFileFromString(String uploadedFileStr) =>
+ FFUploadedFile.deserialize(uploadedFileStr);
+
+enum ParamType {
+ int,
+ double,
+ String,
+ bool,
+ DateTime,
+ DateTimeRange,
+ LatLng,
+ Color,
+ FFPlace,
+ FFUploadedFile,
+ JSON,
+}
+
+dynamic deserializeParam(
+ String? param,
+ ParamType paramType,
+ bool isList,
+) {
+ try {
+ if (param == null) {
+ return null;
+ }
+ if (isList) {
+ final paramValues = json.decode(param);
+ if (paramValues is! Iterable || paramValues.isEmpty) {
+ return null;
+ }
+ return paramValues
+ .where((p) => p is String)
+ .map((p) => p as String)
+ .map((p) => deserializeParam(p, paramType, false))
+ .where((p) => p != null)
+ .map((p) => p! as T)
+ .toList();
+ }
+ switch (paramType) {
+ case ParamType.int:
+ return int.tryParse(param);
+ case ParamType.double:
+ return double.tryParse(param);
+ case ParamType.String:
+ return param;
+ case ParamType.bool:
+ return param == 'true';
+ case ParamType.DateTime:
+ final milliseconds = int.tryParse(param);
+ return milliseconds != null
+ ? DateTime.fromMillisecondsSinceEpoch(milliseconds)
+ : null;
+ case ParamType.DateTimeRange:
+ return dateTimeRangeFromString(param);
+ case ParamType.LatLng:
+ return latLngFromString(param);
+ case ParamType.Color:
+ return fromCssColor(param);
+ case ParamType.FFPlace:
+ return placeFromString(param);
+ case ParamType.FFUploadedFile:
+ return uploadedFileFromString(param);
+ case ParamType.JSON:
+ return json.decode(param);
+
+ default:
+ return null;
+ }
+ } catch (e) {
+ print('Error deserializing parameter: $e');
+ return null;
+ }
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/place.dart b/Application Product/Source/source/lib/flutter_flow/place.dart
new file mode 100755
index 0000000..e3589b3
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/place.dart
@@ -0,0 +1,46 @@
+import 'lat_lng.dart';
+
+class FFPlace {
+ const FFPlace({
+ this.latLng = const LatLng(0.0, 0.0),
+ this.name = '',
+ this.address = '',
+ this.city = '',
+ this.state = '',
+ this.country = '',
+ this.zipCode = '',
+ });
+
+ final LatLng latLng;
+ final String name;
+ final String address;
+ final String city;
+ final String state;
+ final String country;
+ final String zipCode;
+
+ @override
+ String toString() => '''FFPlace(
+ latLng: $latLng,
+ name: $name,
+ address: $address,
+ city: $city,
+ state: $state,
+ country: $country,
+ zipCode: $zipCode,
+ )''';
+
+ @override
+ int get hashCode => latLng.hashCode;
+
+ @override
+ bool operator ==(other) =>
+ other is FFPlace &&
+ latLng == other.latLng &&
+ name == other.name &&
+ address == other.address &&
+ city == other.city &&
+ state == other.state &&
+ country == other.country &&
+ zipCode == other.zipCode;
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/random_data_util.dart b/Application Product/Source/source/lib/flutter_flow/random_data_util.dart
new file mode 100755
index 0000000..6599e5a
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/random_data_util.dart
@@ -0,0 +1,51 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+
+final _random = Random();
+
+int randomInteger(int min, int max) {
+ return _random.nextInt(max - min + 1) + min;
+}
+
+double randomDouble(double min, double max) {
+ return _random.nextDouble() * (max - min) + min;
+}
+
+String randomString(
+ int minLength,
+ int maxLength,
+ bool lowercaseAz,
+ bool uppercaseAz,
+ bool digits,
+) {
+ var chars = '';
+ if (lowercaseAz) {
+ chars += 'abcdefghijklmnopqrstuvwxyz';
+ }
+ if (uppercaseAz) {
+ chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ }
+ if (digits) {
+ chars += '0123456789';
+ }
+ return List.generate(randomInteger(minLength, maxLength),
+ (index) => chars[_random.nextInt(chars.length)]).join();
+}
+
+// Random date between 1970 and 2025.
+DateTime randomDate() {
+ // Random max must be in range 0 < max <= 2^32.
+ // So we have to generate the time in seconds and then convert to milliseconds.
+ return DateTime.fromMillisecondsSinceEpoch(
+ randomInteger(0, 1735689600) * 1000);
+}
+
+String randomImageUrl(int width, int height) {
+ return 'https://picsum.photos/seed/${_random.nextInt(1000)}/$width/$height';
+}
+
+Color randomColor() {
+ return Color.fromARGB(
+ 255, _random.nextInt(255), _random.nextInt(255), _random.nextInt(255));
+}
diff --git a/Application Product/Source/source/lib/flutter_flow/uploaded_file.dart b/Application Product/Source/source/lib/flutter_flow/uploaded_file.dart
new file mode 100755
index 0000000..2dfd2ff
--- /dev/null
+++ b/Application Product/Source/source/lib/flutter_flow/uploaded_file.dart
@@ -0,0 +1,68 @@
+import 'dart:convert';
+import 'dart:typed_data' show Uint8List;
+
+class FFUploadedFile {
+ const FFUploadedFile({
+ this.name,
+ this.bytes,
+ this.height,
+ this.width,
+ this.blurHash,
+ });
+
+ final String? name;
+ final Uint8List? bytes;
+ final double? height;
+ final double? width;
+ final String? blurHash;
+
+ @override
+ String toString() =>
+ 'FFUploadedFile(name: $name, bytes: ${bytes?.length ?? 0}, height: $height, width: $width, blurHash: $blurHash,)';
+
+ String serialize() => jsonEncode(
+ {
+ 'name': name,
+ 'bytes': bytes,
+ 'height': height,
+ 'width': width,
+ 'blurHash': blurHash,
+ },
+ );
+
+ static FFUploadedFile deserialize(String val) {
+ final serializedData = jsonDecode(val) as Map;
+ final data = {
+ 'name': serializedData['name'] ?? '',
+ 'bytes': serializedData['bytes'] ?? Uint8List.fromList([]),
+ 'height': serializedData['height'],
+ 'width': serializedData['width'],
+ 'blurHash': serializedData['blurHash'],
+ };
+ return FFUploadedFile(
+ name: data['name'] as String,
+ bytes: Uint8List.fromList(data['bytes'].cast().toList()),
+ height: data['height'] as double?,
+ width: data['width'] as double?,
+ blurHash: data['blurHash'] as String?,
+ );
+ }
+
+ @override
+ int get hashCode => Object.hash(
+ name,
+ bytes,
+ height,
+ width,
+ blurHash,
+ );
+
+ @override
+ bool operator ==(other) =>
+ other is FFUploadedFile &&
+ name == other.name &&
+ bytes == other.bytes &&
+ height == other.height &&
+ width == other.width &&
+ blurHash == other.blurHash;
+}
diff --git a/Application Product/Source/source/lib/home_page/home_page_model.dart b/Application Product/Source/source/lib/home_page/home_page_model.dart
new file mode 100755
index 0000000..4ecfd24
--- /dev/null
+++ b/Application Product/Source/source/lib/home_page/home_page_model.dart
@@ -0,0 +1,16 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_web_view.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'home_page_widget.dart' show HomePageWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class HomePageModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/home_page/home_page_widget.dart b/Application Product/Source/source/lib/home_page/home_page_widget.dart
new file mode 100755
index 0000000..ae3a806
--- /dev/null
+++ b/Application Product/Source/source/lib/home_page/home_page_widget.dart
@@ -0,0 +1,56 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_web_view.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'home_page_model.dart';
+export 'home_page_model.dart';
+
+class HomePageWidget extends StatefulWidget {
+ const HomePageWidget({super.key});
+
+ @override
+ State createState() => _HomePageWidgetState();
+}
+
+class _HomePageWidgetState extends State {
+ late HomePageModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => HomePageModel());
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: () => FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ body: SafeArea(
+ top: true,
+ child: FlutterFlowWebView(
+ content: 'https://phong12hexdockwork.github.io/UVita-Mapping/',
+ width: 390.0,
+ height: 844.0,
+ verticalScroll: false,
+ horizontalScroll: false,
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/index.dart b/Application Product/Source/source/lib/index.dart
new file mode 100755
index 0000000..7c658a0
--- /dev/null
+++ b/Application Product/Source/source/lib/index.dart
@@ -0,0 +1,6 @@
+// Export pages
+export '/home_page/home_page_widget.dart' show HomePageWidget;
+export '/analyst/analyst_widget.dart' show AnalystWidget;
+export '/infomation/infomation_widget.dart' show InfomationWidget;
+export '/setting/setting_widget.dart' show SettingWidget;
+export '/news/news_widget.dart' show NewsWidget;
diff --git a/Application Product/Source/source/lib/infomation/infomation_model.dart b/Application Product/Source/source/lib/infomation/infomation_model.dart
new file mode 100755
index 0000000..d0e7b30
--- /dev/null
+++ b/Application Product/Source/source/lib/infomation/infomation_model.dart
@@ -0,0 +1,36 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/widget/battery/battery_widget.dart';
+import '/widget/daily_trackers/daily_trackers_widget.dart';
+import '/widget/team/team_widget.dart';
+import 'infomation_widget.dart' show InfomationWidget;
+import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class InfomationModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this page.
+
+ // Model for DailyTrackers component.
+ late DailyTrackersModel dailyTrackersModel;
+ // Model for Battery component.
+ late BatteryModel batteryModel;
+ // Model for team component.
+ late TeamModel teamModel;
+
+ @override
+ void initState(BuildContext context) {
+ dailyTrackersModel = createModel(context, () => DailyTrackersModel());
+ batteryModel = createModel(context, () => BatteryModel());
+ teamModel = createModel(context, () => TeamModel());
+ }
+
+ @override
+ void dispose() {
+ dailyTrackersModel.dispose();
+ batteryModel.dispose();
+ teamModel.dispose();
+ }
+}
diff --git a/Application Product/Source/source/lib/infomation/infomation_widget.dart b/Application Product/Source/source/lib/infomation/infomation_widget.dart
new file mode 100755
index 0000000..3d68f2d
--- /dev/null
+++ b/Application Product/Source/source/lib/infomation/infomation_widget.dart
@@ -0,0 +1,77 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import '/widget/battery/battery_widget.dart';
+import '/widget/daily_trackers/daily_trackers_widget.dart';
+import '/widget/team/team_widget.dart';
+import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'infomation_model.dart';
+export 'infomation_model.dart';
+
+class InfomationWidget extends StatefulWidget {
+ const InfomationWidget({super.key});
+
+ @override
+ State createState() => _InfomationWidgetState();
+}
+
+class _InfomationWidgetState extends State {
+ late InfomationModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => InfomationModel());
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: () => FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ body: SafeArea(
+ top: true,
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ wrapWithModel(
+ model: _model.dailyTrackersModel,
+ updateCallback: () => safeSetState(() {}),
+ child: DailyTrackersWidget(),
+ ),
+ Align(
+ alignment: AlignmentDirectional(0.0, -1.0),
+ child: wrapWithModel(
+ model: _model.batteryModel,
+ updateCallback: () => safeSetState(() {}),
+ child: BatteryWidget(),
+ ),
+ ),
+ wrapWithModel(
+ model: _model.teamModel,
+ updateCallback: () => safeSetState(() {}),
+ child: TeamWidget(),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/main.dart b/Application Product/Source/source/lib/main.dart
new file mode 100755
index 0000000..bf206f0
--- /dev/null
+++ b/Application Product/Source/source/lib/main.dart
@@ -0,0 +1,244 @@
+import 'package:flutter/gestures.dart';
+import 'package:flutter/material.dart';
+
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:flutter_web_plugins/url_strategy.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import 'flutter_flow/flutter_flow_util.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:floating_bottom_navigation_bar/floating_bottom_navigation_bar.dart';
+import 'flutter_flow/nav/nav.dart';
+import 'index.dart';
+
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ GoRouter.optionURLReflectsImperativeAPIs = true;
+ usePathUrlStrategy();
+
+ await FlutterFlowTheme.initialize();
+
+ runApp(MyApp());
+}
+
+class MyApp extends StatefulWidget {
+ // This widget is the root of your application.
+ @override
+ State createState() => _MyAppState();
+
+ static _MyAppState of(BuildContext context) =>
+ context.findAncestorStateOfType<_MyAppState>()!;
+}
+
+class _MyAppState extends State {
+ ThemeMode _themeMode = FlutterFlowTheme.themeMode;
+
+ late AppStateNotifier _appStateNotifier;
+ late GoRouter _router;
+
+ bool displaySplashImage = true;
+
+ @override
+ void initState() {
+ super.initState();
+
+ _appStateNotifier = AppStateNotifier.instance;
+ _router = createRouter(_appStateNotifier);
+
+ Future.delayed(Duration(milliseconds: 1000),
+ () => safeSetState(() => _appStateNotifier.stopShowingSplashImage()));
+ }
+
+ void setThemeMode(ThemeMode mode) => safeSetState(() {
+ _themeMode = mode;
+ FlutterFlowTheme.saveThemeMode(mode);
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp.router(
+ title: 'UVita',
+ localizationsDelegates: [
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ],
+ supportedLocales: const [Locale('en', '')],
+ theme: ThemeData(
+ brightness: Brightness.light,
+ useMaterial3: false,
+ ),
+ darkTheme: ThemeData(
+ brightness: Brightness.dark,
+ useMaterial3: false,
+ ),
+ themeMode: _themeMode,
+ routerConfig: _router,
+ );
+ }
+}
+
+class NavBarPage extends StatefulWidget {
+ NavBarPage({Key? key, this.initialPage, this.page}) : super(key: key);
+
+ final String? initialPage;
+ final Widget? page;
+
+ @override
+ _NavBarPageState createState() => _NavBarPageState();
+}
+
+/// This is the private State class that goes with NavBarPage.
+class _NavBarPageState extends State {
+ String _currentPageName = 'HomePage';
+ late Widget? _currentPage;
+
+ @override
+ void initState() {
+ super.initState();
+ _currentPageName = widget.initialPage ?? _currentPageName;
+ _currentPage = widget.page;
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final tabs = {
+ 'HomePage': HomePageWidget(),
+ 'Analyst': AnalystWidget(),
+ 'Infomation': InfomationWidget(),
+ 'setting': SettingWidget(),
+ 'NEWS': NewsWidget(),
+ };
+ final currentIndex = tabs.keys.toList().indexOf(_currentPageName);
+
+ final MediaQueryData queryData = MediaQuery.of(context);
+
+ return Scaffold(
+ body: MediaQuery(
+ data: queryData
+ .removeViewInsets(removeBottom: true)
+ .removeViewPadding(removeBottom: true),
+ child: _currentPage ?? tabs[_currentPageName]!),
+ extendBody: true,
+ bottomNavigationBar: FloatingNavbar(
+ currentIndex: currentIndex,
+ onTap: (i) => safeSetState(() {
+ _currentPage = null;
+ _currentPageName = tabs.keys.toList()[i];
+ }),
+ backgroundColor: Color(0xD5AB0C0C),
+ selectedItemColor: Color(0x9EFFF8F8),
+ unselectedItemColor: Colors.white,
+ selectedBackgroundColor: Color(0x00000000),
+ borderRadius: 8.0,
+ itemBorderRadius: 8.0,
+ margin: EdgeInsets.all(12.0),
+ padding: EdgeInsets.all(2.0),
+ width: double.infinity,
+ elevation: 0.0,
+ items: [
+ FloatingNavbarItem(
+ customWidget: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.home_outlined,
+ color: currentIndex == 0 ? Color(0x9EFFF8F8) : Colors.white,
+ size: 24.0,
+ ),
+ Text(
+ 'Home',
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ color: currentIndex == 0 ? Color(0x9EFFF8F8) : Colors.white,
+ fontSize: 11.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ FloatingNavbarItem(
+ customWidget: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.pie_chart,
+ color: currentIndex == 1 ? Color(0x9EFFF8F8) : Colors.white,
+ size: 24.0,
+ ),
+ Text(
+ 'Analyst',
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ color: currentIndex == 1 ? Color(0x9EFFF8F8) : Colors.white,
+ fontSize: 11.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ FloatingNavbarItem(
+ customWidget: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ FontAwesomeIcons.info,
+ color: currentIndex == 2 ? Color(0x9EFFF8F8) : Colors.white,
+ size: 24.0,
+ ),
+ Text(
+ 'Infomations',
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ color: currentIndex == 2 ? Color(0x9EFFF8F8) : Colors.white,
+ fontSize: 11.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ FloatingNavbarItem(
+ customWidget: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.settings_sharp,
+ color: currentIndex == 3 ? Color(0x9EFFF8F8) : Colors.white,
+ size: 24.0,
+ ),
+ Text(
+ 'Settings',
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ color: currentIndex == 3 ? Color(0x9EFFF8F8) : Colors.white,
+ fontSize: 11.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ FloatingNavbarItem(
+ customWidget: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ FontAwesomeIcons.solidNewspaper,
+ color: currentIndex == 4 ? Color(0x9EFFF8F8) : Colors.white,
+ size: 24.0,
+ ),
+ Text(
+ 'News',
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ color: currentIndex == 4 ? Color(0x9EFFF8F8) : Colors.white,
+ fontSize: 11.0,
+ ),
+ ),
+ ],
+ ),
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/news/news_model.dart b/Application Product/Source/source/lib/news/news_model.dart
new file mode 100755
index 0000000..cce78e6
--- /dev/null
+++ b/Application Product/Source/source/lib/news/news_model.dart
@@ -0,0 +1,33 @@
+import '/components/card35_news_article_widget.dart';
+import '/components/card38_location_details_widget.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'news_widget.dart' show NewsWidget;
+import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class NewsModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this page.
+
+ // Model for Card38LocationDetails component.
+ late Card38LocationDetailsModel card38LocationDetailsModel;
+ // Model for Card35NewsArticle component.
+ late Card35NewsArticleModel card35NewsArticleModel;
+
+ @override
+ void initState(BuildContext context) {
+ card38LocationDetailsModel =
+ createModel(context, () => Card38LocationDetailsModel());
+ card35NewsArticleModel =
+ createModel(context, () => Card35NewsArticleModel());
+ }
+
+ @override
+ void dispose() {
+ card38LocationDetailsModel.dispose();
+ card35NewsArticleModel.dispose();
+ }
+}
diff --git a/Application Product/Source/source/lib/news/news_widget.dart b/Application Product/Source/source/lib/news/news_widget.dart
new file mode 100755
index 0000000..05155a8
--- /dev/null
+++ b/Application Product/Source/source/lib/news/news_widget.dart
@@ -0,0 +1,68 @@
+import '/components/card35_news_article_widget.dart';
+import '/components/card38_location_details_widget.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'news_model.dart';
+export 'news_model.dart';
+
+class NewsWidget extends StatefulWidget {
+ const NewsWidget({super.key});
+
+ @override
+ State createState() => _NewsWidgetState();
+}
+
+class _NewsWidgetState extends State {
+ late NewsModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => NewsModel());
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: () => FocusScope.of(context).unfocus(),
+ child: Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
+ body: SafeArea(
+ top: true,
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ wrapWithModel(
+ model: _model.card38LocationDetailsModel,
+ updateCallback: () => safeSetState(() {}),
+ child: Card38LocationDetailsWidget(),
+ ),
+ wrapWithModel(
+ model: _model.card35NewsArticleModel,
+ updateCallback: () => safeSetState(() {}),
+ child: Card35NewsArticleWidget(),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/setting/setting_model.dart b/Application Product/Source/source/lib/setting/setting_model.dart
new file mode 100755
index 0000000..3586c06
--- /dev/null
+++ b/Application Product/Source/source/lib/setting/setting_model.dart
@@ -0,0 +1,24 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'setting_widget.dart' show SettingWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class SettingModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this page.
+
+ // State field(s) for SwitchListTile widget.
+ bool? switchListTileValue1;
+ // State field(s) for SwitchListTile widget.
+ bool? switchListTileValue2;
+ // State field(s) for SwitchListTile widget.
+ bool? switchListTileValue3;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/setting/setting_widget.dart b/Application Product/Source/source/lib/setting/setting_widget.dart
new file mode 100755
index 0000000..c3a0ae6
--- /dev/null
+++ b/Application Product/Source/source/lib/setting/setting_widget.dart
@@ -0,0 +1,168 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'setting_model.dart';
+export 'setting_model.dart';
+
+class SettingWidget extends StatefulWidget {
+ const SettingWidget({super.key});
+
+ @override
+ State createState() => _SettingWidgetState();
+}
+
+class _SettingWidgetState extends State {
+ late SettingModel _model;
+
+ final scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => SettingModel());
+ }
+
+ @override
+ void dispose() {
+ _model.dispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ key: scaffoldKey,
+ backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
+ appBar: AppBar(
+ backgroundColor: FlutterFlowTheme.of(context).secondaryBackground,
+ automaticallyImplyLeading: false,
+ title: Text(
+ 'Settings Page',
+ style: FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ actions: [],
+ centerTitle: false,
+ elevation: 0.0,
+ ),
+ body: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(20.0, 0.0, 20.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Expanded(
+ child: Text(
+ 'Choose what notifcations you want to recieve below and we will update the settings.',
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0),
+ child: SwitchListTile.adaptive(
+ value: _model.switchListTileValue1 ??= true,
+ onChanged: (newValue) async {
+ safeSetState(() => _model.switchListTileValue1 = newValue!);
+ },
+ title: Text(
+ 'Push Notifications',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ lineHeight: 2.0,
+ ),
+ ),
+ subtitle: Text(
+ 'Receive Push notifications from our application on a semi regular basis.',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: Color(0xFF8B97A2),
+ letterSpacing: 0.0,
+ ),
+ ),
+ tileColor: FlutterFlowTheme.of(context).secondaryBackground,
+ activeColor: Color(0xFFEF3939),
+ activeTrackColor: Color(0x4CEF3939),
+ dense: false,
+ controlAffinity: ListTileControlAffinity.trailing,
+ contentPadding:
+ EdgeInsetsDirectional.fromSTEB(24.0, 12.0, 24.0, 12.0),
+ ),
+ ),
+ SwitchListTile.adaptive(
+ value: _model.switchListTileValue2 ??= true,
+ onChanged: (newValue) async {
+ safeSetState(() => _model.switchListTileValue2 = newValue!);
+ },
+ title: Text(
+ 'Email Notifications',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ lineHeight: 2.0,
+ ),
+ ),
+ subtitle: Text(
+ 'Receive email notifications from our marketing team about new features.',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: Color(0xFF8B97A2),
+ letterSpacing: 0.0,
+ ),
+ ),
+ tileColor: FlutterFlowTheme.of(context).secondaryBackground,
+ activeColor: Color(0xFFEF3939),
+ activeTrackColor: Color(0x4CEF3939),
+ dense: false,
+ controlAffinity: ListTileControlAffinity.trailing,
+ contentPadding:
+ EdgeInsetsDirectional.fromSTEB(24.0, 12.0, 24.0, 12.0),
+ ),
+ SwitchListTile.adaptive(
+ value: _model.switchListTileValue3 ??= true,
+ onChanged: (newValue) async {
+ safeSetState(() => _model.switchListTileValue3 = newValue!);
+ },
+ title: Text(
+ 'Location Services',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ lineHeight: 2.0,
+ ),
+ ),
+ subtitle: Text(
+ 'Allow us to track your location, this helps keep track of spending and keeps you safe.',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: Color(0xFF8B97A2),
+ letterSpacing: 0.0,
+ ),
+ ),
+ tileColor: FlutterFlowTheme.of(context).secondaryBackground,
+ activeColor: Color(0xFFEF3939),
+ activeTrackColor: Color(0x4CEF5239),
+ dense: false,
+ controlAffinity: ListTileControlAffinity.trailing,
+ contentPadding:
+ EdgeInsetsDirectional.fromSTEB(24.0, 12.0, 24.0, 12.0),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/advice/advice_model.dart b/Application Product/Source/source/lib/widget/advice/advice_model.dart
new file mode 100755
index 0000000..3e1c938
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/advice/advice_model.dart
@@ -0,0 +1,16 @@
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'advice_widget.dart' show AdviceWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class AdviceModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/advice/advice_widget.dart b/Application Product/Source/source/lib/widget/advice/advice_widget.dart
new file mode 100755
index 0000000..7e137e1
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/advice/advice_widget.dart
@@ -0,0 +1,241 @@
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'advice_model.dart';
+export 'advice_model.dart';
+
+class AdviceWidget extends StatefulWidget {
+ const AdviceWidget({super.key});
+
+ @override
+ State createState() => _AdviceWidgetState();
+}
+
+class _AdviceWidgetState extends State {
+ late AdviceModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => AdviceModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ colors: [
+ FlutterFlowTheme.of(context).primaryBackground,
+ FlutterFlowTheme.of(context).secondaryBackground
+ ],
+ stops: [0.0, 1.0],
+ begin: AlignmentDirectional(0.0, -1.0),
+ end: AlignmentDirectional(0, 1.0),
+ ),
+ borderRadius: BorderRadius.circular(16.0),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 1.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(12.0),
+ child: Image.asset(
+ 'assets/images/images.jpg',
+ width: 120.0,
+ height: 120.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'USING SUNSCREEN',
+ style: FlutterFlowTheme.of(context)
+ .headlineSmall
+ .override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 8.0, 0.0, 0.0),
+ child: Text(
+ 'SPF requirements 50+',
+ style: FlutterFlowTheme.of(context)
+ .labelLarge
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 12.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Stack(
+ children: [
+ FFButtonWidget(
+ onPressed: () {
+ print('followButton pressed ...');
+ },
+ text: 'Follow',
+ options: FFButtonOptions(
+ width: 90.0,
+ height: 36.0,
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context).primaryText,
+ textStyle:
+ FlutterFlowTheme.of(context).titleSmall.override(
+ fontFamily: 'Inter Tight',
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ ),
+ elevation: 2.0,
+ borderSide: BorderSide(
+ color: Colors.transparent,
+ width: 1.0,
+ ),
+ borderRadius: BorderRadius.circular(40.0),
+ ),
+ ),
+ FFButtonWidget(
+ onPressed: () {
+ print('following pressed ...');
+ },
+ text: 'Following',
+ options: FFButtonOptions(
+ width: 90.0,
+ height: 36.0,
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ textStyle:
+ FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ elevation: 0.0,
+ borderSide: BorderSide(
+ color:
+ FlutterFlowTheme.of(context).primaryBackground,
+ width: 2.0,
+ ),
+ borderRadius: BorderRadius.circular(40.0),
+ ),
+ ),
+ ],
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 44.0,
+ icon: Icon(
+ Icons.notifications_none,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 44.0,
+ icon: Icon(
+ Icons.settings_outlined,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 44.0,
+ icon: Icon(
+ Icons.keyboard_control,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/advice_copy/advice_copy_model.dart b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_model.dart
new file mode 100755
index 0000000..735e7e2
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_model.dart
@@ -0,0 +1,16 @@
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'advice_copy_widget.dart' show AdviceCopyWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class AdviceCopyModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/advice_copy/advice_copy_widget.dart b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_widget.dart
new file mode 100755
index 0000000..3994572
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/advice_copy/advice_copy_widget.dart
@@ -0,0 +1,241 @@
+import '/flutter_flow/flutter_flow_icon_button.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'advice_copy_model.dart';
+export 'advice_copy_model.dart';
+
+class AdviceCopyWidget extends StatefulWidget {
+ const AdviceCopyWidget({super.key});
+
+ @override
+ State createState() => _AdviceCopyWidgetState();
+}
+
+class _AdviceCopyWidgetState extends State {
+ late AdviceCopyModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => AdviceCopyModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ colors: [
+ FlutterFlowTheme.of(context).primaryBackground,
+ FlutterFlowTheme.of(context).secondaryBackground
+ ],
+ stops: [0.0, 1.0],
+ begin: AlignmentDirectional(0.0, -1.0),
+ end: AlignmentDirectional(0, 1.0),
+ ),
+ borderRadius: BorderRadius.circular(16.0),
+ shape: BoxShape.rectangle,
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 1.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(12.0),
+ child: Image.asset(
+ 'assets/images/How_to_wear_long_coat_for_men_titled_design_10.webp',
+ width: 120.0,
+ height: 120.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'WEAR A COAT',
+ style: FlutterFlowTheme.of(context)
+ .headlineSmall
+ .override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 8.0, 0.0, 0.0),
+ child: Text(
+ 'Long-sleeved and thick',
+ style: FlutterFlowTheme.of(context)
+ .labelLarge
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 12.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Stack(
+ children: [
+ FFButtonWidget(
+ onPressed: () {
+ print('followButton pressed ...');
+ },
+ text: 'Follow',
+ options: FFButtonOptions(
+ width: 90.0,
+ height: 36.0,
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color: FlutterFlowTheme.of(context).primaryText,
+ textStyle:
+ FlutterFlowTheme.of(context).titleSmall.override(
+ fontFamily: 'Inter Tight',
+ color: FlutterFlowTheme.of(context)
+ .secondaryBackground,
+ fontSize: 14.0,
+ letterSpacing: 0.0,
+ ),
+ elevation: 2.0,
+ borderSide: BorderSide(
+ color: Colors.transparent,
+ width: 1.0,
+ ),
+ borderRadius: BorderRadius.circular(40.0),
+ ),
+ ),
+ FFButtonWidget(
+ onPressed: () {
+ print('following pressed ...');
+ },
+ text: 'Following',
+ options: FFButtonOptions(
+ width: 90.0,
+ height: 36.0,
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ iconPadding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 0.0, 0.0, 0.0),
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ textStyle:
+ FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ elevation: 0.0,
+ borderSide: BorderSide(
+ color:
+ FlutterFlowTheme.of(context).primaryBackground,
+ width: 2.0,
+ ),
+ borderRadius: BorderRadius.circular(40.0),
+ ),
+ ),
+ ],
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 44.0,
+ icon: Icon(
+ Icons.notifications_none,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 44.0,
+ icon: Icon(
+ Icons.settings_outlined,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 0.0, 0.0),
+ child: FlutterFlowIconButton(
+ borderColor: Colors.transparent,
+ borderRadius: 30.0,
+ borderWidth: 1.0,
+ buttonSize: 44.0,
+ icon: Icon(
+ Icons.keyboard_control,
+ color: FlutterFlowTheme.of(context).secondaryText,
+ size: 24.0,
+ ),
+ onPressed: () {
+ print('IconButton pressed ...');
+ },
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/battery/battery_model.dart b/Application Product/Source/source/lib/widget/battery/battery_model.dart
new file mode 100755
index 0000000..2b7b5b3
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/battery/battery_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'battery_widget.dart' show BatteryWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class BatteryModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/battery/battery_widget.dart b/Application Product/Source/source/lib/widget/battery/battery_widget.dart
new file mode 100755
index 0000000..759b075
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/battery/battery_widget.dart
@@ -0,0 +1,155 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'battery_model.dart';
+export 'battery_model.dart';
+
+class BatteryWidget extends StatefulWidget {
+ const BatteryWidget({super.key});
+
+ @override
+ State createState() => _BatteryWidgetState();
+}
+
+class _BatteryWidgetState extends State {
+ late BatteryModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => BatteryModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: 349.0,
+ height: 150.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 2.0,
+ ),
+ spreadRadius: 0.0,
+ )
+ ],
+ borderRadius: BorderRadius.circular(16.0),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Battery Case',
+ style:
+ FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ 'PhoBroth\'s Case',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: 60.0,
+ height: 60.0,
+ decoration: BoxDecoration(
+ color: Color(0x4DD23939),
+ borderRadius: BorderRadius.circular(30.0),
+ ),
+ child: Icon(
+ Icons.battery_charging_full,
+ color: Color(0xFFDD7272),
+ size: 30.0,
+ ),
+ ),
+ ],
+ ),
+ Align(
+ alignment: AlignmentDirectional(-1.0, 0.0),
+ child: Text(
+ 'Charge Level',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Container(
+ width: 200.0,
+ height: 20.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).alternate,
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ child: Container(
+ width: 160.0,
+ height: 20.0,
+ decoration: BoxDecoration(
+ color: Color(0xFFD42525),
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ ),
+ ),
+ Text(
+ '80%',
+ style: FlutterFlowTheme.of(context).bodySmall.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ].divide(SizedBox(width: 8.0)),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/box/box_model.dart b/Application Product/Source/source/lib/widget/box/box_model.dart
new file mode 100755
index 0000000..91eb715
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/box/box_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'box_widget.dart' show BoxWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class BoxModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/box/box_widget.dart b/Application Product/Source/source/lib/widget/box/box_widget.dart
new file mode 100755
index 0000000..58a4283
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/box/box_widget.dart
@@ -0,0 +1,118 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'box_model.dart';
+export 'box_model.dart';
+
+class BoxWidget extends StatefulWidget {
+ const BoxWidget({super.key});
+
+ @override
+ State createState() => _BoxWidgetState();
+}
+
+class _BoxWidgetState extends State {
+ late BoxModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => BoxModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ borderRadius: BorderRadius.circular(14.0),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(12.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ width: 150.0,
+ height: 47.0,
+ decoration: BoxDecoration(
+ color: Color(0xFFD41818),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(12.0, 12.0, 12.0, 12.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Text(
+ 'Call doctor',
+ style:
+ FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ color: FlutterFlowTheme.of(context).info,
+ fontSize: 18.0,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Container(
+ width: 150.0,
+ height: 50.0,
+ decoration: BoxDecoration(
+ color: Color(0xFFF64C4C),
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(12.0, 12.0, 12.0, 12.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Text(
+ 'Hopital',
+ style:
+ FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ color: FlutterFlowTheme.of(context).info,
+ fontSize: 18.0,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ].divide(SizedBox(width: 16.0)),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/calendar/calendar_model.dart b/Application Product/Source/source/lib/widget/calendar/calendar_model.dart
new file mode 100755
index 0000000..001f9d4
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/calendar/calendar_model.dart
@@ -0,0 +1,25 @@
+import '/flutter_flow/flutter_flow_calendar.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'calendar_widget.dart' show CalendarWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class CalendarModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ // State field(s) for Calendar widget.
+ DateTimeRange? calendarSelectedDay;
+
+ @override
+ void initState(BuildContext context) {
+ calendarSelectedDay = DateTimeRange(
+ start: DateTime.now().startOfDay,
+ end: DateTime.now().endOfDay,
+ );
+ }
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/calendar/calendar_widget.dart b/Application Product/Source/source/lib/widget/calendar/calendar_widget.dart
new file mode 100755
index 0000000..8fb3c22
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/calendar/calendar_widget.dart
@@ -0,0 +1,72 @@
+import '/flutter_flow/flutter_flow_calendar.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'calendar_model.dart';
+export 'calendar_model.dart';
+
+class CalendarWidget extends StatefulWidget {
+ const CalendarWidget({super.key});
+
+ @override
+ State createState() => _CalendarWidgetState();
+}
+
+class _CalendarWidgetState extends State {
+ late CalendarModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => CalendarModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return FlutterFlowCalendar(
+ color: FlutterFlowTheme.of(context).primary,
+ iconColor: FlutterFlowTheme.of(context).secondaryText,
+ weekFormat: false,
+ weekStartsMonday: false,
+ rowHeight: 48.0,
+ onChange: (DateTimeRange? newSelectedDate) {
+ safeSetState(() => _model.calendarSelectedDay = newSelectedDate);
+ },
+ titleStyle: FlutterFlowTheme.of(context).titleLarge.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ dayOfWeekStyle: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ dateStyle: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ selectedDateStyle: FlutterFlowTheme.of(context).titleSmall.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ inactiveDateStyle: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_model.dart b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_model.dart
new file mode 100755
index 0000000..4b6b767
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'daily_trackers_widget.dart' show DailyTrackersWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class DailyTrackersModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_widget.dart b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_widget.dart
new file mode 100755
index 0000000..89fd2d7
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/daily_trackers/daily_trackers_widget.dart
@@ -0,0 +1,174 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'daily_trackers_model.dart';
+export 'daily_trackers_model.dart';
+
+class DailyTrackersWidget extends StatefulWidget {
+ const DailyTrackersWidget({super.key});
+
+ @override
+ State createState() => _DailyTrackersWidgetState();
+}
+
+class _DailyTrackersWidgetState extends State {
+ late DailyTrackersModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => DailyTrackersModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(24.0, 16.0, 16.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Text(
+ 'Hello,',
+ style: FlutterFlowTheme.of(context).displaySmall.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.normal,
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(2.0, 0.0, 0.0, 0.0),
+ child: Text(
+ 'Phong',
+ style: FlutterFlowTheme.of(context).displaySmall.override(
+ fontFamily: 'Inter Tight',
+ color: Color(0xFFBF0404),
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
+ child: Text(
+ 'Below is the progress you have made this week.',
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(20.0, 12.0, 20.0, 12.0),
+ child: Container(
+ width: double.infinity,
+ height: 110.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: Color(0x34090F13),
+ offset: Offset(
+ 0.0,
+ 2.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(12.0),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(12.0, 8.0, 12.0, 8.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 4.0),
+ child: Text(
+ 'Goals',
+ style: FlutterFlowTheme.of(context).labelSmall.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Text(
+ 'UV exposure today',
+ style: FlutterFlowTheme.of(context).titleLarge.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Expanded(
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 4.0, 0.0, 0.0),
+ child: Text(
+ 'Minitues',
+ style: FlutterFlowTheme.of(context)
+ .labelMedium
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 0.0, 4.0, 0.0, 0.0),
+ child: Text(
+ '30/20',
+ style: FlutterFlowTheme.of(context)
+ .headlineLarge
+ .override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_model.dart b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_model.dart
new file mode 100755
index 0000000..bda438b
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_model.dart
@@ -0,0 +1,22 @@
+import '/flutter_flow/flutter_flow_animations.dart';
+import '/flutter_flow/flutter_flow_charts.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'dart:math';
+import '/flutter_flow/random_data_util.dart' as random_data;
+import 'dashboard01_recent_activity_widget.dart'
+ show Dashboard01RecentActivityWidget;
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:flutter_animate/flutter_animate.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class Dashboard01RecentActivityModel
+ extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart
new file mode 100755
index 0000000..bc5c575
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/dashboard01_recent_activity/dashboard01_recent_activity_widget.dart
@@ -0,0 +1,294 @@
+import '/flutter_flow/flutter_flow_animations.dart';
+import '/flutter_flow/flutter_flow_charts.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'dart:math';
+import '/flutter_flow/random_data_util.dart' as random_data;
+import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:flutter_animate/flutter_animate.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'dashboard01_recent_activity_model.dart';
+export 'dashboard01_recent_activity_model.dart';
+
+class Dashboard01RecentActivityWidget extends StatefulWidget {
+ const Dashboard01RecentActivityWidget({super.key});
+
+ @override
+ State createState() =>
+ _Dashboard01RecentActivityWidgetState();
+}
+
+class _Dashboard01RecentActivityWidgetState
+ extends State
+ with TickerProviderStateMixin {
+ late Dashboard01RecentActivityModel _model;
+
+ final animationsMap = {};
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => Dashboard01RecentActivityModel());
+
+ animationsMap.addAll({
+ 'containerOnPageLoadAnimation': AnimationInfo(
+ trigger: AnimationTrigger.onPageLoad,
+ effectsBuilder: () => [
+ FadeEffect(
+ curve: Curves.easeInOut,
+ delay: 0.0.ms,
+ duration: 300.0.ms,
+ begin: 0.0,
+ end: 1.0,
+ ),
+ MoveEffect(
+ curve: Curves.easeInOut,
+ delay: 0.0.ms,
+ duration: 300.0.ms,
+ begin: Offset(0.0, 20.0),
+ end: Offset(0.0, 0.0),
+ ),
+ TiltEffect(
+ curve: Curves.easeInOut,
+ delay: 0.0.ms,
+ duration: 300.0.ms,
+ begin: Offset(0.698, 0),
+ end: Offset(0, 0),
+ ),
+ ],
+ ),
+ });
+ setupAnimations(
+ animationsMap.values.where((anim) =>
+ anim.trigger == AnimationTrigger.onActionTrigger ||
+ !anim.applyInitialState),
+ this,
+ );
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 24.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 3.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 12.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 0.0, 0.0),
+ child: Text(
+ 'Recent Activity',
+ style: FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 0.0, 0.0),
+ child: Text(
+ 'Below is an overview of tasks & activity completed.',
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Container(
+ height: 32.0,
+ constraints: BoxConstraints(
+ maxHeight: 32.0,
+ ),
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ borderRadius: BorderRadius.circular(30.0),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 8.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.radio_button_checked_sharp,
+ color: Color(0xFFEF3939),
+ size: 20.0,
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Text(
+ 'UV',
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Container(
+ height: 32.0,
+ constraints: BoxConstraints(
+ maxHeight: 32.0,
+ ),
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ borderRadius: BorderRadius.circular(30.0),
+ ),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(8.0, 0.0, 8.0, 0.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(
+ Icons.radio_button_checked_sharp,
+ color: Color(0xFFD2AE39),
+ size: 20.0,
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(
+ 8.0, 0.0, 0.0, 0.0),
+ child: Text(
+ 'Temperature',
+ style: FlutterFlowTheme.of(context)
+ .bodyMedium
+ .override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0),
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(10.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ borderRadius: BorderRadius.circular(10.0),
+ ),
+ alignment: AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 16.0, 0.0, 0.0),
+ child: Container(
+ width: double.infinity,
+ height: 300.0,
+ child: FlutterFlowLineChart(
+ data: [
+ FFLineChartData(
+ xData: List.generate(
+ random_data.randomInteger(5, 5),
+ (index) => random_data.randomDate()),
+ yData: List.generate(
+ random_data.randomInteger(5, 5),
+ (index) =>
+ random_data.randomInteger(0, 1000)),
+ settings: LineChartBarData(
+ color: Color(0xFFEF3939),
+ barWidth: 2.0,
+ isCurved: true,
+ preventCurveOverShooting: true,
+ dotData: FlDotData(show: false),
+ belowBarData: BarAreaData(
+ show: true,
+ color: Color(0x4CEF3939),
+ ),
+ ),
+ ),
+ FFLineChartData(
+ xData: List.generate(
+ random_data.randomInteger(5, 5),
+ (index) => random_data.randomInteger(0, 10)),
+ yData: List.generate(
+ random_data.randomInteger(5, 5),
+ (index) => random_data.randomInteger(0, 10)),
+ settings: LineChartBarData(
+ color: Color(0xFFD2AE39),
+ barWidth: 2.0,
+ isCurved: true,
+ preventCurveOverShooting: true,
+ dotData: FlDotData(show: false),
+ belowBarData: BarAreaData(
+ show: true,
+ color: Color(0x4CD2AE39),
+ ),
+ ),
+ )
+ ],
+ chartStylingInfo: ChartStylingInfo(
+ backgroundColor:
+ FlutterFlowTheme.of(context).primaryBackground,
+ showBorder: false,
+ ),
+ axisBounds: AxisBounds(),
+ xAxisLabelInfo: AxisLabelInfo(),
+ yAxisLabelInfo: AxisLabelInfo(),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ).animateOnPageLoad(animationsMap['containerOnPageLoadAnimation']!),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/healthy/healthy_model.dart b/Application Product/Source/source/lib/widget/healthy/healthy_model.dart
new file mode 100755
index 0000000..02dc008
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/healthy/healthy_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'healthy_widget.dart' show HealthyWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class HealthyModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/healthy/healthy_widget.dart b/Application Product/Source/source/lib/widget/healthy/healthy_widget.dart
new file mode 100755
index 0000000..8e5fce9
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/healthy/healthy_widget.dart
@@ -0,0 +1,107 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'healthy_model.dart';
+export 'healthy_model.dart';
+
+class HealthyWidget extends StatefulWidget {
+ const HealthyWidget({super.key});
+
+ @override
+ State createState() => _HealthyWidgetState();
+}
+
+class _HealthyWidgetState extends State {
+ late HealthyModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => HealthyModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 12.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 7.0,
+ color: Color(0x2F1D2429),
+ offset: Offset(
+ 0.0,
+ 3.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(12.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(8.0),
+ child: Image.asset(
+ 'assets/images/ultraviolet_radiation_hero_image.jpg',
+ width: double.infinity,
+ height: 100.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 8.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Text(
+ 'UV Damage Skin cells',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Expanded(
+ child: Text(
+ 'UV rays can damage skin cells, leading to DNA mutations, which increase the risk of skin cancers such as melanoma',
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_model.dart b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_model.dart
new file mode 100755
index 0000000..5ee9744
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'healthy_copy_widget.dart' show HealthyCopyWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class HealthyCopyModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_widget.dart b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_widget.dart
new file mode 100755
index 0000000..8abd6eb
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/healthy_copy/healthy_copy_widget.dart
@@ -0,0 +1,107 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'healthy_copy_model.dart';
+export 'healthy_copy_model.dart';
+
+class HealthyCopyWidget extends StatefulWidget {
+ const HealthyCopyWidget({super.key});
+
+ @override
+ State createState() => _HealthyCopyWidgetState();
+}
+
+class _HealthyCopyWidgetState extends State {
+ late HealthyCopyModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => HealthyCopyModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 12.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 7.0,
+ color: Color(0x2F1D2429),
+ offset: Offset(
+ 0.0,
+ 3.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(12.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(8.0),
+ child: Image.asset(
+ 'assets/images/sun-eye.jpg',
+ width: double.infinity,
+ height: 100.0,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 8.0, 0.0, 8.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Text(
+ 'The Eyes',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Expanded(
+ child: Text(
+ 'UV exposure can contribute to macular degeneration, a leading cause of age-related blindness.',
+ style: FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/material_card2/material_card2_model.dart b/Application Product/Source/source/lib/widget/material_card2/material_card2_model.dart
new file mode 100755
index 0000000..391d1d6
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/material_card2/material_card2_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'material_card2_widget.dart' show MaterialCard2Widget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class MaterialCard2Model extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/material_card2/material_card2_widget.dart b/Application Product/Source/source/lib/widget/material_card2/material_card2_widget.dart
new file mode 100755
index 0000000..77b57f7
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/material_card2/material_card2_widget.dart
@@ -0,0 +1,140 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'material_card2_model.dart';
+export 'material_card2_model.dart';
+
+class MaterialCard2Widget extends StatefulWidget {
+ const MaterialCard2Widget({super.key});
+
+ @override
+ State createState() => _MaterialCard2WidgetState();
+}
+
+class _MaterialCard2WidgetState extends State {
+ late MaterialCard2Model _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => MaterialCard2Model());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 12.0),
+ child: Container(
+ width: double.infinity,
+ constraints: BoxConstraints(
+ maxWidth: 530.0,
+ ),
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 3.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(12.0),
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).primaryBackground,
+ width: 1.0,
+ ),
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0),
+ child: Container(
+ width: 44.0,
+ height: 44.0,
+ decoration: BoxDecoration(
+ color: Color(0xFFEF3939),
+ shape: BoxShape.circle,
+ ),
+ alignment: AlignmentDirectional(0.0, 0.0),
+ child: Text(
+ 'AD',
+ style: FlutterFlowTheme.of(context).titleMedium.override(
+ fontFamily: 'Inter Tight',
+ color: Colors.white,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Our Advice ',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 4.0, 0.0, 0.0),
+ child: Text(
+ 'Pay Attention',
+ style:
+ FlutterFlowTheme.of(context).labelMedium.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Container(
+ width: 100.0,
+ height: 80.0,
+ decoration: BoxDecoration(
+ color: Color(0xFFF4D23D),
+ borderRadius: BorderRadius.only(
+ bottomLeft: Radius.circular(0.0),
+ bottomRight: Radius.circular(12.0),
+ topLeft: Radius.circular(0.0),
+ topRight: Radius.circular(12.0),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/team/team_model.dart b/Application Product/Source/source/lib/widget/team/team_model.dart
new file mode 100755
index 0000000..2e2f1ef
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/team/team_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'team_widget.dart' show TeamWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class TeamModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/team/team_widget.dart b/Application Product/Source/source/lib/widget/team/team_widget.dart
new file mode 100755
index 0000000..eff825e
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/team/team_widget.dart
@@ -0,0 +1,179 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'team_model.dart';
+export 'team_model.dart';
+
+class TeamWidget extends StatefulWidget {
+ const TeamWidget({super.key});
+
+ @override
+ State createState() => _TeamWidgetState();
+}
+
+class _TeamWidgetState extends State {
+ late TeamModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => TeamModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Align(
+ alignment: AlignmentDirectional(0.0, 0.0),
+ child: Padding(
+ padding: EdgeInsets.all(16.0),
+ child: Container(
+ width: double.infinity,
+ constraints: BoxConstraints(
+ maxWidth: 1170.0,
+ ),
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 3.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ borderRadius: BorderRadius.circular(8.0),
+ border: Border.all(
+ color: FlutterFlowTheme.of(context).alternate,
+ width: 1.0,
+ ),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.max,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 12.0, 0.0),
+ child: AnimatedDefaultTextStyle(
+ style: FlutterFlowTheme.of(context).headlineMedium.override(
+ fontFamily: 'Roboto',
+ color: Colors.black,
+ fontSize: 28.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.w600,
+ ),
+ duration: Duration(milliseconds: 600),
+ curve: Curves.easeInOut,
+ child: Text(
+ 'Meet Our Team',
+ ),
+ ),
+ ),
+ ListView(
+ padding: EdgeInsets.zero,
+ shrinkWrap: true,
+ scrollDirection: Axis.vertical,
+ children: [
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: 100.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0.0,
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: 100.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0.0,
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 1.0),
+ child: Container(
+ width: 100.0,
+ decoration: BoxDecoration(
+ color:
+ FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 0.0,
+ color: FlutterFlowTheme.of(context)
+ .primaryBackground,
+ offset: Offset(
+ 0.0,
+ 1.0,
+ ),
+ )
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ClipRRect(
+ borderRadius: BorderRadius.circular(8.0),
+ child: Image.asset(
+ 'assets/images/White_Purple_Modern_Meet_Our_Team_LinkedIn_Post_(2).png',
+ width: 1194.0,
+ height: 620.0,
+ fit: BoxFit.contain,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/temp/temp_model.dart b/Application Product/Source/source/lib/widget/temp/temp_model.dart
new file mode 100755
index 0000000..580c2c6
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/temp/temp_model.dart
@@ -0,0 +1,19 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'temp_widget.dart' show TempWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class TempModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ // State field(s) for Slider widget.
+ double? sliderValue;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/temp/temp_widget.dart b/Application Product/Source/source/lib/widget/temp/temp_widget.dart
new file mode 100755
index 0000000..134936b
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/temp/temp_widget.dart
@@ -0,0 +1,185 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'temp_model.dart';
+export 'temp_model.dart';
+
+class TempWidget extends StatefulWidget {
+ const TempWidget({super.key});
+
+ @override
+ State createState() => _TempWidgetState();
+}
+
+class _TempWidgetState extends State {
+ late TempModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => TempModel());
+
+ WidgetsBinding.instance.addPostFrameCallback((_) => safeSetState(() {}));
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0),
+ child: Container(
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 2.0,
+ ),
+ spreadRadius: 0.0,
+ )
+ ],
+ borderRadius: BorderRadius.circular(12.0),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Heating',
+ style:
+ FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ 'Current temperature',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: 60.0,
+ height: 60.0,
+ decoration: BoxDecoration(
+ color: Color(0xFFEF3939),
+ borderRadius: BorderRadius.circular(30.0),
+ ),
+ child: Icon(
+ Icons.thermostat,
+ color: FlutterFlowTheme.of(context).info,
+ size: 30.0,
+ ),
+ ),
+ ],
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ '22°C',
+ style: FlutterFlowTheme.of(context).displaySmall.override(
+ fontFamily: 'Inter Tight',
+ color: Color(0xFFA10808),
+ letterSpacing: 0.0,
+ ),
+ ),
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Text(
+ 'Target',
+ style: FlutterFlowTheme.of(context).bodySmall.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ '24°C',
+ style: FlutterFlowTheme.of(context).titleLarge.override(
+ fontFamily: 'Inter Tight',
+ color: Color(0xFFA10808),
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ].divide(SizedBox(width: 16.0)),
+ ),
+ Container(
+ width: double.infinity,
+ child: Slider(
+ activeColor: Color(0xFFA10808),
+ inactiveColor: Color(0x33000000),
+ min: 15.0,
+ max: 30.0,
+ value: _model.sliderValue ??= 24.0,
+ onChanged: (newValue) {
+ newValue = double.parse(newValue.toStringAsFixed(4));
+ safeSetState(() => _model.sliderValue = newValue);
+ },
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ '15°C',
+ style: FlutterFlowTheme.of(context).bodySmall.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ '30°C',
+ style: FlutterFlowTheme.of(context).bodySmall.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ].divide(SizedBox(height: 16.0)),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_model.dart b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_model.dart
new file mode 100755
index 0000000..a149abe
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_model.dart
@@ -0,0 +1,21 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'temp_and_u_v_widget.dart' show TempAndUVWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class TempAndUVModel extends FlutterFlowModel {
+ /// State fields for stateful widgets in this component.
+
+ // State field(s) for Slider widget.
+ double? sliderValue1;
+ // State field(s) for Slider widget.
+ double? sliderValue2;
+
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_widget.dart b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_widget.dart
new file mode 100755
index 0000000..13b0a8d
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/temp_and_u_v/temp_and_u_v_widget.dart
@@ -0,0 +1,182 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'temp_and_u_v_model.dart';
+export 'temp_and_u_v_model.dart';
+
+class TempAndUVWidget extends StatefulWidget {
+ const TempAndUVWidget({super.key});
+
+ @override
+ State createState() => _TempAndUVWidgetState();
+}
+
+class _TempAndUVWidgetState extends State {
+ late TempAndUVModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => TempAndUVModel());
+
+ WidgetsBinding.instance.addPostFrameCallback((_) => safeSetState(() {}));
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Opacity(
+ opacity: 0.8,
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0),
+ child: Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: Color(0xFF710F0F),
+ borderRadius: BorderRadius.circular(16.0),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'UV Index',
+ style: FlutterFlowTheme.of(context)
+ .headlineSmall
+ .override(
+ fontFamily: 'Inter Tight',
+ color: Colors.white,
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ 'Moderate',
+ style:
+ FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: Color(0xFF96989C),
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ Text(
+ '5.6',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: Color(0xFFFDFAF9),
+ fontSize: 29.0,
+ letterSpacing: 0.0,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: double.infinity,
+ child: Slider(
+ activeColor: Color(0xFF00FFFD),
+ inactiveColor: Color(0xFFE0E0E0),
+ min: 0.0,
+ max: 11.0,
+ value: _model.sliderValue1 ??= 5.0,
+ onChanged: (newValue) {
+ newValue = double.parse(newValue.toStringAsFixed(4));
+ safeSetState(() => _model.sliderValue1 = newValue);
+ },
+ ),
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Temperature',
+ style: FlutterFlowTheme.of(context)
+ .headlineSmall
+ .override(
+ fontFamily: 'Inter Tight',
+ color: Colors.white,
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ 'Warm',
+ style:
+ FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: Color(0xFF9EA1A3),
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ Text(
+ '28°C',
+ style:
+ FlutterFlowTheme.of(context).headlineMedium.override(
+ fontFamily: 'Inter Tight',
+ color: Colors.white,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: double.infinity,
+ child: Slider(
+ activeColor: Color(0xFFFFC122),
+ inactiveColor: Color(0xFFE0E0E0),
+ min: -10.0,
+ max: 40.0,
+ value: _model.sliderValue2 ??= 28.0,
+ onChanged: (newValue) {
+ newValue = double.parse(newValue.toStringAsFixed(4));
+ safeSetState(() => _model.sliderValue2 = newValue);
+ },
+ ),
+ ),
+ Text(
+ '28°C',
+ style: FlutterFlowTheme.of(context).headlineMedium.override(
+ fontFamily: 'Inter Tight',
+ color: Colors.white,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ].divide(SizedBox(height: 16.0)),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/time_count/time_count_model.dart b/Application Product/Source/source/lib/widget/time_count/time_count_model.dart
new file mode 100755
index 0000000..ca63603
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/time_count/time_count_model.dart
@@ -0,0 +1,15 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'time_count_widget.dart' show TimeCountWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class TimeCountModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/time_count/time_count_widget.dart b/Application Product/Source/source/lib/widget/time_count/time_count_widget.dart
new file mode 100755
index 0000000..3f5bf1a
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/time_count/time_count_widget.dart
@@ -0,0 +1,136 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import '/flutter_flow/flutter_flow_widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'time_count_model.dart';
+export 'time_count_model.dart';
+
+class TimeCountWidget extends StatefulWidget {
+ const TimeCountWidget({super.key});
+
+ @override
+ State createState() => _TimeCountWidgetState();
+}
+
+class _TimeCountWidgetState extends State {
+ late TimeCountModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => TimeCountModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: double.infinity,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 2.0,
+ ),
+ spreadRadius: 0.0,
+ )
+ ],
+ borderRadius: BorderRadius.circular(16.0),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ '30 Minutes',
+ style: FlutterFlowTheme.of(context).headlineLarge.override(
+ fontFamily: 'Inter Tight',
+ color: Color(0xFFEF3939),
+ letterSpacing: 0.0,
+ ),
+ ),
+ Icon(
+ Icons.access_time,
+ color: Color(0xFFEF3939),
+ size: 32.0,
+ ),
+ ],
+ ),
+ Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Monday',
+ style: FlutterFlowTheme.of(context).bodyLarge.override(
+ fontFamily: 'Inter',
+ letterSpacing: 0.0,
+ ),
+ ),
+ Text(
+ 'May 15, 2023',
+ style: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Inter',
+ color: FlutterFlowTheme.of(context).secondaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ FFButtonWidget(
+ onPressed: () {
+ print('Button pressed ...');
+ },
+ text: 'Dangerous!',
+ options: FFButtonOptions(
+ width: 120.0,
+ height: 40.0,
+ padding: EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ iconPadding:
+ EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+ color: Color(0x63ECCC44),
+ textStyle: FlutterFlowTheme.of(context).bodyMedium.override(
+ fontFamily: 'Open Sans',
+ color: Colors.black,
+ fontSize: 17.0,
+ letterSpacing: 0.0,
+ ),
+ elevation: 0.0,
+ borderRadius: BorderRadius.circular(20.0),
+ ),
+ ),
+ ],
+ ),
+ ].divide(SizedBox(height: 12.0)),
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/lib/widget/what/what_model.dart b/Application Product/Source/source/lib/widget/what/what_model.dart
new file mode 100755
index 0000000..8177507
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/what/what_model.dart
@@ -0,0 +1,14 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'what_widget.dart' show WhatWidget;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+
+class WhatModel extends FlutterFlowModel {
+ @override
+ void initState(BuildContext context) {}
+
+ @override
+ void dispose() {}
+}
diff --git a/Application Product/Source/source/lib/widget/what/what_widget.dart b/Application Product/Source/source/lib/widget/what/what_widget.dart
new file mode 100755
index 0000000..d74df4b
--- /dev/null
+++ b/Application Product/Source/source/lib/widget/what/what_widget.dart
@@ -0,0 +1,78 @@
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:provider/provider.dart';
+import 'what_model.dart';
+export 'what_model.dart';
+
+class WhatWidget extends StatefulWidget {
+ const WhatWidget({super.key});
+
+ @override
+ State createState() => _WhatWidgetState();
+}
+
+class _WhatWidgetState extends State {
+ late WhatModel _model;
+
+ @override
+ void setState(VoidCallback callback) {
+ super.setState(callback);
+ _model.onUpdate();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _model = createModel(context, () => WhatModel());
+ }
+
+ @override
+ void dispose() {
+ _model.maybeDispose();
+
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: 248.0,
+ height: 100.0,
+ decoration: BoxDecoration(
+ color: FlutterFlowTheme.of(context).secondaryBackground,
+ boxShadow: [
+ BoxShadow(
+ blurRadius: 4.0,
+ color: Color(0x33000000),
+ offset: Offset(
+ 0.0,
+ 2.0,
+ ),
+ spreadRadius: 0.0,
+ )
+ ],
+ borderRadius: BorderRadius.circular(8.0),
+ ),
+ child: Padding(
+ padding: EdgeInsetsDirectional.fromSTEB(16.0, 16.0, 16.0, 16.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Text(
+ 'WHAT TODAY ?',
+ style: FlutterFlowTheme.of(context).headlineSmall.override(
+ fontFamily: 'Inter Tight',
+ color: FlutterFlowTheme.of(context).primaryText,
+ letterSpacing: 0.0,
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/Application Product/Source/source/pubspec.yaml b/Application Product/Source/source/pubspec.yaml
new file mode 100755
index 0000000..01232a9
--- /dev/null
+++ b/Application Product/Source/source/pubspec.yaml
@@ -0,0 +1,146 @@
+name: u_vita
+description: A new Flutter project.
+
+# The following line prevents the package from being accidentally published to
+# pub.dev using `pub publish`. This is preferred for private packages.
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
+
+# The following defines the version and build number for your application.
+# A version number is three numbers separated by dots, like 1.2.43
+# followed by an optional build number separated by a +.
+# Both the version and the builder number may be overridden in flutter
+# build by specifying --build-name and --build-number, respectively.
+# In Android, build-name is used as versionName while build-number used as versionCode.
+# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
+# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
+# Read more about iOS versioning at
+# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
+version: 1.0.0+1
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+dependencies:
+ flutter:
+ sdk: flutter
+ flutter_localizations:
+ sdk: flutter
+ auto_size_text: 3.0.0
+ cached_network_image: 3.3.1
+ collection: 1.18.0
+ file_picker: 8.0.3
+ fl_chart: 0.68.0
+ floating_bottom_navigation_bar: 1.5.2
+ flutter_animate: 4.5.0
+ flutter_cache_manager: 3.3.1
+ flutter_plugin_android_lifecycle: 2.0.20
+ font_awesome_flutter: 10.7.0
+ from_css_color: 2.0.0
+ go_router: 12.1.3
+ google_fonts: 6.1.0
+ intl: 0.19.0
+ json_path: 0.7.2
+ page_transition: 2.1.0
+ path_provider: 2.1.3
+ path_provider_android: 2.2.5
+ path_provider_foundation: 2.4.0
+ path_provider_platform_interface: 2.1.2
+ plugin_platform_interface: 2.1.8
+ pointer_interceptor: 0.10.1
+ provider: 6.1.2
+ shared_preferences: 2.2.2
+ shared_preferences_android: 2.2.1
+ shared_preferences_foundation: 2.3.4
+ shared_preferences_platform_interface: 2.3.1
+ shared_preferences_web: 2.2.1
+ sqflite: 2.2.6
+ table_calendar: 3.1.1
+ timeago: 3.6.1
+ url_launcher: 6.3.0
+ url_launcher_android: 6.3.4
+ url_launcher_ios: 6.3.1
+ url_launcher_platform_interface: 2.3.2
+ uuid: ^4.0.0
+ webview_flutter: 4.7.0
+ webview_flutter_android: 3.15.0
+ webview_flutter_platform_interface: 2.10.0
+ webview_flutter_wkwebview: 3.12.0
+ webviewx_plus: 0.5.0
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^1.0.0
+
+dependency_overrides:
+ http: 1.2.1
+ pointer_interceptor: 0.10.1
+ uuid: ^4.0.0
+ win32: 5.5.1
+
+dev_dependencies:
+ flutter_launcher_icons: 0.13.1
+ flutter_lints: 4.0.0
+ image: 4.0.17
+ lints: 4.0.0
+ flutter_test:
+ sdk: flutter
+
+
+flutter_launcher_icons:
+ android: true
+ ios: true
+ remove_alpha_ios: true
+ web:
+ generate: true
+ image_path: 'assets/images/app_launcher_icon.png'
+
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter.
+flutter:
+
+ # The following line ensures that the Material Icons font is
+ # included with your application, so that you can use the icons in
+ # the material Icons class.
+ uses-material-design: true
+
+ # To add assets to your application, add an assets section, like this:
+ assets:
+ - assets/fonts/
+ - assets/images/
+ - assets/videos/
+ - assets/audios/
+ - assets/lottie_animations/
+ - assets/rive_animations/
+ - assets/pdfs/
+
+
+
+ # An image asset can refer to one or more resolution-specific "variants", see
+ # https://flutter.dev/assets-and-images/#resolution-aware.
+
+ # For details regarding adding assets from package dependencies, see
+ # https://flutter.dev/assets-and-images/#from-packages
+
+ # To add custom fonts to your application, add a fonts section here,
+ # in this "flutter" section. Each entry in this list should have a
+ # "family" key with the font family name, and a "fonts" key with a
+ # list giving the asset and other descriptors for the font. For
+ # example:
+ # fonts:
+ # - family: Schyler
+ # fonts:
+ # - asset: fonts/Schyler-Regular.ttf
+ # - asset: fonts/Schyler-Italic.ttf
+ # style: italic
+ # - family: Trajan Pro
+ # fonts:
+ # - asset: fonts/TrajanPro.ttf
+ # - asset: fonts/TrajanPro_Bold.ttf
+ # weight: 700
+ #
+ # For details regarding fonts from package dependencies,
+ # see https://flutter.dev/custom-fonts/#from-packages
+
diff --git a/Application Product/Source/source/test/widget_test.dart b/Application Product/Source/source/test/widget_test.dart
new file mode 100755
index 0000000..0275d6d
--- /dev/null
+++ b/Application Product/Source/source/test/widget_test.dart
@@ -0,0 +1,17 @@
+// This is a basic Flutter widget test.
+//
+// To perform an interaction with a widget in your test, use the WidgetTester
+// utility that Flutter provides. For example, you can send tap and scroll
+// gestures. You can also use WidgetTester to find child widgets in the widget
+// tree, read text, and verify that the values of widget properties are correct.
+
+import 'package:flutter_test/flutter_test.dart';
+
+import 'package:u_vita/main.dart';
+
+void main() {
+ testWidgets('Counter increments smoke test', (WidgetTester tester) async {
+ // Build our app and trigger a frame.
+ await tester.pumpWidget(MyApp());
+ });
+}
diff --git a/Application Product/Source/source/web/favicon.png b/Application Product/Source/source/web/favicon.png
new file mode 100644
index 0000000..300efae
Binary files /dev/null and b/Application Product/Source/source/web/favicon.png differ
diff --git a/Application Product/Source/source/web/icons/Icon-192.png b/Application Product/Source/source/web/icons/Icon-192.png
new file mode 100644
index 0000000..b749bfe
Binary files /dev/null and b/Application Product/Source/source/web/icons/Icon-192.png differ
diff --git a/Application Product/Source/source/web/icons/Icon-512.png b/Application Product/Source/source/web/icons/Icon-512.png
new file mode 100644
index 0000000..88cfd48
Binary files /dev/null and b/Application Product/Source/source/web/icons/Icon-512.png differ
diff --git a/Application Product/Source/source/web/icons/app_launcher_icon.png b/Application Product/Source/source/web/icons/app_launcher_icon.png
new file mode 100755
index 0000000..fef18ef
Binary files /dev/null and b/Application Product/Source/source/web/icons/app_launcher_icon.png differ
diff --git a/Application Product/Source/source/web/index.html b/Application Product/Source/source/web/index.html
new file mode 100755
index 0000000..943d10a
--- /dev/null
+++ b/Application Product/Source/source/web/index.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UVita
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Application Product/Source/u_vita.zip b/Application Product/Source/u_vita.zip
deleted file mode 100644
index cbd7dee..0000000
Binary files a/Application Product/Source/u_vita.zip and /dev/null differ