From 1fe9609107b5969bf8b78e2cba750637d62ccd63 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Wed, 27 Jun 2018 16:28:18 -0700 Subject: [PATCH 01/15] Adding shrine. --- shrine/.gitignore | 9 + shrine/.metadata | 8 + shrine/README.md | 45 ++ shrine/android/.gitignore | 10 + shrine/android/app/build.gradle | 51 ++ .../android/app/src/main/AndroidManifest.xml | 39 ++ .../example/flutter/shrine/MainActivity.java | 13 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + shrine/android/build.gradle | 29 ++ shrine/android/gradle.properties | 1 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + shrine/android/gradlew | 160 +++++++ shrine/android/gradlew.bat | 90 ++++ shrine/android/settings.gradle | 15 + shrine/assets/2.0x/diamond.png | Bin 0 -> 2973 bytes shrine/assets/2.0x/slanted_menu.png | Bin 0 -> 239 bytes shrine/assets/3.0x/diamond.png | Bin 0 -> 4244 bytes shrine/assets/3.0x/slanted_menu.png | Bin 0 -> 302 bytes shrine/assets/diamond.png | Bin 0 -> 1487 bytes shrine/assets/slanted_menu.png | Bin 0 -> 149 bytes shrine/fonts/Rubik-Medium.ttf | Bin 0 -> 143696 bytes shrine/fonts/Rubik-Regular.ttf | Bin 0 -> 140732 bytes shrine/ios/.gitignore | 45 ++ shrine/ios/Flutter/AppFrameworkInfo.plist | 26 ++ shrine/ios/Flutter/Debug.xcconfig | 1 + shrine/ios/Flutter/Release.xcconfig | 1 + shrine/ios/Runner.xcodeproj/project.pbxproj | 438 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++++ .../contents.xcworkspacedata | 7 + shrine/ios/Runner/AppDelegate.h | 6 + shrine/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ shrine/ios/Runner/Base.lproj/Main.storyboard | 26 ++ shrine/ios/Runner/Info.plist | 45 ++ shrine/ios/Runner/main.m | 9 + shrine/lib/app.dart | 124 +++++ shrine/lib/backdrop.dart | 291 ++++++++++++ shrine/lib/category_menu_page.dart | 81 ++++ shrine/lib/colors.dart | 27 ++ shrine/lib/home.dart | 35 ++ shrine/lib/login.dart | 111 +++++ shrine/lib/main.dart | 31 ++ shrine/lib/model/app_state_model.dart | 106 +++++ shrine/lib/model/product.dart | 48 ++ shrine/lib/model/products_repository.dart | 288 ++++++++++++ shrine/lib/shopping_cart.dart | 271 +++++++++++ shrine/lib/supplemental/asymmetric_view.dart | 95 ++++ .../lib/supplemental/cut_corners_border.dart | 139 ++++++ shrine/lib/supplemental/product_card.dart | 88 ++++ shrine/lib/supplemental/product_columns.dart | 87 ++++ shrine/pubspec.yaml | 66 +++ shrine/shrine.iml | 14 + shrine/shrine_android.iml | 27 ++ shrine/test/widget_test.dart | 7 + 83 files changed, 3336 insertions(+) create mode 100644 shrine/.gitignore create mode 100644 shrine/.metadata create mode 100644 shrine/README.md create mode 100644 shrine/android/.gitignore create mode 100644 shrine/android/app/build.gradle create mode 100644 shrine/android/app/src/main/AndroidManifest.xml create mode 100644 shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java create mode 100644 shrine/android/app/src/main/res/drawable/launch_background.xml create mode 100644 shrine/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/values/styles.xml create mode 100644 shrine/android/build.gradle create mode 100644 shrine/android/gradle.properties create mode 100644 shrine/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 shrine/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 shrine/android/gradlew create mode 100644 shrine/android/gradlew.bat create mode 100644 shrine/android/settings.gradle create mode 100644 shrine/assets/2.0x/diamond.png create mode 100755 shrine/assets/2.0x/slanted_menu.png create mode 100644 shrine/assets/3.0x/diamond.png create mode 100755 shrine/assets/3.0x/slanted_menu.png create mode 100644 shrine/assets/diamond.png create mode 100644 shrine/assets/slanted_menu.png create mode 100755 shrine/fonts/Rubik-Medium.ttf create mode 100755 shrine/fonts/Rubik-Regular.ttf create mode 100644 shrine/ios/.gitignore create mode 100644 shrine/ios/Flutter/AppFrameworkInfo.plist create mode 100644 shrine/ios/Flutter/Debug.xcconfig create mode 100644 shrine/ios/Flutter/Release.xcconfig create mode 100644 shrine/ios/Runner.xcodeproj/project.pbxproj create mode 100644 shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 shrine/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 shrine/ios/Runner/AppDelegate.h create mode 100644 shrine/ios/Runner/AppDelegate.m create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 shrine/ios/Runner/Base.lproj/Main.storyboard create mode 100644 shrine/ios/Runner/Info.plist create mode 100644 shrine/ios/Runner/main.m create mode 100644 shrine/lib/app.dart create mode 100644 shrine/lib/backdrop.dart create mode 100644 shrine/lib/category_menu_page.dart create mode 100644 shrine/lib/colors.dart create mode 100644 shrine/lib/home.dart create mode 100644 shrine/lib/login.dart create mode 100644 shrine/lib/main.dart create mode 100644 shrine/lib/model/app_state_model.dart create mode 100644 shrine/lib/model/product.dart create mode 100644 shrine/lib/model/products_repository.dart create mode 100644 shrine/lib/shopping_cart.dart create mode 100644 shrine/lib/supplemental/asymmetric_view.dart create mode 100644 shrine/lib/supplemental/cut_corners_border.dart create mode 100644 shrine/lib/supplemental/product_card.dart create mode 100644 shrine/lib/supplemental/product_columns.dart create mode 100644 shrine/pubspec.yaml create mode 100644 shrine/shrine.iml create mode 100644 shrine/shrine_android.iml create mode 100644 shrine/test/widget_test.dart diff --git a/shrine/.gitignore b/shrine/.gitignore new file mode 100644 index 00000000000..dee655cc42e --- /dev/null +++ b/shrine/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ + +.flutter-plugins diff --git a/shrine/.metadata b/shrine/.metadata new file mode 100644 index 00000000000..82403edb59b --- /dev/null +++ b/shrine/.metadata @@ -0,0 +1,8 @@ +# 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: c7ea3ca377e909469c68f2ab878a5bc53d3cf66b + channel: beta diff --git a/shrine/README.md b/shrine/README.md new file mode 100644 index 00000000000..f6ab8efb8f6 --- /dev/null +++ b/shrine/README.md @@ -0,0 +1,45 @@ +# shrine + +A sample shopping app that uses Material widgets in its UI and +[`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to manage the +state of its shopping cart. + +## Goals for this sample + +* Show how to customize Flutter's Material widgets to produce a unique design + for an app. +* Show how to use `scoped_model` to manage an app's state and access it across + different routes and in different widgets. + +This is a modified version of the app featured in Flutter's +[Material codelabs](https://codelabs.developers.google.com/?cat=Flutter). + +## The important bits + +### `/model/app_state_model.dart` + +The model object representing the state of the app. It holds the available +products as well as what's in the shopping cart. + +### `/supplemental` + +A bunch of widgets that customize Material to produce the look and feel of the +app. + +### `shopping_cart.dart` + +The shopping cart widgets. They access the app state model via +`ScopedModelDescendant`, display the contents of the shopping cart, and allow +the user to edit them. + +## Questions/issues + +If you have a general question about any of the techniques you see in the\ +sample, the best places to go are: + +* [The FlutterDev Google Group](https://groups.google.com/forum/#!forum/flutter-dev) +* [The Flutter Gitter channel](https://gitter.im/flutter/flutter) +* [StackOverflow](https://stackoverflow.com/questions/tagged/flutter) + +If you run into an issue with the sample itself, please file an issue +in the [main Flutter repo](https://github.com/flutter/flutter/issues). diff --git a/shrine/android/.gitignore b/shrine/android/.gitignore new file mode 100644 index 00000000000..65b7315af1b --- /dev/null +++ b/shrine/android/.gitignore @@ -0,0 +1,10 @@ +*.iml +*.class +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +GeneratedPluginRegistrant.java diff --git a/shrine/android/app/build.gradle b/shrine/android/app/build.gradle new file mode 100644 index 00000000000..2c16fbafe40 --- /dev/null +++ b/shrine/android/app/build.gradle @@ -0,0 +1,51 @@ +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.") +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 27 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.flutter.shrine" + minSdkVersion 16 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + 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 { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' +} diff --git a/shrine/android/app/src/main/AndroidManifest.xml b/shrine/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..f288ca93ff9 --- /dev/null +++ b/shrine/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + diff --git a/shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java b/shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java new file mode 100644 index 00000000000..f9c24edde73 --- /dev/null +++ b/shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java @@ -0,0 +1,13 @@ +package com.example.flutter.shrine; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/shrine/android/app/src/main/res/drawable/launch_background.xml b/shrine/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000000..304732f8842 --- /dev/null +++ b/shrine/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/shrine/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/values/styles.xml b/shrine/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..00fa4417cfb --- /dev/null +++ b/shrine/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/shrine/android/build.gradle b/shrine/android/build.gradle new file mode 100644 index 00000000000..447688755cf --- /dev/null +++ b/shrine/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/shrine/android/gradle.properties b/shrine/android/gradle.properties new file mode 100644 index 00000000000..8bd86f68051 --- /dev/null +++ b/shrine/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/shrine/android/gradle/wrapper/gradle-wrapper.jar b/shrine/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/shrine/android/gradle/wrapper/gradle-wrapper.properties b/shrine/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..aa901e1e0db --- /dev/null +++ b/shrine/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-4.1-all.zip diff --git a/shrine/android/gradlew b/shrine/android/gradlew new file mode 100755 index 00000000000..9d82f789151 --- /dev/null +++ b/shrine/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/shrine/android/gradlew.bat b/shrine/android/gradlew.bat new file mode 100644 index 00000000000..aec99730b4e --- /dev/null +++ b/shrine/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/shrine/android/settings.gradle b/shrine/android/settings.gradle new file mode 100644 index 00000000000..5a2f14fb18f --- /dev/null +++ b/shrine/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/shrine/assets/2.0x/diamond.png b/shrine/assets/2.0x/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..602e2ea51662fc069c8064cb24a8ee7267fb5f71 GIT binary patch literal 2973 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 Tw7?@l00000NkvXXu0mjf8c(bT literal 0 HcmV?d00001 diff --git a/shrine/assets/2.0x/slanted_menu.png b/shrine/assets/2.0x/slanted_menu.png new file mode 100755 index 0000000000000000000000000000000000000000..5958055e4240b0a808b94fc451cbf36303c3725b GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^DnKm3!3HEJ?TGgSQY`6?zK#qG8~eHcB(ehe%RF5i zLp*qsOD>yl(P$J9envt zAz+0dmuilpwU(I_(_%%3wE_#OJ$p|-^f}XWZns|SEpvsZ0%q=i{~r(F7m_zoWGUh? nW}bX`0jJ`G=6{C&RS3j3^P6C3h literal 0 HcmV?d00001 diff --git a/shrine/assets/3.0x/diamond.png b/shrine/assets/3.0x/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..78af7cd6483c27597aac3ab9693d0de0b89a4717 GIT binary patch literal 4244 zcmV;F5Nq#=P)?2XDJhad@kjO)VB%9qk{U&%x zvblHe?%sR%k#Nu1GkfR%XXgLszw_UJ{+WL+C2_n;oX#K0jJ`t{J1dUO#@rO8X<8uv7i)Vxu}axayow`%cMM2gu)qQjASz^R~9+)u8x{vg9U5`%STka#NnFF z2z?#M=@Au3E+jjlBoYS=T z(828%)Ze8_%LKz1qt$EIKMj5GP?uIyGlN38l?)q{lexFy(EC=ifX2+fN+(WCt8P48 z2I1Ule(gz6BPC_oqejkIvt~`mDr!s@%+!K{-pwt6HBetySw(bm)Jxw!Z(#qQtlF}r z*$R4070lI6XLf**_aKzQ2#7t7m(G(irIs)jLHnIi7`Yaz>axz6dUtdy$+SFL;U5^^7dDd!ua+a~-d}SLWmm zJ9pMcTULZ`iluaw+dZ5GLLWvX6hglsY0`vb5{jsU^kC2q?!d|B>M4$bTs_=q;D!ZL z?8yIKYlv-w8aQ9KVM_f{roFJz z)FTM$tGaKR^uzL+n*ZtHrX-w^9H{aSikTCayOJ7t_Yqc0;<7^o$iO3EI+CS3(vz- z_Ed%6yAUbpP3`ODnwnOq?3;_7u13Ph-6C#)X9L44ik$9&RetXiB3vz4#3QD(v{Wh{ z<9;q;p%AjDvevhtI|xPTJkCp1t$#k1q=%I}VJgdy7maa04M9acEs01lGiJ<4-?sM8 zZ!jX?B_squ5Fa9vG^?`C|D+yns=_P%-p3%Ex#(?Kp9lFq%#l`eHo9y*YGQN~0EF`rwb2_PoEANnFxR=Iy78;Gxw}daSAh!! zgNn{(Ap&!llqdx>Q%aB7Y_z1(=X*yJr<(yPe7?014)+Nj*JBNRc-6_4Koxge>EUv? zreKN+3WmZNxs?$%HiC-kZOnE#X7gJk!0lEj5YA?}m#%;cZ_s6ok#PZ;ZoS6s9-@b< zDwrwx`J-t|Yc-@iQm+E6?(NBt$oTTQU2$98)1@iS2o-*Rjon5k;0^nwUekEc$2137 zHFsl)aJvYm$mRM$Fc91dOX56HK@Njm@99l?kN>ORzgG{pyTdnly`Rx^TOmeHtv;{p zeD22L?kp|bPG;OBmuoUMOss=YbYD^+U>~fc;1{`mSkB-EZ1nht(wYrISt>KO3>l|K zj{-cC#;pf<-(Q_O_#6h|e85|kWWvsgTk~fc688XWmxYu;$pVP0d#;g)yCJEdFs2Tq z_35=pAxeU&dju1tc}m8aG%-B@Yi`cQk3RZZX}#@bzvs}Qe+|pYxfq!)1#l*fUk_kI z$I8lD|5F`XJnix9*Sps}P2V(^U=E|bOibxXEHvDTEl0Y(p^lAM^Iv`vmZV#)ZZHb# zMp~i ziX5)Zm~&mBUM<~JRp*y z=9#tOpi{lw?54z#SF9%#%uwD?6AJH&PJ-bX*t~XUTfh##QNJiQ9IS|DZ9%=7?wdPf z;>5l(lV1^YNE_|xwtKa3x(J5vD5TUTUehMzqLa3hMB+U!M=AOyU{BfEHJruyh8S(C$D`cON_2Is;aC}w4aHKSe z-T}+tv|Sxu5SE4%V!^U0Q>KV4j__jL`hLc^alM#KUImk#jH-@I^VdXruT0%}qo!as z`g{j48|`Aob!-GLw~?*?K2X{*uP6UM)^uVS9@vY-eIU(`WCOaUV0h&fwZ2!e81}xf zAxalu_!bCpdH|3wFfy6V7qN=I+*n!b{euWcfe8h}k!*J9c8r`8N`WpZV`(xYWpfG& zdh9w5SLak_Wn8^?>7Q>i_-ldEj61a8;rW^sDTtdqo-eRo@C)T$HD$!Lx25#~Rag(m z z6}Gvu&bLB@6Ap_=Fi>TT+NIebKzn02mZUMVR$|v?k68uf>N_N}l`xM_`y9hNn7;<7 zjocoduXi7jV0a}w*a(e0D5?;{x!}mBpDh&ObSKysEv-wi!CdT-r)&{iUHhWtJ7U4` zinB%ze-^{?BT*w%mP<>V1^WBZM3tlfjH_*IT-JH7(rpmR3$d^hm0);Wds@0}7A%Z_ zR%5VCGGrDgJ(qb^?y4;9NoV?nE6r1^~X z(w;Y1w;nUuV)gq2}8dgL5 zSoRZ4=Co)sn$OiUtgtfFBM=G+NNIGI5utE8V-gH62rJEl!hAnkkGZ&dh6*bbGEC{C z#&XZ2@!2voo9_6DO7W! z@@g7sIn$n|qvX*Pr6J0*N4bfQ_L{}zyY}yid1w8fB zD#_KjjY%`PTGzsfCEpam@P_#jxConGj>RI)ogYwnS%gZTN4i)fVhH=nE`xfxK!jry zR^o8a!fqFFU@#7u*i;L3Zt`V{DmzURB@f~W+IRY1?GKZmz1DGQjv6SL^7#2{P+^_6 zt#+l4ewNj@cWKvr<2j}Z1`fLuRBCf^WAv+E0QCQcoP1s#nnbyQ(2H#&T$?0D;0v?r zj2u%1!+C&kHe=Mhq|FZ?j9t&S;|g&S2*l}0H{<u2+VZBaAJ6z z2e#=5mr=3J=lSVl#||(;ycK2fzzmY*(6getxw?jCctC_>6lRHFc$|kM(K#aGFj*UP z{6w=!7MiG~=wLVrgsWNc10#{2akU*?&Cy|7A{b5rPRZDWQL|D^4!fyjjBBbGCw|Z( zhxLRW8nAG^767w;KfiClg5qfkCh7H zY9mw_!tr{GcMKV#qP?)Cf{7%I5Krj2O~H_kS=vspRsTZAo0el6&&XIhD$CdE^@x0&*!$*c>v3XBOeYzwI_i>v|b6f=TZcR-ip-eA4aOkPH z60=zp*N0Q4p2AZxM1+NKym?$Li*U?_#YHfjXdVv&i$*VuaBe)q2v3FMvDuXC{$hgpr2h*)r1aw6f#%>Q0DYco-p;Gw&A>hiyWZgb^P7x@jrA4Ht>pmKeP^ z(I1CMh+uf9@OTkSJcT|dSVRlW3?t;>cxYOCg%v>1w6VO-x0=(K$SYxj;Y{m=5yAs) z!g8FRM9p$L)mfx-R%c?9ZF7>>szvLKppJpEQ< z$4IDPIN6mx57s}#VT3#m#Yh+-568oMWud5>pu#r8ogY;=o~S;fu!IW+?-5JG2%`zd zTrixGwlG3M9}+PIH55}A;l4m{G2HpWa6F8b#aNNtCu%?5u%r+SXF6-t z@ZX|?c8EG4+Au<_-#dsbFA>!VHM*_vhUt7cIjOFg0++1ffPYf}$Jg(IK1tVXgOcqN zZn%B|zGqVfukaP>cyv?t=n>c8^D2MGNE1bVAskO~8;Sfy>(yIa0$JQqT_O&$JiE~Sgh{l0gFI0*tKjVe?4KNVj> zcPaO3>8UssHdGD9^PmQDu|29(3w{cR?#LcB;u#T6B4J6T%9M`aANpiLnTL0zDS2k5 zU>f0g(j{g@ewj&E$GVbAl_`Ynt*@`o9XN=GYG1D8nVCXOlvenC>&&dv?7EUpl_?DJ zcoSG@b;`Y2DeCkT4jdqicQLCiBlRSuDpMGmJSOk^Au4a@J~JiHP>OIod>Lu%Mz2@+ z4l~q-NrlZ}*d$`YtJ&R9|6f>XeekXs9}bJ@UXqqo_`Gk#R5s3ql2(-|{V-%e_9L*f z%m^d=ID6#q$CP@LJxyv=rgR>{2r*)G!Uz>)l@va(kYuBUu)>6%1(l)+%Svihru53* zhWh4}V^TrqzM1E${64*X$?f<_^e<&b zjM8U3J_Y;I_AB>VDOY=lYFn%YPxkzj6HFvwgl(N3hj2VAg_}~UOz8-ywB5Ob249H# zJS8tIeYvXEpLFq^VKfSFQ*Oj4+@wqFK1{;8gb_l89kBQ9E!=pa)RD|-$_hp+j4+ocg}fFY&8 qnKXVqfK!rg#4#h&;@6_}E&U&1ag)lc-`4g30000f5d*`7DW@ZBhFfv%oIMw;KQEUJ0TPdMItqeO|H%S=eP1IpKv;3r|uZV=Y zX<)*gD^B@h$xsap%-j+Jm$&&8CY!|0%l-YS_~_IS#RKP7rAg>>^_+OSJ~UK(`V97> uX>}__zaDGL&hWV28hg}!R_L~ujI(B$e%*cP=M$iZ89ZJ6T-G@yGywp7&v`)r literal 0 HcmV?d00001 diff --git a/shrine/assets/diamond.png b/shrine/assets/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..1978a0a5ab02b2a48c1c24ac5ba3c7d86bdade28 GIT binary patch literal 1487 zcmV;=1u*)FP){Trg3ZmY8H3ot!wiln)Q2EKzbEQdRG#&_}^YWt<=3Li`!X-dC>gNBoN2j$Y@{14 zIOEOo`jj25t*x_0Iq{OOph(HCQ-wH6AfUU-OnlpNK^S9l&fAgA0g?e&h3Dd>ueTQz z#2IafUjTxMc~NHeVWz4FNr3>9oXhuhI-TFp_LjUVWC{2WPgNGcxGP7e>I!<=1$iS{YK+(`4c@o|Cm!#O7U`^Q4ArN)#LW|Y|Y8p zpvUA7TCFkHXWdOuZX+R#y{L1=xJ_w1X;;P zFzSTcqgd3LPy)}eYX{+1h4fEGvuGt0ACK7`<#u~c!FE0BU`C3NYv3=mKC;zf+34{K z2b56|y5cu&v^F(0xq}5R&dhEQOnnM=zjqA{t_x;Q`l3vQc4Zy$lEn6O3=Y1b@${$7 z=^O!~7l=oJWlf(OexCT1CL9@7WMMDG#S8c4mzTe(&#}-);&01%9fhN9SHXE59d^3W zN<4R2t!7oQV|Y^;FFh-mTy1Rk3qY_GUM}$}7`b6=_A>8r>Mtt+f?|x#&h0~MwGfYN zyx8R$I8VGzT8-!fdKN3$`-Q3=ARfvF#-(qG_e(HB`AAB_8e1@@C4rE0d|d2) zq~Ryxac6zSc!waFFHzP!%uU&gp=?S_s{XLM`?{~4?>H!srrzEeF0mRoBDRS2&Z$Rz zgBZu?LrIpSbC#hLUD@n~QVph4{<-j|B3*7bnU5tgyOf_HF?bnR@rT8U3 zu#Ar9#>U*~$%#Wq`=gLYV$)^-(lqAG!}#j0N$aMtbbH7L+qDs2cW)CPDuoP$0{%QP zF`AZ?OqsYHzjU0|H{-b)KO806bu$X=#hCcjWh3L`LGLrhgfD9e)8amtVPZvzKY#b!vaFVrMOkKxUl@OFp-Hp`MJY^;th|&2GZW!ivv&EJwGk~1fQlS p!h^6vUUZW$%gbB%_d~d0{{^B2>;U+b8dd-R002ovPDHLkV1ken!iN9= literal 0 HcmV?d00001 diff --git a/shrine/assets/slanted_menu.png b/shrine/assets/slanted_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c80d2d47ea24c1901ebf78a093cb3d15f41f06f7 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&J!3HGrh2HJ~QY`6?zK#qG8~eHcB(eheKAtX) zAsV8|B^R&#J@25BkeE_-r|{_^#+*|#H*h`@`hEJtcE;&<48+n^R5wgK%xL?-lPf2s x*)8C}WZ4@h9v(e&;E79Fg0l3N{*Upt42#wY$0!C>@B__d@O1TaS?83{1OWOnGwuKY literal 0 HcmV?d00001 diff --git a/shrine/fonts/Rubik-Medium.ttf b/shrine/fonts/Rubik-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..c0b7965f98f7d2ff48001143fd1bec03620a9fc9 GIT binary patch literal 143696 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 z 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 literal 0 HcmV?d00001 diff --git a/shrine/fonts/Rubik-Regular.ttf b/shrine/fonts/Rubik-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..fb52c8eec809c567a13e829772e38273ebfc1291 GIT binary patch literal 140732 zcmd?S2b>kv-S~aZnYnj&@9y2gR{FB^B7Fe?bp?Woh>8sx9VCj1NbDM8jIqUFFEKto z#u#JNsIgZx#uzK2AR;2Y_a;(y-tX@>b9e8;f|xw-`~N?mcjj}>oH=vqub(nA#u{T9 z;Q6L}&`HM}#ho>-_48aaj~euo!R=ag$R?^2_g5Ts!tp0vR66r^?jJYi+UlcDI%U9Z zU0(mQG1qaQ?0Ni2UAj+Q{mui%{B}O+M~^#y%#`4$M)}4}?{7@jW8*HFR$jFy_XXoh zcJqAc#3|>Tf64e?Tw`46Lh_fKGv?wc#OL#TE7#0(CSN}B)IGBwHRk@M#t!X2X~LNC zS&zK)jYY{I@l_)Yr`;lJBm#=2j+8TfCzZ;a>G zy4}VjPZsz8G|v6YeTe_D`i6iu2icB*MLdCas6%pkDG5d_p>OoquNr9I}f;pL_zinX*hPs2`HLA*Ec$dk)W z#c{_EEjOKqAAelA=^Lf>$PLc4G~Z;Kf+!rL?+v1G+$2q*DLQY$)CR+$^boK91 z|6%o?Q2+V!$4ouXys7^C>d#VtuKJ7BU#tH1^Upi~JZsd?R6k$+GWE;VZ$~esr%)=s z^j$(>jQF+BekkOdn2BqSRLJgi?@|8VX=>vf(9R_P!CkXVk*P4f%m6dooMFbAbIsJK z2NV6*<6p!D)0rkCV?_Dt&Sia;AAaNEE036@ao!P^9eLS+j|gX(*q~NFF+(>VKjQeS z!oDAWYj{2F5w6zQ(fv&va!9TYw#at2BkTkAU0dzi zxxTK-O?1=UL+*XI*)v{eufKP$cc1r|_p&$3o9nIjw)%0u+;8Jo`GfrvOr{$ctaHP0 zrv)qB>A@;@X0X(a3KqFB!4fwv_!_Do6@16tcJ8*BTxSRk47RvI!AA0IBhMD{Y)Vh% zrt|FfV1>Jra{nA`aDNH5m`uATSWnJsYTHffjg+~OGS`!0J1KUUBq`Q9kC<4ngOp21 zSxp_QsADyCEGO4;a;+fOLUL^;*H&P(hjPMl_mE-(DK?N|ok{RyCFL#R=~tAshq9JX z)-uZahLnp*xs;UiO+LL^;2bFj@$^_~A0E6#ip^138{98x#dMzEPR={I-bJq;r=CBP z{x88=lc0{Z+OyjBE~A7cl(39C7LanA_A=K7wATPJr;yx6ol@V2QBPACm`~1c$T^!j zH&f>p`m;M&N1y&d340U|ma7Z4(#Ms~2dc4PKJBPPqU{M*+3H|9DL3(SCKAXCHkz!c zgxx&bLJ99XOD-3DMDBIu-a|WjYCS6{VQG|V0jai<>T6Q1Ce?a(YOuzg5$u6BP9trG--OGV-q0yi(KGr2d?mB(?PCb5gH}TDgGK3!<8~DUa--rajcOO`*Snd@HmT zFZe)d^lM_iB4#b6>;N18pajtp9@G<~rbRqo%=7ice9E(J`fQb!wu5IIc(#UTUubEo zqtpv%*A`;`Ne{vt>-G71p06gyGM<0O^VvM#p(U&*BduJU!=;Uc|ScI zozV#0u!*!k@(AX_M?dliz6uun$Sfv!Gk81rI(U!zz6-WMbq8?-pV6b$!TZ5tNgR9| zYyJV2Zq+ezr+oQ;zlS9CD= z`cli>uKu>jcVm@)NS6@3M(nnL6yXtk7hN~gqNwe`TcnZpE(_ko|0YWDwOrG3ZqWOc z>W2`wV_sDKx5MsqnJ(8Axkj$swQ-$Xch}zya7Vk5Zkl_-J>y<=(1=X79{tk~1>r!JK)?vgE1ByOK{NXC&t&*Csb7 zcjvm?%-r1EqTEKgt#Ui$cFpaT+dp?e?$Nntx$|-t<}S}& zo4Yx8M_z-xvb<(_t@1kLbvTfylh0-$g;_0Q_HR`yP<4)*%M_Sl`U_W*|0&wvWCqXc4|1F;Ry{# zHoO(;n;I-LuRt~1xLOSzjPJ}#rtvIc%{PDg71bwEoy6HE%MP1?$P< z%&s6n!)`)PZrw{?FN-w&x9%luZcA!xxC8q2*Z03IHogxmUqT89JQltwOtl~~a3A1m~pf)yH1*c zrj0GdWi!`d75cP>ZYV_o|d{;Qy-`=dzVy7Nkx>@ zfRc(SDU*6LsW(AMGPX&p7cP(yPFf5Q*dsO-`8@J@;JKvu*&C z8T$2ea|1YI75!ZgJ+6i`)&XS?Yi&E!z5&ZjMn7VUe-PQ%Yrxb>=yV|*uow=Q=bpnN z7CDngDJv*tCOoqnp4kCJb^s9>qsjPb2_<|Br7xz0uPEUwN{~^-EOLVhQmkh_;0fCM z6wrSS6`zP*w+`n)i;69{HAK^a6eS-TGHxu_6ZWiuy+!wgnxH-5l$upO7 zzXGE32!D;6kNXCO|bR!6)uK++^GZj3_R|O~GA+gOA;n!I$o8+zX6pUi`P{?8j5)zVhmSV@w6| zVHtAaU1<0#xN-|z>5vhbaAj5`bK`Jj2K2iXx>*Qqtb;bTM4EFYqt{K0DYv0PHzQMI zd@b`0Uor~Z$k=kLJ5J|eUO^(PMk1_2BCK@JGIoBB5$+4<#}{!kz*#0O*c#QGLCrDb zfv?hjez22Tga2z%oL$$);1;*qrG78T_ifu-U zZ9*Pe`u!S^Ukv1hf&}u}^uGc9&!qoi;j94iAHtoRfy4a&-{wwfxLTV*Wa@t&D>_?d zQt{DcU#KSEypw;|*jCyRS@0Kpi`gg4@ua)#%S^((Oh&Za{yo zMSreCf384hR#U=>lqj}X9lOY8Gp{nh`0hAToJRO`+?lwSNEfz1`m(F0FX`?2p>P~3 zETP6ERM-M4JT#)hY)XEK-t6Ch1?yXCPx;bwv77~4Sn(_Ewxjut?7WW+PZ@A}iFW_FpiM9DEd0xZ4fqN787H$UaZ5*pBW-e|% zytEMbEM>KYmbihYwL6B{?&DcuIRST?=?EM<0>@77Qeep%4)83;zRjtzt83a#Zl9c% zoPq(LoIW{ya(Lzt`V^x-G5QmuKQa2_(;uJy_z{l_Tx3M((;r{u+zVV~#^EK}`YL%| z!@Yrf6ZaNw2JUU#JGi;HrOf0dOa`=&a05(3TIA?YCN$A7txwssESr{PyQwDTrr|Cj z-KAVF(>}&%aRd4oHyvoTN2@(r?a^wFR(rJCqtza*7JJo;u<6lik5+qNK}J;`E%s=! zM~gjL?9pP67JIbVqs1OA_Gqz3i{rF7lNM*Vfk6EjuE!}XGl69$u*{;xS+qEd7JIbV zqqRQR5ZKDNB^)`_r7MvDbz=k%1$)O*yGQLYYL8KSjM_sUI-c+exYMAA({X3wUNR-r z=BRJqvNKIx0EyzU}s#lUR_ zZOy0ysSq-<>a=fL>*Kom(pez5mz>e^>PQ|Sk|f>j$fi%=&4tjANT_{t?i-UX8UClj zG7kJ6DK`(vxd_R*R7V~!VW%Fbh8p>-vPvX@tS#&$|M%qI1x?6^=rk2H@|}4ZUAb(Hd*Et zfhT3(3A7*N`g^VqLA?+2>@luSQNz>7pud`nz|Syf>MCgJF6e0j^wbD?Iu4o9(!58S zPblkC%9x2v{EWP_3D0Mhb{%DGpw4QZOFv3^=Fx&otyyY)+O(mRDlppEEFM)i`eIFOfK>`y<{ zuWwTHyFU$-PN`uUM=Lfm&PD$c+N^#UmR?Pb;=j@G24FW8Tlg|8*9=;|0O=_uHUdu> z;7DdGu$^h*q8#tFwW=x z)hNGM5brA_#8S_qF0n#0Yw8mi)&C@{ufTLixA!p3Sy?VLeM~Wy=q$>f$+-73@=6ax zdWrqtIw}>bhn~NpGiFPn?`0;RQpzc%F{R|2-aPF?Y4>2CiXIP3$&O0tNGURk$f8FT zwEk;KSfeF0r-Vk7kQbFuKndScf;~V9Eus=uX$jJkrj$@%dXuXUE9UnEbLweBr?fV- zq=e6C16q_``I<@r(pSSV(=57!wMI;+dCvs z7ptXm2gN4DT!QWYz+N`OT2D4eA`$zC4_iIVr$>4zv~d02<-th?sZs9%&NyhxGTd^`Z|McA!>kAX;A&!h1p+o)&7rE-uD#FlmLINg9hFY{s|Yo6)a{4gv736 z<$E^LPY>X*jF{>aA1LGmi=Q5dT4?F_AsoX}4&*DwZiH(;5AG)4BHSyiTE7we70SGm zxO;<{0kf0Ae+B;?+(PUUpsqwu<&`_;I`j^ud?F6FOWe6d3W^ z8sV_IbqnWX{YJI#^(>S}8-c(Em6`w6u7uh$!(OKI8W`A%tAgObye9MxwpQR);xDF0 z%(g|8xL4n5Yu+~mj5gKs4wUjy@Cdsb{vON--VGiO)3XEQujrYlxMQ0f{QYe35m)#@ z4y*_xeIboNS{!nn_Gk{MP4*zX2(LUEJVxkiWaoM)j~!^iQ^6BJbVu;7U=}vf4;*!Q zzqZZV1~6Cu0WEG&Cz5CjePwTtQlC)9?z*MaUjpf5Z-+`ZNuiXo28!GQMQ*Cq7m1Zmt(;zmK7in2p^xwgo&>5-g0;7USHaqo zk^WqWZ2FKrQF@T#G2EuG6<|kdTx?wMfzp}C^<}t~$PmHOQ^8;H-{#pFNDj;{r9kDWV^`WGk(A|k(7aZwqjy0o zv?G+%LPO~kR=2i;xq}wp(7wGCmH4Bu7rdwN{CMx0RQg8P3ax{^Q|$jfg=H-98eZNz zb$zf0E^8TAL9|Pqp6>brSwcg-R4?jOes~6Ir?>RRHpI`@l!rczSYmp`E zp^{BJ*+pC=FMk~TYEuUft1Q{cEXZQY6It>RwTUd*sWdqYx?CiZo@a}YDm#Idj8*m- z7M#1Ib}c9mc4H%c$@rn zTA)@EcVuxP>30CFl>S`6GnoZrZiM(W zZJJ)n!G?nuDe1%X)LQm3vDD>I*%9JRIBy|Tv`EJQbAhzjiZZ@uOhQOU8gegp+>5?a z3!ku-!1ZZdWNAdHq$kT$ZzjlmZ$u^Yi2nwv{8BB6_t3mTsq2xOq2yA_hx^nRVHp~F zVN|Bl5vl(KeAF(9;;V%k=|g1I>j-oM{ZPwbUt0?J?u>dx-^p1sK30m2uoITOuYXYX zhLp+(eBay$7b9)wlo23sJeUKB)KKcdr2l^*O{aq_GlN|eCo*R(bM^Z_TGT$m2J&zj zNIP~Bu~t(BbsU4gbDuuT`-+i{)DbIE=!cJRuAxSveE?0a1%K-~mF7cjgdB=!QcB!= zMoabEzYd}<^xNKt&>#GTw38=c$=pS}rEyzmQ(*cFo_@RgUj-bSlV>*4aMs@C z9_+o?>OVZ+vcJ-pW%vfS3T-qW%V-^Rj}-zv%6bIvGo|E4{rSl`pZSB8aPQZuH$;<1 zlBWI~>9Ndj%wc9~6|xI?f-f3F-qzVfiR{`$FEU4r=19X_ZGPrP7T}hkIX@9uNjc=K zeNM~)#um(Py_PP8BsG0l$+%L+hTE_dcPJe#MYe6%Q*6yT2lFY|>H9xaB5!Bj_A5%= z4s;hsdQDczWESl)$*Xg0DV-98a#Z8dZ9w7!W&>t%{R~K_!GYDFr^1?3loj5k{BV5) z+%8c)`-Q+V^$cnL_uz$^yLtkl)CC%A!hFC$b4#7+??Z|925QT2b5q5TqZ-VtRgJY# zwQwCtDtM|%E81ffw$Sp3ONH(hQS0(RG|fDnnOZ0sfjgO%+zyUYdSnYZRmatowl$Qu z!NOF`-dE{SDo!=mDkyh()LW?=ixx{&Mp_G0D=mtwR$2f*tVz)q;g$QTyPkC^ofZ5z zRqwxdg&$P6N^S{pKL<#KkdYOqxwL3e@HtOrX?Xh-BSRB|9wW-4pGtMtZA>O?u&1R@=Y3=GCa$^_0 z`xGwwRPY{-lew;ehyUFkxsLKii|M_&PcCCk(Q~|)Kn?Fvd(A2*l%q7C;w$Q_#n2}D zvNY06Vvor^Tp~SzhFr%7wEX$Kw^Mosadqs)z3?+1j;g^}q-DN_0&8ZxYF4Q}Mvm6T z)^M5Ds`MIZCD*aD*8foNN03B}OKIC;=zcNWwFa(|cZpobd`S-k4@0oS}E7tJ`^mnOhjfg*`*7PH?=XOdQ>Eyl8NLq(|N>96QID#Ex z269Jhbz!QY4rkS8wS_QA%}A%pR*I{E5!ghNP&QH@iNLyWO}a&3c5d*D%Dot}{3|G7 zp4ulb(}$G;Q*xpCq8!L}9rs7Kp?uacPk>}(ce&CrGeap!7ABOrqLeKQO=B%Z1*FPJ zw+reuT6uB3Y5+8?g?AK&|R zb~VVCFP72rr?A=M$+$57|1#X7?j>bX}(EI!-xZHuK{8* z24x0_^{i#I`5PqDr%-tfA5)`XlS8mrJKCfcnYE~3Ril}McPQsu#=K$Q7m)IK zW-4cZ6?ROvD^r*j^}dU_F5$bSw0?C8{!vX!YISKCL%PN2f0;w6PDvZ$7Nydq+a>ax zb!^g!-J&gDNDLZHZ4S{B@F%cwg!GFk$R>rJ!b|x}b20ltI)xASag9r}A%HnO1l}Rs zMKYuJDRqbF?ocmD9yy?}g&NS&DDovtw}LY2tPYVbq7NyRawOe$`Z=qXPPDu&Dao$w zdoR+0q6OH=)@G~DA7+^*rUN^1hMLjl3icR2ZQf^x=Rk1tEqnGD9k3@=M$7VE<61PJ zXJ^Y@P23vzi=Bl)aRa#)@YRChf^G1}Er9D~6-pJIGxA+zYU(Y}y z`S$Nx(*R(!nmp9bleyr}x9`Xu&sXu~iP`d;7RXAb#}nF09IYcxTim9z^sQI3UiYxi ztxRDt2RlGUA9BcSjZh@JY(jYd=ROwpyHH3tiy(HeSbPgP=X1{Dq{YDtLfhc#9Znzs z#%iSJ548ZA7OLirRZcl1zu@Bs4o#cxAu;RAB2X6i$TNkHz$%)HtS|kKjf21${R{yk8- z|MZ#4K?+fsfozuYuzlXrEAmpVKjskmy^nlbjJ~BTB;Ccxz3XhF$k0dzs-D_khA3XjO&vdwwBEei=W%|F{z}y; z{YZtij!36zID%81=c#p-=$d*avRB(ge&d>r7Jc8ftm`FMi+Ng>%q(-J(*KyN!d3Lg zzavM4?uFI_ULw=gRzJAf#a@y#J+<(xj-}*^eA6jndZ0lt_1^r&AiN$DT>)v6{T~)hjkqJ-Rf-pEYtPl4II_k=>9Q-iysLvDj+vmvY~ga%SM(Gb3XIVn@e@`M0Ic*cq{t zYr><$aBO01a%`%9TkJBNgs({pUmu1gPweI}XKXs*ds3wkesDkGN7CY-jy;~bi#;EP zW3S5hl=!OBWwBYYxs1OJH)=zAT^dfcKMgN}qxg`p^mJTk zi6=zyz&w6x7}of+(!yh-G{7@HDS~GjY&HD_Y3Zk>g|A2pUmLq=nP_xW6{1wTF_L)aI@Yr`H>g%8_(+ z;?rQ8QBhk;JPn>1?ZSA0TSn*FG#Ne9!hO@iRcSCu>sQ9$v@}E0!o$^05-T6y>HpGEB>L5_veC})W2W-M&ehm z)^L0E&sD##`W@Wsq`y)9^Te;-s{SgCX{&yf`sb?OP5oZ#x6~3UC0zZC?MSP#Z43OK z_P;2zTK!kWH>KiRBr)$wo-XaQ!z7paogGP7%eTMqE+yPq)0AtP0h*>re4DLL2YA0E zyk29vOG?{G!xyUGN79(xb^`I*Dtn3M8m=jaOI>cXmONb2yWeWA?Nn;d}=0Q^4-Gd{zd&OOG(1>qiD`I}_=O)7J(Ol0>}?f@MQ}~z#0rq-H>(!6 zSPDK`dta*{Wf9a`1u2a#7J@FT=O zo)&&OE&Tj`!moz$;>Tu0X~dQgJ3`_lydW*SG%dV(KjDpO@!QkFyKBR77lx${G$MX@ zVu93#i_*f4qUYEo@lIi0u}|XN)53ky!iT4Y2c?CFq=ipN3!j=6j?zet@w1|O#}d8( zHz__XF5xTE!s+q#g|8*;4N*A~zBMg;M_M>N&3#e)L)ZY%#O9(YUW`ll^|bIiY2o+N z!k?stzeo$uOA9ZI!pmvT+NdrGZ%(UsN0g@8e*m4OctPtwkda6W=ck3EG-&+?(9xP+ z!xd@acKZoO>E$UJILzBKqi;r)#thDo@X)mI@U-xVwD8EZ@c6XwxoP1kY2i!K!dFG% z>uAG`66Px5+tR{!rG+&`l;+_m{xR;K3~4Dt!q26JUrr0ZnHGLG3V%TQnNc|so|6`y zpB7#mhS9PA3oV6xt%EwY!+tCU`&-rI!@P^pC&QvJ-=eXlQTT9;|AqQz;D4@K?sL`H zMVcmE&)*itM82dyLBr|Rhw6X60Vx{$!tklq-Z=_O?VUaHn(v|*X~XH7<_wKFL!R0R z60XNa_*WP&>9H3yjYpY;rOXqf7%8)#gl$9ZQA4p}%&)XxO~p6w>C-dy>6zNv2g8`i zmo^;O0=iRE4%e0skHXTs#v1;46eBG;TWdL6Yk4S&m-3I&_#PTRP2+p0pJpZ5%fcA- zTc|%uaygl`vUZf@b&qQa4~I{+J)@$qw5OehZ;fK4J)=Cq_$Y;Qx=r+%rkNi3lJ|5C z57c%J)LO0&VCSHZtj!r`Ol3 zA~e_=%D0Ls+vyv3Dt|)A@f*lfzszsux6)7tzpLNN?@ziZ{s8}IjT`2l?4O~b z(f&k#a+G7Lf0>4^@vrx9*3fkS9{)lA5z2eqf7*Xu<6iY=`0r`xBY&1ZS3?W@rT%JZ zGhdzF?(dGdSY|9YRupTbPix|8pVk+ug<5@~gN0AN{P3X8eggL@Gd39B*t8+F;A=iqQ(!< z_)j$EF!3$(k>YC!y)8UAuY7CM}`ob5JtnH?Gv(&#rb6ug~54D`fHRc1&)lYLBrsee0 zm{A%YrQxRfbg<2B73jX6)t&k)}|r|B=!r&IK)&V!hnw1gswF*j@aH`KpD<8=&d zeyuTW#g9K9pGnFbb2!ehcf=6lwL_fD*qnen6?Ya+;>3-O?veU@`K8y7=dfU0(2ANz z#-U-yG9=63p>wnzQ|v2Ugvvu@AIXtFU&l%&@4A=&1TLWrrP=z&HaChRs6m(=MZ!d>nc#|D(ER1J*ZT_ME$nvSBcFLoGVsE&`qq0 zpcnevnHPPH-o>bKQAvvb(@t=%%=-{A1x~ z?h<#YyUbngu5eemYsllfXQAI0oP0~q+1(a9fIkw+w=W%bh{xNFhIb-c^ChT`yfx9B zKNy_^Ri0u-m?|@lFZT_CQl^_J=5D^sbrIhzoB`GFjb!tH`I_&gJ!=;54Ya?Rm7K3Z z2OGh;;P?%`infif8}8zK%R0+9CiPEVZ)*$QqXo|JZxq_`ksII!nosE0(PpL_;)a;d z>D^HCg&PKxW&@>D%{(^(SbYtw&M@^-_dj6Vtzr-feHU>nnCCt{xfz2cS+g<=V^O9ZBJa= zlcDX&)b=E`J%YP4OrEwUU)xil?P;LxDWpBu0A1vH3Io*5pTdAZwV=W|=P3l3eFG2t zlKL8Z zt;x67*;`DZz0KZcn%X<V-#-E8HyoIh2yv@K0;4b<8LwXU`+ zf8gt3djOMOK(NRjVUI8+cA)(UdVYvK&NQ;e+fz(4dzu|Q>5Vsm-lydmFHYYcxE@Xm5O)5vt-Y{HjOJM*Qs zuE_l6Xo^03bFeRGTXUE>l2n7tQKUG=oNT(8)6FPi$Dk_)@twm7X0SQOT)^`w@aysB zVsk0)Q(X?VGiosLyu>BMWXX_vGN)^Ioq_bdlC+$UNfPwkMuXF3&2Di~|a+}>2 z{-L*%XY!A|`K0#ilq!GROX#2Vpkw3h`;6FpC`i6(iYx=)!tZ>o)5%v&g_k{eX9}fG zbyLy4)A+Kfg;IV-noHaz^x;yzbDDvayNvMVeD5>^X?F!rh4-EEzVLMml{I;GkL8b8 zw%S%huYu*u*z%ATB9_R{ffV)}-~NOfecFWCPl@LQaw&rVFbF{5i+nS?owc6Hvccr_MugPBRuEu}XJAU=w!-5StfT%cajn&fm{w^>Oob86j#PZ1?y~sFu177~uhiuWF zIPHnkyq>n+*Vc#7b=ookP7~-dk9_%h7N`^}g)$v<+KTwroCQ#12g;YX>tm)1X9K8J zz6p3Jbed!O8UB+8UGnu>GZ0FRVdI=k>rUbHpv6<+fzvpP&@>~6=gXMv13w!oPM~)t z!XM{Azd8KFZz`N3RGj3Cd6&_a%gxoa?;0pNj~0!gG>=yKJnyXS?n2v2cp~j{+8RsU zrx2E!oYvuK9lqAVR}48zwT`&f(N*in&^mgcAASQD-p1MA{Fa@*dFaBsY4JUrjm^F0 zKEn57L*VZBkRFG{b4VH=L>S^Az6+@cjz({wg@m1jlbe4R3M!SQs-1zr&fOSWkfU+0ghL&KQ_ymPfIk zr&!NXtS1%gMT+%eu)YH77CWm1{I4P`6p*JBP^uJ=uM|+G6i}cP&;SbH@0ykq>w=R% z4Q5*22(npNJN#FbZ(#`cbW!eUsC?5+`KFulO;_ccZpt^^ly7<|-&p0FV&$8J@{Loz zX{3DPDc_VR-!xZfwpM7iS7^3SXm(blE@ zP9a#SeA8a}rc(K)wL-9kLa#k5MQmADr)S4*NvJ`5~ly4ZJ zz&ClyH~Go|*~$Sq$^ku;1Im>Hn!01$G0?SWv8Kug4U`Y!$_M4j2aS~vlFA2V$_E8X z^=*{iTPnS`QhINx^xjJ8y{XcBsnR=NAxGbpD!s>)-kT~#_f#q_RQr~7bU5`eq)#>y zLXJ46{PQ<_!=ebBXAzchv>Y-D&BYbS4M!3uy8s)=P1+&fQ4viN(-XZfx}TEe-$ml$ z(4>qcMAOKdU-I2+(I7F^9}SeQN|3OvDOsd)30k8MVbK&>Xo_P9i-aygE1X7HT0Ug z)l8|YsZv)%rLLw*SEWiVEfDOTHT`eDvU@vfuX*nUBygCrV z_#t0nKXqnlT3=xlQ=W-y-@^JcwLj8|LPn1=atZB{4Em5ksnQoYJzRK%lp{6?R+T!T zNwH9*{bHR+`c%l7-nOZ2O8MosoN-M{+Y(ni#R(J$tjgne?|XR`Tp`EOOue7JEK! z@340uAMdnx5`VY78_P+wUs8F$Ou0T^xjskvJxBSyneuy6<@bE$_gv-ohRW}al;0bx z-s2x+=)EGEmS9FO(A!68wcuzP}*g{7}h^c0GoLNToW%$y9F0QXFL} zj(p{YEaiqQ#h0htkfm75RIJ6653&?@!t;MeVvBwdsguK*i%S3>nZNJ}%j#B~n0zFD z268-``$C1i&{2w(C?G1Kh!Se^3+x2`8JbVNYbCl$=JV{?L91Uw>pjVx<4E{g^bL*iWFsPwl77jm)&4k>+#Oc(d#m z_6t(ZwzHWZm}BP<^QHZgn7MW?a|K`7uaG(O>^yRPZNKK}e9IrH?Kk!t!V8%9$Y#R@pQdiPfIq~4dmTuH<5BPGbcVX zCtLBi*=^LgomrH8W>I$Fe{a7hjm)L^bu17Wo8~J2B$R&=Dt}5;{)GG!Q*N;;PvR;` z;>s-v<(6XQ7EigQSh>YhZb`U3ZVym*CQs|*zawrS<7F8Ir#Mwc>2c-JEUm+-1!I*X z!*OKDk$#%h!aqqI5;@{XXSy((^bRl+eENz{Pw{CLpGo_^eVnU!n;x=hlS!{2`uu}|YD~98WVfGh-;Vi{)LNT0F3}-8bvlYWJ#c)C~oKOrW6~oyI z`y{YWC|sPv#VTApg@vy@_q1hBTV}Oop0>u<7KmgI;c7L%)6`Z|yE=H3If@YLBELjd zCCn_po$&?@9(uAVnlxeTRMU0xm}wXAhO0_Uc8>}_$`1Snyc^n#xu`?*tMo+bGYhXK z;rE8jShd3r>?s!Ez#~sCH=U0=erUNldie3jmCK5TrWW0j%LulSk+17@F|39W&tGS# zB@YX=v1!4mzJtzyg->J#EuS)*@K=P^SdiWHOO28zhQuhqzHG`YS{u`ena4in&@p2s zPqQP`AFci*^{1$Rnflj`8*}jld!zcdsehOH52*jJ`j3qpcm5Rnr25aP|FZgTs{gL~ zAB>;;({t=h_2;NRU;V}EuT+2i#HnM(*{$Nc2I_ZJf0+7{)xViy#<<7Te_H+L)qhp} z8S1|``NDCN-AC%rQh)A+Q^#N67O1~m{q^c^SHD_(FMjdQ#$N2@s$ZmjBlXMGZ=-&v zi+?udVz0aUebhf({XyyvQU3&xE%u|(%fVhP6d^ed?1!Zt*q5~m3kB@oPpa0C@lOu4 zC}R-OMGc_JB69uT`IK35?a_h#(4r8VS?2Ww`lb4Y_Q76-J0 zl`5>xhVix;l7(K8`sgTTcywj$O>(dYTvC)WLw|#P938RJ#a$~`<<3H|u z67~YQsrd0v)p+MW;lCcmyc@ROpBdiAwukreoaid6vxC590t#hS3hm?=V+d|e@D&9E;O(%heF7I)WrQOYEJ37 zXJY)>K0I$F^{r{CFX7qH=)6SJ`s{a-b2KSOr=>(6`xSZ))pVYp%h`uivZEkXdmHw1 z?e=#2Z8XMtt9|GTSDOM_@aFlxKDXXhxL|ATQ*Sx<%cEyc6K00e<4R29uz%hI#C%XE z=0-|<(|fs29Dk+rp5O%gX?aJotkO*u>aB7M_eO({gk&ac^wRc~+fg`6h$i zXtifm`ct>rWP0uDoE3GR&oWtF=3b|aaB6z$_*alyzR$U^CXIEo7-tGLB^Rra++Bg2 zgL@{5v+jLDnL0))QX8fnv$7uZEKf2oE7v!et99lNNJReX$o#DQqtUwikl007TkWuF z`m?qt(okmCWGzNQT?iejAz9%F<8CE%zsAYm^j^}?oK#$`El=sga3kupyT8V!dScxm za%V~j>_PC%hi)iRsTZ^6Bbm<_&1?pH7MQ`1{RdYv193Go50AS)yC>XV+>`Dp_q6*f za(Slv%*}G2yD!{qWb~JAuKUW(b6?Av{jj-nU-ytg$W7S{c`qY&FpOr29w{n19 z8|=|uthfy3uW+ZDk*d3xDMAY7JFtK(EO1}}iP(UhIv#Sd&}DIL=ZYLQDKfIyWpnM| zN?Z=tj;_=txps18E|=>euA$2VMkl+8ZajMue0PdF$4y{$!`gd*d?ejjyLAdt-@L6M z$BKQDHWW~AA$1i~eko-(1OgM?Iq1VnuwN850vR+OJCak zA5jx~JXpUpy03&iHk?oqI2AlvM$)7-qs=0X6Afz}yG?0JzQaD#Iz>}>)Wk@iR`h}P zrG{)tE0oRo2b|1Vc4pT0I_Bz?D(I=!%rlu;x=yb{m`9ZyqTyuk1bdBj)EH;fIE{In z>F#d&|2y{}E1xnyTFh$kC#-+&a=WnptX;jBqbz zd^_FU?(T4Ry1U%nQW|Bw?cQ;JckjA?xcA&Y-TUk&_`rSWK4QiC6Uvr09tLFSX#_7> z(M>4Sq^H1K>!nuK%=WNW76@orA=5n@n$CBfnK2Yt->f`zY{QDHE+RdTfsfBK zzvQowzcM%QU&x!y9qdSYm_I^3#Fv!1~FzZYgw_Ylgdr+ym}@cb~h>{n0(@9&!H-wEs(Gl3{i5bM^oY zaldzeaKDDi9)^aex})87;30`ce2SUFZme^$M#CLgcOv@(a}_*vgU~1|Z&~hjH;7q~ zpSeH5Kh2??a>lY%7P@6_wOi~~xK(bE@iW-7 z4ZNe$w1ziPInyr{fUd9(70 z@;2pN%lnoODxXq*dHFTvHa;^Y=1D_ljqBCn!B zMR7%=ie?oZD~_%hT`{5c2e5OmUHx|*zU#lJ;L$&SG%C9cJw){8swEd(OXGU!=sMGfGwB7FNu&WPk zui7>O*&Hj3$R#o@P+aRYHkiPu&3Ydzwhb2i?5u8$Kug)U0kvF(#3rj zZC&&x=eLU+QO3- zGMh4Athe;T>dlMh3p)jy$N=F^62p%EuI%U^;0@Nh!R+O~z`MkI$a~y-#@pfT#D;W! z6Tgk$&hPB^@%#IS`@{Va?6<$lzs|p2%f$0<1v3x$@F+X&A5O&{+|?I*x90FCQ^sWf z0-rbDIj8$V@&Bvkmb(tAAyVghK~jF|?lhkxE!T*=G<(ckWLUz; z`1pEkfSXJMc7qo42i_8M7qcq2Gplni{=EW`_$v-lbNlCR{izgL-`TW5Y@ zeRHk#*g25Lo{*E+!913II1|k(r1GLjCa*$1uTUG~J+&>~$KrS!JL4bjpSH*rGwYGh zY(@`Rsj+=n!Rc-fW!HTp+r}Qk{>7xtW&dIWR)tDzDXT&aZDUr2SP`=2wuP;*Ep02- zf!f-3tOK>T9hpbzV!PVT>;h#6sGVRZvg$L*p2w=sg?0+7K2z;9R()9iWW9%#PgZ)a zW}W9+`wP~2uCv$MU)dX3>-jbNLfI2)&$kz_s`FFUdTy0kpV(dbxIMw1$d1V2_AmC&_9XkHJ=s2GXV|yxDfVf5s{Jc_ zFQ2g^?6dZC``3gpSNe(7wp;gMc#jZ$&Ruw+tKzFG~KIqtbNUnv#+B!-mu5m zNA}s9xYNGle(tVi$JkCY4GZZK-XORdgD<6fw zu}hgVU(U?>O6K}kGsnM{nf3L|>9bEG>$+Y+2E!ZQB+Z z1bVmd%5&U~%(AMo%pES7*(H&5eX3vRomtTJ_qM@JIhon+*Ci!;F3--)$&OE-Ua-}k zLj`ChZG(3yvO!1mjJD25i@&%g{!7Ly^`)Qf+NQ;yP?LV9Yn2vXTmCG&BrX2%n)LHr zSqPJ$mBOSGoPB6juP&DNwk=o~f+S%g3SROvY|M|1W9(4_A7eTnf`sVMv$9u3StfAu z+f?@K)jI{8ioKy0FD@zph$Y3v0z})wa}9=c?GSVALWpIiL$Yak+jix-iDWX-pn58x zoImWy?nh?&8Iz_Lq(il1MMe8$q9l=IRq31>xQd1k;X2nYP3!j=HSu3Ld0$1>)4i$C zLN}yyzp6exnF@s#7-wWUZvqlL?q|jsuUU*_Aq?hnVxs^=tY2(sLCeC*7Oh*fJ~S(< zsZdDIUX{IiK_xAs4z?(+Cj?9?TgH`idK9!Q$nla_ewrw>UuNed6TDv4H<8TAu71ys zkd9Z6O(eGrvzZ0m-})q;!<>g}wbouzoXl>O$oV#zU6DwxkT5B4z9j}}O`-n`V!WwJ zSF%&cgRZ`nD|WtN4n^8hxWmZ*`{U7;=)v5d`?cn z7Mwe|XUmR#dyM}{^$P2b95isitM67Fb4=B{$%Ok&c5>qIKF1amk2ti?S-tF?{ea}W z>eqkLtM{PowB4Hi!FKmk_a6GFS5*&2z&?z64Kq^C_hbVx`ofq2$I^q?s5qz@7#m6i zgxRxAtIBp6kY!1mwxFkXuU^nzNs58nv}sw90Y#RU^yuD8o(W;*x|Sc`0^!GQ`PJ!H z9pNRjx+ikHg42gSondXp)5o4s;N>K`XC=KOt~xz&`!$UZJG{v?w;wUFZ&r39=eWb) zY22qz)3*;Fnv=-R>O1iWr8{lA;zM?A2|iA*H-3(56ZN%~_Vpz5!LiRYI$=arVH2Af zKenN>Ss9GXnW#7Zkj8amT^M_Mn4ywyS7gNejB89rJeCo^ieWqCnwYNv=~azr{z+!|u%Sba8Fb`f{VIEO z>D0D$i&hFE}{tl_X0mI(9u|e$(8Tm+R+b78m3fX2l!$u~>eWyj!On7_*%-yR>f8 zyKvagn0jqT@WH~gb$~{hlN;PovPZ`vR#bX3VXI6vRyIip}biU5`=^W zmGN43qx+=*AOk{e*}Ho$2)D9lTS&QOf$-Vldv5^Q?$9eHtXMqwq}H-S_{>RnhdlP{ z8=H3P)@;b%dXK_j719(_*n=A z@9a$LdHuYh&6^q1txJb?ZCf|%-n={68uw`3G69}NB%m8BVc;G;L^$lz+Dd6^vEWcu zK=JuG{X~BCt7&?lt0pWDn|{Wmdv1_tHzX6bWirtW5#KC3DZS|4bmV2)i@V34y;Ps9 zP?#%hmDl90Igh!^_IvfO@}T?Iv-=?(JG5(7*}U>c^)H2u19kDxD^p!`ZtqTJ=cGEh z7piLdi9D2kwg+D=O_!=pqN{w-RdsX}@>_Kj{cmYnh?c4pL6|191^)GFD3#a0%T6Y< ztN&t;(Cgdw?CfN2qWbKRlJ-$R(7U!tVc%F`|GDd1gOm22*fU}Lm+ZI@{@6SH9OiTD zi=SO5UhJH(oSD4)QJY@)ER6rmK9&|Q_D>i;i``JQ>BasDT7)30n+b!5{kep_{V8<&}#ncb!8tkF&T_iHxhth3MVn2YSmO=gce@ydZT z4cgT{DNT#c_E;fdF1{vSXfBMO?RrGu={>(j6Ap@PaDh3E(Iaxs)mB>MMiowTzCgQ`CSjV)?IJu)g=6uZaakV9&l zp2&gVl8M$i(xa$jhum8Is5>f|D5ZPFwLPInYlzIwL6Rl2&kp@prcF!9go{*mbyR%L zcKUw2$SCs?{mwHDtFVFrKgw0cg@p4=veK)gmP2?8gLD^TzB_QeO|1DnQ&Vsp0WXwm zd9BT`W1lI*x-0S&ts-DX#gRE$eB-LJFdF)`{f_0KkIeD?f&S3btBUg3{F>i7zg6=l zrN!EejCz_;5-MT%BAps)8}}GsJN~3(q8l3Z%Jh~dl8Ls7-0`Q`hk#vn^;uW{hR%la z+8&}X>P!T7EN`kxJUeb}OnD)U|C0S6#LE}$v+Wp-X9m_b@kEY?>1VS3BIOLH z)Hglhg)sgz;3DO$;qppaIkPO|Hu+LD<>d3mb}IcmDX5=R7uvc-l;Vln7{W zPWp1wys~A>o+6+b%cx-$iM;|*H^L<{)`X|xEnoeupOe+2#EXv@F!ZGA-zf_`m7P3n z+VP3=CS@f{k34+*DR!btX+iJ_mkkj3YkL&Vhf<%%$}c7;@Dx2gn0E3GVO2$WakfW0 zhX7VU$pFl`eoorg+O+J~nwgT&1Pl$o;$j<)sfrjosm(6aCbmWvb%AB`@=LpC=ESPs zx5veDGJEFcXH_pqQzzeBo1c@J8LOUE{X#r56TxE}SFcSZY43=jt+uNInI!G~+CEv+ zUeS3)rg;@|E5x`P>0w=mO)WAFT2}g5B`Hl8%FIw_v}~aqlE|^cRJENOaz-+-=dTJc zsTX)OQ8*o@^?q(|SNhd>^jrmNYsO~Kp4o1P$$Hk>m)(wMdUO;ROPi%_nnv6Fr?k9L zJb9OyCDrVBmb}%UOJ4AhL%prY+ev0;DoS%bnXZDgqcIxmqK3h+nkb&(F#pIlxnSNGwR`PI&K9O^KW-Kd_mHeGOUI?oC zr^r)R`dQi)wk0#ZXSdy{YIa&8HeI5IP*5j@bA3(>N_Ag|2Nm2Fj}soPdH(W8igk&Zo0Wy@7_&sy!F-_ z`!;IW|K^)c8Z*9sQAywNW5TzdDenN=$l84`*RnVkUsg^__?>dPEOWeh9*qVhJGeo!L zw9m~q*{_G6IClII?e~lsU*4nQ*3(Y`cG_pfjo1T%n{*h7eG$UwE7wA4j#)ZyEd0`% z8DJUtMWZB{{*2~Bvoai$zRZ2-fVvH)dYf)-y0&jCN>2vXy%RdHX3|?G5$l=qt(B?0 zF>w*HrOjNA?N{~@n!Dj%yI7<_^-SAHugh&8RXqh~o;c|&nagQ&(%`eSMni+=Hoi=M}>-Er@+Ls5q^ZF~NtNt1UoFEjp^RfDR( zuhWJy)57$u;tfEimu+l92J*)-PceZ+jA9@!=8+mPY$|WoutlR5EX91VBC*7Ufwxl^lwi47mWYHZ^l` zwF1ZG=V!F9Jm$JOa_1)ly`0P*mygDL@@i$zk;%lN4fm2i14qVVnK?J_D}+K^3*9z@ z3>jG`VJVr-4;Qf}$TUT`U=jBqB8DvG&5dbQ(Y$qeYZ>hq_T3xSDF4D5Bh726x>e8* zC5TP5b?PsM4tjugcgicsxbr!NU>onf_wkSl&YL)NY+>~_X=-lLnrfkl^MC$xEZ<1h zk5zs=9n=dyhV$Y=tLgD`*r%uI(QDGL3ic&Q`mgOr4E!!m~BospL=rO*&)kxayor!K+OLVI8|`F z?D8XAPFA-D8CjYPe`Q6d7G)*fkLlCvly1FG>X4O_NObH2OgmMSlyyC-&qzd*^jZ6+FcO>z zjF@PsCw`7&=%=t~rLZ{Ld=yUkmzG=KW1YZ1C4HSB#yY`1PjsyyHl${)AfDl6#Jy{n z8_Mwfde#auGGe2kCV=Yu>1zdh( zj=0n@V?)!Ts+r6OMU#>YZ$+GvrlBcqUD+}<4vQ@P8l4n!b#?M>k&||zn9DQ52_THs zwxWL8CX#!eRlB$ub;%d^50N=$#?j1qvM4aYM}b5`)J&U^(Jw=4J;ZdB>BAPSTV`c7 z?pR)DCTE{E)Xt2njImyFs#uXz!$y58t$1sS_*1lLwofuqmYtkg+rXL0>@wzd-Vg0& zg^BWxjPIHAmolU>JpU zW>oCxA-NOIuM5LTV=7we%t}sn1DWVN>4tE%$H-+i^edR4tv?_2G?RIk<5YdT%s>AgF9NJtf&cw#XyC64Iw@pCm&ZAIo!I_VLkayN{|Zp?+W^Hk-fR} zL4N_+`KkHA`Xq(dVS#ps40qY2(Qud3UURX- zaF^-j0sApkceeX1yUw?l2g{rXcUek^=BsTLp>pTZcRI?$lJtU;uZi7dWvM$<4R8y) z4dj=LW2r04iKjdUmgS2LSq6@9p6lN?Y;So#$*jEpd+N@4?|(`SGmmIZQF1zgxr(SUKB*yHpr=CcCjsDIT&eWgsF%MXoup=Kv zJUp1JEA?2iVqqDnsZuIJJrrMp9!#VOGh-N-4K@}O*{|(JBpn4!3Uc{NLlboqo8{o#%n{^n!dp%L9)x%@2@2GFb??e*e&ITt(XgQ$V4MUGS0Z1QWDbm7B=VTJN+y%GTP>Of2Zr{K0 zwo6-jJXV)8>hd&g7`kAq2cZ?cWX0eIkvdSX+d!eb@Zbkrd_CZL?R4?8T?|x zr;JWhPRVr1`Vr^tAMGE(*3;7uPB*$Tc(VktGl1QPViNPS-7$OnQ8U~ZH;gn^TEOY{ z`KF=3>aVG)v=g7To8?secrqF7M+mmoADe$tyiVb%uL%IQK*+SpdFSTkG>?9bEjh#M ze@S0|d6al(q1e1-8nV0yyj!8{PVT6L|KmWJ!=$ikeZpq9(jJZKA?*s_)ofO~?FtX! zgzTDihYOpvx|!6|=(N|Z+H8)^x>I#HmN;g{#s(0p9$PWCd|-57WH^cEgR#MI5Zui} zHXFXuLJTb>cZne!ejfrm8T=F_AmAbcpCeH|4xc^4=ey5pIdCqdyw{NO*oL8zwZ#Jm zuh@==@)y))U7=*L)2%nS^!S$Hkxi8YH>>%h!`;i&`!XwF$y$%EGP44jLd!q8yHNAE zRxGWmcH7;q;(?Z~ww)qw9bda*srAvKF?DvWeI4W3Ue z6mV^8ZA&DCpQ{cfI%PV{qJq9XUM8>_fz(x?HNCM7ItnS%pDl`w_xsazApXfmCA~lDIZNji{VF8KJ#>FyEC1n zwDT$dcXXM3OB1`S;Rt@FHp(Xnl8JecQ3Vt6;fan9Ku~O$pYjHfsgoD03D!?>BOB ztF*W|V4AhKjn5Hin!C8GtKmMzs+*!={8lA2ATMqsGTc!LZOYauJHA-#iCI|+M{)cU zdniM(clYi-Ufdq7Nz;4xuOGw0P$x$wXoYLn@2;uYb;HyzX?>sEP5(B{EZdlLS5~

