Maintenance & fixes (#964)

## Description

### Maintenance
- Remove Firebase files to avoid crash reports from forks and update
Android and iOS Firebase app ID
- Fix Android crash due to missing crashlytics plugin
- Regenerate `android/app/src/main/AndroidManifest.xml`
- Update `android/crane/build.gradle`
- Update releasing instructions
- Remove Fastlane production lane for deploying directly to production
(use `beta` and `promote_to_production` instead)
- Regenerate Fastlane documentation
- Remove macOS from Firebase config
- Update `Runner.xcodeproj/project.pbxproj` and `pubspec` files

### Fixes
- Disable deferred components
(https://github.com/flutter/gallery/issues/926)
- Respect brightness of web for the background
- Adjust the logo transform animation on web
- Fix Android splash screen `backgroundColor` (Fixes
https://github.com/flutter/gallery/issues/930)

---

>**Note**: Please find the development and releasing instructions at
https://github.com/flutter/gallery#development
diff --git a/.gitignore b/.gitignore
index 918e6e2..f0e9afd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,3 +76,6 @@
 !**/ios/**/default.pbxuser
 !**/ios/**/default.perspectivev3
 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+
+**/google-services.json
+**/GoogleService-Info.plist
diff --git a/README.md b/README.md
index 4a1f3ea..ace86dc 100644
--- a/README.md
+++ b/README.md
@@ -123,29 +123,33 @@
 
 ## Releasing
 
-<details>
-  <summary>for flutter-hackers members</summary>
+*must be a `flutter-hackers` member*
 
-The process is largely automated and easy to set in motion.
+A set of GitHub workflows are available to help with releasing the Flutter Gallery, one per releasing platform.
 
-First things first, bump the `pubspec.yaml` version number. This can be in a PR making a change or a separate PR.
+1. For Android, download the relevant [Firebase configuration file](https://firebase.corp.google.com/u/0/project/gallery-flutter-dev/settings/general) (e.g. `google-services.json`).
+1. Bump the `pubspec.yaml` version number. This can be in a PR making a change or a separate PR.
 Use [semantic versioning](https://semver.org/) to determine
-which part to increment. The version number after the `+` should also be incremented. For example `1.2.3+010203`
+which part to increment. **The version number after the `+` should also be incremented**. For example `1.2.3+010203`
 with a patch should become `1.2.4+010204`.
 
-Then, use the following workflows. It is strongly recommended to use the staging/beta environments when available, before deploying to production.
-
-- [Deploy to Play Store](https://github.com/flutter/gallery/actions/workflows/release_deploy_play_store.yml): Uses Fastlane to create a [beta](https://play.google.com/console/u/0/developers/7661132837216938445/app/4974617875198505129/tracks/open-testing) (freely available on the [Play Store](https://play.google.com/apps/testing/io.flutter.demo.gallery)), promote an existing beta to production, or publish straight to [production](https://play.google.com/console/u/0/developers/7661132837216938445/app/4974617875198505129/tracks/production) ([Play Store](https://play.google.com/store/apps/details?id=io.flutter.demo.gallery)).
-  > **Note**
-  > Once an .aab is released with a particular version number, it can't be replaced. The version number must be incremented again.
+1. Run GitHub workflow.
 - [Deploy to web](https://github.com/flutter/gallery/actions/workflows/release_deploy_web.yml): Deploys a web build to the Firebase-hosted [staging](https://gallery-flutter-staging.web.app) or [production](https://gallery.flutter.dev) site.
-- [Draft GitHub release](https://github.com/flutter/gallery/actions/workflows/release_draft_github_release.yml): Drafts a GitHub release, including automatically generated release notes and packaged builds for Android, macOS, Linux, and Windows.
+- [Deploy to Play Store](https://github.com/flutter/gallery/actions/workflows/release_deploy_play_store.yml): Uses Fastlane to create a [beta](https://play.google.com/console/u/0/developers/7661132837216938445/app/4974617875198505129/tracks/open-testing) (freely available on the [Play Store](https://play.google.com/apps/testing/io.flutter.demo.gallery)) or promote an existing beta to [production](https://play.google.com/console/u/0/developers/7661132837216938445/app/4974617875198505129/tracks/production) ([Play Store](https://play.google.com/store/apps/details?id=io.flutter.demo.gallery)).
   > **Note**
-  > The release draft is private until published. Upon being published, the specified version tag will be created.
-- [Publish on Windows Store](): A workflow file for releasing to the Windows Store. This repository is not currently set up to publish new versions of [the current Windows Store listing](https://www.microsoft.com/store/productId/9PDWCTDFC7QQ). Requires running `msstore init` within the repository and setting repository/environment secrets .
+  > Once an .aab is created with a particular version number, it can't be replaced. The pubspec version number must be incremented again.
+
+- [Draft GitHub release](https://github.com/flutter/gallery/actions/workflows/release_draft_github_release.yml): Drafts a GitHub release, including packaged builds for Android, macOS, Linux, and Windows. Release notes can be automatically generated. The release draft is private until published. Upon being published, the specified version tag will be created.
+- [Publish on Windows Store](): Releasing to the Windows Store.
+  > **Note**
+  > This repository is not currently set up to publish new versions of [the current Windows Store listing](https://www.microsoft.com/store/productId/9PDWCTDFC7QQ). Requires running `msstore init` within the repository and setting repository/environment secrets .
   > See the instructions in the [documentation](https://docs.flutter.dev/deployment/windows#github-actions-cicd) for more information.
 
-For posterity, information about doing these things locally is available at [go/flutter-gallery-manual-deployment](http://go/flutter-gallery-manual-deployment).
+<details>
+  <summary>Escape hatch</summary>
+
+If the above GitHub workflows aren't functional (#759), releasing can be done semi-manually. Since this requires obtaining environment secrets, this can only be done by a Googler. See go/flutter-gallery-manual-deployment.
+
 
 </details>
 
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 659517e..22ea62c 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -2,6 +2,7 @@
     id "com.android.application"
     id "kotlin-android"
     id "dev.flutter.flutter-gradle-plugin"
+    id "com.google.firebase.crashlytics"
 }
 
 def localProperties = new Properties()
diff --git a/android/app/google-services.json b/android/app/google-services.json
deleted file mode 100644
index 2667d67..0000000
--- a/android/app/google-services.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "project_info": {
-    "project_number": "934901241041",
-    "firebase_url": "https://gallery-flutter-dev.firebaseio.com",
-    "project_id": "gallery-flutter-dev",
-    "storage_bucket": "gallery-flutter-dev.appspot.com"
-  },
-  "client": [
-    {
-      "client_info": {
-        "mobilesdk_app_id": "1:934901241041:android:d4698fe26714717fe621f0",
-        "android_client_info": {
-          "package_name": "io.flutter.demo.gallery"
-        }
-      },
-      "oauth_client": [
-        {
-          "client_id": "934901241041-dmf7g1li5dl70t7ldpranbi570nbhscu.apps.googleusercontent.com",
-          "client_type": 3
-        }
-      ],
-      "api_key": [
-        {
-          "current_key": "AIzaSyCX61HWVIf6k2XZYk43DxWAqE2tp9kwmEY"
-        }
-      ],
-      "services": {
-        "appinvite_service": {
-          "other_platform_oauth_client": [
-            {
-              "client_id": "934901241041-dmf7g1li5dl70t7ldpranbi570nbhscu.apps.googleusercontent.com",
-              "client_type": 3
-            }
-          ]
-        }
-      }
-    }
-  ],
-  "configuration_version": "1"
-}
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 50534f3..de56c0e 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,51 +1,51 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
+  <!-- io.flutter.app.FlutterApplication is an android.app.Application that
          calls FlutterMain.startInitialization(this); in its onCreate method.
          In most cases you can leave this as-is, but you if you want to provide
          additional functionality it is fine to subclass or reimplement
          FlutterApplication and put your custom class here. -->
-    <application
-        android:label="Flutter Gallery"
-        android:name="io.flutter.embedding.android.FlutterPlayStoreSplitApplication"
-        android:icon="@mipmap/ic_launcher">
-        <activity
-            android:name=".MainActivity"
-            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
-            android:launchMode="singleTop"
-            android:theme="@style/LaunchTheme"
-            android:hardwareAccelerated="true"
-            android:windowSoftInputMode="adjustResize"
-            android:exported="true">
-            <!-- Specifies an Android theme to apply to this Activity as soon as
+  <application
+      android:name="io.flutter.embedding.android.FlutterPlayStoreSplitApplication"
+      android:icon="@mipmap/ic_launcher"
+      android:label="Flutter Gallery">
+    <activity
+        android:name=".MainActivity"
+        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
+        android:exported="true"
+        android:hardwareAccelerated="true"
+        android:launchMode="singleTop"
+        android:theme="@style/LaunchTheme"
+        android:windowSoftInputMode="adjustResize">
+      <!-- Specifies an Android theme to apply to this Activity as soon as
                  the Android process has started. This theme is visible to the user
                  while the Flutter UI initializes. After that, this theme continues
                  to determine the Window background behind the Flutter UI. -->
-            <meta-data
-                android:name="io.flutter.embedding.android.NormalTheme"
-                android:resource="@style/NormalTheme"
-                />
-            <!-- Displays an Android View that continues showing the launch screen
+      <intent-filter>
+        <action android:name="android.intent.action.MAIN" />
+        <category android:name="android.intent.category.LAUNCHER" />
+      </intent-filter>
+      <!-- Displays an Android View that continues showing the launch screen
                  Drawable until Flutter paints its first frame, then this splash
                  screen fades out. A splash screen is useful to avoid any visual
                  gap between the end of Android's launch screen and the painting of
                  Flutter's first frame. -->
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-            <!-- Don't delete the meta-data below.
+      <meta-data
+          android:name="io.flutter.embedding.android.NormalTheme"
+          android:resource="@style/NormalTheme" />
+      <!-- Don't delete the meta-data below.
                  This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
-            <meta-data
-                android:name="flutterEmbedding"
-                android:value="2"/>
-        </activity>
-        <meta-data android:name="io.flutter.embedding.engine.deferredcomponents.DeferredComponentManager.loadingUnitMapping" android:value="77:crane,2:,3:,4:,5:,6:,7:,8:,9:,10:,11:,12:,13:,14:,15:,16:,17:,18:,19:,20:,21:,22:,23:,24:,25:,26:,27:,28:,29:,30:,31:,32:,33:,34:,35:,36:,37:,38:,39:,40:,41:,42:,43:,44:,45:,46:,47:,48:,49:,50:,51:,52:,53:,54:,55:,56:,57:,58:,59:,60:,61:,62:,63:,64:,65:,66:,67:,68:,69:,70:,71:,72:,73:,74:,75:,76:,78:,79:,80:,81:,82:,83:,84:,85:,86:,87:"/>
-    </application>
-    <queries>
-        <intent>
-            <action android:name="android.intent.action.VIEW" />
-            <data android:scheme="https" />
-        </intent>
-    </queries>
+      <meta-data
+          android:name="flutterEmbedding"
+          android:value="2" />
+    </activity>
+    <meta-data
+        android:name="io.flutter.embedding.engine.deferredcomponents.DeferredComponentManager.loadingUnitMapping"
+        android:value="78:crane,2:,3:,4:,5:,6:,7:,8:,9:,10:,11:,12:,13:,14:,15:,16:,17:,18:,19:,20:,21:,22:,23:,24:,25:,26:,27:,28:,29:,30:,31:,32:,33:,34:,35:,36:,37:,38:,39:,40:,41:,42:,43:,44:,45:,46:,47:,48:,49:,50:,51:,52:,53:,54:,55:,56:,57:,58:,59:,60:,61:,62:,63:,64:,65:,66:,67:,68:,69:,70:,71:,72:,73:,74:,75:,76:,77:,79:,80:,81:,82:,83:,84:,85:,86:,87:,88:" />
+  </application>
+  <queries>
+    <intent>
+      <action android:name="android.intent.action.VIEW" />
+      <data android:scheme="https" />
+    </intent>
+  </queries>
 </manifest>
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
index 449a9f9..0d4ea1f 100644
--- a/android/app/src/main/res/values-night/styles.xml
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -5,12 +5,14 @@
         <!-- Show a splash screen on the activity. Automatically removed when
              Flutter draws its first frame -->
         <item name="android:windowBackground">@drawable/launch_background</item>
+        <item name="android:windowSplashScreenBackground">@color/backgroundColor</item>
     </style>
+    <color name="backgroundColor">#241E30</color>
     <!-- Theme applied to the Android Window as soon as the process has started.
          This theme determines the color of the Android Window while your
          Flutter UI initializes, as well as behind your Flutter UI while its
          running.
-         
+
          This Theme is only used starting with V2 of Flutter's Android embedding. -->
     <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
         <item name="android:windowBackground">?android:colorBackground</item>
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
index a76f6ac..59c2123 100644
--- a/android/app/src/main/res/values/styles.xml
+++ b/android/app/src/main/res/values/styles.xml
@@ -4,8 +4,9 @@
         <!-- Show a splash screen on the activity. Automatically removed when
              Flutter draws its first frame -->
         <item name="android:windowBackground">@drawable/launch_background</item>
+        <item name="android:windowSplashScreenBackground">@color/backgroundColor</item>
     </style>
-    <color name="backgroundColor">#030303</color>
+    <color name="backgroundColor">#E6EBEB</color>
     <!-- Theme applied to the Android Window as soon as the process has started.
      This theme determines the color of the Android Window while your
      Flutter UI initializes, as well as behind your Flutter UI while its
diff --git a/android/crane/build.gradle b/android/crane/build.gradle
index 84fd9b8..58e9c2a 100644
--- a/android/crane/build.gradle
+++ b/android/crane/build.gradle
@@ -1,15 +1,28 @@
+plugins {
+    id "com.android.dynamic-feature"
+    id "kotlin-android"
+    id "com.google.firebase.crashlytics"
+}
+
 def keystoreProperties = new Properties()
 def keystorePropertiesFile = rootProject.file('key.properties')
 if (keystorePropertiesFile.exists()) {
     keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
 }
 
-apply plugin: "com.android.dynamic-feature"
-
 android {
-    namespace "com.example.gallery.crane"
+    namespace "io.flutter.demo.gallery.crane"
     compileSdkVersion 31
 
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        jvmTarget = '1.8'
+    }
+
     sourceSets {
         applicationVariants.all { variant ->
             main.assets.srcDirs += "${project.buildDir}/intermediates/flutter/${variant.name}/deferred_assets"
@@ -20,11 +33,6 @@
     defaultConfig {
         minSdkVersion 21
     }
-
-    compileOptions {
-        sourceCompatibility 1.8
-        targetCompatibility 1.8
-    }
 }
 
 dependencies {
diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile
index bd888e3..901af0a 100644
--- a/android/fastlane/Fastfile
+++ b/android/fastlane/Fastfile
@@ -23,7 +23,8 @@
 
   desc "Submit a new beta build to Google Play"
   lane :beta do
-    sh "flutter build appbundle -v"
+    # TODO: Re-enable deferred components once https://github.com/flutter/gallery/issues/926 is fixed
+    sh "flutter build appbundle -v --no-deferred-components"
     upload_to_play_store(
       track: 'beta',
       aab: '../build/app/outputs/bundle/release/app-release.aab',
@@ -40,14 +41,4 @@
       json_key_data: ENV['PLAY_STORE_CONFIG_JSON'],
       )
   end
-
-  desc "Submit a new production build to Google Play"
-  lane :production do
-    sh "flutter build appbundle -v"
-    upload_to_play_store(
-      track: 'production',
-      aab: '../build/app/outputs/bundle/release/app-release.aab',
-      json_key_data: ENV['PLAY_STORE_CONFIG_JSON'],
-    )
-  end
 end
diff --git a/android/fastlane/README.md b/android/fastlane/README.md
index d325eb2..20923b2 100644
--- a/android/fastlane/README.md
+++ b/android/fastlane/README.md
@@ -1,44 +1,48 @@
 fastlane documentation
-================
+----
+
 # Installation
 
 Make sure you have the latest version of the Xcode command line tools installed:
 
-```
+```sh
 xcode-select --install
 ```
 
-Install _fastlane_ using
-```
-[sudo] gem install fastlane -NV
-```
-or alternatively using `brew install fastlane`
+For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
 
 # Available Actions
+
 ## Android
+
 ### android test
+
+```sh
+[bundle exec] fastlane android test
 ```
-fastlane android test
-```
+
 Runs all the tests
+
 ### android beta
+
+```sh
+[bundle exec] fastlane android beta
 ```
-fastlane android beta
-```
+
 Submit a new beta build to Google Play
+
 ### android promote_to_production
+
+```sh
+[bundle exec] fastlane android promote_to_production
 ```
-fastlane android promote_to_production
-```
+
 Promote beta track to prod
-### android production
-```
-fastlane android production
-```
-Submit a new production build to Google Play
 
 ----
 
-This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
-More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
-The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
+This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
+
+More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
+
+The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
diff --git a/deferred_components_loading_units.yaml b/deferred_components_loading_units.yaml
index 8f915a1..85055ee 100644
--- a/deferred_components_loading_units.yaml
+++ b/deferred_components_loading_units.yaml
@@ -58,198 +58,201 @@
       - package:flutter_gen/gen_l10n/gallery_localizations_cs.dart
   - id: 13
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_da.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_cy.dart
   - id: 14
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_de.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_da.dart
   - id: 15
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_el.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_de.dart
   - id: 16
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_es.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_el.dart
   - id: 17
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_et.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_es.dart
   - id: 18
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_eu.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_et.dart
   - id: 19
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_fa.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_eu.dart
   - id: 20
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_fi.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_fa.dart
   - id: 21
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_fil.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_fi.dart
   - id: 22
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_fr.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_fil.dart
   - id: 23
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_gl.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_fr.dart
   - id: 24
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_gsw.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_gl.dart
   - id: 25
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_gu.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_gsw.dart
   - id: 26
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_he.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_gu.dart
   - id: 27
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_hi.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_he.dart
   - id: 28
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_hr.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_hi.dart
   - id: 29
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_hu.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_hr.dart
   - id: 30
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_hy.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_hu.dart
   - id: 31
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_id.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_hy.dart
   - id: 32
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_is.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_id.dart
   - id: 33
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_it.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_is.dart
   - id: 34
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ja.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_it.dart
   - id: 35
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ka.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ja.dart
   - id: 36
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_kk.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ka.dart
   - id: 37
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_km.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_kk.dart
   - id: 38
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_kn.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_km.dart
   - id: 39
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ko.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_kn.dart
   - id: 40
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ky.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ko.dart
   - id: 41
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_lo.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ky.dart
   - id: 42
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_lt.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_lo.dart
   - id: 43
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_lv.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_lt.dart
   - id: 44
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_mk.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_lv.dart
   - id: 45
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ml.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_mk.dart
   - id: 46
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_mn.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ml.dart
   - id: 47
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_mr.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_mn.dart
   - id: 48
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ms.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_mr.dart
   - id: 49
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_my.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ms.dart
   - id: 50
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_nb.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_my.dart
   - id: 51
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ne.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_nb.dart
   - id: 52
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_nl.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ne.dart
   - id: 53
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_or.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_nl.dart
   - id: 54
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_pa.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_or.dart
   - id: 55
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_pl.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_pa.dart
   - id: 56
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_pt.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_pl.dart
   - id: 57
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ro.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_pt.dart
   - id: 58
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ru.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ro.dart
   - id: 59
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_si.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ru.dart
   - id: 60
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_sk.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_si.dart
   - id: 61
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_sl.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_sk.dart
   - id: 62
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_sq.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_sl.dart
   - id: 63
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_sr.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_sq.dart
   - id: 64
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_sv.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_sr.dart
   - id: 65
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_sw.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_sv.dart
   - id: 66
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ta.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_sw.dart
   - id: 67
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_te.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ta.dart
   - id: 68
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_th.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_te.dart
   - id: 69
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_tl.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_th.dart
   - id: 70
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_tr.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_tl.dart
   - id: 71
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_uk.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_tr.dart
   - id: 72
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_ur.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_uk.dart
   - id: 73
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_uz.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_ur.dart
   - id: 74
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_vi.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_uz.dart
   - id: 75
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_zh.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_vi.dart
   - id: 76
     libraries:
-      - package:flutter_gen/gen_l10n/gallery_localizations_zu.dart
+      - package:flutter_gen/gen_l10n/gallery_localizations_zh.dart
   - id: 77
     libraries:
+      - package:flutter_gen/gen_l10n/gallery_localizations_zu.dart
+  - id: 78
+    libraries:
       - package:gallery/studies/crane/app.dart
       - package:gallery/studies/crane/backdrop.dart
       - package:gallery/studies/crane/eat_form.dart
@@ -282,11 +285,11 @@
       - package:flutter_staggered_grid_view/src/widgets/uniform_track.dart
       - package:flutter_staggered_grid_view/src/rendering/staggered_grid.dart
       - package:flutter_staggered_grid_view/src/rendering/uniform_track.dart
-  - id: 78
+  - id: 79
     libraries:
       - package:gallery/studies/fortnightly/app.dart
       - package:gallery/studies/fortnightly/shared.dart
-  - id: 79
+  - id: 80
     libraries:
       - package:gallery/studies/rally/app.dart
       - package:gallery/studies/rally/home.dart
@@ -303,7 +306,7 @@
       - package:gallery/studies/rally/formatters.dart
       - package:gallery/studies/rally/charts/line_chart.dart
       - package:gallery/studies/rally/charts/vertical_fraction_bar.dart
-  - id: 80
+  - id: 81
     libraries:
       - package:gallery/studies/shrine/app.dart
       - package:gallery/studies/shrine/backdrop.dart
@@ -327,7 +330,7 @@
       - package:gallery/studies/shrine/supplemental/desktop_product_columns.dart
       - package:gallery/studies/shrine/supplemental/product_card.dart
       - package:gallery/studies/shrine/supplemental/product_columns.dart
-  - id: 81
+  - id: 82
     libraries:
       - package:gallery/demos/cupertino/cupertino_demos.dart
       - package:gallery/demos/cupertino/cupertino_activity_indicator_demo.dart
@@ -343,7 +346,7 @@
       - package:gallery/demos/cupertino/cupertino_switch_demo.dart
       - package:gallery/demos/cupertino/cupertino_tab_bar_demo.dart
       - package:gallery/demos/cupertino/cupertino_text_field_demo.dart
-  - id: 82
+  - id: 83
     libraries:
       - package:gallery/demos/material/material_demos.dart
       - package:gallery/demos/material/app_bar_demo.dart
@@ -370,21 +373,21 @@
       - package:gallery/demos/material/tabs_demo.dart
       - package:gallery/demos/material/text_field_demo.dart
       - package:gallery/demos/material/tooltip_demo.dart
-  - id: 83
-    libraries:
-      - package:gallery/demos/reference/colors_demo.dart
   - id: 84
     libraries:
-      - package:gallery/demos/reference/motion_demo_container_transition.dart
+      - package:gallery/demos/reference/colors_demo.dart
   - id: 85
     libraries:
+      - package:gallery/demos/reference/motion_demo_container_transition.dart
+  - id: 86
+    libraries:
       - package:gallery/demos/reference/transformations_demo.dart
       - package:gallery/demos/reference/transformations_demo_board.dart
       - package:gallery/demos/reference/transformations_demo_edit_board_point.dart
       - package:gallery/demos/reference/transformations_demo_color_picker.dart
-  - id: 86
+  - id: 87
     libraries:
       - package:gallery/demos/reference/two_pane_demo.dart
-  - id: 87
+  - id: 88
     libraries:
       - package:gallery/demos/reference/typography_demo.dart
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 6dc2a8f..9869a9e 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -222,7 +222,7 @@
   GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd
   GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749
   nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
-  package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
+  package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7
   path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
   PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
   PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index feb6265..1909612 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -7,7 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		0F1A3486D637D897DFFBE18A /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A5806C1A7B14EB0850C3B5B7 /* GoogleService-Info.plist */; };
 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
 		228E570822055C710667526C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9F4BEF4B2C85AB51CC99563 /* Pods_RunnerTests.framework */; };
 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
@@ -61,7 +60,6 @@
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		A5806C1A7B14EB0850C3B5B7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = "<group>"; };
 		A87CC7F179BBCAB7A370BC30 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
 		B888692AAC4DA18E10B7D298 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		BC90DDF2F09457FF7C5ECDD9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
@@ -116,7 +114,6 @@
 				85B03E26EE810C2F738D0C83 /* Pods-RunnerTests.release.xcconfig */,
 				941C9870998D250915163068 /* Pods-RunnerTests.profile.xcconfig */,
 			);
-			name = Pods;
 			path = Pods;
 			sourceTree = "<group>";
 		};
@@ -140,7 +137,6 @@
 				331C8082294A63A400263BE5 /* RunnerTests */,
 				904F3A9C0DC62BD4BFA7FBC6 /* Pods */,
 				604FA480829CF3906E5FD16C /* Frameworks */,
-				A5806C1A7B14EB0850C3B5B7 /* GoogleService-Info.plist */,
 			);
 			sourceTree = "<group>";
 		};
@@ -219,7 +215,7 @@
 		97C146E61CF9000F007C117D /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1300;
+				LastUpgradeCheck = 1430;
 				ORGANIZATIONNAME = "";
 				TargetAttributes = {
 					331C8080294A63A400263BE5 = {
@@ -267,7 +263,6 @@
 				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
 				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
 				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
-				0F1A3486D637D897DFFBE18A /* GoogleService-Info.plist in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -492,8 +487,10 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
-				DEVELOPMENT_TEAM = EQHXZ8M8AV;
+				DEVELOPMENT_TEAM = S8QB4VV633;
 				ENABLE_BITCODE = NO;
 				INFOPLIST_FILE = Runner/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -502,6 +499,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = io.flutter.demo.gallery;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_VERSION = 5.0;
 				VERSIONING_SYSTEM = "apple-generic";
@@ -671,8 +669,10 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
-				DEVELOPMENT_TEAM = EQHXZ8M8AV;
+				DEVELOPMENT_TEAM = S8QB4VV633;
 				ENABLE_BITCODE = NO;
 				INFOPLIST_FILE = Runner/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -681,6 +681,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = io.flutter.demo.gallery;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 5.0;
@@ -694,8 +695,10 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
-				DEVELOPMENT_TEAM = EQHXZ8M8AV;
+				DEVELOPMENT_TEAM = S8QB4VV633;
 				ENABLE_BITCODE = NO;
 				INFOPLIST_FILE = Runner/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -704,6 +707,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = io.flutter.demo.gallery;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_VERSION = 5.0;
 				VERSIONING_SYSTEM = "apple-generic";
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index e42adcb..87131a0 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1300"
+   LastUpgradeVersion = "1430"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist
deleted file mode 100644
index c565e02..0000000
--- a/ios/Runner/GoogleService-Info.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>API_KEY</key>
-	<string>AIzaSyDMJsEYAcKIwBUajVyLlaQ1Z7xAQabZTjo</string>
-	<key>GCM_SENDER_ID</key>
-	<string>934901241041</string>
-	<key>PLIST_VERSION</key>
-	<string>1</string>
-	<key>BUNDLE_ID</key>
-	<string>io.flutter.demo.gallery</string>
-	<key>PROJECT_ID</key>
-	<string>gallery-flutter-dev</string>
-	<key>STORAGE_BUCKET</key>
-	<string>gallery-flutter-dev.appspot.com</string>
-	<key>IS_ADS_ENABLED</key>
-	<false></false>
-	<key>IS_ANALYTICS_ENABLED</key>
-	<false></false>
-	<key>IS_APPINVITE_ENABLED</key>
-	<true></true>
-	<key>IS_GCM_ENABLED</key>
-	<true></true>
-	<key>IS_SIGNIN_ENABLED</key>
-	<true></true>
-	<key>GOOGLE_APP_ID</key>
-	<string>1:934901241041:ios:7d98f83e5614cfa7e621f0</string>
-	<key>DATABASE_URL</key>
-	<string>https://gallery-flutter-dev.firebaseio.com</string>
-</dict>
-</plist>
\ No newline at end of file
diff --git a/ios/firebase_app_id_file.json b/ios/firebase_app_id_file.json
index 45026d3..dcdba87 100644
--- a/ios/firebase_app_id_file.json
+++ b/ios/firebase_app_id_file.json
@@ -1,7 +1,7 @@
 {
   "file_generated_by": "FlutterFire CLI",
   "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
-  "GOOGLE_APP_ID": "1:934901241041:ios:7d98f83e5614cfa7e621f0",
+  "GOOGLE_APP_ID": "1:934901241041:ios:8d4c8bde3db3391fe621f0",
   "FIREBASE_PROJECT_ID": "gallery-flutter-dev",
   "GCM_SENDER_ID": "934901241041"
 }
\ No newline at end of file
diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart
index d43975c..c25415f 100644
--- a/lib/firebase_options.dart
+++ b/lib/firebase_options.dart
@@ -25,7 +25,20 @@
       case TargetPlatform.iOS:
         return ios;
       case TargetPlatform.macOS:
-        return macos;
+        throw UnsupportedError(
+          'DefaultFirebaseOptions have not been configured for macos - '
+          'you can reconfigure this by running the FlutterFire CLI again.',
+        );
+      case TargetPlatform.windows:
+        throw UnsupportedError(
+          'DefaultFirebaseOptions have not been configured for windows - '
+          'you can reconfigure this by running the FlutterFire CLI again.',
+        );
+      case TargetPlatform.linux:
+        throw UnsupportedError(
+          'DefaultFirebaseOptions have not been configured for linux - '
+          'you can reconfigure this by running the FlutterFire CLI again.',
+        );
       default:
         throw UnsupportedError(
           'DefaultFirebaseOptions are not supported for this platform.',
@@ -46,7 +59,7 @@
 
   static const FirebaseOptions android = FirebaseOptions(
     apiKey: 'AIzaSyCX61HWVIf6k2XZYk43DxWAqE2tp9kwmEY',
-    appId: '1:934901241041:android:d4698fe26714717fe621f0',
+    appId: '1:934901241041:android:d393674f33a48678e621f0',
     messagingSenderId: '934901241041',
     projectId: 'gallery-flutter-dev',
     databaseURL: 'https://gallery-flutter-dev.firebaseio.com',
@@ -55,17 +68,7 @@
 
   static const FirebaseOptions ios = FirebaseOptions(
     apiKey: 'AIzaSyDMJsEYAcKIwBUajVyLlaQ1Z7xAQabZTjo',
-    appId: '1:934901241041:ios:7d98f83e5614cfa7e621f0',
-    messagingSenderId: '934901241041',
-    projectId: 'gallery-flutter-dev',
-    databaseURL: 'https://gallery-flutter-dev.firebaseio.com',
-    storageBucket: 'gallery-flutter-dev.appspot.com',
-    iosBundleId: 'io.flutter.demo.gallery',
-  );
-
-  static const FirebaseOptions macos = FirebaseOptions(
-    apiKey: 'AIzaSyDMJsEYAcKIwBUajVyLlaQ1Z7xAQabZTjo',
-    appId: '1:934901241041:ios:7d98f83e5614cfa7e621f0',
+    appId: '1:934901241041:ios:8d4c8bde3db3391fe621f0',
     messagingSenderId: '934901241041',
     projectId: 'gallery-flutter-dev',
     databaseURL: 'https://gallery-flutter-dev.firebaseio.com',
diff --git a/lib/main.dart b/lib/main.dart
index 9bd98b7..e9f4ff9 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -29,7 +29,8 @@
   await GetStorage.init();
 
   if (defaultTargetPlatform != TargetPlatform.linux &&
-      defaultTargetPlatform != TargetPlatform.windows) {
+      defaultTargetPlatform != TargetPlatform.windows &&
+      defaultTargetPlatform != TargetPlatform.macOS) {
     WidgetsFlutterBinding.ensureInitialized();
     await Firebase.initializeApp(
       options: DefaultFirebaseOptions.currentPlatform,
diff --git a/lib/pages/home.dart b/lib/pages/home.dart
index 380cab0..85c8cfb 100644
--- a/lib/pages/home.dart
+++ b/lib/pages/home.dart
@@ -24,7 +24,6 @@
 import 'package:gallery/studies/shrine/colors.dart';
 import 'package:gallery/studies/shrine/routes.dart' as shrine_routes;
 import 'package:gallery/studies/starter/routes.dart' as starter_app_routes;
-
 import 'package:url_launcher/url_launcher.dart';
 
 const _horizontalPadding = 32.0;
@@ -748,7 +747,7 @@
 
 class _MobileCarouselState extends State<_MobileCarousel>
     with RestorationMixin, SingleTickerProviderStateMixin {
-  PageController? _controller;
+  late PageController _controller;
 
   final RestorableInt _currentPage = RestorableInt(0);
 
@@ -775,18 +774,18 @@
 
   @override
   void dispose() {
-    _controller!.dispose();
+    _controller.dispose();
     _currentPage.dispose();
     super.dispose();
   }
 
   Widget builder(int index) {
     final carouselCard = AnimatedBuilder(
-      animation: _controller!,
+      animation: _controller,
       builder: (context, child) {
         double value;
-        if (_controller!.position.haveDimensions) {
-          value = _controller!.page! - index;
+        if (_controller.position.haveDimensions) {
+          value = _controller.page! - index;
         } else {
           // If haveDimensions is false, use _currentPage to calculate value.
           value = (_currentPage.value - index).toDouble();
diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj
index 1a211ea..df6b20f 100644
--- a/macos/Runner.xcodeproj/project.pbxproj
+++ b/macos/Runner.xcodeproj/project.pbxproj
@@ -21,7 +21,6 @@
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
-		1B24CD8AE7B6BE30B4571132 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F2A0047D30EE31A6F6B927C0 /* GoogleService-Info.plist */; };
 		331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
 		335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
 		33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
@@ -89,7 +88,6 @@
 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
 		9DBF0FC22BA56C506CA3DBFF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
 		CB7B134F97A1F338EA6461BD /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
-		F2A0047D30EE31A6F6B927C0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -153,7 +151,6 @@
 				33CC10EE2044A3C60003C045 /* Products */,
 				D73912EC22F37F3D000D13A0 /* Frameworks */,
 				15516EE5FF2499A0EF821BA5 /* Pods */,
-				F2A0047D30EE31A6F6B927C0 /* GoogleService-Info.plist */,
 			);
 			sourceTree = "<group>";
 		};
@@ -243,7 +240,6 @@
 				33CC110E2044A8840003C045 /* Bundle Framework */,
 				3399D490228B24CF009A79C7 /* ShellScript */,
 				23C1AAB4970EAAD7C051C88C /* [CP] Embed Pods Frameworks */,
-				26EEC58AE3E40998779C2EE2 /* [firebase_crashlytics] Crashlytics Upload Symbols */,
 			);
 			buildRules = (
 			);
@@ -319,7 +315,6 @@
 			files = (
 				33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
 				33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
-				1B24CD8AE7B6BE30B4571132 /* GoogleService-Info.plist in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -365,26 +360,6 @@
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		26EEC58AE3E40998779C2EE2 /* [firebase_crashlytics] Crashlytics Upload Symbols */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-				"\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}\"",
-				"\"$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)\"",
-			);
-			name = "[firebase_crashlytics] Crashlytics Upload Symbols";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --flutter-project \"$PROJECT_DIR/firebase_app_id_file.json\" ";
-		};
 		3399D490228B24CF009A79C7 /* ShellScript */ = {
 			isa = PBXShellScriptBuildPhase;
 			alwaysOutOfDate = 1;
@@ -592,6 +567,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				INFOPLIST_FILE = Runner/Info.plist;
@@ -719,6 +695,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				INFOPLIST_FILE = Runner/Info.plist;
@@ -740,6 +717,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				INFOPLIST_FILE = Runner/Info.plist;
diff --git a/macos/Runner/GoogleService-Info.plist b/macos/Runner/GoogleService-Info.plist
deleted file mode 100644
index c565e02..0000000
--- a/macos/Runner/GoogleService-Info.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>API_KEY</key>
-	<string>AIzaSyDMJsEYAcKIwBUajVyLlaQ1Z7xAQabZTjo</string>
-	<key>GCM_SENDER_ID</key>
-	<string>934901241041</string>
-	<key>PLIST_VERSION</key>
-	<string>1</string>
-	<key>BUNDLE_ID</key>
-	<string>io.flutter.demo.gallery</string>
-	<key>PROJECT_ID</key>
-	<string>gallery-flutter-dev</string>
-	<key>STORAGE_BUCKET</key>
-	<string>gallery-flutter-dev.appspot.com</string>
-	<key>IS_ADS_ENABLED</key>
-	<false></false>
-	<key>IS_ANALYTICS_ENABLED</key>
-	<false></false>
-	<key>IS_APPINVITE_ENABLED</key>
-	<true></true>
-	<key>IS_GCM_ENABLED</key>
-	<true></true>
-	<key>IS_SIGNIN_ENABLED</key>
-	<true></true>
-	<key>GOOGLE_APP_ID</key>
-	<string>1:934901241041:ios:7d98f83e5614cfa7e621f0</string>
-	<key>DATABASE_URL</key>
-	<string>https://gallery-flutter-dev.firebaseio.com</string>
-</dict>
-</plist>
\ No newline at end of file
diff --git a/macos/firebase_app_id_file.json b/macos/firebase_app_id_file.json
deleted file mode 100644
index 45026d3..0000000
--- a/macos/firebase_app_id_file.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "file_generated_by": "FlutterFire CLI",
-  "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
-  "GOOGLE_APP_ID": "1:934901241041:ios:7d98f83e5614cfa7e621f0",
-  "FIREBASE_PROJECT_ID": "gallery-flutter-dev",
-  "GCM_SENDER_ID": "934901241041"
-}
\ No newline at end of file
diff --git a/pubspec.lock b/pubspec.lock
index 87e121d..3ac35b0 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -93,10 +93,10 @@
     dependency: "direct main"
     description:
       name: collection
-      sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
+      sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
       url: "https://pub.dev"
     source: hosted
-    version: "1.17.1"
+    version: "1.17.2"
   convert:
     dependency: transitive
     description:
@@ -347,10 +347,10 @@
     dependency: "direct main"
     description:
       name: google_fonts
-      sha256: "927573f2e8a8d65c17931e21918ad0ab0666b1b636537de7c4932bdb487b190f"
+      sha256: db5efba8106bd784a92c96cfd81716f4e06baab54e37de858488e9a00a764cad
       url: "https://pub.dev"
     source: hosted
-    version: "4.0.3"
+    version: "5.0.0"
   grinder:
     dependency: "direct dev"
     description:
@@ -363,10 +363,10 @@
     dependency: transitive
     description:
       name: http
-      sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
+      sha256: "4c3f04bfb64d3efd508d06b41b825542f08122d30bda4933fb95c069d22a4fa3"
       url: "https://pub.dev"
     source: hosted
-    version: "0.13.5"
+    version: "1.0.0"
   http_multi_server:
     dependency: transitive
     description:
@@ -427,10 +427,10 @@
     dependency: transitive
     description:
       name: matcher
-      sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
+      sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
       url: "https://pub.dev"
     source: hosted
-    version: "0.12.15"
+    version: "0.12.16"
   material_color_utilities:
     dependency: transitive
     description:
@@ -483,10 +483,10 @@
     dependency: "direct main"
     description:
       name: package_info_plus
-      sha256: de41e74b0ea9a3e524c68f35099af1fdeb4885625aeb277d2e01a42d6bd7b293
+      sha256: ceb027f6bc6a60674a233b4a90a7658af1aebdea833da0b5b53c1e9821a78c7b
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.1"
+    version: "4.0.2"
   package_info_plus_platform_interface:
     dependency: transitive
     description:
@@ -728,26 +728,26 @@
     dependency: "direct dev"
     description:
       name: test
-      sha256: "4f92f103ef63b1bbac6f4bd1930624fca81b2574464482512c4f0896319be575"
+      sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46"
       url: "https://pub.dev"
     source: hosted
-    version: "1.24.2"
+    version: "1.24.3"
   test_api:
     dependency: transitive
     description:
       name: test_api
-      sha256: daadc9baabec998b062c9091525aa95786508b1c48e9c30f1f891b8bf6ff2e64
+      sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
       url: "https://pub.dev"
     source: hosted
-    version: "0.5.2"
+    version: "0.6.0"
   test_core:
     dependency: transitive
     description:
       name: test_core
-      sha256: "3642b184882f79e76ca57a9230fb971e494c3c1fd09c21ae3083ce891bcc0aa1"
+      sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e"
       url: "https://pub.dev"
     source: hosted
-    version: "0.5.2"
+    version: "0.5.3"
   transparent_image:
     dependency: "direct main"
     description:
@@ -840,10 +840,10 @@
     dependency: transitive
     description:
       name: vm_service
-      sha256: "518254c0d3ee20667a1feef39eefe037df87439851e4b3cb277e5b3f37afa2f0"
+      sha256: f3743ca475e0c9ef71df4ba15eb2d7684eecd5c8ba20a462462e4e8b561b2e11
       url: "https://pub.dev"
     source: hosted
-    version: "11.4.0"
+    version: "11.6.0"
   watcher:
     dependency: transitive
     description:
@@ -909,5 +909,5 @@
     source: hosted
     version: "3.1.1"
 sdks:
-  dart: ">=3.0.0-0 <4.0.0"
+  dart: ">=3.0.0 <4.0.0"
   flutter: ">=3.10.0-10.0.pre.17"
diff --git a/pubspec.yaml b/pubspec.yaml
index f7da9ad..964edad 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,7 +1,7 @@
 name: gallery
 description: A resource to help developers evaluate and use Flutter.
 repository: https://github.com/flutter/gallery
-version: 2.10.1+021001 # See README.md for details on versioning.
+version: 2.10.2+021002 # See README.md for details on versioning.
 
 environment:
   flutter: ^3.10.0-10.0.pre.17 # Keep relatively close to master channel version
@@ -25,10 +25,10 @@
   firebase_crashlytics: ^3.1.1
   firebase_performance: ^0.9.0+14
   get_storage: ^2.1.1
-  google_fonts: ^4.0.1
+  google_fonts: ^5.0.0
   intl: any # An exact version pin will be provided by the Flutter SDK
   meta: ^1.7.0
-  package_info_plus: ^3.0.3
+  package_info_plus: ^4.0.2
   path_provider: ^2.0.11
   provider: ^6.0.2
   rally_assets: ^3.0.1
diff --git a/web/index.html b/web/index.html
index e0c0250..5f77280 100644
--- a/web/index.html
+++ b/web/index.html
@@ -185,6 +185,28 @@
     initCookieNotice();
   </script>
 
+  <!-- Background -->
+  <style>
+    body.light {
+      background-color: #E6EBEB;
+    }
+
+    body.dark {
+      background-color: #241E30;
+    }
+  </style>
+  <script>
+    var queryParams = new URLSearchParams(window.location.search);
+
+    // Set the theme from the URL param, with fallback to user preference if no theme is
+    // specified.
+    var theme = queryParams.get("brightness");
+    theme ||= window.matchMedia("(prefers-color-scheme: dark)").matches
+      ? "dark"
+      : "light";
+    document.body.classList.add(theme);
+  </script>
+
   <!-- Loading indicator -->
   <div id="loading">
     <style>
@@ -235,7 +257,7 @@
         }
 
         to {
-          transform: scale(10)
+          transform: scale(0.01)
         }
       }
     </style>