├── .gitignore
├── .metadata
├── .vscode
├── launch.json
└── settings.json
├── LICENSE.md
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── flutter_web_dashboard
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
├── fonts
│ └── MyriadPro
│ │ ├── MyriadPro-Black.ttf
│ │ ├── MyriadPro-Bold.ttf
│ │ ├── MyriadPro-Light.ttf
│ │ ├── MyriadPro-Regular.ttf
│ │ └── MyriadPro-Semibold.ttf
└── icons
│ ├── bell.svg
│ ├── chart_purple.svg
│ ├── cup.svg
│ ├── home.svg
│ ├── new_user_blue.svg
│ ├── rocket_orange.svg
│ ├── speedometer_yellow.svg
│ ├── stack.svg
│ └── white_logo.svg
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── lib
├── dummy_data
│ └── charts_data.dart
├── main.dart
└── presentation
│ ├── core
│ └── web_dashboard_app.dart
│ ├── page
│ ├── content_management_page
│ │ └── page.dart
│ ├── dashboard_page
│ │ ├── components
│ │ │ ├── active_users_box.dart
│ │ │ ├── devices_box.dart
│ │ │ ├── information_box.dart
│ │ │ ├── information_row.dart
│ │ │ ├── platforms_box.dart
│ │ │ └── statistics_box
│ │ │ │ ├── box.dart
│ │ │ │ ├── demographics.dart
│ │ │ │ ├── interests.dart
│ │ │ │ └── location.dart
│ │ └── page.dart
│ ├── main_page
│ │ ├── components
│ │ │ ├── appbar.dart
│ │ │ └── navigation_menu.dart
│ │ └── page.dart
│ └── user_loyalty_and_rewards_page
│ │ └── user_loyalty_and_rewards_page.dart
│ ├── routes
│ ├── app_router.dart
│ └── app_router.gr.dart
│ ├── theme
│ ├── gen
│ │ ├── assets.gen.dart
│ │ └── fonts.gen.dart
│ ├── palette.dart
│ └── text_styles.dart
│ ├── utils
│ └── color_extension.dart
│ └── widget
│ └── name_and_color_row.dart
├── pubspec.lock
├── pubspec.yaml
├── test
└── widget_test.dart
└── web
├── favicon.ico
├── icons
├── Icon-192.png
├── Icon-512.png
├── Icon-maskable-192.png
└── Icon-maskable-512.png
├── index.html
└── manifest.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 |
34 | # Web related
35 | lib/generated_plugin_registrant.dart
36 |
37 | # Symbolication related
38 | app.*.symbols
39 |
40 | # Obfuscation related
41 | app.*.map.json
42 |
43 | # Android Studio will place build artifacts here
44 | /android/app/debug
45 | /android/app/profile
46 | /android/app/release
47 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 18116933e77adc82f80866c928266a5b4f1ed645
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Dashboard (Debug)",
6 | "request": "launch",
7 | "type": "dart",
8 | "flutterMode": "debug",
9 | },
10 | {
11 | "name": "Dashboard (Profile)",
12 | "request": "launch",
13 | "type": "dart",
14 | "flutterMode": "profile",
15 | },
16 | {
17 | "name": "Dashboard (Release)",
18 | "request": "launch",
19 | "type": "dart",
20 | "flutterMode": "release",
21 | },
22 | ]
23 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.bracketPairColorization.enabled": true,
3 | "editor.guides.bracketPairs": "active",
4 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ## About the project
6 | The goal of the project is to show the capabilities of [Flutter Web](https://flutter.dev/multi-platform/web).
7 |
8 | This is a dashboard that allows users to manage tasks, projects, files, view statistic and share them with their teammates based on the Flutter Web.
9 |
10 |
11 |
12 |
13 |
14 |
15 | ## Features
16 | - Manage tasks.
17 | - Projects.
18 | - Files.
19 | - View statistic with charts.
20 | - Responsive design.
21 |
22 |
23 |
24 |
25 | ## Built with
26 | - [Flutter Web](https://flutter.dev/multi-platform/web) - Easily reach more users in browsers with the same experience as on mobile devices through the power of Flutter on the web.
27 | - [Visual Studio Code](https://code.visualstudio.com/) - Code Editing.
28 | - [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) - To separate architecture into loosely coupled layers.
29 | - [Auto Route](https://pub.dev/packages/auto_route) - Navigation of the application.
30 | - [Fl Chart](https://pub.dev/packages/fl_chart) - Pie Chart and Vertical Bar Charts .
31 | - [Syncfusion Flutter Charts](https://pub.dev/packages/syncfusion_flutter_charts) - Horizontal Bar Charts.
32 |
33 |
34 |
35 | ## Horizontal Bar Charts
36 |
37 | 
38 |
39 |
40 | ```dart
41 | SfCartesianChart(
42 | margin: EdgeInsets.zero,
43 | plotAreaBorderWidth: 0,
44 | title: ChartTitle(
45 | text: 'Age',
46 | textStyle: TextStyles.myriadProSemiBold14DarkBlue,
47 | alignment: ChartAlignment.near,
48 | ),
49 | primaryXAxis: CategoryAxis(
50 | axisLabelFormatter: (AxisLabelRenderDetails details) {
51 | return ChartAxisLabel(
52 | details.text,
53 | TextStyles.myriadProRegular13DarkBlue.copyWith(
54 | color: Palette.darkBlue.withOpacity(0.6),
55 | fontSize: 12.8,
56 | ),
57 | );
58 | },
59 | axisLine: const AxisLine(width: 0),
60 | majorTickLines: const MajorTickLines(size: 0),
61 | majorGridLines: const MajorGridLines(width: 0),
62 | isVisible: true,
63 | ),
64 | primaryYAxis: NumericAxis(
65 | axisLabelFormatter: (AxisLabelRenderDetails details) {
66 | return ChartAxisLabel(
67 | '${details.text}%',
68 | TextStyles.myriadProRegular13DarkBlue.copyWith(
69 | fontSize: 12.8,
70 | ),
71 | );
72 | },
73 | axisLine: const AxisLine(width: 0),
74 | majorTickLines: const MajorTickLines(size: 0, width: 0),
75 | majorGridLines: const MajorGridLines(
76 | width: 0.5,
77 | color: Palette.lightGrey,
78 | ),
79 | minorTickLines: const MinorTickLines(size: 0, width: 0),
80 | minorGridLines: const MinorGridLines(width: 0),
81 | maximum: 15,
82 | ),
83 | palette: const [
84 | Palette.orange,
85 | Palette.lightBlue,
86 | ],
87 | series: [
88 | _createBarSeries(femaleData),
89 | _createBarSeries(maleData),
90 | ],
91 | tooltipBehavior: TooltipBehavior(enable: true),
92 | ),
93 | ```
94 |
95 | ## Vertical Bar Charts
96 | 
97 |
98 |
99 | ```dart
100 | BarChartGroupData(
101 | x: 0,
102 | barsSpace: 20,
103 | barRods: [
104 | ...activeUsersData.entries
105 | .map(
106 | (MapEntry> e) => BarChartRodData(
107 | y: e.value.first,
108 | width: 13,
109 | colors: [Palette.lightBlue],
110 | borderRadius: const BorderRadius.only(
111 | topLeft: Radius.circular(8),
112 | topRight: Radius.circular(8),
113 | ),
114 | backDrawRodData: BackgroundBarChartRodData(
115 | show: true,
116 | y: e.value.last,
117 | colors: [Palette.mediumBlue],
118 | ),
119 | ),
120 | )
121 | .toList(),
122 | ],
123 | ),
124 | ```
125 |
126 | ## Getting Started
127 |
128 |
129 | **Step 1:**
130 |
131 | Download or clone this repo by using the link below:
132 |
133 | ```
134 | https://github.com/TBR-Group-software/flutter_web_dashboard.git
135 | ```
136 |
137 | **Step 2:**
138 |
139 | Go to project root and execute the following command in console to get the required dependencies:
140 |
141 | ```
142 | flutter pub get
143 | ```
144 |
145 | ## License
146 | This project is licensed under the GNU GPL v3 License - see the [LICENSE.md](https://github.com/TBR-Group-software/flutter_web_dashboard/blob/main/LICENSE.md) file for details.
147 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at
17 | # https://dart-lang.github.io/linter/lints/index.html.
18 | #
19 | # Instead of disabling a lint rule for the entire project in the
20 | # section below, it can also be suppressed for a single line of code
21 | # or a specific dart file by using the `// ignore: name_of_lint` and
22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
23 | # producing the lint.
24 | rules:
25 | prefer_single_quotes: true
26 | prefer_relative_imports: true
27 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
28 |
29 | # Additional information about this file can be found at
30 | # https://dart.dev/guides/language/analysis-options
31 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 30
30 |
31 | compileOptions {
32 | sourceCompatibility JavaVersion.VERSION_1_8
33 | targetCompatibility JavaVersion.VERSION_1_8
34 | }
35 |
36 | kotlinOptions {
37 | jvmTarget = '1.8'
38 | }
39 |
40 | sourceSets {
41 | main.java.srcDirs += 'src/main/kotlin'
42 | }
43 |
44 | defaultConfig {
45 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
46 | applicationId "com.example.flutter_web_dashboard"
47 | minSdkVersion 16
48 | targetSdkVersion 30
49 | versionCode flutterVersionCode.toInteger()
50 | versionName flutterVersionName
51 | }
52 |
53 | buildTypes {
54 | release {
55 | // TODO: Add your own signing config for the release build.
56 | // Signing with the debug keys for now, so `flutter run --release` works.
57 | signingConfig signingConfigs.debug
58 | }
59 | }
60 | }
61 |
62 | flutter {
63 | source '../..'
64 | }
65 |
66 | dependencies {
67 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
68 | }
69 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
13 |
17 |
21 |
26 |
30 |
31 |
32 |
33 |
34 |
35 |
37 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/flutter_web_dashboard/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.flutter_web_dashboard
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:4.1.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | project.evaluationDependsOn(':app')
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/assets/fonts/MyriadPro/MyriadPro-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/assets/fonts/MyriadPro/MyriadPro-Black.ttf
--------------------------------------------------------------------------------
/assets/fonts/MyriadPro/MyriadPro-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/assets/fonts/MyriadPro/MyriadPro-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/MyriadPro/MyriadPro-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/assets/fonts/MyriadPro/MyriadPro-Light.ttf
--------------------------------------------------------------------------------
/assets/fonts/MyriadPro/MyriadPro-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/assets/fonts/MyriadPro/MyriadPro-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/MyriadPro/MyriadPro-Semibold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/assets/fonts/MyriadPro/MyriadPro-Semibold.ttf
--------------------------------------------------------------------------------
/assets/icons/bell.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/icons/chart_purple.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/icons/cup.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/icons/home.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/assets/icons/new_user_blue.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/icons/rocket_orange.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/assets/icons/speedometer_yellow.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/icons/stack.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/assets/icons/white_logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 9.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXCopyFilesBuildPhase section */
19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
20 | isa = PBXCopyFilesBuildPhase;
21 | buildActionMask = 2147483647;
22 | dstPath = "";
23 | dstSubfolderSpec = 10;
24 | files = (
25 | );
26 | name = "Embed Frameworks";
27 | runOnlyForDeploymentPostprocessing = 0;
28 | };
29 | /* End PBXCopyFilesBuildPhase section */
30 |
31 | /* Begin PBXFileReference section */
32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
45 | /* End PBXFileReference section */
46 |
47 | /* Begin PBXFrameworksBuildPhase section */
48 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
49 | isa = PBXFrameworksBuildPhase;
50 | buildActionMask = 2147483647;
51 | files = (
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | /* End PBXFrameworksBuildPhase section */
56 |
57 | /* Begin PBXGroup section */
58 | 9740EEB11CF90186004384FC /* Flutter */ = {
59 | isa = PBXGroup;
60 | children = (
61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
65 | );
66 | name = Flutter;
67 | sourceTree = "";
68 | };
69 | 97C146E51CF9000F007C117D = {
70 | isa = PBXGroup;
71 | children = (
72 | 9740EEB11CF90186004384FC /* Flutter */,
73 | 97C146F01CF9000F007C117D /* Runner */,
74 | 97C146EF1CF9000F007C117D /* Products */,
75 | );
76 | sourceTree = "";
77 | };
78 | 97C146EF1CF9000F007C117D /* Products */ = {
79 | isa = PBXGroup;
80 | children = (
81 | 97C146EE1CF9000F007C117D /* Runner.app */,
82 | );
83 | name = Products;
84 | sourceTree = "";
85 | };
86 | 97C146F01CF9000F007C117D /* Runner */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
92 | 97C147021CF9000F007C117D /* Info.plist */,
93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
97 | );
98 | path = Runner;
99 | sourceTree = "";
100 | };
101 | /* End PBXGroup section */
102 |
103 | /* Begin PBXNativeTarget section */
104 | 97C146ED1CF9000F007C117D /* Runner */ = {
105 | isa = PBXNativeTarget;
106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
107 | buildPhases = (
108 | 9740EEB61CF901F6004384FC /* Run Script */,
109 | 97C146EA1CF9000F007C117D /* Sources */,
110 | 97C146EB1CF9000F007C117D /* Frameworks */,
111 | 97C146EC1CF9000F007C117D /* Resources */,
112 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
114 | );
115 | buildRules = (
116 | );
117 | dependencies = (
118 | );
119 | name = Runner;
120 | productName = Runner;
121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
122 | productType = "com.apple.product-type.application";
123 | };
124 | /* End PBXNativeTarget section */
125 |
126 | /* Begin PBXProject section */
127 | 97C146E61CF9000F007C117D /* Project object */ = {
128 | isa = PBXProject;
129 | attributes = {
130 | LastUpgradeCheck = 1020;
131 | ORGANIZATIONNAME = "";
132 | TargetAttributes = {
133 | 97C146ED1CF9000F007C117D = {
134 | CreatedOnToolsVersion = 7.3.1;
135 | LastSwiftMigration = 1100;
136 | };
137 | };
138 | };
139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
140 | compatibilityVersion = "Xcode 9.3";
141 | developmentRegion = en;
142 | hasScannedForEncodings = 0;
143 | knownRegions = (
144 | en,
145 | Base,
146 | );
147 | mainGroup = 97C146E51CF9000F007C117D;
148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
149 | projectDirPath = "";
150 | projectRoot = "";
151 | targets = (
152 | 97C146ED1CF9000F007C117D /* Runner */,
153 | );
154 | };
155 | /* End PBXProject section */
156 |
157 | /* Begin PBXResourcesBuildPhase section */
158 | 97C146EC1CF9000F007C117D /* Resources */ = {
159 | isa = PBXResourcesBuildPhase;
160 | buildActionMask = 2147483647;
161 | files = (
162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
166 | );
167 | runOnlyForDeploymentPostprocessing = 0;
168 | };
169 | /* End PBXResourcesBuildPhase section */
170 |
171 | /* Begin PBXShellScriptBuildPhase section */
172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
173 | isa = PBXShellScriptBuildPhase;
174 | buildActionMask = 2147483647;
175 | files = (
176 | );
177 | inputPaths = (
178 | );
179 | name = "Thin Binary";
180 | outputPaths = (
181 | );
182 | runOnlyForDeploymentPostprocessing = 0;
183 | shellPath = /bin/sh;
184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
185 | };
186 | 9740EEB61CF901F6004384FC /* Run Script */ = {
187 | isa = PBXShellScriptBuildPhase;
188 | buildActionMask = 2147483647;
189 | files = (
190 | );
191 | inputPaths = (
192 | );
193 | name = "Run Script";
194 | outputPaths = (
195 | );
196 | runOnlyForDeploymentPostprocessing = 0;
197 | shellPath = /bin/sh;
198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
199 | };
200 | /* End PBXShellScriptBuildPhase section */
201 |
202 | /* Begin PBXSourcesBuildPhase section */
203 | 97C146EA1CF9000F007C117D /* Sources */ = {
204 | isa = PBXSourcesBuildPhase;
205 | buildActionMask = 2147483647;
206 | files = (
207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
209 | );
210 | runOnlyForDeploymentPostprocessing = 0;
211 | };
212 | /* End PBXSourcesBuildPhase section */
213 |
214 | /* Begin PBXVariantGroup section */
215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
216 | isa = PBXVariantGroup;
217 | children = (
218 | 97C146FB1CF9000F007C117D /* Base */,
219 | );
220 | name = Main.storyboard;
221 | sourceTree = "";
222 | };
223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
224 | isa = PBXVariantGroup;
225 | children = (
226 | 97C147001CF9000F007C117D /* Base */,
227 | );
228 | name = LaunchScreen.storyboard;
229 | sourceTree = "";
230 | };
231 | /* End PBXVariantGroup section */
232 |
233 | /* Begin XCBuildConfiguration section */
234 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
235 | isa = XCBuildConfiguration;
236 | buildSettings = {
237 | ALWAYS_SEARCH_USER_PATHS = NO;
238 | CLANG_ANALYZER_NONNULL = YES;
239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
240 | CLANG_CXX_LIBRARY = "libc++";
241 | CLANG_ENABLE_MODULES = YES;
242 | CLANG_ENABLE_OBJC_ARC = YES;
243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
244 | CLANG_WARN_BOOL_CONVERSION = YES;
245 | CLANG_WARN_COMMA = YES;
246 | CLANG_WARN_CONSTANT_CONVERSION = YES;
247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
249 | CLANG_WARN_EMPTY_BODY = YES;
250 | CLANG_WARN_ENUM_CONVERSION = YES;
251 | CLANG_WARN_INFINITE_RECURSION = YES;
252 | CLANG_WARN_INT_CONVERSION = YES;
253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
258 | CLANG_WARN_STRICT_PROTOTYPES = YES;
259 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
260 | CLANG_WARN_UNREACHABLE_CODE = YES;
261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
263 | COPY_PHASE_STRIP = NO;
264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
265 | ENABLE_NS_ASSERTIONS = NO;
266 | ENABLE_STRICT_OBJC_MSGSEND = YES;
267 | GCC_C_LANGUAGE_STANDARD = gnu99;
268 | GCC_NO_COMMON_BLOCKS = YES;
269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271 | GCC_WARN_UNDECLARED_SELECTOR = YES;
272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273 | GCC_WARN_UNUSED_FUNCTION = YES;
274 | GCC_WARN_UNUSED_VARIABLE = YES;
275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
276 | MTL_ENABLE_DEBUG_INFO = NO;
277 | SDKROOT = iphoneos;
278 | SUPPORTED_PLATFORMS = iphoneos;
279 | TARGETED_DEVICE_FAMILY = "1,2";
280 | VALIDATE_PRODUCT = YES;
281 | };
282 | name = Profile;
283 | };
284 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
285 | isa = XCBuildConfiguration;
286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
287 | buildSettings = {
288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
289 | CLANG_ENABLE_MODULES = YES;
290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
291 | ENABLE_BITCODE = NO;
292 | INFOPLIST_FILE = Runner/Info.plist;
293 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
294 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebDashboard;
295 | PRODUCT_NAME = "$(TARGET_NAME)";
296 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
297 | SWIFT_VERSION = 5.0;
298 | VERSIONING_SYSTEM = "apple-generic";
299 | };
300 | name = Profile;
301 | };
302 | 97C147031CF9000F007C117D /* Debug */ = {
303 | isa = XCBuildConfiguration;
304 | buildSettings = {
305 | ALWAYS_SEARCH_USER_PATHS = NO;
306 | CLANG_ANALYZER_NONNULL = YES;
307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
308 | CLANG_CXX_LIBRARY = "libc++";
309 | CLANG_ENABLE_MODULES = YES;
310 | CLANG_ENABLE_OBJC_ARC = YES;
311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
312 | CLANG_WARN_BOOL_CONVERSION = YES;
313 | CLANG_WARN_COMMA = YES;
314 | CLANG_WARN_CONSTANT_CONVERSION = YES;
315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
317 | CLANG_WARN_EMPTY_BODY = YES;
318 | CLANG_WARN_ENUM_CONVERSION = YES;
319 | CLANG_WARN_INFINITE_RECURSION = YES;
320 | CLANG_WARN_INT_CONVERSION = YES;
321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
326 | CLANG_WARN_STRICT_PROTOTYPES = YES;
327 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
328 | CLANG_WARN_UNREACHABLE_CODE = YES;
329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
331 | COPY_PHASE_STRIP = NO;
332 | DEBUG_INFORMATION_FORMAT = dwarf;
333 | ENABLE_STRICT_OBJC_MSGSEND = YES;
334 | ENABLE_TESTABILITY = YES;
335 | GCC_C_LANGUAGE_STANDARD = gnu99;
336 | GCC_DYNAMIC_NO_PIC = NO;
337 | GCC_NO_COMMON_BLOCKS = YES;
338 | GCC_OPTIMIZATION_LEVEL = 0;
339 | GCC_PREPROCESSOR_DEFINITIONS = (
340 | "DEBUG=1",
341 | "$(inherited)",
342 | );
343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
345 | GCC_WARN_UNDECLARED_SELECTOR = YES;
346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
347 | GCC_WARN_UNUSED_FUNCTION = YES;
348 | GCC_WARN_UNUSED_VARIABLE = YES;
349 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
350 | MTL_ENABLE_DEBUG_INFO = YES;
351 | ONLY_ACTIVE_ARCH = YES;
352 | SDKROOT = iphoneos;
353 | TARGETED_DEVICE_FAMILY = "1,2";
354 | };
355 | name = Debug;
356 | };
357 | 97C147041CF9000F007C117D /* Release */ = {
358 | isa = XCBuildConfiguration;
359 | buildSettings = {
360 | ALWAYS_SEARCH_USER_PATHS = NO;
361 | CLANG_ANALYZER_NONNULL = YES;
362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
363 | CLANG_CXX_LIBRARY = "libc++";
364 | CLANG_ENABLE_MODULES = YES;
365 | CLANG_ENABLE_OBJC_ARC = YES;
366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
367 | CLANG_WARN_BOOL_CONVERSION = YES;
368 | CLANG_WARN_COMMA = YES;
369 | CLANG_WARN_CONSTANT_CONVERSION = YES;
370 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
371 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
372 | CLANG_WARN_EMPTY_BODY = YES;
373 | CLANG_WARN_ENUM_CONVERSION = YES;
374 | CLANG_WARN_INFINITE_RECURSION = YES;
375 | CLANG_WARN_INT_CONVERSION = YES;
376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
381 | CLANG_WARN_STRICT_PROTOTYPES = YES;
382 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
383 | CLANG_WARN_UNREACHABLE_CODE = YES;
384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
386 | COPY_PHASE_STRIP = NO;
387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
388 | ENABLE_NS_ASSERTIONS = NO;
389 | ENABLE_STRICT_OBJC_MSGSEND = YES;
390 | GCC_C_LANGUAGE_STANDARD = gnu99;
391 | GCC_NO_COMMON_BLOCKS = YES;
392 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
393 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
394 | GCC_WARN_UNDECLARED_SELECTOR = YES;
395 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
396 | GCC_WARN_UNUSED_FUNCTION = YES;
397 | GCC_WARN_UNUSED_VARIABLE = YES;
398 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
399 | MTL_ENABLE_DEBUG_INFO = NO;
400 | SDKROOT = iphoneos;
401 | SUPPORTED_PLATFORMS = iphoneos;
402 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
403 | TARGETED_DEVICE_FAMILY = "1,2";
404 | VALIDATE_PRODUCT = YES;
405 | };
406 | name = Release;
407 | };
408 | 97C147061CF9000F007C117D /* Debug */ = {
409 | isa = XCBuildConfiguration;
410 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
411 | buildSettings = {
412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
413 | CLANG_ENABLE_MODULES = YES;
414 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
415 | ENABLE_BITCODE = NO;
416 | INFOPLIST_FILE = Runner/Info.plist;
417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
418 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebDashboard;
419 | PRODUCT_NAME = "$(TARGET_NAME)";
420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
422 | SWIFT_VERSION = 5.0;
423 | VERSIONING_SYSTEM = "apple-generic";
424 | };
425 | name = Debug;
426 | };
427 | 97C147071CF9000F007C117D /* Release */ = {
428 | isa = XCBuildConfiguration;
429 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
430 | buildSettings = {
431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
432 | CLANG_ENABLE_MODULES = YES;
433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
434 | ENABLE_BITCODE = NO;
435 | INFOPLIST_FILE = Runner/Info.plist;
436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
437 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebDashboard;
438 | PRODUCT_NAME = "$(TARGET_NAME)";
439 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
440 | SWIFT_VERSION = 5.0;
441 | VERSIONING_SYSTEM = "apple-generic";
442 | };
443 | name = Release;
444 | };
445 | /* End XCBuildConfiguration section */
446 |
447 | /* Begin XCConfigurationList section */
448 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
449 | isa = XCConfigurationList;
450 | buildConfigurations = (
451 | 97C147031CF9000F007C117D /* Debug */,
452 | 97C147041CF9000F007C117D /* Release */,
453 | 249021D3217E4FDB00AE95B9 /* Profile */,
454 | );
455 | defaultConfigurationIsVisible = 0;
456 | defaultConfigurationName = Release;
457 | };
458 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
459 | isa = XCConfigurationList;
460 | buildConfigurations = (
461 | 97C147061CF9000F007C117D /* Debug */,
462 | 97C147071CF9000F007C117D /* Release */,
463 | 249021D4217E4FDB00AE95B9 /* Profile */,
464 | );
465 | defaultConfigurationIsVisible = 0;
466 | defaultConfigurationName = Release;
467 | };
468 | /* End XCConfigurationList section */
469 | };
470 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
471 | }
472 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | flutter_web_dashboard
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/lib/dummy_data/charts_data.dart:
--------------------------------------------------------------------------------
1 | class UsersAgeData {
2 | const UsersAgeData(this.age, this.percent);
3 |
4 | final String age;
5 | final double percent;
6 | }
7 |
8 | const List femaleData = [
9 | UsersAgeData('65+', 5.5),
10 | UsersAgeData('45 - 56', 5.5),
11 | UsersAgeData('35 - 44', 7.5),
12 | UsersAgeData('25 - 34', 9),
13 | UsersAgeData('18 - 24', 9),
14 | ];
15 |
16 | const List maleData = [
17 | UsersAgeData('65+', 4.5),
18 | UsersAgeData('45 - 56', 4.9),
19 | UsersAgeData('35 - 44', 9),
20 | UsersAgeData('25 - 34', 14),
21 | UsersAgeData('18 - 24', 8),
22 | ];
23 |
24 | const Map> activeUsersData = >{
25 | 1: [200, 310],
26 | 2: [305, 450],
27 | 3: [270, 390],
28 | 4: [210, 310],
29 | 5: [100, 160],
30 | 6: [300, 450],
31 | 7: [210, 310],
32 | 8: [150, 210],
33 | 9: [210, 310],
34 | 10: [210, 308],
35 | };
36 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import 'presentation/core/web_dashboard_app.dart';
4 |
5 | void main() {
6 | runApp(const WebDashboardApp());
7 | }
8 |
--------------------------------------------------------------------------------
/lib/presentation/core/web_dashboard_app.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../routes/app_router.dart';
4 |
5 | class WebDashboardApp extends StatefulWidget {
6 | const WebDashboardApp({super.key});
7 |
8 | @override
9 | State createState() => _WebDashboardAppState();
10 | }
11 |
12 | class _WebDashboardAppState extends State {
13 | final _appRouter = AppRouter();
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | return MaterialApp.router(
18 | title: 'Web dashboard',
19 | routerDelegate: _appRouter.delegate(),
20 | routeInformationParser: _appRouter.defaultRouteParser(),
21 | );
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/presentation/page/content_management_page/page.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_route/auto_route.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | @RoutePage()
5 | class ContentManagementPage extends StatelessWidget {
6 | const ContentManagementPage({super.key});
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return const Padding(
11 | padding: EdgeInsets.symmetric(vertical: 26, horizontal: 40),
12 | child: Text('Content Management'),
13 | );
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/active_users_box.dart:
--------------------------------------------------------------------------------
1 | import 'package:fl_chart/fl_chart.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:intl/intl.dart';
4 |
5 | import '../../../../dummy_data/charts_data.dart';
6 | import '../../../theme/palette.dart';
7 | import '../../../theme/text_styles.dart';
8 | import '../../../widget/name_and_color_row.dart';
9 |
10 | class ActiveUsersBox extends StatelessWidget {
11 | const ActiveUsersBox({super.key});
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return Container(
16 | width: 558,
17 | height: 340,
18 | decoration: BoxDecoration(
19 | color: Colors.white,
20 | borderRadius: BorderRadius.circular(6),
21 | ),
22 | child: const Row(
23 | children: [
24 | Padding(
25 | padding: EdgeInsets.only(left: 32.0, top: 32.0, right: 45),
26 | child: Column(
27 | crossAxisAlignment: CrossAxisAlignment.start,
28 | children: [
29 | Text(
30 | 'Active Users',
31 | style: TextStyles.myriadProSemiBold22DarkBlue,
32 | ),
33 | SizedBox(height: 24),
34 | _BarChart(),
35 | SizedBox(height: 20),
36 | Row(
37 | children: [
38 | NameAndColorRow(color: Palette.lightBlue, text: 'Users'),
39 | SizedBox(width: 36),
40 | NameAndColorRow(
41 | color: Palette.mediumBlue, text: 'New Users'),
42 | ],
43 | ),
44 | ],
45 | ),
46 | ),
47 | _DetailsColumn(
48 | daily: 23,
49 | monthly: 233,
50 | annual: 232323,
51 | ),
52 | ],
53 | ),
54 | );
55 | }
56 | }
57 |
58 | class _BarChart extends StatelessWidget {
59 | const _BarChart();
60 |
61 | @override
62 | Widget build(BuildContext context) {
63 | return ConstrainedBox(
64 | constraints: const BoxConstraints(maxHeight: 191, maxWidth: 366),
65 | child: BarChart(
66 | BarChartData(
67 | maxY: 500,
68 | alignment: BarChartAlignment.center,
69 | barTouchData: BarTouchData(enabled: false),
70 | titlesData: FlTitlesData(
71 | show: true,
72 | bottomTitles: const AxisTitles(),
73 | topTitles: const AxisTitles(),
74 | rightTitles: const AxisTitles(),
75 | leftTitles: AxisTitles(
76 | sideTitles: SideTitles(
77 | reservedSize: 30,
78 | showTitles: true,
79 | getTitlesWidget: (value, __) => SideTitleWidget(
80 | axisSide: AxisSide.left,
81 | child: Align(
82 | alignment: Alignment.centerLeft,
83 | child: Text(
84 | '$value',
85 | style: TextStyles.myriadProRegular13DarkBlue60,
86 | ),
87 | ),
88 | ),
89 | ),
90 | ),
91 | ),
92 | gridData: FlGridData(
93 | show: true,
94 | drawVerticalLine: false,
95 | getDrawingHorizontalLine: (_) => const FlLine(
96 | color: Palette.mediumGrey40,
97 | strokeWidth: 1,
98 | ),
99 | ),
100 | borderData: FlBorderData(
101 | show: true,
102 | border: const Border(
103 | top: BorderSide(color: Palette.mediumGrey40, width: 1),
104 | ),
105 | ),
106 | barGroups: _chartData,
107 | ),
108 | ),
109 | );
110 | }
111 |
112 | static final List _chartData = [
113 | BarChartGroupData(
114 | x: 0,
115 | barsSpace: 20,
116 | barRods: [
117 | ...activeUsersData.entries.map(
118 | (MapEntry> e) => BarChartRodData(
119 | toY: e.value.first,
120 | width: 13,
121 | color: Palette.lightBlue,
122 | borderRadius: const BorderRadius.only(
123 | topLeft: Radius.circular(8),
124 | topRight: Radius.circular(8),
125 | ),
126 | backDrawRodData: BackgroundBarChartRodData(
127 | show: true,
128 | toY: e.value.last,
129 | color: Palette.mediumBlue,
130 | ),
131 | ),
132 | ),
133 | ],
134 | ),
135 | ];
136 | }
137 |
138 | class _DetailsColumn extends StatelessWidget {
139 | const _DetailsColumn({
140 | required this.annual,
141 | required this.monthly,
142 | required this.daily,
143 | });
144 |
145 | final int annual;
146 |
147 | final int monthly;
148 |
149 | final int daily;
150 |
151 | @override
152 | Widget build(BuildContext context) {
153 | return Container(
154 | width: 92,
155 | height: 301,
156 | decoration: BoxDecoration(
157 | color: Palette.mediumBlue50,
158 | borderRadius: BorderRadius.circular(6),
159 | ),
160 | padding: const EdgeInsets.symmetric(vertical: 15),
161 | child: const Column(
162 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
163 | mainAxisSize: MainAxisSize.min,
164 | children: [
165 | _NumberAndTitle(
166 | title: 'Annual',
167 | number: 232323,
168 | numberTextStyle: TextStyles.myriadProSemiBold18Purple,
169 | ),
170 | Divider(color: Palette.mediumBlue),
171 | _NumberAndTitle(
172 | title: 'Monthly',
173 | number: 233,
174 | numberTextStyle: TextStyles.myriadProSemiBold18Orange,
175 | ),
176 | Divider(color: Palette.mediumBlue),
177 | _NumberAndTitle(
178 | title: 'Daily',
179 | number: 23,
180 | numberTextStyle: TextStyles.myriadProSemiBold18LightBlue,
181 | ),
182 | ],
183 | ),
184 | );
185 | }
186 | }
187 |
188 | class _NumberAndTitle extends StatelessWidget {
189 | const _NumberAndTitle({
190 | required this.title,
191 | required this.number,
192 | required this.numberTextStyle,
193 | });
194 |
195 | final String title;
196 |
197 | final int number;
198 | final TextStyle numberTextStyle;
199 |
200 | String _formatNumber(int number) {
201 | if (number.toString().length >= 10) {
202 | return NumberFormat.compact().format(number);
203 | } else {
204 | return NumberFormat.decimalPattern().format(number).replaceAll(',', ' ');
205 | }
206 | }
207 |
208 | @override
209 | Widget build(BuildContext context) {
210 | return Column(
211 | mainAxisSize: MainAxisSize.min,
212 | children: [
213 | Text(_formatNumber(number), style: numberTextStyle),
214 | const SizedBox(height: 7.6),
215 | Text(title, style: TextStyles.myriadProRegular13DarkGrey),
216 | ],
217 | );
218 | }
219 | }
220 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/devices_box.dart:
--------------------------------------------------------------------------------
1 | part of '../page.dart';
2 |
3 | class _DevicesBox extends StatelessWidget {
4 | const _DevicesBox();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return Container(
9 | constraints: const BoxConstraints(maxWidth: 559, minHeight: 340),
10 | padding: const EdgeInsets.all(32),
11 | decoration: BoxDecoration(
12 | color: Colors.white,
13 | borderRadius: BorderRadius.circular(6),
14 | ),
15 | child: const Column(
16 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
17 | children: [
18 | _DevicesBoxElement(
19 | text: 'Devices',
20 | buttonText: 'View All',
21 | colors: [Palette.purple, Palette.orange, Palette.lightBlue],
22 | percents: [35 / 100, 20 / 100, 13 / 100],
23 | markersName: ['Iphone XR', 'Iphone', 'Chrome'],
24 | ),
25 | Divider(color: Palette.lightBlue10),
26 | _DevicesBoxElement(
27 | text: 'OS Version',
28 | colors: [Palette.purple, Palette.orange, Palette.lightBlue],
29 | percents: [30 / 100, 20 / 100, 13 / 100],
30 | markersName: ['Android', 'iOS 14.3', 'iOS 14.4'],
31 | ),
32 | ],
33 | ),
34 | );
35 | }
36 | }
37 |
38 | class _DevicesBoxElement extends StatelessWidget {
39 | const _DevicesBoxElement({
40 | required this.text,
41 | required this.colors,
42 | required this.percents,
43 | required this.markersName,
44 | this.buttonText,
45 | });
46 |
47 | final String text;
48 |
49 | final String? buttonText;
50 |
51 | final List colors;
52 |
53 | final List percents;
54 |
55 | final List markersName;
56 |
57 | @override
58 | Widget build(BuildContext context) {
59 | return Column(
60 | mainAxisSize: MainAxisSize.min,
61 | crossAxisAlignment: CrossAxisAlignment.start,
62 | children: [
63 | Row(
64 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
65 | children: [
66 | Text(text, style: TextStyles.myriadProSemiBold22DarkBlue),
67 | if (buttonText != null)
68 | InkWell(
69 | onTap: () {},
70 | child: Text(
71 | buttonText!,
72 | style: TextStyles.myriadProSemiBold16LightBlue,
73 | ),
74 | ),
75 | ],
76 | ),
77 | const SizedBox(height: 24),
78 | SizedBox(
79 | height: 12,
80 | width: double.infinity,
81 | child: CustomPaint(
82 | painter: _BarPainter(
83 | backgroundColor: Palette.mediumBlue,
84 | valuesColor: colors,
85 | values: percents,
86 | ),
87 | ),
88 | ),
89 | const SizedBox(height: 24),
90 | Wrap(
91 | spacing: 36,
92 | runSpacing: 10,
93 | children: [
94 | ...List.generate(colors.length + 1, (int index) {
95 | if (index == colors.length) {
96 | return const NameAndColorRow(
97 | color: Palette.mediumBlue,
98 | text: 'Others',
99 | );
100 | }
101 | return NameAndColorRow(
102 | color: colors[index],
103 | text: markersName[index],
104 | );
105 | }),
106 | ],
107 | ),
108 | ],
109 | );
110 | }
111 | }
112 |
113 | class _BarPainter extends CustomPainter {
114 | const _BarPainter({
115 | required this.backgroundColor,
116 | required this.valuesColor,
117 | required this.values,
118 | });
119 |
120 | final Color backgroundColor;
121 | final List valuesColor;
122 |
123 | ///Length of [values] list always should be equal length of [valuesColor] list.
124 | ///Sum of values should be <= 1
125 | final List values;
126 |
127 | @override
128 | void paint(Canvas canvas, Size size) {
129 | final Paint paint = Paint()
130 | ..color = backgroundColor
131 | ..style = PaintingStyle.fill;
132 |
133 | canvas.drawRRect(
134 | RRect.fromRectAndRadius(Offset.zero & size, const Radius.circular(4)),
135 | paint,
136 | );
137 |
138 | void drawBar(double x, double width) {
139 | if (width <= 0.0) return;
140 |
141 | canvas.drawRRect(
142 | RRect.fromRectAndRadius(
143 | Offset(x, 0.0) & Size(width, size.height),
144 | const Radius.circular(4),
145 | ),
146 | paint,
147 | );
148 | }
149 |
150 | double currentOffset = 0;
151 | for (int i = 0; i < values.length; i++) {
152 | paint.color = valuesColor[i];
153 | drawBar(currentOffset, values[i].clamp(0.0, 1.0) * size.width);
154 |
155 | currentOffset += values[i].clamp(0.0, 1.0) * size.width + 6;
156 | }
157 | }
158 |
159 | @override
160 | bool shouldRepaint(_BarPainter oldPainter) {
161 | return oldPainter.backgroundColor != backgroundColor ||
162 | oldPainter.valuesColor != valuesColor ||
163 | oldPainter.values != values;
164 | }
165 | }
166 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/information_box.dart:
--------------------------------------------------------------------------------
1 | part of '../page.dart';
2 |
3 | class _InformationBox extends StatelessWidget {
4 | const _InformationBox({
5 | required this.icon,
6 | required this.backgroundColor,
7 | required this.number,
8 | required this.percent,
9 | required this.text,
10 | required this.haveIncreased,
11 | this.showPercent = false,
12 | });
13 |
14 | final Widget icon;
15 | final Color backgroundColor;
16 |
17 | final int number;
18 |
19 | final bool showPercent;
20 |
21 | final double percent;
22 |
23 | final bool haveIncreased;
24 |
25 | final String text;
26 |
27 | String _formatNumber(int number) {
28 | if (number.toString().length >= 10) {
29 | return NumberFormat.compact().format(number);
30 | } else {
31 | return NumberFormat.decimalPattern().format(number).replaceAll(',', ' ');
32 | }
33 | }
34 |
35 | @override
36 | Widget build(BuildContext context) {
37 | return Container(
38 | width: 268,
39 | padding: const EdgeInsets.only(top: 22, bottom: 22),
40 | decoration: BoxDecoration(
41 | color: Colors.white,
42 | borderRadius: BorderRadius.circular(6),
43 | ),
44 | child: Column(
45 | children: [
46 | CircleAvatar(
47 | radius: 24,
48 | backgroundColor: backgroundColor,
49 | child: icon,
50 | ),
51 | const SizedBox(height: 16),
52 | Row(
53 | mainAxisSize: MainAxisSize.min,
54 | children: [
55 | Text(
56 | showPercent ? '$number%' : _formatNumber(number),
57 | style: TextStyles.myriadProSemiBold24Dark,
58 | ),
59 | const SizedBox(width: 5),
60 | Icon(
61 | haveIncreased ? Icons.arrow_drop_up : Icons.arrow_drop_down,
62 | size: 20,
63 | color: haveIncreased ? Palette.green : Palette.red,
64 | ),
65 | Text(
66 | '$percent%',
67 | style: haveIncreased
68 | ? TextStyles.myriadProSemiBold12Green
69 | : TextStyles.myriadProSemiBold12Red,
70 | ),
71 | ],
72 | ),
73 | const SizedBox(height: 7),
74 | Text(text, style: TextStyles.myriadProRegular16DarkGrey),
75 | ],
76 | ),
77 | );
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/information_row.dart:
--------------------------------------------------------------------------------
1 | part of '../page.dart';
2 |
3 | class _InformationRow extends StatelessWidget {
4 | const _InformationRow();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return Wrap(
9 | spacing: 22,
10 | runSpacing: 22,
11 | children: [
12 | _InformationBox(
13 | icon: ProjectAssets.icons.rocketOrange.svg(),
14 | backgroundColor: Palette.orange.withOpacity(0.1),
15 | number: 21343,
16 | haveIncreased: true,
17 | percent: 3.9,
18 | text: 'Total Installation',
19 | ),
20 | _InformationBox(
21 | icon: ProjectAssets.icons.chartPurple.svg(),
22 | backgroundColor: Palette.lightPurple.withOpacity(0.8),
23 | number: 22424,
24 | haveIncreased: true,
25 | percent: 3.9,
26 | text: 'Total Active Users',
27 | ),
28 | _InformationBox(
29 | icon: ProjectAssets.icons.newUserBlue.svg(),
30 | backgroundColor: Palette.lightBlue.withOpacity(0.1),
31 | number: 353,
32 | haveIncreased: true,
33 | percent: 3.9,
34 | text: 'New Users',
35 | ),
36 | _InformationBox(
37 | icon: ProjectAssets.icons.speedometerYellow.svg(),
38 | backgroundColor: Palette.yellow.withOpacity(0.2),
39 | number: 34,
40 | showPercent: true,
41 | haveIncreased: true,
42 | percent: 3.9,
43 | text: 'Retention Rate',
44 | ),
45 | ],
46 | );
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/platforms_box.dart:
--------------------------------------------------------------------------------
1 | part of '../page.dart';
2 |
3 | class _PlatformsBox extends StatelessWidget {
4 | const _PlatformsBox();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return Container(
9 | width: 268,
10 | height: 430,
11 | padding: const EdgeInsets.fromLTRB(32, 22, 32, 32),
12 | decoration: BoxDecoration(
13 | color: Colors.white,
14 | borderRadius: BorderRadius.circular(6),
15 | ),
16 | child: const Column(
17 | crossAxisAlignment: CrossAxisAlignment.start,
18 | children: [
19 | Text(
20 | 'Platforms',
21 | style: TextStyles.myriadProSemiBold22DarkBlue,
22 | ),
23 | SizedBox(height: 24),
24 | _Circles(),
25 | SizedBox(height: 21),
26 | _PlatformsList(),
27 | ],
28 | ),
29 | );
30 | }
31 | }
32 |
33 | class _Circles extends StatelessWidget {
34 | const _Circles();
35 |
36 | @override
37 | Widget build(BuildContext context) {
38 | return const SizedBox(
39 | width: 170,
40 | height: 150,
41 | child: Stack(
42 | children: [
43 | Positioned(
44 | bottom: 25,
45 | child: CircleAvatar(
46 | radius: 45,
47 | backgroundColor: Palette.purple,
48 | child: Text(
49 | '30',
50 | style: TextStyles.myriadProSemiBold22White,
51 | ),
52 | ),
53 | ),
54 | Positioned(
55 | bottom: 0,
56 | left: 55,
57 | child: CircleAvatar(
58 | radius: 32,
59 | backgroundColor: Palette.lightBlue,
60 | child: Text(
61 | '10',
62 | style: TextStyles.myriadProSemiBold22White,
63 | ),
64 | ),
65 | ),
66 | Positioned(
67 | left: 60,
68 | child: CircleAvatar(
69 | radius: 55,
70 | backgroundColor: Palette.orange,
71 | child: Text(
72 | '60',
73 | style: TextStyles.myriadProSemiBold24White,
74 | ),
75 | ),
76 | ),
77 | ],
78 | ),
79 | );
80 | }
81 | }
82 |
83 | class _PlatformsList extends StatelessWidget {
84 | const _PlatformsList();
85 |
86 | @override
87 | Widget build(BuildContext context) {
88 | return const Column(
89 | children: [
90 | _PlatformListElement(
91 | platformName: 'Android',
92 | percent: 60,
93 | foregroundColor: Palette.orange,
94 | backgroundColor: Palette.orange10,
95 | ),
96 | SizedBox(height: 20),
97 | _PlatformListElement(
98 | platformName: 'iOS',
99 | percent: 30,
100 | foregroundColor: Palette.purple,
101 | backgroundColor: Palette.purple10,
102 | ),
103 | SizedBox(height: 20),
104 | _PlatformListElement(
105 | platformName: 'Web',
106 | percent: 10,
107 | foregroundColor: Palette.lightBlue,
108 | backgroundColor: Palette.lightBlue10,
109 | ),
110 | ],
111 | );
112 | }
113 | }
114 |
115 | class _PlatformListElement extends StatelessWidget {
116 | const _PlatformListElement({
117 | required this.platformName,
118 | required this.percent,
119 | required this.backgroundColor,
120 | required this.foregroundColor,
121 | });
122 |
123 | final String platformName;
124 |
125 | final double percent;
126 |
127 | final Color backgroundColor;
128 | final Color foregroundColor;
129 |
130 | @override
131 | Widget build(BuildContext context) {
132 | return Column(
133 | mainAxisSize: MainAxisSize.min,
134 | children: [
135 | Row(
136 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
137 | children: [
138 | Text(platformName, style: TextStyles.myriadProSemiBold13Dark),
139 | Text('$percent%', style: TextStyles.myriadProRegular13DarkGrey),
140 | ],
141 | ),
142 | const SizedBox(height: 3),
143 | SizedBox(
144 | height: 10,
145 | width: double.infinity,
146 | child: CustomPaint(
147 | painter: _PercentBarPainter(
148 | backgroundColor: backgroundColor,
149 | valueColor: foregroundColor,
150 | value: percent / 100,
151 | ),
152 | ),
153 | ),
154 | ],
155 | );
156 | }
157 | }
158 |
159 | class _PercentBarPainter extends CustomPainter {
160 | const _PercentBarPainter({
161 | required this.backgroundColor,
162 | required this.valueColor,
163 | required this.value,
164 | });
165 |
166 | final Color backgroundColor;
167 | final Color valueColor;
168 |
169 | final double value;
170 |
171 | @override
172 | void paint(Canvas canvas, Size size) {
173 | final Paint paint = Paint()
174 | ..color = backgroundColor
175 | ..style = PaintingStyle.fill;
176 | canvas.drawRRect(
177 | RRect.fromRectAndRadius(Offset.zero & size, const Radius.circular(4.5)),
178 | paint,
179 | );
180 |
181 | paint.color = valueColor;
182 |
183 | void drawBar(double x, double width) {
184 | if (width <= 0.0) return;
185 |
186 | canvas.drawRRect(
187 | RRect.fromRectAndRadius(
188 | Offset(x, 0.0) & Size(width, size.height),
189 | const Radius.circular(4.5),
190 | ),
191 | paint,
192 | );
193 | }
194 |
195 | drawBar(0.0, value.clamp(0.0, 1.0) * size.width);
196 | }
197 |
198 | @override
199 | bool shouldRepaint(_PercentBarPainter oldPainter) {
200 | return oldPainter.backgroundColor != backgroundColor ||
201 | oldPainter.valueColor != valueColor ||
202 | oldPainter.value != value;
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/statistics_box/box.dart:
--------------------------------------------------------------------------------
1 | part of '../../page.dart';
2 |
3 | class _StatisticsBox extends StatefulWidget {
4 | const _StatisticsBox();
5 |
6 | @override
7 | State<_StatisticsBox> createState() => _StatisticsBoxState();
8 | }
9 |
10 | class _StatisticsBoxState extends State<_StatisticsBox> {
11 | final PageController _controller = PageController(initialPage: 1);
12 |
13 | @override
14 | void dispose() {
15 | _controller.dispose();
16 | super.dispose();
17 | }
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return Container(
22 | width: 848,
23 | height: 430,
24 | decoration: BoxDecoration(
25 | color: Colors.white,
26 | borderRadius: BorderRadius.circular(6),
27 | ),
28 | child: Column(
29 | crossAxisAlignment: CrossAxisAlignment.start,
30 | children: [
31 | const Padding(
32 | padding: EdgeInsets.only(top: 32.0, left: 32.0),
33 | child: Text(
34 | 'Statistics',
35 | style: TextStyles.myriadProSemiBold22DarkBlue,
36 | ),
37 | ),
38 | const SizedBox(height: 26),
39 | _StatisticsTabs(pageController: _controller),
40 | Expanded(
41 | child: PageView(
42 | physics: const NeverScrollableScrollPhysics(),
43 | controller: _controller,
44 | children: const [
45 | _LocationPage(),
46 | _DemographicsPage(),
47 | _InterestsPage(),
48 | ],
49 | ),
50 | ),
51 | ],
52 | ),
53 | );
54 | }
55 | }
56 |
57 | class _StatisticsTabs extends StatefulWidget {
58 | const _StatisticsTabs({required this.pageController});
59 |
60 | final PageController pageController;
61 |
62 | @override
63 | _StatisticsTabsState createState() => _StatisticsTabsState();
64 | }
65 |
66 | class _StatisticsTabsState extends State<_StatisticsTabs>
67 | with TickerProviderStateMixin {
68 | late final TabController _controller;
69 |
70 | int selectedIndex = 1;
71 |
72 | @override
73 | void initState() {
74 | super.initState();
75 | _controller = TabController(
76 | length: 3,
77 | vsync: this,
78 | initialIndex: selectedIndex,
79 | );
80 | _controller.addListener(() {
81 | widget.pageController.jumpToPage(_controller.index);
82 | setState(() {
83 | selectedIndex = _controller.index;
84 | });
85 | });
86 | }
87 |
88 | @override
89 | void dispose() {
90 | _controller.dispose();
91 | super.dispose();
92 | }
93 |
94 | @override
95 | Widget build(BuildContext context) {
96 | return TabBar(
97 | padding: const EdgeInsets.only(left: 20),
98 | tabAlignment: TabAlignment.start,
99 | isScrollable: true,
100 | controller: _controller,
101 | indicatorSize: TabBarIndicatorSize.label,
102 | indicatorColor: Palette.lightBlue,
103 | tabs: [
104 | _StatisticsTab(
105 | isSelected: selectedIndex == 0,
106 | text: 'Location',
107 | ),
108 | _StatisticsTab(
109 | isSelected: selectedIndex == 1,
110 | text: 'Demographics',
111 | ),
112 | _StatisticsTab(
113 | isSelected: selectedIndex == 2,
114 | text: 'Interests',
115 | ),
116 | ],
117 | );
118 | }
119 | }
120 |
121 | class _StatisticsTab extends StatelessWidget {
122 | const _StatisticsTab({required this.text, required this.isSelected});
123 |
124 | final bool isSelected;
125 |
126 | final String text;
127 |
128 | @override
129 | Widget build(BuildContext context) {
130 | return SizedBox(
131 | height: 30,
132 | child: Text(
133 | text,
134 | style: isSelected
135 | ? TextStyles.myriadProSemiBold14LightBlue
136 | : TextStyles.myriadProSemiBold14DarkBlue.copyWith(
137 | color: Palette.darkBlue.withOpacity(0.4),
138 | ),
139 | ),
140 | );
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/statistics_box/demographics.dart:
--------------------------------------------------------------------------------
1 | part of '../../page.dart';
2 |
3 | class _DemographicsPage extends StatelessWidget {
4 | const _DemographicsPage();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return const Padding(
9 | padding: EdgeInsets.only(top: 31, bottom: 40),
10 | child: Row(
11 | crossAxisAlignment: CrossAxisAlignment.start,
12 | children: [
13 | _CircleChart(femalePercent: 43.9, malePercent: 56.1),
14 | VerticalDivider(color: Palette.lightGrey),
15 | _BarChart(),
16 | ],
17 | ),
18 | );
19 | }
20 | }
21 |
22 | class _CircleChart extends StatelessWidget {
23 | const _CircleChart({
24 | required this.malePercent,
25 | required this.femalePercent,
26 | });
27 |
28 | final double malePercent;
29 | final double femalePercent;
30 |
31 | List generateSections(
32 | double malePercent,
33 | double femalePercent,
34 | ) {
35 | return [
36 | PieChartSectionData(
37 | color: Palette.lightBlue,
38 | value: malePercent,
39 | radius: 20,
40 | title: '',
41 | ),
42 | PieChartSectionData(
43 | color: Palette.orange,
44 | value: femalePercent,
45 | radius: 20,
46 | title: '',
47 | ),
48 | ];
49 | }
50 |
51 | @override
52 | Widget build(BuildContext context) {
53 | return Padding(
54 | padding: const EdgeInsets.only(left: 31, right: 47),
55 | child: Column(
56 | mainAxisSize: MainAxisSize.min,
57 | children: [
58 | SizedBox(
59 | width: 160,
60 | height: 160,
61 | child: Stack(
62 | alignment: Alignment.center,
63 | children: [
64 | PieChart(
65 | PieChartData(
66 | startDegreeOffset: 270,
67 | sectionsSpace: 0,
68 | centerSpaceRadius: 60,
69 | sections: generateSections(
70 | malePercent,
71 | femalePercent,
72 | ),
73 | ),
74 | ),
75 | const Text(
76 | 'Gender',
77 | style: TextStyles.myriadProSemiBold16DarkBlue,
78 | ),
79 | ],
80 | ),
81 | ),
82 | const SizedBox(height: 30),
83 | Row(
84 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
85 | children: [
86 | _CircleChartBottomInfo(
87 | text: 'Male',
88 | color: Palette.lightBlue,
89 | totalPercent: malePercent,
90 | growthPercent: 3.9,
91 | ),
92 | const SizedBox(width: 50),
93 | _CircleChartBottomInfo(
94 | text: 'Female',
95 | color: Palette.orange,
96 | totalPercent: femalePercent,
97 | growthPercent: 38.9,
98 | haveIncreased: false,
99 | ),
100 | ],
101 | ),
102 | ],
103 | ),
104 | );
105 | }
106 | }
107 |
108 | class _CircleChartBottomInfo extends StatelessWidget {
109 | const _CircleChartBottomInfo({
110 | required this.text,
111 | required this.color,
112 | required this.growthPercent,
113 | required this.totalPercent,
114 | this.haveIncreased = true,
115 | });
116 |
117 | final String text;
118 |
119 | final Color color;
120 |
121 | final double totalPercent;
122 | final double growthPercent;
123 |
124 | final bool haveIncreased;
125 |
126 | @override
127 | Widget build(BuildContext context) {
128 | return Column(
129 | crossAxisAlignment: CrossAxisAlignment.start,
130 | children: [
131 | Row(
132 | children: [
133 | CircleAvatar(backgroundColor: color, radius: 5),
134 | const SizedBox(width: 8),
135 | Text(
136 | text,
137 | style: TextStyles.myriadProRegular13DarkBlue,
138 | ),
139 | ],
140 | ),
141 | Row(
142 | children: [
143 | const SizedBox(width: 20),
144 | Text(
145 | '$totalPercent%',
146 | style: TextStyles.myriadProSemiBold16DarkBlue,
147 | ),
148 | Icon(
149 | haveIncreased ? Icons.arrow_drop_up : Icons.arrow_drop_down,
150 | size: 20,
151 | color: haveIncreased ? Palette.green : Palette.red,
152 | ),
153 | Text(
154 | '$growthPercent%',
155 | style: haveIncreased
156 | ? TextStyles.myriadProSemiBold12Green
157 | : TextStyles.myriadProSemiBold12Red,
158 | ),
159 | ],
160 | ),
161 | ],
162 | );
163 | }
164 | }
165 |
166 | class _BarChart extends StatelessWidget {
167 | const _BarChart();
168 |
169 | BarSeries _createBarSeries(
170 | List dataSource,
171 | ) {
172 | return BarSeries(
173 | spacing: 0.25,
174 | width: 0.9,
175 | trackBorderWidth: 0,
176 | borderRadius: const BorderRadius.only(
177 | topRight: Radius.circular(4),
178 | bottomRight: Radius.circular(4),
179 | ),
180 | enableTooltip: false,
181 | dataSource: dataSource,
182 | xValueMapper: (UsersAgeData data, _) => data.age,
183 | yValueMapper: (UsersAgeData data, _) => data.percent,
184 | );
185 | }
186 |
187 | @override
188 | Widget build(BuildContext context) {
189 | return Padding(
190 | padding: const EdgeInsets.only(left: 63),
191 | child: SfCartesianChart(
192 | margin: EdgeInsets.zero,
193 | plotAreaBorderWidth: 0,
194 | title: const ChartTitle(
195 | text: 'Age',
196 | textStyle: TextStyles.myriadProSemiBold14DarkBlue,
197 | alignment: ChartAlignment.near,
198 | ),
199 | primaryXAxis: CategoryAxis(
200 | axisLabelFormatter: (AxisLabelRenderDetails details) {
201 | return ChartAxisLabel(
202 | details.text,
203 | TextStyles.myriadProRegular13DarkBlue.copyWith(
204 | color: Palette.darkBlue.withOpacity(0.6),
205 | fontSize: 12.8,
206 | ),
207 | );
208 | },
209 | axisLine: const AxisLine(width: 0),
210 | majorTickLines: const MajorTickLines(size: 0),
211 | majorGridLines: const MajorGridLines(width: 0),
212 | isVisible: true,
213 | ),
214 | primaryYAxis: NumericAxis(
215 | axisLabelFormatter: (AxisLabelRenderDetails details) {
216 | return ChartAxisLabel(
217 | '${details.text}%',
218 | TextStyles.myriadProRegular13DarkBlue.copyWith(
219 | fontSize: 12.8,
220 | ),
221 | );
222 | },
223 | axisLine: const AxisLine(width: 0),
224 | majorTickLines: const MajorTickLines(size: 0, width: 0),
225 | majorGridLines: const MajorGridLines(
226 | width: 0.5,
227 | color: Palette.lightGrey,
228 | ),
229 | minorTickLines: const MinorTickLines(size: 0, width: 0),
230 | minorGridLines: const MinorGridLines(width: 0),
231 | maximum: 15,
232 | ),
233 | palette: const [
234 | Palette.orange,
235 | Palette.lightBlue,
236 | ],
237 | series: [
238 | _createBarSeries(femaleData),
239 | _createBarSeries(maleData),
240 | ],
241 | tooltipBehavior: TooltipBehavior(enable: true),
242 | ),
243 | );
244 | }
245 | }
246 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/statistics_box/interests.dart:
--------------------------------------------------------------------------------
1 | part of '../../page.dart';
2 |
3 | class _InterestsPage extends StatelessWidget {
4 | const _InterestsPage();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return const Center(
9 | child: Text('INTERESTS'),
10 | );
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/components/statistics_box/location.dart:
--------------------------------------------------------------------------------
1 | part of '../../page.dart';
2 |
3 | class _LocationPage extends StatelessWidget {
4 | const _LocationPage();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return const Center(
9 | child: Text('LOCATION'),
10 | );
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/lib/presentation/page/dashboard_page/page.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_route/auto_route.dart';
2 | import 'package:fl_chart/fl_chart.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:intl/intl.dart';
5 | import 'package:syncfusion_flutter_charts/charts.dart';
6 |
7 | import '../../../dummy_data/charts_data.dart';
8 | import '../../theme/gen/assets.gen.dart';
9 | import '../../theme/palette.dart';
10 | import '../../theme/text_styles.dart';
11 | import '../../widget/name_and_color_row.dart';
12 | import 'components/active_users_box.dart';
13 |
14 | part 'components/devices_box.dart';
15 | part 'components/information_box.dart';
16 | part 'components/information_row.dart';
17 | part 'components/platforms_box.dart';
18 | part 'components/statistics_box/box.dart';
19 | part 'components/statistics_box/demographics.dart';
20 | part 'components/statistics_box/interests.dart';
21 | part 'components/statistics_box/location.dart';
22 |
23 | @RoutePage()
24 | class DashboardPage extends StatelessWidget {
25 | const DashboardPage({super.key});
26 |
27 | @override
28 | Widget build(BuildContext context) {
29 | return ListView(
30 | padding: const EdgeInsets.symmetric(horizontal: 40),
31 | children: const [
32 | Padding(
33 | padding: EdgeInsets.only(top: 40.0),
34 | child: Text(
35 | 'Welcome back!',
36 | style: TextStyles.myriadProSemiBold32DarkBlue,
37 | ),
38 | ),
39 | SizedBox(height: 28),
40 | _InformationRow(),
41 | SizedBox(height: 22),
42 | Wrap(
43 | spacing: 22,
44 | runSpacing: 22,
45 | children: [
46 | _StatisticsBox(),
47 | _PlatformsBox(),
48 | ],
49 | ),
50 | SizedBox(height: 22),
51 | Wrap(
52 | spacing: 22,
53 | runSpacing: 22,
54 | children: [
55 | _DevicesBox(),
56 | ActiveUsersBox(),
57 | ],
58 | ),
59 | SizedBox(height: 40),
60 | ],
61 | );
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/lib/presentation/page/main_page/components/appbar.dart:
--------------------------------------------------------------------------------
1 | part of '../page.dart';
2 |
3 | class _AppBar extends StatelessWidget {
4 | const _AppBar();
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return const SizedBox(
9 | height: 80,
10 | child: Row(
11 | children: [
12 | Spacer(),
13 | _BellIcon(hasNotifications: true),
14 | SizedBox(width: 34),
15 | CircleAvatar(backgroundColor: Colors.green, radius: 23),
16 | SizedBox(width: 40),
17 | ],
18 | ),
19 | );
20 | }
21 | }
22 |
23 | class _BellIcon extends StatelessWidget {
24 | const _BellIcon({required this.hasNotifications});
25 |
26 | final bool hasNotifications;
27 |
28 | @override
29 | Widget build(BuildContext context) {
30 | return Stack(
31 | alignment: Alignment.topRight,
32 | children: [
33 | ProjectAssets.icons.bell.svg(
34 | width: 24,
35 | height: 27.79,
36 | colorFilter: Palette.black.toColorFilter,
37 | ),
38 | if (hasNotifications)
39 | Container(
40 | margin: const EdgeInsets.all(1),
41 | width: 8,
42 | height: 8,
43 | decoration: BoxDecoration(
44 | color: Palette.blue,
45 | shape: BoxShape.circle,
46 | border: Border.all(color: Palette.dirtyWhite),
47 | ),
48 | ),
49 | ],
50 | );
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/lib/presentation/page/main_page/components/navigation_menu.dart:
--------------------------------------------------------------------------------
1 | part of '../page.dart';
2 |
3 | class _NavigationMenu extends StatefulWidget {
4 | const _NavigationMenu();
5 |
6 | @override
7 | State<_NavigationMenu> createState() => _NavigationMenuState();
8 | }
9 |
10 | class _NavigationMenuState extends State<_NavigationMenu> {
11 | bool _isListenerAdded = false;
12 |
13 | @override
14 | void didChangeDependencies() {
15 | super.didChangeDependencies();
16 | if (!_isListenerAdded) {
17 | AutoRouterDelegate.of(context).addListener(() {
18 | if (mounted) setState(() {});
19 | });
20 | _isListenerAdded = true;
21 | }
22 | }
23 |
24 | void _onTabTap(PageRouteInfo route) {
25 | context.pushRoute(route);
26 | }
27 |
28 | @override
29 | Widget build(BuildContext context) {
30 | final currentUrl = AutoRouterDelegate.of(context).urlState.path;
31 |
32 | return Column(
33 | crossAxisAlignment: CrossAxisAlignment.start,
34 | children: [
35 | Center(
36 | child: Padding(
37 | padding: const EdgeInsets.symmetric(vertical: 32),
38 | child: ProjectAssets.icons.whiteLogo.svg(
39 | height: 14,
40 | width: 127,
41 | colorFilter: Palette.white.toColorFilter,
42 | ),
43 | ),
44 | ),
45 | const SizedBox(height: 40),
46 | _MenuItem(
47 | iconPath: ProjectAssets.icons.home.path,
48 | isSelected: currentUrl == '/dashboard',
49 | onTap: () => _onTabTap(const DashboardRoute()),
50 | text: 'Dashboard',
51 | ),
52 | _MenuItem(
53 | iconPath: ProjectAssets.icons.stack.path,
54 | isSelected: currentUrl == '/content-management',
55 | onTap: () => _onTabTap(const ContentManagementRoute()),
56 | text: 'Content Management',
57 | ),
58 | _MenuItem(
59 | iconPath: ProjectAssets.icons.cup.path,
60 | isSelected: currentUrl == '/user-loyalty-and-rewards',
61 | onTap: () => _onTabTap(const UserLoyaltyAndRewardsRoute()),
62 | text: 'User Loyalty & Rewards',
63 | ),
64 | ],
65 | );
66 | }
67 | }
68 |
69 | class _MenuItem extends StatelessWidget {
70 | const _MenuItem({
71 | required this.iconPath,
72 | required this.text,
73 | required this.isSelected,
74 | required this.onTap,
75 | });
76 |
77 | final String iconPath;
78 |
79 | final String text;
80 |
81 | final void Function() onTap;
82 |
83 | final bool isSelected;
84 |
85 | @override
86 | Widget build(BuildContext context) {
87 | return Flexible(
88 | child: InkWell(
89 | onTap: onTap,
90 | child: Container(
91 | width: 205,
92 | height: 42,
93 | margin: const EdgeInsets.only(bottom: 25),
94 | decoration: isSelected
95 | ? const BoxDecoration(
96 | color: Palette.lightBlue,
97 | borderRadius: BorderRadius.only(
98 | topRight: Radius.circular(8),
99 | bottomRight: Radius.circular(8),
100 | ),
101 | )
102 | : null,
103 | child: Padding(
104 | padding: const EdgeInsets.only(left: 43.0),
105 | child: Row(
106 | children: [
107 | SvgPicture.asset(
108 | iconPath,
109 | width: 16,
110 | height: 16,
111 | colorFilter:
112 | isSelected ? Palette.dirtyWhite.toColorFilter : null,
113 | ),
114 | const SizedBox(width: 8),
115 | Text(
116 | text,
117 | style: isSelected
118 | ? TextStyles.myriadProSemiBold12DirtyWhite
119 | : TextStyles.myriadProSemiBold12DirtyWhite.copyWith(
120 | color: Palette.dirtyWhite.withOpacity(0.8),
121 | ),
122 | ),
123 | ],
124 | ),
125 | ),
126 | ),
127 | ),
128 | );
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/lib/presentation/page/main_page/page.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_route/auto_route.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_svg/svg.dart';
4 |
5 | import '../../routes/app_router.dart';
6 | import '../../theme/gen/assets.gen.dart';
7 | import '../../theme/palette.dart';
8 | import '../../theme/text_styles.dart';
9 | import '../../utils/color_extension.dart';
10 |
11 | part 'components/appbar.dart';
12 | part 'components/navigation_menu.dart';
13 |
14 | @RoutePage()
15 | class MainPage extends StatelessWidget {
16 | const MainPage({super.key});
17 |
18 | @override
19 | Widget build(BuildContext context) {
20 | return const Scaffold(
21 | body: Stack(
22 | children: [
23 | Row(
24 | children: [
25 | SizedBox(
26 | width: 220,
27 | height: double.infinity,
28 | child: ColoredBox(
29 | color: Palette.darkBlue,
30 | child: _NavigationMenu(),
31 | ),
32 | ),
33 | Expanded(
34 | child: ColoredBox(
35 | color: Palette.dirtyWhite,
36 | child: Column(
37 | children: [
38 | _AppBar(),
39 | Expanded(child: AutoRouter()),
40 | ],
41 | ),
42 | ),
43 | ),
44 | ],
45 | ),
46 | Positioned(
47 | top: 80,
48 | left: 0,
49 | right: 0,
50 | child: Divider(
51 | color: Palette.lightBlueGrey38,
52 | thickness: 1,
53 | height: 1,
54 | ),
55 | ),
56 | ],
57 | ),
58 | );
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/lib/presentation/page/user_loyalty_and_rewards_page/user_loyalty_and_rewards_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_route/auto_route.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | @RoutePage()
5 | class UserLoyaltyAndRewardsPage extends StatelessWidget {
6 | const UserLoyaltyAndRewardsPage({super.key});
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return const Padding(
11 | padding: EdgeInsets.symmetric(vertical: 26, horizontal: 40),
12 | child: Text('UserLoyaltyAndRewardsPage'),
13 | );
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/presentation/routes/app_router.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_route/auto_route.dart';
2 |
3 | import '../page/content_management_page/page.dart';
4 | import '../page/dashboard_page/page.dart';
5 | import '../page/main_page/page.dart';
6 | import '../page/user_loyalty_and_rewards_page/user_loyalty_and_rewards_page.dart';
7 |
8 | part 'app_router.gr.dart';
9 |
10 | @AutoRouterConfig()
11 | class AppRouter extends _$AppRouter {
12 | @override
13 | List get routes => [
14 | CustomRoute(
15 | initial: true,
16 | page: MainRoute.page,
17 | transitionsBuilder: TransitionsBuilders.noTransition,
18 | children: [
19 | CustomRoute(
20 | initial: true,
21 | path: 'dashboard',
22 | page: DashboardRoute.page,
23 | durationInMilliseconds: 0,
24 | reverseDurationInMilliseconds: 1,
25 | transitionsBuilder: TransitionsBuilders.noTransition,
26 | ),
27 | CustomRoute(
28 | path: 'content-management',
29 | page: ContentManagementRoute.page,
30 | durationInMilliseconds: 0,
31 | reverseDurationInMilliseconds: 1,
32 | transitionsBuilder: TransitionsBuilders.noTransition,
33 | ),
34 | CustomRoute(
35 | path: 'user-loyalty-and-rewards',
36 | page: UserLoyaltyAndRewardsRoute.page,
37 | durationInMilliseconds: 0,
38 | reverseDurationInMilliseconds: 1,
39 | transitionsBuilder: TransitionsBuilders.noTransition,
40 | ),
41 | ],
42 | ),
43 | ];
44 | }
45 |
--------------------------------------------------------------------------------
/lib/presentation/routes/app_router.gr.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | // **************************************************************************
4 | // AutoRouterGenerator
5 | // **************************************************************************
6 |
7 | // ignore_for_file: type=lint
8 | // coverage:ignore-file
9 |
10 | part of 'app_router.dart';
11 |
12 | abstract class _$AppRouter extends RootStackRouter {
13 | // ignore: unused_element
14 | _$AppRouter({super.navigatorKey});
15 |
16 | @override
17 | final Map pagesMap = {
18 | ContentManagementRoute.name: (routeData) {
19 | return AutoRoutePage(
20 | routeData: routeData,
21 | child: const ContentManagementPage(),
22 | );
23 | },
24 | DashboardRoute.name: (routeData) {
25 | return AutoRoutePage(
26 | routeData: routeData,
27 | child: const DashboardPage(),
28 | );
29 | },
30 | MainRoute.name: (routeData) {
31 | return AutoRoutePage(
32 | routeData: routeData,
33 | child: const MainPage(),
34 | );
35 | },
36 | UserLoyaltyAndRewardsRoute.name: (routeData) {
37 | return AutoRoutePage(
38 | routeData: routeData,
39 | child: const UserLoyaltyAndRewardsPage(),
40 | );
41 | },
42 | };
43 | }
44 |
45 | /// generated route for
46 | /// [ContentManagementPage]
47 | class ContentManagementRoute extends PageRouteInfo {
48 | const ContentManagementRoute({List? children})
49 | : super(
50 | ContentManagementRoute.name,
51 | initialChildren: children,
52 | );
53 |
54 | static const String name = 'ContentManagementRoute';
55 |
56 | static const PageInfo page = PageInfo(name);
57 | }
58 |
59 | /// generated route for
60 | /// [DashboardPage]
61 | class DashboardRoute extends PageRouteInfo {
62 | const DashboardRoute({List? children})
63 | : super(
64 | DashboardRoute.name,
65 | initialChildren: children,
66 | );
67 |
68 | static const String name = 'DashboardRoute';
69 |
70 | static const PageInfo page = PageInfo(name);
71 | }
72 |
73 | /// generated route for
74 | /// [MainPage]
75 | class MainRoute extends PageRouteInfo {
76 | const MainRoute({List? children})
77 | : super(
78 | MainRoute.name,
79 | initialChildren: children,
80 | );
81 |
82 | static const String name = 'MainRoute';
83 |
84 | static const PageInfo page = PageInfo(name);
85 | }
86 |
87 | /// generated route for
88 | /// [UserLoyaltyAndRewardsPage]
89 | class UserLoyaltyAndRewardsRoute extends PageRouteInfo {
90 | const UserLoyaltyAndRewardsRoute({List? children})
91 | : super(
92 | UserLoyaltyAndRewardsRoute.name,
93 | initialChildren: children,
94 | );
95 |
96 | static const String name = 'UserLoyaltyAndRewardsRoute';
97 |
98 | static const PageInfo page = PageInfo(name);
99 | }
100 |
--------------------------------------------------------------------------------
/lib/presentation/theme/gen/assets.gen.dart:
--------------------------------------------------------------------------------
1 | /// GENERATED CODE - DO NOT MODIFY BY HAND
2 | /// *****************************************************
3 | /// FlutterGen
4 | /// *****************************************************
5 |
6 | // coverage:ignore-file
7 | // ignore_for_file: type=lint
8 | // ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
9 |
10 | import 'package:flutter/widgets.dart';
11 | import 'package:flutter_svg/flutter_svg.dart';
12 | import 'package:flutter/services.dart';
13 |
14 | class $AssetsIconsGen {
15 | const $AssetsIconsGen();
16 |
17 | /// File path: assets/icons/bell.svg
18 | SvgGenImage get bell => const SvgGenImage('assets/icons/bell.svg');
19 |
20 | /// File path: assets/icons/chart_purple.svg
21 | SvgGenImage get chartPurple =>
22 | const SvgGenImage('assets/icons/chart_purple.svg');
23 |
24 | /// File path: assets/icons/cup.svg
25 | SvgGenImage get cup => const SvgGenImage('assets/icons/cup.svg');
26 |
27 | /// File path: assets/icons/home.svg
28 | SvgGenImage get home => const SvgGenImage('assets/icons/home.svg');
29 |
30 | /// File path: assets/icons/new_user_blue.svg
31 | SvgGenImage get newUserBlue =>
32 | const SvgGenImage('assets/icons/new_user_blue.svg');
33 |
34 | /// File path: assets/icons/rocket_orange.svg
35 | SvgGenImage get rocketOrange =>
36 | const SvgGenImage('assets/icons/rocket_orange.svg');
37 |
38 | /// File path: assets/icons/speedometer_yellow.svg
39 | SvgGenImage get speedometerYellow =>
40 | const SvgGenImage('assets/icons/speedometer_yellow.svg');
41 |
42 | /// File path: assets/icons/stack.svg
43 | SvgGenImage get stack => const SvgGenImage('assets/icons/stack.svg');
44 |
45 | /// File path: assets/icons/white_logo.svg
46 | SvgGenImage get whiteLogo => const SvgGenImage('assets/icons/white_logo.svg');
47 |
48 | /// List of all assets
49 | List get values => [
50 | bell,
51 | chartPurple,
52 | cup,
53 | home,
54 | newUserBlue,
55 | rocketOrange,
56 | speedometerYellow,
57 | stack,
58 | whiteLogo
59 | ];
60 | }
61 |
62 | class ProjectAssets {
63 | ProjectAssets._();
64 |
65 | static const $AssetsIconsGen icons = $AssetsIconsGen();
66 | }
67 |
68 | class SvgGenImage {
69 | const SvgGenImage(this._assetName);
70 |
71 | final String _assetName;
72 |
73 | SvgPicture svg({
74 | Key? key,
75 | bool matchTextDirection = false,
76 | AssetBundle? bundle,
77 | String? package,
78 | double? width,
79 | double? height,
80 | BoxFit fit = BoxFit.contain,
81 | AlignmentGeometry alignment = Alignment.center,
82 | bool allowDrawingOutsideViewBox = false,
83 | WidgetBuilder? placeholderBuilder,
84 | String? semanticsLabel,
85 | bool excludeFromSemantics = false,
86 | SvgTheme theme = const SvgTheme(),
87 | ColorFilter? colorFilter,
88 | Clip clipBehavior = Clip.hardEdge,
89 | @deprecated Color? color,
90 | @deprecated BlendMode colorBlendMode = BlendMode.srcIn,
91 | @deprecated bool cacheColorFilter = false,
92 | }) {
93 | return SvgPicture.asset(
94 | _assetName,
95 | key: key,
96 | matchTextDirection: matchTextDirection,
97 | bundle: bundle,
98 | package: package,
99 | width: width,
100 | height: height,
101 | fit: fit,
102 | alignment: alignment,
103 | allowDrawingOutsideViewBox: allowDrawingOutsideViewBox,
104 | placeholderBuilder: placeholderBuilder,
105 | semanticsLabel: semanticsLabel,
106 | excludeFromSemantics: excludeFromSemantics,
107 | theme: theme,
108 | colorFilter: colorFilter,
109 | color: color,
110 | colorBlendMode: colorBlendMode,
111 | clipBehavior: clipBehavior,
112 | cacheColorFilter: cacheColorFilter,
113 | );
114 | }
115 |
116 | String get path => _assetName;
117 |
118 | String get keyName => _assetName;
119 | }
120 |
--------------------------------------------------------------------------------
/lib/presentation/theme/gen/fonts.gen.dart:
--------------------------------------------------------------------------------
1 | /// GENERATED CODE - DO NOT MODIFY BY HAND
2 | /// *****************************************************
3 | /// FlutterGen
4 | /// *****************************************************
5 |
6 | // coverage:ignore-file
7 | // ignore_for_file: type=lint
8 | // ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
9 |
10 | class ProjectFontFamily {
11 | ProjectFontFamily._();
12 |
13 | /// Font family: MyriadPro
14 | static const String myriadPro = 'MyriadPro';
15 | }
16 |
--------------------------------------------------------------------------------
/lib/presentation/theme/palette.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class Palette {
4 | ///0xFFF8F9F9
5 | static const dirtyWhite = Color(0xFFF8F9F9);
6 |
7 | ///0xFF5363F6
8 | static const blue = Color(0xFF5363F6);
9 |
10 | ///0xFFE7F0F8
11 | static const mediumBlue = Color(0xFFE7F0F8);
12 |
13 | ///0x80E7F0F8
14 | static const mediumBlue50 = Color(0x80E7F0F8);
15 |
16 | ///0xFF1C86DF
17 | static const lightBlue = Color(0xFF1C86DF);
18 |
19 | ///0x141C86DF
20 | static const lightBlue10 = Color(0x141C86DF);
21 |
22 | ///0xFFC0C5DB
23 | static const lightBlueGrey = Color(0xFFC0C5DB);
24 |
25 | ///0x61C0C5DB
26 | static const lightBlueGrey38 = Color(0x61C0C5DB);
27 |
28 | ///0xFF015DAB
29 | static const brandBlue = Color(0xFF015DAB);
30 |
31 | ///0xFF15224F
32 | static const darkBlue = Color(0xFF15224F);
33 |
34 | ///0x9915224F
35 | static const darkBlue60 = Color(0x9915224F);
36 |
37 | ///0xFF191C24
38 | static const dark = Color(0xFF191C24);
39 |
40 | ///0xFF974DF4
41 | static const purple = Color(0xFF974DF4);
42 |
43 | ///0x19974DF4
44 | static const purple10 = Color(0x19974DF4);
45 |
46 | ///0xFFEEE8F8
47 | static const lightPurple = Color(0xFFEEE8F8);
48 |
49 | ///0xFFFF7537
50 | static const orange = Color(0xFFFF7537);
51 |
52 | ///0x19FF7537
53 | static const orange10 = Color(0x19FF7537);
54 |
55 | ///0xFFFFD233
56 | static const yellow = Color(0xFFFFD233);
57 |
58 | ///0xFF4CD964
59 | static const green = Color(0xFF4CD964);
60 |
61 | ///0xFFF26322
62 | static const brandOrange = Color(0xFFF26322);
63 |
64 | ///0xFF40465B
65 | static const black = Color(0xFF40465B);
66 |
67 | ///0xFF596282
68 | static const darkGrey = Color(0xFF596282);
69 |
70 | ///0xFFA7ACBD
71 | static const grey = Color(0xFFA7ACBD);
72 |
73 | ///0x66ECEDF1
74 | static const mediumGrey40 = Color(0x66ECEDF1);
75 |
76 | ///0xFFEAECEF
77 | static const lightGrey = Color(0xFFEAECEF);
78 |
79 | ///0x1AEAECEF
80 | static const lightGrey10 = Color(0x1AEAECEF);
81 |
82 | ///0xFFFF6A6A
83 | static const red = Color(0xFFFF6A6A);
84 |
85 | ///0xFFFFFFFF
86 | static const white = Color(0xFFFFFFFF);
87 | }
88 |
--------------------------------------------------------------------------------
/lib/presentation/theme/text_styles.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import 'gen/fonts.gen.dart';
4 | import 'palette.dart';
5 |
6 | class TextStyles {
7 | static const _myriadProFontFamily = ProjectFontFamily.myriadPro;
8 |
9 | ///fontFamily: MyriadPro,
10 | ///
11 | ///color: WebDashboardPalette.dirtyWhite,
12 | ///
13 | ///fontSize: 12,
14 | ///
15 | ///fontWeight: FontWeight.w600,
16 |
17 | static const TextStyle myriadProSemiBold12DirtyWhite = TextStyle(
18 | fontFamily: _myriadProFontFamily,
19 | color: Palette.dirtyWhite,
20 | fontSize: 12,
21 | fontWeight: FontWeight.w600,
22 | );
23 |
24 | ///fontFamily: MyriadPro,
25 | ///
26 | ///color: WebDashboardPalette.darkBlue,
27 | ///
28 | ///fontSize: 32,
29 | ///
30 | ///fontWeight: FontWeight.w600,
31 |
32 | static const TextStyle myriadProSemiBold32DarkBlue = TextStyle(
33 | fontFamily: _myriadProFontFamily,
34 | color: Palette.darkBlue,
35 | fontSize: 32,
36 | fontWeight: FontWeight.w600,
37 | );
38 |
39 | ///fontFamily: MyriadPro,
40 | ///
41 | ///color: WebDashboardPalette.darkBlue,
42 | ///
43 | ///fontSize: 22,
44 | ///
45 | ///fontWeight: FontWeight.w600,
46 |
47 | static const TextStyle myriadProSemiBold22DarkBlue = TextStyle(
48 | fontFamily: _myriadProFontFamily,
49 | color: Palette.darkBlue,
50 | fontSize: 22,
51 | fontWeight: FontWeight.w600,
52 | );
53 |
54 | ///fontFamily: MyriadPro,
55 | ///
56 | ///color: WebDashboardPalette.dark,
57 | ///
58 | ///fontSize: 24,
59 | ///
60 | ///fontWeight: FontWeight.w600,
61 |
62 | static const TextStyle myriadProSemiBold24Dark = TextStyle(
63 | fontFamily: _myriadProFontFamily,
64 | color: Palette.dark,
65 | fontSize: 24,
66 | fontWeight: FontWeight.w600,
67 | );
68 |
69 | ///fontFamily: MyriadPro,
70 | ///
71 | ///color: WebDashboardPalette.green,
72 | ///
73 | ///fontSize: 12,
74 | ///
75 | ///fontWeight: FontWeight.w600,
76 |
77 | static const TextStyle myriadProSemiBold12Green = TextStyle(
78 | fontFamily: _myriadProFontFamily,
79 | color: Palette.green,
80 | fontSize: 12,
81 | fontWeight: FontWeight.w600,
82 | );
83 |
84 | ///fontFamily: MyriadPro,
85 | ///
86 | ///color: WebDashboardPalette.red,
87 | ///
88 | ///fontSize: 12,
89 | ///
90 | ///fontWeight: FontWeight.w600,
91 |
92 | static const TextStyle myriadProSemiBold12Red = TextStyle(
93 | fontFamily: _myriadProFontFamily,
94 | color: Palette.red,
95 | fontSize: 12,
96 | fontWeight: FontWeight.w600,
97 | );
98 |
99 | ///fontFamily: MyriadPro,
100 | ///
101 | ///color: WebDashboardPalette.lightBlue,
102 | ///
103 | ///fontSize: 14,
104 | ///
105 | ///fontWeight: FontWeight.w600,
106 |
107 | static const TextStyle myriadProSemiBold14LightBlue = TextStyle(
108 | fontFamily: _myriadProFontFamily,
109 | color: Palette.lightBlue,
110 | fontSize: 14,
111 | fontWeight: FontWeight.w600,
112 | );
113 |
114 | ///fontFamily: MyriadPro,
115 | ///
116 | ///color: WebDashboardPalette.lightBlue,
117 | ///
118 | ///fontSize: 16,
119 | ///
120 | ///fontWeight: FontWeight.w600,
121 |
122 | static const TextStyle myriadProSemiBold16LightBlue = TextStyle(
123 | fontFamily: _myriadProFontFamily,
124 | color: Palette.lightBlue,
125 | fontSize: 16,
126 | fontWeight: FontWeight.w600,
127 | );
128 |
129 | ///fontFamily: MyriadPro,
130 | ///
131 | ///color: WebDashboardPalette.darkGrey,
132 | ///
133 | ///fontSize: 13,
134 | ///
135 | ///fontWeight: FontWeight.w400,
136 | ///
137 | ///letterSpacing: 0.25
138 |
139 | static const TextStyle myriadProRegular13DarkGrey = TextStyle(
140 | fontFamily: _myriadProFontFamily,
141 | color: Palette.darkGrey,
142 | fontSize: 13,
143 | fontWeight: FontWeight.w400,
144 | letterSpacing: 0.25);
145 |
146 | ///fontFamily: MyriadPro,
147 | ///
148 | ///color: WebDashboardPalette.darkGrey,
149 | ///
150 | ///fontSize: 16,
151 | ///
152 | ///fontWeight: FontWeight.w400,
153 |
154 | static const TextStyle myriadProRegular16DarkGrey = TextStyle(
155 | fontFamily: _myriadProFontFamily,
156 | color: Palette.darkGrey,
157 | fontSize: 16,
158 | fontWeight: FontWeight.w400,
159 | );
160 |
161 | ///fontFamily: MyriadPro,
162 | ///
163 | ///color: WebDashboardPalette.darkBlue,
164 | ///
165 | ///fontSize: 13,
166 | ///
167 | ///fontWeight: FontWeight.w400,
168 | ///
169 | ///letterSpacing: 0.25,
170 |
171 | static const TextStyle myriadProRegular13DarkBlue = TextStyle(
172 | fontFamily: _myriadProFontFamily,
173 | color: Palette.darkBlue,
174 | fontSize: 13,
175 | fontWeight: FontWeight.w400,
176 | letterSpacing: 0.25,
177 | );
178 |
179 | ///fontFamily: MyriadPro,
180 | ///
181 | ///color: WebDashboardPalette.darkBlue60,
182 | ///
183 | ///fontSize: 13,
184 | ///
185 | ///fontWeight: FontWeight.w400,
186 | ///
187 | ///letterSpacing: -0.45,
188 |
189 | static const TextStyle myriadProRegular13DarkBlue60 = TextStyle(
190 | fontFamily: _myriadProFontFamily,
191 | color: Palette.darkBlue60,
192 | fontSize: 13,
193 | fontWeight: FontWeight.w400,
194 | letterSpacing: -0.45,
195 | );
196 |
197 | ///fontFamily: MyriadPro,
198 | ///
199 | ///color: WebDashboardPalette.dark,
200 | ///
201 | ///fontSize: 13,
202 | ///
203 | ///fontWeight: FontWeight.w600,
204 |
205 | static const TextStyle myriadProSemiBold13Dark = TextStyle(
206 | fontFamily: _myriadProFontFamily,
207 | color: Palette.dark,
208 | fontSize: 13,
209 | fontWeight: FontWeight.w600,
210 | );
211 |
212 | ///fontFamily: MyriadPro,
213 | ///
214 | ///color: WebDashboardPalette.darkBlue,
215 | ///
216 | ///fontSize: 14,
217 | ///
218 | ///fontWeight: FontWeight.w600,
219 |
220 | static const TextStyle myriadProSemiBold14DarkBlue = TextStyle(
221 | fontFamily: _myriadProFontFamily,
222 | color: Palette.darkBlue,
223 | fontSize: 14,
224 | fontWeight: FontWeight.w600,
225 | );
226 |
227 | ///fontFamily: MyriadPro,
228 | ///
229 | ///color: WebDashboardPalette.darkBlue,
230 | ///
231 | ///fontSize: 16,
232 | ///
233 | ///fontWeight: FontWeight.w600,
234 |
235 | static const TextStyle myriadProSemiBold16DarkBlue = TextStyle(
236 | fontFamily: _myriadProFontFamily,
237 | color: Palette.darkBlue,
238 | fontSize: 16,
239 | fontWeight: FontWeight.w600,
240 | );
241 |
242 | ///fontFamily: MyriadPro,
243 | ///
244 | ///color: WebDashboardPalette.darkBlue,
245 | ///
246 | ///fontSize: 16,
247 | ///
248 | ///fontWeight: FontWeight.w600,
249 | ///
250 | ///letterSpacing: 0.2,
251 |
252 | static const TextStyle myriadProSemiBold18Purple = TextStyle(
253 | fontFamily: _myriadProFontFamily,
254 | color: Palette.purple,
255 | fontSize: 18,
256 | fontWeight: FontWeight.w600,
257 | letterSpacing: 0.2,
258 | );
259 |
260 | ///fontFamily: MyriadPro,
261 | ///
262 | ///color: WebDashboardPalette.orange,
263 | ///
264 | ///fontSize: 16,
265 | ///
266 | ///fontWeight: FontWeight.w600,
267 | ///
268 | ///letterSpacing: 0.2,
269 |
270 | static const TextStyle myriadProSemiBold18Orange = TextStyle(
271 | fontFamily: _myriadProFontFamily,
272 | color: Palette.orange,
273 | fontSize: 18,
274 | fontWeight: FontWeight.w600,
275 | letterSpacing: 0.2,
276 | );
277 |
278 | ///fontFamily: MyriadPro,
279 | ///
280 | ///color: WebDashboardPalette.orange,
281 | ///
282 | ///fontSize: 16,
283 | ///
284 | ///fontWeight: FontWeight.w600,
285 | ///
286 | ///letterSpacing: 0.2,
287 |
288 | static const TextStyle myriadProSemiBold18LightBlue = TextStyle(
289 | fontFamily: _myriadProFontFamily,
290 | color: Palette.lightBlue,
291 | fontSize: 18,
292 | fontWeight: FontWeight.w600,
293 | letterSpacing: 0.2,
294 | );
295 |
296 | ///fontFamily: MyriadPro,
297 | ///
298 | ///color: Colors.white,
299 | ///
300 | ///fontSize: 24,
301 | ///
302 | ///fontWeight: FontWeight.w600,
303 |
304 | static const TextStyle myriadProSemiBold24White = TextStyle(
305 | fontFamily: _myriadProFontFamily,
306 | color: Colors.white,
307 | fontSize: 24,
308 | fontWeight: FontWeight.w600,
309 | );
310 |
311 | ///fontFamily: MyriadPro,
312 | ///
313 | ///color: Colors.white,
314 | ///
315 | ///fontSize: 22,
316 | ///
317 | ///fontWeight: FontWeight.w600,
318 |
319 | static const TextStyle myriadProSemiBold22White = TextStyle(
320 | fontFamily: _myriadProFontFamily,
321 | color: Colors.white,
322 | fontSize: 22,
323 | fontWeight: FontWeight.w600,
324 | );
325 | }
326 |
--------------------------------------------------------------------------------
/lib/presentation/utils/color_extension.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | extension ToColorFilter on Color {
4 | ColorFilter get toColorFilter {
5 | return ColorFilter.mode(this, BlendMode.srcIn);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/lib/presentation/widget/name_and_color_row.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../theme/text_styles.dart';
4 |
5 | class NameAndColorRow extends StatelessWidget {
6 | const NameAndColorRow({
7 | required this.color,
8 | required this.text,
9 | super.key,
10 | });
11 |
12 | final Color color;
13 |
14 | final String text;
15 |
16 | @override
17 | Widget build(BuildContext context) {
18 | return Row(
19 | mainAxisSize: MainAxisSize.min,
20 | children: [
21 | CircleAvatar(radius: 5, backgroundColor: color),
22 | const SizedBox(width: 8),
23 | Text(text, style: TextStyles.myriadProRegular13DarkBlue),
24 | ],
25 | );
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | _fe_analyzer_shared:
5 | dependency: transitive
6 | description:
7 | name: _fe_analyzer_shared
8 | sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
9 | url: "https://pub.dev"
10 | source: hosted
11 | version: "67.0.0"
12 | analyzer:
13 | dependency: transitive
14 | description:
15 | name: analyzer
16 | sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
17 | url: "https://pub.dev"
18 | source: hosted
19 | version: "6.4.1"
20 | args:
21 | dependency: transitive
22 | description:
23 | name: args
24 | sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
25 | url: "https://pub.dev"
26 | source: hosted
27 | version: "2.4.2"
28 | async:
29 | dependency: transitive
30 | description:
31 | name: async
32 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
33 | url: "https://pub.dev"
34 | source: hosted
35 | version: "2.11.0"
36 | auto_route:
37 | dependency: "direct main"
38 | description:
39 | name: auto_route
40 | sha256: f04022b2a5c4d255f7feb139a75cb3d100ccd2f8918a75036fe09456309a13a3
41 | url: "https://pub.dev"
42 | source: hosted
43 | version: "8.0.3"
44 | auto_route_generator:
45 | dependency: "direct dev"
46 | description:
47 | name: auto_route_generator
48 | sha256: ba28133d3a3bf0a66772bcc98dade5843753cd9f1a8fb4802b842895515b67d3
49 | url: "https://pub.dev"
50 | source: hosted
51 | version: "8.0.0"
52 | boolean_selector:
53 | dependency: transitive
54 | description:
55 | name: boolean_selector
56 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
57 | url: "https://pub.dev"
58 | source: hosted
59 | version: "2.1.1"
60 | build:
61 | dependency: transitive
62 | description:
63 | name: build
64 | sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
65 | url: "https://pub.dev"
66 | source: hosted
67 | version: "2.4.1"
68 | build_config:
69 | dependency: transitive
70 | description:
71 | name: build_config
72 | sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
73 | url: "https://pub.dev"
74 | source: hosted
75 | version: "1.1.1"
76 | build_daemon:
77 | dependency: transitive
78 | description:
79 | name: build_daemon
80 | sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1"
81 | url: "https://pub.dev"
82 | source: hosted
83 | version: "4.0.1"
84 | build_resolvers:
85 | dependency: transitive
86 | description:
87 | name: build_resolvers
88 | sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
89 | url: "https://pub.dev"
90 | source: hosted
91 | version: "2.4.2"
92 | build_runner:
93 | dependency: transitive
94 | description:
95 | name: build_runner
96 | sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22"
97 | url: "https://pub.dev"
98 | source: hosted
99 | version: "2.4.9"
100 | build_runner_core:
101 | dependency: transitive
102 | description:
103 | name: build_runner_core
104 | sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799"
105 | url: "https://pub.dev"
106 | source: hosted
107 | version: "7.3.0"
108 | built_collection:
109 | dependency: transitive
110 | description:
111 | name: built_collection
112 | sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
113 | url: "https://pub.dev"
114 | source: hosted
115 | version: "5.1.1"
116 | built_value:
117 | dependency: transitive
118 | description:
119 | name: built_value
120 | sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e
121 | url: "https://pub.dev"
122 | source: hosted
123 | version: "8.9.1"
124 | characters:
125 | dependency: transitive
126 | description:
127 | name: characters
128 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
129 | url: "https://pub.dev"
130 | source: hosted
131 | version: "1.3.0"
132 | checked_yaml:
133 | dependency: transitive
134 | description:
135 | name: checked_yaml
136 | sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
137 | url: "https://pub.dev"
138 | source: hosted
139 | version: "2.0.3"
140 | clock:
141 | dependency: transitive
142 | description:
143 | name: clock
144 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
145 | url: "https://pub.dev"
146 | source: hosted
147 | version: "1.1.1"
148 | code_builder:
149 | dependency: transitive
150 | description:
151 | name: code_builder
152 | sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
153 | url: "https://pub.dev"
154 | source: hosted
155 | version: "4.10.0"
156 | collection:
157 | dependency: transitive
158 | description:
159 | name: collection
160 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
161 | url: "https://pub.dev"
162 | source: hosted
163 | version: "1.18.0"
164 | color:
165 | dependency: transitive
166 | description:
167 | name: color
168 | sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb
169 | url: "https://pub.dev"
170 | source: hosted
171 | version: "3.0.0"
172 | convert:
173 | dependency: transitive
174 | description:
175 | name: convert
176 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
177 | url: "https://pub.dev"
178 | source: hosted
179 | version: "3.1.1"
180 | crypto:
181 | dependency: transitive
182 | description:
183 | name: crypto
184 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
185 | url: "https://pub.dev"
186 | source: hosted
187 | version: "3.0.3"
188 | dart_style:
189 | dependency: transitive
190 | description:
191 | name: dart_style
192 | sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
193 | url: "https://pub.dev"
194 | source: hosted
195 | version: "2.3.6"
196 | dartx:
197 | dependency: transitive
198 | description:
199 | name: dartx
200 | sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244"
201 | url: "https://pub.dev"
202 | source: hosted
203 | version: "1.2.0"
204 | equatable:
205 | dependency: transitive
206 | description:
207 | name: equatable
208 | sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
209 | url: "https://pub.dev"
210 | source: hosted
211 | version: "2.0.5"
212 | fake_async:
213 | dependency: transitive
214 | description:
215 | name: fake_async
216 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
217 | url: "https://pub.dev"
218 | source: hosted
219 | version: "1.3.1"
220 | file:
221 | dependency: transitive
222 | description:
223 | name: file
224 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
225 | url: "https://pub.dev"
226 | source: hosted
227 | version: "7.0.0"
228 | fixnum:
229 | dependency: transitive
230 | description:
231 | name: fixnum
232 | sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
233 | url: "https://pub.dev"
234 | source: hosted
235 | version: "1.1.0"
236 | fl_chart:
237 | dependency: "direct main"
238 | description:
239 | name: fl_chart
240 | sha256: "2b7c1f5d867da9a054661641c8f499c55c47c39acccb97b3bc673f5fa9a39e74"
241 | url: "https://pub.dev"
242 | source: hosted
243 | version: "0.67.0"
244 | flutter:
245 | dependency: "direct main"
246 | description: flutter
247 | source: sdk
248 | version: "0.0.0"
249 | flutter_gen_core:
250 | dependency: transitive
251 | description:
252 | name: flutter_gen_core
253 | sha256: "3a6c3dbc1c0e260088e9c7ed1ba905436844e8c01a44799f6281edada9e45308"
254 | url: "https://pub.dev"
255 | source: hosted
256 | version: "5.4.0"
257 | flutter_gen_runner:
258 | dependency: "direct dev"
259 | description:
260 | name: flutter_gen_runner
261 | sha256: "24889d5140b03997f7148066a9c5fab8b606dff36093434c782d7a7fb22c6fb6"
262 | url: "https://pub.dev"
263 | source: hosted
264 | version: "5.4.0"
265 | flutter_lints:
266 | dependency: "direct dev"
267 | description:
268 | name: flutter_lints
269 | sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
270 | url: "https://pub.dev"
271 | source: hosted
272 | version: "3.0.2"
273 | flutter_svg:
274 | dependency: "direct main"
275 | description:
276 | name: flutter_svg
277 | sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
278 | url: "https://pub.dev"
279 | source: hosted
280 | version: "2.0.10+1"
281 | flutter_test:
282 | dependency: "direct dev"
283 | description: flutter
284 | source: sdk
285 | version: "0.0.0"
286 | frontend_server_client:
287 | dependency: transitive
288 | description:
289 | name: frontend_server_client
290 | sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
291 | url: "https://pub.dev"
292 | source: hosted
293 | version: "4.0.0"
294 | glob:
295 | dependency: transitive
296 | description:
297 | name: glob
298 | sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
299 | url: "https://pub.dev"
300 | source: hosted
301 | version: "2.1.2"
302 | graphs:
303 | dependency: transitive
304 | description:
305 | name: graphs
306 | sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19
307 | url: "https://pub.dev"
308 | source: hosted
309 | version: "2.3.1"
310 | http:
311 | dependency: transitive
312 | description:
313 | name: http
314 | sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
315 | url: "https://pub.dev"
316 | source: hosted
317 | version: "1.2.1"
318 | http_multi_server:
319 | dependency: transitive
320 | description:
321 | name: http_multi_server
322 | sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
323 | url: "https://pub.dev"
324 | source: hosted
325 | version: "3.2.1"
326 | http_parser:
327 | dependency: transitive
328 | description:
329 | name: http_parser
330 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
331 | url: "https://pub.dev"
332 | source: hosted
333 | version: "4.0.2"
334 | intl:
335 | dependency: "direct main"
336 | description:
337 | name: intl
338 | sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
339 | url: "https://pub.dev"
340 | source: hosted
341 | version: "0.19.0"
342 | io:
343 | dependency: transitive
344 | description:
345 | name: io
346 | sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
347 | url: "https://pub.dev"
348 | source: hosted
349 | version: "1.0.4"
350 | js:
351 | dependency: transitive
352 | description:
353 | name: js
354 | sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
355 | url: "https://pub.dev"
356 | source: hosted
357 | version: "0.7.1"
358 | json_annotation:
359 | dependency: transitive
360 | description:
361 | name: json_annotation
362 | sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
363 | url: "https://pub.dev"
364 | source: hosted
365 | version: "4.8.1"
366 | leak_tracker:
367 | dependency: transitive
368 | description:
369 | name: leak_tracker
370 | sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
371 | url: "https://pub.dev"
372 | source: hosted
373 | version: "10.0.0"
374 | leak_tracker_flutter_testing:
375 | dependency: transitive
376 | description:
377 | name: leak_tracker_flutter_testing
378 | sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
379 | url: "https://pub.dev"
380 | source: hosted
381 | version: "2.0.1"
382 | leak_tracker_testing:
383 | dependency: transitive
384 | description:
385 | name: leak_tracker_testing
386 | sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
387 | url: "https://pub.dev"
388 | source: hosted
389 | version: "2.0.1"
390 | lints:
391 | dependency: transitive
392 | description:
393 | name: lints
394 | sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
395 | url: "https://pub.dev"
396 | source: hosted
397 | version: "3.0.0"
398 | logging:
399 | dependency: transitive
400 | description:
401 | name: logging
402 | sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
403 | url: "https://pub.dev"
404 | source: hosted
405 | version: "1.2.0"
406 | matcher:
407 | dependency: transitive
408 | description:
409 | name: matcher
410 | sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
411 | url: "https://pub.dev"
412 | source: hosted
413 | version: "0.12.16+1"
414 | material_color_utilities:
415 | dependency: transitive
416 | description:
417 | name: material_color_utilities
418 | sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
419 | url: "https://pub.dev"
420 | source: hosted
421 | version: "0.8.0"
422 | meta:
423 | dependency: transitive
424 | description:
425 | name: meta
426 | sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
427 | url: "https://pub.dev"
428 | source: hosted
429 | version: "1.11.0"
430 | mime:
431 | dependency: transitive
432 | description:
433 | name: mime
434 | sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
435 | url: "https://pub.dev"
436 | source: hosted
437 | version: "1.0.5"
438 | package_config:
439 | dependency: transitive
440 | description:
441 | name: package_config
442 | sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
443 | url: "https://pub.dev"
444 | source: hosted
445 | version: "2.1.0"
446 | path:
447 | dependency: transitive
448 | description:
449 | name: path
450 | sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
451 | url: "https://pub.dev"
452 | source: hosted
453 | version: "1.9.0"
454 | path_parsing:
455 | dependency: transitive
456 | description:
457 | name: path_parsing
458 | sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
459 | url: "https://pub.dev"
460 | source: hosted
461 | version: "1.0.1"
462 | petitparser:
463 | dependency: transitive
464 | description:
465 | name: petitparser
466 | sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
467 | url: "https://pub.dev"
468 | source: hosted
469 | version: "6.0.2"
470 | pool:
471 | dependency: transitive
472 | description:
473 | name: pool
474 | sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
475 | url: "https://pub.dev"
476 | source: hosted
477 | version: "1.5.1"
478 | pub_semver:
479 | dependency: transitive
480 | description:
481 | name: pub_semver
482 | sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
483 | url: "https://pub.dev"
484 | source: hosted
485 | version: "2.1.4"
486 | pubspec_parse:
487 | dependency: transitive
488 | description:
489 | name: pubspec_parse
490 | sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367
491 | url: "https://pub.dev"
492 | source: hosted
493 | version: "1.2.3"
494 | shelf:
495 | dependency: transitive
496 | description:
497 | name: shelf
498 | sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
499 | url: "https://pub.dev"
500 | source: hosted
501 | version: "1.4.1"
502 | shelf_web_socket:
503 | dependency: transitive
504 | description:
505 | name: shelf_web_socket
506 | sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
507 | url: "https://pub.dev"
508 | source: hosted
509 | version: "1.0.4"
510 | sky_engine:
511 | dependency: transitive
512 | description: flutter
513 | source: sdk
514 | version: "0.0.99"
515 | source_gen:
516 | dependency: transitive
517 | description:
518 | name: source_gen
519 | sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
520 | url: "https://pub.dev"
521 | source: hosted
522 | version: "1.5.0"
523 | source_span:
524 | dependency: transitive
525 | description:
526 | name: source_span
527 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
528 | url: "https://pub.dev"
529 | source: hosted
530 | version: "1.10.0"
531 | stack_trace:
532 | dependency: transitive
533 | description:
534 | name: stack_trace
535 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
536 | url: "https://pub.dev"
537 | source: hosted
538 | version: "1.11.1"
539 | stream_channel:
540 | dependency: transitive
541 | description:
542 | name: stream_channel
543 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
544 | url: "https://pub.dev"
545 | source: hosted
546 | version: "2.1.2"
547 | stream_transform:
548 | dependency: transitive
549 | description:
550 | name: stream_transform
551 | sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
552 | url: "https://pub.dev"
553 | source: hosted
554 | version: "2.1.0"
555 | string_scanner:
556 | dependency: transitive
557 | description:
558 | name: string_scanner
559 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
560 | url: "https://pub.dev"
561 | source: hosted
562 | version: "1.2.0"
563 | syncfusion_flutter_charts:
564 | dependency: "direct main"
565 | description:
566 | name: syncfusion_flutter_charts
567 | sha256: c702a611ebb21f13b7107a470d3751ed852a1ec5de0cae7ef9339ccb761b574f
568 | url: "https://pub.dev"
569 | source: hosted
570 | version: "25.1.37"
571 | syncfusion_flutter_core:
572 | dependency: transitive
573 | description:
574 | name: syncfusion_flutter_core
575 | sha256: d098e3cf5ee0c5a37b083f2efdb7c6bdfaabf871f68758bb491b10b61b3dd0d7
576 | url: "https://pub.dev"
577 | source: hosted
578 | version: "25.1.37"
579 | term_glyph:
580 | dependency: transitive
581 | description:
582 | name: term_glyph
583 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
584 | url: "https://pub.dev"
585 | source: hosted
586 | version: "1.2.1"
587 | test_api:
588 | dependency: transitive
589 | description:
590 | name: test_api
591 | sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
592 | url: "https://pub.dev"
593 | source: hosted
594 | version: "0.6.1"
595 | time:
596 | dependency: transitive
597 | description:
598 | name: time
599 | sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221
600 | url: "https://pub.dev"
601 | source: hosted
602 | version: "2.1.4"
603 | timing:
604 | dependency: transitive
605 | description:
606 | name: timing
607 | sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
608 | url: "https://pub.dev"
609 | source: hosted
610 | version: "1.0.1"
611 | typed_data:
612 | dependency: transitive
613 | description:
614 | name: typed_data
615 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
616 | url: "https://pub.dev"
617 | source: hosted
618 | version: "1.3.2"
619 | vector_graphics:
620 | dependency: transitive
621 | description:
622 | name: vector_graphics
623 | sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
624 | url: "https://pub.dev"
625 | source: hosted
626 | version: "1.1.11+1"
627 | vector_graphics_codec:
628 | dependency: transitive
629 | description:
630 | name: vector_graphics_codec
631 | sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
632 | url: "https://pub.dev"
633 | source: hosted
634 | version: "1.1.11+1"
635 | vector_graphics_compiler:
636 | dependency: transitive
637 | description:
638 | name: vector_graphics_compiler
639 | sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
640 | url: "https://pub.dev"
641 | source: hosted
642 | version: "1.1.11+1"
643 | vector_math:
644 | dependency: transitive
645 | description:
646 | name: vector_math
647 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
648 | url: "https://pub.dev"
649 | source: hosted
650 | version: "2.1.4"
651 | vm_service:
652 | dependency: transitive
653 | description:
654 | name: vm_service
655 | sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
656 | url: "https://pub.dev"
657 | source: hosted
658 | version: "13.0.0"
659 | watcher:
660 | dependency: transitive
661 | description:
662 | name: watcher
663 | sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
664 | url: "https://pub.dev"
665 | source: hosted
666 | version: "1.1.0"
667 | web:
668 | dependency: transitive
669 | description:
670 | name: web
671 | sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
672 | url: "https://pub.dev"
673 | source: hosted
674 | version: "0.5.1"
675 | web_socket_channel:
676 | dependency: transitive
677 | description:
678 | name: web_socket_channel
679 | sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2"
680 | url: "https://pub.dev"
681 | source: hosted
682 | version: "2.4.4"
683 | xml:
684 | dependency: transitive
685 | description:
686 | name: xml
687 | sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
688 | url: "https://pub.dev"
689 | source: hosted
690 | version: "6.5.0"
691 | yaml:
692 | dependency: transitive
693 | description:
694 | name: yaml
695 | sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
696 | url: "https://pub.dev"
697 | source: hosted
698 | version: "3.1.2"
699 | sdks:
700 | dart: ">=3.3.0 <4.0.0"
701 | flutter: ">=3.16.0"
702 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: flutter_web_dashboard
2 | description: A new Flutter project.
3 |
4 | publish_to: "none"
5 |
6 | version: 1.0.0+1
7 |
8 | environment:
9 | sdk: ">=3.2.6 <4.0.0"
10 |
11 | dependencies:
12 | flutter:
13 | sdk: flutter
14 |
15 | flutter_svg: 2.0.10+1
16 | intl: 0.19.0
17 | fl_chart: 0.67.0
18 | syncfusion_flutter_charts: 25.1.37
19 | auto_route: 8.0.3
20 |
21 | dev_dependencies:
22 | flutter_test:
23 | sdk: flutter
24 |
25 | flutter_lints: 3.0.2
26 | auto_route_generator: 8.0.0
27 | flutter_gen_runner: 5.4.0
28 |
29 | flutter_gen:
30 | output: lib/presentation/theme/gen/
31 | line_length: 80
32 |
33 | integrations:
34 | flutter_svg: true
35 |
36 | assets:
37 | enabled: true
38 | outputs:
39 | style: dot-delimiter
40 | class_name: ProjectAssets
41 |
42 | fonts:
43 | enabled: true
44 | outputs:
45 | class_name: ProjectFontFamily
46 |
47 | colors:
48 | enabled: false
49 |
50 | flutter:
51 | uses-material-design: true
52 |
53 | assets:
54 | - assets/icons/
55 |
56 | fonts:
57 | - family: MyriadPro
58 | fonts:
59 | - asset: assets/fonts/MyriadPro/MyriadPro-Black.ttf
60 | weight: 900
61 | - asset: assets/fonts/MyriadPro/MyriadPro-Bold.ttf
62 | weight: 700
63 | - asset: assets/fonts/MyriadPro/MyriadPro-SemiBold.ttf
64 | weight: 600
65 | - asset: assets/fonts/MyriadPro/MyriadPro-Regular.ttf
66 | weight: 400
67 | - asset: assets/fonts/MyriadPro/MyriadPro-Light.ttf
68 | weight: 300
69 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | // import 'package:flutter/material.dart';
9 | // import 'package:flutter_test/flutter_test.dart';
10 |
11 | // import 'package:flutter_web_dashboard/main.dart';
12 |
13 | // void main() {
14 | // testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // // Build our app and trigger a frame.
16 | // await tester.pumpWidget(const WebDashboardApp());
17 |
18 | // // Verify that our counter starts at 0.
19 | // expect(find.text('0'), findsOneWidget);
20 | // expect(find.text('1'), findsNothing);
21 |
22 | // // Tap the '+' icon and trigger a frame.
23 | // await tester.tap(find.byIcon(Icons.add));
24 | // await tester.pump();
25 |
26 | // // Verify that our counter has incremented.
27 | // expect(find.text('0'), findsNothing);
28 | // expect(find.text('1'), findsOneWidget);
29 | // });
30 | // }
31 |
--------------------------------------------------------------------------------
/web/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/web/favicon.ico
--------------------------------------------------------------------------------
/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/web/icons/Icon-maskable-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TBR-Group-software/flutter_web_dashboard/b03babf60dceab106bc68e30c4dd48eb5a3753ea/web/icons/Icon-maskable-512.png
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | flutter_web_dashboard
34 |
35 |
36 |
37 |
40 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Web dashboard",
3 | "short_name": "Web dashboard",
4 | "start_url": ".",
5 | "display": "standalone",
6 | "background_color": "#0175C2",
7 | "theme_color": "#0175C2",
8 | "description": "A new Flutter project.",
9 | "orientation": "portrait-primary",
10 | "prefer_related_applications": false,
11 | "icons": [
12 | {
13 | "src": "icons/Icon-192.png",
14 | "sizes": "192x192",
15 | "type": "image/png"
16 | },
17 | {
18 | "src": "icons/Icon-512.png",
19 | "sizes": "512x512",
20 | "type": "image/png"
21 | },
22 | {
23 | "src": "icons/Icon-maskable-192.png",
24 | "sizes": "192x192",
25 | "type": "image/png",
26 | "purpose": "maskable"
27 | },
28 | {
29 | "src": "icons/Icon-maskable-512.png",
30 | "sizes": "512x512",
31 | "type": "image/png",
32 | "purpose": "maskable"
33 | }
34 | ]
35 | }
36 |
--------------------------------------------------------------------------------