6n*xK`kB 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�BVv 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 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/shrine/ios/Flutter/Debug.xcconfig b/shrine/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000000..592ceee85b8 --- /dev/null +++ b/shrine/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/shrine/ios/Flutter/Release.xcconfig b/shrine/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000000..592ceee85b8 --- /dev/null +++ b/shrine/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/shrine/ios/Runner.xcodeproj/project.pbxproj b/shrine/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..62a37cf8ca4 --- /dev/null +++ b/shrine/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,438 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 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 = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + 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 = ""; }; + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; 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 = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 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 = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + 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 = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + 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 */, + 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 2D5378261FAA1A9400D5DBA9 /* flutter_assets 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\" 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 = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m 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 */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutter.shrine; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutter.shrine; + PRODUCT_NAME = "$(TARGET_NAME)"; + 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 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..1d526a16ed0 --- /dev/null +++ b/shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000000..1263ac84b10 --- /dev/null +++ b/shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrine/ios/Runner.xcworkspace/contents.xcworkspacedata b/shrine/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..1d526a16ed0 --- /dev/null +++ b/shrine/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/shrine/ios/Runner/AppDelegate.h b/shrine/ios/Runner/AppDelegate.h new file mode 100644 index 00000000000..36e21bbf9cf --- /dev/null +++ b/shrine/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/shrine/ios/Runner/AppDelegate.m b/shrine/ios/Runner/AppDelegate.m new file mode 100644 index 00000000000..59a72e90be1 --- /dev/null +++ b/shrine/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..d36b1fab2d9 --- /dev/null +++ b/shrine/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/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000000..89c2725b70f --- /dev/null +++ b/shrine/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/shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard b/shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000000..f2e259c7c93 --- /dev/null +++ b/shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrine/ios/Runner/Base.lproj/Main.storyboard b/shrine/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000000..f3c28516fb3 --- /dev/null +++ b/shrine/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrine/ios/Runner/Info.plist b/shrine/ios/Runner/Info.plist new file mode 100644 index 00000000000..bff936f4466 --- /dev/null +++ b/shrine/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + shrine + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/shrine/ios/Runner/main.m b/shrine/ios/Runner/main.m new file mode 100644 index 00000000000..dff6597e451 --- /dev/null +++ b/shrine/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/shrine/lib/app.dart b/shrine/lib/app.dart new file mode 100644 index 00000000000..68264f17626 --- /dev/null +++ b/shrine/lib/app.dart @@ -0,0 +1,124 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import 'backdrop.dart'; +import 'colors.dart'; +import 'home.dart'; +import 'login.dart'; +import 'category_menu_page.dart'; +import 'model/product.dart'; +import 'supplemental/cut_corners_border.dart'; + +class ShrineApp extends StatefulWidget { + @override + _ShrineAppState createState() => _ShrineAppState(); +} + +class _ShrineAppState extends State { + Category _currentCategory = Category.all; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Shrine', + home: Backdrop( + currentCategory: _currentCategory, + frontLayer: HomePage(category: _currentCategory), + backLayer: CategoryMenuPage( + currentCategory: _currentCategory, + onCategoryTap: _onCategoryTap, + ), + frontTitle: Text('SHRINE'), + backTitle: Text('MENU'), + ), + initialRoute: '/login', + onGenerateRoute: _getRoute, + theme: _kShrineTheme, + ); + } + + /// Function to call when a [Category] is tapped. + void _onCategoryTap(Category category) { + setState(() { + _currentCategory = category; + }); + } +} + +Route _getRoute(RouteSettings settings) { + if (settings.name == '/login') { + return MaterialPageRoute( + settings: settings, + builder: (BuildContext context) => LoginPage(), + fullscreenDialog: true, + ); + } + + return null; +} + +final ThemeData _kShrineTheme = _buildShrineTheme(); + +IconThemeData _customIconTheme(IconThemeData original) { + return original.copyWith(color: kShrineBrown900); +} + +ThemeData _buildShrineTheme() { + final ThemeData base = ThemeData.light(); + return base.copyWith( + accentColor: kShrineBrown900, + primaryColor: kShrinePink100, + buttonColor: kShrinePink100, + scaffoldBackgroundColor: kShrineBackgroundWhite, + cardColor: kShrineBackgroundWhite, + textSelectionColor: kShrinePink100, + errorColor: kShrineErrorRed, + buttonTheme: ButtonThemeData( + textTheme: ButtonTextTheme.accent, + ), + primaryIconTheme: base.iconTheme.copyWith(color: kShrineBrown900), + inputDecorationTheme: InputDecorationTheme( + border: CutCornersBorder(), + ), + textTheme: _buildShrineTextTheme(base.textTheme), + primaryTextTheme: _buildShrineTextTheme(base.primaryTextTheme), + accentTextTheme: _buildShrineTextTheme(base.accentTextTheme), + iconTheme: _customIconTheme(base.iconTheme), + ); +} + +TextTheme _buildShrineTextTheme(TextTheme base) { + return base + .copyWith( + headline: base.headline.copyWith( + fontWeight: FontWeight.w500, + ), + title: base.title.copyWith(fontSize: 18.0), + caption: base.caption.copyWith( + fontWeight: FontWeight.w400, + fontSize: 14.0, + ), + body2: base.body2.copyWith( + fontWeight: FontWeight.w500, + fontSize: 16.0, + ), + ) + .apply( + fontFamily: 'Rubik', + displayColor: kShrineBrown900, + bodyColor: kShrineBrown900, + ); +} diff --git a/shrine/lib/backdrop.dart b/shrine/lib/backdrop.dart new file mode 100644 index 00000000000..c96227aad39 --- /dev/null +++ b/shrine/lib/backdrop.dart @@ -0,0 +1,291 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:meta/meta.dart'; + +import 'model/product.dart'; +import 'login.dart'; +import 'shopping_cart.dart'; + +const double _kFlingVelocity = 2.0; + +class _FrontLayer extends StatelessWidget { + const _FrontLayer({ + Key key, + this.onTap, + this.child, + }) : super(key: key); + + final VoidCallback onTap; + final Widget child; + + @override + Widget build(BuildContext context) { + return Material( + elevation: 16.0, + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(46.0)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: onTap, + child: Container( + height: 40.0, + alignment: AlignmentDirectional.centerStart, + ), + ), + Expanded( + child: child, + ), + ], + ), + ); + } +} + +class _BackdropTitle extends AnimatedWidget { + final Function onPress; + final Widget frontTitle; + final Widget backTitle; + + const _BackdropTitle({ + Key key, + Listenable listenable, + this.onPress, + @required this.frontTitle, + @required this.backTitle, + }) : assert(frontTitle != null), + assert(backTitle != null), + super(key: key, listenable: listenable); + + @override + Widget build(BuildContext context) { + final Animation animation = this.listenable; + + return DefaultTextStyle( + style: Theme.of(context).primaryTextTheme.title, + softWrap: false, + overflow: TextOverflow.ellipsis, + child: Row(children: [ + // branded icon + SizedBox( + width: 72.0, + child: IconButton( + padding: EdgeInsets.only(right: 8.0), + onPressed: this.onPress, + icon: Stack(children: [ + Opacity( + opacity: animation.value, + child: ImageIcon(AssetImage('assets/slanted_menu.png')), + ), + FractionalTranslation( + translation: Tween( + begin: Offset.zero, + end: Offset(1.0, 0.0), + ).evaluate(animation), + child: ImageIcon(AssetImage('assets/diamond.png')), + ) + ]), + ), + ), + // Here, we do a custom cross fade between backTitle and frontTitle. + // This makes a smooth animation between the two texts. + Stack( + children: [ + Opacity( + opacity: CurvedAnimation( + parent: ReverseAnimation(animation), + curve: Interval(0.5, 1.0), + ).value, + child: FractionalTranslation( + translation: Tween( + begin: Offset.zero, + end: Offset(0.5, 0.0), + ).evaluate(animation), + child: backTitle, + ), + ), + Opacity( + opacity: CurvedAnimation( + parent: animation, + curve: Interval(0.5, 1.0), + ).value, + child: FractionalTranslation( + translation: Tween( + begin: Offset(-0.25, 0.0), + end: Offset.zero, + ).evaluate(animation), + child: frontTitle, + ), + ), + ], + ) + ]), + ); + } +} + +/// Builds a Backdrop. +/// +/// A Backdrop widget has two layers, front and back. The front layer is shown +/// by default, and slides down to show the back layer, from which a user +/// can make a selection. The user can also configure the titles for when the +/// front or back layer is showing. +class Backdrop extends StatefulWidget { + final Category currentCategory; + final Widget frontLayer; + final Widget backLayer; + final Widget frontTitle; + final Widget backTitle; + + const Backdrop({ + @required this.currentCategory, + @required this.frontLayer, + @required this.backLayer, + @required this.frontTitle, + @required this.backTitle, + }) : assert(currentCategory != null), + assert(frontLayer != null), + assert(backLayer != null), + assert(frontTitle != null), + assert(backTitle != null); + + @override + _BackdropState createState() => _BackdropState(); +} + +class _BackdropState extends State + with SingleTickerProviderStateMixin { + final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop'); + AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: Duration(milliseconds: 300), + value: 1.0, + vsync: this, + ); + } + + @override + void didUpdateWidget(Backdrop old) { + super.didUpdateWidget(old); + + if (widget.currentCategory != old.currentCategory) { + _toggleBackdropLayerVisibility(); + } else if (!_frontLayerVisible) { + _controller.fling(velocity: _kFlingVelocity); + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + bool get _frontLayerVisible { + final AnimationStatus status = _controller.status; + return status == AnimationStatus.completed || + status == AnimationStatus.forward; + } + + void _toggleBackdropLayerVisibility() { + _controller.fling( + velocity: _frontLayerVisible ? -_kFlingVelocity : _kFlingVelocity); + } + + Widget _buildStack(BuildContext context, BoxConstraints constraints) { + const double layerTitleHeight = 48.0; + final Size layerSize = constraints.biggest; + final double layerTop = layerSize.height - layerTitleHeight; + + Animation layerAnimation = RelativeRectTween( + begin: RelativeRect.fromLTRB( + 0.0, layerTop, 0.0, layerTop - layerSize.height), + end: RelativeRect.fromLTRB(0.0, 0.0, 0.0, 0.0), + ).animate(_controller.view); + + return Stack( + key: _backdropKey, + children: [ + widget.backLayer, + PositionedTransition( + rect: layerAnimation, + child: _FrontLayer( + onTap: _toggleBackdropLayerVisibility, + child: widget.frontLayer, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + var appBar = AppBar( + brightness: Brightness.light, + elevation: 0.0, + titleSpacing: 0.0, + title: _BackdropTitle( + listenable: _controller.view, + onPress: _toggleBackdropLayerVisibility, + frontTitle: widget.frontTitle, + backTitle: widget.backTitle, + ), + actions: [ + IconButton( + icon: const Icon(Icons.shopping_cart), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => ShoppingCartPage()), + ); + }, + ), + IconButton( + icon: const Icon(Icons.search), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (BuildContext context) => LoginPage()), + ); + }, + ), + IconButton( + icon: const Icon(Icons.tune), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (BuildContext context) => LoginPage()), + ); + }, + ), + ], + ); + return Scaffold( + appBar: appBar, + body: LayoutBuilder( + builder: _buildStack, + ), + ); + } +} diff --git a/shrine/lib/category_menu_page.dart b/shrine/lib/category_menu_page.dart new file mode 100644 index 00000000000..aaed26a6fc8 --- /dev/null +++ b/shrine/lib/category_menu_page.dart @@ -0,0 +1,81 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:meta/meta.dart'; + +import 'colors.dart'; +import 'model/product.dart'; + +class CategoryMenuPage extends StatelessWidget { + final Category currentCategory; + final ValueChanged onCategoryTap; + final List _categories = Category.values; + + const CategoryMenuPage({ + Key key, + @required this.currentCategory, + @required this.onCategoryTap, + }) : assert(currentCategory != null), + assert(onCategoryTap != null); + + Widget _buildCategory(Category category, BuildContext context) { + final categoryString = + category.toString().replaceAll('Category.', '').toUpperCase(); + final ThemeData theme = Theme.of(context); + return GestureDetector( + onTap: () => onCategoryTap(category), + child: category == currentCategory + ? Column( + children: [ + SizedBox(height: 16.0), + Text( + categoryString, + style: theme.textTheme.body2, + textAlign: TextAlign.center, + ), + SizedBox(height: 14.0), + Container( + width: 70.0, + height: 2.0, + color: Color(0xFFEAA4A4), + ), + ], + ) + : Padding( + padding: EdgeInsets.symmetric(vertical: 16.0), + child: Text( + categoryString, + style: theme.textTheme.body2 + .copyWith(color: kShrineBrown900.withAlpha(153)), + textAlign: TextAlign.center, + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + padding: EdgeInsets.only(top: 40.0), + color: kShrinePink100, + child: ListView( + children: _categories + .map((Category c) => _buildCategory(c, context)) + .toList()), + ), + ); + } +} diff --git a/shrine/lib/colors.dart b/shrine/lib/colors.dart new file mode 100644 index 00000000000..07018344ba7 --- /dev/null +++ b/shrine/lib/colors.dart @@ -0,0 +1,27 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +const kShrinePink50 = const Color(0xFFFEEAE6); +const kShrinePink100 = const Color(0xFFFEDBD0); +const kShrinePink300 = const Color(0xFFFBB8AC); + +const kShrineBrown900 = const Color(0xFF442B2D); +const kShrineBrown600 = const Color(0xFF7D4F52); + +const kShrineErrorRed = const Color(0xFFC5032B); + +const kShrineSurfaceWhite = const Color(0xFFFFFBFA); +const kShrineBackgroundWhite = Colors.white; diff --git a/shrine/lib/home.dart b/shrine/lib/home.dart new file mode 100644 index 00000000000..ba5dd370d01 --- /dev/null +++ b/shrine/lib/home.dart @@ -0,0 +1,35 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import 'model/app_state_model.dart'; +import 'model/product.dart'; +import 'supplemental/asymmetric_view.dart'; + +class HomePage extends StatelessWidget { + final Category category; + + const HomePage({this.category: Category.all}); + + @override + Widget build(BuildContext context) { + return ScopedModelDescendant( + builder: (context, child, model) => AsymmetricView( + products: model.getProducts(), + ), + ); + } +} diff --git a/shrine/lib/login.dart b/shrine/lib/login.dart new file mode 100644 index 00000000000..030ee79b3df --- /dev/null +++ b/shrine/lib/login.dart @@ -0,0 +1,111 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import 'colors.dart'; + +class LoginPage extends StatefulWidget { + @override + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + final _usernameController = TextEditingController(); + final _passwordController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: ListView( + padding: EdgeInsets.symmetric(horizontal: 24.0), + children: [ + SizedBox(height: 80.0), + Column( + children: [ + Image.asset('assets/diamond.png'), + SizedBox(height: 16.0), + Text( + 'SHRINE', + style: Theme.of(context).textTheme.headline, + ), + ], + ), + SizedBox(height: 120.0), + PrimaryColorOverride( + color: kShrineBrown900, + child: TextField( + controller: _usernameController, + decoration: InputDecoration( + labelText: 'Username', + ), + ), + ), + const SizedBox(height: 12.0), + PrimaryColorOverride( + color: kShrineBrown900, + child: TextField( + controller: _passwordController, + decoration: InputDecoration( + labelText: 'Password', + ), + ), + ), + ButtonBar( + children: [ + FlatButton( + child: Text('CANCEL'), + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(7.0)), + ), + onPressed: () { + _usernameController.clear(); + _passwordController.clear(); + }, + ), + RaisedButton( + child: Text('NEXT'), + elevation: 8.0, + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(7.0)), + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + ], + ), + ), + ); + } +} + +class PrimaryColorOverride extends StatelessWidget { + const PrimaryColorOverride({Key key, this.color, this.child}) + : super(key: key); + + final Color color; + final Widget child; + + @override + Widget build(BuildContext context) { + return Theme( + child: child, + data: Theme.of(context).copyWith(primaryColor: color), + ); + } +} diff --git a/shrine/lib/main.dart b/shrine/lib/main.dart new file mode 100644 index 00000000000..ce4a46e11b8 --- /dev/null +++ b/shrine/lib/main.dart @@ -0,0 +1,31 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import 'app.dart'; +import 'model/app_state_model.dart'; + +void main() { + AppStateModel model = AppStateModel(); + model.loadProducts(); + + runApp( + ScopedModel( + model: model, + child: ShrineApp(), + ), + ); +} diff --git a/shrine/lib/model/app_state_model.dart b/shrine/lib/model/app_state_model.dart new file mode 100644 index 00000000000..e5ba4b2acbc --- /dev/null +++ b/shrine/lib/model/app_state_model.dart @@ -0,0 +1,106 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:scoped_model/scoped_model.dart'; +import 'product.dart'; +import 'products_repository.dart'; + +double _shippingCostPerItem = 7.0; +double _salesTaxRate = 0.06; + +class AppStateModel extends Model { + // All the available products. + List _availableProducts; + + // The currently selected category of products. + Category _selectedCategory = Category.all; + + // The IDs and quantities of products currently in the cart. + Map _productsInCart = {}; + + Map get productsInCart => Map.from(_productsInCart); + + // Total number of items in the cart. + int get totalCartQuantity => _productsInCart.values.fold(0, (v, e) => v + e); + + Category get selectedCategory => _selectedCategory; + + // Totaled prices of the items in the cart. + double get subtotalCost => _productsInCart.keys + .map((id) => _availableProducts[id].price * _productsInCart[id]) + .fold(0.0, (sum, e) => sum + e); + + // Total shipping cost for the items in the cart. + double get shippingCost => + _shippingCostPerItem * + _productsInCart.values.fold(0.0, (sum, e) => sum + e); + + // Sales tax for the items in the cart + double get tax => subtotalCost * _salesTaxRate; + + // Total cost to order everything in the cart. + double get totalCost => subtotalCost + shippingCost + tax; + + // Returns a copy of the list of available products, filtered by category. + List getProducts() { + if (_availableProducts == null) return List(); + + if (_selectedCategory == Category.all) { + return List.from(_availableProducts); + } else { + return _availableProducts.where((p) => p.category == _selectedCategory); + } + } + + // Adds a product to the cart. + void addProductToCart(int productId) { + if (!_productsInCart.containsKey(productId)) { + _productsInCart[productId] = 1; + } else { + _productsInCart[productId]++; + } + + notifyListeners(); + } + + // Removes an item from the cart. + void removeItemFromCart(int productId) { + if (_productsInCart.containsKey(productId)) { + if (_productsInCart[productId] == 1) { + _productsInCart.remove(productId); + } else { + _productsInCart[productId] -= 1; + } + } + + notifyListeners(); + } + + // Returns the Product instance matching the provided id. + Product getProductById(int id) { + return _availableProducts.firstWhere((p) => p.id == id); + } + + // Removes everything from the cart. + void clearCart() { + _productsInCart.clear(); + notifyListeners(); + } + + // Loads the list of available products from the repo. + void loadProducts() { + _availableProducts = ProductsRepository.loadProducts(); + notifyListeners(); + } +} diff --git a/shrine/lib/model/product.dart b/shrine/lib/model/product.dart new file mode 100644 index 00000000000..ffedcc32174 --- /dev/null +++ b/shrine/lib/model/product.dart @@ -0,0 +1,48 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/foundation.dart'; + +enum Category { + all, + accessories, + clothing, + home, +} + +class Product { + const Product({ + @required this.category, + @required this.id, + @required this.isFeatured, + @required this.name, + @required this.price, + }) : assert(category != null), + assert(id != null), + assert(isFeatured != null), + assert(name != null), + assert(price != null); + + final Category category; + final int id; + final bool isFeatured; + final String name; + final int price; + + String get assetName => '$id-0.jpg'; + String get assetPackage => 'shrine_images'; + + @override + String toString() => '$name (id=$id)'; +} diff --git a/shrine/lib/model/products_repository.dart b/shrine/lib/model/products_repository.dart new file mode 100644 index 00000000000..01caa04b351 --- /dev/null +++ b/shrine/lib/model/products_repository.dart @@ -0,0 +1,288 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'product.dart'; + +class ProductsRepository { + static List loadProducts() { + return const [ + Product( + category: Category.accessories, + id: 0, + isFeatured: true, + name: 'Vagabond sack', + price: 120, + ), + Product( + category: Category.accessories, + id: 1, + isFeatured: true, + name: 'Stella sunglasses', + price: 58, + ), + Product( + category: Category.accessories, + id: 2, + isFeatured: false, + name: 'Whitney belt', + price: 35, + ), + Product( + category: Category.accessories, + id: 3, + isFeatured: true, + name: 'Garden strand', + price: 98, + ), + Product( + category: Category.accessories, + id: 4, + isFeatured: false, + name: 'Strut earrings', + price: 34, + ), + Product( + category: Category.accessories, + id: 5, + isFeatured: false, + name: 'Varsity socks', + price: 12, + ), + Product( + category: Category.accessories, + id: 6, + isFeatured: false, + name: 'Weave keyring', + price: 16, + ), + Product( + category: Category.accessories, + id: 7, + isFeatured: true, + name: 'Gatsby hat', + price: 40, + ), + Product( + category: Category.accessories, + id: 8, + isFeatured: true, + name: 'Shrug bag', + price: 198, + ), + Product( + category: Category.home, + id: 9, + isFeatured: true, + name: 'Gilt desk trio', + price: 58, + ), + Product( + category: Category.home, + id: 10, + isFeatured: false, + name: 'Copper wire rack', + price: 18, + ), + Product( + category: Category.home, + id: 11, + isFeatured: false, + name: 'Soothe ceramic set', + price: 28, + ), + Product( + category: Category.home, + id: 12, + isFeatured: false, + name: 'Hurrahs tea set', + price: 34, + ), + Product( + category: Category.home, + id: 13, + isFeatured: true, + name: 'Blue stone mug', + price: 18, + ), + Product( + category: Category.home, + id: 14, + isFeatured: true, + name: 'Rainwater tray', + price: 27, + ), + Product( + category: Category.home, + id: 15, + isFeatured: true, + name: 'Chambray napkins', + price: 16, + ), + Product( + category: Category.home, + id: 16, + isFeatured: true, + name: 'Succulent planters', + price: 16, + ), + Product( + category: Category.home, + id: 17, + isFeatured: false, + name: 'Quartet table', + price: 175, + ), + Product( + category: Category.home, + id: 18, + isFeatured: true, + name: 'Kitchen quattro', + price: 129, + ), + Product( + category: Category.clothing, + id: 19, + isFeatured: false, + name: 'Clay sweater', + price: 48, + ), + Product( + category: Category.clothing, + id: 20, + isFeatured: false, + name: 'Sea tunic', + price: 45, + ), + Product( + category: Category.clothing, + id: 21, + isFeatured: false, + name: 'Plaster tunic', + price: 38, + ), + Product( + category: Category.clothing, + id: 22, + isFeatured: false, + name: 'White pinstripe shirt', + price: 70, + ), + Product( + category: Category.clothing, + id: 23, + isFeatured: false, + name: 'Chambray shirt', + price: 70, + ), + Product( + category: Category.clothing, + id: 24, + isFeatured: true, + name: 'Seabreeze sweater', + price: 60, + ), + Product( + category: Category.clothing, + id: 25, + isFeatured: false, + name: 'Gentry jacket', + price: 178, + ), + Product( + category: Category.clothing, + id: 26, + isFeatured: false, + name: 'Navy trousers', + price: 74, + ), + Product( + category: Category.clothing, + id: 27, + isFeatured: true, + name: 'Walter henley (white)', + price: 38, + ), + Product( + category: Category.clothing, + id: 28, + isFeatured: true, + name: 'Surf and perf shirt', + price: 48, + ), + Product( + category: Category.clothing, + id: 29, + isFeatured: true, + name: 'Ginger scarf', + price: 98, + ), + Product( + category: Category.clothing, + id: 30, + isFeatured: true, + name: 'Ramona crossover', + price: 68, + ), + Product( + category: Category.clothing, + id: 31, + isFeatured: false, + name: 'Chambray shirt', + price: 38, + ), + Product( + category: Category.clothing, + id: 32, + isFeatured: false, + name: 'Classic white collar', + price: 58, + ), + Product( + category: Category.clothing, + id: 33, + isFeatured: true, + name: 'Cerise scallop tee', + price: 42, + ), + Product( + category: Category.clothing, + id: 34, + isFeatured: false, + name: 'Shoulder rolls tee', + price: 27, + ), + Product( + category: Category.clothing, + id: 35, + isFeatured: false, + name: 'Grey slouch tank', + price: 24, + ), + Product( + category: Category.clothing, + id: 36, + isFeatured: false, + name: 'Sunshirt dress', + price: 58, + ), + Product( + category: Category.clothing, + id: 37, + isFeatured: true, + name: 'Fine lines tee', + price: 58, + ), + ]; + } +} diff --git a/shrine/lib/shopping_cart.dart b/shrine/lib/shopping_cart.dart new file mode 100644 index 00000000000..c1aa1e4c840 --- /dev/null +++ b/shrine/lib/shopping_cart.dart @@ -0,0 +1,271 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import 'colors.dart'; +import 'model/app_state_model.dart'; +import 'model/product.dart'; + +const _leftColumnWidth = 60.0; + +class ShoppingCartPage extends StatefulWidget { + @override + _ShoppingCartPageState createState() => _ShoppingCartPageState(); +} + +class _ShoppingCartPageState extends State { + List _createShoppingCartRows(AppStateModel model) { + return model.productsInCart.keys + .map( + (id) => ShoppingCartRow( + product: model.getProductById(id), + quantity: model.productsInCart[id], + onPressed: () { + model.removeItemFromCart(id); + }, + ), + ) + .toList(); + } + + @override + Widget build(BuildContext context) { + final localTheme = Theme.of(context); + + return Scaffold( + backgroundColor: kShrinePink100, + body: SafeArea( + child: Container( + child: ScopedModelDescendant( + builder: (context, child, model) { + return Stack( + children: [ + ListView( + children: [ + Row( + children: [ + SizedBox( + width: _leftColumnWidth, + child: IconButton( + icon: const Icon(Icons.keyboard_arrow_down), + onPressed: () => Navigator.of(context).pop(), + ), + ), + Text( + 'CART', + style: localTheme.textTheme.subhead + .copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox(width: 16.0), + Text('${model.totalCartQuantity} ITEMS'), + ], + ), + const SizedBox(height: 16.0), + Column( + children: _createShoppingCartRows(model), + ), + ShoppingCartSummary(model: model), + const SizedBox(height: 100.0), + ], + ), + Positioned( + bottom: 16.0, + left: 16.0, + right: 16.0, + child: RaisedButton( + shape: const BeveledRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(7.0)), + ), + color: kShrinePink300, + splashColor: kShrineBrown600, + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 12.0), + child: Text('CLEAR CART'), + ), + onPressed: () { + model.clearCart(); + Navigator.of(context).pop(); + }, + ), + ), + ], + ); + }, + ), + ), + ), + ); + } +} + +class ShoppingCartSummary extends StatelessWidget { + ShoppingCartSummary({this.model}); + + final AppStateModel model; + + @override + Widget build(BuildContext context) { + final smallAmountStyle = + Theme.of(context).textTheme.body1.copyWith(color: kShrineBrown600); + final largeAmountStyle = Theme.of(context).textTheme.display1; + final formatter = NumberFormat.simpleCurrency( + decimalDigits: 2, locale: Localizations.localeOf(context).toString()); + + return Row( + children: [ + SizedBox(width: _leftColumnWidth), + Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 16.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Expanded( + child: Text('TOTAL'), + ), + Text( + formatter.format(model.totalCost), + style: largeAmountStyle, + ), + ], + ), + const SizedBox(height: 16.0), + Row( + children: [ + const Expanded( + child: Text('Subtotal:'), + ), + Text( + formatter.format(model.subtotalCost), + style: smallAmountStyle, + ), + ], + ), + const SizedBox(height: 4.0), + Row( + children: [ + const Expanded( + child: Text('Shipping:'), + ), + Text( + formatter.format(model.shippingCost), + style: smallAmountStyle, + ), + ], + ), + const SizedBox(height: 4.0), + Row( + children: [ + const Expanded( + child: Text('Tax:'), + ), + Text( + formatter.format(model.tax), + style: smallAmountStyle, + ), + ], + ), + ], + ), + ), + ), + ], + ); + } +} + +class ShoppingCartRow extends StatelessWidget { + ShoppingCartRow( + {@required this.product, @required this.quantity, this.onPressed}); + + final Product product; + final int quantity; + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + final formatter = NumberFormat.simpleCurrency( + decimalDigits: 0, locale: Localizations.localeOf(context).toString()); + final localTheme = Theme.of(context); + + return Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Row( + key: ValueKey(product.id), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: _leftColumnWidth, + child: IconButton( + icon: const Icon(Icons.remove_circle_outline), + onPressed: onPressed, + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 16.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + product.assetName, + package: product.assetPackage, + fit: BoxFit.cover, + width: 75.0, + height: 75.0, + ), + const SizedBox(width: 16.0), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Text('Quantity: $quantity'), + ), + Text('x ${formatter.format(product.price)}'), + ], + ), + Text( + product.name, + style: localTheme.textTheme.subhead + .copyWith(fontWeight: FontWeight.w600), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 16.0), + const Divider( + color: kShrineBrown900, + height: 10.0, + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/shrine/lib/supplemental/asymmetric_view.dart b/shrine/lib/supplemental/asymmetric_view.dart new file mode 100644 index 00000000000..2cbe16e80e3 --- /dev/null +++ b/shrine/lib/supplemental/asymmetric_view.dart @@ -0,0 +1,95 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import '../model/product.dart'; +import 'product_columns.dart'; + +class AsymmetricView extends StatelessWidget { + final List products; + + const AsymmetricView({Key key, this.products}); + + List _buildColumns(BuildContext context) { + if (products == null || products.isEmpty) { + return const []; + } + + /// This will return a list of columns. It will oscillate between the two + /// kinds of columns. Even cases of the index (0, 2, 4, etc) will be + /// TwoProductCardColumn and the odd cases will be OneProductCardColumn. + /// + /// Each pair of columns will advance us 3 products forward (2 + 1). That's + /// some kinda awkward math so we use _evenCasesIndex and _oddCasesIndex as + /// helpers for creating the index of the product list that will correspond + /// to the index of the list of columns. + return List.generate(_listItemCount(products.length), (int index) { + double width = .59 * MediaQuery.of(context).size.width; + Widget column; + if (index % 2 == 0) { + /// Even cases + int bottom = _evenCasesIndex(index); + column = TwoProductCardColumn( + bottom: products[bottom], + top: products.length - 1 >= bottom + 1 + ? products[bottom + 1] + : null); + width += 32.0; + } else { + /// Odd cases + column = OneProductCardColumn( + product: products[_oddCasesIndex(index)], + ); + } + return Container( + width: width, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: column, + ), + ); + }).toList(); + } + + int _evenCasesIndex(int input) { + /// The operator ~/ is a cool one. It's the truncating division operator. It + /// divides the number and if there's a remainder / decimal, it cuts it off. + /// This is like dividing and then casting the result to int. Also, it's + /// functionally equivalent to floor() in this case. + return input ~/ 2 * 3; + } + + int _oddCasesIndex(int input) { + assert(input > 0); + return (input / 2).ceil() * 3 - 1; + } + + int _listItemCount(int totalItems) { + if (totalItems % 3 == 0) { + return totalItems ~/ 3 * 2; + } else { + return (totalItems / 3).ceil() * 2 - 1; + } + } + + @override + Widget build(BuildContext context) { + return ListView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.fromLTRB(0.0, 34.0, 16.0, 44.0), + children: _buildColumns(context), + ); + } +} diff --git a/shrine/lib/supplemental/cut_corners_border.dart b/shrine/lib/supplemental/cut_corners_border.dart new file mode 100644 index 00000000000..7e29e5e6b3b --- /dev/null +++ b/shrine/lib/supplemental/cut_corners_border.dart @@ -0,0 +1,139 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:ui' show lerpDouble; + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class CutCornersBorder extends OutlineInputBorder { + const CutCornersBorder({ + BorderSide borderSide: BorderSide.none, + BorderRadius borderRadius: const BorderRadius.all(Radius.circular(2.0)), + this.cut: 7.0, + double gapPadding: 2.0, + }) : super( + borderSide: borderSide, + borderRadius: borderRadius, + gapPadding: gapPadding); + + @override + CutCornersBorder copyWith({ + BorderSide borderSide, + BorderRadius borderRadius, + double gapPadding, + double cut, + }) { + return CutCornersBorder( + borderRadius: borderRadius ?? this.borderRadius, + borderSide: borderSide ?? this.borderSide, + cut: cut ?? this.cut, + gapPadding: gapPadding ?? this.gapPadding, + ); + } + + final double cut; + + @override + ShapeBorder lerpFrom(ShapeBorder a, double t) { + if (a is CutCornersBorder) { + final CutCornersBorder outline = a; + return CutCornersBorder( + borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t), + borderSide: BorderSide.lerp(outline.borderSide, borderSide, t), + cut: cut, + gapPadding: outline.gapPadding, + ); + } + return super.lerpFrom(a, t); + } + + @override + ShapeBorder lerpTo(ShapeBorder b, double t) { + if (b is CutCornersBorder) { + final CutCornersBorder outline = b; + return CutCornersBorder( + borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t), + borderSide: BorderSide.lerp(borderSide, outline.borderSide, t), + cut: cut, + gapPadding: outline.gapPadding, + ); + } + return super.lerpTo(b, t); + } + + Path _notchedCornerPath(Rect center, + [double start = 0.0, double extent = 0.0]) { + final Path path = Path(); + if (start > 0.0 || extent > 0.0) { + path.relativeMoveTo(extent + start, center.top); + _notchedSidesAndBottom(center, path); + path..lineTo(center.left + cut, center.top)..lineTo(start, center.top); + } else { + path.moveTo(center.left + cut, center.top); + _notchedSidesAndBottom(center, path); + path.lineTo(center.left + cut, center.top); + } + return path; + } + + Path _notchedSidesAndBottom(Rect center, Path path) { + return path + ..lineTo(center.right - cut, center.top) + ..lineTo(center.right, center.top + cut) + ..lineTo(center.right, center.top + center.height - cut) + ..lineTo(center.right - cut, center.top + center.height) + ..lineTo(center.left + cut, center.top + center.height) + ..lineTo(center.left, center.top + center.height - cut) + ..lineTo(center.left, center.top + cut); + } + + @override + void paint( + Canvas canvas, + Rect rect, { + double gapStart, + double gapExtent: 0.0, + double gapPercentage: 0.0, + TextDirection textDirection, + }) { + assert(gapExtent != null); + assert(gapPercentage >= 0.0 && gapPercentage <= 1.0); + + final Paint paint = borderSide.toPaint(); + final RRect outer = borderRadius.toRRect(rect); + if (gapStart == null || gapExtent <= 0.0 || gapPercentage == 0.0) { + canvas.drawPath(_notchedCornerPath(outer.middleRect), paint); + } else { + final double extent = + lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage); + switch (textDirection) { + case TextDirection.rtl: + { + final Path path = _notchedCornerPath( + outer.middleRect, gapStart + gapPadding - extent, extent); + canvas.drawPath(path, paint); + break; + } + case TextDirection.ltr: + { + final Path path = _notchedCornerPath( + outer.middleRect, gapStart - gapPadding, extent); + canvas.drawPath(path, paint); + break; + } + } + } + } +} diff --git a/shrine/lib/supplemental/product_card.dart b/shrine/lib/supplemental/product_card.dart new file mode 100644 index 00000000000..59381446cfb --- /dev/null +++ b/shrine/lib/supplemental/product_card.dart @@ -0,0 +1,88 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import '../model/app_state_model.dart'; +import '../model/product.dart'; + +class ProductCard extends StatelessWidget { + ProductCard({this.imageAspectRatio: 33 / 49, this.product}) + : assert(imageAspectRatio == null || imageAspectRatio > 0); + + final double imageAspectRatio; + final Product product; + + static final kTextBoxHeight = 65.0; + + @override + Widget build(BuildContext context) { + final NumberFormat formatter = NumberFormat.simpleCurrency( + decimalDigits: 0, locale: Localizations.localeOf(context).toString()); + final ThemeData theme = Theme.of(context); + + final imageWidget = Image.asset( + product.assetName, + package: product.assetPackage, + fit: BoxFit.cover, + ); + + return ScopedModelDescendant( + builder: (context, child, model) => GestureDetector( + onTap: () { + model.addProductToCart(product.id); + Scaffold.of(context).showSnackBar(SnackBar( + content: + Text('${product.name} has been added to your cart.'), + )); + }, + child: child, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + AspectRatio( + aspectRatio: imageAspectRatio, + child: imageWidget, + ), + SizedBox( + height: kTextBoxHeight * MediaQuery.of(context).textScaleFactor, + width: 121.0, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + product == null ? '' : product.name, + style: theme.textTheme.button, + softWrap: false, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + SizedBox(height: 4.0), + Text( + product == null ? '' : formatter.format(product.price), + style: theme.textTheme.caption, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/shrine/lib/supplemental/product_columns.dart b/shrine/lib/supplemental/product_columns.dart new file mode 100644 index 00000000000..c12e9ebf6b9 --- /dev/null +++ b/shrine/lib/supplemental/product_columns.dart @@ -0,0 +1,87 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import '../model/product.dart'; +import 'product_card.dart'; + +class TwoProductCardColumn extends StatelessWidget { + TwoProductCardColumn({ + this.bottom, + this.top, + }) : assert(bottom != null); + + final Product bottom, top; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + const spacerHeight = 44.0; + + double heightOfCards = (constraints.biggest.height - spacerHeight) / 2.0; + double heightOfImages = heightOfCards - ProductCard.kTextBoxHeight; + double imageAspectRatio = + (heightOfImages >= 0.0 && constraints.biggest.width > heightOfImages) + ? constraints.biggest.width / heightOfImages + : 33 / 49; + + return ListView( + children: [ + Padding( + padding: EdgeInsetsDirectional.only(start: 28.0), + child: top != null + ? ProductCard( + imageAspectRatio: imageAspectRatio, + product: top, + ) + : SizedBox( + height: heightOfCards, + ), + ), + SizedBox(height: spacerHeight), + Padding( + padding: EdgeInsetsDirectional.only(end: 28.0), + child: ProductCard( + imageAspectRatio: imageAspectRatio, + product: bottom, + ), + ), + ], + ); + }); + } +} + +class OneProductCardColumn extends StatelessWidget { + OneProductCardColumn({this.product}); + + final Product product; + + @override + Widget build(BuildContext context) { + return ListView( + reverse: true, + children: [ + SizedBox( + height: 40.0, + ), + ProductCard( + product: product, + ), + ], + ); + } +} diff --git a/shrine/pubspec.yaml b/shrine/pubspec.yaml new file mode 100644 index 00000000000..e901b7cd858 --- /dev/null +++ b/shrine/pubspec.yaml @@ -0,0 +1,66 @@ +name: shrine +description: A simple shopping app with Material and scoped_model + +dependencies: + flutter: + sdk: flutter + + cupertino_icons: ^0.1.2 + intl: 0.15.6 + scoped_model: 0.2.0 + shrine_images: 1.0.0 + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + uses-material-design: true + assets: + - assets/diamond.png + - assets/slanted_menu.png + - packages/shrine_images/0-0.jpg + - packages/shrine_images/1-0.jpg + - packages/shrine_images/2-0.jpg + - packages/shrine_images/3-0.jpg + - packages/shrine_images/4-0.jpg + - packages/shrine_images/5-0.jpg + - packages/shrine_images/6-0.jpg + - packages/shrine_images/7-0.jpg + - packages/shrine_images/8-0.jpg + - packages/shrine_images/9-0.jpg + - packages/shrine_images/10-0.jpg + - packages/shrine_images/11-0.jpg + - packages/shrine_images/12-0.jpg + - packages/shrine_images/13-0.jpg + - packages/shrine_images/14-0.jpg + - packages/shrine_images/15-0.jpg + - packages/shrine_images/16-0.jpg + - packages/shrine_images/17-0.jpg + - packages/shrine_images/18-0.jpg + - packages/shrine_images/19-0.jpg + - packages/shrine_images/20-0.jpg + - packages/shrine_images/21-0.jpg + - packages/shrine_images/22-0.jpg + - packages/shrine_images/23-0.jpg + - packages/shrine_images/24-0.jpg + - packages/shrine_images/25-0.jpg + - packages/shrine_images/26-0.jpg + - packages/shrine_images/27-0.jpg + - packages/shrine_images/28-0.jpg + - packages/shrine_images/29-0.jpg + - packages/shrine_images/30-0.jpg + - packages/shrine_images/31-0.jpg + - packages/shrine_images/32-0.jpg + - packages/shrine_images/33-0.jpg + - packages/shrine_images/34-0.jpg + - packages/shrine_images/35-0.jpg + - packages/shrine_images/36-0.jpg + - packages/shrine_images/37-0.jpg + + fonts: + - family: Rubik + fonts: + - asset: fonts/Rubik-Regular.ttf + - asset: fonts/Rubik-Medium.ttf + weight: 500 \ No newline at end of file diff --git a/shrine/shrine.iml b/shrine/shrine.iml new file mode 100644 index 00000000000..a461e815eb4 --- /dev/null +++ b/shrine/shrine.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/shrine/shrine_android.iml b/shrine/shrine_android.iml new file mode 100644 index 00000000000..b050030a1b8 --- /dev/null +++ b/shrine/shrine_android.iml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + diff --git a/shrine/test/widget_test.dart b/shrine/test/widget_test.dart new file mode 100644 index 00000000000..0fe9fbd1878 --- /dev/null +++ b/shrine/test/widget_test.dart @@ -0,0 +1,7 @@ +// This is a basic Flutter widget test. +// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter +// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to +// find child widgets in the widget tree, read text, and verify that the values of widget properties +// are correct. + +void main() {} From b89969cbfaf234f08f6f9146d69b3d60d3aff8f8 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Thu, 28 Jun 2018 08:47:47 -0700 Subject: [PATCH 02/15] Cleaning up IDE files. --- shrine/.gitignore | 8 ++++---- shrine/shrine.iml | 14 -------------- shrine/shrine_android.iml | 27 --------------------------- 3 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 shrine/shrine.iml delete mode 100644 shrine/shrine_android.iml diff --git a/shrine/.gitignore b/shrine/.gitignore index dee655cc42e..0fe1a7c4e50 100644 --- a/shrine/.gitignore +++ b/shrine/.gitignore @@ -1,9 +1,9 @@ .DS_Store .dart_tool/ - .packages .pub/ - -build/ - +.idea +.atom .flutter-plugins +build/ +*.iml diff --git a/shrine/shrine.iml b/shrine/shrine.iml deleted file mode 100644 index a461e815eb4..00000000000 --- a/shrine/shrine.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/shrine/shrine_android.iml b/shrine/shrine_android.iml deleted file mode 100644 index b050030a1b8..00000000000 --- a/shrine/shrine_android.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - From a39a51f50c8a0eb42abdd53f6582317609a45c1e Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Fri, 29 Jun 2018 15:05:36 -0700 Subject: [PATCH 03/15] Addressing comments. --- shrine/README.md | 32 ++++++++++++++++---------------- shrine/test/main_test.dart | 1 + shrine/test/widget_test.dart | 7 ------- 3 files changed, 17 insertions(+), 23 deletions(-) create mode 100644 shrine/test/main_test.dart delete mode 100644 shrine/test/widget_test.dart diff --git a/shrine/README.md b/shrine/README.md index f6ab8efb8f6..ee1dd35b5a6 100644 --- a/shrine/README.md +++ b/shrine/README.md @@ -1,15 +1,15 @@ -# shrine +# Shrine A sample shopping app that uses Material widgets in its UI and -[`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to manage the -state of its shopping cart. +[`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to +manage the state of its shopping cart. -## Goals for this sample +## Goals -* Show how to customize Flutter's Material widgets to produce a unique design - for an app. -* Show how to use `scoped_model` to manage an app's state and access it across - different routes and in different widgets. +* Show how to customize Flutter's Material Compoenent widgets to produce + a unique design for an app. +* Show how to use `scoped_model` to manage an app's state and access it + across different routes and in different widgets. This is a modified version of the app featured in Flutter's [Material codelabs](https://codelabs.developers.google.com/?cat=Flutter). @@ -18,24 +18,24 @@ This is a modified version of the app featured in Flutter's ### `/model/app_state_model.dart` -The model object representing the state of the app. It holds the available -products as well as what's in the shopping cart. +The model object representing the state of the app. It holds the +available products as well as what's in the shopping cart. ### `/supplemental` -A bunch of widgets that customize Material to produce the look and feel of the -app. +A bunch of widgets that customize Material to produce the look and feel +of the app. ### `shopping_cart.dart` The shopping cart widgets. They access the app state model via -`ScopedModelDescendant`, display the contents of the shopping cart, and allow -the user to edit them. +`ScopedModelDescendant`, display the contents of the shopping cart, and +allow the user to edit them. ## Questions/issues -If you have a general question about any of the techniques you see in the\ -sample, the best places to go are: +If you have a general question about any of the techniques you see in +the sample, the best places to go are: * [The FlutterDev Google Group](https://groups.google.com/forum/#!forum/flutter-dev) * [The Flutter Gitter channel](https://gitter.im/flutter/flutter) diff --git a/shrine/test/main_test.dart b/shrine/test/main_test.dart new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/shrine/test/main_test.dart @@ -0,0 +1 @@ +void main() {} diff --git a/shrine/test/widget_test.dart b/shrine/test/widget_test.dart deleted file mode 100644 index 0fe9fbd1878..00000000000 --- a/shrine/test/widget_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// This is a basic Flutter widget test. -// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter -// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to -// find child widgets in the widget tree, read text, and verify that the values of widget properties -// are correct. - -void main() {} From d17f9689322d062dcf99241c7039024ba4196be0 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Fri, 29 Jun 2018 15:49:11 -0700 Subject: [PATCH 04/15] Adding Travis config for jsonexample. (#4) --- .travis.yml | 27 +++++++++++++++++++ .../test/{widget_test.dart => main_test.dart} | 2 +- travis_script.sh | 9 +++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 .travis.yml rename jsonexample/test/{widget_test.dart => main_test.dart} (74%) create mode 100644 travis_script.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..188f839f2e7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +os: + - linux +sudo: false +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - libstdc++6 + - fonts-droid +git: + depth: 3 +env: + - FLUTTER_VERSION=beta + - FLUTTER_VERSION=dev +matrix: + allow_failures: + - env: FLUTTER_VERSION=dev +before_script: + - git clone https://github.com/flutter/flutter.git -b $FLUTTER_VERSION + - ./flutter/bin/flutter doctor + - chmod +x travis_script.sh +script: + - ./travis_script.sh +cache: + directories: + - $HOME/shared/.pub-cache diff --git a/jsonexample/test/widget_test.dart b/jsonexample/test/main_test.dart similarity index 74% rename from jsonexample/test/widget_test.dart rename to jsonexample/test/main_test.dart index df84151d3f3..0fc93b3bef7 100644 --- a/jsonexample/test/widget_test.dart +++ b/jsonexample/test/main_test.dart @@ -5,5 +5,5 @@ import 'package:flutter_test/flutter_test.dart'; void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); + test('This test always passes.', () {}); } diff --git a/travis_script.sh b/travis_script.sh new file mode 100644 index 00000000000..52431fa1d94 --- /dev/null +++ b/travis_script.sh @@ -0,0 +1,9 @@ +set -e + +echo "== Testing 'jsonexample' on Flutter's $FLUTTER_VERSION channel ==" + +pushd jsonexample +../flutter/bin/flutter test +popd + +echo "-- Success --" From d83f6505ef9e87c5bd1f778d4a967198ecfba6d7 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Mon, 2 Jul 2018 09:01:53 -0700 Subject: [PATCH 05/15] Adding Travis badge. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5ff0ea8022f..98379ca651e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Flutter samples +[![Build Status](https://travis-ci.org/flutter/samples.svg?branch=master)](https://travis-ci.org/flutter/samples) + A collection of open source samples that illustrate best practices for [Flutter](https://flutter.io). From 166c79767163ae3b16cc6ff5de5ae15fd33bbe76 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Mon, 2 Jul 2018 09:39:32 -0700 Subject: [PATCH 06/15] Updating contributor guidelines. --- CONTRIBUTING.md | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 781c34ed5dd..227894536d5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,30 @@ -Want to contribute? Great! First, read this page (including the small print at -the end). +# Contributing -### Before you contribute +Want to contribute to the Flutter sample ecosystem? Great! First, read this +page (including the small print at the end). + +## Is this the right place for your contribution? + +This repo is used by members of the Flutter team and a few partners as a place +to store example apps and demos. It's not meant to be the one and only source of +truth for Flutter samples or the only place people go to learn about the best +ways to build with Flutter. What that means in practice is that if you've +written a great example app, it doesn't need to be maintained here in order to +get noticed, be of help to new Flutter devs, and have an impact on the +community. + +You can maintain your sample app in your own repo (or with another source +control provider) and still be as important a part of the Flutter-verse as +anything you see here. You can let us know on the +[FlutterDev Google Group](https://groups.google.com/forum/#!forum/flutter-dev) +when you've published something and Tweet about it with the +[#flutterio](https://twitter.com/search?q=%23flutterio) hashtag. + +## So what should be contributed here, then? + +Fixes and necessary improvements to the existing samples, mostly. + +## Before you contribute Before we can use your code, you must sign the [Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual) @@ -18,19 +41,19 @@ us first through the issue tracker with your idea so that we can help out and possibly guide you. Coordinating up front makes it much easier to avoid frustration later on. -### Code reviews +## Code reviews All submissions, including submissions by project members, require review. -### File headers +## File headers All files in the project must start with the following header. - // Copyright 2016 The Chromium Authors. All rights reserved. + // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -### The small print +## The small print Contributions made by corporations are covered by a different agreement than the one above, the From af463b8fe91fd899993d4924c3b03b81508b551d Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Tue, 3 Jul 2018 11:12:47 -0700 Subject: [PATCH 07/15] Addressing comments. --- shrine/README.md | 2 +- shrine/lib/app.dart | 2 +- shrine/lib/backdrop.dart | 2 +- shrine/lib/model/app_state_model.dart | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/shrine/README.md b/shrine/README.md index ee1dd35b5a6..32f685266a5 100644 --- a/shrine/README.md +++ b/shrine/README.md @@ -6,7 +6,7 @@ manage the state of its shopping cart. ## Goals -* Show how to customize Flutter's Material Compoenent widgets to produce +* Show how to customize Flutter's Material Component widgets to produce a unique design for an app. * Show how to use `scoped_model` to manage an app's state and access it across different routes and in different widgets. diff --git a/shrine/lib/app.dart b/shrine/lib/app.dart index 68264f17626..d6987f2c3ac 100644 --- a/shrine/lib/app.dart +++ b/shrine/lib/app.dart @@ -15,10 +15,10 @@ import 'package:flutter/material.dart'; import 'backdrop.dart'; +import 'category_menu_page.dart'; import 'colors.dart'; import 'home.dart'; import 'login.dart'; -import 'category_menu_page.dart'; import 'model/product.dart'; import 'supplemental/cut_corners_border.dart'; diff --git a/shrine/lib/backdrop.dart b/shrine/lib/backdrop.dart index c96227aad39..fc3bbbe8c1b 100644 --- a/shrine/lib/backdrop.dart +++ b/shrine/lib/backdrop.dart @@ -15,8 +15,8 @@ import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; -import 'model/product.dart'; import 'login.dart'; +import 'model/product.dart'; import 'shopping_cart.dart'; const double _kFlingVelocity = 2.0; diff --git a/shrine/lib/model/app_state_model.dart b/shrine/lib/model/app_state_model.dart index e5ba4b2acbc..1f9e18fd3a8 100644 --- a/shrine/lib/model/app_state_model.dart +++ b/shrine/lib/model/app_state_model.dart @@ -13,11 +13,12 @@ // limitations under the License. import 'package:scoped_model/scoped_model.dart'; + import 'product.dart'; import 'products_repository.dart'; -double _shippingCostPerItem = 7.0; double _salesTaxRate = 0.06; +double _shippingCostPerItem = 7.0; class AppStateModel extends Model { // All the available products. From 357d172647d6217b49784f9e79bccc08f189ce05 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Fri, 20 Jul 2018 15:18:23 -0700 Subject: [PATCH 08/15] Adding tests, tweaking built_value code. (#5) --- .../lib/built_value/built_complex_object.dart | 5 + .../built_value/built_complex_object.g.dart | 94 ++-- .../lib/built_value/built_simple_object.dart | 3 + .../built_value/built_simple_object.g.dart | 59 +-- .../built_value_serializers.g.dart | 2 +- .../serializable_complex_object.g.dart | 2 +- .../serializable_simple_object.g.dart | 2 +- jsonexample/lib/tab_pages.dart | 2 +- .../test/complex_object_unit_test.dart | 422 ++++++++++++++++++ jsonexample/test/main_test.dart | 9 - jsonexample/test/simple_object_unit_test.dart | 197 ++++++++ jsonexample/test/widget_tests_test.dart | 199 +++++++++ 12 files changed, 907 insertions(+), 89 deletions(-) create mode 100644 jsonexample/test/complex_object_unit_test.dart delete mode 100644 jsonexample/test/main_test.dart create mode 100644 jsonexample/test/simple_object_unit_test.dart create mode 100644 jsonexample/test/widget_tests_test.dart diff --git a/jsonexample/lib/built_value/built_complex_object.dart b/jsonexample/lib/built_value/built_complex_object.dart index baeaf815864..ef337cd9d49 100644 --- a/jsonexample/lib/built_value/built_complex_object.dart +++ b/jsonexample/lib/built_value/built_complex_object.dart @@ -23,14 +23,19 @@ abstract class BuiltComplexObject @nullable double get aDouble; + @nullable BuiltSimpleObject get anObject; + @nullable BuiltList get aListOfStrings; + @nullable BuiltList get aListOfInts; + @nullable BuiltList get aListOfDoubles; + @nullable BuiltList get aListOfObjects; BuiltComplexObject._(); diff --git a/jsonexample/lib/built_value/built_complex_object.g.dart b/jsonexample/lib/built_value/built_complex_object.g.dart index e3dc6681563..51aeb6f976f 100644 --- a/jsonexample/lib/built_value/built_complex_object.g.dart +++ b/jsonexample/lib/built_value/built_complex_object.g.dart @@ -7,7 +7,7 @@ part of 'built_complex_object.dart'; // ************************************************************************** -// Generator: BuiltValueGenerator +// BuiltValueGenerator // ************************************************************************** // ignore_for_file: always_put_control_body_on_new_line @@ -31,27 +31,7 @@ class _$BuiltComplexObjectSerializer @override Iterable serialize(Serializers serializers, BuiltComplexObject object, {FullType specifiedType: FullType.unspecified}) { - final result = [ - 'anObject', - serializers.serialize(object.anObject, - specifiedType: const FullType(BuiltSimpleObject)), - 'aListOfStrings', - serializers.serialize(object.aListOfStrings, - specifiedType: - const FullType(BuiltList, const [const FullType(String)])), - 'aListOfInts', - serializers.serialize(object.aListOfInts, - specifiedType: - const FullType(BuiltList, const [const FullType(int)])), - 'aListOfDoubles', - serializers.serialize(object.aListOfDoubles, - specifiedType: - const FullType(BuiltList, const [const FullType(double)])), - 'aListOfObjects', - serializers.serialize(object.aListOfObjects, - specifiedType: const FullType( - BuiltList, const [const FullType(BuiltSimpleObject)])), - ]; + final result = []; if (object.aString != null) { result ..add('aString') @@ -70,6 +50,40 @@ class _$BuiltComplexObjectSerializer ..add(serializers.serialize(object.aDouble, specifiedType: const FullType(double))); } + if (object.anObject != null) { + result + ..add('anObject') + ..add(serializers.serialize(object.anObject, + specifiedType: const FullType(BuiltSimpleObject))); + } + if (object.aListOfStrings != null) { + result + ..add('aListOfStrings') + ..add(serializers.serialize(object.aListOfStrings, + specifiedType: + const FullType(BuiltList, const [const FullType(String)]))); + } + if (object.aListOfInts != null) { + result + ..add('aListOfInts') + ..add(serializers.serialize(object.aListOfInts, + specifiedType: + const FullType(BuiltList, const [const FullType(int)]))); + } + if (object.aListOfDoubles != null) { + result + ..add('aListOfDoubles') + ..add(serializers.serialize(object.aListOfDoubles, + specifiedType: + const FullType(BuiltList, const [const FullType(double)]))); + } + if (object.aListOfObjects != null) { + result + ..add('aListOfObjects') + ..add(serializers.serialize(object.aListOfObjects, + specifiedType: const FullType( + BuiltList, const [const FullType(BuiltSimpleObject)]))); + } return result; } @@ -163,21 +177,7 @@ class _$BuiltComplexObject extends BuiltComplexObject { this.aListOfInts, this.aListOfDoubles, this.aListOfObjects}) - : super._() { - if (anObject == null) - throw new BuiltValueNullFieldError('BuiltComplexObject', 'anObject'); - if (aListOfStrings == null) - throw new BuiltValueNullFieldError( - 'BuiltComplexObject', 'aListOfStrings'); - if (aListOfInts == null) - throw new BuiltValueNullFieldError('BuiltComplexObject', 'aListOfInts'); - if (aListOfDoubles == null) - throw new BuiltValueNullFieldError( - 'BuiltComplexObject', 'aListOfDoubles'); - if (aListOfObjects == null) - throw new BuiltValueNullFieldError( - 'BuiltComplexObject', 'aListOfObjects'); - } + : super._(); @override BuiltComplexObject rebuild(void updates(BuiltComplexObjectBuilder b)) => @@ -315,24 +315,24 @@ class BuiltComplexObjectBuilder aString: aString, anInt: anInt, aDouble: aDouble, - anObject: anObject.build(), - aListOfStrings: aListOfStrings.build(), - aListOfInts: aListOfInts.build(), - aListOfDoubles: aListOfDoubles.build(), - aListOfObjects: aListOfObjects.build()); + anObject: _anObject?.build(), + aListOfStrings: _aListOfStrings?.build(), + aListOfInts: _aListOfInts?.build(), + aListOfDoubles: _aListOfDoubles?.build(), + aListOfObjects: _aListOfObjects?.build()); } catch (_) { String _$failedField; try { _$failedField = 'anObject'; - anObject.build(); + _anObject?.build(); _$failedField = 'aListOfStrings'; - aListOfStrings.build(); + _aListOfStrings?.build(); _$failedField = 'aListOfInts'; - aListOfInts.build(); + _aListOfInts?.build(); _$failedField = 'aListOfDoubles'; - aListOfDoubles.build(); + _aListOfDoubles?.build(); _$failedField = 'aListOfObjects'; - aListOfObjects.build(); + _aListOfObjects?.build(); } catch (e) { throw new BuiltValueNestedFieldError( 'BuiltComplexObject', _$failedField, e.toString()); diff --git a/jsonexample/lib/built_value/built_simple_object.dart b/jsonexample/lib/built_value/built_simple_object.dart index 297c5fb65b1..84dee0a4e4c 100644 --- a/jsonexample/lib/built_value/built_simple_object.dart +++ b/jsonexample/lib/built_value/built_simple_object.dart @@ -22,10 +22,13 @@ abstract class BuiltSimpleObject @nullable double get aDouble; + @nullable BuiltList get aListOfStrings; + @nullable BuiltList get aListOfInts; + @nullable BuiltList get aListOfDoubles; BuiltSimpleObject._(); diff --git a/jsonexample/lib/built_value/built_simple_object.g.dart b/jsonexample/lib/built_value/built_simple_object.g.dart index 9c91fbe7f91..16ebd2eec0f 100644 --- a/jsonexample/lib/built_value/built_simple_object.g.dart +++ b/jsonexample/lib/built_value/built_simple_object.g.dart @@ -7,7 +7,7 @@ part of 'built_simple_object.dart'; // ************************************************************************** -// Generator: BuiltValueGenerator +// BuiltValueGenerator // ************************************************************************** // ignore_for_file: always_put_control_body_on_new_line @@ -31,20 +31,7 @@ class _$BuiltSimpleObjectSerializer @override Iterable serialize(Serializers serializers, BuiltSimpleObject object, {FullType specifiedType: FullType.unspecified}) { - final result = [ - 'aListOfStrings', - serializers.serialize(object.aListOfStrings, - specifiedType: - const FullType(BuiltList, const [const FullType(String)])), - 'aListOfInts', - serializers.serialize(object.aListOfInts, - specifiedType: - const FullType(BuiltList, const [const FullType(int)])), - 'aListOfDoubles', - serializers.serialize(object.aListOfDoubles, - specifiedType: - const FullType(BuiltList, const [const FullType(double)])), - ]; + final result = []; if (object.aString != null) { result ..add('aString') @@ -63,6 +50,27 @@ class _$BuiltSimpleObjectSerializer ..add(serializers.serialize(object.aDouble, specifiedType: const FullType(double))); } + if (object.aListOfStrings != null) { + result + ..add('aListOfStrings') + ..add(serializers.serialize(object.aListOfStrings, + specifiedType: + const FullType(BuiltList, const [const FullType(String)]))); + } + if (object.aListOfInts != null) { + result + ..add('aListOfInts') + ..add(serializers.serialize(object.aListOfInts, + specifiedType: + const FullType(BuiltList, const [const FullType(int)]))); + } + if (object.aListOfDoubles != null) { + result + ..add('aListOfDoubles') + ..add(serializers.serialize(object.aListOfDoubles, + specifiedType: + const FullType(BuiltList, const [const FullType(double)]))); + } return result; } @@ -139,14 +147,7 @@ class _$BuiltSimpleObject extends BuiltSimpleObject { this.aListOfStrings, this.aListOfInts, this.aListOfDoubles}) - : super._() { - if (aListOfStrings == null) - throw new BuiltValueNullFieldError('BuiltSimpleObject', 'aListOfStrings'); - if (aListOfInts == null) - throw new BuiltValueNullFieldError('BuiltSimpleObject', 'aListOfInts'); - if (aListOfDoubles == null) - throw new BuiltValueNullFieldError('BuiltSimpleObject', 'aListOfDoubles'); - } + : super._(); @override BuiltSimpleObject rebuild(void updates(BuiltSimpleObjectBuilder b)) => @@ -262,18 +263,18 @@ class BuiltSimpleObjectBuilder aString: aString, anInt: anInt, aDouble: aDouble, - aListOfStrings: aListOfStrings.build(), - aListOfInts: aListOfInts.build(), - aListOfDoubles: aListOfDoubles.build()); + aListOfStrings: _aListOfStrings?.build(), + aListOfInts: _aListOfInts?.build(), + aListOfDoubles: _aListOfDoubles?.build()); } catch (_) { String _$failedField; try { _$failedField = 'aListOfStrings'; - aListOfStrings.build(); + _aListOfStrings?.build(); _$failedField = 'aListOfInts'; - aListOfInts.build(); + _aListOfInts?.build(); _$failedField = 'aListOfDoubles'; - aListOfDoubles.build(); + _aListOfDoubles?.build(); } catch (e) { throw new BuiltValueNestedFieldError( 'BuiltSimpleObject', _$failedField, e.toString()); diff --git a/jsonexample/lib/built_value/built_value_serializers.g.dart b/jsonexample/lib/built_value/built_value_serializers.g.dart index 5fa2ddb28a8..cd4549bf7d2 100644 --- a/jsonexample/lib/built_value/built_value_serializers.g.dart +++ b/jsonexample/lib/built_value/built_value_serializers.g.dart @@ -7,7 +7,7 @@ part of serializers; // ************************************************************************** -// Generator: BuiltValueGenerator +// BuiltValueGenerator // ************************************************************************** // ignore_for_file: always_put_control_body_on_new_line diff --git a/jsonexample/lib/json_serializable/serializable_complex_object.g.dart b/jsonexample/lib/json_serializable/serializable_complex_object.g.dart index 21bce9abf66..d0276765839 100644 --- a/jsonexample/lib/json_serializable/serializable_complex_object.g.dart +++ b/jsonexample/lib/json_serializable/serializable_complex_object.g.dart @@ -7,7 +7,7 @@ part of 'serializable_complex_object.dart'; // ************************************************************************** -// Generator: JsonSerializableGenerator +// JsonSerializableGenerator // ************************************************************************** SerializableComplexObject _$SerializableComplexObjectFromJson( diff --git a/jsonexample/lib/json_serializable/serializable_simple_object.g.dart b/jsonexample/lib/json_serializable/serializable_simple_object.g.dart index d4a2c188713..e985450b94f 100644 --- a/jsonexample/lib/json_serializable/serializable_simple_object.g.dart +++ b/jsonexample/lib/json_serializable/serializable_simple_object.g.dart @@ -7,7 +7,7 @@ part of 'serializable_simple_object.dart'; // ************************************************************************** -// Generator: JsonSerializableGenerator +// JsonSerializableGenerator // ************************************************************************** SerializableSimpleObject _$SerializableSimpleObjectFromJson( diff --git a/jsonexample/lib/tab_pages.dart b/jsonexample/lib/tab_pages.dart index ba61a8b3fa8..590f1bc4310 100644 --- a/jsonexample/lib/tab_pages.dart +++ b/jsonexample/lib/tab_pages.dart @@ -104,7 +104,7 @@ class BasicsPage extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(right: 8.0, bottom: 4.0), - child: Text('List of dynamic:', style: boldStyle), + child: Text('List of dynamics:', style: boldStyle), ), Text( prettyPrintList(strongListOfDynamics), diff --git a/jsonexample/test/complex_object_unit_test.dart b/jsonexample/test/complex_object_unit_test.dart new file mode 100644 index 00000000000..dcb44227b67 --- /dev/null +++ b/jsonexample/test/complex_object_unit_test.dart @@ -0,0 +1,422 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:jsonexample/built_value/built_complex_object.dart'; +import 'package:jsonexample/built_value/built_value_serializers.dart'; +import 'package:jsonexample/dart_convert/converted_complex_object.dart'; +import 'package:jsonexample/json_serializable/serializable_complex_object.dart'; + +void main() { + const typicalObjectJson = { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'anObject': { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0] + }, + 'aListOfObjects': [ + { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0] + }, + { + 'aString': 'Blah, blah, blah.', + 'anInt': 2, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0] + }, + { + 'aString': 'Blah, blah, blah.', + 'anInt': 3, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0] + } + ] + }; + + const emptySimpleObjectsJson = { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'anObject': {}, + 'aListOfObjects': [ + {}, + {}, + {} + ] + }; + + const unexpectedPropertiesJson = { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'unexpectedProperty': 'Whoops!', + 'anObject': { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'unexpectedProperty': 'Whoops!' + }, + 'aListOfObjects': [ + { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'unexpectedProperty': 'Whoops!' + }, + { + 'aString': 'Blah, blah, blah.', + 'anInt': 2, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'unexpectedProperty': 'Whoops!' + }, + { + 'aString': 'Blah, blah, blah.', + 'anInt': 3, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'unexpectedProperty': 'Whoops!' + } + ] + }; + + const emptyJson = {}; + + group('ConvertedComplexObject unit tests', () { + test('Typical object is converted correctly', () { + final complexObject = ConvertedComplexObject.fromJson(typicalObjectJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, "Blah, blah, blah."); + expect(complexObject.anObject.anInt, 1); + expect(complexObject.anObject.aDouble, 1.0); + expect(complexObject.anObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.anObject.aListOfInts, [1, 2, 3]); + expect(complexObject.anObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, "Blah, blah, blah."); + expect(complexObject.aListOfObjects[i].anInt, i + 1); + expect(complexObject.aListOfObjects[i].aDouble, 1.0); + expect(complexObject.aListOfObjects[i].aListOfStrings, + ['one', 'two', 'three']); + expect(complexObject.aListOfObjects[i].aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfObjects[i].aListOfDoubles, [1.0, 2.0, 3.0]); + } + }); + + test('Empty object results in null fields', () { + final complexObject = ConvertedComplexObject.fromJson(emptyJson); + + expect(complexObject.aString, isNull); + expect(complexObject.anInt, isNull); + expect(complexObject.aDouble, isNull); + expect(complexObject.aListOfStrings, isNull); + expect(complexObject.aListOfInts, isNull); + expect(complexObject.aListOfDoubles, isNull); + expect(complexObject.anObject, isNull); + expect(complexObject.aListOfObjects, isNull); + }); + + test('Empty simple objects result in instances with null fields', () { + final complexObject = + ConvertedComplexObject.fromJson(emptySimpleObjectsJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, isNull); + expect(complexObject.anObject.anInt, isNull); + expect(complexObject.anObject.aDouble, isNull); + expect(complexObject.anObject.aListOfStrings, isNull); + expect(complexObject.anObject.aListOfInts, isNull); + expect(complexObject.anObject.aListOfDoubles, isNull); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, isNull); + expect(complexObject.aListOfObjects[i].anInt, isNull); + expect(complexObject.aListOfObjects[i].aDouble, isNull); + expect(complexObject.aListOfObjects[i].aListOfStrings, isNull); + expect(complexObject.aListOfObjects[i].aListOfInts, isNull); + expect(complexObject.aListOfObjects[i].aListOfDoubles, isNull); + } + }); + + test('Unexpected properties are ignored', () { + final complexObject = + ConvertedComplexObject.fromJson(unexpectedPropertiesJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, "Blah, blah, blah."); + expect(complexObject.anObject.anInt, 1); + expect(complexObject.anObject.aDouble, 1.0); + expect(complexObject.anObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.anObject.aListOfInts, [1, 2, 3]); + expect(complexObject.anObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, "Blah, blah, blah."); + expect(complexObject.aListOfObjects[i].anInt, i + 1); + expect(complexObject.aListOfObjects[i].aDouble, 1.0); + expect(complexObject.aListOfObjects[i].aListOfStrings, + ['one', 'two', 'three']); + expect(complexObject.aListOfObjects[i].aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfObjects[i].aListOfDoubles, [1.0, 2.0, 3.0]); + } + }); + }); + + group('SerializableComplexObject unit tests', () { + test('Typical object is converted correctly', () { + final complexObject = + SerializableComplexObject.fromJson(typicalObjectJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, "Blah, blah, blah."); + expect(complexObject.anObject.anInt, 1); + expect(complexObject.anObject.aDouble, 1.0); + expect(complexObject.anObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.anObject.aListOfInts, [1, 2, 3]); + expect(complexObject.anObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, "Blah, blah, blah."); + expect(complexObject.aListOfObjects[i].anInt, i + 1); + expect(complexObject.aListOfObjects[i].aDouble, 1.0); + expect(complexObject.aListOfObjects[i].aListOfStrings, + ['one', 'two', 'three']); + expect(complexObject.aListOfObjects[i].aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfObjects[i].aListOfDoubles, [1.0, 2.0, 3.0]); + } + }); + + test('Empty object results in null fields', () { + final complexObject = SerializableComplexObject.fromJson(emptyJson); + + expect(complexObject.aString, isNull); + expect(complexObject.anInt, isNull); + expect(complexObject.aDouble, isNull); + expect(complexObject.aListOfStrings, isNull); + expect(complexObject.aListOfInts, isNull); + expect(complexObject.aListOfDoubles, isNull); + expect(complexObject.anObject, isNull); + expect(complexObject.aListOfObjects, isNull); + }); + + test('Empty simple objects result in instances with null fields', () { + final complexObject = + SerializableComplexObject.fromJson(emptySimpleObjectsJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, isNull); + expect(complexObject.anObject.anInt, isNull); + expect(complexObject.anObject.aDouble, isNull); + expect(complexObject.anObject.aListOfStrings, isNull); + expect(complexObject.anObject.aListOfInts, isNull); + expect(complexObject.anObject.aListOfDoubles, isNull); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, isNull); + expect(complexObject.aListOfObjects[i].anInt, isNull); + expect(complexObject.aListOfObjects[i].aDouble, isNull); + expect(complexObject.aListOfObjects[i].aListOfStrings, isNull); + expect(complexObject.aListOfObjects[i].aListOfInts, isNull); + expect(complexObject.aListOfObjects[i].aListOfDoubles, isNull); + } + }); + + test('Unexpected properties are ignored', () { + final complexObject = + SerializableComplexObject.fromJson(unexpectedPropertiesJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, "Blah, blah, blah."); + expect(complexObject.anObject.anInt, 1); + expect(complexObject.anObject.aDouble, 1.0); + expect(complexObject.anObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.anObject.aListOfInts, [1, 2, 3]); + expect(complexObject.anObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, "Blah, blah, blah."); + expect(complexObject.aListOfObjects[i].anInt, i + 1); + expect(complexObject.aListOfObjects[i].aDouble, 1.0); + expect(complexObject.aListOfObjects[i].aListOfStrings, + ['one', 'two', 'three']); + expect(complexObject.aListOfObjects[i].aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfObjects[i].aListOfDoubles, [1.0, 2.0, 3.0]); + } + }); + }); + + group('BuiltComplexObject unit tests', () { + test('Typical object is converted correctly', () { + final complexObject = serializers.deserializeWith( + BuiltComplexObject.serializer, typicalObjectJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, "Blah, blah, blah."); + expect(complexObject.anObject.anInt, 1); + expect(complexObject.anObject.aDouble, 1.0); + expect(complexObject.anObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.anObject.aListOfInts, [1, 2, 3]); + expect(complexObject.anObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, "Blah, blah, blah."); + expect(complexObject.aListOfObjects[i].anInt, i + 1); + expect(complexObject.aListOfObjects[i].aDouble, 1.0); + expect(complexObject.aListOfObjects[i].aListOfStrings, + ['one', 'two', 'three']); + expect(complexObject.aListOfObjects[i].aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfObjects[i].aListOfDoubles, [1.0, 2.0, 3.0]); + } + }); + + test('Empty object results in null fields', () { + final complexObject = + serializers.deserializeWith(BuiltComplexObject.serializer, emptyJson); + + expect(complexObject.aString, isNull); + expect(complexObject.anInt, isNull); + expect(complexObject.aDouble, isNull); + expect(complexObject.anObject, isNull); + expect(complexObject.aListOfStrings, isNull); + expect(complexObject.aListOfInts, isNull); + expect(complexObject.aListOfDoubles, isNull); + expect(complexObject.aListOfObjects, isNull); + }); + + test('Empty simple objects result in instances with null fields', () { + final complexObject = serializers.deserializeWith( + BuiltComplexObject.serializer, emptySimpleObjectsJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, isNull); + expect(complexObject.anObject.anInt, isNull); + expect(complexObject.anObject.aDouble, isNull); + expect(complexObject.anObject.aListOfStrings, isNull); + expect(complexObject.anObject.aListOfInts, isNull); + expect(complexObject.anObject.aListOfDoubles, isNull); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, isNull); + expect(complexObject.aListOfObjects[i].anInt, isNull); + expect(complexObject.aListOfObjects[i].aDouble, isNull); + expect(complexObject.aListOfObjects[i].aListOfStrings, isNull); + expect(complexObject.aListOfObjects[i].aListOfInts, isNull); + expect(complexObject.aListOfObjects[i].aListOfDoubles, isNull); + } + }); + + test('Unexpected properties are ignored', () { + final complexObject = serializers.deserializeWith( + BuiltComplexObject.serializer, unexpectedPropertiesJson); + + expect(complexObject.aString, "Blah, blah, blah."); + expect(complexObject.anInt, 1); + expect(complexObject.aDouble, 1.0); + expect(complexObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.anObject.aString, "Blah, blah, blah."); + expect(complexObject.anObject.anInt, 1); + expect(complexObject.anObject.aDouble, 1.0); + expect(complexObject.anObject.aListOfStrings, ['one', 'two', 'three']); + expect(complexObject.anObject.aListOfInts, [1, 2, 3]); + expect(complexObject.anObject.aListOfDoubles, [1.0, 2.0, 3.0]); + expect(complexObject.aListOfObjects.length, 3); + + for (int i = 0; i < 3; i++) { + expect(complexObject.aListOfObjects[i].aString, "Blah, blah, blah."); + expect(complexObject.aListOfObjects[i].anInt, i + 1); + expect(complexObject.aListOfObjects[i].aDouble, 1.0); + expect(complexObject.aListOfObjects[i].aListOfStrings, + ['one', 'two', 'three']); + expect(complexObject.aListOfObjects[i].aListOfInts, [1, 2, 3]); + expect(complexObject.aListOfObjects[i].aListOfDoubles, [1.0, 2.0, 3.0]); + } + }); + }); +} diff --git a/jsonexample/test/main_test.dart b/jsonexample/test/main_test.dart deleted file mode 100644 index 0fc93b3bef7..00000000000 --- a/jsonexample/test/main_test.dart +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_test/flutter_test.dart'; - -void main() { - test('This test always passes.', () {}); -} diff --git a/jsonexample/test/simple_object_unit_test.dart b/jsonexample/test/simple_object_unit_test.dart new file mode 100644 index 00000000000..9a19f813fce --- /dev/null +++ b/jsonexample/test/simple_object_unit_test.dart @@ -0,0 +1,197 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:jsonexample/built_value/built_simple_object.dart'; +import 'package:jsonexample/built_value/built_value_serializers.dart'; +import 'package:jsonexample/dart_convert/converted_simple_object.dart'; +import 'package:jsonexample/json_serializable/serializable_simple_object.dart'; + +void main() { + const typicalObjectJson = { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0] + }; + + const emptyListJson = { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': [], + 'aListOfInts': [], + 'aListOfDoubles': [] + }; + + const unexpectedPropertiesJson = { + 'aString': 'Blah, blah, blah.', + 'anInt': 1, + 'aDouble': 1.0, + 'aListOfStrings': ['one', 'two', 'three'], + 'aListOfInts': [1, 2, 3], + 'aListOfDoubles': [1.0, 2.0, 3.0], + 'unexpectedProperty': 'Whoops!' + }; + + const emptyJson = {}; + + group('ConvertedSimpleObject unit tests', () { + test('Typical object is converted correctly', () { + final simpleObject = ConvertedSimpleObject.fromJson(typicalObjectJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, ['one', 'two', 'three']); + expect(simpleObject.aListOfInts, [1, 2, 3]); + expect(simpleObject.aListOfDoubles, [1.0, 2.0, 3.0]); + }); + + test('Empty object', () { + final simpleObject = ConvertedSimpleObject.fromJson(emptyJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, isNull); + expect(simpleObject.anInt, isNull); + expect(simpleObject.aDouble, isNull); + expect(simpleObject.aListOfStrings, isNull); + expect(simpleObject.aListOfInts, isNull); + expect(simpleObject.aListOfDoubles, isNull); + }); + + test('Empty lists', () { + final simpleObject = ConvertedSimpleObject.fromJson(emptyListJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, []); + expect(simpleObject.aListOfInts, []); + expect(simpleObject.aListOfDoubles, []); + }); + + test('Extra properties', () { + final simpleObject = + ConvertedSimpleObject.fromJson(unexpectedPropertiesJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, ['one', 'two', 'three']); + expect(simpleObject.aListOfInts, [1, 2, 3]); + expect(simpleObject.aListOfDoubles, [1.0, 2.0, 3.0]); + }); + }); + + group('SerializableSimpleObject unit tests', () { + test('Typical object is converted correctly', () { + final simpleObject = SerializableSimpleObject.fromJson(typicalObjectJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, ['one', 'two', 'three']); + expect(simpleObject.aListOfInts, [1, 2, 3]); + expect(simpleObject.aListOfDoubles, [1.0, 2.0, 3.0]); + }); + + test('Empty object results in null fields', () { + final simpleObject = SerializableSimpleObject.fromJson(emptyJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, isNull); + expect(simpleObject.anInt, isNull); + expect(simpleObject.aDouble, isNull); + expect(simpleObject.aListOfStrings, isNull); + expect(simpleObject.aListOfInts, isNull); + expect(simpleObject.aListOfDoubles, isNull); + }); + + test('Empty lists are converted as empty lists', () { + final simpleObject = SerializableSimpleObject.fromJson(emptyListJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, []); + expect(simpleObject.aListOfInts, []); + expect(simpleObject.aListOfDoubles, []); + }); + + test('Unexpected properties are ignored', () { + final simpleObject = + SerializableSimpleObject.fromJson(unexpectedPropertiesJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, ['one', 'two', 'three']); + expect(simpleObject.aListOfInts, [1, 2, 3]); + expect(simpleObject.aListOfDoubles, [1.0, 2.0, 3.0]); + }); + }); + + group('BuiltSimpleObject unit tests', () { + test('Typical object is converted correctly', () { + final simpleObject = serializers.deserializeWith( + BuiltSimpleObject.serializer, typicalObjectJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, ['one', 'two', 'three']); + expect(simpleObject.aListOfInts, [1, 2, 3]); + expect(simpleObject.aListOfDoubles, [1.0, 2.0, 3.0]); + }); + + test('Empty object results in null fields', () { + final simpleObject = + serializers.deserializeWith(BuiltSimpleObject.serializer, emptyJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, isNull); + expect(simpleObject.anInt, isNull); + expect(simpleObject.aDouble, isNull); + expect(simpleObject.aListOfStrings, isNull); + expect(simpleObject.aListOfInts, isNull); + expect(simpleObject.aListOfDoubles, isNull); + }); + + test('Empty lists are converted as empty lists', () { + final simpleObject = serializers.deserializeWith( + BuiltSimpleObject.serializer, emptyListJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, []); + expect(simpleObject.aListOfInts, []); + expect(simpleObject.aListOfDoubles, []); + }); + + test('Unexpected properties are ignored', () { + final simpleObject = serializers.deserializeWith( + BuiltSimpleObject.serializer, unexpectedPropertiesJson); + + expect(simpleObject, isNotNull); + expect(simpleObject.aString, "Blah, blah, blah."); + expect(simpleObject.anInt, 1); + expect(simpleObject.aDouble, 1.0); + expect(simpleObject.aListOfStrings, ['one', 'two', 'three']); + expect(simpleObject.aListOfInts, [1, 2, 3]); + expect(simpleObject.aListOfDoubles, [1.0, 2.0, 3.0]); + }); + }); +} diff --git a/jsonexample/test/widget_tests_test.dart b/jsonexample/test/widget_tests_test.dart new file mode 100644 index 00000000000..6b1e3f87ee2 --- /dev/null +++ b/jsonexample/test/widget_tests_test.dart @@ -0,0 +1,199 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:jsonexample/dart_convert/converted_simple_object.dart'; +import 'package:jsonexample/dart_convert/converted_complex_object.dart'; +import 'package:jsonexample/widgets.dart'; + +void main() { + group('SimpleObjectView widget test', () { + testWidgets('Typical object is displayed correctly', + (WidgetTester tester) async { + final simpleObject = ConvertedSimpleObject( + aString: 'Blah, blah, blah', + anInt: 1, + aDouble: 1.0, + aListOfStrings: ['one', 'two', 'three'], + aListOfInts: [1, 2, 3], + aListOfDoubles: [1.0, 2.0, 3.0], + ); + + await tester.pumpWidget( + MaterialApp( + home: SimpleObjectView(simpleObject), + ), + ); + + expect(find.text('"Blah, blah, blah"'), findsOneWidget); + expect(find.text('1'), findsOneWidget); + expect(find.text('1.0'), findsOneWidget); + expect(find.text('["one", "two", "three"]'), findsOneWidget); + expect(find.text('[1, 2, 3]'), findsOneWidget); + expect(find.text('[1.0, 2.0, 3.0]'), findsOneWidget); + }); + + testWidgets('Empty lists are displayed as brackets', + (WidgetTester tester) async { + final simpleObject = ConvertedSimpleObject( + aString: 'Blah, blah, blah', + anInt: 1, + aDouble: 1.0, + aListOfStrings: [], + aListOfInts: [], + aListOfDoubles: [], + ); + + await tester.pumpWidget( + MaterialApp( + home: SimpleObjectView(simpleObject), + ), + ); + + expect(find.text('[]'), findsNWidgets(3)); + }); + + testWidgets('Null values are displayed as NULL', + (WidgetTester tester) async { + final simpleObject = ConvertedSimpleObject( + aString: null, + anInt: null, + aDouble: null, + aListOfStrings: null, + aListOfInts: null, + aListOfDoubles: null, + ); + + await tester.pumpWidget( + MaterialApp( + home: SimpleObjectView(simpleObject), + ), + ); + + expect(find.text('NULL'), findsNWidgets(6)); + }); + }); + + group('ComplexObjectView widget test', () { + testWidgets('Typical object is displayed correctly', + (WidgetTester tester) async { + final complexObject = ConvertedComplexObject( + aString: 'Blah, blah, blah', + anInt: 1, + aDouble: 1.0, + aListOfStrings: ['one', 'two', 'three'], + aListOfInts: [1, 2, 3], + aListOfDoubles: [1.0, 2.0, 3.0], + anObject: ConvertedSimpleObject( + aString: "Child 1", + anInt: 101, + aDouble: 101.0, + aListOfStrings: ['1011', '1012', '1013'], + aListOfInts: [1011, 1012, 1013], + aListOfDoubles: [1011.0, 1012.0, 1013.0], + ), + aListOfObjects: [ + ConvertedSimpleObject( + aString: "Child 2", + anInt: 102, + aDouble: 102.0, + aListOfStrings: ['1021', '1022', '1023'], + aListOfInts: [1021, 1022, 1023], + aListOfDoubles: [1021.0, 1022.0, 1023.0], + ), + ConvertedSimpleObject( + aString: "Child 3", + anInt: 103, + aDouble: 103.0, + aListOfStrings: ['1031', '1032', '1033'], + aListOfInts: [1031, 1032, 1033], + aListOfDoubles: [1031.0, 1032.0, 1033.0], + ), + ConvertedSimpleObject( + aString: "Child 4", + anInt: 104, + aDouble: 104.0, + aListOfStrings: ['1041', '1042', '1043'], + aListOfInts: [1041, 1042, 1043], + aListOfDoubles: [1041.0, 1042.0, 1043.0], + ), + ], + ); + + await tester.pumpWidget( + MaterialApp( + home: ComplexObjectView(complexObject), + ), + ); + + expect(find.text('"Blah, blah, blah"'), findsOneWidget); + expect(find.text('1'), findsOneWidget); + expect(find.text('1.0'), findsOneWidget); + expect(find.text('["one", "two", "three"]'), findsOneWidget); + expect(find.text('[1, 2, 3]'), findsOneWidget); + expect(find.text('[1.0, 2.0, 3.0]'), findsOneWidget); + + for (int i = 1; i <= 4; i++) { + expect(find.text('"Child $i"'), findsOneWidget); + expect(find.text('10$i'), findsOneWidget); + expect(find.text('10$i.0'), findsOneWidget); + expect(find.text('["10${i}1", "10${i}2", "10${i}3"]'), findsOneWidget); + expect(find.text('[10${i}1, 10${i}2, 10${i}3]'), findsOneWidget); + expect(find.text('[10${i}1.0, 10${i}2.0, 10${i}3.0]'), findsOneWidget); + } + }); + + testWidgets('Empty lists are displayed as brackets', + (WidgetTester tester) async { + final complexObject = ConvertedComplexObject( + aString: 'Blah, blah, blah', + anInt: 1, + aDouble: 1.0, + aListOfStrings: [], + aListOfInts: [], + aListOfDoubles: [], + anObject: ConvertedSimpleObject( + aString: "Child 1", + anInt: 101, + aDouble: 101.0, + aListOfStrings: ['1011', '1012', '1013'], + aListOfInts: [1011, 1012, 1013], + aListOfDoubles: [1011.0, 1012.0, 1013.0], + ), + aListOfObjects: [], + ); + + await tester.pumpWidget( + MaterialApp( + home: ComplexObjectView(complexObject), + ), + ); + + expect(find.text('[]'), findsNWidgets(4)); + }); + + testWidgets('Null values are displayed as NULL', + (WidgetTester tester) async { + final complexObject = ConvertedComplexObject( + aString: null, + anInt: null, + aDouble: null, + aListOfStrings: null, + aListOfInts: null, + aListOfDoubles: null, + anObject: null, + aListOfObjects: null, + ); + + await tester.pumpWidget( + MaterialApp( + home: ComplexObjectView(complexObject), + ), + ); + + expect(find.text('NULL'), findsNWidgets(8)); + }); + }); +} From 90237a46b72bd4af9210c32ec106f434a58bc4e8 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Wed, 27 Jun 2018 16:28:18 -0700 Subject: [PATCH 09/15] Adding shrine. --- shrine/.gitignore | 9 + shrine/.metadata | 8 + shrine/README.md | 45 ++ shrine/android/.gitignore | 10 + shrine/android/app/build.gradle | 51 ++ .../android/app/src/main/AndroidManifest.xml | 39 ++ .../example/flutter/shrine/MainActivity.java | 13 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + shrine/android/build.gradle | 29 ++ shrine/android/gradle.properties | 1 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + shrine/android/gradlew | 160 +++++++ shrine/android/gradlew.bat | 90 ++++ shrine/android/settings.gradle | 15 + shrine/assets/2.0x/diamond.png | Bin 0 -> 2973 bytes shrine/assets/2.0x/slanted_menu.png | Bin 0 -> 239 bytes shrine/assets/3.0x/diamond.png | Bin 0 -> 4244 bytes shrine/assets/3.0x/slanted_menu.png | Bin 0 -> 302 bytes shrine/assets/diamond.png | Bin 0 -> 1487 bytes shrine/assets/slanted_menu.png | Bin 0 -> 149 bytes shrine/fonts/Rubik-Medium.ttf | Bin 0 -> 143696 bytes shrine/fonts/Rubik-Regular.ttf | Bin 0 -> 140732 bytes shrine/ios/.gitignore | 45 ++ shrine/ios/Flutter/AppFrameworkInfo.plist | 26 ++ shrine/ios/Flutter/Debug.xcconfig | 1 + shrine/ios/Flutter/Release.xcconfig | 1 + shrine/ios/Runner.xcodeproj/project.pbxproj | 438 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++++ .../contents.xcworkspacedata | 7 + shrine/ios/Runner/AppDelegate.h | 6 + shrine/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ shrine/ios/Runner/Base.lproj/Main.storyboard | 26 ++ shrine/ios/Runner/Info.plist | 45 ++ shrine/ios/Runner/main.m | 9 + shrine/lib/app.dart | 124 +++++ shrine/lib/backdrop.dart | 291 ++++++++++++ shrine/lib/category_menu_page.dart | 81 ++++ shrine/lib/colors.dart | 27 ++ shrine/lib/home.dart | 35 ++ shrine/lib/login.dart | 111 +++++ shrine/lib/main.dart | 31 ++ shrine/lib/model/app_state_model.dart | 106 +++++ shrine/lib/model/product.dart | 48 ++ shrine/lib/model/products_repository.dart | 288 ++++++++++++ shrine/lib/shopping_cart.dart | 271 +++++++++++ shrine/lib/supplemental/asymmetric_view.dart | 95 ++++ .../lib/supplemental/cut_corners_border.dart | 139 ++++++ shrine/lib/supplemental/product_card.dart | 88 ++++ shrine/lib/supplemental/product_columns.dart | 87 ++++ shrine/pubspec.yaml | 66 +++ shrine/shrine.iml | 14 + shrine/shrine_android.iml | 27 ++ shrine/test/widget_test.dart | 7 + 83 files changed, 3336 insertions(+) create mode 100644 shrine/.gitignore create mode 100644 shrine/.metadata create mode 100644 shrine/README.md create mode 100644 shrine/android/.gitignore create mode 100644 shrine/android/app/build.gradle create mode 100644 shrine/android/app/src/main/AndroidManifest.xml create mode 100644 shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java create mode 100644 shrine/android/app/src/main/res/drawable/launch_background.xml create mode 100644 shrine/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 shrine/android/app/src/main/res/values/styles.xml create mode 100644 shrine/android/build.gradle create mode 100644 shrine/android/gradle.properties create mode 100644 shrine/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 shrine/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 shrine/android/gradlew create mode 100644 shrine/android/gradlew.bat create mode 100644 shrine/android/settings.gradle create mode 100644 shrine/assets/2.0x/diamond.png create mode 100755 shrine/assets/2.0x/slanted_menu.png create mode 100644 shrine/assets/3.0x/diamond.png create mode 100755 shrine/assets/3.0x/slanted_menu.png create mode 100644 shrine/assets/diamond.png create mode 100644 shrine/assets/slanted_menu.png create mode 100755 shrine/fonts/Rubik-Medium.ttf create mode 100755 shrine/fonts/Rubik-Regular.ttf create mode 100644 shrine/ios/.gitignore create mode 100644 shrine/ios/Flutter/AppFrameworkInfo.plist create mode 100644 shrine/ios/Flutter/Debug.xcconfig create mode 100644 shrine/ios/Flutter/Release.xcconfig create mode 100644 shrine/ios/Runner.xcodeproj/project.pbxproj create mode 100644 shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 shrine/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 shrine/ios/Runner/AppDelegate.h create mode 100644 shrine/ios/Runner/AppDelegate.m create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 shrine/ios/Runner/Base.lproj/Main.storyboard create mode 100644 shrine/ios/Runner/Info.plist create mode 100644 shrine/ios/Runner/main.m create mode 100644 shrine/lib/app.dart create mode 100644 shrine/lib/backdrop.dart create mode 100644 shrine/lib/category_menu_page.dart create mode 100644 shrine/lib/colors.dart create mode 100644 shrine/lib/home.dart create mode 100644 shrine/lib/login.dart create mode 100644 shrine/lib/main.dart create mode 100644 shrine/lib/model/app_state_model.dart create mode 100644 shrine/lib/model/product.dart create mode 100644 shrine/lib/model/products_repository.dart create mode 100644 shrine/lib/shopping_cart.dart create mode 100644 shrine/lib/supplemental/asymmetric_view.dart create mode 100644 shrine/lib/supplemental/cut_corners_border.dart create mode 100644 shrine/lib/supplemental/product_card.dart create mode 100644 shrine/lib/supplemental/product_columns.dart create mode 100644 shrine/pubspec.yaml create mode 100644 shrine/shrine.iml create mode 100644 shrine/shrine_android.iml create mode 100644 shrine/test/widget_test.dart diff --git a/shrine/.gitignore b/shrine/.gitignore new file mode 100644 index 00000000000..dee655cc42e --- /dev/null +++ b/shrine/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ + +.flutter-plugins diff --git a/shrine/.metadata b/shrine/.metadata new file mode 100644 index 00000000000..82403edb59b --- /dev/null +++ b/shrine/.metadata @@ -0,0 +1,8 @@ +# 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: c7ea3ca377e909469c68f2ab878a5bc53d3cf66b + channel: beta diff --git a/shrine/README.md b/shrine/README.md new file mode 100644 index 00000000000..f6ab8efb8f6 --- /dev/null +++ b/shrine/README.md @@ -0,0 +1,45 @@ +# shrine + +A sample shopping app that uses Material widgets in its UI and +[`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to manage the +state of its shopping cart. + +## Goals for this sample + +* Show how to customize Flutter's Material widgets to produce a unique design + for an app. +* Show how to use `scoped_model` to manage an app's state and access it across + different routes and in different widgets. + +This is a modified version of the app featured in Flutter's +[Material codelabs](https://codelabs.developers.google.com/?cat=Flutter). + +## The important bits + +### `/model/app_state_model.dart` + +The model object representing the state of the app. It holds the available +products as well as what's in the shopping cart. + +### `/supplemental` + +A bunch of widgets that customize Material to produce the look and feel of the +app. + +### `shopping_cart.dart` + +The shopping cart widgets. They access the app state model via +`ScopedModelDescendant`, display the contents of the shopping cart, and allow +the user to edit them. + +## Questions/issues + +If you have a general question about any of the techniques you see in the\ +sample, the best places to go are: + +* [The FlutterDev Google Group](https://groups.google.com/forum/#!forum/flutter-dev) +* [The Flutter Gitter channel](https://gitter.im/flutter/flutter) +* [StackOverflow](https://stackoverflow.com/questions/tagged/flutter) + +If you run into an issue with the sample itself, please file an issue +in the [main Flutter repo](https://github.com/flutter/flutter/issues). diff --git a/shrine/android/.gitignore b/shrine/android/.gitignore new file mode 100644 index 00000000000..65b7315af1b --- /dev/null +++ b/shrine/android/.gitignore @@ -0,0 +1,10 @@ +*.iml +*.class +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +GeneratedPluginRegistrant.java diff --git a/shrine/android/app/build.gradle b/shrine/android/app/build.gradle new file mode 100644 index 00000000000..2c16fbafe40 --- /dev/null +++ b/shrine/android/app/build.gradle @@ -0,0 +1,51 @@ +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.") +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 27 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.flutter.shrine" + minSdkVersion 16 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + 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 { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' +} diff --git a/shrine/android/app/src/main/AndroidManifest.xml b/shrine/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..f288ca93ff9 --- /dev/null +++ b/shrine/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + diff --git a/shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java b/shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java new file mode 100644 index 00000000000..f9c24edde73 --- /dev/null +++ b/shrine/android/app/src/main/java/com/example/flutter/shrine/MainActivity.java @@ -0,0 +1,13 @@ +package com.example.flutter.shrine; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/shrine/android/app/src/main/res/drawable/launch_background.xml b/shrine/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000000..304732f8842 --- /dev/null +++ b/shrine/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/shrine/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/shrine/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/shrine/android/app/src/main/res/values/styles.xml b/shrine/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..00fa4417cfb --- /dev/null +++ b/shrine/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/shrine/android/build.gradle b/shrine/android/build.gradle new file mode 100644 index 00000000000..447688755cf --- /dev/null +++ b/shrine/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/shrine/android/gradle.properties b/shrine/android/gradle.properties new file mode 100644 index 00000000000..8bd86f68051 --- /dev/null +++ b/shrine/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/shrine/android/gradle/wrapper/gradle-wrapper.jar b/shrine/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ8zCNKueM5c!$)^mKpZNR!eIlFST57ePGQcqCqedAQ3UaUEzpjM--5V4YO zY22VxQm%$2NDnwfK+jkz=i2>NjAM6&P1DdcO<*Xs1-lzdXWn#LGSxwhPH7N%D8-zCgpFWt@`LgNYI+Fh^~nSiQmwH0^>E>*O$47MqfQza@Ce z1wBw;igLc#V2@y-*~Hp?jA1)+MYYyAt|DV_8RQCrRY@sAviO}wv;3gFdO>TE(=9o? z=S(r=0oT`w24=ihA=~iFV5z$ZG74?rmYn#eanx(!Hkxcr$*^KRFJKYYB&l6$WVsJ^ z-Iz#HYmE)Da@&seqG1fXsTER#adA&OrD2-T(z}Cwby|mQf{0v*v3hq~pzF`U`jenT z=XHXeB|fa?Ws$+9ADO0rco{#~+`VM?IXg7N>M0w1fyW1iiKTA@p$y zSiAJ%-Mg{m>&S4r#Tw@?@7ck}#oFo-iZJCWc`hw_J$=rw?omE{^tc59ftd`xq?jzf zo0bFUI=$>O!45{!c4?0KsJmZ#$vuYpZLo_O^oHTmmLMm0J_a{Nn`q5tG1m=0ecv$T z5H7r0DZGl6be@aJ+;26EGw9JENj0oJ5K0=^f-yBW2I0jqVIU};NBp*gF7_KlQnhB6 z##d$H({^HXj@il`*4^kC42&3)(A|tuhs;LygA-EWFSqpe+%#?6HG6}mE215Z4mjO2 zY2^?5$<8&k`O~#~sSc5Fy`5hg5#e{kG>SAbTxCh{y32fHkNryU_c0_6h&$zbWc63T z7|r?X7_H!9XK!HfZ+r?FvBQ$x{HTGS=1VN<>Ss-7M3z|vQG|N}Frv{h-q623@Jz*@ ziXlZIpAuY^RPlu&=nO)pFhML5=ut~&zWDSsn%>mv)!P1|^M!d5AwmSPIckoY|0u9I zTDAzG*U&5SPf+@c_tE_I!~Npfi$?gX(kn=zZd|tUZ_ez(xP+)xS!8=k(<{9@<+EUx zYQgZhjn(0qA#?~Q+EA9oh_Jx5PMfE3#KIh#*cFIFQGi)-40NHbJO&%ZvL|LAqU=Rw zf?Vr4qkUcKtLr^g-6*N-tfk+v8@#Lpl~SgKyH!+m9?T8B>WDWK22;!i5&_N=%f{__ z-LHb`v-LvKqTJZCx~z|Yg;U_f)VZu~q7trb%C6fOKs#eJosw&b$nmwGwP;Bz`=zK4 z>U3;}T_ptP)w=vJaL8EhW;J#SHA;fr13f=r#{o)`dRMOs-T;lp&Toi@u^oB_^pw=P zp#8Geo2?@!h2EYHY?L;ayT}-Df0?TeUCe8Cto{W0_a>!7Gxmi5G-nIIS;X{flm2De z{SjFG%knZoVa;mtHR_`*6)KEf=dvOT3OgT7C7&-4P#4X^B%VI&_57cBbli()(%zZC?Y0b;?5!f22UleQ=9h4_LkcA!Xsqx@q{ko&tvP_V@7epFs}AIpM{g??PA>U(sk$Gum>2Eu zD{Oy{$OF%~?B6>ixQeK9I}!$O0!T3#Ir8MW)j2V*qyJ z8Bg17L`rg^B_#rkny-=<3fr}Y42+x0@q6POk$H^*p3~Dc@5uYTQ$pfaRnIT}Wxb;- zl!@kkZkS=l)&=y|21veY8yz$t-&7ecA)TR|=51BKh(@n|d$EN>18)9kSQ|GqP?aeM ztXd9C&Md$PPF*FVs*GhoHM2L@D$(Qf%%x zwQBUt!jM~GgwluBcwkgwQ!249uPkNz3u@LSYZgmpHgX|P#8!iKk^vSKZ;?)KE$92d z2U>y}VWJ0&zjrIqddM3dz-nU%>bL&KU%SA|LiiUU7Ka|c=jF|vQ1V)Jz`JZe*j<5U6~RVuBEVJoY~ z&GE+F$f>4lN=X4-|9v*5O*Os>>r87u z!_1NSV?_X&HeFR1fOFb8_P)4lybJ6?1BWK`Tv2;4t|x1<#@17UO|hLGnrB%nu)fDk zfstJ4{X4^Y<8Lj<}g2^kksSefQTMuTo?tJLCh zC~>CR#a0hADw!_Vg*5fJwV{~S(j8)~sn>Oyt(ud2$1YfGck77}xN@3U_#T`q)f9!2 zf>Ia;Gwp2_C>WokU%(z2ec8z94pZyhaK+e>3a9sj^-&*V494;p9-xk+u1Jn#N_&xs z59OI2w=PuTErv|aNcK*>3l^W*p3}fjXJjJAXtBA#%B(-0--s;1U#f8gFYW!JL+iVG zV0SSx5w8eVgE?3Sg@eQv)=x<+-JgpVixZQNaZr}3b8sVyVs$@ndkF5FYKka@b+YAh z#nq_gzlIDKEs_i}H4f)(VQ!FSB}j>5znkVD&W0bOA{UZ7h!(FXrBbtdGA|PE1db>s z$!X)WY)u#7P8>^7Pjjj-kXNBuJX3(pJVetTZRNOnR5|RT5D>xmwxhAn)9KF3J05J; z-Mfb~dc?LUGqozC2p!1VjRqUwwDBnJhOua3vCCB-%ykW_ohSe?$R#dz%@Gym-8-RA zjMa_SJSzIl8{9dV+&63e9$4;{=1}w2=l+_j_Dtt@<(SYMbV-18&%F@Zl7F_5! z@xwJ0wiDdO%{}j9PW1(t+8P7Ud79yjY>x>aZYWJL_NI?bI6Y02`;@?qPz_PRqz(7v``20`- z033Dy|4;y6di|>cz|P-z|6c&3f&g^OAt8aN0Zd&0yZ>dq2aFCsE<~Ucf$v{sL=*++ zBxFSa2lfA+Y%U@B&3D=&CBO&u`#*nNc|PCY7XO<}MnG0VR764XrHtrb5zwC*2F!Lp zE<~Vj0;z!S-|3M4DFxuQ=`ShTf28<9p!81(0hFbGNqF%0gg*orez9!qt8e%o@Yfl@ zhvY}{@3&f??}7<`p>FyU;7?VkKbh8_=csozU=|fH&szgZ{=NDCylQ>EH^x5!K3~-V z)_2Y>0uJ`Z0Pb58y`RL+&n@m9tJ)O<%q#&u#DAIt+-rRt0eSe1MTtMl@W)H$b3D)@ z*A-1bUgZI)>HdcI4&W>P4W5{-j=s5p5`cbQ+{(g0+RDnz!TR^mxSLu_y#SDVKrj8i zA^hi6>jMGM;`$9Vfb-Yf!47b)Ow`2OKtNB=z|Kxa$5O}WPo;(Dc^`q(7X8kkeFyO8 z{XOq^07=u|7*P2`m;>PIFf=i80MKUxsN{d2cX0M+REsE*20+WQ79T9&cqT>=I_U% z{=8~^Isg(Nzo~`4iQfIb_#CVCD>#5h>=-Z#5dH}WxYzn%0)GAm6L2WdUdP=0_h>7f z(jh&7%1i(ZOn+}D8$iGK4Vs{pmHl_w4Qm-46H9>4^{3dz^DZDh+dw)6Xd@CpQNK$j z{CU;-cmpK=egplZ3y3%y=sEnCJ^eYVKXzV8H2_r*fJ*%*B;a1_lOpt6)IT1IAK2eB z{rie|uDJUrbgfUE>~C>@RO|m5ex55F{=~Bb4Cucp{ok7Yf9V}QuZ`#Gc|WaqsQlK- zKaV)iMRR__&Ak2Z=IM9R9g5$WM4u{a^C-7uX*!myEym z#_#p^T!P~#Dx$%^K>Y_nj_3J*E_LwJ60-5Xu=LkJAwcP@|0;a&+|+ZX`Jbj9P5;T% z|KOc}4*#4o{U?09`9Hz`Xo-I!P=9XfIrr*MQ}y=$!qgv?_J38^bNb4kM&_OVg^_=Eu-qG5U(fw0KMgH){C8pazq~51rN97hf#20-7=aK0)N|UM H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/shrine/android/gradle/wrapper/gradle-wrapper.properties b/shrine/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..aa901e1e0db --- /dev/null +++ b/shrine/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-4.1-all.zip diff --git a/shrine/android/gradlew b/shrine/android/gradlew new file mode 100755 index 00000000000..9d82f789151 --- /dev/null +++ b/shrine/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/shrine/android/gradlew.bat b/shrine/android/gradlew.bat new file mode 100644 index 00000000000..aec99730b4e --- /dev/null +++ b/shrine/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/shrine/android/settings.gradle b/shrine/android/settings.gradle new file mode 100644 index 00000000000..5a2f14fb18f --- /dev/null +++ b/shrine/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/shrine/assets/2.0x/diamond.png b/shrine/assets/2.0x/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..602e2ea51662fc069c8064cb24a8ee7267fb5f71 GIT binary patch literal 2973 zcmV;O3u5$%P)I+wIH=(eH9$FL#;!LB1J&39fzqC2BuWV6PhWY6 zcVh2m?>%>SZ*J};vD`m$&i9?~eCIpA^Ss~vHk8=#te!j9ap*$JW=51nHmEbLf)dis zsB~|2y>F-KN(ltz1my{fi)YSEJ$box2P5q6gu?a%lksOJy<~)b6L}1e=SPs zy2^lW1yW{JyCpyhr%#`#bc8AyW8)1PW>DH;z_*L#L~o_o%INmYfzCynYHNeBWn!0f z8;~N8CpQ#kD=lA|xTl;BzIk7Yj z(xPx-w&(UxNU1Rb1DjimL?mxA!4NHq#bNWVw+HtX&YU?SmP9PRX+XR=p1TyHlwrCK z(<`Hd{+mklw#xdt_w;3bMPtxrgj=s3C~~`R>W&Sj0P(t94^pO-0*nEoa@r_6rP-B! zf4x}NI~;7HTL`5_d&bmYm>rtuc272INkTxpIqqkOLN*y~WLPG(&J=l0d0pK{W*ba~ zoJ83>gwgo`rp-YA&7m+kI4^tJtp;TRD<&YAax_23y$;9fi$X0huuS%+rVYEj?D+8u zM&-TDt8VaBP>FmK?S3M*%|?Ytcz;38w1oF1LqL}13VQCZlCuWD8*7GZ_F;f z>+aIh(q!H>jG8vZtFHgx@01Lf1v^jZD`45DFs5wJcex(Xm#MS{5PnQCg;WEKd8$Bk zic8B2RrP^~R*k12j! z83;0oO3SJm0>3aQ>zAxuM~-|#W%3Qolu9E56~J#a zzGPGxyep6treF-&B(v!xZ1icGMkxIUW_7EE_dfz1#4;fsqcY9|V5R9_yqgSe5?o`IJ--A2o78X-&;lNeQ!cH#8W0v>EaK=i;Rjo|Pn-F2^wy=ERNq zp#Sx0S(7*N{>%StZaxd=%3!R^**78}d@{&P`p)i}{ik{V9sJL@k;7M=y>Mv(+<>=m zI`U8&k_cTunbav9;oFd55*x25;awV4*c@dh$GtddcEw66y7pWEOO1(MLvj_`*7_ATYhPtW-e{M9-j=VQ7?`Cqn zgTH(Z)#{^-H;o?Qd8?-8y2_87!PP$BK}?_5)Pk;*&BM)ZQ5XIB%hC3Z&9GVn21Z?> zL@J2}gZC@~2q*Az^fW*@#q*knk+s~1s^NW32;4{);~r9=Hy8e!SF0N84(a(CK=5+Z z28bTi3qj%V@b%#D^!)x#=jY~r5$_nU2zFA^gpJ`@fe(fT5H3*V_wVB`aH25#Zb7#D z9+BUVIl=HooSx}A3mHz8C7pw>E8wI62xmG54_b+(BfLTb?bnKOb4PQT{{9rWrrn44 zviW*D(XTfu8hn4z^Htgqkg~&vTd|@1NEPZz;b;kl)_2kUGY1#O7#!*R2CjK9^G~Oy z4PB{W>Ig$XxJ*@`ZZD3(-|OTt1IhQ{JX)aV_a~Z#$?LF3csG+Ix-^kfD<&YkgDDbQ zf#hSJkAC1}*&NWaR^j)T>-l;*E+BgXffh=oAL}cD9;;kw z`>g@LPg#7B6om;(8h4I!DU>{J#<GsF zt>Z6O3*x8C9P|2Q0-X=-vKQ36nQ@ z5S}WR%(TGex()k=FbgnK_u{JXw$-*R0m8qG!FTe6zESRiynLnY1wG$xnuCt7Z*M{` z#-;1wgXEB?!8=%&Oro46K)6yYjmjWq$t| zk#C-384#TD44(>@AZ?3o4u9mmN)+L4fx+1af9w`(TDxjl z2864CljRf)d8$iYBsVp5`mF8WfjP)jVOu%qk(Q9*gMuigCDA;qd5vN#N@guw@Hz|< ze3LMGC68FNqBB+K)S(Z>v*^_ofG4&V_9vb14X$g$fzT`3H2!)kxJorZFfCWaO z+dUm13mZA+#{taL4Hi@yR_QSyT}PtuS;caN2AwE-sd>7>bZk7wSEuuM02^r)N#F-AQE| zAl%>zpRWOch!-nF5!a^EpJEORzSExvqq0x zgVC$g8;63H*dx*HtsQxuh-`)pRVKe`RK5@Q=^kavbp)Ly3In&ZB=j zrRqv{n)Df>b^u@ApTfrYkxH9NDP3L~j8UF6cCXD4wFmN$)SuxPJ)_b_DefVg0EXzm zHWId(*Xw}94%hmuX8;3XPs0p6V>b6ZhPqx|GO7(t=RZD~nK3pKv`6KssVvib_8vPX zT=~`VWT(A8L(~oppzJZ^HQ`!_EPl&O*psRw8EKyZq7T=?o#R}Jr2I4)o$QXzK3OuV zf%tzPCnjWMOa+}SOXU8tKtOOTsj|J5YQ5OK)oN5b4yWVMU@+8N5eW2)V4VK~(dD1g Tw7?@l00000NkvXXu0mjf8c(bT literal 0 HcmV?d00001 diff --git a/shrine/assets/2.0x/slanted_menu.png b/shrine/assets/2.0x/slanted_menu.png new file mode 100755 index 0000000000000000000000000000000000000000..5958055e4240b0a808b94fc451cbf36303c3725b GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^DnKm3!3HEJ?TGgSQY`6?zK#qG8~eHcB(ehe%RF5i zLp*qsOD>yl(P$J9envt zAz+0dmuilpwU(I_(_%%3wE_#OJ$p|-^f}XWZns|SEpvsZ0%q=i{~r(F7m_zoWGUh? nW}bX`0jJ`G=6{C&RS3j3^P6C3h literal 0 HcmV?d00001 diff --git a/shrine/assets/3.0x/diamond.png b/shrine/assets/3.0x/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..78af7cd6483c27597aac3ab9693d0de0b89a4717 GIT binary patch literal 4244 zcmV;F5Nq#=P)?2XDJhad@kjO)VB%9qk{U&%x zvblHe?%sR%k#Nu1GkfR%XXgLszw_UJ{+WL+C2_n;oX#K0jJ`t{J1dUO#@rO8X<8uv7i)Vxu}axayow`%cMM2gu)qQjASz^R~9+)u8x{vg9U5`%STka#NnFF z2z?#M=@Au3E+jjlBoYS=T z(828%)Ze8_%LKz1qt$EIKMj5GP?uIyGlN38l?)q{lexFy(EC=ifX2+fN+(WCt8P48 z2I1Ule(gz6BPC_oqejkIvt~`mDr!s@%+!K{-pwt6HBetySw(bm)Jxw!Z(#qQtlF}r z*$R4070lI6XLf**_aKzQ2#7t7m(G(irIs)jLHnIi7`Yaz>axz6dUtdy$+SFL;U5^^7dDd!ua+a~-d}SLWmm zJ9pMcTULZ`iluaw+dZ5GLLWvX6hglsY0`vb5{jsU^kC2q?!d|B>M4$bTs_=q;D!ZL z?8yIKYlv-w8aQ9KVM_f{roFJz z)FTM$tGaKR^uzL+n*ZtHrX-w^9H{aSikTCayOJ7t_Yqc0;<7^o$iO3EI+CS3(vz- z_Ed%6yAUbpP3`ODnwnOq?3;_7u13Ph-6C#)X9L44ik$9&RetXiB3vz4#3QD(v{Wh{ z<9;q;p%AjDvevhtI|xPTJkCp1t$#k1q=%I}VJgdy7maa04M9acEs01lGiJ<4-?sM8 zZ!jX?B_squ5Fa9vG^?`C|D+yns=_P%-p3%Ex#(?Kp9lFq%#l`eHo9y*YGQN~0EF`rwb2_PoEANnFxR=Iy78;Gxw}daSAh!! zgNn{(Ap&!llqdx>Q%aB7Y_z1(=X*yJr<(yPe7?014)+Nj*JBNRc-6_4Koxge>EUv? zreKN+3WmZNxs?$%HiC-kZOnE#X7gJk!0lEj5YA?}m#%;cZ_s6ok#PZ;ZoS6s9-@b< zDwrwx`J-t|Yc-@iQm+E6?(NBt$oTTQU2$98)1@iS2o-*Rjon5k;0^nwUekEc$2137 zHFsl)aJvYm$mRM$Fc91dOX56HK@Njm@99l?kN>ORzgG{pyTdnly`Rx^TOmeHtv;{p zeD22L?kp|bPG;OBmuoUMOss=YbYD^+U>~fc;1{`mSkB-EZ1nht(wYrISt>KO3>l|K zj{-cC#;pf<-(Q_O_#6h|e85|kWWvsgTk~fc688XWmxYu;$pVP0d#;g)yCJEdFs2Tq z_35=pAxeU&dju1tc}m8aG%-B@Yi`cQk3RZZX}#@bzvs}Qe+|pYxfq!)1#l*fUk_kI z$I8lD|5F`XJnix9*Sps}P2V(^U=E|bOibxXEHvDTEl0Y(p^lAM^Iv`vmZV#)ZZHb# zMp~i ziX5)Zm~&mBUM<~JRp*y z=9#tOpi{lw?54z#SF9%#%uwD?6AJH&PJ-bX*t~XUTfh##QNJiQ9IS|DZ9%=7?wdPf z;>5l(lV1^YNE_|xwtKa3x(J5vD5TUTUehMzqLa3hMB+U!M=AOyU{BfEHJruyh8S(C$D`cON_2Is;aC}w4aHKSe z-T}+tv|Sxu5SE4%V!^U0Q>KV4j__jL`hLc^alM#KUImk#jH-@I^VdXruT0%}qo!as z`g{j48|`Aob!-GLw~?*?K2X{*uP6UM)^uVS9@vY-eIU(`WCOaUV0h&fwZ2!e81}xf zAxalu_!bCpdH|3wFfy6V7qN=I+*n!b{euWcfe8h}k!*J9c8r`8N`WpZV`(xYWpfG& zdh9w5SLak_Wn8^?>7Q>i_-ldEj61a8;rW^sDTtdqo-eRo@C)T$HD$!Lx25#~Rag(m z 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 literal 0 HcmV?d00001 diff --git a/shrine/assets/diamond.png b/shrine/assets/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..1978a0a5ab02b2a48c1c24ac5ba3c7d86bdade28 GIT binary patch literal 1487 zcmV;=1u*)FP){Trg3ZmY8H3ot!wiln)Q2EKzbEQdRG#&_}^YWt<=3Li`!X-dC>gNBoN2j$Y@{14 zIOEOo`jj25t*x_0Iq{OOph(HCQ-wH6AfUU-OnlpNK^S9l&fAgA0g?e&h3Dd>ueTQz z#2IafUjTxMc~NHeVWz4FNr3>9oXhuhI-TFp_LjUVWC{2WPgNGcxGP7e>I!<=1$iS{YK+(`4c@o|Cm!#O7U`^Q4ArN)#LW|Y|Y8p zpvUA7TCFkHXWdOuZX+R#y{L1=xJ_w1X;;P zFzSTcqgd3LPy)}eYX{+1h4fEGvuGt0ACK7`<#u~c!FE0BU`C3NYv3=mKC;zf+34{K z2b56|y5cu&v^F(0xq}5R&dhEQOnnM=zjqA{t_x;Q`l3vQc4Zy$lEn6O3=Y1b@${$7 z=^O!~7l=oJWlf(OexCT1CL9@7WMMDG#S8c4mzTe(&#}-);&01%9fhN9SHXE59d^3W zN<4R2t!7oQV|Y^;FFh-mTy1Rk3qY_GUM}$}7`b6=_A>8r>Mtt+f?|x#&h0~MwGfYN zyx8R$I8VGzT8-!fdKN3$`-Q3=ARfvF#-(qG_e(HB`AAB_8e1@@C4rE0d|d2) zq~Ryxac6zSc!waFFHzP!%uU&gp=?S_s{XLM`?{~4?>H!srrzEeF0mRoBDRS2&Z$Rz zgBZu?LrIpSbC#hLUD@n~QVph4{<-j|B3*7bnU5tgyOf_HF?bnR@rT8U3 zu#Ar9#>U*~$%#Wq`=gLYV$)^-(lqAG!}#j0N$aMtbbH7L+qDs2cW)CPDuoP$0{%QP zF`AZ?OqsYHzjU0|H{-b)KO806bu$X=#hCcjWh3L`LGLrhgfD9e)8amtVPZvzKY#b!vaFVrMOkKxUl@OFp-Hp`MJY^;th|&2GZW!ivv&EJwGk~1fQlS p!h^6vUUZW$%gbB%_d~d0{{^B2>;U+b8dd-R002ovPDHLkV1ken!iN9= literal 0 HcmV?d00001 diff --git a/shrine/assets/slanted_menu.png b/shrine/assets/slanted_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c80d2d47ea24c1901ebf78a093cb3d15f41f06f7 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&J!3HGrh2HJ~QY`6?zK#qG8~eHcB(eheKAtX) zAsV8|B^R&#J@25BkeE_-r|{_^#+*|#H*h`@`hEJtcE;&<48+n^R5wgK%xL?-lPf2s x*)8C}WZ4@h9v(e&;E79Fg0l3N{*Upt42#wY$0!C>@B__d@O1TaS?83{1OWOnGwuKY literal 0 HcmV?d00001 diff --git a/shrine/fonts/Rubik-Medium.ttf b/shrine/fonts/Rubik-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..c0b7965f98f7d2ff48001143fd1bec03620a9fc9 GIT binary patch literal 143696 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 z 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 literal 0 HcmV?d00001 diff --git a/shrine/fonts/Rubik-Regular.ttf b/shrine/fonts/Rubik-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..fb52c8eec809c567a13e829772e38273ebfc1291 GIT binary patch literal 140732 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

6n*xK`kB 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�BVv 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 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/shrine/ios/Flutter/Debug.xcconfig b/shrine/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000000..592ceee85b8 --- /dev/null +++ b/shrine/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/shrine/ios/Flutter/Release.xcconfig b/shrine/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000000..592ceee85b8 --- /dev/null +++ b/shrine/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/shrine/ios/Runner.xcodeproj/project.pbxproj b/shrine/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..62a37cf8ca4 --- /dev/null +++ b/shrine/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,438 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 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 = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + 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 = ""; }; + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; 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 = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 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 = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + 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 = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + 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 */, + 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 2D5378261FAA1A9400D5DBA9 /* flutter_assets 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\" 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 = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m 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 */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutter.shrine; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutter.shrine; + PRODUCT_NAME = "$(TARGET_NAME)"; + 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 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..1d526a16ed0 --- /dev/null +++ b/shrine/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000000..1263ac84b10 --- /dev/null +++ b/shrine/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrine/ios/Runner.xcworkspace/contents.xcworkspacedata b/shrine/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..1d526a16ed0 --- /dev/null +++ b/shrine/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/shrine/ios/Runner/AppDelegate.h b/shrine/ios/Runner/AppDelegate.h new file mode 100644 index 00000000000..36e21bbf9cf --- /dev/null +++ b/shrine/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/shrine/ios/Runner/AppDelegate.m b/shrine/ios/Runner/AppDelegate.m new file mode 100644 index 00000000000..59a72e90be1 --- /dev/null +++ b/shrine/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..d36b1fab2d9 --- /dev/null +++ b/shrine/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/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/shrine/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/shrine/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000000..89c2725b70f --- /dev/null +++ b/shrine/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/shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard b/shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000000..f2e259c7c93 --- /dev/null +++ b/shrine/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrine/ios/Runner/Base.lproj/Main.storyboard b/shrine/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000000..f3c28516fb3 --- /dev/null +++ b/shrine/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shrine/ios/Runner/Info.plist b/shrine/ios/Runner/Info.plist new file mode 100644 index 00000000000..bff936f4466 --- /dev/null +++ b/shrine/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + shrine + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/shrine/ios/Runner/main.m b/shrine/ios/Runner/main.m new file mode 100644 index 00000000000..dff6597e451 --- /dev/null +++ b/shrine/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/shrine/lib/app.dart b/shrine/lib/app.dart new file mode 100644 index 00000000000..68264f17626 --- /dev/null +++ b/shrine/lib/app.dart @@ -0,0 +1,124 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import 'backdrop.dart'; +import 'colors.dart'; +import 'home.dart'; +import 'login.dart'; +import 'category_menu_page.dart'; +import 'model/product.dart'; +import 'supplemental/cut_corners_border.dart'; + +class ShrineApp extends StatefulWidget { + @override + _ShrineAppState createState() => _ShrineAppState(); +} + +class _ShrineAppState extends State { + Category _currentCategory = Category.all; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Shrine', + home: Backdrop( + currentCategory: _currentCategory, + frontLayer: HomePage(category: _currentCategory), + backLayer: CategoryMenuPage( + currentCategory: _currentCategory, + onCategoryTap: _onCategoryTap, + ), + frontTitle: Text('SHRINE'), + backTitle: Text('MENU'), + ), + initialRoute: '/login', + onGenerateRoute: _getRoute, + theme: _kShrineTheme, + ); + } + + /// Function to call when a [Category] is tapped. + void _onCategoryTap(Category category) { + setState(() { + _currentCategory = category; + }); + } +} + +Route _getRoute(RouteSettings settings) { + if (settings.name == '/login') { + return MaterialPageRoute( + settings: settings, + builder: (BuildContext context) => LoginPage(), + fullscreenDialog: true, + ); + } + + return null; +} + +final ThemeData _kShrineTheme = _buildShrineTheme(); + +IconThemeData _customIconTheme(IconThemeData original) { + return original.copyWith(color: kShrineBrown900); +} + +ThemeData _buildShrineTheme() { + final ThemeData base = ThemeData.light(); + return base.copyWith( + accentColor: kShrineBrown900, + primaryColor: kShrinePink100, + buttonColor: kShrinePink100, + scaffoldBackgroundColor: kShrineBackgroundWhite, + cardColor: kShrineBackgroundWhite, + textSelectionColor: kShrinePink100, + errorColor: kShrineErrorRed, + buttonTheme: ButtonThemeData( + textTheme: ButtonTextTheme.accent, + ), + primaryIconTheme: base.iconTheme.copyWith(color: kShrineBrown900), + inputDecorationTheme: InputDecorationTheme( + border: CutCornersBorder(), + ), + textTheme: _buildShrineTextTheme(base.textTheme), + primaryTextTheme: _buildShrineTextTheme(base.primaryTextTheme), + accentTextTheme: _buildShrineTextTheme(base.accentTextTheme), + iconTheme: _customIconTheme(base.iconTheme), + ); +} + +TextTheme _buildShrineTextTheme(TextTheme base) { + return base + .copyWith( + headline: base.headline.copyWith( + fontWeight: FontWeight.w500, + ), + title: base.title.copyWith(fontSize: 18.0), + caption: base.caption.copyWith( + fontWeight: FontWeight.w400, + fontSize: 14.0, + ), + body2: base.body2.copyWith( + fontWeight: FontWeight.w500, + fontSize: 16.0, + ), + ) + .apply( + fontFamily: 'Rubik', + displayColor: kShrineBrown900, + bodyColor: kShrineBrown900, + ); +} diff --git a/shrine/lib/backdrop.dart b/shrine/lib/backdrop.dart new file mode 100644 index 00000000000..c96227aad39 --- /dev/null +++ b/shrine/lib/backdrop.dart @@ -0,0 +1,291 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:meta/meta.dart'; + +import 'model/product.dart'; +import 'login.dart'; +import 'shopping_cart.dart'; + +const double _kFlingVelocity = 2.0; + +class _FrontLayer extends StatelessWidget { + const _FrontLayer({ + Key key, + this.onTap, + this.child, + }) : super(key: key); + + final VoidCallback onTap; + final Widget child; + + @override + Widget build(BuildContext context) { + return Material( + elevation: 16.0, + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(46.0)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: onTap, + child: Container( + height: 40.0, + alignment: AlignmentDirectional.centerStart, + ), + ), + Expanded( + child: child, + ), + ], + ), + ); + } +} + +class _BackdropTitle extends AnimatedWidget { + final Function onPress; + final Widget frontTitle; + final Widget backTitle; + + const _BackdropTitle({ + Key key, + Listenable listenable, + this.onPress, + @required this.frontTitle, + @required this.backTitle, + }) : assert(frontTitle != null), + assert(backTitle != null), + super(key: key, listenable: listenable); + + @override + Widget build(BuildContext context) { + final Animation animation = this.listenable; + + return DefaultTextStyle( + style: Theme.of(context).primaryTextTheme.title, + softWrap: false, + overflow: TextOverflow.ellipsis, + child: Row(children: [ + // branded icon + SizedBox( + width: 72.0, + child: IconButton( + padding: EdgeInsets.only(right: 8.0), + onPressed: this.onPress, + icon: Stack(children: [ + Opacity( + opacity: animation.value, + child: ImageIcon(AssetImage('assets/slanted_menu.png')), + ), + FractionalTranslation( + translation: Tween( + begin: Offset.zero, + end: Offset(1.0, 0.0), + ).evaluate(animation), + child: ImageIcon(AssetImage('assets/diamond.png')), + ) + ]), + ), + ), + // Here, we do a custom cross fade between backTitle and frontTitle. + // This makes a smooth animation between the two texts. + Stack( + children: [ + Opacity( + opacity: CurvedAnimation( + parent: ReverseAnimation(animation), + curve: Interval(0.5, 1.0), + ).value, + child: FractionalTranslation( + translation: Tween( + begin: Offset.zero, + end: Offset(0.5, 0.0), + ).evaluate(animation), + child: backTitle, + ), + ), + Opacity( + opacity: CurvedAnimation( + parent: animation, + curve: Interval(0.5, 1.0), + ).value, + child: FractionalTranslation( + translation: Tween( + begin: Offset(-0.25, 0.0), + end: Offset.zero, + ).evaluate(animation), + child: frontTitle, + ), + ), + ], + ) + ]), + ); + } +} + +/// Builds a Backdrop. +/// +/// A Backdrop widget has two layers, front and back. The front layer is shown +/// by default, and slides down to show the back layer, from which a user +/// can make a selection. The user can also configure the titles for when the +/// front or back layer is showing. +class Backdrop extends StatefulWidget { + final Category currentCategory; + final Widget frontLayer; + final Widget backLayer; + final Widget frontTitle; + final Widget backTitle; + + const Backdrop({ + @required this.currentCategory, + @required this.frontLayer, + @required this.backLayer, + @required this.frontTitle, + @required this.backTitle, + }) : assert(currentCategory != null), + assert(frontLayer != null), + assert(backLayer != null), + assert(frontTitle != null), + assert(backTitle != null); + + @override + _BackdropState createState() => _BackdropState(); +} + +class _BackdropState extends State + with SingleTickerProviderStateMixin { + final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop'); + AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: Duration(milliseconds: 300), + value: 1.0, + vsync: this, + ); + } + + @override + void didUpdateWidget(Backdrop old) { + super.didUpdateWidget(old); + + if (widget.currentCategory != old.currentCategory) { + _toggleBackdropLayerVisibility(); + } else if (!_frontLayerVisible) { + _controller.fling(velocity: _kFlingVelocity); + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + bool get _frontLayerVisible { + final AnimationStatus status = _controller.status; + return status == AnimationStatus.completed || + status == AnimationStatus.forward; + } + + void _toggleBackdropLayerVisibility() { + _controller.fling( + velocity: _frontLayerVisible ? -_kFlingVelocity : _kFlingVelocity); + } + + Widget _buildStack(BuildContext context, BoxConstraints constraints) { + const double layerTitleHeight = 48.0; + final Size layerSize = constraints.biggest; + final double layerTop = layerSize.height - layerTitleHeight; + + Animation layerAnimation = RelativeRectTween( + begin: RelativeRect.fromLTRB( + 0.0, layerTop, 0.0, layerTop - layerSize.height), + end: RelativeRect.fromLTRB(0.0, 0.0, 0.0, 0.0), + ).animate(_controller.view); + + return Stack( + key: _backdropKey, + children: [ + widget.backLayer, + PositionedTransition( + rect: layerAnimation, + child: _FrontLayer( + onTap: _toggleBackdropLayerVisibility, + child: widget.frontLayer, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + var appBar = AppBar( + brightness: Brightness.light, + elevation: 0.0, + titleSpacing: 0.0, + title: _BackdropTitle( + listenable: _controller.view, + onPress: _toggleBackdropLayerVisibility, + frontTitle: widget.frontTitle, + backTitle: widget.backTitle, + ), + actions: [ + IconButton( + icon: const Icon(Icons.shopping_cart), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => ShoppingCartPage()), + ); + }, + ), + IconButton( + icon: const Icon(Icons.search), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (BuildContext context) => LoginPage()), + ); + }, + ), + IconButton( + icon: const Icon(Icons.tune), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (BuildContext context) => LoginPage()), + ); + }, + ), + ], + ); + return Scaffold( + appBar: appBar, + body: LayoutBuilder( + builder: _buildStack, + ), + ); + } +} diff --git a/shrine/lib/category_menu_page.dart b/shrine/lib/category_menu_page.dart new file mode 100644 index 00000000000..aaed26a6fc8 --- /dev/null +++ b/shrine/lib/category_menu_page.dart @@ -0,0 +1,81 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:meta/meta.dart'; + +import 'colors.dart'; +import 'model/product.dart'; + +class CategoryMenuPage extends StatelessWidget { + final Category currentCategory; + final ValueChanged onCategoryTap; + final List _categories = Category.values; + + const CategoryMenuPage({ + Key key, + @required this.currentCategory, + @required this.onCategoryTap, + }) : assert(currentCategory != null), + assert(onCategoryTap != null); + + Widget _buildCategory(Category category, BuildContext context) { + final categoryString = + category.toString().replaceAll('Category.', '').toUpperCase(); + final ThemeData theme = Theme.of(context); + return GestureDetector( + onTap: () => onCategoryTap(category), + child: category == currentCategory + ? Column( + children: [ + SizedBox(height: 16.0), + Text( + categoryString, + style: theme.textTheme.body2, + textAlign: TextAlign.center, + ), + SizedBox(height: 14.0), + Container( + width: 70.0, + height: 2.0, + color: Color(0xFFEAA4A4), + ), + ], + ) + : Padding( + padding: EdgeInsets.symmetric(vertical: 16.0), + child: Text( + categoryString, + style: theme.textTheme.body2 + .copyWith(color: kShrineBrown900.withAlpha(153)), + textAlign: TextAlign.center, + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + padding: EdgeInsets.only(top: 40.0), + color: kShrinePink100, + child: ListView( + children: _categories + .map((Category c) => _buildCategory(c, context)) + .toList()), + ), + ); + } +} diff --git a/shrine/lib/colors.dart b/shrine/lib/colors.dart new file mode 100644 index 00000000000..07018344ba7 --- /dev/null +++ b/shrine/lib/colors.dart @@ -0,0 +1,27 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +const kShrinePink50 = const Color(0xFFFEEAE6); +const kShrinePink100 = const Color(0xFFFEDBD0); +const kShrinePink300 = const Color(0xFFFBB8AC); + +const kShrineBrown900 = const Color(0xFF442B2D); +const kShrineBrown600 = const Color(0xFF7D4F52); + +const kShrineErrorRed = const Color(0xFFC5032B); + +const kShrineSurfaceWhite = const Color(0xFFFFFBFA); +const kShrineBackgroundWhite = Colors.white; diff --git a/shrine/lib/home.dart b/shrine/lib/home.dart new file mode 100644 index 00000000000..ba5dd370d01 --- /dev/null +++ b/shrine/lib/home.dart @@ -0,0 +1,35 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import 'model/app_state_model.dart'; +import 'model/product.dart'; +import 'supplemental/asymmetric_view.dart'; + +class HomePage extends StatelessWidget { + final Category category; + + const HomePage({this.category: Category.all}); + + @override + Widget build(BuildContext context) { + return ScopedModelDescendant( + builder: (context, child, model) => AsymmetricView( + products: model.getProducts(), + ), + ); + } +} diff --git a/shrine/lib/login.dart b/shrine/lib/login.dart new file mode 100644 index 00000000000..030ee79b3df --- /dev/null +++ b/shrine/lib/login.dart @@ -0,0 +1,111 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import 'colors.dart'; + +class LoginPage extends StatefulWidget { + @override + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + final _usernameController = TextEditingController(); + final _passwordController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: ListView( + padding: EdgeInsets.symmetric(horizontal: 24.0), + children: [ + SizedBox(height: 80.0), + Column( + children: [ + Image.asset('assets/diamond.png'), + SizedBox(height: 16.0), + Text( + 'SHRINE', + style: Theme.of(context).textTheme.headline, + ), + ], + ), + SizedBox(height: 120.0), + PrimaryColorOverride( + color: kShrineBrown900, + child: TextField( + controller: _usernameController, + decoration: InputDecoration( + labelText: 'Username', + ), + ), + ), + const SizedBox(height: 12.0), + PrimaryColorOverride( + color: kShrineBrown900, + child: TextField( + controller: _passwordController, + decoration: InputDecoration( + labelText: 'Password', + ), + ), + ), + ButtonBar( + children: [ + FlatButton( + child: Text('CANCEL'), + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(7.0)), + ), + onPressed: () { + _usernameController.clear(); + _passwordController.clear(); + }, + ), + RaisedButton( + child: Text('NEXT'), + elevation: 8.0, + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(7.0)), + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + ], + ), + ), + ); + } +} + +class PrimaryColorOverride extends StatelessWidget { + const PrimaryColorOverride({Key key, this.color, this.child}) + : super(key: key); + + final Color color; + final Widget child; + + @override + Widget build(BuildContext context) { + return Theme( + child: child, + data: Theme.of(context).copyWith(primaryColor: color), + ); + } +} diff --git a/shrine/lib/main.dart b/shrine/lib/main.dart new file mode 100644 index 00000000000..ce4a46e11b8 --- /dev/null +++ b/shrine/lib/main.dart @@ -0,0 +1,31 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import 'app.dart'; +import 'model/app_state_model.dart'; + +void main() { + AppStateModel model = AppStateModel(); + model.loadProducts(); + + runApp( + ScopedModel( + model: model, + child: ShrineApp(), + ), + ); +} diff --git a/shrine/lib/model/app_state_model.dart b/shrine/lib/model/app_state_model.dart new file mode 100644 index 00000000000..e5ba4b2acbc --- /dev/null +++ b/shrine/lib/model/app_state_model.dart @@ -0,0 +1,106 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:scoped_model/scoped_model.dart'; +import 'product.dart'; +import 'products_repository.dart'; + +double _shippingCostPerItem = 7.0; +double _salesTaxRate = 0.06; + +class AppStateModel extends Model { + // All the available products. + List _availableProducts; + + // The currently selected category of products. + Category _selectedCategory = Category.all; + + // The IDs and quantities of products currently in the cart. + Map _productsInCart = {}; + + Map get productsInCart => Map.from(_productsInCart); + + // Total number of items in the cart. + int get totalCartQuantity => _productsInCart.values.fold(0, (v, e) => v + e); + + Category get selectedCategory => _selectedCategory; + + // Totaled prices of the items in the cart. + double get subtotalCost => _productsInCart.keys + .map((id) => _availableProducts[id].price * _productsInCart[id]) + .fold(0.0, (sum, e) => sum + e); + + // Total shipping cost for the items in the cart. + double get shippingCost => + _shippingCostPerItem * + _productsInCart.values.fold(0.0, (sum, e) => sum + e); + + // Sales tax for the items in the cart + double get tax => subtotalCost * _salesTaxRate; + + // Total cost to order everything in the cart. + double get totalCost => subtotalCost + shippingCost + tax; + + // Returns a copy of the list of available products, filtered by category. + List getProducts() { + if (_availableProducts == null) return List(); + + if (_selectedCategory == Category.all) { + return List.from(_availableProducts); + } else { + return _availableProducts.where((p) => p.category == _selectedCategory); + } + } + + // Adds a product to the cart. + void addProductToCart(int productId) { + if (!_productsInCart.containsKey(productId)) { + _productsInCart[productId] = 1; + } else { + _productsInCart[productId]++; + } + + notifyListeners(); + } + + // Removes an item from the cart. + void removeItemFromCart(int productId) { + if (_productsInCart.containsKey(productId)) { + if (_productsInCart[productId] == 1) { + _productsInCart.remove(productId); + } else { + _productsInCart[productId] -= 1; + } + } + + notifyListeners(); + } + + // Returns the Product instance matching the provided id. + Product getProductById(int id) { + return _availableProducts.firstWhere((p) => p.id == id); + } + + // Removes everything from the cart. + void clearCart() { + _productsInCart.clear(); + notifyListeners(); + } + + // Loads the list of available products from the repo. + void loadProducts() { + _availableProducts = ProductsRepository.loadProducts(); + notifyListeners(); + } +} diff --git a/shrine/lib/model/product.dart b/shrine/lib/model/product.dart new file mode 100644 index 00000000000..ffedcc32174 --- /dev/null +++ b/shrine/lib/model/product.dart @@ -0,0 +1,48 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/foundation.dart'; + +enum Category { + all, + accessories, + clothing, + home, +} + +class Product { + const Product({ + @required this.category, + @required this.id, + @required this.isFeatured, + @required this.name, + @required this.price, + }) : assert(category != null), + assert(id != null), + assert(isFeatured != null), + assert(name != null), + assert(price != null); + + final Category category; + final int id; + final bool isFeatured; + final String name; + final int price; + + String get assetName => '$id-0.jpg'; + String get assetPackage => 'shrine_images'; + + @override + String toString() => '$name (id=$id)'; +} diff --git a/shrine/lib/model/products_repository.dart b/shrine/lib/model/products_repository.dart new file mode 100644 index 00000000000..01caa04b351 --- /dev/null +++ b/shrine/lib/model/products_repository.dart @@ -0,0 +1,288 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'product.dart'; + +class ProductsRepository { + static List loadProducts() { + return const [ + Product( + category: Category.accessories, + id: 0, + isFeatured: true, + name: 'Vagabond sack', + price: 120, + ), + Product( + category: Category.accessories, + id: 1, + isFeatured: true, + name: 'Stella sunglasses', + price: 58, + ), + Product( + category: Category.accessories, + id: 2, + isFeatured: false, + name: 'Whitney belt', + price: 35, + ), + Product( + category: Category.accessories, + id: 3, + isFeatured: true, + name: 'Garden strand', + price: 98, + ), + Product( + category: Category.accessories, + id: 4, + isFeatured: false, + name: 'Strut earrings', + price: 34, + ), + Product( + category: Category.accessories, + id: 5, + isFeatured: false, + name: 'Varsity socks', + price: 12, + ), + Product( + category: Category.accessories, + id: 6, + isFeatured: false, + name: 'Weave keyring', + price: 16, + ), + Product( + category: Category.accessories, + id: 7, + isFeatured: true, + name: 'Gatsby hat', + price: 40, + ), + Product( + category: Category.accessories, + id: 8, + isFeatured: true, + name: 'Shrug bag', + price: 198, + ), + Product( + category: Category.home, + id: 9, + isFeatured: true, + name: 'Gilt desk trio', + price: 58, + ), + Product( + category: Category.home, + id: 10, + isFeatured: false, + name: 'Copper wire rack', + price: 18, + ), + Product( + category: Category.home, + id: 11, + isFeatured: false, + name: 'Soothe ceramic set', + price: 28, + ), + Product( + category: Category.home, + id: 12, + isFeatured: false, + name: 'Hurrahs tea set', + price: 34, + ), + Product( + category: Category.home, + id: 13, + isFeatured: true, + name: 'Blue stone mug', + price: 18, + ), + Product( + category: Category.home, + id: 14, + isFeatured: true, + name: 'Rainwater tray', + price: 27, + ), + Product( + category: Category.home, + id: 15, + isFeatured: true, + name: 'Chambray napkins', + price: 16, + ), + Product( + category: Category.home, + id: 16, + isFeatured: true, + name: 'Succulent planters', + price: 16, + ), + Product( + category: Category.home, + id: 17, + isFeatured: false, + name: 'Quartet table', + price: 175, + ), + Product( + category: Category.home, + id: 18, + isFeatured: true, + name: 'Kitchen quattro', + price: 129, + ), + Product( + category: Category.clothing, + id: 19, + isFeatured: false, + name: 'Clay sweater', + price: 48, + ), + Product( + category: Category.clothing, + id: 20, + isFeatured: false, + name: 'Sea tunic', + price: 45, + ), + Product( + category: Category.clothing, + id: 21, + isFeatured: false, + name: 'Plaster tunic', + price: 38, + ), + Product( + category: Category.clothing, + id: 22, + isFeatured: false, + name: 'White pinstripe shirt', + price: 70, + ), + Product( + category: Category.clothing, + id: 23, + isFeatured: false, + name: 'Chambray shirt', + price: 70, + ), + Product( + category: Category.clothing, + id: 24, + isFeatured: true, + name: 'Seabreeze sweater', + price: 60, + ), + Product( + category: Category.clothing, + id: 25, + isFeatured: false, + name: 'Gentry jacket', + price: 178, + ), + Product( + category: Category.clothing, + id: 26, + isFeatured: false, + name: 'Navy trousers', + price: 74, + ), + Product( + category: Category.clothing, + id: 27, + isFeatured: true, + name: 'Walter henley (white)', + price: 38, + ), + Product( + category: Category.clothing, + id: 28, + isFeatured: true, + name: 'Surf and perf shirt', + price: 48, + ), + Product( + category: Category.clothing, + id: 29, + isFeatured: true, + name: 'Ginger scarf', + price: 98, + ), + Product( + category: Category.clothing, + id: 30, + isFeatured: true, + name: 'Ramona crossover', + price: 68, + ), + Product( + category: Category.clothing, + id: 31, + isFeatured: false, + name: 'Chambray shirt', + price: 38, + ), + Product( + category: Category.clothing, + id: 32, + isFeatured: false, + name: 'Classic white collar', + price: 58, + ), + Product( + category: Category.clothing, + id: 33, + isFeatured: true, + name: 'Cerise scallop tee', + price: 42, + ), + Product( + category: Category.clothing, + id: 34, + isFeatured: false, + name: 'Shoulder rolls tee', + price: 27, + ), + Product( + category: Category.clothing, + id: 35, + isFeatured: false, + name: 'Grey slouch tank', + price: 24, + ), + Product( + category: Category.clothing, + id: 36, + isFeatured: false, + name: 'Sunshirt dress', + price: 58, + ), + Product( + category: Category.clothing, + id: 37, + isFeatured: true, + name: 'Fine lines tee', + price: 58, + ), + ]; + } +} diff --git a/shrine/lib/shopping_cart.dart b/shrine/lib/shopping_cart.dart new file mode 100644 index 00000000000..c1aa1e4c840 --- /dev/null +++ b/shrine/lib/shopping_cart.dart @@ -0,0 +1,271 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import 'colors.dart'; +import 'model/app_state_model.dart'; +import 'model/product.dart'; + +const _leftColumnWidth = 60.0; + +class ShoppingCartPage extends StatefulWidget { + @override + _ShoppingCartPageState createState() => _ShoppingCartPageState(); +} + +class _ShoppingCartPageState extends State { + List _createShoppingCartRows(AppStateModel model) { + return model.productsInCart.keys + .map( + (id) => ShoppingCartRow( + product: model.getProductById(id), + quantity: model.productsInCart[id], + onPressed: () { + model.removeItemFromCart(id); + }, + ), + ) + .toList(); + } + + @override + Widget build(BuildContext context) { + final localTheme = Theme.of(context); + + return Scaffold( + backgroundColor: kShrinePink100, + body: SafeArea( + child: Container( + child: ScopedModelDescendant( + builder: (context, child, model) { + return Stack( + children: [ + ListView( + children: [ + Row( + children: [ + SizedBox( + width: _leftColumnWidth, + child: IconButton( + icon: const Icon(Icons.keyboard_arrow_down), + onPressed: () => Navigator.of(context).pop(), + ), + ), + Text( + 'CART', + style: localTheme.textTheme.subhead + .copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox(width: 16.0), + Text('${model.totalCartQuantity} ITEMS'), + ], + ), + const SizedBox(height: 16.0), + Column( + children: _createShoppingCartRows(model), + ), + ShoppingCartSummary(model: model), + const SizedBox(height: 100.0), + ], + ), + Positioned( + bottom: 16.0, + left: 16.0, + right: 16.0, + child: RaisedButton( + shape: const BeveledRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(7.0)), + ), + color: kShrinePink300, + splashColor: kShrineBrown600, + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 12.0), + child: Text('CLEAR CART'), + ), + onPressed: () { + model.clearCart(); + Navigator.of(context).pop(); + }, + ), + ), + ], + ); + }, + ), + ), + ), + ); + } +} + +class ShoppingCartSummary extends StatelessWidget { + ShoppingCartSummary({this.model}); + + final AppStateModel model; + + @override + Widget build(BuildContext context) { + final smallAmountStyle = + Theme.of(context).textTheme.body1.copyWith(color: kShrineBrown600); + final largeAmountStyle = Theme.of(context).textTheme.display1; + final formatter = NumberFormat.simpleCurrency( + decimalDigits: 2, locale: Localizations.localeOf(context).toString()); + + return Row( + children: [ + SizedBox(width: _leftColumnWidth), + Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 16.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Expanded( + child: Text('TOTAL'), + ), + Text( + formatter.format(model.totalCost), + style: largeAmountStyle, + ), + ], + ), + const SizedBox(height: 16.0), + Row( + children: [ + const Expanded( + child: Text('Subtotal:'), + ), + Text( + formatter.format(model.subtotalCost), + style: smallAmountStyle, + ), + ], + ), + const SizedBox(height: 4.0), + Row( + children: [ + const Expanded( + child: Text('Shipping:'), + ), + Text( + formatter.format(model.shippingCost), + style: smallAmountStyle, + ), + ], + ), + const SizedBox(height: 4.0), + Row( + children: [ + const Expanded( + child: Text('Tax:'), + ), + Text( + formatter.format(model.tax), + style: smallAmountStyle, + ), + ], + ), + ], + ), + ), + ), + ], + ); + } +} + +class ShoppingCartRow extends StatelessWidget { + ShoppingCartRow( + {@required this.product, @required this.quantity, this.onPressed}); + + final Product product; + final int quantity; + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + final formatter = NumberFormat.simpleCurrency( + decimalDigits: 0, locale: Localizations.localeOf(context).toString()); + final localTheme = Theme.of(context); + + return Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Row( + key: ValueKey(product.id), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: _leftColumnWidth, + child: IconButton( + icon: const Icon(Icons.remove_circle_outline), + onPressed: onPressed, + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 16.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + product.assetName, + package: product.assetPackage, + fit: BoxFit.cover, + width: 75.0, + height: 75.0, + ), + const SizedBox(width: 16.0), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Text('Quantity: $quantity'), + ), + Text('x ${formatter.format(product.price)}'), + ], + ), + Text( + product.name, + style: localTheme.textTheme.subhead + .copyWith(fontWeight: FontWeight.w600), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 16.0), + const Divider( + color: kShrineBrown900, + height: 10.0, + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/shrine/lib/supplemental/asymmetric_view.dart b/shrine/lib/supplemental/asymmetric_view.dart new file mode 100644 index 00000000000..2cbe16e80e3 --- /dev/null +++ b/shrine/lib/supplemental/asymmetric_view.dart @@ -0,0 +1,95 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import '../model/product.dart'; +import 'product_columns.dart'; + +class AsymmetricView extends StatelessWidget { + final List products; + + const AsymmetricView({Key key, this.products}); + + List _buildColumns(BuildContext context) { + if (products == null || products.isEmpty) { + return const []; + } + + /// This will return a list of columns. It will oscillate between the two + /// kinds of columns. Even cases of the index (0, 2, 4, etc) will be + /// TwoProductCardColumn and the odd cases will be OneProductCardColumn. + /// + /// Each pair of columns will advance us 3 products forward (2 + 1). That's + /// some kinda awkward math so we use _evenCasesIndex and _oddCasesIndex as + /// helpers for creating the index of the product list that will correspond + /// to the index of the list of columns. + return List.generate(_listItemCount(products.length), (int index) { + double width = .59 * MediaQuery.of(context).size.width; + Widget column; + if (index % 2 == 0) { + /// Even cases + int bottom = _evenCasesIndex(index); + column = TwoProductCardColumn( + bottom: products[bottom], + top: products.length - 1 >= bottom + 1 + ? products[bottom + 1] + : null); + width += 32.0; + } else { + /// Odd cases + column = OneProductCardColumn( + product: products[_oddCasesIndex(index)], + ); + } + return Container( + width: width, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: column, + ), + ); + }).toList(); + } + + int _evenCasesIndex(int input) { + /// The operator ~/ is a cool one. It's the truncating division operator. It + /// divides the number and if there's a remainder / decimal, it cuts it off. + /// This is like dividing and then casting the result to int. Also, it's + /// functionally equivalent to floor() in this case. + return input ~/ 2 * 3; + } + + int _oddCasesIndex(int input) { + assert(input > 0); + return (input / 2).ceil() * 3 - 1; + } + + int _listItemCount(int totalItems) { + if (totalItems % 3 == 0) { + return totalItems ~/ 3 * 2; + } else { + return (totalItems / 3).ceil() * 2 - 1; + } + } + + @override + Widget build(BuildContext context) { + return ListView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.fromLTRB(0.0, 34.0, 16.0, 44.0), + children: _buildColumns(context), + ); + } +} diff --git a/shrine/lib/supplemental/cut_corners_border.dart b/shrine/lib/supplemental/cut_corners_border.dart new file mode 100644 index 00000000000..7e29e5e6b3b --- /dev/null +++ b/shrine/lib/supplemental/cut_corners_border.dart @@ -0,0 +1,139 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:ui' show lerpDouble; + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class CutCornersBorder extends OutlineInputBorder { + const CutCornersBorder({ + BorderSide borderSide: BorderSide.none, + BorderRadius borderRadius: const BorderRadius.all(Radius.circular(2.0)), + this.cut: 7.0, + double gapPadding: 2.0, + }) : super( + borderSide: borderSide, + borderRadius: borderRadius, + gapPadding: gapPadding); + + @override + CutCornersBorder copyWith({ + BorderSide borderSide, + BorderRadius borderRadius, + double gapPadding, + double cut, + }) { + return CutCornersBorder( + borderRadius: borderRadius ?? this.borderRadius, + borderSide: borderSide ?? this.borderSide, + cut: cut ?? this.cut, + gapPadding: gapPadding ?? this.gapPadding, + ); + } + + final double cut; + + @override + ShapeBorder lerpFrom(ShapeBorder a, double t) { + if (a is CutCornersBorder) { + final CutCornersBorder outline = a; + return CutCornersBorder( + borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t), + borderSide: BorderSide.lerp(outline.borderSide, borderSide, t), + cut: cut, + gapPadding: outline.gapPadding, + ); + } + return super.lerpFrom(a, t); + } + + @override + ShapeBorder lerpTo(ShapeBorder b, double t) { + if (b is CutCornersBorder) { + final CutCornersBorder outline = b; + return CutCornersBorder( + borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t), + borderSide: BorderSide.lerp(borderSide, outline.borderSide, t), + cut: cut, + gapPadding: outline.gapPadding, + ); + } + return super.lerpTo(b, t); + } + + Path _notchedCornerPath(Rect center, + [double start = 0.0, double extent = 0.0]) { + final Path path = Path(); + if (start > 0.0 || extent > 0.0) { + path.relativeMoveTo(extent + start, center.top); + _notchedSidesAndBottom(center, path); + path..lineTo(center.left + cut, center.top)..lineTo(start, center.top); + } else { + path.moveTo(center.left + cut, center.top); + _notchedSidesAndBottom(center, path); + path.lineTo(center.left + cut, center.top); + } + return path; + } + + Path _notchedSidesAndBottom(Rect center, Path path) { + return path + ..lineTo(center.right - cut, center.top) + ..lineTo(center.right, center.top + cut) + ..lineTo(center.right, center.top + center.height - cut) + ..lineTo(center.right - cut, center.top + center.height) + ..lineTo(center.left + cut, center.top + center.height) + ..lineTo(center.left, center.top + center.height - cut) + ..lineTo(center.left, center.top + cut); + } + + @override + void paint( + Canvas canvas, + Rect rect, { + double gapStart, + double gapExtent: 0.0, + double gapPercentage: 0.0, + TextDirection textDirection, + }) { + assert(gapExtent != null); + assert(gapPercentage >= 0.0 && gapPercentage <= 1.0); + + final Paint paint = borderSide.toPaint(); + final RRect outer = borderRadius.toRRect(rect); + if (gapStart == null || gapExtent <= 0.0 || gapPercentage == 0.0) { + canvas.drawPath(_notchedCornerPath(outer.middleRect), paint); + } else { + final double extent = + lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage); + switch (textDirection) { + case TextDirection.rtl: + { + final Path path = _notchedCornerPath( + outer.middleRect, gapStart + gapPadding - extent, extent); + canvas.drawPath(path, paint); + break; + } + case TextDirection.ltr: + { + final Path path = _notchedCornerPath( + outer.middleRect, gapStart - gapPadding, extent); + canvas.drawPath(path, paint); + break; + } + } + } + } +} diff --git a/shrine/lib/supplemental/product_card.dart b/shrine/lib/supplemental/product_card.dart new file mode 100644 index 00000000000..59381446cfb --- /dev/null +++ b/shrine/lib/supplemental/product_card.dart @@ -0,0 +1,88 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import '../model/app_state_model.dart'; +import '../model/product.dart'; + +class ProductCard extends StatelessWidget { + ProductCard({this.imageAspectRatio: 33 / 49, this.product}) + : assert(imageAspectRatio == null || imageAspectRatio > 0); + + final double imageAspectRatio; + final Product product; + + static final kTextBoxHeight = 65.0; + + @override + Widget build(BuildContext context) { + final NumberFormat formatter = NumberFormat.simpleCurrency( + decimalDigits: 0, locale: Localizations.localeOf(context).toString()); + final ThemeData theme = Theme.of(context); + + final imageWidget = Image.asset( + product.assetName, + package: product.assetPackage, + fit: BoxFit.cover, + ); + + return ScopedModelDescendant( + builder: (context, child, model) => GestureDetector( + onTap: () { + model.addProductToCart(product.id); + Scaffold.of(context).showSnackBar(SnackBar( + content: + Text('${product.name} has been added to your cart.'), + )); + }, + child: child, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + AspectRatio( + aspectRatio: imageAspectRatio, + child: imageWidget, + ), + SizedBox( + height: kTextBoxHeight * MediaQuery.of(context).textScaleFactor, + width: 121.0, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + product == null ? '' : product.name, + style: theme.textTheme.button, + softWrap: false, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + SizedBox(height: 4.0), + Text( + product == null ? '' : formatter.format(product.price), + style: theme.textTheme.caption, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/shrine/lib/supplemental/product_columns.dart b/shrine/lib/supplemental/product_columns.dart new file mode 100644 index 00000000000..c12e9ebf6b9 --- /dev/null +++ b/shrine/lib/supplemental/product_columns.dart @@ -0,0 +1,87 @@ +// Copyright 2018-present the Flutter authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/material.dart'; + +import '../model/product.dart'; +import 'product_card.dart'; + +class TwoProductCardColumn extends StatelessWidget { + TwoProductCardColumn({ + this.bottom, + this.top, + }) : assert(bottom != null); + + final Product bottom, top; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + const spacerHeight = 44.0; + + double heightOfCards = (constraints.biggest.height - spacerHeight) / 2.0; + double heightOfImages = heightOfCards - ProductCard.kTextBoxHeight; + double imageAspectRatio = + (heightOfImages >= 0.0 && constraints.biggest.width > heightOfImages) + ? constraints.biggest.width / heightOfImages + : 33 / 49; + + return ListView( + children: [ + Padding( + padding: EdgeInsetsDirectional.only(start: 28.0), + child: top != null + ? ProductCard( + imageAspectRatio: imageAspectRatio, + product: top, + ) + : SizedBox( + height: heightOfCards, + ), + ), + SizedBox(height: spacerHeight), + Padding( + padding: EdgeInsetsDirectional.only(end: 28.0), + child: ProductCard( + imageAspectRatio: imageAspectRatio, + product: bottom, + ), + ), + ], + ); + }); + } +} + +class OneProductCardColumn extends StatelessWidget { + OneProductCardColumn({this.product}); + + final Product product; + + @override + Widget build(BuildContext context) { + return ListView( + reverse: true, + children: [ + SizedBox( + height: 40.0, + ), + ProductCard( + product: product, + ), + ], + ); + } +} diff --git a/shrine/pubspec.yaml b/shrine/pubspec.yaml new file mode 100644 index 00000000000..e901b7cd858 --- /dev/null +++ b/shrine/pubspec.yaml @@ -0,0 +1,66 @@ +name: shrine +description: A simple shopping app with Material and scoped_model + +dependencies: + flutter: + sdk: flutter + + cupertino_icons: ^0.1.2 + intl: 0.15.6 + scoped_model: 0.2.0 + shrine_images: 1.0.0 + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + uses-material-design: true + assets: + - assets/diamond.png + - assets/slanted_menu.png + - packages/shrine_images/0-0.jpg + - packages/shrine_images/1-0.jpg + - packages/shrine_images/2-0.jpg + - packages/shrine_images/3-0.jpg + - packages/shrine_images/4-0.jpg + - packages/shrine_images/5-0.jpg + - packages/shrine_images/6-0.jpg + - packages/shrine_images/7-0.jpg + - packages/shrine_images/8-0.jpg + - packages/shrine_images/9-0.jpg + - packages/shrine_images/10-0.jpg + - packages/shrine_images/11-0.jpg + - packages/shrine_images/12-0.jpg + - packages/shrine_images/13-0.jpg + - packages/shrine_images/14-0.jpg + - packages/shrine_images/15-0.jpg + - packages/shrine_images/16-0.jpg + - packages/shrine_images/17-0.jpg + - packages/shrine_images/18-0.jpg + - packages/shrine_images/19-0.jpg + - packages/shrine_images/20-0.jpg + - packages/shrine_images/21-0.jpg + - packages/shrine_images/22-0.jpg + - packages/shrine_images/23-0.jpg + - packages/shrine_images/24-0.jpg + - packages/shrine_images/25-0.jpg + - packages/shrine_images/26-0.jpg + - packages/shrine_images/27-0.jpg + - packages/shrine_images/28-0.jpg + - packages/shrine_images/29-0.jpg + - packages/shrine_images/30-0.jpg + - packages/shrine_images/31-0.jpg + - packages/shrine_images/32-0.jpg + - packages/shrine_images/33-0.jpg + - packages/shrine_images/34-0.jpg + - packages/shrine_images/35-0.jpg + - packages/shrine_images/36-0.jpg + - packages/shrine_images/37-0.jpg + + fonts: + - family: Rubik + fonts: + - asset: fonts/Rubik-Regular.ttf + - asset: fonts/Rubik-Medium.ttf + weight: 500 \ No newline at end of file diff --git a/shrine/shrine.iml b/shrine/shrine.iml new file mode 100644 index 00000000000..a461e815eb4 --- /dev/null +++ b/shrine/shrine.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/shrine/shrine_android.iml b/shrine/shrine_android.iml new file mode 100644 index 00000000000..b050030a1b8 --- /dev/null +++ b/shrine/shrine_android.iml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + diff --git a/shrine/test/widget_test.dart b/shrine/test/widget_test.dart new file mode 100644 index 00000000000..0fe9fbd1878 --- /dev/null +++ b/shrine/test/widget_test.dart @@ -0,0 +1,7 @@ +// This is a basic Flutter widget test. +// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter +// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to +// find child widgets in the widget tree, read text, and verify that the values of widget properties +// are correct. + +void main() {} From a9971d4a5d94df7d40e52c630c04fb68ac5d49c4 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Thu, 28 Jun 2018 08:47:47 -0700 Subject: [PATCH 10/15] Cleaning up IDE files. --- shrine/.gitignore | 8 ++++---- shrine/shrine.iml | 14 -------------- shrine/shrine_android.iml | 27 --------------------------- 3 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 shrine/shrine.iml delete mode 100644 shrine/shrine_android.iml diff --git a/shrine/.gitignore b/shrine/.gitignore index dee655cc42e..0fe1a7c4e50 100644 --- a/shrine/.gitignore +++ b/shrine/.gitignore @@ -1,9 +1,9 @@ .DS_Store .dart_tool/ - .packages .pub/ - -build/ - +.idea +.atom .flutter-plugins +build/ +*.iml diff --git a/shrine/shrine.iml b/shrine/shrine.iml deleted file mode 100644 index a461e815eb4..00000000000 --- a/shrine/shrine.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/shrine/shrine_android.iml b/shrine/shrine_android.iml deleted file mode 100644 index b050030a1b8..00000000000 --- a/shrine/shrine_android.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - From 0bb8eee7e8d571d494d655956ccfa8b0339eb245 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Fri, 29 Jun 2018 15:05:36 -0700 Subject: [PATCH 11/15] Addressing comments. --- shrine/README.md | 32 ++++++++++++++++---------------- shrine/test/main_test.dart | 1 + shrine/test/widget_test.dart | 7 ------- 3 files changed, 17 insertions(+), 23 deletions(-) create mode 100644 shrine/test/main_test.dart delete mode 100644 shrine/test/widget_test.dart diff --git a/shrine/README.md b/shrine/README.md index f6ab8efb8f6..ee1dd35b5a6 100644 --- a/shrine/README.md +++ b/shrine/README.md @@ -1,15 +1,15 @@ -# shrine +# Shrine A sample shopping app that uses Material widgets in its UI and -[`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to manage the -state of its shopping cart. +[`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to +manage the state of its shopping cart. -## Goals for this sample +## Goals -* Show how to customize Flutter's Material widgets to produce a unique design - for an app. -* Show how to use `scoped_model` to manage an app's state and access it across - different routes and in different widgets. +* Show how to customize Flutter's Material Compoenent widgets to produce + a unique design for an app. +* Show how to use `scoped_model` to manage an app's state and access it + across different routes and in different widgets. This is a modified version of the app featured in Flutter's [Material codelabs](https://codelabs.developers.google.com/?cat=Flutter). @@ -18,24 +18,24 @@ This is a modified version of the app featured in Flutter's ### `/model/app_state_model.dart` -The model object representing the state of the app. It holds the available -products as well as what's in the shopping cart. +The model object representing the state of the app. It holds the +available products as well as what's in the shopping cart. ### `/supplemental` -A bunch of widgets that customize Material to produce the look and feel of the -app. +A bunch of widgets that customize Material to produce the look and feel +of the app. ### `shopping_cart.dart` The shopping cart widgets. They access the app state model via -`ScopedModelDescendant`, display the contents of the shopping cart, and allow -the user to edit them. +`ScopedModelDescendant`, display the contents of the shopping cart, and +allow the user to edit them. ## Questions/issues -If you have a general question about any of the techniques you see in the\ -sample, the best places to go are: +If you have a general question about any of the techniques you see in +the sample, the best places to go are: * [The FlutterDev Google Group](https://groups.google.com/forum/#!forum/flutter-dev) * [The Flutter Gitter channel](https://gitter.im/flutter/flutter) diff --git a/shrine/test/main_test.dart b/shrine/test/main_test.dart new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/shrine/test/main_test.dart @@ -0,0 +1 @@ +void main() {} diff --git a/shrine/test/widget_test.dart b/shrine/test/widget_test.dart deleted file mode 100644 index 0fe9fbd1878..00000000000 --- a/shrine/test/widget_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -// This is a basic Flutter widget test. -// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter -// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to -// find child widgets in the widget tree, read text, and verify that the values of widget properties -// are correct. - -void main() {} From 0944168382e42456e56e2b38b111e8191a41a454 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Tue, 3 Jul 2018 11:12:47 -0700 Subject: [PATCH 12/15] Addressing comments. --- shrine/README.md | 2 +- shrine/lib/app.dart | 2 +- shrine/lib/backdrop.dart | 2 +- shrine/lib/model/app_state_model.dart | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/shrine/README.md b/shrine/README.md index ee1dd35b5a6..32f685266a5 100644 --- a/shrine/README.md +++ b/shrine/README.md @@ -6,7 +6,7 @@ manage the state of its shopping cart. ## Goals -* Show how to customize Flutter's Material Compoenent widgets to produce +* Show how to customize Flutter's Material Component widgets to produce a unique design for an app. * Show how to use `scoped_model` to manage an app's state and access it across different routes and in different widgets. diff --git a/shrine/lib/app.dart b/shrine/lib/app.dart index 68264f17626..d6987f2c3ac 100644 --- a/shrine/lib/app.dart +++ b/shrine/lib/app.dart @@ -15,10 +15,10 @@ import 'package:flutter/material.dart'; import 'backdrop.dart'; +import 'category_menu_page.dart'; import 'colors.dart'; import 'home.dart'; import 'login.dart'; -import 'category_menu_page.dart'; import 'model/product.dart'; import 'supplemental/cut_corners_border.dart'; diff --git a/shrine/lib/backdrop.dart b/shrine/lib/backdrop.dart index c96227aad39..fc3bbbe8c1b 100644 --- a/shrine/lib/backdrop.dart +++ b/shrine/lib/backdrop.dart @@ -15,8 +15,8 @@ import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; -import 'model/product.dart'; import 'login.dart'; +import 'model/product.dart'; import 'shopping_cart.dart'; const double _kFlingVelocity = 2.0; diff --git a/shrine/lib/model/app_state_model.dart b/shrine/lib/model/app_state_model.dart index e5ba4b2acbc..1f9e18fd3a8 100644 --- a/shrine/lib/model/app_state_model.dart +++ b/shrine/lib/model/app_state_model.dart @@ -13,11 +13,12 @@ // limitations under the License. import 'package:scoped_model/scoped_model.dart'; + import 'product.dart'; import 'products_repository.dart'; -double _shippingCostPerItem = 7.0; double _salesTaxRate = 0.06; +double _shippingCostPerItem = 7.0; class AppStateModel extends Model { // All the available products. From a758fb5781b408201c1fb20fef719d815802d803 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Tue, 24 Jul 2018 13:29:56 -0700 Subject: [PATCH 13/15] Merged changes from MDC codelab 104. --- shrine/lib/app.dart | 16 ++++++++-------- shrine/lib/backdrop.dart | 2 +- shrine/lib/category_menu_page.dart | 2 +- shrine/lib/colors.dart | 1 + shrine/pubspec.yaml | 7 +++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/shrine/lib/app.dart b/shrine/lib/app.dart index d6987f2c3ac..c9932b55032 100644 --- a/shrine/lib/app.dart +++ b/shrine/lib/app.dart @@ -15,10 +15,10 @@ import 'package:flutter/material.dart'; import 'backdrop.dart'; -import 'category_menu_page.dart'; import 'colors.dart'; import 'home.dart'; import 'login.dart'; +import 'category_menu_page.dart'; import 'model/product.dart'; import 'supplemental/cut_corners_border.dart'; @@ -59,15 +59,15 @@ class _ShrineAppState extends State { } Route _getRoute(RouteSettings settings) { - if (settings.name == '/login') { - return MaterialPageRoute( - settings: settings, - builder: (BuildContext context) => LoginPage(), - fullscreenDialog: true, - ); + if (settings.name != '/login') { + return null; } - return null; + return MaterialPageRoute( + settings: settings, + builder: (BuildContext context) => LoginPage(), + fullscreenDialog: true, + ); } final ThemeData _kShrineTheme = _buildShrineTheme(); diff --git a/shrine/lib/backdrop.dart b/shrine/lib/backdrop.dart index fc3bbbe8c1b..8eabfe2914e 100644 --- a/shrine/lib/backdrop.dart +++ b/shrine/lib/backdrop.dart @@ -19,7 +19,7 @@ import 'login.dart'; import 'model/product.dart'; import 'shopping_cart.dart'; -const double _kFlingVelocity = 2.0; +double _kFlingVelocity = 2.0; class _FrontLayer extends StatelessWidget { const _FrontLayer({ diff --git a/shrine/lib/category_menu_page.dart b/shrine/lib/category_menu_page.dart index aaed26a6fc8..453071a387b 100644 --- a/shrine/lib/category_menu_page.dart +++ b/shrine/lib/category_menu_page.dart @@ -49,7 +49,7 @@ class CategoryMenuPage extends StatelessWidget { Container( width: 70.0, height: 2.0, - color: Color(0xFFEAA4A4), + color: kShrinePink400, ), ], ) diff --git a/shrine/lib/colors.dart b/shrine/lib/colors.dart index 07018344ba7..04298a0bca1 100644 --- a/shrine/lib/colors.dart +++ b/shrine/lib/colors.dart @@ -17,6 +17,7 @@ import 'package:flutter/material.dart'; const kShrinePink50 = const Color(0xFFFEEAE6); const kShrinePink100 = const Color(0xFFFEDBD0); const kShrinePink300 = const Color(0xFFFBB8AC); +const kShrinePink400 = const Color(0xFFEAA4A4); const kShrineBrown900 = const Color(0xFF442B2D); const kShrineBrown600 = const Color(0xFF7D4F52); diff --git a/shrine/pubspec.yaml b/shrine/pubspec.yaml index e901b7cd858..b5129de5f7e 100644 --- a/shrine/pubspec.yaml +++ b/shrine/pubspec.yaml @@ -1,5 +1,5 @@ -name: shrine -description: A simple shopping app with Material and scoped_model +name: Shrine +description: Take your design up a notch and learn to use our advanced component backdrop menu. dependencies: flutter: @@ -57,10 +57,9 @@ flutter: - packages/shrine_images/35-0.jpg - packages/shrine_images/36-0.jpg - packages/shrine_images/37-0.jpg - fonts: - family: Rubik fonts: - asset: fonts/Rubik-Regular.ttf - asset: fonts/Rubik-Medium.ttf - weight: 500 \ No newline at end of file + weight: 500 From 241c9560595d27bd08b0a90505d1920076b79548 Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Tue, 24 Jul 2018 13:48:02 -0700 Subject: [PATCH 14/15] Updating README and .gitignore --- shrine/.gitignore | 1 + shrine/README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/shrine/.gitignore b/shrine/.gitignore index 0fe1a7c4e50..87fcc079dc3 100644 --- a/shrine/.gitignore +++ b/shrine/.gitignore @@ -4,6 +4,7 @@ .pub/ .idea .atom +.vscode .flutter-plugins build/ *.iml diff --git a/shrine/README.md b/shrine/README.md index 32f685266a5..1e725f425ff 100644 --- a/shrine/README.md +++ b/shrine/README.md @@ -1,6 +1,6 @@ # Shrine -A sample shopping app that uses Material widgets in its UI and +A sample shopping app that uses Material Component widgets in its UI and [`scoped_model`](https://pub.dartlang.org/packages/scoped_model) to manage the state of its shopping cart. From 70a1e5a9c65411f222f440618db2d35a4901af1e Mon Sep 17 00:00:00 2001 From: Andrew Brogdon Date: Thu, 26 Jul 2018 15:22:20 -0700 Subject: [PATCH 15/15] Tweaking app state model. --- shrine/lib/model/app_state_model.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shrine/lib/model/app_state_model.dart b/shrine/lib/model/app_state_model.dart index 1f9e18fd3a8..24933424752 100644 --- a/shrine/lib/model/app_state_model.dart +++ b/shrine/lib/model/app_state_model.dart @@ -81,7 +81,7 @@ class AppStateModel extends Model { if (_productsInCart[productId] == 1) { _productsInCart.remove(productId); } else { - _productsInCart[productId] -= 1; + _productsInCart[productId]--; } }