diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0fa6b67
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..3c3e4b5
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: 5464c5bac742001448fe4fc0597be939379f88ea
+ channel: stable
+
+project_type: app
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ad63258
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2022, SinaSys
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..97231ed
--- /dev/null
+++ b/README.md
@@ -0,0 +1,67 @@
+## office_furniture_store_app
+
+Office Furniture Store app is a design implementation of [E-commerce App](https://dribbble.com/shots/16394699-E-commerce-design-concept) designed by [Jonatan](https://dribbble.com/Jhonatan_artist23)
+
+![](https://github.com/SinaSys/flutter_office_furniture_store_app/blob/master/screenshots/office_furniture_store_app.jpg?raw=true)
+
+
+## Screenshots
+
+ List Screen | Detail Screen | Cart Screen
+-------------------------:|:-------------------------:|:-------------------------:
+![](https://github.com/SinaSys/flutter_office_furniture_store_app/blob/master/screenshots/office_furniture_list_screen.png?raw=true)|![](https://github.com/SinaSys/flutter_office_furniture_store_app/blob/master/screenshots/office_furniture_detail_screen.png?raw=true)|![](https://github.com/SinaSys/flutter_office_furniture_store_app/blob/master/screenshots/cart_screen.png?raw=true)
+
+
+## Directory Structure
+```
+📂lib
+ │───main.dart
+ │───📂core
+ | │──app_asset.dart
+ | │──app_color.dart
+ | │──app_data.dart
+ | │──app_extension.dart
+ | │──app_style.dart
+ | └──app_theme.dart
+ └───📂src
+ │────📂model
+ │ │──bottom_navigation_item.dart
+ | │──furniture.dart
+ | └──furniture_color.dart
+ └────📂view
+ | │───📂screen
+ | | |──cart_screen.dart
+ | | |──favorite_screen.dart
+ | | |──home_screen.dart
+ | | |──intro_screen.dart
+ | | |──office_furniture_detail_screen.dart
+ | | |──office_furniture_list_screen.dart
+ | | └──profile_screen.dart
+ | │───📂widget
+ | | |──bottom_bar.dart
+ │ | |──cart_list_view.dart
+ │ | |──color_picker.dart
+ │ | |──counter_button.dart
+ │ | |──empty_widget.dart
+ │ | |──furniture_list_view.dart
+ | | └──rating_bar.dart
+ └────📂controller
+ └──office_furniture_controller.dart
+```
+
+## Pull Requests
+I welcome and encourage all pull requests. It usually will take me within 48-72 hours to respond to any issue or request.
+
+
+## Packages
+Package Name |
+:-------------------------|
+|[GetX](https://pub.dev/packages/get)
+|[smooth_page_indicator](https://pub.dev/packages/smooth_page_indicator)
+|[flutter_rating_bar](https://pub.dev/packages/flutter_rating_bar)
+|[font_awesome_flutter](https://pub.dev/packages/font_awesome_flutter)
+
+
+## Created & Maintained By
+
+[SinaSys](https://github.com/SinaSys)
\ No newline at end of file
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..61b6c4d
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..6f56801
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..22433b0
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,68 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ compileSdkVersion flutter.compileSdkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.sinasys.office_furniture_store"
+ minSdkVersion flutter.minSdkVersion
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..08b75c9
--- /dev/null
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..de3b488
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/kotlin/com/sinasys/office_furniture_store/MainActivity.kt b/android/app/src/main/kotlin/com/sinasys/office_furniture_store/MainActivity.kt
new file mode 100644
index 0000000..8cf9060
--- /dev/null
+++ b/android/app/src/main/kotlin/com/sinasys/office_furniture_store/MainActivity.kt
@@ -0,0 +1,6 @@
+package com.sinasys.office_furniture_store
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..f74085f
--- /dev/null
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..304732f
--- /dev/null
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..db77bb4
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..17987b7
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..09d4391
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..d5f1c8d
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..4d6372e
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..3db14bb
--- /dev/null
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..d460d1e
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..08b75c9
--- /dev/null
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..4256f91
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ ext.kotlin_version = '1.6.10'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.1.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..94adc3a
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..bc6a58a
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..44e62bc
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,11 @@
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/assets/fonts/Poppins-Black.ttf b/assets/fonts/Poppins-Black.ttf
new file mode 100644
index 0000000..71c0f99
Binary files /dev/null and b/assets/fonts/Poppins-Black.ttf differ
diff --git a/assets/fonts/Poppins-Italic.ttf b/assets/fonts/Poppins-Italic.ttf
new file mode 100644
index 0000000..12b7b3c
Binary files /dev/null and b/assets/fonts/Poppins-Italic.ttf differ
diff --git a/assets/fonts/Poppins-Light.ttf b/assets/fonts/Poppins-Light.ttf
new file mode 100644
index 0000000..bc36bcc
Binary files /dev/null and b/assets/fonts/Poppins-Light.ttf differ
diff --git a/assets/fonts/Poppins-Medium.ttf b/assets/fonts/Poppins-Medium.ttf
new file mode 100644
index 0000000..6bcdcc2
Binary files /dev/null and b/assets/fonts/Poppins-Medium.ttf differ
diff --git a/assets/fonts/Poppins-Regular.ttf b/assets/fonts/Poppins-Regular.ttf
new file mode 100644
index 0000000..9f0c71b
Binary files /dev/null and b/assets/fonts/Poppins-Regular.ttf differ
diff --git a/assets/fonts/Poppins-SemiBold.ttf b/assets/fonts/Poppins-SemiBold.ttf
new file mode 100644
index 0000000..74c726e
Binary files /dev/null and b/assets/fonts/Poppins-SemiBold.ttf differ
diff --git a/assets/fonts/Poppins-Thin.ttf b/assets/fonts/Poppins-Thin.ttf
new file mode 100644
index 0000000..03e7366
Binary files /dev/null and b/assets/fonts/Poppins-Thin.ttf differ
diff --git a/assets/images/comhar_standing_desk_1.jpg b/assets/images/comhar_standing_desk_1.jpg
new file mode 100644
index 0000000..8c423f6
Binary files /dev/null and b/assets/images/comhar_standing_desk_1.jpg differ
diff --git a/assets/images/comhar_standing_desk_2.jpg b/assets/images/comhar_standing_desk_2.jpg
new file mode 100644
index 0000000..80a3683
Binary files /dev/null and b/assets/images/comhar_standing_desk_2.jpg differ
diff --git a/assets/images/comhar_standing_desk_3.jpg b/assets/images/comhar_standing_desk_3.jpg
new file mode 100644
index 0000000..dd469ea
Binary files /dev/null and b/assets/images/comhar_standing_desk_3.jpg differ
diff --git a/assets/images/comhar_standing_desk_4.jpg b/assets/images/comhar_standing_desk_4.jpg
new file mode 100644
index 0000000..e5fa6d6
Binary files /dev/null and b/assets/images/comhar_standing_desk_4.jpg differ
diff --git a/assets/images/comhar_standing_desk_5.jpg b/assets/images/comhar_standing_desk_5.jpg
new file mode 100644
index 0000000..9ba1a20
Binary files /dev/null and b/assets/images/comhar_standing_desk_5.jpg differ
diff --git a/assets/images/comhar_standing_desk_6.jpg b/assets/images/comhar_standing_desk_6.jpg
new file mode 100644
index 0000000..7d6fd0e
Binary files /dev/null and b/assets/images/comhar_standing_desk_6.jpg differ
diff --git a/assets/images/comhar_standing_desk_7.jpg b/assets/images/comhar_standing_desk_7.jpg
new file mode 100644
index 0000000..e09d1ca
Binary files /dev/null and b/assets/images/comhar_standing_desk_7.jpg differ
diff --git a/assets/images/empty_cart.png b/assets/images/empty_cart.png
new file mode 100644
index 0000000..7f364bf
Binary files /dev/null and b/assets/images/empty_cart.png differ
diff --git a/assets/images/empty_favorite.png b/assets/images/empty_favorite.png
new file mode 100644
index 0000000..74aed9c
Binary files /dev/null and b/assets/images/empty_favorite.png differ
diff --git a/assets/images/ergonomic_gaming_desk_1.jpg b/assets/images/ergonomic_gaming_desk_1.jpg
new file mode 100644
index 0000000..047ac91
Binary files /dev/null and b/assets/images/ergonomic_gaming_desk_1.jpg differ
diff --git a/assets/images/ergonomic_gaming_desk_2.jpg b/assets/images/ergonomic_gaming_desk_2.jpg
new file mode 100644
index 0000000..d92bcbf
Binary files /dev/null and b/assets/images/ergonomic_gaming_desk_2.jpg differ
diff --git a/assets/images/ergonomic_gaming_desk_3.jpg b/assets/images/ergonomic_gaming_desk_3.jpg
new file mode 100644
index 0000000..77d1942
Binary files /dev/null and b/assets/images/ergonomic_gaming_desk_3.jpg differ
diff --git a/assets/images/ergonomic_gaming_desk_4.jpg b/assets/images/ergonomic_gaming_desk_4.jpg
new file mode 100644
index 0000000..887b7b0
Binary files /dev/null and b/assets/images/ergonomic_gaming_desk_4.jpg differ
diff --git a/assets/images/ergonomic_gaming_desk_5.jpg b/assets/images/ergonomic_gaming_desk_5.jpg
new file mode 100644
index 0000000..74d63d5
Binary files /dev/null and b/assets/images/ergonomic_gaming_desk_5.jpg differ
diff --git a/assets/images/github.png b/assets/images/github.png
new file mode 100644
index 0000000..7d5dbb3
Binary files /dev/null and b/assets/images/github.png differ
diff --git a/assets/images/intro.jpg b/assets/images/intro.jpg
new file mode 100644
index 0000000..323a1db
Binary files /dev/null and b/assets/images/intro.jpg differ
diff --git a/assets/images/kana_bamboo_desk_1.jpg b/assets/images/kana_bamboo_desk_1.jpg
new file mode 100644
index 0000000..f04ce02
Binary files /dev/null and b/assets/images/kana_bamboo_desk_1.jpg differ
diff --git a/assets/images/kana_bamboo_desk_2.jpg b/assets/images/kana_bamboo_desk_2.jpg
new file mode 100644
index 0000000..74317d0
Binary files /dev/null and b/assets/images/kana_bamboo_desk_2.jpg differ
diff --git a/assets/images/kana_bamboo_desk_3.jpg b/assets/images/kana_bamboo_desk_3.jpg
new file mode 100644
index 0000000..06ad913
Binary files /dev/null and b/assets/images/kana_bamboo_desk_3.jpg differ
diff --git a/assets/images/kana_bamboo_desk_4.jpg b/assets/images/kana_bamboo_desk_4.jpg
new file mode 100644
index 0000000..8cfda3f
Binary files /dev/null and b/assets/images/kana_bamboo_desk_4.jpg differ
diff --git a/assets/images/kana_bamboo_desk_5.jpg b/assets/images/kana_bamboo_desk_5.jpg
new file mode 100644
index 0000000..0582a78
Binary files /dev/null and b/assets/images/kana_bamboo_desk_5.jpg differ
diff --git a/assets/images/kana_bamboo_desk_6.jpg b/assets/images/kana_bamboo_desk_6.jpg
new file mode 100644
index 0000000..bc25f71
Binary files /dev/null and b/assets/images/kana_bamboo_desk_6.jpg differ
diff --git a/assets/images/profile_pic.png b/assets/images/profile_pic.png
new file mode 100644
index 0000000..83240ee
Binary files /dev/null and b/assets/images/profile_pic.png differ
diff --git a/assets/images/soutien_office_chair_1.jpg b/assets/images/soutien_office_chair_1.jpg
new file mode 100644
index 0000000..81fa212
Binary files /dev/null and b/assets/images/soutien_office_chair_1.jpg differ
diff --git a/assets/images/soutien_office_chair_2.jpg b/assets/images/soutien_office_chair_2.jpg
new file mode 100644
index 0000000..e11e0a8
Binary files /dev/null and b/assets/images/soutien_office_chair_2.jpg differ
diff --git a/assets/images/soutien_office_chair_3.jpg b/assets/images/soutien_office_chair_3.jpg
new file mode 100644
index 0000000..3806646
Binary files /dev/null and b/assets/images/soutien_office_chair_3.jpg differ
diff --git a/assets/images/soutien_office_chair_4.jpg b/assets/images/soutien_office_chair_4.jpg
new file mode 100644
index 0000000..29a2dc8
Binary files /dev/null and b/assets/images/soutien_office_chair_4.jpg differ
diff --git a/assets/images/soutien_office_chair_5.jpg b/assets/images/soutien_office_chair_5.jpg
new file mode 100644
index 0000000..f9b7619
Binary files /dev/null and b/assets/images/soutien_office_chair_5.jpg differ
diff --git a/assets/images/soutien_office_chair_6.jpg b/assets/images/soutien_office_chair_6.jpg
new file mode 100644
index 0000000..58ade93
Binary files /dev/null and b/assets/images/soutien_office_chair_6.jpg differ
diff --git a/assets/images/theodore_standing_desk_1.jpg b/assets/images/theodore_standing_desk_1.jpg
new file mode 100644
index 0000000..784a0e7
Binary files /dev/null and b/assets/images/theodore_standing_desk_1.jpg differ
diff --git a/assets/images/theodore_standing_desk_2.jpg b/assets/images/theodore_standing_desk_2.jpg
new file mode 100644
index 0000000..20baf0c
Binary files /dev/null and b/assets/images/theodore_standing_desk_2.jpg differ
diff --git a/assets/images/theodore_standing_desk_3.jpg b/assets/images/theodore_standing_desk_3.jpg
new file mode 100644
index 0000000..ae2c8e7
Binary files /dev/null and b/assets/images/theodore_standing_desk_3.jpg differ
diff --git a/assets/images/theodore_standing_desk_4.jpg b/assets/images/theodore_standing_desk_4.jpg
new file mode 100644
index 0000000..0237290
Binary files /dev/null and b/assets/images/theodore_standing_desk_4.jpg differ
diff --git a/assets/images/theodore_standing_desk_5.jpg b/assets/images/theodore_standing_desk_5.jpg
new file mode 100644
index 0000000..3b117f4
Binary files /dev/null and b/assets/images/theodore_standing_desk_5.jpg differ
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..7a7f987
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..8d4492f
--- /dev/null
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 9.0
+
+
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..b1241f9
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,481 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1300;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.sinasys.officeFurnitureStore;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.sinasys.officeFurnitureStore;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.sinasys.officeFurnitureStore;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..c87d15a
--- /dev/null
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..70693e4
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..d36b1fa
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..dc9ada4
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..28c6bf0
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..f091b6b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cde121
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..d0ef06e
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..dcdc230
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..c8f9ed8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..75b2d16
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..c4df70d
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..6a84f41
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..d0e1f58
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..0bedcf2
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..f2e259c
--- /dev/null
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
new file mode 100644
index 0000000..d71919f
--- /dev/null
+++ b/ios/Runner/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Office Furniture Store
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ office_furniture_store
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/lib/core/app_asset.dart b/lib/core/app_asset.dart
new file mode 100644
index 0000000..9c954a6
--- /dev/null
+++ b/lib/core/app_asset.dart
@@ -0,0 +1,45 @@
+class AppAsset{
+ static const comharStandingDesk1 = "assets/images/comhar_standing_desk_1.jpg";
+ static const comharStandingDesk2 = "assets/images/comhar_standing_desk_2.jpg";
+ static const comharStandingDesk3 = "assets/images/comhar_standing_desk_3.jpg";
+ static const comharStandingDesk4 = "assets/images/comhar_standing_desk_4.jpg";
+ static const comharStandingDesk5 = "assets/images/comhar_standing_desk_5.jpg";
+ static const comharStandingDesk6 = "assets/images/comhar_standing_desk_6.jpg";
+ static const comharStandingDesk7 = "assets/images/comhar_standing_desk_7.jpg";
+
+ static const ergonomicGamingDesk1 = "assets/images/ergonomic_gaming_desk_1.jpg";
+ static const ergonomicGamingDesk2 = "assets/images/ergonomic_gaming_desk_2.jpg";
+ static const ergonomicGamingDesk3 = "assets/images/ergonomic_gaming_desk_3.jpg";
+ static const ergonomicGamingDesk4 = "assets/images/ergonomic_gaming_desk_4.jpg";
+ static const ergonomicGamingDesk5 = "assets/images/ergonomic_gaming_desk_5.jpg";
+
+ static const kanaBambooDesk1 = "assets/images/kana_bamboo_desk_1.jpg";
+ static const kanaBambooDesk2 = "assets/images/kana_bamboo_desk_2.jpg";
+ static const kanaBambooDesk3 = "assets/images/kana_bamboo_desk_3.jpg";
+ static const kanaBambooDesk4 = "assets/images/kana_bamboo_desk_4.jpg";
+ static const kanaBambooDesk5 = "assets/images/kana_bamboo_desk_5.jpg";
+ static const kanaBambooDesk6 = "assets/images/kana_bamboo_desk_6.jpg";
+
+ static const soutienOfficeChair1 = "assets/images/soutien_office_chair_1.jpg";
+ static const soutienOfficeChair2 = "assets/images/soutien_office_chair_2.jpg";
+ static const soutienOfficeChair3 = "assets/images/soutien_office_chair_3.jpg";
+ static const soutienOfficeChair4 = "assets/images/soutien_office_chair_4.jpg";
+ static const soutienOfficeChair5 = "assets/images/soutien_office_chair_5.jpg";
+ static const soutienOfficeChair6 = "assets/images/soutien_office_chair_6.jpg";
+
+ static const theodoreStandingDesk1 = "assets/images/theodore_standing_desk_1.jpg";
+ static const theodoreStandingDesk2 = "assets/images/theodore_standing_desk_2.jpg";
+ static const theodoreStandingDesk3 = "assets/images/theodore_standing_desk_3.jpg";
+ static const theodoreStandingDesk4 = "assets/images/theodore_standing_desk_4.jpg";
+ static const theodoreStandingDesk5 = "assets/images/theodore_standing_desk_5.jpg";
+
+
+ static const profilePic = "assets/images/profile_pic.png";
+ static const githubPic = "assets/images/github.png";
+
+
+ static const emptyCart = "assets/images/empty_cart.png";
+ static const emptyFavorite = "assets/images/empty_favorite.png";
+}
+
+
diff --git a/lib/core/app_color.dart b/lib/core/app_color.dart
new file mode 100644
index 0000000..2d71b6c
--- /dev/null
+++ b/lib/core/app_color.dart
@@ -0,0 +1,6 @@
+import 'package:flutter/material.dart';
+
+class AppColor {
+ static const lightOrange = Color(0xFFFAA33C);
+ static const lightBlack = Color(0xFF101725);
+}
diff --git a/lib/core/app_data.dart b/lib/core/app_data.dart
new file mode 100644
index 0000000..a3ced13
--- /dev/null
+++ b/lib/core/app_data.dart
@@ -0,0 +1,120 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/core/app_asset.dart';
+import 'package:office_furniture_store/src/model/furniture.dart';
+import 'package:office_furniture_store/src/model/furniture_color.dart';
+import '../src/model/bottom_navigation_item.dart';
+
+class AppData {
+ static const dummyText =
+ "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
+
+ static List furnitureList = [
+ Furniture(
+ quantity: 1,
+ isFavorite: false,
+ title: 'Comhar All-in-One Standing Desk Glass',
+ description: dummyText,
+ price: '\$469.99',
+ score: 3.5,
+ images: [
+ AppAsset.comharStandingDesk1,
+ AppAsset.comharStandingDesk2,
+ AppAsset.comharStandingDesk3,
+ AppAsset.comharStandingDesk4,
+ AppAsset.comharStandingDesk5,
+ AppAsset.comharStandingDesk6,
+ AppAsset.comharStandingDesk7,
+ ],
+ colors: [
+ FurnitureColor(color: const Color(0xFF616161), isSelected: true),
+ FurnitureColor(color: const Color(0xFF424242)),
+ ],
+ ),
+ Furniture(
+ isFavorite: false,
+ quantity: 1,
+ title: 'Ergonomic Gaming Desk with Mouse Pad',
+ description: dummyText,
+ price: '\$299.99',
+ score: 4.5,
+ images: [
+ AppAsset.ergonomicGamingDesk1,
+ AppAsset.ergonomicGamingDesk2,
+ AppAsset.ergonomicGamingDesk3,
+ AppAsset.ergonomicGamingDesk4,
+ AppAsset.ergonomicGamingDesk5,
+ ],
+ colors: [
+ FurnitureColor(color: const Color(0xFF5d4037), isSelected: true),
+ FurnitureColor(color: const Color(0xFF424242)),
+ ],
+ ),
+ Furniture(
+ quantity: 1,
+ isFavorite: false,
+ title: 'Kana Pro Bamboo Standing Desk',
+ description: dummyText,
+ price: '\$659.99',
+ score: 3.0,
+ images: [
+ AppAsset.kanaBambooDesk1,
+ AppAsset.kanaBambooDesk2,
+ AppAsset.kanaBambooDesk3,
+ AppAsset.kanaBambooDesk4,
+ AppAsset.kanaBambooDesk5,
+ AppAsset.kanaBambooDesk6,
+ ],
+ colors: [
+ FurnitureColor(color: const Color(0xFF616161), isSelected: true),
+ FurnitureColor(color: const Color(0xFF212121)),
+ ],
+ ),
+ Furniture(
+ quantity: 1,
+ isFavorite: false,
+ title: 'Soutien Ergonomic Office Chair',
+ description: dummyText,
+ price: '\$349.99',
+ score: 2.5,
+ images: [
+ AppAsset.soutienOfficeChair1,
+ AppAsset.soutienOfficeChair2,
+ AppAsset.soutienOfficeChair3,
+ AppAsset.soutienOfficeChair4,
+ AppAsset.soutienOfficeChair5,
+ AppAsset.soutienOfficeChair6,
+ ],
+ colors: [
+ FurnitureColor(color: const Color(0xFF455a64), isSelected: true),
+ FurnitureColor(color: const Color(0xFF263238)),
+ ],
+ ),
+ Furniture(
+ quantity: 1,
+ isFavorite: false,
+ title: 'Theodore Standing Desk',
+ description: dummyText,
+ price: '\$499.99',
+ score: 2.8,
+ images: [
+ AppAsset.theodoreStandingDesk1,
+ AppAsset.theodoreStandingDesk2,
+ AppAsset.theodoreStandingDesk3,
+ AppAsset.theodoreStandingDesk4,
+ AppAsset.theodoreStandingDesk5,
+ ],
+ colors: [
+ FurnitureColor(color: const Color(0xFF5d4037), isSelected: true),
+ FurnitureColor(color: const Color(0xFF455a64)),
+ ],
+ ),
+ ];
+
+ static List bottomNavigationItems = [
+ BottomNavigationItem(const Icon(Icons.home), 'Home'),
+ BottomNavigationItem(
+ const Icon(Icons.add_shopping_cart_rounded), 'Shopping cart'),
+ BottomNavigationItem(const Icon(Icons.bookmark), 'Favorite'),
+ BottomNavigationItem(const Icon(Icons.person), 'Profile')
+ ];
+}
diff --git a/lib/core/app_extension.dart b/lib/core/app_extension.dart
new file mode 100644
index 0000000..3b87e8a
--- /dev/null
+++ b/lib/core/app_extension.dart
@@ -0,0 +1,26 @@
+extension StringExtension on String {
+ String get addOverFlow {
+ if (length < 15) {
+ return this;
+ } else {
+ return "${substring(0, 15)}...";
+ }
+ }
+ double get dropSign{
+ return double.parse(replaceAll("\$", ""));
+ }
+}
+
+extension IterableExtension on Iterable {
+ Iterable distinctBy(Object Function(T e) getCompareValue) {
+ var result = [];
+ forEach((element) {
+ if (!result.any((x) => getCompareValue(x) == getCompareValue(element))) {
+ result.add(element);
+ }
+ });
+ return result;
+ }
+}
+
+
diff --git a/lib/core/app_style.dart b/lib/core/app_style.dart
new file mode 100644
index 0000000..289f1bc
--- /dev/null
+++ b/lib/core/app_style.dart
@@ -0,0 +1,45 @@
+import 'package:flutter/material.dart';
+
+const h1Style = TextStyle(
+ fontSize: 60,
+ color: Colors.black,
+ fontFamily: "Poppins",
+ height: 1.4,
+ fontWeight: FontWeight.w900);
+
+const h2Style = TextStyle(
+ fontSize: 22,
+ color: Colors.black,
+ fontFamily: "Poppins",
+ fontWeight: FontWeight.w600);
+
+const h3Style = TextStyle(
+ fontFamily: "Poppins",
+ fontSize: 20,
+ fontWeight: FontWeight.w500,
+ color: Colors.black);
+
+
+const h4Style = TextStyle(
+ fontFamily: "Poppins",
+ fontSize: 15,
+ fontWeight: FontWeight.bold,
+ color: Colors.black);
+
+const h5Style = TextStyle(
+ fontFamily: "Poppins",
+ fontSize: 20,
+ fontWeight: FontWeight.w300,
+ color: Colors.black);
+
+const bodyStyle1 = TextStyle(
+ fontFamily: "Poppins",
+ fontSize: 18,
+ fontWeight: FontWeight.w100,
+ color: Colors.black);
+
+final textFieldStyle = OutlineInputBorder(
+ borderRadius: BorderRadius.circular(15),
+ borderSide: const BorderSide(color: Colors.grey, width: 1.0),
+);
+
diff --git a/lib/core/app_theme.dart b/lib/core/app_theme.dart
new file mode 100644
index 0000000..01c7ed1
--- /dev/null
+++ b/lib/core/app_theme.dart
@@ -0,0 +1,12 @@
+import 'package:flutter/material.dart';
+
+class AppTheme{
+ const AppTheme();
+ static ThemeData lightTheme = ThemeData(
+ appBarTheme: const AppBarTheme(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ centerTitle: true,
+ )
+ );
+}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
new file mode 100644
index 0000000..195df05
--- /dev/null
+++ b/lib/main.dart
@@ -0,0 +1,29 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/core/app_theme.dart';
+import 'package:office_furniture_store/src/view/screen/intro_screen.dart';
+
+void main() => runApp(const MyApp());
+
+class MyApp extends StatelessWidget {
+ const MyApp({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ debugShowCheckedModeBanner: false,
+ home: const MyHomePage(),
+ theme: AppTheme.lightTheme,
+ );
+ }
+}
+
+class MyHomePage extends StatelessWidget {
+ const MyHomePage({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return const Scaffold(
+ body: IntroScreen(),
+ );
+ }
+}
diff --git a/lib/src/controller/office_furniture_controller.dart b/lib/src/controller/office_furniture_controller.dart
new file mode 100644
index 0000000..a8aefdb
--- /dev/null
+++ b/lib/src/controller/office_furniture_controller.dart
@@ -0,0 +1,59 @@
+import 'package:get/get.dart';
+import 'package:office_furniture_store/core/app_extension.dart';
+import 'package:office_furniture_store/src/model/furniture.dart';
+
+class OfficeFurnitureController extends GetxController {
+ RxInt currentBottomNavItemIndex = 0.obs;
+ RxInt currentPageViewItemIndicator = 0.obs;
+ RxList cartFurniture = [].obs;
+ RxList favoriteFurnitureList = [].obs;
+ RxDouble totalPrice = 0.0.obs;
+
+ switchBetweenBottomNavigationItems(int currentIndex) {
+ currentBottomNavItemIndex.value = currentIndex;
+ }
+
+ switchBetweenPageViewItems(int currentIndex) {
+ currentPageViewItemIndicator.value = currentIndex;
+ }
+
+ isFavoriteFurniture(Furniture furniture) {
+ furniture.isFavorite = !furniture.isFavorite;
+ update();
+ if (furniture.isFavorite) {
+ favoriteFurnitureList.add(furniture);
+ }
+ if (!furniture.isFavorite) {
+ favoriteFurnitureList.removeWhere((element) => element == furniture);
+ }
+ }
+
+ void increaseItem(Furniture furniture) {
+ furniture.quantity++;
+ update();
+ calculateTotalPrice();
+ }
+
+ void decreaseItem(Furniture furniture) {
+ furniture.quantity = furniture.quantity-- < 1 ? 0 : furniture.quantity--;
+ update();
+ calculateTotalPrice();
+ if(furniture.quantity<1) {
+ cartFurniture.removeWhere((element) => element==furniture);
+ }
+ }
+
+ addToCart(Furniture furniture) {
+ cartFurniture.add(furniture);
+ cartFurniture.assignAll(cartFurniture.distinctBy((item) => item));
+ calculateTotalPrice();
+ }
+
+ calculateTotalPrice() {
+ totalPrice.value = 0;
+ for (var element in cartFurniture) {
+ totalPrice.value += element.quantity * element.price.dropSign;
+ }
+ }
+
+}
diff --git a/lib/src/model/bottom_navigation_item.dart b/lib/src/model/bottom_navigation_item.dart
new file mode 100644
index 0000000..1605a18
--- /dev/null
+++ b/lib/src/model/bottom_navigation_item.dart
@@ -0,0 +1,7 @@
+import 'package:flutter/material.dart';
+
+class BottomNavigationItem{
+ final Icon icon;
+ String label;
+ BottomNavigationItem(this.icon, this.label);
+}
diff --git a/lib/src/model/furniture.dart b/lib/src/model/furniture.dart
new file mode 100644
index 0000000..24f4493
--- /dev/null
+++ b/lib/src/model/furniture.dart
@@ -0,0 +1,23 @@
+import 'package:office_furniture_store/src/model/furniture_color.dart';
+
+class Furniture {
+ String title;
+ String description;
+ String price;
+ int quantity;
+ double score;
+ List images;
+ bool isFavorite;
+ List colors;
+
+ Furniture({
+ required this.title,
+ required this.description,
+ required this.price,
+ this.quantity = 1,
+ required this.score,
+ required this.images,
+ this.isFavorite = false,
+ required this.colors,
+ });
+}
diff --git a/lib/src/model/furniture_color.dart b/lib/src/model/furniture_color.dart
new file mode 100644
index 0000000..85d5a6e
--- /dev/null
+++ b/lib/src/model/furniture_color.dart
@@ -0,0 +1,8 @@
+import 'package:flutter/material.dart';
+
+class FurnitureColor {
+ Color color;
+ bool isSelected;
+
+ FurnitureColor({required this.color, this.isSelected = false});
+}
diff --git a/lib/src/view/screen/cart_screen.dart b/lib/src/view/screen/cart_screen.dart
new file mode 100644
index 0000000..050b964
--- /dev/null
+++ b/lib/src/view/screen/cart_screen.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:office_furniture_store/core/app_style.dart';
+import 'package:office_furniture_store/src/controller/office_furniture_controller.dart';
+import 'package:office_furniture_store/src/view/widget/empty_widget.dart';
+import '../widget/bottom_bar.dart';
+import '../widget/cart_list_view.dart';
+import 'home_screen.dart';
+
+class CartScreen extends StatelessWidget {
+ const CartScreen({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text("Cart",style: h2Style),
+ ),
+ bottomNavigationBar: Obx(
+ () {
+ return BottomBar(
+ priceLabel: "Total price",
+ priceValue: "\$${controller.totalPrice.value}",
+ buttonLabel: "Checkout",
+ onTap: controller.totalPrice > 0 ? () {} : null,
+ );
+ },
+ ),
+ body:GetBuilder(
+ builder: (OfficeFurnitureController controller){
+ return controller.cartFurniture.isNotEmpty?
+ const Padding(
+ padding: EdgeInsets.all(15),
+ child: CartListView(),
+ ): const EmptyWidget(title: "Empty");
+ },
+ )
+ );
+ }
+}
diff --git a/lib/src/view/screen/favorite_screen.dart b/lib/src/view/screen/favorite_screen.dart
new file mode 100644
index 0000000..8998c8e
--- /dev/null
+++ b/lib/src/view/screen/favorite_screen.dart
@@ -0,0 +1,33 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/src/view/widget/empty_widget.dart';
+import 'package:office_furniture_store/src/view/widget/furniture_list_view.dart';
+import '../../../core/app_style.dart';
+import 'home_screen.dart';
+
+class FavoriteScreen extends StatelessWidget {
+ const FavoriteScreen({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text("Favorites",style: h2Style),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.all(15),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ controller.favoriteFurnitureList.isNotEmpty
+ ? FurnitureListView(
+ isHorizontal: false,
+ furnitureList: controller.favoriteFurnitureList,
+ )
+ : const EmptyWidget(
+ type: EmptyWidgetType.favorite, title: "Empty")
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/screen/home_screen.dart b/lib/src/view/screen/home_screen.dart
new file mode 100644
index 0000000..9bd8ee2
--- /dev/null
+++ b/lib/src/view/screen/home_screen.dart
@@ -0,0 +1,54 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:office_furniture_store/core/app_color.dart';
+import 'package:office_furniture_store/core/app_data.dart';
+import 'package:office_furniture_store/src/view/screen/cart_screen.dart';
+import 'package:office_furniture_store/src/view/screen/favorite_screen.dart';
+import 'package:office_furniture_store/src/view/screen/office_furniture_list_screen.dart';
+import 'package:office_furniture_store/src/view/screen/profile_screen.dart';
+import '../../controller/office_furniture_controller.dart';
+
+final OfficeFurnitureController controller =
+ Get.put(OfficeFurnitureController());
+
+class HomeScreen extends StatefulWidget {
+ const HomeScreen({Key? key}) : super(key: key);
+
+ @override
+ State createState() => _HomeScreenState();
+}
+
+class _HomeScreenState extends State {
+ int selectedIndex = 0;
+
+ List screens = const [
+ OfficeFurnitureListScreen(),
+ CartScreen(),
+ FavoriteScreen(),
+ ProfileScreen()
+ ];
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ bottomNavigationBar: Obx(
+ () {
+ return BottomNavigationBar(
+ unselectedItemColor: Colors.grey,
+ currentIndex: controller.currentBottomNavItemIndex.value,
+ showUnselectedLabels: true,
+ onTap: controller.switchBetweenBottomNavigationItems,
+ fixedColor: AppColor.lightBlack,
+ items: AppData.bottomNavigationItems
+ .map(
+ (element) => BottomNavigationBarItem(
+ icon: element.icon, label: element.label),
+ )
+ .toList(),
+ );
+ },
+ ),
+ body: Obx(() => screens[controller.currentBottomNavItemIndex.value]),
+ );
+ }
+}
diff --git a/lib/src/view/screen/intro_screen.dart b/lib/src/view/screen/intro_screen.dart
new file mode 100644
index 0000000..10a5eef
--- /dev/null
+++ b/lib/src/view/screen/intro_screen.dart
@@ -0,0 +1,81 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/core/app_style.dart';
+import 'package:office_furniture_store/src/view/screen/home_screen.dart';
+
+class IntroScreen extends StatelessWidget {
+ const IntroScreen({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+
+ Widget introButton(){
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 80),
+ child: ElevatedButton(
+ onPressed: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(builder: (_) => const HomeScreen()),
+ );
+ },
+ style: ButtonStyle(
+ padding: MaterialStateProperty.all(
+ const EdgeInsets.all(8),
+ ),
+ backgroundColor: MaterialStateProperty.all(
+ Colors.white.withOpacity(0.4)),
+ shape: MaterialStateProperty.all(
+ RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(25.0),
+ ),
+ ),
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ const Spacer(),
+ Text("Get Started", style: h2Style.copyWith(color: Colors.white)),
+ const Spacer(),
+ CircleAvatar(
+ backgroundColor: Colors.white.withOpacity(0.2),
+ child: const Icon(Icons.arrow_forward,
+ color: Colors.white),
+ )
+ ],
+ ),
+ ),
+ );
+ }
+
+ return Scaffold(
+ body: SafeArea(
+ child: Container(
+ decoration: const BoxDecoration(
+ image: DecorationImage(
+ image: AssetImage("assets/images/intro.jpg"),
+ fit: BoxFit.cover,
+ ),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(20),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ const Spacer(flex: 4),
+ Text("Kana Office\nStanding\nDesk", style: h1Style.copyWith(color: Colors.white)),
+ const SizedBox(height: 5),
+ Text(
+ "Create a sustainable work space with 100% natural bamboo",
+ style: h2Style.copyWith(color: Colors.white)),
+ const SizedBox(height: 20),
+ introButton(),
+ const Spacer(),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/screen/office_furniture_detail_screen.dart b/lib/src/view/screen/office_furniture_detail_screen.dart
new file mode 100644
index 0000000..f866f8a
--- /dev/null
+++ b/lib/src/view/screen/office_furniture_detail_screen.dart
@@ -0,0 +1,180 @@
+import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:get/get.dart';
+import 'package:office_furniture_store/core/app_color.dart';
+import 'package:office_furniture_store/core/app_style.dart';
+import 'package:office_furniture_store/src/controller/office_furniture_controller.dart';
+import 'package:office_furniture_store/src/view/widget/counter_button.dart';
+import 'package:smooth_page_indicator/smooth_page_indicator.dart';
+import '../../model/furniture.dart';
+import '../widget/color_picker.dart';
+import '../widget/rating_bar.dart';
+import 'home_screen.dart';
+
+
+class OfficeFurnitureDetailScreen extends StatelessWidget {
+ final Furniture furniture;
+
+ const OfficeFurnitureDetailScreen({Key? key, required this.furniture})
+ : super(key: key);
+
+ PreferredSizeWidget _appBar(BuildContext context) {
+ return AppBar(
+ actions: [
+ GetBuilder(
+ builder: (OfficeFurnitureController controller) {
+ return IconButton(
+ splashRadius: 18.0,
+ onPressed: () => controller.isFavoriteFurniture(furniture),
+ icon: furniture.isFavorite
+ ? const Icon(Icons.bookmark, color: Colors.black)
+ : const Icon(Icons.bookmark_border, color: Colors.black),
+ );
+ },
+ )
+ ],
+ leading: IconButton(
+ icon: const Icon(
+ FontAwesomeIcons.arrowLeft,
+ color: Colors.black,
+ ),
+ onPressed: () {
+ controller.currentPageViewItemIndicator.value = 0;
+ Navigator.pop(context);
+ },
+ ),
+ title: Text(furniture.title, style: h2Style),
+ );
+ }
+
+ Widget bottomBar() {
+ return Container(
+ padding: const EdgeInsets.all(15),
+ height: 90,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const FittedBox(
+ child: Text('Price',
+ style: TextStyle(
+ color: Colors.black45, fontWeight: FontWeight.bold)),
+ ),
+ const SizedBox(height: 5),
+ FittedBox(child: Text(furniture.price, style: h2Style))
+ ],
+ ),
+ ElevatedButton(
+ style: ElevatedButton.styleFrom(
+ primary: AppColor.lightBlack,
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 15),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(10))),
+ onPressed: () {
+ controller.addToCart(furniture);
+ },
+ child: const Text("Add to cart"),
+ )
+ ],
+ ),
+ );
+ }
+
+ Widget furnitureImageSlider(double height) {
+ return Container(
+ padding: const EdgeInsets.only(left: 15, right: 15, bottom: 10),
+ height: height * 0.5,
+ child: Stack(
+ alignment: Alignment.bottomCenter,
+ children: [
+ PageView.builder(
+ onPageChanged: controller.switchBetweenPageViewItems,
+ itemCount: furniture.images.length,
+ itemBuilder: (_, index) {
+ return Padding(
+ padding: const EdgeInsets.only(left: 15),
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(20),
+ child: Image.asset(
+ furniture.images[index],
+ fit: BoxFit.fill,
+ ),
+ ),
+ );
+ },
+ ),
+ Positioned(
+ bottom: 20,
+ child: Obx(
+ () {
+ return SmoothIndicator(
+ effect: const WormEffect(
+ dotColor: Colors.white38, activeDotColor: Colors.white),
+ // ),
+ // offset: selectedPageViewIndex.toDouble(),
+ offset: controller.currentPageViewItemIndicator.value
+ .toDouble(),
+ count: furniture.images.length);
+ },
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ double height = MediaQuery.of(context).size.height;
+ return Scaffold(
+ bottomNavigationBar: bottomBar(),
+ appBar: _appBar(context),
+ body: SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.all(15),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ furnitureImageSlider(height),
+ Center(
+ child: StarRatingBar(
+ score: furniture.score,
+ itemSize: 25,
+ ),
+ ),
+ const Padding(
+ padding: EdgeInsets.only(top: 20, bottom: 10),
+ child:
+ Text("Synopsis", style: h2Style, textAlign: TextAlign.end),
+ ),
+ Text(furniture.description,
+ maxLines: 5,
+ overflow: TextOverflow.ellipsis,
+ style: const TextStyle(color: Colors.black45)),
+ const SizedBox(height: 20),
+ Row(
+ children: [
+ const Text("Color :",
+ style: h2Style, textAlign: TextAlign.end),
+ Expanded(child: ColorPicker(furniture.colors)),
+ Expanded(child: GetBuilder(
+ builder: (OfficeFurnitureController controller) {
+ return CounterButton(
+ label: furniture.quantity,
+ onIncrementSelected: ()=>controller.increaseItem(furniture),
+ onDecrementSelected: ()=> controller.decreaseItem(furniture),
+ );
+ },
+ ))
+ ],
+ )
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/screen/office_furniture_list_screen.dart b/lib/src/view/screen/office_furniture_list_screen.dart
new file mode 100644
index 0000000..70827e2
--- /dev/null
+++ b/lib/src/view/screen/office_furniture_list_screen.dart
@@ -0,0 +1,90 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/core/app_data.dart';
+import 'package:office_furniture_store/core/app_style.dart';
+import 'package:office_furniture_store/src/model/furniture.dart';
+import 'package:office_furniture_store/src/view/screen/office_furniture_detail_screen.dart';
+import '../widget/furniture_list_view.dart';
+
+class OfficeFurnitureListScreen extends StatelessWidget {
+ const OfficeFurnitureListScreen({Key? key}) : super(key: key);
+
+ PreferredSize _appBar() {
+ return PreferredSize(
+ preferredSize: const Size.fromHeight(120),
+ child: SafeArea(
+ child: Padding(
+ padding: const EdgeInsets.all(25),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: const [
+ Text("Hello Sina", style: h2Style),
+ Text("Buy Your favorite desk", style: h3Style),
+ ],
+ ),
+ IconButton(
+ onPressed: () {},
+ icon: const Icon(Icons.menu),
+ )
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+
+ Widget _searchBar() {
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 15),
+ child: TextField(
+ decoration: InputDecoration(
+ hintText: 'Search',
+ prefixIcon: const Icon(Icons.search, color: Colors.grey),
+ suffixIcon: const Icon(Icons.menu, color: Colors.grey),
+ contentPadding: const EdgeInsets.all(20),
+ border: textFieldStyle,
+ focusedBorder: textFieldStyle),
+ ),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+
+ Future _navigate(Furniture furniture) {
+ return Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (_) {
+ return OfficeFurnitureDetailScreen(furniture: furniture);
+ },
+ ),
+ );
+ }
+
+ return Scaffold(
+ appBar: _appBar(),
+ body: Padding(
+ padding: const EdgeInsets.all(15),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _searchBar(),
+ FurnitureListView(
+ furnitureList: AppData.furnitureList,
+ onTap: _navigate,
+ ),
+ const Text("Popular", style: h2Style),
+ FurnitureListView(
+ furnitureList: AppData.furnitureList,
+ isHorizontal: false,
+ onTap: _navigate,
+ )
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/screen/profile_screen.dart b/lib/src/view/screen/profile_screen.dart
new file mode 100644
index 0000000..967e314
--- /dev/null
+++ b/lib/src/view/screen/profile_screen.dart
@@ -0,0 +1,36 @@
+import 'package:flutter/material.dart';
+import '../../../core/app_asset.dart';
+
+class ProfileScreen extends StatelessWidget {
+ const ProfileScreen({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Image.asset(AppAsset.profilePic),
+ const Text(
+ "Hello Sina!",
+ style: TextStyle(fontWeight: FontWeight.bold, fontSize: 25),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Image.asset(
+ AppAsset.githubPic,
+ width: 60,
+ ),
+ const SizedBox(width: 10),
+ const Text(
+ "https://github.com/SinaSys",
+ style: TextStyle(fontSize: 20),
+ )
+ ],
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/widget/bottom_bar.dart b/lib/src/view/widget/bottom_bar.dart
new file mode 100644
index 0000000..79d9d16
--- /dev/null
+++ b/lib/src/view/widget/bottom_bar.dart
@@ -0,0 +1,53 @@
+import 'package:flutter/material.dart';
+import '../../../core/app_color.dart';
+import '../../../core/app_style.dart';
+
+class BottomBar extends StatelessWidget {
+ final VoidCallback? onTap;
+ final String priceLabel;
+ final String priceValue;
+ final String buttonLabel;
+
+ const BottomBar(
+ {Key? key,
+ this.onTap,
+ this.priceLabel = "Price",
+ required this.priceValue,
+ this.buttonLabel = "Add to cart"})
+ : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ padding: const EdgeInsets.all(15),
+ height: 90,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ FittedBox(
+ child: Text(priceLabel,
+ style: const TextStyle(
+ color: Colors.black45, fontWeight: FontWeight.bold)),
+ ),
+ const SizedBox(height: 5),
+ FittedBox(child: Text(priceValue, style: h2Style))
+ ],
+ ),
+ ElevatedButton(
+ style: ElevatedButton.styleFrom(
+ primary: AppColor.lightBlack,
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 15),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(10))),
+ onPressed: onTap,
+ child: Text(buttonLabel),
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/widget/cart_list_view.dart b/lib/src/view/widget/cart_list_view.dart
new file mode 100644
index 0000000..d6d727f
--- /dev/null
+++ b/lib/src/view/widget/cart_list_view.dart
@@ -0,0 +1,82 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:office_furniture_store/core/app_extension.dart';
+import 'package:office_furniture_store/core/app_style.dart';
+import 'package:office_furniture_store/src/controller/office_furniture_controller.dart';
+import 'package:office_furniture_store/src/view/widget/counter_button.dart';
+import '../../model/furniture.dart';
+import '../screen/home_screen.dart';
+
+class CartListView extends StatelessWidget {
+ const CartListView({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ListView.separated(
+ itemCount: controller.cartFurniture.length,
+ itemBuilder: (_, index) {
+ Furniture furniture = controller.cartFurniture[index];
+ return Padding(
+ padding: const EdgeInsets.all(15),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceAround,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(15.0),
+ child: Image.asset(
+ furniture.images[0],
+ width: 150,
+ height: 150,
+ ),
+ ),
+ const SizedBox(width: 5),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(furniture.title.addOverFlow, style: h4Style),
+ const SizedBox(height: 5),
+ Text(furniture.price, style: h2Style),
+ const SizedBox(height: 5),
+ Row(
+ children: [
+ const Text("Color : ", style: h4Style),
+ CircleAvatar(
+ child: Container(
+ decoration: BoxDecoration(
+ color: furniture.colors
+ .where((element) => element.isSelected)
+ .toList()
+ .first
+ .color,
+ shape: BoxShape.circle),
+ ),
+ radius: 15,
+ )
+ ],
+ )
+ ],
+ ),
+ // Spacer(),
+ Expanded(
+ child: GetBuilder(
+ builder: (OfficeFurnitureController controller) {
+ return CounterButton(
+ orientation: Axis.vertical,
+ onIncrementSelected: () =>
+ controller.increaseItem(furniture),
+ onDecrementSelected: () =>
+ controller.decreaseItem(furniture),
+ label: furniture.quantity);
+ },
+ ),
+ )
+ ],
+ ),
+ );
+ },
+ separatorBuilder: (BuildContext context, int index) {
+ return const Padding(padding: EdgeInsets.only(bottom: 15));
+ },
+ );
+ }
+}
diff --git a/lib/src/view/widget/color_picker.dart b/lib/src/view/widget/color_picker.dart
new file mode 100644
index 0000000..10faaa0
--- /dev/null
+++ b/lib/src/view/widget/color_picker.dart
@@ -0,0 +1,57 @@
+import 'package:flutter/material.dart';
+import '../../model/furniture_color.dart';
+
+class ColorPicker extends StatefulWidget {
+ final List colors;
+
+ const ColorPicker(this.colors, {Key? key}) : super(key: key);
+
+ @override
+ State createState() => _ColorPickerState();
+}
+
+class _ColorPickerState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return SizedBox(
+ height: 40,
+ child: ListView.builder(
+ scrollDirection: Axis.horizontal,
+ itemCount: widget.colors.length,
+ itemBuilder: (_, index) {
+ return Padding(
+ padding: const EdgeInsets.only(left: 10),
+ child: Stack(
+ alignment: Alignment.center,
+ children: [
+ widget.colors[index].isSelected
+ ? CircleAvatar(
+ backgroundColor:
+ widget.colors[index].color.withOpacity(0.5),
+ radius: 18,
+ )
+ : const IgnorePointer(),
+ InkWell(
+ onTap: () {
+ for (var element in widget.colors) {
+ element.isSelected = false;
+ }
+ setState(
+ () {
+ widget.colors[index].isSelected = true;
+ },
+ );
+ },
+ child: CircleAvatar(
+ backgroundColor: widget.colors[index].color,
+ radius: 15,
+ ),
+ )
+ ],
+ ),
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/widget/counter_button.dart b/lib/src/view/widget/counter_button.dart
new file mode 100644
index 0000000..335744a
--- /dev/null
+++ b/lib/src/view/widget/counter_button.dart
@@ -0,0 +1,52 @@
+import 'package:flutter/material.dart';
+
+import '../../../core/app_style.dart';
+
+class CounterButton extends StatelessWidget {
+ final Function() onIncrementSelected;
+ final Function() onDecrementSelected;
+ final int label;
+ final Axis orientation;
+
+ const CounterButton(
+ {Key? key,
+ required this.onIncrementSelected,
+ required this.onDecrementSelected,
+ required this.label,
+ this.orientation = Axis.horizontal
+ }):super(key: key);
+
+ Widget button(Icon icon, Function() onTap) {
+ return RawMaterialButton(
+ constraints: BoxConstraints.tight(const Size(36, 36)),
+ child: icon,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ fillColor: Colors.white,
+ onPressed: () => onTap(),
+ );
+ }
+
+ List body(){
+ return [
+ button(const Icon(Icons.remove), onDecrementSelected),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 10),
+ child: Text(
+ "$label",
+ style: h2Style.copyWith(fontSize: 15),
+ ),
+ ),
+ button(const Icon(Icons.add), onIncrementSelected),
+ ];
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return orientation==Axis.horizontal ? Row(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: body()
+ ) : Column(
+ children: body().reversed.toList(),
+ );
+ }
+}
diff --git a/lib/src/view/widget/empty_widget.dart b/lib/src/view/widget/empty_widget.dart
new file mode 100644
index 0000000..a96f8cc
--- /dev/null
+++ b/lib/src/view/widget/empty_widget.dart
@@ -0,0 +1,33 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/core/app_asset.dart';
+import 'package:office_furniture_store/core/app_style.dart';
+
+enum EmptyWidgetType { cart, favorite }
+
+class EmptyWidget extends StatelessWidget {
+ final EmptyWidgetType type;
+ final String title;
+
+ const EmptyWidget(
+ {Key? key, this.type = EmptyWidgetType.cart, required this.title})
+ : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Center(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ type == EmptyWidgetType.cart
+ ? Image.asset(AppAsset.emptyCart)
+ : Image.asset(AppAsset.emptyFavorite),
+ const SizedBox(height: 10),
+ Text(
+ title,
+ style: h2Style,
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/widget/furniture_list_view.dart b/lib/src/view/widget/furniture_list_view.dart
new file mode 100644
index 0000000..3f4a76b
--- /dev/null
+++ b/lib/src/view/widget/furniture_list_view.dart
@@ -0,0 +1,117 @@
+import 'package:flutter/material.dart';
+import 'package:office_furniture_store/core/app_extension.dart';
+import 'package:office_furniture_store/src/view/widget/rating_bar.dart';
+import '../../../core/app_style.dart';
+import '../../model/furniture.dart';
+
+class FurnitureListView extends StatelessWidget {
+ final bool isHorizontal;
+ final Function(Furniture furniture)? onTap;
+ final List furnitureList;
+
+ const FurnitureListView(
+ {Key? key,
+ this.isHorizontal = true,
+ this.onTap,
+ required this.furnitureList})
+ : super(key: key);
+
+ Widget _furnitureScore(Furniture furniture) {
+ return Row(
+ children: [
+ StarRatingBar(score: furniture.score),
+ const SizedBox(width: 10),
+ Text(furniture.score.toString(), style: h4Style),
+ ],
+ );
+ }
+
+ Widget _furnitureImage(String image) {
+ return ClipRRect(
+ borderRadius: BorderRadius.circular(15.0),
+ child: Image.asset(
+ image,
+ width: 150,
+ height: 150,
+ ),
+ );
+ }
+
+ Widget _listViewItem(Furniture furniture) {
+ Widget widget;
+ widget = isHorizontal == true
+ ? Column(
+ children: [
+ _furnitureImage(furniture.images[0]),
+ const SizedBox(height: 10),
+ Text(furniture.title.addOverFlow, style: h4Style),
+ _furnitureScore(furniture),
+ ],
+ )
+ : Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _furnitureImage(furniture.images[0]),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.all(15),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(furniture.title, style: h4Style),
+ const SizedBox(height: 5),
+ _furnitureScore(furniture),
+ const SizedBox(height: 5),
+ Text(
+ furniture.description,
+ style: h5Style.copyWith(fontSize: 12),
+ maxLines: 2,
+ overflow: TextOverflow.ellipsis,
+ )
+ ],
+ ),
+ ),
+ )
+ ],
+ );
+
+ return GestureDetector(
+ onTap: () => onTap?.call(furniture) ,
+ child: widget,
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return isHorizontal == true
+ ? SizedBox(
+ height: 220,
+ child: ListView.separated(
+ scrollDirection: Axis.horizontal,
+ itemCount: furnitureList.length,
+ itemBuilder: (_, index) {
+ Furniture furniture = furnitureList[index];
+ return _listViewItem(furniture);
+ },
+ separatorBuilder: (BuildContext context, int index) {
+ return const Padding(
+ padding: EdgeInsets.only(left: 15),
+ );
+ },
+ ),
+ )
+ : Expanded(
+ child: ListView.builder(
+ shrinkWrap: true,
+ itemCount: furnitureList.length,
+ itemBuilder: (_, index) {
+ Furniture furniture = furnitureList.reversed.toList()[index];
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 15, top: 10),
+ child: _listViewItem(furniture),
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/src/view/widget/rating_bar.dart b/lib/src/view/widget/rating_bar.dart
new file mode 100644
index 0000000..55ffad8
--- /dev/null
+++ b/lib/src/view/widget/rating_bar.dart
@@ -0,0 +1,35 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_rating_bar/flutter_rating_bar.dart';
+import 'package:office_furniture_store/core/app_color.dart';
+
+class StarRatingBar extends StatelessWidget {
+
+ final double score;
+ final double itemSize;
+
+
+ const StarRatingBar({
+ Key? key,
+ required this.score, this.itemSize = 20}):super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return RatingBar.builder(
+ itemPadding: EdgeInsets.zero,
+ itemSize: itemSize,
+ initialRating: score,
+ minRating: 1,
+ direction: Axis.horizontal,
+ allowHalfRating: true,
+ itemCount: 5,
+ glow: false,
+ ignoreGestures: true,
+ itemBuilder: (context,_) => const Icon(
+ Icons.star,
+ size: 2.0,
+ color: AppColor.lightOrange,
+ ),
+ onRatingUpdate: (rating) {},
+ );
+ }
+}
diff --git a/pubspec.lock b/pubspec.lock
new file mode 100644
index 0000000..bb7cd75
--- /dev/null
+++ b/pubspec.lock
@@ -0,0 +1,203 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ async:
+ dependency: transitive
+ description:
+ name: async
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.8.2"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.0"
+ charcode:
+ dependency: transitive
+ description:
+ name: charcode
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.3.1"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.0"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.15.0"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.4"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.0"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.4"
+ flutter_rating_bar:
+ dependency: "direct main"
+ description:
+ name: flutter_rating_bar
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "4.0.1"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ font_awesome_flutter:
+ dependency: "direct main"
+ description:
+ name: font_awesome_flutter
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "10.1.0"
+ get:
+ dependency: "direct main"
+ description:
+ name: get
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "4.6.5"
+ lints:
+ dependency: transitive
+ description:
+ name: lints
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.1"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.12.11"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.3"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.7.0"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.8.0"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ smooth_page_indicator:
+ dependency: "direct main"
+ description:
+ name: smooth_page_indicator
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.0+2"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.8.1"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.10.0"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.0"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.0"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.4.8"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.3.0"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.1"
+sdks:
+ dart: ">=2.16.2 <3.0.0"
+ flutter: ">=2.5.0"
diff --git a/pubspec.yaml b/pubspec.yaml
new file mode 100644
index 0000000..d2dc69f
--- /dev/null
+++ b/pubspec.yaml
@@ -0,0 +1,105 @@
+name: office_furniture_store
+description: A new Flutter project.
+
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter pub publish`. This is preferred for private packages.
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
+
+# The following defines the version and build number for your application.
+# A version number is three numbers separated by dots, like 1.2.43
+# followed by an optional build number separated by a +.
+# Both the version and the builder number may be overridden in flutter
+# build by specifying --build-name and --build-number, respectively.
+# In Android, build-name is used as versionName while build-number used as versionCode.
+# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
+# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
+# Read more about iOS versioning at
+# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
+version: 1.0.0+1
+
+environment:
+ sdk: ">=2.16.2 <3.0.0"
+
+# Dependencies specify other packages that your package needs in order to work.
+# To automatically upgrade your package dependencies to the latest versions
+# consider running `flutter pub upgrade --major-versions`. Alternatively,
+# dependencies can be manually updated by changing the version numbers below to
+# the latest version available on pub.dev. To see which dependencies have newer
+# versions available, run `flutter pub outdated`.
+dependencies:
+ flutter:
+ sdk: flutter
+
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^1.0.2
+ get: ^4.6.1
+ smooth_page_indicator: ^1.0.0+2
+ flutter_rating_bar: ^4.0.0
+ font_awesome_flutter: ^10.1.0
+
+
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+
+ # The "flutter_lints" package below contains a set of recommended lints to
+ # encourage good coding practices. The lint set provided by the package is
+ # activated in the `analysis_options.yaml` file located at the root of your
+ # package. See that file for information about deactivating specific lint
+ # rules and activating additional ones.
+ flutter_lints: ^1.0.0
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter.
+flutter:
+
+ # The following line ensures that the Material Icons font is
+ # included with your application, so that you can use the icons in
+ # the material Icons class.
+ uses-material-design: true
+
+ # To add assets to your application, add an assets section, like this:
+ assets:
+ - assets/images/
+
+ # An image asset can refer to one or more resolution-specific "variants", see
+ # https://flutter.dev/assets-and-images/#resolution-aware.
+
+ # For details regarding adding assets from package dependencies, see
+ # https://flutter.dev/assets-and-images/#from-packages
+
+ # To add custom fonts to your application, add a fonts section here,
+ # in this "flutter" section. Each entry in this list should have a
+ # "family" key with the font family name, and a "fonts" key with a
+ # list giving the asset and other descriptors for the font. For
+ # example:
+ fonts:
+ - family: Poppins
+ fonts:
+ - asset: assets/fonts/Poppins-Black.ttf
+ weight: 900
+ - asset: assets/fonts/Poppins-SemiBold.ttf
+ weight: 600
+ - asset: assets/fonts/Poppins-Medium.ttf
+ weight: 500
+ - asset: assets/fonts/Poppins-Regular.ttf
+ weight: 400
+ - asset: assets/fonts/Poppins-Light.ttf
+ weight: 300
+ - asset: assets/fonts/Poppins-Thin.ttf
+ weight: 100
+ # - asset: fonts/Schyler-Italic.ttf
+ # style: italic
+ # - family: Trajan Pro
+ # fonts:
+ # - asset: fonts/TrajanPro.ttf
+ # - asset: fonts/TrajanPro_Bold.ttf
+ # weight: 700
+ #
+ # For details regarding fonts from package dependencies,
+ # see https://flutter.dev/custom-fonts/#from-packages
diff --git a/screenshots/cart_screen.png b/screenshots/cart_screen.png
new file mode 100644
index 0000000..3535922
Binary files /dev/null and b/screenshots/cart_screen.png differ
diff --git a/screenshots/office_furniture_detail_screen.png b/screenshots/office_furniture_detail_screen.png
new file mode 100644
index 0000000..563543b
Binary files /dev/null and b/screenshots/office_furniture_detail_screen.png differ
diff --git a/screenshots/office_furniture_list_screen.png b/screenshots/office_furniture_list_screen.png
new file mode 100644
index 0000000..cafb426
Binary files /dev/null and b/screenshots/office_furniture_list_screen.png differ
diff --git a/screenshots/office_furniture_store_app.jpg b/screenshots/office_furniture_store_app.jpg
new file mode 100644
index 0000000..3f8926e
Binary files /dev/null and b/screenshots/office_furniture_store_app.jpg differ
diff --git a/web/favicon.png b/web/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/web/favicon.png differ
diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png
new file mode 100644
index 0000000..b749bfe
Binary files /dev/null and b/web/icons/Icon-192.png differ
diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png
new file mode 100644
index 0000000..88cfd48
Binary files /dev/null and b/web/icons/Icon-512.png differ
diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png
new file mode 100644
index 0000000..eb9b4d7
Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ
diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png
new file mode 100644
index 0000000..d69c566
Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ
diff --git a/web/index.html b/web/index.html
new file mode 100644
index 0000000..fc8615a
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ office_furniture_store
+
+
+
+
+
+
+
diff --git a/web/manifest.json b/web/manifest.json
new file mode 100644
index 0000000..822390f
--- /dev/null
+++ b/web/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "office_furniture_store",
+ "short_name": "office_furniture_store",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#0175C2",
+ "theme_color": "#0175C2",
+ "description": "A new Flutter project.",
+ "orientation": "portrait-primary",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icons/Icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-maskable-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "icons/Icon-maskable-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}