From 0731c8e33a5589fbdbe0833b30407415784281ce Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Thu, 20 Jun 2024 09:47:35 -0400 Subject: [PATCH 01/24] Added remix --- .gitignore | 2 +- packages/mix_annotations/.gitignore | 7 - packages/mix_lint/.gitignore | 3 - packages/remix/LICENSE | 29 + packages/remix/README.md | 16 + packages/remix/analysis_options.yaml | 29 + packages/remix/demo/.gitignore | 43 ++ packages/remix/demo/.metadata | 36 + packages/remix/demo/README.md | 16 + packages/remix/demo/analysis_options.yaml | 28 + packages/remix/demo/android/.gitignore | 13 + packages/remix/demo/android/app/build.gradle | 67 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 + .../kotlin/com/example/demo/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../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-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + packages/remix/demo/android/build.gradle | 30 + packages/remix/demo/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + packages/remix/demo/android/settings.gradle | 29 + packages/remix/demo/ios/.gitignore | 34 + .../demo/ios/Flutter/AppFrameworkInfo.plist | 26 + .../remix/demo/ios/Flutter/Debug.xcconfig | 1 + .../remix/demo/ios/Flutter/Release.xcconfig | 1 + .../demo/ios/Runner.xcodeproj/project.pbxproj | 614 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../remix/demo/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 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 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + packages/remix/demo/ios/Runner/Info.plist | 49 ++ .../demo/ios/Runner/Runner-Bridging-Header.h | 1 + .../demo/ios/RunnerTests/RunnerTests.swift | 12 + packages/remix/demo/lib/components/alert.dart | 32 + .../remix/demo/lib/components/avatar.dart | 58 ++ packages/remix/demo/lib/components/badge.dart | 20 + .../remix/demo/lib/components/button.dart | 42 ++ packages/remix/demo/lib/components/card.dart | 24 + .../remix/demo/lib/components/checkbox.dart | 41 ++ .../remix/demo/lib/components/divider.dart | 13 + .../remix/demo/lib/components/list_tile.dart | 41 ++ packages/remix/demo/lib/components/radio.dart | 28 + .../remix/demo/lib/components/switch.dart | 24 + packages/remix/demo/lib/main.dart | 22 + .../remix/demo/lib/main.directories.g.dart | 150 +++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../ephemeral/Flutter-Generated.xcconfig | 11 + .../ephemeral/flutter_export_environment.sh | 12 + packages/remix/demo/pubspec.yaml | 32 + packages/remix/demo/web/favicon.png | Bin 0 -> 917 bytes packages/remix/demo/web/icons/Icon-192.png | Bin 0 -> 5292 bytes packages/remix/demo/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../demo/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../demo/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes packages/remix/demo/web/index.html | 59 ++ packages/remix/demo/web/manifest.json | 35 + .../remix/lib/components/alert/alert.dart | 85 +++ .../lib/components/alert/alert.style.dart | 104 +++ .../remix/lib/components/avatar/avatar.dart | 62 ++ .../lib/components/avatar/avatar.style.dart | 72 ++ .../remix/lib/components/badge/badge.dart | 40 ++ .../lib/components/badge/badge.style.dart | 63 ++ .../remix/lib/components/button/button.dart | 94 +++ .../lib/components/button/button.style.dart | 121 ++++ .../components/button/button.variants.dart | 41 ++ .../lib/components/button/button_spec.dart | 19 + .../lib/components/button/button_spec.g.dart | 223 +++++++ packages/remix/lib/components/card/card.dart | 68 ++ .../remix/lib/components/card/card.style.dart | 46 ++ .../lib/components/checkbox/checkbox.dart | 122 ++++ .../checkbox/checkbox.variants.dart | 8 + .../checkbox/tokens/checkbox_attr.dart | 44 ++ .../checkbox/tokens/checkbox_spec.dart | 63 ++ .../checkbox/tokens/checkbox_util.dart | 41 ++ .../remix/lib/components/divider/divider.dart | 32 + .../lib/components/divider/divider.style.dart | 45 ++ .../lib/components/list_tile/list_tile.dart | 73 +++ .../components/list_tile/list_tile.style.dart | 84 +++ .../remix/lib/components/radio/radio.dart | 66 ++ .../lib/components/radio/radio.style.dart | 97 +++ .../lib/components/radio/radio.variants.dart | 8 + .../remix/lib/components/switch/switch.dart | 52 ++ .../lib/components/switch/switch.style.dart | 73 +++ .../components/switch/switch.variants.dart | 8 + packages/remix/lib/helpers/color_utils.dart | 38 ++ packages/remix/lib/remix.dart | 25 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../ephemeral/Flutter-Generated.xcconfig | 11 + .../ephemeral/flutter_export_environment.sh | 12 + packages/remix/pubspec.yaml | 24 + .../remix/test/components/button_test.dart | 100 +++ .../remix/test/components/checkbox_test.dart | 116 ++++ .../remix/test/components/radio_test.dart | 89 +++ .../remix/test/components/switch_test.dart | 68 ++ website/.gitignore | 4 +- 133 files changed, 4617 insertions(+), 14 deletions(-) delete mode 100644 packages/mix_annotations/.gitignore delete mode 100644 packages/mix_lint/.gitignore create mode 100644 packages/remix/LICENSE create mode 100644 packages/remix/README.md create mode 100644 packages/remix/analysis_options.yaml create mode 100644 packages/remix/demo/.gitignore create mode 100644 packages/remix/demo/.metadata create mode 100644 packages/remix/demo/README.md create mode 100644 packages/remix/demo/analysis_options.yaml create mode 100644 packages/remix/demo/android/.gitignore create mode 100644 packages/remix/demo/android/app/build.gradle create mode 100644 packages/remix/demo/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/remix/demo/android/app/src/main/AndroidManifest.xml create mode 100644 packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt create mode 100644 packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/remix/demo/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/remix/demo/android/app/src/main/res/values/styles.xml create mode 100644 packages/remix/demo/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/remix/demo/android/build.gradle create mode 100644 packages/remix/demo/android/gradle.properties create mode 100644 packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/remix/demo/android/settings.gradle create mode 100644 packages/remix/demo/ios/.gitignore create mode 100644 packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/remix/demo/ios/Flutter/Debug.xcconfig create mode 100644 packages/remix/demo/ios/Flutter/Release.xcconfig create mode 100644 packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/remix/demo/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/remix/demo/ios/Runner/AppDelegate.swift create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/remix/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/remix/demo/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/remix/demo/ios/Runner/Info.plist create mode 100644 packages/remix/demo/ios/Runner/Runner-Bridging-Header.h create mode 100644 packages/remix/demo/ios/RunnerTests/RunnerTests.swift create mode 100644 packages/remix/demo/lib/components/alert.dart create mode 100644 packages/remix/demo/lib/components/avatar.dart create mode 100644 packages/remix/demo/lib/components/badge.dart create mode 100644 packages/remix/demo/lib/components/button.dart create mode 100644 packages/remix/demo/lib/components/card.dart create mode 100644 packages/remix/demo/lib/components/checkbox.dart create mode 100644 packages/remix/demo/lib/components/divider.dart create mode 100644 packages/remix/demo/lib/components/list_tile.dart create mode 100644 packages/remix/demo/lib/components/radio.dart create mode 100644 packages/remix/demo/lib/components/switch.dart create mode 100644 packages/remix/demo/lib/main.dart create mode 100644 packages/remix/demo/lib/main.directories.g.dart create mode 100644 packages/remix/demo/linux/flutter/generated_plugin_registrant.cc create mode 100644 packages/remix/demo/linux/flutter/generated_plugin_registrant.h create mode 100644 packages/remix/demo/linux/flutter/generated_plugins.cmake create mode 100644 packages/remix/demo/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100755 packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh create mode 100644 packages/remix/demo/pubspec.yaml create mode 100644 packages/remix/demo/web/favicon.png create mode 100644 packages/remix/demo/web/icons/Icon-192.png create mode 100644 packages/remix/demo/web/icons/Icon-512.png create mode 100644 packages/remix/demo/web/icons/Icon-maskable-192.png create mode 100644 packages/remix/demo/web/icons/Icon-maskable-512.png create mode 100644 packages/remix/demo/web/index.html create mode 100644 packages/remix/demo/web/manifest.json create mode 100644 packages/remix/lib/components/alert/alert.dart create mode 100644 packages/remix/lib/components/alert/alert.style.dart create mode 100644 packages/remix/lib/components/avatar/avatar.dart create mode 100644 packages/remix/lib/components/avatar/avatar.style.dart create mode 100644 packages/remix/lib/components/badge/badge.dart create mode 100644 packages/remix/lib/components/badge/badge.style.dart create mode 100644 packages/remix/lib/components/button/button.dart create mode 100644 packages/remix/lib/components/button/button.style.dart create mode 100644 packages/remix/lib/components/button/button.variants.dart create mode 100644 packages/remix/lib/components/button/button_spec.dart create mode 100644 packages/remix/lib/components/button/button_spec.g.dart create mode 100644 packages/remix/lib/components/card/card.dart create mode 100644 packages/remix/lib/components/card/card.style.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox.variants.dart create mode 100644 packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart create mode 100644 packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart create mode 100644 packages/remix/lib/components/checkbox/tokens/checkbox_util.dart create mode 100644 packages/remix/lib/components/divider/divider.dart create mode 100644 packages/remix/lib/components/divider/divider.style.dart create mode 100644 packages/remix/lib/components/list_tile/list_tile.dart create mode 100644 packages/remix/lib/components/list_tile/list_tile.style.dart create mode 100644 packages/remix/lib/components/radio/radio.dart create mode 100644 packages/remix/lib/components/radio/radio.style.dart create mode 100644 packages/remix/lib/components/radio/radio.variants.dart create mode 100644 packages/remix/lib/components/switch/switch.dart create mode 100644 packages/remix/lib/components/switch/switch.style.dart create mode 100644 packages/remix/lib/components/switch/switch.variants.dart create mode 100644 packages/remix/lib/helpers/color_utils.dart create mode 100644 packages/remix/lib/remix.dart create mode 100644 packages/remix/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100755 packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh create mode 100644 packages/remix/pubspec.yaml create mode 100644 packages/remix/test/components/button_test.dart create mode 100644 packages/remix/test/components/checkbox_test.dart create mode 100644 packages/remix/test/components/radio_test.dart create mode 100644 packages/remix/test/components/switch_test.dart diff --git a/.gitignore b/.gitignore index 9abb118c0..35a561c1e 100644 --- a/.gitignore +++ b/.gitignore @@ -89,7 +89,7 @@ node_modules # FVM # FVM Version Cache -.fvm/ +.fvm .packages .pub/ diff --git a/packages/mix_annotations/.gitignore b/packages/mix_annotations/.gitignore deleted file mode 100644 index 3cceda557..000000000 --- a/packages/mix_annotations/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# https://dart.dev/guides/libraries/private-files -# Created by `dart pub` -.dart_tool/ - -# Avoid committing pubspec.lock for library packages; see -# https://dart.dev/guides/libraries/private-files#pubspeclock. -pubspec.lock diff --git a/packages/mix_lint/.gitignore b/packages/mix_lint/.gitignore deleted file mode 100644 index 3a8579040..000000000 --- a/packages/mix_lint/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# https://dart.dev/guides/libraries/private-files -# Created by `dart pub` -.dart_tool/ diff --git a/packages/remix/LICENSE b/packages/remix/LICENSE new file mode 100644 index 000000000..deeda1dce --- /dev/null +++ b/packages/remix/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022, Concepta +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/remix/README.md b/packages/remix/README.md new file mode 100644 index 000000000..9c5e05581 --- /dev/null +++ b/packages/remix/README.md @@ -0,0 +1,16 @@ +# remix_ui + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/remix/analysis_options.yaml b/packages/remix/analysis_options.yaml new file mode 100644 index 000000000..61b6c4de1 --- /dev/null +++ b/packages/remix/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/remix/demo/.gitignore b/packages/remix/demo/.gitignore new file mode 100644 index 000000000..29a3a5017 --- /dev/null +++ b/packages/remix/demo/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/packages/remix/demo/.metadata b/packages/remix/demo/.metadata new file mode 100644 index 000000000..0369949f1 --- /dev/null +++ b/packages/remix/demo/.metadata @@ -0,0 +1,36 @@ +# 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: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: android + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: ios + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: web + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/remix/demo/README.md b/packages/remix/demo/README.md new file mode 100644 index 000000000..dbd403a00 --- /dev/null +++ b/packages/remix/demo/README.md @@ -0,0 +1,16 @@ +# demo + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/remix/demo/analysis_options.yaml b/packages/remix/demo/analysis_options.yaml new file mode 100644 index 000000000..0d2902135 --- /dev/null +++ b/packages/remix/demo/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/remix/demo/android/.gitignore b/packages/remix/demo/android/.gitignore new file mode 100644 index 000000000..6f568019d --- /dev/null +++ b/packages/remix/demo/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/packages/remix/demo/android/app/build.gradle b/packages/remix/demo/android/app/build.gradle new file mode 100644 index 000000000..6cc522f88 --- /dev/null +++ b/packages/remix/demo/android/app/build.gradle @@ -0,0 +1,67 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.example.demo" + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.demo" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies {} diff --git a/packages/remix/demo/android/app/src/debug/AndroidManifest.xml b/packages/remix/demo/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/packages/remix/demo/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/remix/demo/android/app/src/main/AndroidManifest.xml b/packages/remix/demo/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..81300528b --- /dev/null +++ b/packages/remix/demo/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt b/packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt new file mode 100644 index 000000000..34b9c4c6c --- /dev/null +++ b/packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.demo + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml b/packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/remix/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/remix/demo/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/packages/remix/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/remix/demo/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/packages/remix/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/remix/demo/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/packages/remix/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/remix/demo/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/packages/remix/demo/android/app/src/main/res/values-night/styles.xml b/packages/remix/demo/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000..06952be74 --- /dev/null +++ b/packages/remix/demo/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/remix/demo/android/app/src/main/res/values/styles.xml b/packages/remix/demo/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..cb1ef8805 --- /dev/null +++ b/packages/remix/demo/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/remix/demo/android/app/src/profile/AndroidManifest.xml b/packages/remix/demo/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..399f6981d --- /dev/null +++ b/packages/remix/demo/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/remix/demo/android/build.gradle b/packages/remix/demo/android/build.gradle new file mode 100644 index 000000000..e83fb5dac --- /dev/null +++ b/packages/remix/demo/android/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/packages/remix/demo/android/gradle.properties b/packages/remix/demo/android/gradle.properties new file mode 100644 index 000000000..598d13fee --- /dev/null +++ b/packages/remix/demo/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties b/packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..3c472b99c --- /dev/null +++ b/packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/packages/remix/demo/android/settings.gradle b/packages/remix/demo/android/settings.gradle new file mode 100644 index 000000000..7cd712855 --- /dev/null +++ b/packages/remix/demo/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" diff --git a/packages/remix/demo/ios/.gitignore b/packages/remix/demo/ios/.gitignore new file mode 100644 index 000000000..7a7f9873a --- /dev/null +++ b/packages/remix/demo/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist b/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..7c5696400 --- /dev/null +++ b/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/packages/remix/demo/ios/Flutter/Debug.xcconfig b/packages/remix/demo/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/remix/demo/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/remix/demo/ios/Flutter/Release.xcconfig b/packages/remix/demo/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/packages/remix/demo/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj b/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..0a73ba1e6 --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,614 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807E294A63A400263BE5 /* Frameworks */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 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 = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + 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 */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..8e3ca5dfe --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/remix/demo/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/remix/demo/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/remix/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/remix/demo/ios/Runner/AppDelegate.swift b/packages/remix/demo/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/packages/remix/demo/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/packages/remix/demo/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/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/remix/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..0bedcf2fd --- /dev/null +++ b/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.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/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/remix/demo/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/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/remix/demo/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/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/remix/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/packages/remix/demo/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/packages/remix/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/remix/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/packages/remix/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/remix/demo/ios/Runner/Base.lproj/Main.storyboard b/packages/remix/demo/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/packages/remix/demo/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/remix/demo/ios/Runner/Info.plist b/packages/remix/demo/ios/Runner/Info.plist new file mode 100644 index 000000000..9f012827d --- /dev/null +++ b/packages/remix/demo/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Demo + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + demo + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/packages/remix/demo/ios/Runner/Runner-Bridging-Header.h b/packages/remix/demo/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/packages/remix/demo/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/remix/demo/ios/RunnerTests/RunnerTests.swift b/packages/remix/demo/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 000000000..86a7c3b1b --- /dev/null +++ b/packages/remix/demo/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/remix/demo/lib/components/alert.dart b/packages/remix/demo/lib/components/alert.dart new file mode 100644 index 000000000..1258d58b3 --- /dev/null +++ b/packages/remix/demo/lib/components/alert.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixAlert, +) +Widget buildCheckboxUseCase(BuildContext context) { + return Center( + child: SizedBox( + width: 300, + child: RemixAlert( + title: context.knobs.string( + label: 'Title', + initialValue: 'Error', + ), + subtitle: context.knobs.string( + label: 'Subtitle', + initialValue: 'Your session has expired. Please log in again.', + ), + icon: context.knobs.boolean( + label: 'icon', + initialValue: false, + ) + ? Icons.warning_amber_rounded + : null, + ), + ), + ); +} diff --git a/packages/remix/demo/lib/components/avatar.dart b/packages/remix/demo/lib/components/avatar.dart new file mode 100644 index 000000000..d7a4ae080 --- /dev/null +++ b/packages/remix/demo/lib/components/avatar.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixAvatar, +) +Widget buildCheckboxUseCase(BuildContext context) { + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + RemixAvatar( + style: RemixAvatarStyle( + container: Style( + $box.height(60), + $box.width(60), + $box.borderRadius(20), + $box.color( + Colors.cyanAccent.shade200.withAlpha(60), + ), + $icon.size(30), + $icon.color(Colors.cyanAccent), + ), + ), + imageBuilder: (style) => const StyledIcon(Icons.person), + ), + const SizedBox(width: 10), + RemixAvatar( + style: RemixAvatarStyle.base().copyWith( + container: Style( + $box.height(50), + $box.width(50), + ), + ), + imageBuilder: (style) => + const StyledIcon(Icons.access_alarms_rounded), + ), + const SizedBox(width: 10), + RemixAvatar( + image: NetworkImage( + 'https://avatars.githubusercontent.com/u/14010287?v=4', + ), + style: RemixAvatarStyle.base().copyWith( + container: Style( + $box.height(40), + $box.width(40), + ), + ), + ), + ], + ), + ); +} diff --git a/packages/remix/demo/lib/components/badge.dart b/packages/remix/demo/lib/components/badge.dart new file mode 100644 index 000000000..69409c143 --- /dev/null +++ b/packages/remix/demo/lib/components/badge.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixBadge, +) +Widget buildCheckboxUseCase(BuildContext context) { + return Center( + child: RemixBadge( + label: context.knobs.string( + label: "Label", + description: 'The text displayed in the badge', + initialValue: "Label", + ), + ), + ); +} diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button.dart new file mode 100644 index 000000000..61994d1a4 --- /dev/null +++ b/packages/remix/demo/lib/components/button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixButton, +) +Widget buildButtonUseCase(BuildContext context) { + return Center( + child: RemixButton( + label: context.knobs.stringOrNull( + label: 'Title', + initialValue: 'Title', + ), + onPressed: () {}, + loading: context.knobs.boolean( + label: 'Is loading', + initialValue: false, + ), + loadingLabel: context.knobs.stringOrNull( + label: 'Loading label', + initialValue: 'Loading', + ), + disabled: context.knobs.boolean( + label: 'Disabled', + initialValue: false, + ), + size: context.knobs.list( + label: 'Size', + options: ButtonSizeVariant.values, + labelBuilder: (value) => value.name.split('.').last, + ), + type: context.knobs.list( + label: 'Type', + options: ButtonType.values, + labelBuilder: (value) => value.name.split('.').last, + ), + ), + ); +} diff --git a/packages/remix/demo/lib/components/card.dart b/packages/remix/demo/lib/components/card.dart new file mode 100644 index 000000000..cef6890ec --- /dev/null +++ b/packages/remix/demo/lib/components/card.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixCard, +) +Widget buildCheckboxUseCase(BuildContext context) { + return const Center( + child: SizedBox( + width: 300, + child: RemixCard( + child: RemixListTile( + leading: RemixAvatar( + fallbackLabel: 'LF', + ), + title: 'Title', + subtitle: 'Subtitle', + ), + ), + ), + ); +} diff --git a/packages/remix/demo/lib/components/checkbox.dart b/packages/remix/demo/lib/components/checkbox.dart new file mode 100644 index 000000000..492641704 --- /dev/null +++ b/packages/remix/demo/lib/components/checkbox.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixCheckbox, +) +Widget buildCheckboxUseCase(BuildContext context) { + return Center( + child: Row( + children: [ + Box( + style: Style( + $box.color.grey(), + $box.height(20), + $box.width(20), + $box.borderRadius(4), + ), + ), + RemixCheckbox( + label: context.knobs.stringOrNull( + label: 'Title', + initialValue: 'Title', + ), + onChanged: (value) {}, + value: context.knobs.boolean( + label: 'Checked', + initialValue: false, + ), + disabled: context.knobs.boolean( + label: 'Disabled', + initialValue: false, + ), + ), + ], + ), + ); +} diff --git a/packages/remix/demo/lib/components/divider.dart b/packages/remix/demo/lib/components/divider.dart new file mode 100644 index 000000000..0e80c6c5a --- /dev/null +++ b/packages/remix/demo/lib/components/divider.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixDivider, +) +Widget buildCheckboxUseCase(BuildContext context) { + return const Center( + child: RemixDivider(), + ); +} diff --git a/packages/remix/demo/lib/components/list_tile.dart b/packages/remix/demo/lib/components/list_tile.dart new file mode 100644 index 000000000..0185a92b1 --- /dev/null +++ b/packages/remix/demo/lib/components/list_tile.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixListTile, +) +Widget buildCheckboxUseCase(BuildContext context) { + return Center( + child: RemixListTile( + leading: RemixAvatar( + style: RemixAvatarStyle.base().copyWith( + container: Style( + $box.height(60), + $box.width(60), + $box.borderRadius(6), + $box.color( + Colors.black26, + ), + ), + ), + fallbackLabel: 'LF', + ), + title: context.knobs.string( + label: 'Title', + initialValue: 'Title', + ), + subtitle: context.knobs.string( + label: 'Subtitle', + initialValue: 'Subtitle', + ), + trailing: Icon( + Icons.arrow_forward_ios, + size: 16, + ), + ), + ); +} diff --git a/packages/remix/demo/lib/components/radio.dart b/packages/remix/demo/lib/components/radio.dart new file mode 100644 index 000000000..d09107307 --- /dev/null +++ b/packages/remix/demo/lib/components/radio.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixRadio, +) +Widget buildRadioUseCase(BuildContext context) { + return Center( + child: RemixRadio( + active: context.knobs.boolean( + label: 'active', + initialValue: true, + ), + label: context.knobs.string( + label: 'label', + initialValue: 'Radio', + ), + disabled: context.knobs.boolean( + label: 'disabled', + initialValue: false, + ), + onChanged: (value) {}, + ), + ); +} diff --git a/packages/remix/demo/lib/components/switch.dart b/packages/remix/demo/lib/components/switch.dart new file mode 100644 index 000000000..0297c55fc --- /dev/null +++ b/packages/remix/demo/lib/components/switch.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'interactive playground', + type: RemixSwitch, +) +Widget buildRadioUseCase(BuildContext context) { + return Center( + child: RemixSwitch( + active: context.knobs.boolean( + label: 'active', + initialValue: true, + ), + disabled: context.knobs.boolean( + label: 'disabled', + initialValue: false, + ), + onChanged: (value) {}, + ), + ); +} diff --git a/packages/remix/demo/lib/main.dart b/packages/remix/demo/lib/main.dart new file mode 100644 index 000000000..b2b270629 --- /dev/null +++ b/packages/remix/demo/lib/main.dart @@ -0,0 +1,22 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +import 'main.directories.g.dart'; + +@widgetbook.App() +void main() { + runApp(const HotReload()); +} + +class HotReload extends StatelessWidget { + const HotReload({super.key}); + + @override + Widget build(BuildContext context) { + return Widgetbook.material( + directories: directories, + ); + } +} diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart new file mode 100644 index 000000000..2616f50dc --- /dev/null +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -0,0 +1,150 @@ +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_import, prefer_relative_imports, directives_ordering + +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// AppGenerator +// ************************************************************************** + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:demo/components/alert.dart' as _i2; +import 'package:demo/components/avatar.dart' as _i3; +import 'package:demo/components/badge.dart' as _i4; +import 'package:demo/components/button.dart' as _i5; +import 'package:demo/components/card.dart' as _i6; +import 'package:demo/components/checkbox.dart' as _i7; +import 'package:demo/components/divider.dart' as _i8; +import 'package:demo/components/list_tile.dart' as _i9; +import 'package:demo/components/radio.dart' as _i10; +import 'package:demo/components/switch.dart' as _i11; +import 'package:widgetbook/widgetbook.dart' as _i1; + +final directories = <_i1.WidgetbookNode>[ + _i1.WidgetbookFolder( + name: 'components', + children: [ + _i1.WidgetbookFolder( + name: 'alert', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixAlert', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i2.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'avatar', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixAvatar', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i3.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'badge', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixBadge', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i4.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'button', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixButton', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i5.buildButtonUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'card', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixCard', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i6.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'checkbox', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixCheckbox', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i7.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'divider', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixDivider', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i8.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'list_tile', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixListTile', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i9.buildCheckboxUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'radio', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixRadio', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i10.buildRadioUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'switch', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RemixSwitch', + useCase: _i1.WidgetbookUseCase( + name: 'interactive playground', + builder: _i11.buildRadioUseCase, + ), + ) + ], + ), + ], + ) +]; diff --git a/packages/remix/demo/linux/flutter/generated_plugin_registrant.cc b/packages/remix/demo/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..e71a16d23 --- /dev/null +++ b/packages/remix/demo/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/packages/remix/demo/linux/flutter/generated_plugin_registrant.h b/packages/remix/demo/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..e0f0a47bc --- /dev/null +++ b/packages/remix/demo/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/remix/demo/linux/flutter/generated_plugins.cmake b/packages/remix/demo/linux/flutter/generated_plugins.cmake new file mode 100644 index 000000000..2e1de87a7 --- /dev/null +++ b/packages/remix/demo/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/remix/demo/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/remix/demo/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 000000000..cccf817a5 --- /dev/null +++ b/packages/remix/demo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 000000000..abe3d6a82 --- /dev/null +++ b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/leofarias/flutter +FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui/demo +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 000000000..18f6e5993 --- /dev/null +++ b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/leofarias/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui/demo" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/remix/demo/pubspec.yaml b/packages/remix/demo/pubspec.yaml new file mode 100644 index 000000000..ca17c614f --- /dev/null +++ b/packages/remix/demo/pubspec.yaml @@ -0,0 +1,32 @@ +name: demo +description: "A new Flutter project." + +publish_to: "none" + +version: 1.0.0+1 + +environment: + sdk: ">=2.19.2 <4.0.0" + +dependencies: + flutter: + sdk: flutter + + cupertino_icons: ^1.0.2 + widgetbook_annotation: ^3.1.0 + widgetbook: ^3.7.1 + remix: + path: ../ + + mix: ^1.1.0 + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_lints: ^2.0.0 + widgetbook_generator: ^3.7.0 + build_runner: ^2.4.8 + +flutter: + uses-material-design: true diff --git a/packages/remix/demo/web/favicon.png b/packages/remix/demo/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/packages/remix/demo/web/icons/Icon-192.png b/packages/remix/demo/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/web/icons/Icon-512.png b/packages/remix/demo/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/web/icons/Icon-maskable-192.png b/packages/remix/demo/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/packages/remix/demo/web/icons/Icon-maskable-512.png b/packages/remix/demo/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 zcmeFZ_gj-)&^4Nb2tlbLMU<{!p(#yjqEe+=0IA_oih%ScH9@5#MNp&}Y#;;(h=A0@ zh7{>lT2MkSQ344eAvrhici!td|HJuyvJm#Y_w1Q9Yu3!26dNlO-oxUDK_C#XnW^Co z5C{VN6#{~B0)K2j7}*1Xq(Nqemv23A-6&=ZpEijkVnSwVGqLv40?n0=p;k3-U5e5+ z+z3>aS`u9DS=!wg8ROu?X4TFoW6CFLL&{GzoVT)ldhLekLM|+j3tIxRd|*5=c{=s&*vfPdBr(Fyj(v@%eQj1Soy7m4^@VRl1~@-PV7y+c!xz$8436WBn$t{=}mEdK#k`aystimGgI{(IBx$!pAwFoE9Y`^t^;> zKAD)C(Dl^s%`?q5$P|fZf8Xymrtu^Pv(7D`rn>Z-w$Ahs!z9!94WNVxrJuXfHAaxg zC6s@|Z1$7R$(!#t%Jb{{s6(Y?NoQXDYq)!}X@jKPhe`{9KQ@sAU8y-5`xt?S9$jKH zoi}6m5PcG*^{kjvt+kwPpyQzVg4o)a>;LK`aaN2x4@itBD3Aq?yWTM20VRn1rrd+2 zKO=P0rMjEGq_UqpMa`~7B|p?xAN1SCoCp}QxAv8O`jLJ5CVh@umR%c%i^)6!o+~`F zaalSTQcl5iwOLC&H)efzd{8(88mo`GI(56T<(&p7>Qd^;R1hn1Y~jN~tApaL8>##U zd65bo8)79CplWxr#z4!6HvLz&N7_5AN#x;kLG?zQ(#p|lj<8VUlKY=Aw!ATqeL-VG z42gA!^cMNPj>(`ZMEbCrnkg*QTsn*u(nQPWI9pA{MQ=IsPTzd7q5E#7+z>Ch=fx$~ z;J|?(5jTo5UWGvsJa(Sx0?S#56+8SD!I^tftyeh_{5_31l6&Hywtn`bbqYDqGZXI( zCG7hBgvksX2ak8+)hB4jnxlO@A32C_RM&g&qDSb~3kM&)@A_j1*oTO@nicGUyv+%^ z=vB)4(q!ykzT==Z)3*3{atJ5}2PV*?Uw+HhN&+RvKvZL3p9E?gHjv{6zM!A|z|UHK z-r6jeLxbGn0D@q5aBzlco|nG2tr}N@m;CJX(4#Cn&p&sLKwzLFx1A5izu?X_X4x8r@K*d~7>t1~ zDW1Mv5O&WOxbzFC`DQ6yNJ(^u9vJdj$fl2dq`!Yba_0^vQHXV)vqv1gssZYzBct!j zHr9>ydtM8wIs}HI4=E}qAkv|BPWzh3^_yLH(|kdb?x56^BlDC)diWyPd*|f!`^12_U>TD^^94OCN0lVv~Sgvs94ecpE^}VY$w`qr_>Ue zTfH~;C<3H<0dS5Rkf_f@1x$Gms}gK#&k()IC0zb^QbR!YLoll)c$Agfi6MKI0dP_L z=Uou&u~~^2onea2%XZ@>`0x^L8CK6=I{ge;|HXMj)-@o~h&O{CuuwBX8pVqjJ*o}5 z#8&oF_p=uSo~8vn?R0!AMWvcbZmsrj{ZswRt(aEdbi~;HeVqIe)-6*1L%5u$Gbs}| zjFh?KL&U(rC2izSGtwP5FnsR@6$-1toz?RvLD^k~h9NfZgzHE7m!!7s6(;)RKo2z} zB$Ci@h({l?arO+vF;s35h=|WpefaOtKVx>l399}EsX@Oe3>>4MPy%h&^3N_`UTAHJ zI$u(|TYC~E4)|JwkWW3F!Tib=NzjHs5ii2uj0^m|Qlh-2VnB#+X~RZ|`SA*}}&8j9IDv?F;(Y^1=Z0?wWz;ikB zewU>MAXDi~O7a~?jx1x=&8GcR-fTp>{2Q`7#BE#N6D@FCp`?ht-<1|y(NArxE_WIu zP+GuG=Qq>SHWtS2M>34xwEw^uvo4|9)4s|Ac=ud?nHQ>ax@LvBqusFcjH0}{T3ZPQ zLO1l<@B_d-(IS682}5KA&qT1+{3jxKolW+1zL4inqBS-D>BohA!K5++41tM@ z@xe<-qz27}LnV#5lk&iC40M||JRmZ*A##K3+!j93eouU8@q-`W0r%7N`V$cR&JV;iX(@cS{#*5Q>~4BEDA)EikLSP@>Oo&Bt1Z~&0d5)COI%3$cLB_M?dK# z{yv2OqW!al-#AEs&QFd;WL5zCcp)JmCKJEdNsJlL9K@MnPegK23?G|O%v`@N{rIRa zi^7a}WBCD77@VQ-z_v{ZdRsWYrYgC$<^gRQwMCi6);%R~uIi31OMS}=gUTE(GKmCI z$zM>mytL{uNN+a&S38^ez(UT=iSw=l2f+a4)DyCA1Cs_N-r?Q@$3KTYosY!;pzQ0k zzh1G|kWCJjc(oZVBji@kN%)UBw(s{KaYGy=i{g3{)Z+&H8t2`^IuLLKWT6lL<-C(! zSF9K4xd-|VO;4}$s?Z7J_dYqD#Mt)WCDnsR{Kpjq275uUq6`v0y*!PHyS(}Zmv)_{>Vose9-$h8P0|y;YG)Bo}$(3Z%+Gs0RBmFiW!^5tBmDK-g zfe5%B*27ib+7|A*Fx5e)2%kIxh7xWoc3pZcXS2zik!63lAG1;sC1ja>BqH7D zODdi5lKW$$AFvxgC-l-)!c+9@YMC7a`w?G(P#MeEQ5xID#<}W$3bSmJ`8V*x2^3qz zVe<^^_8GHqYGF$nIQm0Xq2kAgYtm#UC1A(=&85w;rmg#v906 zT;RyMgbMpYOmS&S9c38^40oUp?!}#_84`aEVw;T;r%gTZkWeU;;FwM@0y0adt{-OK z(vGnPSlR=Nv2OUN!2=xazlnHPM9EWxXg2EKf0kI{iQb#FoP>xCB<)QY>OAM$Dcdbm zU6dU|%Mo(~avBYSjRc13@|s>axhrPl@Sr81{RSZUdz4(=|82XEbV*JAX6Lfbgqgz584lYgi0 z2-E{0XCVON$wHfvaLs;=dqhQJ&6aLn$D#0i(FkAVrXG9LGm3pSTf&f~RQb6|1_;W> z?n-;&hrq*~L=(;u#jS`*Yvh@3hU-33y_Kv1nxqrsf>pHVF&|OKkoC)4DWK%I!yq?P z=vXo8*_1iEWo8xCa{HJ4tzxOmqS0&$q+>LroMKI*V-rxhOc%3Y!)Y|N6p4PLE>Yek>Y(^KRECg8<|%g*nQib_Yc#A5q8Io z6Ig&V>k|~>B6KE%h4reAo*DfOH)_01tE0nWOxX0*YTJgyw7moaI^7gW*WBAeiLbD?FV9GSB zPv3`SX*^GRBM;zledO`!EbdBO_J@fEy)B{-XUTVQv}Qf~PSDpK9+@I`7G7|>Dgbbu z_7sX9%spVo$%qwRwgzq7!_N;#Td08m5HV#?^dF-EV1o)Q=Oa+rs2xH#g;ykLbwtCh znUnA^dW!XjspJ;otq$yV@I^s9Up(5k7rqhQd@OLMyyxVLj_+$#Vc*}Usevp^I(^vH zmDgHc0VMme|K&X?9&lkN{yq_(If)O`oUPW8X}1R5pSVBpfJe0t{sPA(F#`eONTh_) zxeLqHMfJX#?P(@6w4CqRE@Eiza; z;^5)Kk=^5)KDvd9Q<`=sJU8rjjxPmtWMTmzcH={o$U)j=QBuHarp?=}c??!`3d=H$nrJMyr3L-& zA#m?t(NqLM?I3mGgWA_C+0}BWy3-Gj7bR+d+U?n*mN$%5P`ugrB{PeV>jDUn;eVc- zzeMB1mI4?fVJatrNyq|+zn=!AiN~<}eoM#4uSx^K?Iw>P2*r=k`$<3kT00BE_1c(02MRz4(Hq`L^M&xt!pV2 zn+#U3@j~PUR>xIy+P>51iPayk-mqIK_5rlQMSe5&tDkKJk_$i(X&;K(11YGpEc-K= zq4Ln%^j>Zi_+Ae9eYEq_<`D+ddb8_aY!N;)(&EHFAk@Ekg&41ABmOXfWTo)Z&KotA zh*jgDGFYQ^y=m)<_LCWB+v48DTJw*5dwMm_YP0*_{@HANValf?kV-Ic3xsC}#x2h8 z`q5}d8IRmqWk%gR)s~M}(Qas5+`np^jW^oEd-pzERRPMXj$kS17g?H#4^trtKtq;C?;c ztd|%|WP2w2Nzg@)^V}!Gv++QF2!@FP9~DFVISRW6S?eP{H;;8EH;{>X_}NGj^0cg@ z!2@A>-CTcoN02^r6@c~^QUa={0xwK0v4i-tQ9wQq^=q*-{;zJ{Qe%7Qd!&X2>rV@4 z&wznCz*63_vw4>ZF8~%QCM?=vfzW0r_4O^>UA@otm_!N%mH)!ERy&b!n3*E*@?9d^ zu}s^By@FAhG(%?xgJMuMzuJw2&@$-oK>n z=UF}rt%vuaP9fzIFCYN-1&b#r^Cl6RDFIWsEsM|ROf`E?O(cy{BPO2Ie~kT+^kI^i zp>Kbc@C?}3vy-$ZFVX#-cx)Xj&G^ibX{pWggtr(%^?HeQL@Z( zM-430g<{>vT*)jK4aY9(a{lSy{8vxLbP~n1MXwM527ne#SHCC^F_2@o`>c>>KCq9c(4c$VSyMl*y3Nq1s+!DF| z^?d9PipQN(mw^j~{wJ^VOXDCaL$UtwwTpyv8IAwGOg<|NSghkAR1GSNLZ1JwdGJYm zP}t<=5=sNNUEjc=g(y)1n5)ynX(_$1-uGuDR*6Y^Wgg(LT)Jp><5X|}bt z_qMa&QP?l_n+iVS>v%s2Li_;AIeC=Ca^v1jX4*gvB$?H?2%ndnqOaK5-J%7a} zIF{qYa&NfVY}(fmS0OmXA70{znljBOiv5Yod!vFU{D~*3B3Ka{P8?^ zfhlF6o7aNT$qi8(w<}OPw5fqA7HUje*r*Oa(YV%*l0|9FP9KW@U&{VSW{&b0?@y)M zs%4k1Ax;TGYuZ9l;vP5@?3oQsp3)rjBeBvQQ>^B;z5pc=(yHhHtq6|0m(h4envn_j787fizY@V`o(!SSyE7vlMT zbo=Z1c=atz*G!kwzGB;*uPL$Ei|EbZLh8o+1BUMOpnU(uX&OG1MV@|!&HOOeU#t^x zr9=w2ow!SsTuJWT7%Wmt14U_M*3XiWBWHxqCVZI0_g0`}*^&yEG9RK9fHK8e+S^m? zfCNn$JTswUVbiC#>|=wS{t>-MI1aYPLtzO5y|LJ9nm>L6*wpr_m!)A2Fb1RceX&*|5|MwrvOk4+!0p99B9AgP*9D{Yt|x=X}O% zgIG$MrTB=n-!q%ROT|SzH#A$Xm;|ym)0>1KR}Yl0hr-KO&qMrV+0Ej3d@?FcgZ+B3 ztEk16g#2)@x=(ko8k7^Tq$*5pfZHC@O@}`SmzT1(V@x&NkZNM2F#Q-Go7-uf_zKC( zB(lHZ=3@dHaCOf6C!6i8rDL%~XM@rVTJbZL09?ht@r^Z_6x}}atLjvH^4Vk#Ibf(^LiBJFqorm?A=lE zzFmwvp4bT@Nv2V>YQT92X;t9<2s|Ru5#w?wCvlhcHLcsq0TaFLKy(?nzezJ>CECqj zggrI~Hd4LudM(m{L@ezfnpELsRFVFw>fx;CqZtie`$BXRn#Ns%AdoE$-Pf~{9A8rV zf7FbgpKmVzmvn-z(g+&+-ID=v`;6=)itq8oM*+Uz**SMm_{%eP_c0{<%1JGiZS19o z@Gj7$Se~0lsu}w!%;L%~mIAO;AY-2i`9A*ZfFs=X!LTd6nWOZ7BZH2M{l2*I>Xu)0 z`<=;ObglnXcVk!T>e$H?El}ra0WmPZ$YAN0#$?|1v26^(quQre8;k20*dpd4N{i=b zuN=y}_ew9SlE~R{2+Rh^7%PA1H5X(p8%0TpJ=cqa$65XL)$#ign-y!qij3;2>j}I; ziO@O|aYfn&up5F`YtjGw68rD3{OSGNYmBnl?zdwY$=RFsegTZ=kkzRQ`r7ZjQP!H( zp4>)&zf<*N!tI00xzm-ME_a{_I!TbDCr;8E;kCH4LlL-tqLxDuBn-+xgPk37S&S2^ z2QZumkIimwz!c@!r0)j3*(jPIs*V!iLTRl0Cpt_UVNUgGZzdvs0(-yUghJfKr7;=h zD~y?OJ-bWJg;VdZ^r@vlDoeGV&8^--!t1AsIMZ5S440HCVr%uk- z2wV>!W1WCvFB~p$P$$_}|H5>uBeAe>`N1FI8AxM|pq%oNs;ED8x+tb44E) zTj{^fbh@eLi%5AqT?;d>Es5D*Fi{Bpk)q$^iF!!U`r2hHAO_?#!aYmf>G+jHsES4W zgpTKY59d?hsb~F0WE&dUp6lPt;Pm zcbTUqRryw^%{ViNW%Z(o8}dd00H(H-MmQmOiTq{}_rnwOr*Ybo7*}3W-qBT!#s0Ie z-s<1rvvJx_W;ViUD`04%1pra*Yw0BcGe)fDKUK8aF#BwBwMPU;9`!6E(~!043?SZx z13K%z@$$#2%2ovVlgFIPp7Q6(vO)ud)=*%ZSucL2Dh~K4B|%q4KnSpj#n@(0B})!9 z8p*hY@5)NDn^&Pmo;|!>erSYg`LkO?0FB@PLqRvc>4IsUM5O&>rRv|IBRxi(RX(gJ ztQ2;??L~&Mv;aVr5Q@(?y^DGo%pO^~zijld41aA0KKsy_6FeHIn?fNHP-z>$OoWer zjZ5hFQTy*-f7KENRiCE$ZOp4|+Wah|2=n@|W=o}bFM}Y@0e62+_|#fND5cwa3;P{^pEzlJbF1Yq^}>=wy8^^^$I2M_MH(4Dw{F6hm+vrWV5!q;oX z;tTNhz5`-V={ew|bD$?qcF^WPR{L(E%~XG8eJx(DoGzt2G{l8r!QPJ>kpHeOvCv#w zr=SSwMDaUX^*~v%6K%O~i)<^6`{go>a3IdfZ8hFmz&;Y@P%ZygShQZ2DSHd`m5AR= zx$wWU06;GYwXOf(%MFyj{8rPFXD};JCe85Bdp4$YJ2$TzZ7Gr#+SwCvBI1o$QP0(c zy`P51FEBV2HTisM3bHqpmECT@H!Y2-bv2*SoSPoO?wLe{M#zDTy@ujAZ!Izzky~3k zRA1RQIIoC*Mej1PH!sUgtkR0VCNMX(_!b65mo66iM*KQ7xT8t2eev$v#&YdUXKwGm z7okYAqYF&bveHeu6M5p9xheRCTiU8PFeb1_Rht0VVSbm%|1cOVobc8mvqcw!RjrMRM#~=7xibH&Fa5Imc|lZ{eC|R__)OrFg4@X_ ze+kk*_sDNG5^ELmHnZ7Ue?)#6!O)#Nv*Dl2mr#2)w{#i-;}0*_h4A%HidnmclH#;Q zmQbq+P4DS%3}PpPm7K_K3d2s#k~x+PlTul7+kIKol0@`YN1NG=+&PYTS->AdzPv!> zQvzT=)9se*Jr1Yq+C{wbK82gAX`NkbXFZ)4==j4t51{|-v!!$H8@WKA={d>CWRW+g z*`L>9rRucS`vbXu0rzA1#AQ(W?6)}1+oJSF=80Kf_2r~Qm-EJ6bbB3k`80rCv(0d` zvCf3;L2ovYG_TES%6vSuoKfIHC6w;V31!oqHM8-I8AFzcd^+_86!EcCOX|Ta9k1!s z_Vh(EGIIsI3fb&dF$9V8v(sTBC%!#<&KIGF;R+;MyC0~}$gC}}= zR`DbUVc&Bx`lYykFZ4{R{xRaUQkWCGCQlEc;!mf=+nOk$RUg*7 z;kP7CVLEc$CA7@6VFpsp3_t~m)W0aPxjsA3e5U%SfY{tp5BV5jH-5n?YX7*+U+Zs%LGR>U- z!x4Y_|4{gx?ZPJobISy991O znrmrC3otC;#4^&Rg_iK}XH(XX+eUHN0@Oe06hJk}F?`$)KmH^eWz@@N%wEc)%>?Ft z#9QAroDeyfztQ5Qe{m*#R#T%-h*&XvSEn@N$hYRTCMXS|EPwzF3IIysD2waj`vQD{ zv_#^Pgr?s~I*NE=acf@dWVRNWTr(GN0wrL)Z2=`Dr>}&ZDNX|+^Anl{Di%v1Id$_p zK5_H5`RDjJx`BW7hc85|> zHMMsWJ4KTMRHGu+vy*kBEMjz*^K8VtU=bXJYdhdZ-?jTXa$&n)C?QQIZ7ln$qbGlr zS*TYE+ppOrI@AoPP=VI-OXm}FzgXRL)OPvR$a_=SsC<3Jb+>5makX|U!}3lx4tX&L z^C<{9TggZNoeX!P1jX_K5HkEVnQ#s2&c#umzV6s2U-Q;({l+j^?hi7JnQ7&&*oOy9 z(|0asVTWUCiCnjcOnB2pN0DpuTglKq;&SFOQ3pUdye*eT<2()7WKbXp1qq9=bhMWlF-7BHT|i3TEIT77AcjD(v=I207wi-=vyiw5mxgPdTVUC z&h^FEUrXwWs9en2C{ywZp;nvS(Mb$8sBEh-*_d-OEm%~p1b2EpcwUdf<~zmJmaSTO zSX&&GGCEz-M^)G$fBvLC2q@wM$;n4jp+mt0MJFLuJ%c`tSp8$xuP|G81GEd2ci$|M z4XmH{5$j?rqDWoL4vs!}W&!?!rtj=6WKJcE>)?NVske(p;|#>vL|M_$as=mi-n-()a*OU3Okmk0wC<9y7t^D(er-&jEEak2!NnDiOQ99Wx8{S8}=Ng!e0tzj*#T)+%7;aM$ z&H}|o|J1p{IK0Q7JggAwipvHvko6>Epmh4RFRUr}$*2K4dz85o7|3#Bec9SQ4Y*;> zXWjT~f+d)dp_J`sV*!w>B%)#GI_;USp7?0810&3S=WntGZ)+tzhZ+!|=XlQ&@G@~3 z-dw@I1>9n1{+!x^Hz|xC+P#Ab`E@=vY?3%Bc!Po~e&&&)Qp85!I|U<-fCXy*wMa&t zgDk!l;gk;$taOCV$&60z+}_$ykz=Ea*)wJQ3-M|p*EK(cvtIre0Pta~(95J7zoxBN zS(yE^3?>88AL0Wfuou$BM{lR1hkrRibz=+I9ccwd`ZC*{NNqL)3pCcw^ygMmrG^Yp zn5f}Xf>%gncC=Yq96;rnfp4FQL#{!Y*->e82rHgY4Zwy{`JH}b9*qr^VA{%~Z}jtp z_t$PlS6}5{NtTqXHN?uI8ut8rOaD#F1C^ls73S=b_yI#iZDOGz3#^L@YheGd>L;<( z)U=iYj;`{>VDNzIxcjbTk-X3keXR8Xbc`A$o5# zKGSk-7YcoBYuAFFSCjGi;7b<;n-*`USs)IX z=0q6WZ=L!)PkYtZE-6)azhXV|+?IVGTOmMCHjhkBjfy@k1>?yFO3u!)@cl{fFAXnRYsWk)kpT?X{_$J=|?g@Q}+kFw|%n!;Zo}|HE@j=SFMvT8v`6Y zNO;tXN^036nOB2%=KzxB?n~NQ1K8IO*UE{;Xy;N^ZNI#P+hRZOaHATz9(=)w=QwV# z`z3+P>9b?l-@$@P3<;w@O1BdKh+H;jo#_%rr!ute{|YX4g5}n?O7Mq^01S5;+lABE+7`&_?mR_z7k|Ja#8h{!~j)| zbBX;*fsbUak_!kXU%HfJ2J+G7;inu#uRjMb|8a){=^))y236LDZ$$q3LRlat1D)%7K0!q5hT5V1j3qHc7MG9 z_)Q=yQ>rs>3%l=vu$#VVd$&IgO}Za#?aN!xY>-<3PhzS&q!N<=1Q7VJBfHjug^4|) z*fW^;%3}P7X#W3d;tUs3;`O&>;NKZBMR8au6>7?QriJ@gBaorz-+`pUWOP73DJL=M z(33uT6Gz@Sv40F6bN|H=lpcO z^AJl}&=TIjdevuDQ!w0K*6oZ2JBOhb31q!XDArFyKpz!I$p4|;c}@^bX{>AXdt7Bm zaLTk?c%h@%xq02reu~;t@$bv`b3i(P=g}~ywgSFpM;}b$zAD+=I!7`V~}ARB(Wx0C(EAq@?GuxOL9X+ffbkn3+Op0*80TqmpAq~EXmv%cq36celXmRz z%0(!oMp&2?`W)ALA&#|fu)MFp{V~~zIIixOxY^YtO5^FSox8v$#d0*{qk0Z)pNTt0QVZ^$`4vImEB>;Lo2!7K05TpY-sl#sWBz_W-aDIV`Ksabi zvpa#93Svo!70W*Ydh)Qzm{0?CU`y;T^ITg-J9nfWeZ-sbw)G@W?$Eomf%Bg2frfh5 zRm1{|E0+(4zXy){$}uC3%Y-mSA2-^I>Tw|gQx|7TDli_hB>``)Q^aZ`LJC2V3U$SABP}T)%}9g2pF9dT}aC~!rFFgkl1J$ z`^z{Arn3On-m%}r}TGF8KQe*OjSJ=T|caa_E;v89A{t@$yT^(G9=N9F?^kT*#s3qhJq!IH5|AhnqFd z0B&^gm3w;YbMNUKU>naBAO@fbz zqw=n!@--}o5;k6DvTW9pw)IJVz;X}ncbPVrmH>4x);8cx;q3UyiML1PWp%bxSiS|^ zC5!kc4qw%NSOGQ*Kcd#&$30=lDvs#*4W4q0u8E02U)7d=!W7+NouEyuF1dyH$D@G& zaFaxo9Ex|ZXA5y{eZT*i*dP~INSMAi@mvEX@q5i<&o&#sM}Df?Og8n8Ku4vOux=T% zeuw~z1hR}ZNwTn8KsQHKLwe2>p^K`YWUJEdVEl|mO21Bov!D0D$qPoOv=vJJ`)|%_ z>l%`eexY7t{BlVKP!`a^U@nM?#9OC*t76My_E_<16vCz1x_#82qj2PkWiMWgF8bM9 z(1t4VdHcJ;B~;Q%x01k_gQ0>u2*OjuEWNOGX#4}+N?Gb5;+NQMqp}Puqw2HnkYuKA zzKFWGHc&K>gwVgI1Sc9OT1s6fq=>$gZU!!xsilA$fF`kLdGoX*^t}ao@+^WBpk>`8 z4v_~gK|c2rCq#DZ+H)$3v~Hoi=)=1D==e3P zpKrRQ+>O^cyTuWJ%2}__0Z9SM_z9rptd*;-9uC1tDw4+A!=+K%8~M&+Zk#13hY$Y$ zo-8$*8dD5@}XDi19RjK6T^J~DIXbF5w&l?JLHMrf0 zLv0{7*G!==o|B%$V!a=EtVHdMwXLtmO~vl}P6;S(R2Q>*kTJK~!}gloxj)m|_LYK{ zl(f1cB=EON&wVFwK?MGn^nWuh@f95SHatPs(jcwSY#Dnl1@_gkOJ5=f`%s$ZHljRH0 z+c%lrb=Gi&N&1>^L_}#m>=U=(oT^vTA&3!xXNyqi$pdW1BDJ#^{h|2tZc{t^vag3& zAD7*8C`chNF|27itjBUo^CCDyEpJLX3&u+(L;YeeMwnXEoyN(ytoEabcl$lSgx~Ltatn}b$@j_yyMrBb03)shJE*$;Mw=;mZd&8e>IzE+4WIoH zCSZE7WthNUL$|Y#m!Hn?x7V1CK}V`KwW2D$-7&ODy5Cj;!_tTOOo1Mm%(RUt)#$@3 zhurA)t<7qik%%1Et+N1?R#hdBB#LdQ7{%-C zn$(`5e0eFh(#c*hvF>WT*07fk$N_631?W>kfjySN8^XC9diiOd#s?4tybICF;wBjp zIPzilX3{j%4u7blhq)tnaOBZ_`h_JqHXuI7SuIlNTgBk9{HIS&3|SEPfrvcE<@}E` zKk$y*nzsqZ{J{uWW9;#n=de&&h>m#A#q)#zRonr(?mDOYU&h&aQWD;?Z(22wY?t$U3qo`?{+amA$^TkxL+Ex2dh`q7iR&TPd0Ymwzo#b? zP$#t=elB5?k$#uE$K>C$YZbYUX_JgnXA`oF_Ifz4H7LEOW~{Gww&3s=wH4+j8*TU| zSX%LtJWqhr-xGNSe{;(16kxnak6RnZ{0qZ^kJI5X*It_YuynSpi(^-}Lolr{)#z_~ zw!(J-8%7Ybo^c3(mED`Xz8xecP35a6M8HarxRn%+NJBE;dw>>Y2T&;jzRd4FSDO3T zt*y+zXCtZQ0bP0yf6HRpD|WmzP;DR^-g^}{z~0x~z4j8m zucTe%k&S9Nt-?Jb^gYW1w6!Y3AUZ0Jcq;pJ)Exz%7k+mUOm6%ApjjSmflfKwBo6`B zhNb@$NHTJ>guaj9S{@DX)!6)b-Shav=DNKWy(V00k(D!v?PAR0f0vDNq*#mYmUp6> z76KxbFDw5U{{qx{BRj(>?|C`82ICKbfLxoldov-M?4Xl+3;I4GzLHyPOzYw7{WQST zPNYcx5onA%MAO9??41Po*1zW(Y%Zzn06-lUp{s<3!_9vv9HBjT02On0Hf$}NP;wF) zP<`2p3}A^~1YbvOh{ePMx$!JGUPX-tbBzp3mDZMY;}h;sQ->!p97GA)9a|tF(Gh{1$xk7 zUw?ELkT({Xw!KIr);kTRb1b|UL`r2_`a+&UFVCdJ)1T#fdh;71EQl9790Br0m_`$x z9|ZANuchFci8GNZ{XbP=+uXSJRe(;V5laQz$u18#?X*9}x7cIEbnr%<=1cX3EIu7$ zhHW6pe5M(&qEtsqRa>?)*{O;OJT+YUhG5{km|YI7I@JL_3Hwao9aXneiSA~a* z|Lp@c-oMNyeAEuUz{F?kuou3x#C*gU?lon!RC1s37gW^0Frc`lqQWH&(J4NoZg3m8 z;Lin#8Q+cFPD7MCzj}#|ws7b@?D9Q4dVjS4dpco=4yX5SSH=A@U@yqPdp@?g?qeia zH=Tt_9)G=6C2QIPsi-QipnK(mc0xXIN;j$WLf@n8eYvMk;*H-Q4tK%(3$CN}NGgO8n}fD~+>?<3UzvsrMf*J~%i;VKQHbF%TPalFi=#sgj)(P#SM^0Q=Tr>4kJVw8X3iWsP|e8tj}NjlMdWp z@2+M4HQu~3!=bZpjh;;DIDk&X}=c8~kn)FWWH z2KL1w^rA5&1@@^X%MjZ7;u(kH=YhH2pJPFQe=hn>tZd5RC5cfGYis8s9PKaxi*}-s6*W zRA^PwR=y^5Z){!(4D9-KC;0~;b*ploznFOaU`bJ_7U?qAi#mTo!&rIECRL$_y@yI27x2?W+zqDBD5~KCVYKFZLK+>ABC(Kj zeAll)KMgIlAG`r^rS{loBrGLtzhHY8$)<_S<(Dpkr(Ym@@vnQ&rS@FC*>2@XCH}M+an74WcRDcoQ+a3@A z9tYhl5$z7bMdTvD2r&jztBuo37?*k~wcU9GK2-)MTFS-lux-mIRYUuGUCI~V$?s#< z?1qAWb(?ZLm(N>%S%y10COdaq_Tm5c^%ooIxpR=`3e4C|@O5wY+eLik&XVi5oT7oe zmxH)Jd*5eo@!7t`x8!K=-+zJ-Sz)B_V$)s1pW~CDU$=q^&ABvf6S|?TOMB-RIm@CoFg>mjIQE)?+A1_3s6zmFU_oW&BqyMz1mY*IcP_2knjq5 zqw~JK(cVsmzc7*EvTT2rvpeqhg)W=%TOZ^>f`rD4|7Z5fq*2D^lpCttIg#ictgqZ$P@ru6P#f$x#KfnfTZj~LG6U_d-kE~`;kU_X)`H5so@?C zWmb!7x|xk@0L~0JFall*@ltyiL^)@3m4MqC7(7H0sH!WidId1#f#6R{Q&A!XzO1IAcIx;$k66dumt6lpUw@nL2MvqJ5^kbOVZ<^2jt5-njy|2@`07}0w z;M%I1$FCoLy`8xp8Tk)bFr;7aJeQ9KK6p=O$U0-&JYYy8woV*>b+FB?xLX`=pirYM z5K$BA(u)+jR{?O2r$c_Qvl?M{=Ar{yQ!UVsVn4k@0!b?_lA;dVz9uaQUgBH8Oz(Sb zrEs;&Ey>_ex8&!N{PmQjp+-Hlh|OA&wvDai#GpU=^-B70V0*LF=^bi+Nhe_o|azZ%~ZZ1$}LTmWt4aoB1 zPgccm$EwYU+jrdBaQFxQfn5gd(gM`Y*Ro1n&Zi?j=(>T3kmf94vdhf?AuS8>$Va#P zGL5F+VHpxdsCUa}+RqavXCobI-@B;WJbMphpK2%6t=XvKWWE|ruvREgM+|V=i6;;O zx$g=7^`$XWn0fu!gF=Xe9cMB8Z_SelD>&o&{1XFS`|nInK3BXlaeD*rc;R-#osyIS zWv&>~^TLIyBB6oDX+#>3<_0+2C4u2zK^wmHXXDD9_)kmLYJ!0SzM|%G9{pi)`X$uf zW}|%%#LgyK7m(4{V&?x_0KEDq56tk|0YNY~B(Sr|>WVz-pO3A##}$JCT}5P7DY+@W z#gJv>pA5>$|E3WO2tV7G^SuymB?tY`ooKcN3!vaQMnBNk-WATF{-$#}FyzgtJ8M^; zUK6KWSG)}6**+rZ&?o@PK3??uN{Q)#+bDP9i1W&j)oaU5d0bIWJ_9T5ac!qc?x66Q z$KUSZ`nYY94qfN_dpTFr8OW~A?}LD;Yty-BA)-be5Z3S#t2Io%q+cAbnGj1t$|qFR z9o?8B7OA^KjCYL=-!p}w(dkC^G6Nd%_I=1))PC0w5}ZZGJxfK)jP4Fwa@b-SYBw?% zdz9B-<`*B2dOn(N;mcTm%Do)rIvfXRNFX&1h`?>Rzuj~Wx)$p13nrDlS8-jwq@e@n zNIj_|8or==8~1h*Ih?w*8K7rYkGlwlTWAwLKc5}~dfz3y`kM&^Q|@C%1VAp_$wnw6zG~W4O+^ z>i?NY?oXf^Puc~+fDM$VgRNBpOZj{2cMP~gCqWAX4 z7>%$ux8@a&_B(pt``KSt;r+sR-$N;jdpY>|pyvPiN)9ohd*>mVST3wMo)){`B(&eX z1?zZJ-4u9NZ|~j1rdZYq4R$?swf}<6(#ex%7r{kh%U@kT)&kWuAszS%oJts=*OcL9 zaZwK<5DZw%1IFHXgFplP6JiL^dk8+SgM$D?8X+gE4172hXh!WeqIO>}$I9?Nry$*S zQ#f)RuH{P7RwA3v9f<-w>{PSzom;>(i&^l{E0(&Xp4A-*q-@{W1oE3K;1zb{&n28dSC2$N+6auXe0}e4b z)KLJ?5c*>@9K#I^)W;uU_Z`enquTUxr>mNq z1{0_puF-M7j${rs!dxxo3EelGodF1TvjV;Zpo;s{5f1pyCuRp=HDZ?s#IA4f?h|-p zGd|Mq^4hDa@Bh!c4ZE?O&x&XZ_ptZGYK4$9F4~{%R!}G1leCBx`dtNUS|K zL-7J5s4W@%mhXg1!}a4PD%!t&Qn%f_oquRajn3@C*)`o&K9o7V6DwzVMEhjVdDJ1fjhr#@=lp#@4EBqi=CCQ>73>R(>QKPNM&_Jpe5G`n4wegeC`FYEPJ{|vwS>$-`fuRSp3927qOv|NC3T3G-0 zA{K`|+tQy1yqE$ShWt8ny&5~)%ITb@^+x$w0)f&om;P8B)@}=Wzy59BwUfZ1vqw87 za2lB8J(&*l#(V}Id8SyQ0C(2amzkz3EqG&Ed0Jq1)$|&>4_|NIe=5|n=3?siFV0fI z{As5DLW^gs|B-b4C;Hd(SM-S~GQhzb>HgF2|2Usww0nL^;x@1eaB)=+Clj+$fF@H( z-fqP??~QMT$KI-#m;QC*&6vkp&8699G3)Bq0*kFZXINw=b9OVaed(3(3kS|IZ)CM? zJdnW&%t8MveBuK21uiYj)_a{Fnw0OErMzMN?d$QoPwkhOwcP&p+t>P)4tHlYw-pPN z^oJ=uc$Sl>pv@fZH~ZqxSvdhF@F1s=oZawpr^-#l{IIOGG=T%QXjtwPhIg-F@k@uIlr?J->Ia zpEUQ*=4g|XYn4Gez&aHr*;t$u3oODPmc2Ku)2Og|xjc%w;q!Zz+zY)*3{7V8bK4;& zYV82FZ+8?v)`J|G1w4I0fWdKg|2b#iaazCv;|?(W-q}$o&Y}Q5d@BRk^jL7#{kbCK zSgkyu;=DV+or2)AxCBgq-nj5=@n^`%T#V+xBGEkW4lCqrE)LMv#f;AvD__cQ@Eg3`~x| zW+h9mofSXCq5|M)9|ez(#X?-sxB%Go8};sJ?2abp(Y!lyi>k)|{M*Z$c{e1-K4ky` MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/packages/remix/demo/web/index.html b/packages/remix/demo/web/index.html new file mode 100644 index 000000000..028ccffe7 --- /dev/null +++ b/packages/remix/demo/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + demo + + + + + + + + + + diff --git a/packages/remix/demo/web/manifest.json b/packages/remix/demo/web/manifest.json new file mode 100644 index 000000000..238a284b9 --- /dev/null +++ b/packages/remix/demo/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "demo", + "short_name": "demo", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/packages/remix/lib/components/alert/alert.dart b/packages/remix/lib/components/alert/alert.dart new file mode 100644 index 000000000..effc9a1d8 --- /dev/null +++ b/packages/remix/lib/components/alert/alert.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/alert/alert.style.dart'; + +import '../../helpers/widget_builder.dart'; +import '../../utils/component_recipe.dart'; + +class RemixAlert extends StatelessWidget + implements RemixComponentRecipe { + const RemixAlert({ + super.key, + this.icon, + this.title, + this.subtitle, + this.style, + this.variants = const [], + this.leadingBuilder, + this.titleBuilder, + this.subtitleBuilder, + }); + + final IconData? icon; + final String? title; + final String? subtitle; + + final RemixWidgetBuilder? leadingBuilder; + final RemixWidgetBuilder? titleBuilder; + final RemixWidgetBuilder? subtitleBuilder; + + @override + final RemixAlertStyle? style; + + @override + final List variants; + + RemixAlertStyle buildStyle(List variants) { + final result = style == null ? RemixAlertStyle.base() : style!; + return result.applyVariants(variants); + } + + @override + Widget build(BuildContext context) { + final style = buildStyle(variants); + + final leadingWidget = leadingBuilder != null + ? leadingBuilder!(style) + : icon != null + ? StyledIcon(icon, style: style.icon) + : null; + + final titleWidget = titleBuilder != null + ? titleBuilder!(style) + : title != null + ? StyledText( + title!, + style: style.title, + inherit: false, + ) + : null; + + final subtitleWidget = subtitleBuilder != null + ? subtitleBuilder!(style) + : subtitle != null + ? StyledText( + subtitle!, + style: style.subtitle, + inherit: false, + ) + : null; + + return HBox( + style: style.outerRowContainer, + children: [ + if (leadingWidget != null) leadingWidget, + VBox( + style: style.innerColumnContainer, + children: [ + if (titleWidget != null) titleWidget, + if (subtitleWidget != null) subtitleWidget, + ], + ), + ], + ); + } +} diff --git a/packages/remix/lib/components/alert/alert.style.dart b/packages/remix/lib/components/alert/alert.style.dart new file mode 100644 index 000000000..ff29d5ec2 --- /dev/null +++ b/packages/remix/lib/components/alert/alert.style.dart @@ -0,0 +1,104 @@ +import 'package:mix/mix.dart'; + +class RemixAlertStyle extends StyleRecipe { + const RemixAlertStyle({ + this.outerRowContainer = const Style.empty(), + this.innerColumnContainer = const Style.empty(), + this.title = const Style.empty(), + this.subtitle = const Style.empty(), + this.icon = const Style.empty(), + }); + + final Style outerRowContainer; + final Style innerColumnContainer; + final Style title; + final Style subtitle; + final Style icon; + + factory RemixAlertStyle.base() { + return RemixAlertStyle( + outerRowContainer: _outerRowContainer(), + innerColumnContainer: _innerColumnContainer(), + title: _title(), + subtitle: _subtitle(), + icon: _icon(), + ); + } + + @override + RemixAlertStyle applyVariants(List variants) { + return RemixAlertStyle( + outerRowContainer: outerRowContainer.applyVariants(variants), + innerColumnContainer: innerColumnContainer.applyVariants(variants), + title: title.applyVariants(variants), + subtitle: subtitle.applyVariants(variants), + icon: icon.applyVariants(variants), + ); + } + + @override + RemixAlertStyle merge(RemixAlertStyle? other) { + if (other == null) return this; + return copyWith( + outerRowContainer: outerRowContainer.merge(other.outerRowContainer), + innerColumnContainer: + innerColumnContainer.merge(other.innerColumnContainer), + title: title.merge(other.title), + subtitle: subtitle.merge(other.subtitle), + icon: icon.merge(other.icon), + ); + } + + @override + RemixAlertStyle copyWith({ + Style? outerRowContainer, + Style? innerColumnContainer, + Style? title, + Style? subtitle, + Style? icon, + }) { + return RemixAlertStyle( + outerRowContainer: outerRowContainer ?? this.outerRowContainer, + innerColumnContainer: innerColumnContainer ?? this.innerColumnContainer, + title: title ?? this.title, + subtitle: subtitle ?? this.subtitle, + icon: icon ?? this.icon, + ); + } +} + +Style _outerRowContainer() => Style( + $flex.gap(8), + $box.padding(16), + $box.borderRadius(8), + $box.border.width(1), + $box.border.color.redAccent(), + $flex.mainAxisSize.min(), + $flex.mainAxisAlignment.start(), + $flex.crossAxisAlignment.start(), + ); + +Style _innerColumnContainer() => Style( + $flex.gap(2), + $flex.mainAxisSize.min(), + $flex.mainAxisAlignment.start(), + $flex.crossAxisAlignment.start(), + flexible.expanded(), + ); + +Style _title() => Style( + $text.style.fontSize(14), + $text.style.fontWeight.w600(), + $text.style.color.redAccent(), + ); + +Style _subtitle() => Style( + $text.style.fontSize(14), + $text.style.fontWeight.normal(), + $text.style.color.redAccent(), + ); + +Style _icon() => Style( + $icon.size(20), + $icon.color.redAccent(), + ); diff --git a/packages/remix/lib/components/avatar/avatar.dart b/packages/remix/lib/components/avatar/avatar.dart new file mode 100644 index 000000000..e2ed630d5 --- /dev/null +++ b/packages/remix/lib/components/avatar/avatar.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import '../../helpers/widget_builder.dart'; +import 'avatar.style.dart'; +import '../../utils/component_recipe.dart'; + +class RemixAvatar extends StatelessWidget + implements RemixComponentRecipe { + const RemixAvatar({ + super.key, + this.image, + this.imageBuilder, + this.fallbackLabel, + this.fallbackLabelBuilder, + this.style, + this.variants = const [], + }); + + final ImageProvider? image; + final String? fallbackLabel; + final RemixWidgetBuilder? fallbackLabelBuilder; + final RemixWidgetBuilder? imageBuilder; + + @override + final RemixAvatarStyle? style; + + @override + final List variants; + + RemixAvatarStyle buildStyle(List variants) { + var styles = style == null ? RemixAvatarStyle.base() : style!; + + return styles.applyVariants(variants); + } + + @override + Widget build(BuildContext context) { + final style = buildStyle(variants); + + final imageWidget = imageBuilder != null + ? imageBuilder!(style) + : image != null + ? StyledImage( + image: image!, + style: style.image, + inherit: false, + ) + : null; + + final fallbackLabelWidget = fallbackLabelBuilder != null + ? fallbackLabelBuilder!(style) + : fallbackLabel != null + ? StyledText(fallbackLabel!, style: style.fallbackLabel) + : null; + + return Box( + style: style.container, + child: imageWidget ?? fallbackLabelWidget, + ); + } +} diff --git a/packages/remix/lib/components/avatar/avatar.style.dart b/packages/remix/lib/components/avatar/avatar.style.dart new file mode 100644 index 000000000..ab1de0b8e --- /dev/null +++ b/packages/remix/lib/components/avatar/avatar.style.dart @@ -0,0 +1,72 @@ +import 'package:mix/mix.dart'; + +class RemixAvatarStyle extends StyleRecipe { + const RemixAvatarStyle({ + this.container = const Style.empty(), + this.fallbackLabel = const Style.empty(), + this.image = const Style.empty(), + }); + + final Style container; + final Style fallbackLabel; + final Style image; + + factory RemixAvatarStyle.base() { + return RemixAvatarStyle( + container: _container(), + fallbackLabel: _label(), + image: _image(), + ); + } + + @override + RemixAvatarStyle applyVariants(List variants) { + return RemixAvatarStyle( + container: container.applyVariants(variants), + fallbackLabel: fallbackLabel.applyVariants(variants), + image: image.applyVariants(variants), + ); + } + + @override + RemixAvatarStyle copyWith({ + Style? container, + Style? fallbackLabel, + Style? image, + }) { + return RemixAvatarStyle( + container: this.container.merge(container), + fallbackLabel: this.fallbackLabel.merge(fallbackLabel), + image: this.image.merge(image), + ); + } + + @override + RemixAvatarStyle merge(RemixAvatarStyle? other) { + return copyWith( + container: other?.container, + fallbackLabel: other?.fallbackLabel, + image: other?.image, + ); + } +} + +Style _container() => Style( + $box.color.grey.shade100(), + $box.borderRadius(50), + $box.alignment.center(), + $box.width(40), + $box.height(40), + $box.clipBehavior.antiAlias(), + $with.clipOval(), + ); + +Style _label() => Style( + $text.style.fontSize(16), + $text.style.color.black54(), + $text.style.fontWeight.bold(), + ); + +Style _image() => Style( + $image.fit.cover(), + ); diff --git a/packages/remix/lib/components/badge/badge.dart b/packages/remix/lib/components/badge/badge.dart new file mode 100644 index 000000000..5cf5b734e --- /dev/null +++ b/packages/remix/lib/components/badge/badge.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import 'badge.style.dart'; +import '../../utils/component_recipe.dart'; + +class RemixBadge extends StatelessWidget + implements RemixComponentRecipe { + const RemixBadge({ + super.key, + required this.label, + this.style, + this.variants = const [], + }); + + final String label; + + @override + final RemixBadgeStyle? style; + + @override + final List variants; + + RemixBadgeStyle buildStyle(List variants) { + var styles = style == null ? RemixBadgeStyle.base() : style!; + return styles.applyVariants(variants); + } + + @override + Widget build(BuildContext context) { + final style = buildStyle(variants); + return Box( + style: style.container, + child: StyledText( + label, + style: style.label, + ), + ); + } +} diff --git a/packages/remix/lib/components/badge/badge.style.dart b/packages/remix/lib/components/badge/badge.style.dart new file mode 100644 index 000000000..de8259edf --- /dev/null +++ b/packages/remix/lib/components/badge/badge.style.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +class RemixBadgeStyle extends StyleRecipe { + const RemixBadgeStyle({ + this.container = const Style.empty(), + this.label = const Style.empty(), + }); + + final Style container; + final Style label; + + factory RemixBadgeStyle.base() { + return RemixBadgeStyle( + container: _container(), + label: _label(), + ); + } + + @override + RemixBadgeStyle applyVariants(List variants) { + return RemixBadgeStyle( + container: container.applyVariants(variants), + label: label.applyVariants(variants), + ); + } + + @override + RemixBadgeStyle copyWith({ + Style? container, + Style? label, + }) { + return RemixBadgeStyle( + container: this.container.merge(container), + label: this.label.merge(label), + ); + } + + @override + RemixBadgeStyle merge(RemixBadgeStyle? other) { + return copyWith( + container: other?.container, + label: other?.label, + ); + } +} + +Style _container() => Style( + $flex.mainAxisAlignment.center(), + $flex.mainAxisSize.min(), + $flex.crossAxisAlignment.center(), + $flex.gap(4), + $box.padding.horizontal(10), + $box.padding.vertical(2), + $box.borderRadius(20), + $box.color.black(), + ); + +Style _label() => Style( + $text.style.fontSize(12), + $text.style.fontWeight.w600(), + $text.style.color.white(), + ); diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button.dart new file mode 100644 index 000000000..00636eeea --- /dev/null +++ b/packages/remix/lib/components/button/button.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/button/button.variants.dart'; + +class RemixButton extends StatelessWidget + implements RemixComponentRecipe { + const RemixButton({ + super.key, + this.label, + this.disabled = false, + this.loading = false, + this.iconLeft, + this.iconRight, + this.type = ButtonType.primary, + this.size = ButtonSize.xsmall, + this.loadingLabel, + required this.onPressed, + this.style, + this.variants = const [], + }); + + final String? label; + final bool disabled; + final bool loading; + final String? loadingLabel; + final IconData? iconLeft; + final IconData? iconRight; + final ButtonType type; + final ButtonSize size; + final VoidCallback? onPressed; + + @override + final Style? style; + + @override + final List variants; + + RemixButtonStyle buildStyle(List variants) { + final result = style == null ? RemixButtonStyle.base() : style!; + return result.applyVariants(variants); + } + + List _buildChildren(BuildContext context, RemixButtonStyle style) { + return loading + ? _buildLoadingChildren(context, style) + : _buildDefaultChildren(style); + } + + List _buildLoadingChildren( + BuildContext context, + RemixButtonStyle buttonStyle, + ) => + [ + _buildLoadingIndicator(context), + if (loadingLabel != null) + StyledText( + loadingLabel!, + style: buttonStyle.label, + ), + ]; + + Widget _buildLoadingIndicator(BuildContext context) { + final icon = IconSpec.of(context); + const indicatorWidth = 2.5; + + return SizedBox( + width: icon.size, + height: icon.size, + child: CircularProgressIndicator( + strokeWidth: indicatorWidth, + color: icon.color, + ), + ); + } + + List _buildDefaultChildren(RemixButtonStyle style) => [ + if (iconLeft != null) StyledIcon(iconLeft, style: style.icon), + if (label != null) StyledText(label!, style: style.label), + if (iconRight != null) StyledIcon(iconRight, style: style.icon), + ]; + + @override + Widget build(BuildContext context) { + final style = buildStyle([size, type, ...variants]); + + return PressableBox( + onPress: disabled || loading ? null : onPressed, + child: HBox( + style: style.container, + children: _buildChildren(context, style), + ), + ); + } +} diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart new file mode 100644 index 000000000..5ba706f2e --- /dev/null +++ b/packages/remix/lib/components/button/button.style.dart @@ -0,0 +1,121 @@ +// ignore_for_file: camel_case_types + +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/button/button.variants.dart'; + +Style get buttonStyle => Style( + _containerStyle(), + _iconStyle(), + _labelStyle(), + ); + +Style get _containerStyle => Style( + $flex.gap(6), + $flex.mainAxisAlignment.center(), + $flex.crossAxisAlignment.center(), + $flex.mainAxisSize.min(), + ButtonSize.xsmall( + $box.padding.horizontal(8), + $box.padding.vertical(4), + ), + ButtonSize.small( + $box.padding.horizontal(12), + $box.padding.vertical(6), + ), + ButtonSize.medium( + $box.padding.horizontal(16), + $box.padding.vertical(8), + ), + ButtonSize.large( + $box.padding.horizontal(20), + $box.padding.vertical(10), + ), + ButtonType.primary( + $box.color.black(), + $on.hover( + $box.color.black87(), + ), + ), + ButtonType.secondary( + $box.color.grey.shade200(), + $on.hover( + $box.color.grey.shade100(), + ), + ), + ButtonType.destructive( + $box.color.redAccent(), + $on.hover( + $box.color.redAccent.shade200(), + ), + ), + ButtonType.outline( + $box.color.white(), + $box.border.width(1.5), + $box.border.color.black12(), + $box.shadow.color(Colors.black12.withOpacity(0.1)), + $box.shadow.blurRadius(1), + ), + ButtonType.ghost( + $box.color.transparent(), + $on.hover( + $box.color.black12(), + ), + ), + ButtonType.link( + $box.color.transparent(), + ), + $box.borderRadius(6), + ); + +Style get _iconStyle => Style( + ButtonSize.xsmall($icon.size(12)), + ButtonSize.small($icon.size(14)), + ButtonSize.medium($icon.size(16)), + ButtonSize.large($icon.size(18)), + (ButtonType.primary | ButtonType.destructive)( + $icon.color(Colors.white), + ), + (ButtonType.link | ButtonType.secondary | ButtonType.outline)( + $icon.color(Colors.black), + ), + ); + +Style get _labelStyle => Style( + $text.style.height(1.1), + $text.style.letterSpacing(0.5), + $text.style.fontWeight(FontWeight.w600), + ButtonSize.xsmall( + $text.style.fontSize(12), + ), + ButtonSize.small( + $text.style.fontSize(14), + ), + ButtonSize.medium( + $text.style.fontSize(16), + ), + ButtonSize.large( + $text.style.fontSize(18), + ), + ButtonType.primary( + $text.style.color.white(), + ), + ButtonType.secondary( + $text.style.color.black87(), + ), + ButtonType.destructive( + $text.style.color.white(), + ), + ButtonType.outline( + $text.style.color.black(), + ), + ButtonType.ghost( + $text.style.color.black(), + ), + ButtonType.link( + $text.style.color.black(), + $on.hover( + $text.style.decoration(TextDecoration.underline), + ), + ), + ); diff --git a/packages/remix/lib/components/button/button.variants.dart b/packages/remix/lib/components/button/button.variants.dart new file mode 100644 index 000000000..be7a5b7d8 --- /dev/null +++ b/packages/remix/lib/components/button/button.variants.dart @@ -0,0 +1,41 @@ +import 'package:mix/mix.dart'; + +class RemixButtonTypes { + RemixButtonTypes(); + + final primary = const ButtonType('remix.button.primary'); + final secondary = const ButtonType('remix.button.secondary'); + final destructive = const ButtonType('remix.button.destructive'); + final outline = const ButtonType('remix.button.outline'); + final ghost = const ButtonType('remix.button.ghost'); + final link = const ButtonType('remix.button.link'); +} + +class RemixButtonSizes { + RemixButtonSizes(); + + final xsmall = const ButtonSize('remix.button.xsmall'); + final small = const ButtonSize('remix.button.small'); + final medium = const ButtonSize('remix.button.medium'); + final large = const ButtonSize('remix.button.large'); +} + +class ButtonSize extends Variant { + const ButtonSize(super.name); + + static const xsmall = ButtonSize('remix.button.xsmall'); + static const small = ButtonSize('remix.button.small'); + static const medium = ButtonSize('remix.button.medium'); + static const large = ButtonSize('remix.button.large'); +} + +class ButtonType extends Variant { + const ButtonType(super.name); + + static const primary = ButtonType('remix.button.primary'); + static const secondary = ButtonType('remix.button.secondary'); + static const destructive = ButtonType('remix.button.destructive'); + static const outline = ButtonType('remix.button.outline'); + static const ghost = ButtonType('remix.button.ghost'); + static const link = ButtonType('remix.button.link'); +} diff --git a/packages/remix/lib/components/button/button_spec.dart b/packages/remix/lib/components/button/button_spec.dart new file mode 100644 index 000000000..01614f39c --- /dev/null +++ b/packages/remix/lib/components/button/button_spec.dart @@ -0,0 +1,19 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'button_spec.g.dart'; + +@MixableSpec() +base class ButtonSpec extends Spec with _$ButtonSpec { + final BoxSpec? container; + final IconSpec? icon; + final TextSpec? label; + + const ButtonSpec({ + this.container, + this.icon, + this.label, + super.animated, + }); +} diff --git a/packages/remix/lib/components/button/button_spec.g.dart b/packages/remix/lib/components/button/button_spec.g.dart new file mode 100644 index 000000000..9d545a813 --- /dev/null +++ b/packages/remix/lib/components/button/button_spec.g.dart @@ -0,0 +1,223 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'button_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$ButtonSpec on Spec { + static ButtonSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const ButtonSpec(); + } + + /// {@template button_spec_of} + /// Retrieves the [ButtonSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [ButtonSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [ButtonSpec]. + /// + /// Example: + /// + /// ```dart + /// final buttonSpec = ButtonSpec.of(context); + /// ``` + /// {@endtemplate} + static ButtonSpec of(BuildContext context) { + return _$ButtonSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [ButtonSpec] but with the given fields + /// replaced with the new values. + @override + ButtonSpec copyWith({ + BoxSpec? container, + IconSpec? icon, + TextSpec? label, + AnimatedData? animated, + }) { + return ButtonSpec( + container: container ?? _$this.container, + icon: icon ?? _$this.icon, + label: label ?? _$this.label, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [ButtonSpec] and another [ButtonSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [ButtonSpec] is returned. When [t] is 1.0, the [other] [ButtonSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [ButtonSpec] is returned. + /// + /// If [other] is null, this method returns the current [ButtonSpec] instance. + /// + /// The interpolation is performed on each property of the [ButtonSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container]. + /// - [IconSpec.lerp] for [icon]. + /// - [TextSpec.lerp] for [label]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [ButtonSpec] is used. Otherwise, the value + /// from the [other] [ButtonSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [ButtonSpec] configurations. + @override + ButtonSpec lerp(ButtonSpec? other, double t) { + if (other == null) return _$this; + + return ButtonSpec( + container: _$this.container?.lerp(other.container, t) ?? other.container, + icon: _$this.icon?.lerp(other.icon, t) ?? other.icon, + label: _$this.label?.lerp(other.label, t) ?? other.label, + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [ButtonSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [ButtonSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.icon, + _$this.label, + _$this.animated, + ]; + + ButtonSpec get _$this => this as ButtonSpec; +} + +/// Represents the attributes of a [ButtonSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [ButtonSpec]. +/// +/// Use this class to configure the attributes of a [ButtonSpec] and pass it to +/// the [ButtonSpec] constructor. +final class ButtonSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final IconSpecAttribute? icon; + final TextSpecAttribute? label; + + const ButtonSpecAttribute({ + this.container, + this.icon, + this.label, + super.animated, + }); + + /// Resolves to [ButtonSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final buttonSpec = ButtonSpecAttribute(...).resolve(mix); + /// ``` + @override + ButtonSpec resolve(MixData mix) { + return ButtonSpec( + container: container?.resolve(mix), + icon: icon?.resolve(mix), + label: label?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [ButtonSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [ButtonSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + ButtonSpecAttribute merge(covariant ButtonSpecAttribute? other) { + if (other == null) return this; + + return ButtonSpecAttribute( + container: container?.merge(other.container) ?? other.container, + icon: icon?.merge(other.icon) ?? other.icon, + label: label?.merge(other.label) ?? other.label, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [ButtonSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [ButtonSpecAttribute] instances for equality. + @override + List get props => [ + container, + icon, + label, + animated, + ]; +} + +/// Utility class for configuring [ButtonSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [ButtonSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [ButtonSpecAttribute]. +base class ButtonSpecUtility + extends SpecUtility { + /// Utility for defining [ButtonSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [ButtonSpecAttribute.icon] + late final icon = IconSpecUtility((v) => only(icon: v)); + + /// Utility for defining [ButtonSpecAttribute.label] + late final label = TextSpecUtility((v) => only(label: v)); + + /// Utility for defining [ButtonSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + ButtonSpecUtility(super.builder); + + static final self = ButtonSpecUtility((v) => v); + + /// Returns a new [ButtonSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + IconSpecAttribute? icon, + TextSpecAttribute? label, + AnimatedDataDto? animated, + }) { + return builder(ButtonSpecAttribute( + container: container, + icon: icon, + label: label, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [ButtonSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [ButtonSpec] specifications. +class ButtonSpecTween extends Tween { + ButtonSpecTween({ + super.begin, + super.end, + }); + + @override + ButtonSpec lerp(double t) { + if (begin == null && end == null) return const ButtonSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/card/card.dart b/packages/remix/lib/components/card/card.dart new file mode 100644 index 000000000..65f47e5ba --- /dev/null +++ b/packages/remix/lib/components/card/card.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/card/card.style.dart'; + +class PresableRemixCard extends RemixCard { + const PresableRemixCard({ + super.key, + required super.child, + this.onTap, + super.style, + }); + + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + return Pressable( + onPress: onTap, + child: super.build(context), + ); + } +} + +class RemixCard extends StatelessWidget + implements RemixComponentRecipe { + const RemixCard({ + super.key, + required this.child, + this.style, + this.variants = const [], + }); + + factory RemixCard.pressable( + Widget child, { + void Function()? onTap, + RemixCardStyle? style, + }) { + return PresableRemixCard( + style: style, + onTap: onTap, + child: child, + ); + } + + final Widget child; + + @override + final RemixCardStyle? style; + + @override + final List variants; + + RemixCardStyle buildStyle(List variants) { + final result = style == null ? RemixCardStyle.base() : style!; + + return result.applyVariants(variants); + } + + @override + Widget build(BuildContext context) { + final style = buildStyle(variants); + + return Box( + style: style.container, + child: child, + ); + } +} diff --git a/packages/remix/lib/components/card/card.style.dart b/packages/remix/lib/components/card/card.style.dart new file mode 100644 index 000000000..91c1e9caf --- /dev/null +++ b/packages/remix/lib/components/card/card.style.dart @@ -0,0 +1,46 @@ +import 'package:mix/mix.dart'; + +class RemixCardStyle extends StyleRecipe { + const RemixCardStyle({ + this.container = const Style.empty(), + }); + + final Style container; + + factory RemixCardStyle.base() { + return RemixCardStyle( + container: _container(), + ); + } + + @override + RemixCardStyle applyVariants(List variants) { + return RemixCardStyle( + container: container.applyVariants(variants), + ); + } + + @override + RemixCardStyle merge(RemixCardStyle? other) { + if (other == null) return this; + return copyWith( + container: container.merge(other.container), + ); + } + + @override + RemixCardStyle copyWith({ + Style? container, + }) { + return RemixCardStyle( + container: container ?? this.container, + ); + } +} + +Style _container() => Style( + $box.padding(16), + $box.elevation(1), + $box.borderRadius(8), + $box.color.white(), + ); diff --git a/packages/remix/lib/components/checkbox/checkbox.dart b/packages/remix/lib/components/checkbox/checkbox.dart new file mode 100644 index 000000000..53914dfec --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/checkbox/checkbox.variants.dart'; +import 'package:remix/components/checkbox/tokens/checkbox_attr.dart'; + +import 'tokens/checkbox_spec.dart'; +import 'tokens/checkbox_util.dart'; + +const kNoAnimation = + AnimatedData(duration: Duration.zero, curve: Curves.linear); + +AnimatedStyle $defaultCheckboxStyle() { + final checkbox = CheckboxSpecUtility((value) => CheckboxSpecAttribute( + flexContainer: value.flexContainer, + innerContainer: value.innerContainer, + icon: value.icon, + label: value.label, + )); + + return Style( + // Flex Container + checkbox.flexContainer.mainAxisAlignment.center(), + checkbox.flexContainer.crossAxisAlignment.center(), + checkbox.flexContainer.mainAxisSize.min(), + checkbox.flexContainer.gap(6), + // Inner Container + checkbox.innerContainer.borderRadius.all(7), + checkbox.innerContainer.width(20), + checkbox.innerContainer.height(20), + checkbox.innerContainer.border( + color: const Color.fromARGB(115, 3, 3, 3), + width: 1.5, + ), + // Label + checkbox.label.style.fontSize(16), + checkbox.label.style.color.black87(), + checkbox.icon.color.white(), + + // Checked + CheckboxState.checked( + // Inner Container + checkbox.innerContainer.color.black87(), + // Icon + checkbox.icon.color.white(), + checkbox.icon.size(15), + // Label + checkbox.label.style.fontSize(16), + checkbox.label.style.bold(), + checkbox.label.style.color.black87(), + ), + ).animate( + curve: Curves.easeInOut, + duration: const Duration(milliseconds: 200), + ); +} + +class RemixCheckbox extends StatelessWidget { + RemixCheckbox({ + super.key, + this.label, + this.disabled = false, + this.value = false, + this.onChanged, + this.iconChecked = Icons.check_rounded, + this.iconUnchecked, + Style? style, + this.variants = const [], + }) : style = style ?? $defaultCheckboxStyle(); + + final String? label; + final bool disabled; + final bool value; + final IconData iconChecked; + final IconData? iconUnchecked; + final ValueChanged? onChanged; + + final Style style; + + final List variants; + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: style.applyVariant( + value ? CheckboxState.checked : CheckboxState.unchecked, + ), + builder: (context) { + final spec = CheckboxSpec.of(context); + final mix = MixProvider.of(context); + final animationData = mix.animation ?? kNoAnimation; + + return Pressable( + onPress: + onChanged == null || disabled ? null : () => onChanged!(!value), + child: FlexSpecWidget( + spec: spec.flexContainer, + direction: Axis.horizontal, + children: [ + AnimatedBoxSpecWidget( + spec: spec.innerContainer, + duration: animationData.duration, + child: AnimatedIconSpecWidget( + icon: value ? iconChecked : iconUnchecked, + spec: spec.icon, + duration: animationData.duration, + curve: animationData.curve, + ), + ), + if (label != null) + AnimatedTextSpecWidget( + label!, + spec: spec.label, + duration: animationData.duration, + curve: animationData.curve, + ), + ], + ), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/checkbox/checkbox.variants.dart b/packages/remix/lib/components/checkbox/checkbox.variants.dart new file mode 100644 index 000000000..ad5f74705 --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox.variants.dart @@ -0,0 +1,8 @@ +import 'package:mix/mix.dart'; + +class CheckboxState extends Variant { + const CheckboxState._(String name) : super(name); + + static const checked = CheckboxState._('remix.checkbox.checked'); + static const unchecked = CheckboxState._('remix.checkbox.unchecked'); +} diff --git a/packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart b/packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart new file mode 100644 index 000000000..7a7e21012 --- /dev/null +++ b/packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart @@ -0,0 +1,44 @@ +import 'package:mix/mix.dart'; +import 'package:remix/components/checkbox/tokens/checkbox_spec.dart'; + +class CheckboxSpecAttribute extends SpecAttribute { + const CheckboxSpecAttribute({ + this.flexContainer = const FlexSpecAttribute(), + this.innerContainer = const BoxSpecAttribute(), + this.icon = const IconSpecAttribute(), + this.label = const TextSpecAttribute(), + }); + + final FlexSpecAttribute flexContainer; + final BoxSpecAttribute innerContainer; + final IconSpecAttribute icon; + final TextSpecAttribute label; + + @override + CheckboxSpecAttribute merge(covariant CheckboxSpecAttribute? other) { + return CheckboxSpecAttribute( + flexContainer: flexContainer.merge(other?.flexContainer), + innerContainer: innerContainer.merge(other?.innerContainer), + icon: icon.merge(other?.icon), + label: label.merge(other?.label), + ); + } + + @override + List get props => [ + flexContainer, + innerContainer, + icon, + label, + ]; + + @override + CheckboxSpec resolve(MixData mix) { + return CheckboxSpec( + flexContainer: flexContainer.resolve(mix), + innerContainer: innerContainer.resolve(mix), + icon: icon.resolve(mix), + label: label.resolve(mix), + ); + } +} diff --git a/packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart b/packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart new file mode 100644 index 000000000..fcb33db70 --- /dev/null +++ b/packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/checkbox/tokens/checkbox_attr.dart'; + +class CheckboxSpec extends Spec { + final FlexSpec flexContainer; + final BoxSpec innerContainer; + final IconSpec icon; + final TextSpec label; + + const CheckboxSpec({ + required this.flexContainer, + required this.innerContainer, + required this.icon, + required this.label, + }); + + const CheckboxSpec.empty() + : flexContainer = const FlexSpec.empty(), + innerContainer = const BoxSpec.empty(), + icon = const IconSpec.empty(), + label = const TextSpec.empty(); + + @override + CheckboxSpec copyWith({ + FlexSpec? flexContainer, + BoxSpec? innerContainer, + IconSpec? icon, + TextSpec? label, + }) { + return CheckboxSpec( + flexContainer: flexContainer ?? this.flexContainer, + innerContainer: innerContainer ?? this.innerContainer, + icon: icon ?? this.icon, + label: label ?? this.label, + ); + } + + static CheckboxSpec of(BuildContext context) { + final mix = MixProvider.of(context); + + return mix.attributeOf()?.resolve(mix) ?? + const CheckboxSpec.empty(); + } + + @override + CheckboxSpec lerp(CheckboxSpec other, double t) { + return CheckboxSpec( + flexContainer: flexContainer.lerp(other.flexContainer, t), + innerContainer: innerContainer.lerp(other.innerContainer, t), + icon: icon.lerp(other.icon, t), + label: label.lerp(other.label, t), + ); + } + + @override + List get props => [ + flexContainer, + innerContainer, + icon, + label, + ]; +} diff --git a/packages/remix/lib/components/checkbox/tokens/checkbox_util.dart b/packages/remix/lib/components/checkbox/tokens/checkbox_util.dart new file mode 100644 index 000000000..714d85653 --- /dev/null +++ b/packages/remix/lib/components/checkbox/tokens/checkbox_util.dart @@ -0,0 +1,41 @@ +import 'package:mix/mix.dart'; + +import 'checkbox_attr.dart'; + +class CheckboxSpecUtility + extends SpecUtility { + CheckboxSpecUtility(super.builder); + + BoxSpecUtility get innerContainer => BoxSpecUtility( + (innerContainer) => only(innerContainer: innerContainer), + ); + + FlexSpecUtility get flexContainer => FlexSpecUtility( + (flexContainer) => only(flexContainer: flexContainer), + ); + + IconSpecUtility get icon => IconSpecUtility( + (icon) => only(icon: icon), + ); + + TextSpecUtility get label => TextSpecUtility( + (label) => only(label: label), + ); + + @override + T only({ + FlexSpecAttribute flexContainer = const FlexSpecAttribute(), + BoxSpecAttribute innerContainer = const BoxSpecAttribute(), + IconSpecAttribute icon = const IconSpecAttribute(), + TextSpecAttribute label = const TextSpecAttribute(), + }) { + return builder( + CheckboxSpecAttribute( + flexContainer: flexContainer, + innerContainer: innerContainer, + icon: icon, + label: label, + ), + ); + } +} diff --git a/packages/remix/lib/components/divider/divider.dart b/packages/remix/lib/components/divider/divider.dart new file mode 100644 index 000000000..3f0bbf982 --- /dev/null +++ b/packages/remix/lib/components/divider/divider.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import 'divider.style.dart'; +import '../../utils/component_recipe.dart'; + +class RemixDivider extends StatelessWidget + implements RemixComponentRecipe { + const RemixDivider({ + super.key, + this.style, + this.variants = const [], + }); + + @override + final RemixDividerStyle? style; + + @override + final List variants; + + RemixDividerStyle buildStyle(List variants) { + var styles = style == null ? RemixDividerStyle.base() : style!; + return styles.applyVariants(variants); + } + + @override + Widget build(BuildContext context) { + return Box( + style: buildStyle(variants).container, + ); + } +} diff --git a/packages/remix/lib/components/divider/divider.style.dart b/packages/remix/lib/components/divider/divider.style.dart new file mode 100644 index 000000000..dd07fe12b --- /dev/null +++ b/packages/remix/lib/components/divider/divider.style.dart @@ -0,0 +1,45 @@ +import 'package:mix/mix.dart'; + +class RemixDividerStyle extends StyleRecipe { + const RemixDividerStyle({ + this.container = const Style.empty(), + }); + + final Style container; + + factory RemixDividerStyle.base() { + return RemixDividerStyle( + container: _container(), + ); + } + + @override + RemixDividerStyle applyVariants(List variants) { + return RemixDividerStyle( + container: container.applyVariants(variants), + ); + } + + @override + RemixDividerStyle copyWith({ + Style? container, + }) { + return RemixDividerStyle( + container: this.container.merge(container), + ); + } + + @override + RemixDividerStyle merge(RemixDividerStyle? other) { + return copyWith( + container: other?.container, + ); + } +} + +Style _container() => Style( + $box.margin.vertical(15), + $box.height(2), + $box.borderRadius(1), + $box.color.grey.shade200(), + ); diff --git a/packages/remix/lib/components/list_tile/list_tile.dart b/packages/remix/lib/components/list_tile/list_tile.dart new file mode 100644 index 000000000..f557455cc --- /dev/null +++ b/packages/remix/lib/components/list_tile/list_tile.dart @@ -0,0 +1,73 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; + +import '../../helpers/widget_builder.dart'; +import 'list_tile.style.dart'; +import '../../utils/component_recipe.dart'; + +class RemixListTile extends StatelessWidget + implements RemixComponentRecipe { + const RemixListTile({ + super.key, + this.title, + this.subtitle, + this.leading, + this.trailing, + this.style, + this.variants = const [], + this.titleBuilder, + this.subtitleBuilder, + }); + + final String? title; + final String? subtitle; + final Widget? leading; + final Widget? trailing; + + final RemixWidgetBuilder? titleBuilder; + final RemixWidgetBuilder? subtitleBuilder; + + @override + final RemixListTileStyle? style; + + @override + final List variants; + + RemixListTileStyle buildStyle(List variants) { + var styles = style == null ? RemixListTileStyle.base() : style!; + return styles.applyVariants(variants); + } + + @override + Widget build(BuildContext context) { + final style = buildStyle(variants); + + final titleWidget = titleBuilder != null + ? titleBuilder!(style) + : title != null + ? StyledText(title!, style: style.title) + : null; + + final subtitleWidget = subtitleBuilder != null + ? subtitleBuilder!(style) + : subtitle != null + ? StyledText(subtitle!, style: style.subtitle) + : null; + + return HBox( + style: style.outerRowContainer, + children: [ + if (leading != null) leading!, + VBox( + style: style.innerColumnContainer, + children: [ + if (titleWidget != null) titleWidget, + if (subtitleWidget != null) subtitleWidget, + ], + ), + const Spacer(), + if (trailing != null) trailing!, + ], + ); + } +} diff --git a/packages/remix/lib/components/list_tile/list_tile.style.dart b/packages/remix/lib/components/list_tile/list_tile.style.dart new file mode 100644 index 000000000..a5d1a240f --- /dev/null +++ b/packages/remix/lib/components/list_tile/list_tile.style.dart @@ -0,0 +1,84 @@ +import 'package:mix/mix.dart'; + +class RemixListTileStyle extends StyleRecipe { + const RemixListTileStyle({ + this.outerRowContainer = const Style.empty(), + this.innerColumnContainer = const Style.empty(), + this.title = const Style.empty(), + this.subtitle = const Style.empty(), + }); + + final Style outerRowContainer; + final Style innerColumnContainer; + final Style title; + final Style subtitle; + + factory RemixListTileStyle.base() { + return RemixListTileStyle( + outerRowContainer: _outerRowContainer(), + innerColumnContainer: _innerColumnContainer(), + title: _title(), + subtitle: _subtitle(), + ); + } + + @override + RemixListTileStyle applyVariants(List variants) { + return RemixListTileStyle( + outerRowContainer: outerRowContainer.applyVariants(variants), + innerColumnContainer: innerColumnContainer.applyVariants(variants), + title: title.applyVariants(variants), + subtitle: subtitle.applyVariants(variants), + ); + } + + @override + RemixListTileStyle copyWith({ + Style? outerRowContainer, + Style? innerColumnContainer, + Style? title, + Style? subtitle, + }) { + return RemixListTileStyle( + outerRowContainer: this.outerRowContainer.merge(outerRowContainer), + innerColumnContainer: + this.innerColumnContainer.merge(innerColumnContainer), + title: this.title.merge(title), + subtitle: this.subtitle.merge(subtitle), + ); + } + + @override + RemixListTileStyle merge(RemixListTileStyle? other) { + return copyWith( + outerRowContainer: other?.outerRowContainer, + innerColumnContainer: other?.innerColumnContainer, + title: other?.title, + subtitle: other?.subtitle, + ); + } +} + +Style _outerRowContainer() => Style( + $flex.gap(16), + ); + +Style _innerColumnContainer() => Style( + $flex.mainAxisAlignment.center(), + $flex.mainAxisSize.min(), + $flex.crossAxisAlignment.start(), + $flex.gap(4), + ); + +Style _title() => Style( + $text.style.fontSize(14), + $text.style.fontWeight.w600(), + $text.style.color.black(), + ); + +Style _subtitle() => Style( + $text.style.fontSize(14), + $text.style.fontWeight.normal(), + $text.style.color.grey(), + $text.maxLines(2), + ); diff --git a/packages/remix/lib/components/radio/radio.dart b/packages/remix/lib/components/radio/radio.dart new file mode 100644 index 000000000..fd4079422 --- /dev/null +++ b/packages/remix/lib/components/radio/radio.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import '../../utils/component_recipe.dart'; +import 'radio.style.dart'; +import 'radio.variants.dart'; + +class RemixRadio extends StatelessWidget + implements RemixComponentRecipe { + const RemixRadio({ + super.key, + this.label, + this.disabled = false, + this.active = false, + this.onChanged, + this.style, + this.variants = const [], + }); + + final String? label; + final bool disabled; + final bool active; + final ValueChanged? onChanged; + + @override + final RemixRadioStyle? style; + + @override + final List variants; + + RemixRadioStyle buildStyle(List variants) { + final result = style == null ? RemixRadioStyle.base() : style!; + return result.applyVariants(variants); + } + + void Function()? _handleOnChange() { + return onChanged == null || disabled ? null : () => onChanged!(!active); + } + + @override + Widget build(BuildContext context) { + var internalVariants = active ? RadioState.active : RadioState.inactive; + + final style = buildStyle([internalVariants, ...variants]); + + return PressableBox( + onPressed: _handleOnChange, + child: HBox( + style: style.row, + children: [ + Box( + style: style.outerContainer, + child: Box( + style: style.innerContainer, + ), + ), + if (label != null) + StyledText( + label!, + style: style.label, + ), + ], + ), + ); + } +} diff --git a/packages/remix/lib/components/radio/radio.style.dart b/packages/remix/lib/components/radio/radio.style.dart new file mode 100644 index 000000000..a8f2e5a5b --- /dev/null +++ b/packages/remix/lib/components/radio/radio.style.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import 'radio.variants.dart'; + +class RemixRadioStyle extends StyleRecipe { + const RemixRadioStyle({ + this.outerContainer = const Style.empty(), + this.innerContainer = const Style.empty(), + this.label = const Style.empty(), + this.row = const Style.empty(), + }); + + final Style outerContainer; + final Style innerContainer; + final Style label; + final Style row; + + factory RemixRadioStyle.base() { + return RemixRadioStyle( + outerContainer: _outerContainerStyle(), + innerContainer: _innerContainerStyle(), + label: _labelStyle(), + row: _hboxStyle(), + ); + } + + @override + RemixRadioStyle applyVariants(List variants) { + return RemixRadioStyle( + outerContainer: outerContainer.applyVariants(variants), + innerContainer: innerContainer.applyVariants(variants), + label: label.applyVariants(variants), + row: row.applyVariants(variants), + ); + } + + @override + RemixRadioStyle copyWith({ + Style? outerContainer, + Style? innerContainer, + Style? label, + Style? row, + }) { + return RemixRadioStyle( + innerContainer: this.innerContainer.merge(innerContainer), + outerContainer: this.outerContainer.merge(outerContainer), + label: this.label.merge(label), + row: this.row.merge(row), + ); + } + + @override + RemixRadioStyle merge(RemixRadioStyle? other) { + return copyWith( + outerContainer: other?.outerContainer, + innerContainer: other?.innerContainer, + label: other?.label, + row: other?.row, + ); + } +} + +Style _outerContainerStyle() => Style( + $box.width(16), + $box.height(16), + $box.alignment.center(), + $box.borderRadius.all(10), + $box.color.transparent(), + $box.border.all(width: 1.5, color: Colors.black87), + ); + +Style _innerContainerStyle() => Style( + $box.borderRadius.all(10), + $box.color.black87(), + RadioState.active( + $box.width(8.5), + $box.height(8.5), + ), + RadioState.inactive( + $box.width(0), + $box.height(0), + ), + ); + +Style _labelStyle() => Style( + $text.style.fontSize(16), + $text.style.bold(), + $text.style.color.black87(), + ); + +Style _hboxStyle() => Style( + $flex.mainAxisAlignment.center(), + $flex.crossAxisAlignment.center(), + $flex.mainAxisSize.min(), + $flex.gap(6), + ); diff --git a/packages/remix/lib/components/radio/radio.variants.dart b/packages/remix/lib/components/radio/radio.variants.dart new file mode 100644 index 000000000..7c301c4d7 --- /dev/null +++ b/packages/remix/lib/components/radio/radio.variants.dart @@ -0,0 +1,8 @@ +import 'package:mix/mix.dart'; + +class RadioState extends Variant { + const RadioState._(String name) : super(name); + + static const active = RadioState._('remix.radio.active'); + static const inactive = RadioState._('remix.radio.inactive'); +} diff --git a/packages/remix/lib/components/switch/switch.dart b/packages/remix/lib/components/switch/switch.dart new file mode 100644 index 000000000..12a09fefe --- /dev/null +++ b/packages/remix/lib/components/switch/switch.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import '../../utils/component_recipe.dart'; +import 'switch.style.dart'; +import 'switch.variants.dart'; + +class RemixSwitch extends StatelessWidget + implements RemixComponentRecipe { + const RemixSwitch({ + super.key, + this.disabled = false, + this.active = false, + this.onChanged, + this.style, + this.variants = const [], + }); + + final bool disabled; + final bool active; + final ValueChanged? onChanged; + + @override + final RemixSwitchStyle? style; + + @override + final List variants; + + RemixSwitchStyle buildStyle(List variants) { + final result = style == null ? RemixSwitchStyle.base() : style!; + return result.applyVariants(variants); + } + + void Function()? _handleOnChange() { + return onChanged == null || disabled ? null : () => onChanged!(!active); + } + + @override + Widget build(BuildContext context) { + var internalVariants = active ? SwitchState.active : SwitchState.inactive; + + final style = buildStyle([internalVariants, ...variants]); + + return PressableBox( + onPressed: _handleOnChange, + style: style.outerFlexContainer, + child: Box( + style: style.innerContainer, + ), + ); + } +} diff --git a/packages/remix/lib/components/switch/switch.style.dart b/packages/remix/lib/components/switch/switch.style.dart new file mode 100644 index 000000000..bdb1db3eb --- /dev/null +++ b/packages/remix/lib/components/switch/switch.style.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +import 'switch.variants.dart'; + +class RemixSwitchStyle extends StyleRecipe { + const RemixSwitchStyle({ + this.outerFlexContainer = const Style.empty(), + this.innerContainer = const Style.empty(), + }); + + final Style outerFlexContainer; + final Style innerContainer; + + factory RemixSwitchStyle.base() { + return RemixSwitchStyle( + outerFlexContainer: _outerFlexContainerStyle(), + innerContainer: _innerContainerStyle(), + ); + } + + @override + RemixSwitchStyle applyVariants(List variants) { + return RemixSwitchStyle( + outerFlexContainer: outerFlexContainer.applyVariants(variants), + innerContainer: innerContainer.applyVariants(variants), + ); + } + + @override + RemixSwitchStyle copyWith({ + Style? outerFlexContainer, + Style? innerContainer, + }) { + return RemixSwitchStyle( + innerContainer: this.innerContainer.merge(innerContainer), + outerFlexContainer: this.outerFlexContainer.merge(outerFlexContainer), + ); + } + + @override + RemixSwitchStyle merge(RemixSwitchStyle? other) { + return copyWith( + outerFlexContainer: other?.outerFlexContainer, + innerContainer: other?.innerContainer, + ); + } +} + +Style _outerFlexContainerStyle() => Style( + $box.width(32), + $box.height(16), + border.width(2), + border.strokeAlign(BorderSide.strokeAlignOutside), + $box.borderRadius(20), + SwitchState.active( + $box.color.black(), + border.color.black(), + $box.alignment.centerRight(), + ), + SwitchState.inactive( + $box.alignment.centerLeft(), + $box.color.grey.shade300(), + border.color.grey.shade300(), + ), + ); + +Style _innerContainerStyle() => Style( + $box.borderRadius(10), + width(16), + height(16), + $box.color.white(), + ); diff --git a/packages/remix/lib/components/switch/switch.variants.dart b/packages/remix/lib/components/switch/switch.variants.dart new file mode 100644 index 000000000..43f43efa4 --- /dev/null +++ b/packages/remix/lib/components/switch/switch.variants.dart @@ -0,0 +1,8 @@ +import 'package:mix/mix.dart'; + +class SwitchState extends Variant { + const SwitchState._(String name) : super(name); + + static const active = SwitchState._('remix.switch.active'); + static const inactive = SwitchState._('remix.switch.inactive'); +} diff --git a/packages/remix/lib/helpers/color_utils.dart b/packages/remix/lib/helpers/color_utils.dart new file mode 100644 index 000000000..38407e25a --- /dev/null +++ b/packages/remix/lib/helpers/color_utils.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +Color contrastColor(Color color) { + return color.computeLuminance() > 0.5 ? Colors.black : Colors.white; +} + +Map getColorSwatch(Color color) { + final hslColor = HSLColor.fromColor(color); + final lightness = hslColor.lightness; + + /// if [500] is the default color, there are at LEAST five + /// steps below [500]. (i.e. 400, 300, 200, 100, 50.) A + /// divisor of 5 would mean [50] is a lightness of 1.0 or + /// a color of #ffffff. A value of six would be near white + /// but not quite. + const lowDivisor = 6; + + /// if [500] is the default color, there are at LEAST four + /// steps above [500]. A divisor of 4 would mean [900] is + /// a lightness of 0.0 or color of #000000 + const highDivisor = 5; + + final lowStep = (1.0 - lightness) / lowDivisor; + final highStep = lightness / highDivisor; + + return { + 50: (hslColor.withLightness(lightness + (lowStep * 5))).toColor(), + 100: (hslColor.withLightness(lightness + (lowStep * 4))).toColor(), + 200: (hslColor.withLightness(lightness + (lowStep * 3))).toColor(), + 300: (hslColor.withLightness(lightness + (lowStep * 2))).toColor(), + 400: (hslColor.withLightness(lightness + lowStep)).toColor(), + 500: (hslColor.withLightness(lightness)).toColor(), + 600: (hslColor.withLightness(lightness - highStep)).toColor(), + 700: (hslColor.withLightness(lightness - (highStep * 2))).toColor(), + 800: (hslColor.withLightness(lightness - (highStep * 3))).toColor(), + 900: (hslColor.withLightness(lightness - (highStep * 4))).toColor(), + }; +} diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart new file mode 100644 index 000000000..0b9950c33 --- /dev/null +++ b/packages/remix/lib/remix.dart @@ -0,0 +1,25 @@ +library remix; + +export 'components/alert/alert.dart'; +export 'components/alert/alert.style.dart'; +export 'components/avatar/avatar.dart'; +export 'components/avatar/avatar.style.dart'; +export 'components/badge/badge.dart'; +export 'components/badge/badge.style.dart'; +export 'components/button/button.dart'; +export 'components/button/button.style.dart'; +export 'components/button/button.variants.dart'; +export 'components/card/card.dart'; +export 'components/card/card.style.dart'; +export 'components/checkbox/checkbox.dart'; +export 'components/checkbox/checkbox.variants.dart'; +export 'components/divider/divider.dart'; +export 'components/divider/divider.style.dart'; +export 'components/list_tile/list_tile.dart'; +export 'components/list_tile/list_tile.style.dart'; +export 'components/radio/radio.dart'; +export 'components/radio/radio.style.dart'; +export 'components/radio/radio.variants.dart'; +export 'components/switch/switch.dart'; +export 'components/switch/switch.style.dart'; +export 'components/switch/switch.variants.dart'; diff --git a/packages/remix/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/remix/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 000000000..cccf817a5 --- /dev/null +++ b/packages/remix/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 000000000..610b0a4af --- /dev/null +++ b/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/leofarias/flutter +FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 000000000..c27e21fac --- /dev/null +++ b/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/leofarias/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/packages/remix/pubspec.yaml b/packages/remix/pubspec.yaml new file mode 100644 index 000000000..bf8c2690b --- /dev/null +++ b/packages/remix/pubspec.yaml @@ -0,0 +1,24 @@ +name: remix +description: Completely unstyled, widgets designed to integrate with Mix + +version: 0.0.1 + +environment: + sdk: ">=3.0.6 <4.0.0" + +dependencies: + flutter: + sdk: flutter + mix: ^1.1.0 + mix_annotations: ^0.1.0 + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_lints: ^2.0.0 + mix_generator: ^0.1.1 + build_runner: ^2.4.9 + +flutter: + uses-material-design: true diff --git a/packages/remix/test/components/button_test.dart b/packages/remix/test/components/button_test.dart new file mode 100644 index 000000000..be20f4588 --- /dev/null +++ b/packages/remix/test/components/button_test.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/button/button.dart'; + +void main() { + group('RemixButton', () { + testWidgets('renders with correct label', (WidgetTester tester) async { + const label = 'Test Button'; + await tester.pumpWidget( + MaterialApp( + home: RemixButton(label: label, onPressed: () {}), + ), + ); + + expect( + find.byWidgetPredicate( + (widget) => widget is Text && widget.data == label, + ), + findsOneWidget, + ); + }); + + testWidgets('shows loading indicator and label when isLoading is true', + (WidgetTester tester) async { + const loadingLabel = 'Loading...'; + + await tester.pumpWidget( + MaterialApp( + home: RemixButton( + loading: true, + loadingLabel: loadingLabel, + onPressed: () {}, + ), + ), + ); + + expect(find.byType(CircularProgressIndicator), findsOneWidget); + expect(find.text(loadingLabel), findsOneWidget); + }); + + testWidgets('displays correct icons when provided', + (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: RemixButton( + iconLeft: Icons.arrow_back, + iconRight: Icons.arrow_forward, + onPressed: () {}, + ), + )); + + expect(find.byIcon(Icons.arrow_back), findsOneWidget); + expect(find.byIcon(Icons.arrow_forward), findsOneWidget); + + final HBox iconRow = tester.widget(find.byType(HBox)); + expect(iconRow.children.first, isInstanceOf()); + expect((iconRow.children.first as StyledIcon).icon, Icons.arrow_back); + expect(iconRow.children.last, isInstanceOf()); + expect((iconRow.children.last as StyledIcon).icon, Icons.arrow_forward); + }); + }); + + testWidgets('when disabled must not call onPressed', + (WidgetTester tester) async { + bool didCallOnPressed = false; + + await tester.pumpWidget(MaterialApp( + home: RemixButton( + label: 'Disabled Button', + onPressed: () { + didCallOnPressed = true; + }, + disabled: true, + ), + )); + + await tester.tap(find.byType(RemixButton)); + await tester.pumpAndSettle(const Duration(milliseconds: 200)); + + expect(didCallOnPressed, false); + }); + + testWidgets('when enabled must call onPressed', (WidgetTester tester) async { + bool didCallOnPressed = false; + + await tester.pumpWidget(MaterialApp( + home: RemixButton( + label: 'Disabled Button', + onPressed: () { + didCallOnPressed = true; + }, + ), + )); + + await tester.tap(find.byType(RemixButton)); + await tester.pumpAndSettle(const Duration(milliseconds: 200)); + + expect(didCallOnPressed, isTrue); + }); +} diff --git a/packages/remix/test/components/checkbox_test.dart b/packages/remix/test/components/checkbox_test.dart new file mode 100644 index 000000000..7c7d9cd58 --- /dev/null +++ b/packages/remix/test/components/checkbox_test.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:remix/components/checkbox/checkbox.dart'; + +void main() { + group('RemixCheckbox', () { + testWidgets( + 'when pressed must call the onChanged with the oposite value of isChecked', + (tester) async { + const isChecked = true; + + await tester.pumpWidget( + MaterialApp( + home: RemixCheckbox( + value: isChecked, + label: 'Checkbox', + onChanged: (value) { + expect(value, !isChecked); + }, + ), + ), + ); + + await tester.tap(find.byType(RemixCheckbox)); + await tester.pumpAndSettle(); + }); + + testWidgets('when disabled must not call onChanged', + (WidgetTester tester) async { + bool didCallOnChanged = false; + + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: RemixCheckbox( + value: false, + disabled: true, + onChanged: (value) { + didCallOnChanged = true; + }, + ), + ), + )); + + await tester.tap(find.byType(RemixCheckbox)); + await tester.pumpAndSettle(); + + expect(didCallOnChanged, false); + }); + + testWidgets('initially checked or unchecked based on isChecked value', + (WidgetTester tester) async { + for (var isChecked in [true, false]) { + await tester.pumpWidget(MaterialApp( + home: RemixCheckbox( + value: isChecked, + label: 'Checkbox', + onChanged: (value) {}, + ), + )); + + expect( + find.byWidgetPredicate( + (widget) => widget is RemixCheckbox && widget.value == isChecked, + ), + findsOneWidget, + ); + } + }); + + testWidgets('label is displayed correctly', (WidgetTester tester) async { + const label = 'Test Checkbox'; + + await tester.pumpWidget(MaterialApp( + home: RemixCheckbox( + value: false, + label: label, + onChanged: (value) {}, + ), + )); + + expect( + find.byWidgetPredicate( + (widget) => widget is Text && widget.data == label, + ), + findsOneWidget, + ); + }); + + testWidgets('correct icon is displayed based on isChecked value', + (WidgetTester tester) async { + const iconChecked = Icons.star; + const iconUnchecked = Icons.star_border; + + for (var isChecked in [true, false]) { + await tester.pumpWidget(MaterialApp( + home: RemixCheckbox( + value: isChecked, + iconChecked: iconChecked, + iconUnchecked: iconUnchecked, + label: 'Checkbox', + onChanged: (value) {}, + ), + )); + + expect( + find.byWidgetPredicate( + (widget) => + widget is Icon && + widget.icon == (isChecked ? iconChecked : iconUnchecked), + ), + findsOneWidget, + ); + } + }); + }); +} diff --git a/packages/remix/test/components/radio_test.dart b/packages/remix/test/components/radio_test.dart new file mode 100644 index 000000000..ee994c5ae --- /dev/null +++ b/packages/remix/test/components/radio_test.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:remix/components/radio/radio.dart'; + +void main() { + group('RemixRadio', () { + testWidgets( + 'when pressed must call the onChanged with the oposite value of isChecked', + (tester) async { + const isActive = true; + + await tester.pumpWidget( + MaterialApp( + home: RemixRadio( + active: isActive, + label: 'Radio', + onChanged: (value) { + expect(value, !isActive); + }, + ), + ), + ); + + await tester.tap(find.byType(RemixRadio)); + await tester.pumpAndSettle(const Duration(milliseconds: 150)); + }); + + testWidgets('when disabled must not call onChanged', + (WidgetTester tester) async { + bool didCallOnChanged = false; + + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: RemixRadio( + active: false, + disabled: true, + onChanged: (value) { + didCallOnChanged = true; + }, + ), + ), + )); + + await tester.tap(find.byType(RemixRadio)); + await tester.pumpAndSettle(const Duration(milliseconds: 150)); + + expect(didCallOnChanged, isFalse); + }); + + testWidgets('initially checked or unchecked based on isChecked value', + (WidgetTester tester) async { + for (var isChecked in [true, false]) { + await tester.pumpWidget(MaterialApp( + home: RemixRadio( + active: isChecked, + label: 'Radio', + onChanged: (value) {}, + ), + )); + + expect( + find.byWidgetPredicate( + (widget) => widget is RemixRadio && widget.active == isChecked, + ), + findsOneWidget, + ); + } + }); + + testWidgets('label is displayed correctly', (WidgetTester tester) async { + const label = 'Test Radio'; + + await tester.pumpWidget(MaterialApp( + home: RemixRadio( + active: false, + label: label, + onChanged: (value) {}, + ), + )); + + expect( + find.byWidgetPredicate( + (widget) => widget is Text && widget.data == label, + ), + findsOneWidget, + ); + }); + }); +} diff --git a/packages/remix/test/components/switch_test.dart b/packages/remix/test/components/switch_test.dart new file mode 100644 index 000000000..e2922f7fd --- /dev/null +++ b/packages/remix/test/components/switch_test.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:remix/components/switch/switch.dart'; + +void main() { + group('RemixSwitch', () { + testWidgets( + 'when pressed must call the onChanged with the opposite value of isChecked', + (tester) async { + const isActive = true; + + await tester.pumpWidget( + MaterialApp( + home: RemixSwitch( + active: isActive, + onChanged: (value) { + expect(value, !isActive); + }, + ), + ), + ); + + await tester.tap(find.byType(RemixSwitch)); + await tester.pumpAndSettle(const Duration(milliseconds: 150)); + }); + + testWidgets('when disabled must not call onChanged', + (WidgetTester tester) async { + bool didCallOnChanged = false; + + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: RemixSwitch( + active: false, + disabled: true, + onChanged: (value) { + didCallOnChanged = true; + }, + ), + ), + )); + + await tester.tap(find.byType(RemixSwitch)); + await tester.pumpAndSettle(const Duration(milliseconds: 150)); + + expect(didCallOnChanged, isFalse); + }); + + testWidgets('initially checked or unchecked based on isChecked value', + (WidgetTester tester) async { + for (var isChecked in [true, false]) { + await tester.pumpWidget(MaterialApp( + home: RemixSwitch( + active: isChecked, + onChanged: (value) {}, + ), + )); + + expect( + find.byWidgetPredicate( + (widget) => widget is RemixSwitch && widget.active == isChecked, + ), + findsOneWidget, + ); + } + }); + }); +} diff --git a/website/.gitignore b/website/.gitignore index fbea7fded..636b6426d 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -2,6 +2,4 @@ node_modules .next .DS_Store yarn-error.log -dist -examples -packages \ No newline at end of file +dist \ No newline at end of file From a0e3238fcf61f55d972d68552e4d18c0686c51b9 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Thu, 20 Jun 2024 18:11:41 -0400 Subject: [PATCH 02/24] Worked on button example --- .../lib/src/builders/method_merge.dart | 2 +- .../lib/src/builders/method_resolve.dart | 2 +- .../lib/src/helpers/visitors.dart | 7 +- packages/remix/.vscode/launch.json | 29 + packages/remix/build.yaml | 9 + packages/remix/demo/.metadata | 31 +- packages/remix/demo/android/.gitignore | 13 - packages/remix/demo/android/app/build.gradle | 67 -- .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 33 - .../kotlin/com/example/demo/MainActivity.kt | 6 - .../res/drawable-v21/launch_background.xml | 12 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values-night/styles.xml | 18 - .../app/src/main/res/values/styles.xml | 18 - .../app/src/profile/AndroidManifest.xml | 7 - packages/remix/demo/android/build.gradle | 30 - packages/remix/demo/android/gradle.properties | 3 - .../gradle/wrapper/gradle-wrapper.properties | 5 - packages/remix/demo/android/settings.gradle | 29 - .../demo/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../demo/ios/Runner.xcodeproj/project.pbxproj | 12 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- packages/remix/demo/ios/Runner/Info.plist | 2 + packages/remix/demo/lib/components/alert.dart | 32 - .../remix/demo/lib/components/avatar.dart | 58 -- packages/remix/demo/lib/components/badge.dart | 20 - .../remix/demo/lib/components/button.dart | 24 +- packages/remix/demo/lib/components/card.dart | 24 - .../remix/demo/lib/components/checkbox.dart | 41 -- .../remix/demo/lib/components/divider.dart | 13 - .../remix/demo/lib/components/list_tile.dart | 41 -- packages/remix/demo/lib/components/radio.dart | 28 - .../remix/demo/lib/components/switch.dart | 24 - .../remix/demo/lib/main.directories.g.dart | 125 +--- packages/remix/demo/linux/.gitignore | 1 + packages/remix/demo/linux/CMakeLists.txt | 139 ++++ .../remix/demo/linux/flutter/CMakeLists.txt | 88 +++ packages/remix/demo/linux/main.cc | 6 + packages/remix/demo/linux/my_application.cc | 104 +++ packages/remix/demo/linux/my_application.h | 18 + packages/remix/demo/macos/.gitignore | 7 + .../demo/macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../ephemeral/Flutter-Generated.xcconfig | 8 +- .../ephemeral/flutter_export_environment.sh | 8 +- .../macos/Runner.xcodeproj/project.pbxproj | 695 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../remix/demo/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../demo/macos/Runner/Base.lproj/MainMenu.xib | 343 +++++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../demo/macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + packages/remix/demo/macos/Runner/Info.plist | 32 + .../demo/macos/Runner/MainFlutterWindow.swift | 15 + .../demo/macos/Runner/Release.entitlements | 8 + .../demo/macos/RunnerTests/RunnerTests.swift | 12 + packages/remix/demo/pubspec.yaml | 6 +- packages/remix/demo/test/widget_test.dart | 29 + packages/remix/demo/web/index.html | 2 +- packages/remix/demo/windows/.gitignore | 17 + packages/remix/demo/windows/CMakeLists.txt | 102 +++ .../remix/demo/windows/flutter/CMakeLists.txt | 104 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../remix/demo/windows/runner/CMakeLists.txt | 40 + packages/remix/demo/windows/runner/Runner.rc | 121 +++ .../demo/windows/runner/flutter_window.cpp | 66 ++ .../demo/windows/runner/flutter_window.h | 33 + packages/remix/demo/windows/runner/main.cpp | 43 ++ packages/remix/demo/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../demo/windows/runner/runner.exe.manifest | 20 + packages/remix/demo/windows/runner/utils.cpp | 65 ++ packages/remix/demo/windows/runner/utils.h | 19 + .../demo/windows/runner/win32_window.cpp | 288 ++++++++ .../remix/demo/windows/runner/win32_window.h | 102 +++ .../remix/lib/components/alert/alert.dart | 85 --- .../lib/components/alert/alert.style.dart | 104 --- .../remix/lib/components/avatar/avatar.dart | 62 -- .../lib/components/avatar/avatar.style.dart | 72 -- .../remix/lib/components/badge/badge.dart | 40 - .../lib/components/badge/badge.style.dart | 63 -- .../remix/lib/components/button/button.dart | 85 ++- .../lib/components/button/button.style.dart | 255 ++++--- .../components/button/button.variants.dart | 35 +- .../lib/components/button/button_spec.dart | 24 +- .../lib/components/button/button_spec.g.dart | 21 +- packages/remix/lib/components/card/card.dart | 68 -- .../remix/lib/components/card/card.style.dart | 46 -- .../lib/components/checkbox/checkbox.dart | 122 --- .../checkbox/checkbox.variants.dart | 8 - .../checkbox/tokens/checkbox_attr.dart | 44 -- .../checkbox/tokens/checkbox_spec.dart | 63 -- .../checkbox/tokens/checkbox_util.dart | 41 -- .../remix/lib/components/divider/divider.dart | 32 - .../lib/components/divider/divider.style.dart | 45 -- .../lib/components/list_tile/list_tile.dart | 73 -- .../components/list_tile/list_tile.style.dart | 84 --- .../remix/lib/components/radio/radio.dart | 66 -- .../lib/components/radio/radio.style.dart | 97 --- .../lib/components/radio/radio.variants.dart | 8 - .../remix/lib/components/switch/switch.dart | 52 -- .../lib/components/switch/switch.style.dart | 73 -- .../components/switch/switch.variants.dart | 8 - packages/remix/lib/remix.dart | 20 - packages/remix/pubspec.yaml | 4 +- .../remix/test/components/button_test.dart | 16 +- .../remix/test/components/checkbox_test.dart | 116 --- .../remix/test/components/radio_test.dart | 89 --- .../remix/test/components/switch_test.dart | 68 -- 130 files changed, 3179 insertions(+), 2547 deletions(-) create mode 100644 packages/remix/.vscode/launch.json create mode 100644 packages/remix/build.yaml delete mode 100644 packages/remix/demo/android/.gitignore delete mode 100644 packages/remix/demo/android/app/build.gradle delete mode 100644 packages/remix/demo/android/app/src/debug/AndroidManifest.xml delete mode 100644 packages/remix/demo/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt delete mode 100644 packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/remix/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/remix/demo/android/app/src/main/res/values-night/styles.xml delete mode 100644 packages/remix/demo/android/app/src/main/res/values/styles.xml delete mode 100644 packages/remix/demo/android/app/src/profile/AndroidManifest.xml delete mode 100644 packages/remix/demo/android/build.gradle delete mode 100644 packages/remix/demo/android/gradle.properties delete mode 100644 packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/remix/demo/android/settings.gradle delete mode 100644 packages/remix/demo/lib/components/alert.dart delete mode 100644 packages/remix/demo/lib/components/avatar.dart delete mode 100644 packages/remix/demo/lib/components/badge.dart delete mode 100644 packages/remix/demo/lib/components/card.dart delete mode 100644 packages/remix/demo/lib/components/checkbox.dart delete mode 100644 packages/remix/demo/lib/components/divider.dart delete mode 100644 packages/remix/demo/lib/components/list_tile.dart delete mode 100644 packages/remix/demo/lib/components/radio.dart delete mode 100644 packages/remix/demo/lib/components/switch.dart create mode 100644 packages/remix/demo/linux/.gitignore create mode 100644 packages/remix/demo/linux/CMakeLists.txt create mode 100644 packages/remix/demo/linux/flutter/CMakeLists.txt create mode 100644 packages/remix/demo/linux/main.cc create mode 100644 packages/remix/demo/linux/my_application.cc create mode 100644 packages/remix/demo/linux/my_application.h create mode 100644 packages/remix/demo/macos/.gitignore create mode 100644 packages/remix/demo/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 packages/remix/demo/macos/Flutter/Flutter-Release.xcconfig create mode 100644 packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj create mode 100644 packages/remix/demo/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/remix/demo/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/remix/demo/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/remix/demo/macos/Runner/AppDelegate.swift create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 packages/remix/demo/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 packages/remix/demo/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 packages/remix/demo/macos/Runner/Configs/Debug.xcconfig create mode 100644 packages/remix/demo/macos/Runner/Configs/Release.xcconfig create mode 100644 packages/remix/demo/macos/Runner/Configs/Warnings.xcconfig create mode 100644 packages/remix/demo/macos/Runner/DebugProfile.entitlements create mode 100644 packages/remix/demo/macos/Runner/Info.plist create mode 100644 packages/remix/demo/macos/Runner/MainFlutterWindow.swift create mode 100644 packages/remix/demo/macos/Runner/Release.entitlements create mode 100644 packages/remix/demo/macos/RunnerTests/RunnerTests.swift create mode 100644 packages/remix/demo/test/widget_test.dart create mode 100644 packages/remix/demo/windows/.gitignore create mode 100644 packages/remix/demo/windows/CMakeLists.txt create mode 100644 packages/remix/demo/windows/flutter/CMakeLists.txt create mode 100644 packages/remix/demo/windows/flutter/generated_plugin_registrant.cc create mode 100644 packages/remix/demo/windows/flutter/generated_plugin_registrant.h create mode 100644 packages/remix/demo/windows/flutter/generated_plugins.cmake create mode 100644 packages/remix/demo/windows/runner/CMakeLists.txt create mode 100644 packages/remix/demo/windows/runner/Runner.rc create mode 100644 packages/remix/demo/windows/runner/flutter_window.cpp create mode 100644 packages/remix/demo/windows/runner/flutter_window.h create mode 100644 packages/remix/demo/windows/runner/main.cpp create mode 100644 packages/remix/demo/windows/runner/resource.h create mode 100644 packages/remix/demo/windows/runner/resources/app_icon.ico create mode 100644 packages/remix/demo/windows/runner/runner.exe.manifest create mode 100644 packages/remix/demo/windows/runner/utils.cpp create mode 100644 packages/remix/demo/windows/runner/utils.h create mode 100644 packages/remix/demo/windows/runner/win32_window.cpp create mode 100644 packages/remix/demo/windows/runner/win32_window.h delete mode 100644 packages/remix/lib/components/alert/alert.dart delete mode 100644 packages/remix/lib/components/alert/alert.style.dart delete mode 100644 packages/remix/lib/components/avatar/avatar.dart delete mode 100644 packages/remix/lib/components/avatar/avatar.style.dart delete mode 100644 packages/remix/lib/components/badge/badge.dart delete mode 100644 packages/remix/lib/components/badge/badge.style.dart delete mode 100644 packages/remix/lib/components/card/card.dart delete mode 100644 packages/remix/lib/components/card/card.style.dart delete mode 100644 packages/remix/lib/components/checkbox/checkbox.dart delete mode 100644 packages/remix/lib/components/checkbox/checkbox.variants.dart delete mode 100644 packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart delete mode 100644 packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart delete mode 100644 packages/remix/lib/components/checkbox/tokens/checkbox_util.dart delete mode 100644 packages/remix/lib/components/divider/divider.dart delete mode 100644 packages/remix/lib/components/divider/divider.style.dart delete mode 100644 packages/remix/lib/components/list_tile/list_tile.dart delete mode 100644 packages/remix/lib/components/list_tile/list_tile.style.dart delete mode 100644 packages/remix/lib/components/radio/radio.dart delete mode 100644 packages/remix/lib/components/radio/radio.style.dart delete mode 100644 packages/remix/lib/components/radio/radio.variants.dart delete mode 100644 packages/remix/lib/components/switch/switch.dart delete mode 100644 packages/remix/lib/components/switch/switch.style.dart delete mode 100644 packages/remix/lib/components/switch/switch.variants.dart delete mode 100644 packages/remix/test/components/checkbox_test.dart delete mode 100644 packages/remix/test/components/radio_test.dart delete mode 100644 packages/remix/test/components/switch_test.dart diff --git a/packages/mix_generator/lib/src/builders/method_merge.dart b/packages/mix_generator/lib/src/builders/method_merge.dart index e7e7f3daf..8a51bc3c3 100644 --- a/packages/mix_generator/lib/src/builders/method_merge.dart +++ b/packages/mix_generator/lib/src/builders/method_merge.dart @@ -18,7 +18,7 @@ String mergeMethodBuilder({ final fieldStatements = fields.map((field) { final propName = field.name; final thisName = isInternalRef ? field.asInternalRef : field.name; - final nullable = field.nullable ? '?' : ''; + final nullable = '?'; var propAssignment = '$propName:'; diff --git a/packages/mix_generator/lib/src/builders/method_resolve.dart b/packages/mix_generator/lib/src/builders/method_resolve.dart index b266ea7b4..87b756cd6 100644 --- a/packages/mix_generator/lib/src/builders/method_resolve.dart +++ b/packages/mix_generator/lib/src/builders/method_resolve.dart @@ -12,7 +12,7 @@ String resolveMethodBuilder({ final resolveStatements = fields.map((field) { final propName = field.name; var fieldName = isInternalRef ? field.asInternalRef : field.name; - var nullableSign = field.nullable ? '?' : ''; + var nullableSign = '?'; final fallbackExpression = field.nullable && withDefaults ? '?? $kDefaultValueRef.$propName' : ''; diff --git a/packages/mix_generator/lib/src/helpers/visitors.dart b/packages/mix_generator/lib/src/helpers/visitors.dart index 361c84469..0a27f1e65 100644 --- a/packages/mix_generator/lib/src/helpers/visitors.dart +++ b/packages/mix_generator/lib/src/helpers/visitors.dart @@ -36,11 +36,16 @@ class ClassVisitor extends SimpleElementVisitor { for (final param in element.parameters) { final fieldInfo = getFieldInfoFromParameter(param); + final field = fields[param.name]; + + final isNullable = + param.type.nullabilitySuffix == NullabilitySuffix.question; + parameters[param.name] = ParameterInfo( name: param.name, dartType: param.type, type: getTypeNameFromDartType(param.type), - nullable: param.type.nullabilitySuffix == NullabilitySuffix.question, + nullable: field?.nullable ?? isNullable, isSuper: param.isSuperFormal, documentationComment: fieldInfo?.documentationComment, annotation: fieldInfo!.annotation, diff --git a/packages/remix/.vscode/launch.json b/packages/remix/.vscode/launch.json new file mode 100644 index 000000000..4ec263107 --- /dev/null +++ b/packages/remix/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "demo", + "cwd": "demo", + "request": "launch", + "type": "dart" + }, + { + "name": "demo (profile mode)", + "cwd": "demo", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "demo (release mode)", + "cwd": "demo", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/packages/remix/build.yaml b/packages/remix/build.yaml new file mode 100644 index 000000000..22a345582 --- /dev/null +++ b/packages/remix/build.yaml @@ -0,0 +1,9 @@ +targets: + $default: + builders: + mix_generator|spec: + generate_for: + - lib/**/*_spec.dart + mix_generator|dto: + generate_for: + - lib/**/*_dto.dart \ No newline at end of file diff --git a/packages/remix/demo/.metadata b/packages/remix/demo/.metadata index 0369949f1..de745e4a0 100644 --- a/packages/remix/demo/.metadata +++ b/packages/remix/demo/.metadata @@ -1,11 +1,11 @@ # 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. +# This file should be version controlled. version: - revision: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" - channel: "stable" + revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + channel: stable project_type: app @@ -13,17 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - platform: android - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - platform: ios - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + - platform: linux + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + - platform: macos + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - platform: web - create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 - base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + - platform: windows + create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 # User provided section diff --git a/packages/remix/demo/android/.gitignore b/packages/remix/demo/android/.gitignore deleted file mode 100644 index 6f568019d..000000000 --- a/packages/remix/demo/android/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -**/*.keystore -**/*.jks diff --git a/packages/remix/demo/android/app/build.gradle b/packages/remix/demo/android/app/build.gradle deleted file mode 100644 index 6cc522f88..000000000 --- a/packages/remix/demo/android/app/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -android { - namespace "com.example.demo" - compileSdkVersion flutter.compileSdkVersion - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.demo" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies {} diff --git a/packages/remix/demo/android/app/src/debug/AndroidManifest.xml b/packages/remix/demo/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f6981d..000000000 --- a/packages/remix/demo/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/remix/demo/android/app/src/main/AndroidManifest.xml b/packages/remix/demo/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 81300528b..000000000 --- a/packages/remix/demo/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt b/packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt deleted file mode 100644 index 34b9c4c6c..000000000 --- a/packages/remix/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.demo - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f3f..000000000 --- a/packages/remix/demo/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml b/packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88..000000000 --- a/packages/remix/demo/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/remix/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/remix/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/remix/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/remix/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/remix/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/remix/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/remix/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/remix/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/remix/demo/android/app/src/main/res/values-night/styles.xml b/packages/remix/demo/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be74..000000000 --- a/packages/remix/demo/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/packages/remix/demo/android/app/src/main/res/values/styles.xml b/packages/remix/demo/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef8805..000000000 --- a/packages/remix/demo/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/packages/remix/demo/android/app/src/profile/AndroidManifest.xml b/packages/remix/demo/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f6981d..000000000 --- a/packages/remix/demo/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/remix/demo/android/build.gradle b/packages/remix/demo/android/build.gradle deleted file mode 100644 index e83fb5dac..000000000 --- a/packages/remix/demo/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/packages/remix/demo/android/gradle.properties b/packages/remix/demo/android/gradle.properties deleted file mode 100644 index 598d13fee..000000000 --- a/packages/remix/demo/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx4G -android.useAndroidX=true -android.enableJetifier=true diff --git a/packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties b/packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3c472b99c..000000000 --- a/packages/remix/demo/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/packages/remix/demo/android/settings.gradle b/packages/remix/demo/android/settings.gradle deleted file mode 100644 index 7cd712855..000000000 --- a/packages/remix/demo/android/settings.gradle +++ /dev/null @@ -1,29 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() - - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } - - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false -} - -include ":app" diff --git a/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist b/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist index 7c5696400..9625e105d 100644 --- a/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist +++ b/packages/remix/demo/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 11.0 diff --git a/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj b/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj index 0a73ba1e6..fd8d20931 100644 --- a/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/remix/demo/ios/Runner.xcodeproj/project.pbxproj @@ -168,8 +168,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1510; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { @@ -345,7 +344,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -361,6 +360,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = RW3X256N25; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -472,7 +472,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -521,7 +521,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -539,6 +539,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = RW3X256N25; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -561,6 +562,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = RW3X256N25; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe..e42adcb34 100644 --- a/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/remix/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone UIApplicationSupportsIndirectInputEvents diff --git a/packages/remix/demo/lib/components/alert.dart b/packages/remix/demo/lib/components/alert.dart deleted file mode 100644 index 1258d58b3..000000000 --- a/packages/remix/demo/lib/components/alert.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook/widgetbook.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixAlert, -) -Widget buildCheckboxUseCase(BuildContext context) { - return Center( - child: SizedBox( - width: 300, - child: RemixAlert( - title: context.knobs.string( - label: 'Title', - initialValue: 'Error', - ), - subtitle: context.knobs.string( - label: 'Subtitle', - initialValue: 'Your session has expired. Please log in again.', - ), - icon: context.knobs.boolean( - label: 'icon', - initialValue: false, - ) - ? Icons.warning_amber_rounded - : null, - ), - ), - ); -} diff --git a/packages/remix/demo/lib/components/avatar.dart b/packages/remix/demo/lib/components/avatar.dart deleted file mode 100644 index d7a4ae080..000000000 --- a/packages/remix/demo/lib/components/avatar.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixAvatar, -) -Widget buildCheckboxUseCase(BuildContext context) { - return Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - RemixAvatar( - style: RemixAvatarStyle( - container: Style( - $box.height(60), - $box.width(60), - $box.borderRadius(20), - $box.color( - Colors.cyanAccent.shade200.withAlpha(60), - ), - $icon.size(30), - $icon.color(Colors.cyanAccent), - ), - ), - imageBuilder: (style) => const StyledIcon(Icons.person), - ), - const SizedBox(width: 10), - RemixAvatar( - style: RemixAvatarStyle.base().copyWith( - container: Style( - $box.height(50), - $box.width(50), - ), - ), - imageBuilder: (style) => - const StyledIcon(Icons.access_alarms_rounded), - ), - const SizedBox(width: 10), - RemixAvatar( - image: NetworkImage( - 'https://avatars.githubusercontent.com/u/14010287?v=4', - ), - style: RemixAvatarStyle.base().copyWith( - container: Style( - $box.height(40), - $box.width(40), - ), - ), - ), - ], - ), - ); -} diff --git a/packages/remix/demo/lib/components/badge.dart b/packages/remix/demo/lib/components/badge.dart deleted file mode 100644 index 69409c143..000000000 --- a/packages/remix/demo/lib/components/badge.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook/widgetbook.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixBadge, -) -Widget buildCheckboxUseCase(BuildContext context) { - return Center( - child: RemixBadge( - label: context.knobs.string( - label: "Label", - description: 'The text displayed in the badge', - initialValue: "Label", - ), - ), - ); -} diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button.dart index 61994d1a4..f017024fb 100644 --- a/packages/remix/demo/lib/components/button.dart +++ b/packages/remix/demo/lib/components/button.dart @@ -5,12 +5,12 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; @widgetbook.UseCase( name: 'interactive playground', - type: RemixButton, + type: RXButton, ) Widget buildButtonUseCase(BuildContext context) { - return Center( - child: RemixButton( - label: context.knobs.stringOrNull( + Widget buildButton(ButtonType type) { + return RXButton( + label: context.knobs.string( label: 'Title', initialValue: 'Title', ), @@ -19,7 +19,7 @@ Widget buildButtonUseCase(BuildContext context) { label: 'Is loading', initialValue: false, ), - loadingLabel: context.knobs.stringOrNull( + loadingLabel: context.knobs.string( label: 'Loading label', initialValue: 'Loading', ), @@ -29,14 +29,14 @@ Widget buildButtonUseCase(BuildContext context) { ), size: context.knobs.list( label: 'Size', - options: ButtonSizeVariant.values, - labelBuilder: (value) => value.name.split('.').last, - ), - type: context.knobs.list( - label: 'Type', - options: ButtonType.values, + options: ButtonSize.values, labelBuilder: (value) => value.name.split('.').last, ), - ), + type: type, + ); + } + + return Center( + child: Wrap(children: ButtonType.values.map(buildButton).toList()), ); } diff --git a/packages/remix/demo/lib/components/card.dart b/packages/remix/demo/lib/components/card.dart deleted file mode 100644 index cef6890ec..000000000 --- a/packages/remix/demo/lib/components/card.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixCard, -) -Widget buildCheckboxUseCase(BuildContext context) { - return const Center( - child: SizedBox( - width: 300, - child: RemixCard( - child: RemixListTile( - leading: RemixAvatar( - fallbackLabel: 'LF', - ), - title: 'Title', - subtitle: 'Subtitle', - ), - ), - ), - ); -} diff --git a/packages/remix/demo/lib/components/checkbox.dart b/packages/remix/demo/lib/components/checkbox.dart deleted file mode 100644 index 492641704..000000000 --- a/packages/remix/demo/lib/components/checkbox.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook/widgetbook.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixCheckbox, -) -Widget buildCheckboxUseCase(BuildContext context) { - return Center( - child: Row( - children: [ - Box( - style: Style( - $box.color.grey(), - $box.height(20), - $box.width(20), - $box.borderRadius(4), - ), - ), - RemixCheckbox( - label: context.knobs.stringOrNull( - label: 'Title', - initialValue: 'Title', - ), - onChanged: (value) {}, - value: context.knobs.boolean( - label: 'Checked', - initialValue: false, - ), - disabled: context.knobs.boolean( - label: 'Disabled', - initialValue: false, - ), - ), - ], - ), - ); -} diff --git a/packages/remix/demo/lib/components/divider.dart b/packages/remix/demo/lib/components/divider.dart deleted file mode 100644 index 0e80c6c5a..000000000 --- a/packages/remix/demo/lib/components/divider.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixDivider, -) -Widget buildCheckboxUseCase(BuildContext context) { - return const Center( - child: RemixDivider(), - ); -} diff --git a/packages/remix/demo/lib/components/list_tile.dart b/packages/remix/demo/lib/components/list_tile.dart deleted file mode 100644 index 0185a92b1..000000000 --- a/packages/remix/demo/lib/components/list_tile.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook/widgetbook.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixListTile, -) -Widget buildCheckboxUseCase(BuildContext context) { - return Center( - child: RemixListTile( - leading: RemixAvatar( - style: RemixAvatarStyle.base().copyWith( - container: Style( - $box.height(60), - $box.width(60), - $box.borderRadius(6), - $box.color( - Colors.black26, - ), - ), - ), - fallbackLabel: 'LF', - ), - title: context.knobs.string( - label: 'Title', - initialValue: 'Title', - ), - subtitle: context.knobs.string( - label: 'Subtitle', - initialValue: 'Subtitle', - ), - trailing: Icon( - Icons.arrow_forward_ios, - size: 16, - ), - ), - ); -} diff --git a/packages/remix/demo/lib/components/radio.dart b/packages/remix/demo/lib/components/radio.dart deleted file mode 100644 index d09107307..000000000 --- a/packages/remix/demo/lib/components/radio.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook/widgetbook.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixRadio, -) -Widget buildRadioUseCase(BuildContext context) { - return Center( - child: RemixRadio( - active: context.knobs.boolean( - label: 'active', - initialValue: true, - ), - label: context.knobs.string( - label: 'label', - initialValue: 'Radio', - ), - disabled: context.knobs.boolean( - label: 'disabled', - initialValue: false, - ), - onChanged: (value) {}, - ), - ); -} diff --git a/packages/remix/demo/lib/components/switch.dart b/packages/remix/demo/lib/components/switch.dart deleted file mode 100644 index 0297c55fc..000000000 --- a/packages/remix/demo/lib/components/switch.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:remix/remix.dart'; -import 'package:widgetbook/widgetbook.dart'; -import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; - -@widgetbook.UseCase( - name: 'interactive playground', - type: RemixSwitch, -) -Widget buildRadioUseCase(BuildContext context) { - return Center( - child: RemixSwitch( - active: context.knobs.boolean( - label: 'active', - initialValue: true, - ), - disabled: context.knobs.boolean( - label: 'disabled', - initialValue: false, - ), - onChanged: (value) {}, - ), - ); -} diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index 2616f50dc..351a5f73a 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -9,142 +9,25 @@ // ************************************************************************** // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:demo/components/alert.dart' as _i2; -import 'package:demo/components/avatar.dart' as _i3; -import 'package:demo/components/badge.dart' as _i4; -import 'package:demo/components/button.dart' as _i5; -import 'package:demo/components/card.dart' as _i6; -import 'package:demo/components/checkbox.dart' as _i7; -import 'package:demo/components/divider.dart' as _i8; -import 'package:demo/components/list_tile.dart' as _i9; -import 'package:demo/components/radio.dart' as _i10; -import 'package:demo/components/switch.dart' as _i11; +import 'package:demo/components/button.dart' as _i2; import 'package:widgetbook/widgetbook.dart' as _i1; final directories = <_i1.WidgetbookNode>[ _i1.WidgetbookFolder( name: 'components', children: [ - _i1.WidgetbookFolder( - name: 'alert', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixAlert', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i2.buildCheckboxUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'avatar', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixAvatar', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i3.buildCheckboxUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'badge', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixBadge', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i4.buildCheckboxUseCase, - ), - ) - ], - ), _i1.WidgetbookFolder( name: 'button', children: [ _i1.WidgetbookLeafComponent( - name: 'RemixButton', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i5.buildButtonUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'card', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixCard', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i6.buildCheckboxUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'checkbox', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixCheckbox', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i7.buildCheckboxUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'divider', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixDivider', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i8.buildCheckboxUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'list_tile', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixListTile', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i9.buildCheckboxUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'radio', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixRadio', - useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', - builder: _i10.buildRadioUseCase, - ), - ) - ], - ), - _i1.WidgetbookFolder( - name: 'switch', - children: [ - _i1.WidgetbookLeafComponent( - name: 'RemixSwitch', + name: 'RXButton', useCase: _i1.WidgetbookUseCase( name: 'interactive playground', - builder: _i11.buildRadioUseCase, + builder: _i2.buildButtonUseCase, ), ) ], - ), + ) ], ) ]; diff --git a/packages/remix/demo/linux/.gitignore b/packages/remix/demo/linux/.gitignore new file mode 100644 index 000000000..d3896c984 --- /dev/null +++ b/packages/remix/demo/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/packages/remix/demo/linux/CMakeLists.txt b/packages/remix/demo/linux/CMakeLists.txt new file mode 100644 index 000000000..d8d150acd --- /dev/null +++ b/packages/remix/demo/linux/CMakeLists.txt @@ -0,0 +1,139 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "demo") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.demo") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/packages/remix/demo/linux/flutter/CMakeLists.txt b/packages/remix/demo/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000..d5bd01648 --- /dev/null +++ b/packages/remix/demo/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/remix/demo/linux/main.cc b/packages/remix/demo/linux/main.cc new file mode 100644 index 000000000..e7c5c5437 --- /dev/null +++ b/packages/remix/demo/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/packages/remix/demo/linux/my_application.cc b/packages/remix/demo/linux/my_application.cc new file mode 100644 index 000000000..0d6f1ccec --- /dev/null +++ b/packages/remix/demo/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "demo"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "demo"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/packages/remix/demo/linux/my_application.h b/packages/remix/demo/linux/my_application.h new file mode 100644 index 000000000..72271d5e4 --- /dev/null +++ b/packages/remix/demo/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/remix/demo/macos/.gitignore b/packages/remix/demo/macos/.gitignore new file mode 100644 index 000000000..746adbb6b --- /dev/null +++ b/packages/remix/demo/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/packages/remix/demo/macos/Flutter/Flutter-Debug.xcconfig b/packages/remix/demo/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000..c2efd0b60 --- /dev/null +++ b/packages/remix/demo/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/remix/demo/macos/Flutter/Flutter-Release.xcconfig b/packages/remix/demo/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000..c2efd0b60 --- /dev/null +++ b/packages/remix/demo/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index abe3d6a82..84a846e69 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,11 +1,13 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/Users/leofarias/flutter -FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui/demo +FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6 +FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart FLUTTER_BUILD_DIR=build FLUTTER_BUILD_NAME=1.0.0 FLUTTER_BUILD_NUMBER=1 +DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw== DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json +PACKAGE_CONFIG=/Users/leofarias/Projects/mix/packages/remix/demo/.dart_tool/package_config.json diff --git a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh index 18f6e5993..701777f05 100755 --- a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,12 +1,14 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/Users/leofarias/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui/demo" +export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6" +export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo" export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=1.0.0" export "FLUTTER_BUILD_NUMBER=1" +export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw==" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" +export "PACKAGE_CONFIG=/Users/leofarias/Projects/mix/packages/remix/demo/.dart_tool/package_config.json" diff --git a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..de4d66361 --- /dev/null +++ b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,695 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 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 */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* demo.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* demo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/packages/remix/demo/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/remix/demo/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/remix/demo/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..0b1d244f9 --- /dev/null +++ b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/remix/demo/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/remix/demo/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/packages/remix/demo/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/remix/demo/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/remix/demo/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/remix/demo/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/remix/demo/macos/Runner/AppDelegate.swift b/packages/remix/demo/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000..d53ef6437 --- /dev/null +++ b/packages/remix/demo/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..a2ec33f19 --- /dev/null +++ b/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z zKpxF`G*X(YOz2^@7i#D+s-~A1E;3&x%%qL5hkiy^JhYjJ74{hvVmAx*6BH`M`!qGC zO9pjEsR)A-n1`6KLACSL%FS_Kcm+?4*z-V?WAZPs?RkzoijIr~I+oh1^~T`q^dCFvG$Gbd8AnTYBjLKYUmayaQz#S1le7Q^Hyr#;X&h*1wDpm+gZC!rSKom zq|+o&UGpeXtlQ1;?@JukKG!8PGS1Io0z6O}ZeL&DsON^I0K+>Mxv#ohK+;ByAZ`Eb z2orY{j0Pa3edA(#-pJA0AaJ6h& z81Gl(pd#j~mrizktoid14K5ig7u8FvZmLLP%l@dl05IprCyqDB?mA2fc*6UB+49lb zZ8`V9epdo=OeZoiY%zw-w`8DNwTORV_>>3T{r)1-YsGSo0E2s>tix9OBqKFBjg#}G z`pgkCblKMYs!Z)r^(qT_c+}gLhR|gnq!1~Qr|~kt&2@_yswx{i$KEn`8J1W8BGljl zr@GEG#W(s#AKKyuqLp+cl1C}7%`m#-!$15XF{M(M*-fD%+i#mFbP35jlgN3{8#A-dmj&OQtG)!031jTwGMal=&YtPfq2AUWekP9J-JT(p099!L`+yen$ zVH1?kRrhV7(mGKkm_jPP_U@Xd;x=ppk}4WY0Rbr> z0MJM_;$GGxL*P68y%KBqHntF{>X&<{aeI4m6+{TQ%~Zp}v%Pujr)zg5mV;cFKqeA- zQm5`#Sd{B6Rc*4PS-rO(vf>YEdXmOK?>K@`L5}|9q}#t_IE%g+U<-1qw3mr5&v;2A zCQ}BEn9_u;;>n5N#dP0RhCF-_UplC+U(i~Zjh>U5+b8%@p3HK(R*IMQwE!uritb}< zF)AK2?+0@-aE3LYkg`B*&N&m~JWB9>(Z>`aqRwgioU)0w{U1K4?>-#i|ZfhNa9hV)2)(%ch zJMH1twoeZWwkE@I!dz$ma+;9GeACv>Ncupl@+gBSeU_uzfj!$+h&@EACkZG_vwLGA z(?^;rcJu1$5H~xI@6lHIYC-$+b&hF1p`AoAOKqw{t0Fu#X`OGt$)7Q!nmJ=&)xjq@ zHoxT4pcYKSPT5(4yzIuQ^S*N2NJpR4v0?rB-^JuaXNLis?E(l>Jo8mUw(gsFLLOy? zEszHWGaCn|lw$LSwoj{G7Uq(zK0W^VVWu#ms8BMRlF2z%-g`fOXmndgC(na8fc)s` zz$GAoxP+l|+T_S4$r1sLwkV77ew1Gug*`|HiE*?FGLm1q; z^p0A0eqqbmk3?|!CB9DBN1Zof6d7+ zJSn!`VD~tVaqy<*Mw^8dM5v3Bvj2VdVFb=)U3L2eDM3@>n(P z?Rr_=I17+r4fE{>1LBQG0&o97nef67n-aNnVP<{dd6*B!Q344 zZbsAof&jw+;CLeK2d87t9s~YZ5?6Qwf&{NPEBN+)LbjOcZRXNcR&h)x`TtdpI+b!>$E~h0o1L*2OddpR9!Gw~-E^Cj(7i69S<66ak$)AYMv|xG+;uR(`;h zGIV3}?+Qxdjz)s;s}jHY{JPmeo@-tN$H@hxaV@)}K?y~ts~E6H(F|SlsN5oH8g7*h zGiC!8c1doE3U|D}Vul1yPmXuCk*hmyU4MG2ml#V0+(G5I+`L_=3cD$%$I=@*8m-LU-!fn&-sZO1%ls63+w}AiAK`Jv z>`q~ztr&&(gCkFpci+*1Ekdv*MhBCzGfPBj9dM|YEjZk(tWBuz4?MGeq+*)t>Q=z6UXF_w z{QDUT4^JQ8J%hW;d2xGB>Fl4Y-bRT!ttP2GE5jYoI1e(eVK0&V5W+>zludt=nf|UN zi1IV;MK$Fy%$yw<oGeW?JIGjmfGLH$Y;l|T0p1V!N*Jvu zHSAG0WpwPip0vm7%VRq8$2O2>P5b!WBfTz*6dZ4Wd6O9Y(8A;nOuG((y?F`ac_u2( z#~17CoTK)1G<~~Z4jXlout{e&nZbDHyHf(=a?OtaJ(2Q(!g#)Ugw-QQ?A?mN#yN%T zBtJ`sA6Lpg`k>Pi8a7GssiY$eG0Be8LCoQL{GDqi-;j0pLmT!Z)szldvbN7GVcu*S zzb1rEq|M)1qa7rM*I8!<#w7FnQ?{v^? z0`MlS3+`#ZB5$DT4+`7e-Hlp_2G0`*F@STbRJ|!tk3cC~1T%NR-p4s=sTT+RqsMjF zyrp-Jv?CD4Y3N&Zb1gr=%`MFR8;|r)uxQ6*X{OpEhQ~+tu}^n8Wijiy`pSMw0uKNi zSNX^Z1y;WirM0o_x%zft0U2GcLm_2BS`b{Z>g|9VOVr%QF*R?pTpiJsEbj4jLVAyd zTA;x15=f~b0^(e*Vo;Tn;WTJSxpI9LmL($Lxob<^S!k7mGhnnVNnAC*g!$ms0#Q|q zs=25I0<>fUw_&+KU`}5P9wlmjRWdMYh%Np6n?AAHQ;JzG?s(Z9UR`pNh79Nzk~DF+ zX~jy>>f-2bl?drlM8 z3NfIQnrT@pLmv+QA6efWPv!sqe;mh3_RcOj5>Ya;4hhN13dtx*_TJ-=kX_kZQDkPz zIw}#e_dK%au@1*L&iUP^cfH?zf1iK)tHv=t|>-9mMT!;;Vg|svSzWkN7q#t$c4N$Q;tl3EYwef_4q>GO<#I89VhY;`X*hz$n*GZ%f+;uViG z?uLlxD1OIeid}0r9%Ssoc7@vJjZIsZlU9zvYpjhYiOrzD5sq3OC zpf-X;Nb!DLpxqX^zDIK%=46-Z3%i-bac`RIBS5*wcw5Pu>G|kF>TQP$dGRYh#1hwD z{|cbbTOKL>Gb1-;X6?vWLC+KJ_^Ij?KzJ7eZ?^8XNgoYU9^z&>d zsIjX*uOK`#Wu!`>L@y!=XpQcW+mBaRjm|XrB@etLdr}Ob57e7EkE;7a*t7=M#XFL6 za;KHHk-rBNTjp-gS^;ehKNv>K>+_jPQ45J%4><1HyKJ?;T9#~k_23?xD}B&@Wp{%H z($hU+nWR?g!9dsJkgVz(J_Yrdns+m~9V_gQ7Sb`&F4wZZ!k}##j$>O{4{?avCbCZfyW zO$)m7LE=P?$CXHDU_RUD+sYwT;nKI7 zSs_XTv!BuxpJ!7(b~uYfsgzt~mj5(vf2r~`LHwpePs!o2A3zEr@#sxo8HEe8>V||d zBiz0@e&6}p*}!6jsm}I0bN9Mc2(c#jg@;Nu6!Kv&4&P8-UcQ-00WJIO%4OuUn;^jU z;I3r=T3KQtiMQ7&x32eVtB`mCe)9ws^7u%2P`B%Xc}=Qc&O^{FmS^{~Rho}^s`B+H z=1_T);9LRK?{$Vx22!5m)Er8aoPOA8&{7fyt`t@~Vw%gtx~+g3qs8LFR%(2Uny28A6dFYnNQgcUa>Sq=%alFh&8#@1o_qgwve* zVFimnUtL{4aHP6s?FB%bu2SP=e*VGqXC8iuZ-JOc{5%Lx0g|VvyWkdh&FD^Gkc!0N zhoolXvp6GC8wj?Y+V;r*EN+<1ac`-+!8Mqb@Nz)=OqV?4gxhR^t7*+^+AfxxVt(n{ z+fkk|-xSGqmkZa@Q%`;;r`-Z|? z0fR6b@l%pTwK*@xY+(MwBUwf^z+F*~piC64BWTrz}-HS1-XF-IA%?Zs_#F8 zcmUuEZ6Of>YIJOe$&{V;3vIBw7|jSGPeS6cvTMdj96Y~pI-z7InGW;(DhFqaiTTO9@KWvQi9__j0btLZ9 zAa~-Po%^sDFfme4@Yiq}r`BgnYK2eTwCjg9_zC4V{{&_GTm-!qHGVR6JXDjw;}GzF z6lXA{xo1+tQM{9vwb1&sRXPdGDHbEMbnwh}t+%tvcw5p4J4r#hEpDl=A{;Mjc%0)T zsG}v<$^HhdcE)5IJ^iBWK{7?Zn)vb%c!5eIj4 zbT}CGO*u)Od@^LuIC@_2{=AP2-O99NglFudj{!T}0e8wtTQcB@F9QW6$J!0Ye`T+U zXDx84b$!hD#4YzSyZLy~!IIZuFa3%eU zG4eg5?}sZ6Yj29P^-PcXG*8%VzLL$0!oL?c(!oQ+G!kORsa+lsf5YER>PX83R4LgF zgPNQJ#Bo#)MXU%J9k?RWD;c>|as5b5p>xAwau=X5XbERX`_ZHB8_XSNDe`s?n(e>) zGF$G%n6o+W{6A-@4hsIK0*J%jpB#Y*G^B48eQD(CDZR5oBl-P=)r7fH^PLf?!aK6V zwkIM35?l*I6p@;^H}JIDNs-fF*IFN?k?kj(M)QKM%%?dSkf1d$Nly2z(>)oq8z}0H zH?Qa{x&36#W@y04!9zx@x7un@ob$&)V8#f~0n1|jF0kFs4aZ{ND1~QjWHToIY5)LY zrgKDCj@dFCx&-w$QMi=CqD*=`$NqC~2k366pPXl#>Y7A=iQD}f`)+B-pS@LIW_M?9 zlBS_)(vGz!L$#P`?<3Hvonw@B1uJ244y)M?0)z0-hq++sJ0GZ+{oiiH;lFi&wy(C! z0Bv9z^M;`4@)USP)7dhg@K5K&U&|7&-@I0Sk>I+ZH75_xEn>qh9qmc%aA@NEKBsVBgUuK zC=b{w-0oU|)~tAVI zyJ3BAB}%rsjz7qZ?x_XCWe6!_u-{e_3u68Asso0IvwKdxq1lN#%4w>J zi>}P;$JZ>58(ZAjsmSJl6BWUTe`0eGEf3f_yS#H6vx;UJWO7CCK!{)4C}`C$j5gNj|k znb$4QRurEE3tPEe!JzG-a0DmvXePO zSD#Q-qOAjTMm|=aBSnvwHoEbgyVIz@J$hT*legak-hhb}e#%cm2$nR2 zV9A{kc)WT$np=5coPQIskbGMO@Fn2NxPv$@SJZdG6}jV;+%(cH+*RFQ(+DjsJlman zy`D(yN?8MCtjWD3w}Q|jQccb$}BDW%M$zZZnri2+5ls)@@(wQD`jt_GpTKL_^CO&SSCcHbfMX#JXYFI^*947 zPh&S-G=l*C@`E5CU1$m7ao(Q&oSmY7)ZZ#5_fEyYzLsFJwJ%GfErFeRN@7lUbUrL| z$6;gQSNsI91LJvT+$Zb0>g<4g8T{B!U05lfKmoSRH^pB^^8sJ3{8PzVq0NeypMF5k zU3qOqksdq{>AUjm3O~dZx^vS6C$ldgCWszl?xd8-sJ;-kPnISB*-f=L*8XggOx$?u zg%B-QovSjBbj}%sShZv~r?`*6PiiQW;nee<-=+y4}S#}q_BgXIJoSOf$YbE7vXt4;Np zrKzZf6Ny0aES8(-cqmnIGMg&ieYWryBZ0VTB=4<*@auP4NdIk&q(Mt(OLPm|Yl za!0OpC9sA#tk>OsaCSx0;!$5r6naw ztzLBo>#LKaxxsO=yWe%yGilL`A|6E#TK! z+1VRQlo*D?(k0-mlRM+`OMT8kVB*-%ZGv}Aj1u^j!wu*~>L<-T+u?6sX!3C}lQte- zk(6_=iwXsQ0JbRvJDwMnk!c99w~s~uD_4vMB=m~-ft-*|z~$*g4g;pgG~Ap1m@@Fx zWS)8IKSN6`^vVQ8hv^Oc+O(Rt7!U%wVsGP+Y6fyS%GG+v+dIdVfCXPzAV~~li+3m5 ztFQmbE)(#2#Oi@k$1#zUS6ijD_yYsa{+BHZAw+^zAEI3bc(h0qm?|pNf?oS}Km#OG zrOfCKn_-CVO;}DXu|5YE#d8I2o>}vUxYlv&>=+I28WY>a1;uI)HUM_IvpF;Ln4ROT zf!=1rpKihNFUo=R@sD-pT!EOm%%ncl43f;aem^;|A#s3`b6vjeAzO!M-gwc`-Kj~{ zBX)tq64*kJl#TrgW4o%hTY3x$P01nD6a6s2#MmwM$vyX5PU|YngU*wXGK*?f?#Eg$~^OWW3I@of-=XVuu-b%A1Z|nqY_2 z;~jD&=QnB#WGU>;RwFq(I< z34K1fCMwf9F}G%k(&?~2EY&)W*-_z0ReS$;7+I1)zz`)M zpAF{5ZHLPMJhYU z;GE*@hM1NM{G{L94dL$!Y-h6A9K9W=I6AYb`Y=v{(tpyLQz^^Aibea(q()R*TU|-m zozpyr!|-BZ_Dn+$*2|vq2Y@ghHo!-`WjVtU-bab(SJp2*2i-}$UP9^qnF_OIFS~-< zYj^VS!)Wu}vn6!LDIt!HJ1SU-@ce>z8f4cT4R9V@O^Xg9)4`VpjsXm*~@%l^Ux;Rf#Zck`BNXu0Y(!C zj%Z}UAmD00nsOS%Uull)dU(fZgJ$bo>3Oa`8h~Wt)EM?v(ndlTS1p0|E9Pg>=&>58 zghD~%R;YpqZAw;F;M(lx5b_wkVbnd+ER+6A-SYj^1XUgNGn0I~ES|f|5emjyPIW)S z0z8i6)BZt&h(qQxih4HbFYa6~jyeKbc_`QEdLD@9SBGButjw|b^l*oQjDk<7Nig08IK zb`ATVGzK%LP+>9aFM0hr8t+m`uNr?h&8o3Rp$T&ql||K}7GgobFhCViaDH~+F#yC- zt>7T3&_PZ*feTKTyd6vlF~JmEA1f+*>CCE4ex}5N^$4o)YuxX&3T$P0(IS!+kan^J z_p>v#1J8bWELml|S02YAQe-&yVew+kipZr~H-I@yc$=8#rZ-8L<_nDx&Qv3dJDwUX z!)@=h1`~R2M{$J8bM^1O&Gy2oxe1T;K?NA{iv_eYuhpLyc3%xu%z`dVc}Z}%cHGHQ<7P!Q|e?dwnSpL!AUf!B^!?#^Q#W!Ry+7ofwPZ1mZq z(Id0{htmX1W?2cAYWZo_lOtT#+Us-nlP$=CGK|Ri4x0Xh>(|iN9y1 z=9y26A4Y}ViRi9Fxzm{>J`YM>GX1D|$4BY9xJrY{oY2~Z&};B{Zq9Pp!pox`8e#0C z-h~@fohA74(#ws!{7kIe4v6XUX<)9bd)g66Bz%^Y4p0~OF+rY;l$v&7T<3~4y!bv> zR$r#LblZcVgy2lq!ff+>yuR4qCcljQa03x|dTcG7`CHcxh#POtGKt6ymNd_0qF7Wf zBj_KC8{jl!zZ>0neDp19n3sD?HC=|WM3!}cK4zCnu6Uoj*hbV1<#F2BD)@A~y%@VXx+u}Hcn=_s-({PxzmMZ^xJ1SV zoZMY*FarYvO_@z8Lr2ep)%HgIL7rhYa~#X&&V8oYSw zA4m{3{hw1Vb~~26K^xro&e7i9eg^SqK0i}kG3z(!_~E?sjJlSWIWXJqKiHAWTG*SpPcCMD`kEc1gx`R^YkYWz zEN4vEIkj@&e4tC!(_~x`-K$w6CU%X7U2Y z)Y}T5stEyoSsB{H{+xfST3tov~6@lO}2gx#N(rHXiOAHT!dp6FiV8V)B4{L_P_% zmX0rPa^-{1xG6|#uEGo+!v)QAOjRe|jg2ICcXU!|Cr+LMbLHlhJ)ErR*P9*z$NLlt zmYjAUbljq004ZyOco?HJovV7M*Wb2nF8vT2D;3kGi%F)6Kr#TVW>}zTHnUQxoGmD0CY9J`|d%8@}n;_co2q zWr98`R_c@PQbMi}x3bWo4XZj{it6qYj+o*XvNoS4>rF;7WNn;vA*|A!3H}Wh-uk@n z*hV0S+XnX;K;BOoz?&*9_{NnM25s4^^QUt|>R!()^Z6#G3OmL{CU^-IG_M7_a~B+& zCrV;ouC1ljbK(K=ygqAE_-}ewnH2&&t0enS7}I4i0wJgNvCf|P$`|DHku`K`HfDa2=n@DCg8MRi_)vpMR2Mxy4PE2Qe! zD||kNXy=0WeU(43v%md9Hg9Zu#CP%d%C67gk_#pfXs8lf>M=betm(}0fdDKq0{26# z_c?J!Cgo-~*=wswLXkR|W8d+rDdV00`22Ouv=_Hod9bmB!=D$I4r@7DZX7e+0tO!9 zR{0d}A6^K#yRx@ykotO4(WUJsmFvN)d-o-wZ(wcDSUS`8jO-JSAMa4y@MK4fDP`(P zzxQ2})ofiauWKj9{Rm$Yw^?g=?`oO(Vf|T^I+-A+o1#F`>tn59d=FtgVJAV=y;G&` z0GMvtEeil5;e$Ln8-41(UeMl2kYLk%vPl?0+Egg_;g)494o5FsvdeZKP;&&fjw7o{ z|B+e%Z|)8Ts?=>@p|hr!nYXgV=ZjI4Cp#$E>+g^6r7Nd3<>-t=G%B5IyZUI{e{49G zqnIXEB=M@5Ndf1J#l5YWcLG=A4ufF8S{z5Kz-uM?Ni{{%mr);=l0=473h#cIc{K3> zZ-VUw_Ng5^HgWQhs5tQU@qv-YBej9`R$a^|lknX<*+sSVXue8M0#EPBJ6_Liwl*8l z_zoD#!l%WIXJZ$jm?|zUu0LdeP&8IW*(|39&QzKGnem$6--u{ZGtHt#Hro*h)?lu zXGKo-4Hv1WP*VLj;uA6UwGSV*6ro%PRbwR{@tXoCOb=OFTB4ru-|Id!rP5Y6LF*-D zy|t0qDSVPo$ffyoj#CIZV?l3VsPRYye$F^xxv~Z78_fwlCWbwW!nYCR2nx0_+@tg3C_UDMVa2Br=X3hfP}^Cp4Yg=#OK}K zKYVY`V9jEKD!UrCbSX6Xym2T-cg}!n;?;o{mM|zWj0P@D|FO-rQ zKt#ApEh#AX%_f%9!G6`I*K=bSnMIhQ%W5&BOMntzVr*eS;WR;FgM)+k`#+Vze*z&V zkU^I-R|!Nwy<~>eeQ~hJqa2|DdpX15kD=6U73Du;T|VarycBP^n#IZeIJ&H3S9#@oec~poZELqX$DAc>XZyuIqd^GK0Jq~0kI=d zA7gMo8%zmkEdnqMh)tkp?V0I;Tm3`>aU3^~dXw zlhdd3=iygnUgYu#GRhxln}4D?Gokczq?T;RjCk0=fUHy18$lt!-q!%sNxee7No^+N$9d?Es*``)0UJ4SC&FNY0pf z_MlbGdUy$|F}YDvJ9GTCkZbsNKj3DL5;=BGBx8xI;n)=A0d0j6MP7Mi6MQdk@Tux2Qy`oI_&*%EQ0bE?|R>P$rDhcFa8O?JIK zPOpFDa?-L*+Q7RrCg#y5z$l0d>n@+OYo3g>-Z*x&`Jj5|=*UOYaJer6;FAbdtt0O? zrFGUE?!XeUG}G8wMgeTs%+r;3uUU;Nq5EuU{h-g&UOBKhdS`;J=m!~xn*ztv_p@dD zR)tR!P=~5kX)FRsx9)uyuu?0dh%Ht7`PTM@e#Cq!z2ts;O;L)tQ1ipDiWqbGz@o_p z^D=UKR#`S7HAt4vQtD(_SeWyj_av~#tJKlb9>-s5Ykuzx_E1ZNl4)~f=zG$*;-y=T z2ozmFva9az<{2&63fQ?(Q8{IPx@t1LuFcxP-LXVctWh3AwazVTt2)w^*Zn-#eB`bD zSHoAusjOBK5(>uQPGj=ijdOH3jqG?(<5#C{*JQ?Lt~@zow=Ii4Al$Vr!#+Cf-gx)A z`_h(>b@7?*6bYM8%628gGW^rwWoG$mK_eCk`}B&llStfwHf12*{5spmTeNH$4{gCY z@Yuwr*k@%m;T<60bw9z6^WpWi@Bu^qe-g;YAzI+VjgsuZaGA=^G*I{KLy@rIjSpWb zFQNsCp2T;S$VaJtZ<(waRu8y7^X;>YhsWp zM)mKgCeE@K;J4vQSV z&-(Gl5AJCp>K*2-`U|4i;u3p8xo6(isu-38>cY zml1Eo&FBBKJpour?}q&nggpFiGM%m+YX`ng8P+uRnJiMyWcv*_AZ8KAB$w;rfmN8C z<-2EB6TqZO>A~P{*<);wYqZgxQS8E*syOXvGkGxF@s(scud0uv?T)fQ z(DGrwM7lvpitUG~6!*}kZUpBn9PuP`5^nMK@($xI^0Q~axP5qU>L~uF{R_<9&m z({}$$WuD1y-QzMVb3jLPk`~bDJNkw(Dv-6cKUb4uzD= z-w?i0NZ2K}AbT}Zi^uOZ32xmSxJw+6(3j%a!~Tdy-@RxVx6YUw2|V6JX+mSJNclfl zF~SD#eo+lnB=ZpHLl{)E+`sI^-V1Vn!6#Ml_W4aH*Pe(++sNI`M=5L3?X1z0;CJeE zJiX5Mp6JH*=R9W0t(1@>>1y=lP^F=yJil6JxU~I}EpTsBx?rJ5LbCbQ zuLBmmX1MO&!E}khx=+#hCesIB53`IWwqyFtR{AUv7vJ{Q^dn1S0@*^UOmRwctFy&> zd={(J@avBzmu$MbyamRMt_$kfHY<*v)%%&nY4hUDH=$k)$8LHlUG0G3Kv#T~-vQjw z)hXbsNIg?~b-jRw)ir5Q(gfwM+Zk+0haf z+4ER%>T8RnKAoJ-(s&tu&-iZ@A?^J|d z6md=9C4am*v2r=aa&a?~37bc($n#wQ<8UGXL+!RtrRXGSj-2INJ#+3J=}e6nOC}G8 zN~lvCS@rxoq7w$CLg-wx!%V%ymw>~xhUw4cADX*$A}D~{21F$!Y61aHwpdL!QcrsN zl~$s5kk%7HWHkZ43%mOcwlk3RcbKGQ*}K(Fxput)rpE0zH0vY(EyY=blQZ`odG#hD z)~{&r6XkSE(^csqsaMm>2c%xsT2&g_Nab1bTY%fIoNHatDY@C@Ei~v@19|F?szU6SWRS)uDXqNY!48RlAb;S*ijqus; zp;bteR835>3BXML2CewOM<^q3M*ubU`}gnI-oS&(vf=GF|JJB-inGOH_dc1xb|iqR zWgrcNy?1*8)vAlAaiBE%K3Q>5Ygy-#Wf$>FqL|Kvgb&6H?iQC*Z|PN)xZJhH#d#=a z@s9O0oea6Lg}submzNZ{iZ*_okZ$6G*h5YO!dE=7c4=YA9g$y%1xjkVl#|1DShEjM zH3(sS?uRfB3mhW5Wrm} zrY>KpBxM&CC;s5Ie_{o}upN{vdb8x<_$5iiQN49`z`+Zz`&E`yLAim;X&}$HAfKmT zkO2Dgdno95mWMH~h2c4);H=MigT8hyzl|4g;dU7F;p^X>w!fa0zf{^rf?>~ z0w{=F_R}ru{g5i@&xwC%R-!-1x|(k6pSb5_)$f`zyErIvSCs{z`iVvU4x_znFKti!!av6BkRX_=+kEc;*`_rla zB`g4ruCJGT3XVTTrlh3Yj>1>PNIy?sV%Yo*=qaBIOY87_?P04yx6TV?_{~K? zOHEo3|2EA2JAMPYZM!H<{|!s-$r>l5{19icxV`Wf-{<0I>{v&H4FZaCy$B6Ludz{v zRH!!HV#JGP?5(L!Zp#}NlOODgWqjO+yo~+LasPYxH+ht2KjdfCFQr(oovP3?vkFK^5FvPJ4^LD=DpYQi4tUXuY1;erJaBQ79 zHcp(>mKvoD+)bq5SX9siR>(%CL??*D>Snn%p}NfGO4(RY^puLI+j$Pw)NZLb5bKo{s|0L~ z-A3R~;QHMg0bHSgESOM&N&@oF4|8gkPF-nVM=sQ;d}wcS{{!iW-)yQ``D6t#xlh(O zRF0Z@O>0uMz9g)u{P))ptV5lH2(gC8I5i(FDRG5Gp1bgBydKgxJy5gBfK(#D7NzZU zatG}S^z#KL*Do5=K*F7hk(`mbdgI1XoM!8*-};#UzNtEG@Nki#`7)GfV;VlfW^)=` zBaAjK5>gx@wf_D!B!2C6xBK^K4%x|+#?P@5N7tlfWo6xWJD~Wz^cnPfFF($Ixt4!j z9%x^1$on56XZB0Irm^kw-*rd1YVO;(*LbB21@7OPJspo%WO676#~oUMws(zP#+shG+$ns0IC3W z_{kYU>N5<_6=j>*0d}r-?8U+--eXfy2M+opoYL|=I932TMp=&k#tzJ^72OtRJ8BVOvTYPh;@EE=LJLeOk`y?d|Dd9%fWlhON^LnB^6x0LyZqz@imyogJ`$C@Lr9Z4o)ZQz>NCavG$$@e2#r3 z4I=}I5KgV>wl)~_Ja7gLQGju0c1{h%cV&6c`doWWv$>q*=ZLc8J{hBiKXNK?zx2Nr zz!pph;BLU2OaZTv>Pzj(VpSp2&OWNCF<~>NgL!nezhxEgj;&2 zl>z@V#>sykFCnFL?|(j)J3SFr|FFa`n@KbhC2pZB7 z#3>qIn&~mG_Vki=p8_x&CFeD4V7MvgJlk^G7H;(apFxr+7Gc0+1KfI6$@aeF+d7DJ~_-A|H=0?Da#&^Cqb=!=fVz>giW5nw=jWQBS%L^t1EZ@ zCm9;qlG{($@0W3T&l17ownc5pWhfM8Mwn-fLtb7H|IYl)8@QikEc_Le+s60x?&B*m z5kObB5{BD}gGr7l84~vP{N)C~3V;xhBWd%=^j0&KBw3T3-HU`;hqWA3OWW~<8nl-M zfYn-BI0_?g`3$_;&Exw<(G{QM|8)Kq28x9NF-F$>r@_BO)t^T*i-U1bX01<)zC_uE zR@8qEQQ#cm$YbXIUPVO?z7KI$pw@r=-V{V@>dC9Hn==1QBVy_b;#*jR+&f*$AwCl?o&G?2Uk4=*Ej zFK^Yvw*HTO9n!XRBWe++o3)4O!OC9PC=_l_<$M(W8(Akk`zv5?nJifb^rH3N?Hhio zo$=nNmSEz_QFHj|XF!vQEcdqPyZz_4|M_GBH)k)KA9XGRlTJD;3*y1c#?ZWkeaQM* z^`Bf04#Z)ARgrE4rMmlk8E5F=NpaW8xKNd3)-orW$m+kh(W12jQbQ7oi z)=#qbmhkplt}u`FC0sV9sdnb5$E!zX_xlA{4wW&j0*DCm`=1;Sh_sB1xiH@C89Z93;8d)EUk=lPNIZ`o3H`Vd+Ig`=CV}#?PAXvzWk{x96fn z0(rYh<>?PJ>Hd8v@c8=*vm+)>P1k@i2>yMaKw2nihLV6Z;wcdc*E2{8=xNh(FkEe3 zq_pc;ISw&}`?lqKx<4vIa67!xu|P}G$c3MDyg?u^InS?uM6Zzys0QM9ChW>g-ypzA zkOUSfvhTTWq{_>TJ{+kpgwX{@>P5ptiJ1NTO5)8 z8BiLUY_!*AJ$V386^TicK@z0qOPWP#Ea5?}!$_&fQ zOcRKuR^tLX*&CM(ahYftiNg!a=uU|He)2nU2(~iX@Yo|foZp906;o=d%aK09YEW7_ z-yX*;XE#z@?zZ&fQ?2fYX!T8@-$(K5Jo+AkyOM+(944x4B%2NR&avFFJY^9_br5UtzSX5@gmYYm@ z@S$jtqFn18bXQr0IYhQ=+2~ZDB_DRW3d=*B+3q`-*1P$i!GVIG(AMp=vBQ#^_mNxp z(;4Iz#_~&9jZ}}7oW?R;_x8&h?b0N326NJq4~>W^TeI^!o4=G5G{|9ff|`NN5+?ns zL@IWva(*@PXPmVGQ#rgIOY*nnoqNDDy$hd2uMT>wBgzg>YT&BV2U{k1ah1(1j_v0` z@o;6~SUGW=!+j!oa9ko_2^G75?VolPmWk=Pb-h{k=phZga( z88Rp7QzbHkpYG!aug9e^DF63Bi|1#CeAW^CpakO9DTT!p$yhuT8Aq10^cl2O@Zl-2RXr`+zCPj#_FqXs}W2{Qvn2Y{BmNsG45? zB{BF_rVgT$u0 zE8o6|@C>uOK1Ba}!V zx!M$9J1B7#_JSs90cKlucib?T&HqQpLE9YV1?v{gh2NWKEt9FX8;3DePnCL5Z=k)Flp=?-i$<5H4zc z`?2ZZ+p~Y8FYr;m3Vn2(u5Z`Av6#S}zkpQpZ|vNP0DY^I-oa$HXzg+ajQC7%wldRN zfOAL!UwFtuphqqR41v|3He4cQF5;UU9M~lti-k<HSTs^#>-Tf|C2&~#m%6WZAy1jz!Q_-IbpZP z8ht8}UG13lz+N-7+01+RlE)6OT^3px7fn@1|_b7^{bhPet}< z_)77(<^>8-qQ2X(n4faVhm@T0@Z{5HFSWs~EDXtV@7IAMbVUP6;v8^%l3PZ#wOZ-* z*Vk4lRj6OYpAZ_$*`t|tYKmLar&&{5{d+5cst)rQTn`n8>Xi+0zXc6YbTPMgzewFg z23F=+`8=FXXF6b*CDVN$v3|6iy;TSFSYh$qrbhKDcT^U9l zj}3g#zty{k*>s8S+>t|cng#3@Rz`z}njy{*?90mV6_Mkvv=iL9pb0ttHf$7;TxkX1 z-klTGb`2~-Mxx6~+{b-KiFd3XG`p?+6-0PMorB#Q@TY_CH5)En#5WrmHqj;@Fvi1A zeGpO@wuYIPOgRY&02e-U+j7!$LZ#5mS72R3MJS^gfheL5`kQV_n{8}KXaj)V%4b~As zFrQ7yZal}~{ELX@8c#V?2LlM@)g(|;VvcBjEuTJ=`WkOem{DL!+7Lr!U;F!mGm_^~ z+V^T?%bz+8noq9{ybcq16Gzd^fS2`skac)@6|;8X8l6Q19epZ@l^3@1ES!x2XLNA4 z_FI8#x5sq7hXVr83D;_5$sU!*Ye}zyx1wMC?Q{DSgrUx#fM?_Fj@{syA2x2yL^J{S zPPLkQ#O+9E9a^H*USdriL6rGHDt$B!vu~t7^)@_e=(<|SVd!MenX48AP(Z$4WoC9_ zeN;I;hEAr{ZvB^gK*1AWfI~5H0a{Y#2UBjn9`7;3JDrI5leeufemoZol*pDlVTSHP z3#8@6kxsJwUFg9(;)>Xm!{nsFC<7}Xwv_?o=eP)$>vvvj>yw z=YS7{pIOg(u@mJ%G0G^TM@L6>l)?_{_e`(yLxmX%h*D zMJS13@e!}HFR{?GNtq;%=4#zUgfFP^$g|Ax1<`vC&qIPbwGNo}3>ZM?=Evk6r|J&S zi$UD-za)A$kcqu)8)1mG z{FI*zS4{wM6S3;RP-!$0&8!6*;>|%T%HJxZt}cmap#~4vD0Pkx22gBbPo~=2iEMFa zSN<~qRz>jf54?e)>3%j;Gc6C1_YO0C|CDQDt7+bE({$0($tizZ)xn2L?@6_ zR3$`yiwH?E%X*^k*^oQ=z!1GA|E&fXHPR=rIEGq4%0=SGvror2Y%k#d`aPmx5@~7a zdkmPa1d-<`6M%& zp9rn|?C(5SRowEcasXoE$)s`=GvJk9wPt|2VX31T2F}6x3#(&IMqZND*a1muBh9?X zX_HSLo?$y$a;qFx^U1W|YAd%)Gaf|AEHqZ*{PW96FF*&nO-@c?c6t5=K_z@2f$8<^ zY}d|9NRviy7sF$61>@bV$B3*VeDg4DX3qScxVTL~5Go^T?}aG+th- z2`EduJx~ZcSssR;yX%oW&ze|$TF?;>HGHp~Eq?$w&SAD?d#s$$|4F@l*T7}X$7>}7 zRvPwxrPaLO5X-qYiQ7{P^4Ui2GDbq&DJ3Yu`)8zfMi1{>HEq`+uR1bJ4x!#n0D6_M8Zs_# z3mc%u30aK|avL-!XI&?{^%v4OXUr4OzaL*|-HV&M5GPx)SUqYMWw@Ex;%DHx^&FOD zncjYHD@AiYbGx1O(rsKW>Eg}cid)6bqA}!r!G{?x#)c?^k+q_uv%Xh3ha^A^{%wnpRPY({1LqK{NQy>!UjUc8f7x2` zgyLiGpsKlFO75ee2#drn3Glyna)PvUP}e(t6P z(8^W6g23+fzT5gZQQ^L-Yg#^P;QK8FTZAe)*|CKS6(I>8a2aoN+XEkYf2jAF!Zi3! zjS($tF@bu(ypeC>`IZtF;jz`F6A-Y7ZUQBuZxp&q4zHb9cc*!1`T3p9xL9`nWhNVr z!2lf=fCA>;1E&E|yfmrHqB#XnUCu28b*4#eZ{lLL(42#`ui?BO&uZj|d_Fh!Bw8g$ zn@2uezsJz@^XM(T{!CEw+EyG*eaF`FuTN%C zOZg)khBpDobCl(3ud$bhr>EdmuQ^l^Cic|y2m>LM+gsZGYKUAeJE5YUX9}j^JDoojv<}Cm&t+agmp?JE0%d#fo}m_cYogpjn5&egilTvDFz-Df}1i zB4)bXfn$dqb!cCa13DdCgMNehaa&${n5Mw&bxeKfNmHq%e{T_H@WB!H3QgFK2gNpB zP<;xkez-y-Lr(0^P^G!YH~WLut`0=mPXbVN64iv6Nd`s=eUQ;?V((+QU0&B4SF3*{Pm$AVrq;v&)c>VLy_UCe45VEsI@ZWM2TaB# zRU6XaLx0^H=0)Z!$rIu`3*s{Z!W7pU@6aHvX*vUuzME+!B5H}k_gFD)3=f;nI zi1|B!@iO%p;L{!JSEI~vyUByf_{HY=;RuAK##-h!06XFwxYi?xl}oWStJ*P{OcVe~ z_v(y8!+BaLQB`(D(XrL0ReKMn$R)8mU2@$q$Pq; zbZq-$IkP4V(`m}e<)cwnZLrjiA-X0@VY~Gi5-PKX20#Eag!JOw1br%7Rr}`(v@d!u zCo@&wE1SwM=zt~$K!eJ**9GAv!}Cogn9(d0X~BwPkU4gaWh?WVRcE3N?C%_R_D)Vw z(YmJTJ_0~fhItqHPqoIFGQYE2!~?aSRa{vjcDWhy5>oT zGOMFTWfL`aLx-!QL(9r?~D6y9Uhq=af8z!rqg#p zXk%gE-;=@G>MUv7p@P#ni@zP*$YQwA0Dlc21`%pV;p!_F@xI(^eA5&SZ{rU?^Wj}! z6Y%C^eMYilc_~MAwqV`h=I0;WA)MqJ^$IvyJ-O0)*RuLYjTL1TWd|(NbhIZ;nOop( z`4bc=fsxaeI@zc!vvYFFetFRKSMjef2_#oIzzPIxZ4oB0sxKOzX4Wltz#G@LD2Qr5 zm9o~xF;EU*_!O`}IigC{sU%1^$$B@>Fa_H0*>*1Amc^7tnKxcPpr8zZTme`6(0@J| zXfBE;0)lcuv%tqq05V8P2B^)Nhq~qdR|1KCfe>(GeuFaNc)T~zvma>o)FZv;sVD@D zynx%jpd8m<{zI zz44BQcmN85TNhy2plu`Nt$b;sKELSBpW)my@*ZnL{lFaD|7-8c-;zw*wh@(1yH+~o zQd6mwOU~P(B4CS|mX=v+F44&NRvMbQpcpDmU!|BhndzGgrsa}~;RGs*v>~aLX|A9$ zxrCyC3y6ZiciVh3@BH@t1LJY%FM8{e94DY4JQ} zYS0fcOC|N!{@iq*a@H$Qe9ONriBWJrhLhC?o5K2)!=~i)0hGh-mMd~RkqdIGCB(fU zy5*IvHssJ&gxudt>g(3w2{)axskJ_#h96qTc~<{c!`n^f zg+SOfdm8=UI!4%}d%RkXd}yWU1H66h)eDTsQr!qkcZE^zbI#F$k(dn7l7z}@YSv1+ zIcEYw{HJjfg()x7R@zQ&o;LdJ2vi6Fkl?OHM-Ga!%w}co(6=I5LZ>n{9pr~6!z|S$ zq_VfE7##n|{H(t$wPI-D`~L#((@V(MZ>p6Eb8k%4{lIGT;hZ9cg%~HhcbDCd%0RbM zs?uZG1wSL{Z0f+NzDiO?w9~XT^dWptKJ@M~0(@5*az*ZgabU465JN9eFY7vD8Wdz_ zlAIonnlivB;uDXov3sIgoKx2>G6a;@?v0qg;r`RnZ{4wMw2%}(e*c8k`R7sNT@>H} zfUU~mHR~8!4rJTHVlT=v3wz2kx&95Nz?@Tj8)s5E}t{|AFA=d_Y zOTqb{ATx>U``k~NJ2hYk3r#Gn1}|1Xj}jq!9%;{k(?9!WZt1z#{OATvapC-}#$LWi zi2R>~v0v6A<|?Eg)Ye#VyRyr7RJ$N4vFEFfmb1jHF(yZN^rc!ULDen>KWu(D9Z5!P ze(qg(G2HmSqyi2B&W`vo@N=3l?+dXbWn-`1LrY1^_mSilpKLLxQp}@s?=Tqw6Do5Pui*IhPZtaT|GAE&MF$;(4s9Bt5f+vbITElRv3( ze&@3GgY%ltiz;PZXq||TeA+sP9bc(#*G<2ck&zF3W?0$Bxit`EwvZb7jke;810>h3 zb}}!oS_xUbJ^$_PWrSlJ-;v4qq!@|L9uM#ALcMu|+|fni+AqPpu+CtjBrs#Y1jKVU zEc6L$d!2l-MgMi5&7?{Dfxj)qn;mIZudn7I6V$88%05A!PtCQTGSxXKMGh;qXa|fE zJBUmhM!}@e#A?s%bajm+=Ka1WxHZWaj;k#XT{T#;bH9c5zA8txVHEz(EeE*PP9eD9 z<2|evdxmVLj_n@`lp>6@ zy_ZTczm54_lGjPwPaq$dF1HdIks&Mp;%bge$QZnnp${}#&Z3)z95ei@b9;c=kJpY- z$G#RZbgyTi3&d4=3%+gXOSp|g^~^%K1id>re4gTka;7m@WA}bFo`GUbT8-n19VVdO}IkuW(H_iil_S}@$xy(Q*fCcNaD60 zxqsWK5lESLWnKgy^ci@da#k9^aW5)oLzbFxlUVBA&UM~79PF7=rW@Ot`>9(Gju3N{A4%EK0dPuz{=J_LUv|Pe^*x3eq_ExMNjB3?{$+xH^_Y z;e5pH)*~Lo@y=;b=P$Iqp9KR|j(>D-kaI4WeI&&HPFRtbZBMiQ^PwE`pF$Z7#(@UF zP2~&InXDTNx3`4)H2mD8yHl{Jk(|C(VA2vwY}3IRqo*qy9HvN7a!$$hlZqjmb6tZy zp1fLd^be5LmcI`_d3@@A`jLDS!b0qXVvP%y>+DfL86Ie=*TZ)PL??Lk^F};4=dwv; zPRBV>*)f&NE0vtjYHw@vs9l(Dk*g-}ARSciwv!f)E361d_9y<;9b7)PBw$3dh`AZi zAY4)BVh3t>;gR=s)nZW3PT_3bOLDK)eTZT^*m%P!HdC!FvK=Z=_iA>Bg!`SsC|P3u zz+oMr^PUcTebccFK>bqp475+?5RUC{Y7klp^p=Q;ZM+c8Zq6wBtH*5c=QHlp7wZS%6AszeebN>>_2^H7uuK@g%1{vF}DT>U{h`}c+u5ubXcFMH)fZ6-l z!y=qVN>jqgj)3T!mALcM;1!8}PDcMCU6<9?l#euNff${zE=b0d%;TcPFfw`y>zjLg#_WgnwatH|t}Y&WrR32m5W_AWNa`OqIc{ zW{_mX(Ck1psRCgMhJ*hXhcAG1ocb_kuY)%9rlYzq8h$K;X}=5m+8CYpJ4Yw6zLi%S zpu}dkAc_hVv>NfWy9eLsQ-6OzoBl{WAkRi|U;anmJ5dFwz(C9~-A(!Vfw z(E!S5ua;@}(q5GrIc6|PAOSPg{il$s$UBI}tk5xuP-VedGyZd}xqXvWvU_`{;Cf0> z5fN79T(#iq-q$RLb(of0ZA0lfepj^!a2-6 zv{v^7r2J*xmj&XVgZ>Wd=RqwGGe1`-Svll~bz(-y7*N1ooU5J*aY@&5ea5ss6n(a? z`N9l?w~=^1g2wLDVRD5ovqLc^Z#YRDFR+QYV4emH*fzOpzer3>Pudh??f``be>dD3 z)xB}1O6bZpnt=j(m92Fxq0dz89n>B05xx10QDL-YDz&e>h_u@9+RG)Pv4{2IYNiMy z8auH}j+fW*;q%Ymtbq+KI_r4gxGUeYJ>hq~vbe!N3%NntH+Dyh7I70!cu(qE_`Vp; z07NvH4Q2s#9;mKj;>umoviK|H+#CbgGq`D+QxI*$r6&D`yf%-M^{H;6gi4*j3?c9c z8$}NK?0I4%b?c`p2;SvL3*xY`0fe_KIZqPm`M%{DCrPUt{bS|zlhbHBNlUe7zcK}E z$L2zIl+z#Z!thJW!}{G&JAC@Pg`H(}GLM_m;uV}C9Yt(vF+F0Dy7{`k zY&v=ZZf?8^qSD>~2iP#{qQK632aMplZye6Q3X>dctS@JHSz2)zJaqXvFEZlr>9$oY z^&9^4pN`1EJcEw_wi@P{zJqQX470?WZTB*5Y7F!3#xJO^z|Gw@)bFoY5#daTP5OgI zcbKI$Ok(|9g_%#If*$3ga=U0_n%|#}eWwyeW~(19Te+!xF*(rd=LU(nM15;<7Z&oA zrqIw#r7}&_qgCdvS7+!|3?8w7JNRtHQ$~8Yyw(xC+n=- z7SQBo3+)tbg2NJn^=lukNOCkiEsgt~4tCrZ{aSnrHRMk@_?1^whFrEn3mT1NSC9B&c-(JrWu@FUhSNf+(>-_%kX#@LYnzq`^M#XX}(*!_LZCY za24(5Y$WH^=;GY^#0c{Y4{_!GPvm_bd#&6ypUpfwu%|+=UEe^Q+oe$7cXnyF@O67L3%SKO#rdayD^4^vH2hG{w%vp|_*jKf4 z=jb?40UP4S+Mi~(Uz(^cvgVB+r+Rt|;wnFRYcz(i=&Q14Ok=V-tTPw4%v&;ZrxI#w z6&rvLjj#yzBr5~N*7o09CkIE=>EWwo`ceL*@Y=504RB*xY#SY{)p3Gvn9zBL_FCN0 zl^axu8p~su8HpiDNi{%5ojAv1{0?t7*mflF9&Y_x4#)X(jyLl~c+s6*I1G7{zBI;tH*_ z94)o##4$cU4ohj~e#C^E><)3E`d;ftdwTQZpDmp)9)n5^+h%BE?)8LI2A`L!zjTBL zPYE&+#0&jDFc&4Tg}VC}E@4ZGyWbiK2dvn6Mpu!cQT_^6!RG!7)fE>V>?PNFm?vc5 z>A8gcW=5Xm2#LEW_;XgMQ$=Y-#lc|zs2}}2ny_4Kb%D@Vrtu6rOmUe!ph7;;L`XHi zXcDHc;OYbIk44?|A9-=Ml{Xap)^{jb5$Kl?v`CIT`bDXV*x{h+UARtzOd}#US>a%X zOdU`5^_P@lkQxB*B<&RQB?FgJOH2-~rMnXf_{5%~s&OlUM^i30FeOM{`XOXs)3_BU zEAyNr%bz8RJ=Cvw8y=)3p z`K|i!j$l~LqQ)kabHK}7WeyB$x*({t#cQWf98qh&X{R*Y--9)~g)?XCL>&z;v9#hY zTFY?DV&1fPE&*z}6Ki`Y5#(-eVYB;OzZjPSDnN%ArA8D>wODpQT4Jt}ah556JE+G_! z_P0uQ!qDhR94VdpAqajIOl4~>oTaQ8H5yXaTZUOb%cRAkWYV?KSNlTqgSM=Wgf)JP zz=?Q5f5zPEVO!NbOCbqEwP^Ff_O_`gdm67#U{Mp^_bKcq2IoO%zcJb(M5z`cjv1Ck z+!awNRhwjj6CQqu+xC#{UWo^3+h?6ymzq3r?3JV}<|u_9x=MWAm`1AqAnOsJ*@)^4 zr|`FkZlg{Cd!#Chmhn=_ZQe;~-DTUOv>)Tbmh0{z_42vWa|vNUO% z_5KA1xNHBgw0zjUH|s5xg$b4k z@Koa#-AFizrr6h2#$k*41tm7_jp$yL4X*DZcklq!u+>9E0WnhcOFPn7Vh^ao@~tno z@RwY)*+8&|Hpdq)`a=L*Teuw;_B@u;o!a!YaOO@bs-?*gqpm?nRkXl~mKFfF z+OVzE%RlC`M5-+KM_GXZ@9b;=2C(sq+R&Ko_RzZ%5P~kDieK3yzV4BN*{$E%KY;4k z)s?*vacHYN~u+?SoI`e@S2!9Co!cdvz;@N@{yj`0-9^8osR(V7PR-O&gM)x3owqs5oJpIwc zgY`#VzjI$V>YYDrIr8D;0JK<10@ycefw z;;oV(!gUR*xBg%xTl-#d>u(5}#jFrLKo}q0b{IuuZhuO7n++ zo@9)d#`(AT$mbW5g;c;&z>1_2Nk%;L?TIhfeK%PYp>5N<5wdihxw4-qvVsN6t@bol zDFgi~t`B&ZU3ek!#fXVE5Ao$7AwI+@amT_m2SclwQE{cLcv3kwhokq+!S%>Fe_*(Z z75)vhq@YqZqa~Hf$0S?T@nr_%mV%*aT${~4)6|(P@Bq_Q!VC4tZa`7?ra`4?oV+wSr2`TVSUmKS_>V@3%0*S#!+L=3f@oF=4k9U9xv0p1;Fx&}V;X2J~h zcz^}G3|;s8JyEFR*LB*fPUm+?f+ofnBQ5uK%NrwA+RV_~h<6-mw_wU?NGRI!zNTh% z&>ty6x8&gW75gdW)?p->&%?{*brS|k@b|(>&<^nyO55Pi_q*eK)=J*Uunw2cw--p%E!VXuDa? ztZ$HPKJ6$Sh7!UrpxVBLFSnpZOw$(ftvg!Nk1LVfL+FL(u zh1Abu(oCSmgqQ2IrE;Zz2f2DAD%T4XO6tU&)2IB}vV3{^xpz1MYFEPy_09RP2QvmA zIqw<(UaCnCs!mFX$+3sjnV*(O5)y`jW!*wzF-l^K`Bxgap+0Ej z@c^nf{Ic`6I5#9bcE7fwiiP8JZ9dr3FsD~SBiW_`8{UgFt*{$@qj#E)90JYra>Zs3 z$sCTuzOye2GdTO;4@;wgJK@!ij-|c--insluCR}{#q=D6Xz#nL6;`rkc*UzLTR%Y{ zN2YK;Zcz4YY=+|(0_?E=#~3U@I1fIyRiBF zIeWj=id+b|L;kSMs>NMfeB^(={IdrC;NYJy_$L+olL`OdOqgH0OpSa?FTRhwb<|%A Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/remix/demo/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/remix/demo/macos/Runner/Configs/AppInfo.xcconfig b/packages/remix/demo/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000..0899fc39f --- /dev/null +++ b/packages/remix/demo/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = demo + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.demo + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/packages/remix/demo/macos/Runner/Configs/Debug.xcconfig b/packages/remix/demo/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000..36b0fd946 --- /dev/null +++ b/packages/remix/demo/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/remix/demo/macos/Runner/Configs/Release.xcconfig b/packages/remix/demo/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000..dff4f4956 --- /dev/null +++ b/packages/remix/demo/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/remix/demo/macos/Runner/Configs/Warnings.xcconfig b/packages/remix/demo/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000..42bcbf478 --- /dev/null +++ b/packages/remix/demo/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/packages/remix/demo/macos/Runner/DebugProfile.entitlements b/packages/remix/demo/macos/Runner/DebugProfile.entitlements new file mode 100644 index 000000000..dddb8a30c --- /dev/null +++ b/packages/remix/demo/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/packages/remix/demo/macos/Runner/Info.plist b/packages/remix/demo/macos/Runner/Info.plist new file mode 100644 index 000000000..4789daa6a --- /dev/null +++ b/packages/remix/demo/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/packages/remix/demo/macos/Runner/MainFlutterWindow.swift b/packages/remix/demo/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000..3cc05eb23 --- /dev/null +++ b/packages/remix/demo/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/packages/remix/demo/macos/Runner/Release.entitlements b/packages/remix/demo/macos/Runner/Release.entitlements new file mode 100644 index 000000000..852fa1a47 --- /dev/null +++ b/packages/remix/demo/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/packages/remix/demo/macos/RunnerTests/RunnerTests.swift b/packages/remix/demo/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 000000000..5418c9f53 --- /dev/null +++ b/packages/remix/demo/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import FlutterMacOS +import Cocoa +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/remix/demo/pubspec.yaml b/packages/remix/demo/pubspec.yaml index ca17c614f..8a6295e3f 100644 --- a/packages/remix/demo/pubspec.yaml +++ b/packages/remix/demo/pubspec.yaml @@ -14,18 +14,18 @@ dependencies: cupertino_icons: ^1.0.2 widgetbook_annotation: ^3.1.0 - widgetbook: ^3.7.1 + widgetbook: ^3.8.0 remix: path: ../ - mix: ^1.1.0 + mix: ^1.1.2 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 - widgetbook_generator: ^3.7.0 + widgetbook_generator: ^3.8.0 build_runner: ^2.4.8 flutter: diff --git a/packages/remix/demo/test/widget_test.dart b/packages/remix/demo/test/widget_test.dart new file mode 100644 index 000000000..e37f352c5 --- /dev/null +++ b/packages/remix/demo/test/widget_test.dart @@ -0,0 +1,29 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:demo/main.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const HotReload()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/packages/remix/demo/web/index.html b/packages/remix/demo/web/index.html index 028ccffe7..1a98da7dd 100644 --- a/packages/remix/demo/web/index.html +++ b/packages/remix/demo/web/index.html @@ -34,7 +34,7 @@ diff --git a/packages/remix/demo/windows/.gitignore b/packages/remix/demo/windows/.gitignore new file mode 100644 index 000000000..d492d0d98 --- /dev/null +++ b/packages/remix/demo/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/packages/remix/demo/windows/CMakeLists.txt b/packages/remix/demo/windows/CMakeLists.txt new file mode 100644 index 000000000..15d0aae2b --- /dev/null +++ b/packages/remix/demo/windows/CMakeLists.txt @@ -0,0 +1,102 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(demo LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "demo") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/packages/remix/demo/windows/flutter/CMakeLists.txt b/packages/remix/demo/windows/flutter/CMakeLists.txt new file mode 100644 index 000000000..930d2071a --- /dev/null +++ b/packages/remix/demo/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/packages/remix/demo/windows/flutter/generated_plugin_registrant.cc b/packages/remix/demo/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..8b6d4680a --- /dev/null +++ b/packages/remix/demo/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/packages/remix/demo/windows/flutter/generated_plugin_registrant.h b/packages/remix/demo/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..dc139d85a --- /dev/null +++ b/packages/remix/demo/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/remix/demo/windows/flutter/generated_plugins.cmake b/packages/remix/demo/windows/flutter/generated_plugins.cmake new file mode 100644 index 000000000..b93c4c30c --- /dev/null +++ b/packages/remix/demo/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/packages/remix/demo/windows/runner/CMakeLists.txt b/packages/remix/demo/windows/runner/CMakeLists.txt new file mode 100644 index 000000000..394917c05 --- /dev/null +++ b/packages/remix/demo/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/packages/remix/demo/windows/runner/Runner.rc b/packages/remix/demo/windows/runner/Runner.rc new file mode 100644 index 000000000..c15129e40 --- /dev/null +++ b/packages/remix/demo/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "demo" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "demo" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "demo.exe" "\0" + VALUE "ProductName", "demo" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/packages/remix/demo/windows/runner/flutter_window.cpp b/packages/remix/demo/windows/runner/flutter_window.cpp new file mode 100644 index 000000000..b25e363ef --- /dev/null +++ b/packages/remix/demo/windows/runner/flutter_window.cpp @@ -0,0 +1,66 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/packages/remix/demo/windows/runner/flutter_window.h b/packages/remix/demo/windows/runner/flutter_window.h new file mode 100644 index 000000000..6da0652f0 --- /dev/null +++ b/packages/remix/demo/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/packages/remix/demo/windows/runner/main.cpp b/packages/remix/demo/windows/runner/main.cpp new file mode 100644 index 000000000..fec4dbaa0 --- /dev/null +++ b/packages/remix/demo/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"demo", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/packages/remix/demo/windows/runner/resource.h b/packages/remix/demo/windows/runner/resource.h new file mode 100644 index 000000000..66a65d1e4 --- /dev/null +++ b/packages/remix/demo/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/packages/remix/demo/windows/runner/resources/app_icon.ico b/packages/remix/demo/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/packages/remix/demo/windows/runner/runner.exe.manifest b/packages/remix/demo/windows/runner/runner.exe.manifest new file mode 100644 index 000000000..a42ea7687 --- /dev/null +++ b/packages/remix/demo/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/packages/remix/demo/windows/runner/utils.cpp b/packages/remix/demo/windows/runner/utils.cpp new file mode 100644 index 000000000..b2b08734d --- /dev/null +++ b/packages/remix/demo/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/packages/remix/demo/windows/runner/utils.h b/packages/remix/demo/windows/runner/utils.h new file mode 100644 index 000000000..3879d5475 --- /dev/null +++ b/packages/remix/demo/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/packages/remix/demo/windows/runner/win32_window.cpp b/packages/remix/demo/windows/runner/win32_window.cpp new file mode 100644 index 000000000..60608d0fe --- /dev/null +++ b/packages/remix/demo/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/packages/remix/demo/windows/runner/win32_window.h b/packages/remix/demo/windows/runner/win32_window.h new file mode 100644 index 000000000..e901dde68 --- /dev/null +++ b/packages/remix/demo/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/packages/remix/lib/components/alert/alert.dart b/packages/remix/lib/components/alert/alert.dart deleted file mode 100644 index effc9a1d8..000000000 --- a/packages/remix/lib/components/alert/alert.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/components/alert/alert.style.dart'; - -import '../../helpers/widget_builder.dart'; -import '../../utils/component_recipe.dart'; - -class RemixAlert extends StatelessWidget - implements RemixComponentRecipe { - const RemixAlert({ - super.key, - this.icon, - this.title, - this.subtitle, - this.style, - this.variants = const [], - this.leadingBuilder, - this.titleBuilder, - this.subtitleBuilder, - }); - - final IconData? icon; - final String? title; - final String? subtitle; - - final RemixWidgetBuilder? leadingBuilder; - final RemixWidgetBuilder? titleBuilder; - final RemixWidgetBuilder? subtitleBuilder; - - @override - final RemixAlertStyle? style; - - @override - final List variants; - - RemixAlertStyle buildStyle(List variants) { - final result = style == null ? RemixAlertStyle.base() : style!; - return result.applyVariants(variants); - } - - @override - Widget build(BuildContext context) { - final style = buildStyle(variants); - - final leadingWidget = leadingBuilder != null - ? leadingBuilder!(style) - : icon != null - ? StyledIcon(icon, style: style.icon) - : null; - - final titleWidget = titleBuilder != null - ? titleBuilder!(style) - : title != null - ? StyledText( - title!, - style: style.title, - inherit: false, - ) - : null; - - final subtitleWidget = subtitleBuilder != null - ? subtitleBuilder!(style) - : subtitle != null - ? StyledText( - subtitle!, - style: style.subtitle, - inherit: false, - ) - : null; - - return HBox( - style: style.outerRowContainer, - children: [ - if (leadingWidget != null) leadingWidget, - VBox( - style: style.innerColumnContainer, - children: [ - if (titleWidget != null) titleWidget, - if (subtitleWidget != null) subtitleWidget, - ], - ), - ], - ); - } -} diff --git a/packages/remix/lib/components/alert/alert.style.dart b/packages/remix/lib/components/alert/alert.style.dart deleted file mode 100644 index ff29d5ec2..000000000 --- a/packages/remix/lib/components/alert/alert.style.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:mix/mix.dart'; - -class RemixAlertStyle extends StyleRecipe { - const RemixAlertStyle({ - this.outerRowContainer = const Style.empty(), - this.innerColumnContainer = const Style.empty(), - this.title = const Style.empty(), - this.subtitle = const Style.empty(), - this.icon = const Style.empty(), - }); - - final Style outerRowContainer; - final Style innerColumnContainer; - final Style title; - final Style subtitle; - final Style icon; - - factory RemixAlertStyle.base() { - return RemixAlertStyle( - outerRowContainer: _outerRowContainer(), - innerColumnContainer: _innerColumnContainer(), - title: _title(), - subtitle: _subtitle(), - icon: _icon(), - ); - } - - @override - RemixAlertStyle applyVariants(List variants) { - return RemixAlertStyle( - outerRowContainer: outerRowContainer.applyVariants(variants), - innerColumnContainer: innerColumnContainer.applyVariants(variants), - title: title.applyVariants(variants), - subtitle: subtitle.applyVariants(variants), - icon: icon.applyVariants(variants), - ); - } - - @override - RemixAlertStyle merge(RemixAlertStyle? other) { - if (other == null) return this; - return copyWith( - outerRowContainer: outerRowContainer.merge(other.outerRowContainer), - innerColumnContainer: - innerColumnContainer.merge(other.innerColumnContainer), - title: title.merge(other.title), - subtitle: subtitle.merge(other.subtitle), - icon: icon.merge(other.icon), - ); - } - - @override - RemixAlertStyle copyWith({ - Style? outerRowContainer, - Style? innerColumnContainer, - Style? title, - Style? subtitle, - Style? icon, - }) { - return RemixAlertStyle( - outerRowContainer: outerRowContainer ?? this.outerRowContainer, - innerColumnContainer: innerColumnContainer ?? this.innerColumnContainer, - title: title ?? this.title, - subtitle: subtitle ?? this.subtitle, - icon: icon ?? this.icon, - ); - } -} - -Style _outerRowContainer() => Style( - $flex.gap(8), - $box.padding(16), - $box.borderRadius(8), - $box.border.width(1), - $box.border.color.redAccent(), - $flex.mainAxisSize.min(), - $flex.mainAxisAlignment.start(), - $flex.crossAxisAlignment.start(), - ); - -Style _innerColumnContainer() => Style( - $flex.gap(2), - $flex.mainAxisSize.min(), - $flex.mainAxisAlignment.start(), - $flex.crossAxisAlignment.start(), - flexible.expanded(), - ); - -Style _title() => Style( - $text.style.fontSize(14), - $text.style.fontWeight.w600(), - $text.style.color.redAccent(), - ); - -Style _subtitle() => Style( - $text.style.fontSize(14), - $text.style.fontWeight.normal(), - $text.style.color.redAccent(), - ); - -Style _icon() => Style( - $icon.size(20), - $icon.color.redAccent(), - ); diff --git a/packages/remix/lib/components/avatar/avatar.dart b/packages/remix/lib/components/avatar/avatar.dart deleted file mode 100644 index e2ed630d5..000000000 --- a/packages/remix/lib/components/avatar/avatar.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import '../../helpers/widget_builder.dart'; -import 'avatar.style.dart'; -import '../../utils/component_recipe.dart'; - -class RemixAvatar extends StatelessWidget - implements RemixComponentRecipe { - const RemixAvatar({ - super.key, - this.image, - this.imageBuilder, - this.fallbackLabel, - this.fallbackLabelBuilder, - this.style, - this.variants = const [], - }); - - final ImageProvider? image; - final String? fallbackLabel; - final RemixWidgetBuilder? fallbackLabelBuilder; - final RemixWidgetBuilder? imageBuilder; - - @override - final RemixAvatarStyle? style; - - @override - final List variants; - - RemixAvatarStyle buildStyle(List variants) { - var styles = style == null ? RemixAvatarStyle.base() : style!; - - return styles.applyVariants(variants); - } - - @override - Widget build(BuildContext context) { - final style = buildStyle(variants); - - final imageWidget = imageBuilder != null - ? imageBuilder!(style) - : image != null - ? StyledImage( - image: image!, - style: style.image, - inherit: false, - ) - : null; - - final fallbackLabelWidget = fallbackLabelBuilder != null - ? fallbackLabelBuilder!(style) - : fallbackLabel != null - ? StyledText(fallbackLabel!, style: style.fallbackLabel) - : null; - - return Box( - style: style.container, - child: imageWidget ?? fallbackLabelWidget, - ); - } -} diff --git a/packages/remix/lib/components/avatar/avatar.style.dart b/packages/remix/lib/components/avatar/avatar.style.dart deleted file mode 100644 index ab1de0b8e..000000000 --- a/packages/remix/lib/components/avatar/avatar.style.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:mix/mix.dart'; - -class RemixAvatarStyle extends StyleRecipe { - const RemixAvatarStyle({ - this.container = const Style.empty(), - this.fallbackLabel = const Style.empty(), - this.image = const Style.empty(), - }); - - final Style container; - final Style fallbackLabel; - final Style image; - - factory RemixAvatarStyle.base() { - return RemixAvatarStyle( - container: _container(), - fallbackLabel: _label(), - image: _image(), - ); - } - - @override - RemixAvatarStyle applyVariants(List variants) { - return RemixAvatarStyle( - container: container.applyVariants(variants), - fallbackLabel: fallbackLabel.applyVariants(variants), - image: image.applyVariants(variants), - ); - } - - @override - RemixAvatarStyle copyWith({ - Style? container, - Style? fallbackLabel, - Style? image, - }) { - return RemixAvatarStyle( - container: this.container.merge(container), - fallbackLabel: this.fallbackLabel.merge(fallbackLabel), - image: this.image.merge(image), - ); - } - - @override - RemixAvatarStyle merge(RemixAvatarStyle? other) { - return copyWith( - container: other?.container, - fallbackLabel: other?.fallbackLabel, - image: other?.image, - ); - } -} - -Style _container() => Style( - $box.color.grey.shade100(), - $box.borderRadius(50), - $box.alignment.center(), - $box.width(40), - $box.height(40), - $box.clipBehavior.antiAlias(), - $with.clipOval(), - ); - -Style _label() => Style( - $text.style.fontSize(16), - $text.style.color.black54(), - $text.style.fontWeight.bold(), - ); - -Style _image() => Style( - $image.fit.cover(), - ); diff --git a/packages/remix/lib/components/badge/badge.dart b/packages/remix/lib/components/badge/badge.dart deleted file mode 100644 index 5cf5b734e..000000000 --- a/packages/remix/lib/components/badge/badge.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import 'badge.style.dart'; -import '../../utils/component_recipe.dart'; - -class RemixBadge extends StatelessWidget - implements RemixComponentRecipe { - const RemixBadge({ - super.key, - required this.label, - this.style, - this.variants = const [], - }); - - final String label; - - @override - final RemixBadgeStyle? style; - - @override - final List variants; - - RemixBadgeStyle buildStyle(List variants) { - var styles = style == null ? RemixBadgeStyle.base() : style!; - return styles.applyVariants(variants); - } - - @override - Widget build(BuildContext context) { - final style = buildStyle(variants); - return Box( - style: style.container, - child: StyledText( - label, - style: style.label, - ), - ); - } -} diff --git a/packages/remix/lib/components/badge/badge.style.dart b/packages/remix/lib/components/badge/badge.style.dart deleted file mode 100644 index de8259edf..000000000 --- a/packages/remix/lib/components/badge/badge.style.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -class RemixBadgeStyle extends StyleRecipe { - const RemixBadgeStyle({ - this.container = const Style.empty(), - this.label = const Style.empty(), - }); - - final Style container; - final Style label; - - factory RemixBadgeStyle.base() { - return RemixBadgeStyle( - container: _container(), - label: _label(), - ); - } - - @override - RemixBadgeStyle applyVariants(List variants) { - return RemixBadgeStyle( - container: container.applyVariants(variants), - label: label.applyVariants(variants), - ); - } - - @override - RemixBadgeStyle copyWith({ - Style? container, - Style? label, - }) { - return RemixBadgeStyle( - container: this.container.merge(container), - label: this.label.merge(label), - ); - } - - @override - RemixBadgeStyle merge(RemixBadgeStyle? other) { - return copyWith( - container: other?.container, - label: other?.label, - ); - } -} - -Style _container() => Style( - $flex.mainAxisAlignment.center(), - $flex.mainAxisSize.min(), - $flex.crossAxisAlignment.center(), - $flex.gap(4), - $box.padding.horizontal(10), - $box.padding.vertical(2), - $box.borderRadius(20), - $box.color.black(), - ); - -Style _label() => Style( - $text.style.fontSize(12), - $text.style.fontWeight.w600(), - $text.style.color.white(), - ); diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button.dart index 00636eeea..d7ce22e03 100644 --- a/packages/remix/lib/components/button/button.dart +++ b/packages/remix/lib/components/button/button.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; +import 'package:remix/components/button/button.style.dart'; import 'package:remix/components/button/button.variants.dart'; +import 'package:remix/components/button/button_spec.dart'; -class RemixButton extends StatelessWidget - implements RemixComponentRecipe { - const RemixButton({ +class RXButton extends StatelessWidget { + const RXButton({ super.key, - this.label, + required this.label, this.disabled = false, this.loading = false, this.iconLeft, @@ -16,10 +17,9 @@ class RemixButton extends StatelessWidget this.loadingLabel, required this.onPressed, this.style, - this.variants = const [], }); - final String? label; + final String label; final bool disabled; final bool loading; final String? loadingLabel; @@ -29,66 +29,65 @@ class RemixButton extends StatelessWidget final ButtonSize size; final VoidCallback? onPressed; - @override final Style? style; - @override - final List variants; - - RemixButtonStyle buildStyle(List variants) { - final result = style == null ? RemixButtonStyle.base() : style!; - return result.applyVariants(variants); + Style _buildStyle() { + return defaultButtonStyle + .merge(style) + .applyVariants([size, type]).animate(); } - List _buildChildren(BuildContext context, RemixButtonStyle style) { + List _buildChildren(IconSpec iconSpec, TextSpec labelSpec) { return loading - ? _buildLoadingChildren(context, style) - : _buildDefaultChildren(style); + ? _buildLoadingChildren(iconSpec, labelSpec) + : _buildDefaultChildren(iconSpec, labelSpec); } - List _buildLoadingChildren( - BuildContext context, - RemixButtonStyle buttonStyle, - ) => - [ - _buildLoadingIndicator(context), - if (loadingLabel != null) - StyledText( - loadingLabel!, - style: buttonStyle.label, - ), + List _buildLoadingChildren(IconSpec iconSpec, TextSpec labelSpec) => [ + _buildLoadingIndicator(iconSpec), + if (loadingLabel != null) labelSpec(loadingLabel!), ]; - Widget _buildLoadingIndicator(BuildContext context) { - final icon = IconSpec.of(context); + Widget _buildLoadingIndicator(IconSpec iconSpec) { const indicatorWidth = 2.5; return SizedBox( - width: icon.size, - height: icon.size, + width: iconSpec.size, + height: iconSpec.size, child: CircularProgressIndicator( strokeWidth: indicatorWidth, - color: icon.color, + color: iconSpec.color, ), ); } - List _buildDefaultChildren(RemixButtonStyle style) => [ - if (iconLeft != null) StyledIcon(iconLeft, style: style.icon), - if (label != null) StyledText(label!, style: style.label), - if (iconRight != null) StyledIcon(iconRight, style: style.icon), + List _buildDefaultChildren(IconSpec iconSpec, TextSpec labelSpec) => [ + if (iconLeft != null) iconSpec(iconLeft), + if (label.isNotEmpty) labelSpec(label), + if (iconRight != null) iconSpec(iconRight), ]; @override Widget build(BuildContext context) { - final style = buildStyle([size, type, ...variants]); - - return PressableBox( + return Pressable( onPress: disabled || loading ? null : onPressed, - child: HBox( - style: style.container, - children: _buildChildren(context, style), - ), + child: SpecBuilder( + style: _buildStyle(), + builder: (context) { + final buttonSpec = ButtonSpec.of(context); + + final containerSpec = buttonSpec.container; + final flexSpec = buttonSpec.flex; + final iconSpec = buttonSpec.icon; + final labelSpec = buttonSpec.label; + + return containerSpec( + child: flexSpec( + direction: Axis.horizontal, + children: _buildChildren(iconSpec, labelSpec), + ), + ); + }), ); } } diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 5ba706f2e..85eee3a44 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -3,119 +3,152 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:remix/components/button/button.variants.dart'; +import 'package:remix/components/button/button_spec.dart'; -Style get buttonStyle => Style( - _containerStyle(), - _iconStyle(), - _labelStyle(), - ); +final _button = ButtonSpecUtility.self; -Style get _containerStyle => Style( - $flex.gap(6), - $flex.mainAxisAlignment.center(), - $flex.crossAxisAlignment.center(), - $flex.mainAxisSize.min(), - ButtonSize.xsmall( - $box.padding.horizontal(8), - $box.padding.vertical(4), - ), - ButtonSize.small( - $box.padding.horizontal(12), - $box.padding.vertical(6), - ), - ButtonSize.medium( - $box.padding.horizontal(16), - $box.padding.vertical(8), - ), - ButtonSize.large( - $box.padding.horizontal(20), - $box.padding.vertical(10), - ), - ButtonType.primary( - $box.color.black(), - $on.hover( - $box.color.black87(), - ), - ), - ButtonType.secondary( - $box.color.grey.shade200(), - $on.hover( - $box.color.grey.shade100(), - ), - ), - ButtonType.destructive( - $box.color.redAccent(), - $on.hover( - $box.color.redAccent.shade200(), - ), - ), - ButtonType.outline( - $box.color.white(), - $box.border.width(1.5), - $box.border.color.black12(), - $box.shadow.color(Colors.black12.withOpacity(0.1)), - $box.shadow.blurRadius(1), - ), - ButtonType.ghost( - $box.color.transparent(), - $on.hover( - $box.color.black12(), - ), - ), - ButtonType.link( - $box.color.transparent(), - ), - $box.borderRadius(6), - ); +Style get defaultButtonStyle => Style( + _button.flex.gap(6), + _button.flex.mainAxisAlignment.center(), + _button.flex.crossAxisAlignment.center(), + _button.flex.mainAxisSize.min(), + _button.container.borderRadius(6), + _button.label.style.height(1.1), + _button.label.style.letterSpacing(0.5), + _button.label.style.fontWeight(FontWeight.w600), -Style get _iconStyle => Style( - ButtonSize.xsmall($icon.size(12)), - ButtonSize.small($icon.size(14)), - ButtonSize.medium($icon.size(16)), - ButtonSize.large($icon.size(18)), - (ButtonType.primary | ButtonType.destructive)( - $icon.color(Colors.white), - ), - (ButtonType.link | ButtonType.secondary | ButtonType.outline)( - $icon.color(Colors.black), - ), - ); + /// Size Variants + _xsmallVariant(), + _smallVariant(), + _mediumVariant(), + _largeVariant(), -Style get _labelStyle => Style( - $text.style.height(1.1), - $text.style.letterSpacing(0.5), - $text.style.fontWeight(FontWeight.w600), - ButtonSize.xsmall( - $text.style.fontSize(12), - ), - ButtonSize.small( - $text.style.fontSize(14), - ), - ButtonSize.medium( - $text.style.fontSize(16), - ), - ButtonSize.large( - $text.style.fontSize(18), - ), - ButtonType.primary( - $text.style.color.white(), - ), - ButtonType.secondary( - $text.style.color.black87(), - ), - ButtonType.destructive( - $text.style.color.white(), - ), - ButtonType.outline( - $text.style.color.black(), - ), - ButtonType.ghost( - $text.style.color.black(), - ), - ButtonType.link( - $text.style.color.black(), - $on.hover( - $text.style.decoration(TextDecoration.underline), - ), - ), + // Type variants + _primaryVariant(), + _secondaryVariant(), + _outlineVariant(), + _ghostVariant(), + _linkVariant(), + _destructiveVariant(), ); + +Style get _xsmallVariant { + return Style(ButtonSize.xsmall( + _button.container.padding.horizontal(8), + _button.container.padding.vertical(4), + _button.label.style.fontSize(12), + _button.icon.size(12), + )); +} + +Style get _smallVariant { + return Style( + ButtonSize.small( + _button.container.padding.horizontal(12), + _button.container.padding.vertical(6), + _button.label.style.fontSize(14), + _button.icon.size(14), + ), + ); +} + +Style get _mediumVariant { + return Style( + ButtonSize.medium( + _button.container.padding.horizontal(16), + _button.container.padding.vertical(8), + _button.label.style.fontSize(16), + _button.icon.size(16), + ), + ); +} + +Style get _largeVariant { + return Style( + ButtonSize.large( + _button.container.padding.horizontal(20), + _button.container.padding.vertical(10), + _button.label.style.fontSize(18), + _button.icon.size(18), + ), + ); +} + +Style get _primaryVariant { + return Style( + ButtonType.primary( + _button.container.color.black(), + _button.icon.color(Colors.white), + _button.label.style.color.white(), + $on.hover( + _button.container.color.black87(), + ), + ), + ); +} + +Style get _secondaryVariant { + return Style( + ButtonType.secondary( + _button.container.color.grey.shade200(), + _button.icon.color(Colors.black), + _button.label.style.color.black87(), + $on.hover( + _button.container.color.grey.shade100(), + ), + ), + ); +} + +Style get _destructiveVariant { + return Style( + ButtonType.destructive( + _button.container.color.redAccent(), + _button.icon.color(Colors.white), + _button.label.style.color.white(), + $on.hover( + _button.container.color.redAccent.shade200(), + ), + ), + ); +} + +Style get _outlineVariant { + return Style( + ButtonType.outline( + _button.container.color.transparent(), + _button.label.style.color.black(), + _button.container.border.width(1.5), + _button.container.border.color.black12(), + _button.container.shadow.color(Colors.black12.withOpacity(0.1)), + _button.container.shadow.blurRadius(1), + _button.icon.color(Colors.black), + ), + ); +} + +Style get _ghostVariant { + return Style( + ButtonType.ghost( + _button.container.color.transparent(), + _button.label.style.color.black(), + $on.hover( + _button.container.color.black12(), + ), + ), + ); +} + +Style get _linkVariant { + return Style( + ButtonType.link( + _button.label.style.color.black(), + _button.container.color.transparent(), + _button.icon.color(Colors.black), + $on.hover( + _button.label.style.decoration(TextDecoration.underline), + _button.container.color.black12(), + ), + ), + ); +} diff --git a/packages/remix/lib/components/button/button.variants.dart b/packages/remix/lib/components/button/button.variants.dart index be7a5b7d8..b6b3f2ff9 100644 --- a/packages/remix/lib/components/button/button.variants.dart +++ b/packages/remix/lib/components/button/button.variants.dart @@ -1,35 +1,21 @@ import 'package:mix/mix.dart'; -class RemixButtonTypes { - RemixButtonTypes(); - - final primary = const ButtonType('remix.button.primary'); - final secondary = const ButtonType('remix.button.secondary'); - final destructive = const ButtonType('remix.button.destructive'); - final outline = const ButtonType('remix.button.outline'); - final ghost = const ButtonType('remix.button.ghost'); - final link = const ButtonType('remix.button.link'); -} - -class RemixButtonSizes { - RemixButtonSizes(); - - final xsmall = const ButtonSize('remix.button.xsmall'); - final small = const ButtonSize('remix.button.small'); - final medium = const ButtonSize('remix.button.medium'); - final large = const ButtonSize('remix.button.large'); +abstract class ButtonVariant extends Variant { + const ButtonVariant(super.name); } -class ButtonSize extends Variant { +class ButtonSize extends ButtonVariant { const ButtonSize(super.name); static const xsmall = ButtonSize('remix.button.xsmall'); static const small = ButtonSize('remix.button.small'); static const medium = ButtonSize('remix.button.medium'); static const large = ButtonSize('remix.button.large'); + + static List get values => [xsmall, small, medium, large]; } -class ButtonType extends Variant { +class ButtonType extends ButtonVariant { const ButtonType(super.name); static const primary = ButtonType('remix.button.primary'); @@ -38,4 +24,13 @@ class ButtonType extends Variant { static const outline = ButtonType('remix.button.outline'); static const ghost = ButtonType('remix.button.ghost'); static const link = ButtonType('remix.button.link'); + + static List get values => [ + primary, + secondary, + destructive, + outline, + ghost, + link, + ]; } diff --git a/packages/remix/lib/components/button/button_spec.dart b/packages/remix/lib/components/button/button_spec.dart index 01614f39c..6729eeb8f 100644 --- a/packages/remix/lib/components/button/button_spec.dart +++ b/packages/remix/lib/components/button/button_spec.dart @@ -6,14 +6,24 @@ part 'button_spec.g.dart'; @MixableSpec() base class ButtonSpec extends Spec with _$ButtonSpec { - final BoxSpec? container; - final IconSpec? icon; - final TextSpec? label; + final FlexSpec flex; + final BoxSpec container; + final IconSpec icon; + final TextSpec label; + + /// {@macro button_spec_of} + static const of = _$ButtonSpec.of; + + static const from = _$ButtonSpec.from; const ButtonSpec({ - this.container, - this.icon, - this.label, + BoxSpec? container, + FlexSpec? flex, + IconSpec? icon, + TextSpec? label, super.animated, - }); + }) : flex = flex ?? const FlexSpec(), + container = container ?? const BoxSpec(), + icon = icon ?? const IconSpec(), + label = label ?? const TextSpec(); } diff --git a/packages/remix/lib/components/button/button_spec.g.dart b/packages/remix/lib/components/button/button_spec.g.dart index 9d545a813..558cd420c 100644 --- a/packages/remix/lib/components/button/button_spec.g.dart +++ b/packages/remix/lib/components/button/button_spec.g.dart @@ -34,12 +34,14 @@ base mixin _$ButtonSpec on Spec { @override ButtonSpec copyWith({ BoxSpec? container, + FlexSpec? flex, IconSpec? icon, TextSpec? label, AnimatedData? animated, }) { return ButtonSpec( container: container ?? _$this.container, + flex: flex ?? _$this.flex, icon: icon ?? _$this.icon, label: label ?? _$this.label, animated: animated ?? _$this.animated, @@ -58,6 +60,7 @@ base mixin _$ButtonSpec on Spec { /// interpolation method: /// /// - [BoxSpec.lerp] for [container]. + /// - [FlexSpec.lerp] for [flex]. /// - [IconSpec.lerp] for [icon]. /// - [TextSpec.lerp] for [label]. @@ -72,9 +75,10 @@ base mixin _$ButtonSpec on Spec { if (other == null) return _$this; return ButtonSpec( - container: _$this.container?.lerp(other.container, t) ?? other.container, - icon: _$this.icon?.lerp(other.icon, t) ?? other.icon, - label: _$this.label?.lerp(other.label, t) ?? other.label, + container: _$this.container.lerp(other.container, t), + flex: _$this.flex.lerp(other.flex, t), + icon: _$this.icon.lerp(other.icon, t), + label: _$this.label.lerp(other.label, t), animated: t < 0.5 ? _$this.animated : other.animated, ); } @@ -86,6 +90,7 @@ base mixin _$ButtonSpec on Spec { @override List get props => [ _$this.container, + _$this.flex, _$this.icon, _$this.label, _$this.animated, @@ -103,11 +108,13 @@ base mixin _$ButtonSpec on Spec { /// the [ButtonSpec] constructor. final class ButtonSpecAttribute extends SpecAttribute { final BoxSpecAttribute? container; + final FlexSpecAttribute? flex; final IconSpecAttribute? icon; final TextSpecAttribute? label; const ButtonSpecAttribute({ this.container, + this.flex, this.icon, this.label, super.animated, @@ -125,6 +132,7 @@ final class ButtonSpecAttribute extends SpecAttribute { ButtonSpec resolve(MixData mix) { return ButtonSpec( container: container?.resolve(mix), + flex: flex?.resolve(mix), icon: icon?.resolve(mix), label: label?.resolve(mix), animated: animated?.resolve(mix) ?? mix.animation, @@ -145,6 +153,7 @@ final class ButtonSpecAttribute extends SpecAttribute { return ButtonSpecAttribute( container: container?.merge(other.container) ?? other.container, + flex: flex?.merge(other.flex) ?? other.flex, icon: icon?.merge(other.icon) ?? other.icon, label: label?.merge(other.label) ?? other.label, animated: animated?.merge(other.animated) ?? other.animated, @@ -158,6 +167,7 @@ final class ButtonSpecAttribute extends SpecAttribute { @override List get props => [ container, + flex, icon, label, animated, @@ -173,6 +183,9 @@ base class ButtonSpecUtility /// Utility for defining [ButtonSpecAttribute.container] late final container = BoxSpecUtility((v) => only(container: v)); + /// Utility for defining [ButtonSpecAttribute.flex] + late final flex = FlexSpecUtility((v) => only(flex: v)); + /// Utility for defining [ButtonSpecAttribute.icon] late final icon = IconSpecUtility((v) => only(icon: v)); @@ -190,12 +203,14 @@ base class ButtonSpecUtility @override T only({ BoxSpecAttribute? container, + FlexSpecAttribute? flex, IconSpecAttribute? icon, TextSpecAttribute? label, AnimatedDataDto? animated, }) { return builder(ButtonSpecAttribute( container: container, + flex: flex, icon: icon, label: label, animated: animated, diff --git a/packages/remix/lib/components/card/card.dart b/packages/remix/lib/components/card/card.dart deleted file mode 100644 index 65f47e5ba..000000000 --- a/packages/remix/lib/components/card/card.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/components/card/card.style.dart'; - -class PresableRemixCard extends RemixCard { - const PresableRemixCard({ - super.key, - required super.child, - this.onTap, - super.style, - }); - - final void Function()? onTap; - - @override - Widget build(BuildContext context) { - return Pressable( - onPress: onTap, - child: super.build(context), - ); - } -} - -class RemixCard extends StatelessWidget - implements RemixComponentRecipe { - const RemixCard({ - super.key, - required this.child, - this.style, - this.variants = const [], - }); - - factory RemixCard.pressable( - Widget child, { - void Function()? onTap, - RemixCardStyle? style, - }) { - return PresableRemixCard( - style: style, - onTap: onTap, - child: child, - ); - } - - final Widget child; - - @override - final RemixCardStyle? style; - - @override - final List variants; - - RemixCardStyle buildStyle(List variants) { - final result = style == null ? RemixCardStyle.base() : style!; - - return result.applyVariants(variants); - } - - @override - Widget build(BuildContext context) { - final style = buildStyle(variants); - - return Box( - style: style.container, - child: child, - ); - } -} diff --git a/packages/remix/lib/components/card/card.style.dart b/packages/remix/lib/components/card/card.style.dart deleted file mode 100644 index 91c1e9caf..000000000 --- a/packages/remix/lib/components/card/card.style.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:mix/mix.dart'; - -class RemixCardStyle extends StyleRecipe { - const RemixCardStyle({ - this.container = const Style.empty(), - }); - - final Style container; - - factory RemixCardStyle.base() { - return RemixCardStyle( - container: _container(), - ); - } - - @override - RemixCardStyle applyVariants(List variants) { - return RemixCardStyle( - container: container.applyVariants(variants), - ); - } - - @override - RemixCardStyle merge(RemixCardStyle? other) { - if (other == null) return this; - return copyWith( - container: container.merge(other.container), - ); - } - - @override - RemixCardStyle copyWith({ - Style? container, - }) { - return RemixCardStyle( - container: container ?? this.container, - ); - } -} - -Style _container() => Style( - $box.padding(16), - $box.elevation(1), - $box.borderRadius(8), - $box.color.white(), - ); diff --git a/packages/remix/lib/components/checkbox/checkbox.dart b/packages/remix/lib/components/checkbox/checkbox.dart deleted file mode 100644 index 53914dfec..000000000 --- a/packages/remix/lib/components/checkbox/checkbox.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/components/checkbox/checkbox.variants.dart'; -import 'package:remix/components/checkbox/tokens/checkbox_attr.dart'; - -import 'tokens/checkbox_spec.dart'; -import 'tokens/checkbox_util.dart'; - -const kNoAnimation = - AnimatedData(duration: Duration.zero, curve: Curves.linear); - -AnimatedStyle $defaultCheckboxStyle() { - final checkbox = CheckboxSpecUtility((value) => CheckboxSpecAttribute( - flexContainer: value.flexContainer, - innerContainer: value.innerContainer, - icon: value.icon, - label: value.label, - )); - - return Style( - // Flex Container - checkbox.flexContainer.mainAxisAlignment.center(), - checkbox.flexContainer.crossAxisAlignment.center(), - checkbox.flexContainer.mainAxisSize.min(), - checkbox.flexContainer.gap(6), - // Inner Container - checkbox.innerContainer.borderRadius.all(7), - checkbox.innerContainer.width(20), - checkbox.innerContainer.height(20), - checkbox.innerContainer.border( - color: const Color.fromARGB(115, 3, 3, 3), - width: 1.5, - ), - // Label - checkbox.label.style.fontSize(16), - checkbox.label.style.color.black87(), - checkbox.icon.color.white(), - - // Checked - CheckboxState.checked( - // Inner Container - checkbox.innerContainer.color.black87(), - // Icon - checkbox.icon.color.white(), - checkbox.icon.size(15), - // Label - checkbox.label.style.fontSize(16), - checkbox.label.style.bold(), - checkbox.label.style.color.black87(), - ), - ).animate( - curve: Curves.easeInOut, - duration: const Duration(milliseconds: 200), - ); -} - -class RemixCheckbox extends StatelessWidget { - RemixCheckbox({ - super.key, - this.label, - this.disabled = false, - this.value = false, - this.onChanged, - this.iconChecked = Icons.check_rounded, - this.iconUnchecked, - Style? style, - this.variants = const [], - }) : style = style ?? $defaultCheckboxStyle(); - - final String? label; - final bool disabled; - final bool value; - final IconData iconChecked; - final IconData? iconUnchecked; - final ValueChanged? onChanged; - - final Style style; - - final List variants; - - @override - Widget build(BuildContext context) { - return SpecBuilder( - style: style.applyVariant( - value ? CheckboxState.checked : CheckboxState.unchecked, - ), - builder: (context) { - final spec = CheckboxSpec.of(context); - final mix = MixProvider.of(context); - final animationData = mix.animation ?? kNoAnimation; - - return Pressable( - onPress: - onChanged == null || disabled ? null : () => onChanged!(!value), - child: FlexSpecWidget( - spec: spec.flexContainer, - direction: Axis.horizontal, - children: [ - AnimatedBoxSpecWidget( - spec: spec.innerContainer, - duration: animationData.duration, - child: AnimatedIconSpecWidget( - icon: value ? iconChecked : iconUnchecked, - spec: spec.icon, - duration: animationData.duration, - curve: animationData.curve, - ), - ), - if (label != null) - AnimatedTextSpecWidget( - label!, - spec: spec.label, - duration: animationData.duration, - curve: animationData.curve, - ), - ], - ), - ); - }, - ); - } -} diff --git a/packages/remix/lib/components/checkbox/checkbox.variants.dart b/packages/remix/lib/components/checkbox/checkbox.variants.dart deleted file mode 100644 index ad5f74705..000000000 --- a/packages/remix/lib/components/checkbox/checkbox.variants.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:mix/mix.dart'; - -class CheckboxState extends Variant { - const CheckboxState._(String name) : super(name); - - static const checked = CheckboxState._('remix.checkbox.checked'); - static const unchecked = CheckboxState._('remix.checkbox.unchecked'); -} diff --git a/packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart b/packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart deleted file mode 100644 index 7a7e21012..000000000 --- a/packages/remix/lib/components/checkbox/tokens/checkbox_attr.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:mix/mix.dart'; -import 'package:remix/components/checkbox/tokens/checkbox_spec.dart'; - -class CheckboxSpecAttribute extends SpecAttribute { - const CheckboxSpecAttribute({ - this.flexContainer = const FlexSpecAttribute(), - this.innerContainer = const BoxSpecAttribute(), - this.icon = const IconSpecAttribute(), - this.label = const TextSpecAttribute(), - }); - - final FlexSpecAttribute flexContainer; - final BoxSpecAttribute innerContainer; - final IconSpecAttribute icon; - final TextSpecAttribute label; - - @override - CheckboxSpecAttribute merge(covariant CheckboxSpecAttribute? other) { - return CheckboxSpecAttribute( - flexContainer: flexContainer.merge(other?.flexContainer), - innerContainer: innerContainer.merge(other?.innerContainer), - icon: icon.merge(other?.icon), - label: label.merge(other?.label), - ); - } - - @override - List get props => [ - flexContainer, - innerContainer, - icon, - label, - ]; - - @override - CheckboxSpec resolve(MixData mix) { - return CheckboxSpec( - flexContainer: flexContainer.resolve(mix), - innerContainer: innerContainer.resolve(mix), - icon: icon.resolve(mix), - label: label.resolve(mix), - ); - } -} diff --git a/packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart b/packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart deleted file mode 100644 index fcb33db70..000000000 --- a/packages/remix/lib/components/checkbox/tokens/checkbox_spec.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/components/checkbox/tokens/checkbox_attr.dart'; - -class CheckboxSpec extends Spec { - final FlexSpec flexContainer; - final BoxSpec innerContainer; - final IconSpec icon; - final TextSpec label; - - const CheckboxSpec({ - required this.flexContainer, - required this.innerContainer, - required this.icon, - required this.label, - }); - - const CheckboxSpec.empty() - : flexContainer = const FlexSpec.empty(), - innerContainer = const BoxSpec.empty(), - icon = const IconSpec.empty(), - label = const TextSpec.empty(); - - @override - CheckboxSpec copyWith({ - FlexSpec? flexContainer, - BoxSpec? innerContainer, - IconSpec? icon, - TextSpec? label, - }) { - return CheckboxSpec( - flexContainer: flexContainer ?? this.flexContainer, - innerContainer: innerContainer ?? this.innerContainer, - icon: icon ?? this.icon, - label: label ?? this.label, - ); - } - - static CheckboxSpec of(BuildContext context) { - final mix = MixProvider.of(context); - - return mix.attributeOf()?.resolve(mix) ?? - const CheckboxSpec.empty(); - } - - @override - CheckboxSpec lerp(CheckboxSpec other, double t) { - return CheckboxSpec( - flexContainer: flexContainer.lerp(other.flexContainer, t), - innerContainer: innerContainer.lerp(other.innerContainer, t), - icon: icon.lerp(other.icon, t), - label: label.lerp(other.label, t), - ); - } - - @override - List get props => [ - flexContainer, - innerContainer, - icon, - label, - ]; -} diff --git a/packages/remix/lib/components/checkbox/tokens/checkbox_util.dart b/packages/remix/lib/components/checkbox/tokens/checkbox_util.dart deleted file mode 100644 index 714d85653..000000000 --- a/packages/remix/lib/components/checkbox/tokens/checkbox_util.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:mix/mix.dart'; - -import 'checkbox_attr.dart'; - -class CheckboxSpecUtility - extends SpecUtility { - CheckboxSpecUtility(super.builder); - - BoxSpecUtility get innerContainer => BoxSpecUtility( - (innerContainer) => only(innerContainer: innerContainer), - ); - - FlexSpecUtility get flexContainer => FlexSpecUtility( - (flexContainer) => only(flexContainer: flexContainer), - ); - - IconSpecUtility get icon => IconSpecUtility( - (icon) => only(icon: icon), - ); - - TextSpecUtility get label => TextSpecUtility( - (label) => only(label: label), - ); - - @override - T only({ - FlexSpecAttribute flexContainer = const FlexSpecAttribute(), - BoxSpecAttribute innerContainer = const BoxSpecAttribute(), - IconSpecAttribute icon = const IconSpecAttribute(), - TextSpecAttribute label = const TextSpecAttribute(), - }) { - return builder( - CheckboxSpecAttribute( - flexContainer: flexContainer, - innerContainer: innerContainer, - icon: icon, - label: label, - ), - ); - } -} diff --git a/packages/remix/lib/components/divider/divider.dart b/packages/remix/lib/components/divider/divider.dart deleted file mode 100644 index 3f0bbf982..000000000 --- a/packages/remix/lib/components/divider/divider.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import 'divider.style.dart'; -import '../../utils/component_recipe.dart'; - -class RemixDivider extends StatelessWidget - implements RemixComponentRecipe { - const RemixDivider({ - super.key, - this.style, - this.variants = const [], - }); - - @override - final RemixDividerStyle? style; - - @override - final List variants; - - RemixDividerStyle buildStyle(List variants) { - var styles = style == null ? RemixDividerStyle.base() : style!; - return styles.applyVariants(variants); - } - - @override - Widget build(BuildContext context) { - return Box( - style: buildStyle(variants).container, - ); - } -} diff --git a/packages/remix/lib/components/divider/divider.style.dart b/packages/remix/lib/components/divider/divider.style.dart deleted file mode 100644 index dd07fe12b..000000000 --- a/packages/remix/lib/components/divider/divider.style.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:mix/mix.dart'; - -class RemixDividerStyle extends StyleRecipe { - const RemixDividerStyle({ - this.container = const Style.empty(), - }); - - final Style container; - - factory RemixDividerStyle.base() { - return RemixDividerStyle( - container: _container(), - ); - } - - @override - RemixDividerStyle applyVariants(List variants) { - return RemixDividerStyle( - container: container.applyVariants(variants), - ); - } - - @override - RemixDividerStyle copyWith({ - Style? container, - }) { - return RemixDividerStyle( - container: this.container.merge(container), - ); - } - - @override - RemixDividerStyle merge(RemixDividerStyle? other) { - return copyWith( - container: other?.container, - ); - } -} - -Style _container() => Style( - $box.margin.vertical(15), - $box.height(2), - $box.borderRadius(1), - $box.color.grey.shade200(), - ); diff --git a/packages/remix/lib/components/list_tile/list_tile.dart b/packages/remix/lib/components/list_tile/list_tile.dart deleted file mode 100644 index f557455cc..000000000 --- a/packages/remix/lib/components/list_tile/list_tile.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:mix/mix.dart'; - -import '../../helpers/widget_builder.dart'; -import 'list_tile.style.dart'; -import '../../utils/component_recipe.dart'; - -class RemixListTile extends StatelessWidget - implements RemixComponentRecipe { - const RemixListTile({ - super.key, - this.title, - this.subtitle, - this.leading, - this.trailing, - this.style, - this.variants = const [], - this.titleBuilder, - this.subtitleBuilder, - }); - - final String? title; - final String? subtitle; - final Widget? leading; - final Widget? trailing; - - final RemixWidgetBuilder? titleBuilder; - final RemixWidgetBuilder? subtitleBuilder; - - @override - final RemixListTileStyle? style; - - @override - final List variants; - - RemixListTileStyle buildStyle(List variants) { - var styles = style == null ? RemixListTileStyle.base() : style!; - return styles.applyVariants(variants); - } - - @override - Widget build(BuildContext context) { - final style = buildStyle(variants); - - final titleWidget = titleBuilder != null - ? titleBuilder!(style) - : title != null - ? StyledText(title!, style: style.title) - : null; - - final subtitleWidget = subtitleBuilder != null - ? subtitleBuilder!(style) - : subtitle != null - ? StyledText(subtitle!, style: style.subtitle) - : null; - - return HBox( - style: style.outerRowContainer, - children: [ - if (leading != null) leading!, - VBox( - style: style.innerColumnContainer, - children: [ - if (titleWidget != null) titleWidget, - if (subtitleWidget != null) subtitleWidget, - ], - ), - const Spacer(), - if (trailing != null) trailing!, - ], - ); - } -} diff --git a/packages/remix/lib/components/list_tile/list_tile.style.dart b/packages/remix/lib/components/list_tile/list_tile.style.dart deleted file mode 100644 index a5d1a240f..000000000 --- a/packages/remix/lib/components/list_tile/list_tile.style.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:mix/mix.dart'; - -class RemixListTileStyle extends StyleRecipe { - const RemixListTileStyle({ - this.outerRowContainer = const Style.empty(), - this.innerColumnContainer = const Style.empty(), - this.title = const Style.empty(), - this.subtitle = const Style.empty(), - }); - - final Style outerRowContainer; - final Style innerColumnContainer; - final Style title; - final Style subtitle; - - factory RemixListTileStyle.base() { - return RemixListTileStyle( - outerRowContainer: _outerRowContainer(), - innerColumnContainer: _innerColumnContainer(), - title: _title(), - subtitle: _subtitle(), - ); - } - - @override - RemixListTileStyle applyVariants(List variants) { - return RemixListTileStyle( - outerRowContainer: outerRowContainer.applyVariants(variants), - innerColumnContainer: innerColumnContainer.applyVariants(variants), - title: title.applyVariants(variants), - subtitle: subtitle.applyVariants(variants), - ); - } - - @override - RemixListTileStyle copyWith({ - Style? outerRowContainer, - Style? innerColumnContainer, - Style? title, - Style? subtitle, - }) { - return RemixListTileStyle( - outerRowContainer: this.outerRowContainer.merge(outerRowContainer), - innerColumnContainer: - this.innerColumnContainer.merge(innerColumnContainer), - title: this.title.merge(title), - subtitle: this.subtitle.merge(subtitle), - ); - } - - @override - RemixListTileStyle merge(RemixListTileStyle? other) { - return copyWith( - outerRowContainer: other?.outerRowContainer, - innerColumnContainer: other?.innerColumnContainer, - title: other?.title, - subtitle: other?.subtitle, - ); - } -} - -Style _outerRowContainer() => Style( - $flex.gap(16), - ); - -Style _innerColumnContainer() => Style( - $flex.mainAxisAlignment.center(), - $flex.mainAxisSize.min(), - $flex.crossAxisAlignment.start(), - $flex.gap(4), - ); - -Style _title() => Style( - $text.style.fontSize(14), - $text.style.fontWeight.w600(), - $text.style.color.black(), - ); - -Style _subtitle() => Style( - $text.style.fontSize(14), - $text.style.fontWeight.normal(), - $text.style.color.grey(), - $text.maxLines(2), - ); diff --git a/packages/remix/lib/components/radio/radio.dart b/packages/remix/lib/components/radio/radio.dart deleted file mode 100644 index fd4079422..000000000 --- a/packages/remix/lib/components/radio/radio.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import '../../utils/component_recipe.dart'; -import 'radio.style.dart'; -import 'radio.variants.dart'; - -class RemixRadio extends StatelessWidget - implements RemixComponentRecipe { - const RemixRadio({ - super.key, - this.label, - this.disabled = false, - this.active = false, - this.onChanged, - this.style, - this.variants = const [], - }); - - final String? label; - final bool disabled; - final bool active; - final ValueChanged? onChanged; - - @override - final RemixRadioStyle? style; - - @override - final List variants; - - RemixRadioStyle buildStyle(List variants) { - final result = style == null ? RemixRadioStyle.base() : style!; - return result.applyVariants(variants); - } - - void Function()? _handleOnChange() { - return onChanged == null || disabled ? null : () => onChanged!(!active); - } - - @override - Widget build(BuildContext context) { - var internalVariants = active ? RadioState.active : RadioState.inactive; - - final style = buildStyle([internalVariants, ...variants]); - - return PressableBox( - onPressed: _handleOnChange, - child: HBox( - style: style.row, - children: [ - Box( - style: style.outerContainer, - child: Box( - style: style.innerContainer, - ), - ), - if (label != null) - StyledText( - label!, - style: style.label, - ), - ], - ), - ); - } -} diff --git a/packages/remix/lib/components/radio/radio.style.dart b/packages/remix/lib/components/radio/radio.style.dart deleted file mode 100644 index a8f2e5a5b..000000000 --- a/packages/remix/lib/components/radio/radio.style.dart +++ /dev/null @@ -1,97 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import 'radio.variants.dart'; - -class RemixRadioStyle extends StyleRecipe { - const RemixRadioStyle({ - this.outerContainer = const Style.empty(), - this.innerContainer = const Style.empty(), - this.label = const Style.empty(), - this.row = const Style.empty(), - }); - - final Style outerContainer; - final Style innerContainer; - final Style label; - final Style row; - - factory RemixRadioStyle.base() { - return RemixRadioStyle( - outerContainer: _outerContainerStyle(), - innerContainer: _innerContainerStyle(), - label: _labelStyle(), - row: _hboxStyle(), - ); - } - - @override - RemixRadioStyle applyVariants(List variants) { - return RemixRadioStyle( - outerContainer: outerContainer.applyVariants(variants), - innerContainer: innerContainer.applyVariants(variants), - label: label.applyVariants(variants), - row: row.applyVariants(variants), - ); - } - - @override - RemixRadioStyle copyWith({ - Style? outerContainer, - Style? innerContainer, - Style? label, - Style? row, - }) { - return RemixRadioStyle( - innerContainer: this.innerContainer.merge(innerContainer), - outerContainer: this.outerContainer.merge(outerContainer), - label: this.label.merge(label), - row: this.row.merge(row), - ); - } - - @override - RemixRadioStyle merge(RemixRadioStyle? other) { - return copyWith( - outerContainer: other?.outerContainer, - innerContainer: other?.innerContainer, - label: other?.label, - row: other?.row, - ); - } -} - -Style _outerContainerStyle() => Style( - $box.width(16), - $box.height(16), - $box.alignment.center(), - $box.borderRadius.all(10), - $box.color.transparent(), - $box.border.all(width: 1.5, color: Colors.black87), - ); - -Style _innerContainerStyle() => Style( - $box.borderRadius.all(10), - $box.color.black87(), - RadioState.active( - $box.width(8.5), - $box.height(8.5), - ), - RadioState.inactive( - $box.width(0), - $box.height(0), - ), - ); - -Style _labelStyle() => Style( - $text.style.fontSize(16), - $text.style.bold(), - $text.style.color.black87(), - ); - -Style _hboxStyle() => Style( - $flex.mainAxisAlignment.center(), - $flex.crossAxisAlignment.center(), - $flex.mainAxisSize.min(), - $flex.gap(6), - ); diff --git a/packages/remix/lib/components/radio/radio.variants.dart b/packages/remix/lib/components/radio/radio.variants.dart deleted file mode 100644 index 7c301c4d7..000000000 --- a/packages/remix/lib/components/radio/radio.variants.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:mix/mix.dart'; - -class RadioState extends Variant { - const RadioState._(String name) : super(name); - - static const active = RadioState._('remix.radio.active'); - static const inactive = RadioState._('remix.radio.inactive'); -} diff --git a/packages/remix/lib/components/switch/switch.dart b/packages/remix/lib/components/switch/switch.dart deleted file mode 100644 index 12a09fefe..000000000 --- a/packages/remix/lib/components/switch/switch.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import '../../utils/component_recipe.dart'; -import 'switch.style.dart'; -import 'switch.variants.dart'; - -class RemixSwitch extends StatelessWidget - implements RemixComponentRecipe { - const RemixSwitch({ - super.key, - this.disabled = false, - this.active = false, - this.onChanged, - this.style, - this.variants = const [], - }); - - final bool disabled; - final bool active; - final ValueChanged? onChanged; - - @override - final RemixSwitchStyle? style; - - @override - final List variants; - - RemixSwitchStyle buildStyle(List variants) { - final result = style == null ? RemixSwitchStyle.base() : style!; - return result.applyVariants(variants); - } - - void Function()? _handleOnChange() { - return onChanged == null || disabled ? null : () => onChanged!(!active); - } - - @override - Widget build(BuildContext context) { - var internalVariants = active ? SwitchState.active : SwitchState.inactive; - - final style = buildStyle([internalVariants, ...variants]); - - return PressableBox( - onPressed: _handleOnChange, - style: style.outerFlexContainer, - child: Box( - style: style.innerContainer, - ), - ); - } -} diff --git a/packages/remix/lib/components/switch/switch.style.dart b/packages/remix/lib/components/switch/switch.style.dart deleted file mode 100644 index bdb1db3eb..000000000 --- a/packages/remix/lib/components/switch/switch.style.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; - -import 'switch.variants.dart'; - -class RemixSwitchStyle extends StyleRecipe { - const RemixSwitchStyle({ - this.outerFlexContainer = const Style.empty(), - this.innerContainer = const Style.empty(), - }); - - final Style outerFlexContainer; - final Style innerContainer; - - factory RemixSwitchStyle.base() { - return RemixSwitchStyle( - outerFlexContainer: _outerFlexContainerStyle(), - innerContainer: _innerContainerStyle(), - ); - } - - @override - RemixSwitchStyle applyVariants(List variants) { - return RemixSwitchStyle( - outerFlexContainer: outerFlexContainer.applyVariants(variants), - innerContainer: innerContainer.applyVariants(variants), - ); - } - - @override - RemixSwitchStyle copyWith({ - Style? outerFlexContainer, - Style? innerContainer, - }) { - return RemixSwitchStyle( - innerContainer: this.innerContainer.merge(innerContainer), - outerFlexContainer: this.outerFlexContainer.merge(outerFlexContainer), - ); - } - - @override - RemixSwitchStyle merge(RemixSwitchStyle? other) { - return copyWith( - outerFlexContainer: other?.outerFlexContainer, - innerContainer: other?.innerContainer, - ); - } -} - -Style _outerFlexContainerStyle() => Style( - $box.width(32), - $box.height(16), - border.width(2), - border.strokeAlign(BorderSide.strokeAlignOutside), - $box.borderRadius(20), - SwitchState.active( - $box.color.black(), - border.color.black(), - $box.alignment.centerRight(), - ), - SwitchState.inactive( - $box.alignment.centerLeft(), - $box.color.grey.shade300(), - border.color.grey.shade300(), - ), - ); - -Style _innerContainerStyle() => Style( - $box.borderRadius(10), - width(16), - height(16), - $box.color.white(), - ); diff --git a/packages/remix/lib/components/switch/switch.variants.dart b/packages/remix/lib/components/switch/switch.variants.dart deleted file mode 100644 index 43f43efa4..000000000 --- a/packages/remix/lib/components/switch/switch.variants.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:mix/mix.dart'; - -class SwitchState extends Variant { - const SwitchState._(String name) : super(name); - - static const active = SwitchState._('remix.switch.active'); - static const inactive = SwitchState._('remix.switch.inactive'); -} diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index 0b9950c33..211c998e8 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -1,25 +1,5 @@ library remix; -export 'components/alert/alert.dart'; -export 'components/alert/alert.style.dart'; -export 'components/avatar/avatar.dart'; -export 'components/avatar/avatar.style.dart'; -export 'components/badge/badge.dart'; -export 'components/badge/badge.style.dart'; export 'components/button/button.dart'; export 'components/button/button.style.dart'; export 'components/button/button.variants.dart'; -export 'components/card/card.dart'; -export 'components/card/card.style.dart'; -export 'components/checkbox/checkbox.dart'; -export 'components/checkbox/checkbox.variants.dart'; -export 'components/divider/divider.dart'; -export 'components/divider/divider.style.dart'; -export 'components/list_tile/list_tile.dart'; -export 'components/list_tile/list_tile.style.dart'; -export 'components/radio/radio.dart'; -export 'components/radio/radio.style.dart'; -export 'components/radio/radio.variants.dart'; -export 'components/switch/switch.dart'; -export 'components/switch/switch.style.dart'; -export 'components/switch/switch.variants.dart'; diff --git a/packages/remix/pubspec.yaml b/packages/remix/pubspec.yaml index bf8c2690b..987aefdc7 100644 --- a/packages/remix/pubspec.yaml +++ b/packages/remix/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - mix: ^1.1.0 + mix: ^1.1.1 mix_annotations: ^0.1.0 dev_dependencies: @@ -17,7 +17,7 @@ dev_dependencies: sdk: flutter flutter_lints: ^2.0.0 - mix_generator: ^0.1.1 + mix_generator: ^0.1.2 build_runner: ^2.4.9 flutter: diff --git a/packages/remix/test/components/button_test.dart b/packages/remix/test/components/button_test.dart index be20f4588..96bb4991d 100644 --- a/packages/remix/test/components/button_test.dart +++ b/packages/remix/test/components/button_test.dart @@ -9,7 +9,7 @@ void main() { const label = 'Test Button'; await tester.pumpWidget( MaterialApp( - home: RemixButton(label: label, onPressed: () {}), + home: RXButton(label: label, onPressed: () {}), ), ); @@ -27,7 +27,8 @@ void main() { await tester.pumpWidget( MaterialApp( - home: RemixButton( + home: RXButton( + label: 'Test Button', loading: true, loadingLabel: loadingLabel, onPressed: () {}, @@ -42,7 +43,8 @@ void main() { testWidgets('displays correct icons when provided', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( - home: RemixButton( + home: RXButton( + label: 'Test Button', iconLeft: Icons.arrow_back, iconRight: Icons.arrow_forward, onPressed: () {}, @@ -65,7 +67,7 @@ void main() { bool didCallOnPressed = false; await tester.pumpWidget(MaterialApp( - home: RemixButton( + home: RXButton( label: 'Disabled Button', onPressed: () { didCallOnPressed = true; @@ -74,7 +76,7 @@ void main() { ), )); - await tester.tap(find.byType(RemixButton)); + await tester.tap(find.byType(RXButton)); await tester.pumpAndSettle(const Duration(milliseconds: 200)); expect(didCallOnPressed, false); @@ -84,7 +86,7 @@ void main() { bool didCallOnPressed = false; await tester.pumpWidget(MaterialApp( - home: RemixButton( + home: RXButton( label: 'Disabled Button', onPressed: () { didCallOnPressed = true; @@ -92,7 +94,7 @@ void main() { ), )); - await tester.tap(find.byType(RemixButton)); + await tester.tap(find.byType(RXButton)); await tester.pumpAndSettle(const Duration(milliseconds: 200)); expect(didCallOnPressed, isTrue); diff --git a/packages/remix/test/components/checkbox_test.dart b/packages/remix/test/components/checkbox_test.dart deleted file mode 100644 index 7c7d9cd58..000000000 --- a/packages/remix/test/components/checkbox_test.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:remix/components/checkbox/checkbox.dart'; - -void main() { - group('RemixCheckbox', () { - testWidgets( - 'when pressed must call the onChanged with the oposite value of isChecked', - (tester) async { - const isChecked = true; - - await tester.pumpWidget( - MaterialApp( - home: RemixCheckbox( - value: isChecked, - label: 'Checkbox', - onChanged: (value) { - expect(value, !isChecked); - }, - ), - ), - ); - - await tester.tap(find.byType(RemixCheckbox)); - await tester.pumpAndSettle(); - }); - - testWidgets('when disabled must not call onChanged', - (WidgetTester tester) async { - bool didCallOnChanged = false; - - await tester.pumpWidget(MaterialApp( - home: Scaffold( - body: RemixCheckbox( - value: false, - disabled: true, - onChanged: (value) { - didCallOnChanged = true; - }, - ), - ), - )); - - await tester.tap(find.byType(RemixCheckbox)); - await tester.pumpAndSettle(); - - expect(didCallOnChanged, false); - }); - - testWidgets('initially checked or unchecked based on isChecked value', - (WidgetTester tester) async { - for (var isChecked in [true, false]) { - await tester.pumpWidget(MaterialApp( - home: RemixCheckbox( - value: isChecked, - label: 'Checkbox', - onChanged: (value) {}, - ), - )); - - expect( - find.byWidgetPredicate( - (widget) => widget is RemixCheckbox && widget.value == isChecked, - ), - findsOneWidget, - ); - } - }); - - testWidgets('label is displayed correctly', (WidgetTester tester) async { - const label = 'Test Checkbox'; - - await tester.pumpWidget(MaterialApp( - home: RemixCheckbox( - value: false, - label: label, - onChanged: (value) {}, - ), - )); - - expect( - find.byWidgetPredicate( - (widget) => widget is Text && widget.data == label, - ), - findsOneWidget, - ); - }); - - testWidgets('correct icon is displayed based on isChecked value', - (WidgetTester tester) async { - const iconChecked = Icons.star; - const iconUnchecked = Icons.star_border; - - for (var isChecked in [true, false]) { - await tester.pumpWidget(MaterialApp( - home: RemixCheckbox( - value: isChecked, - iconChecked: iconChecked, - iconUnchecked: iconUnchecked, - label: 'Checkbox', - onChanged: (value) {}, - ), - )); - - expect( - find.byWidgetPredicate( - (widget) => - widget is Icon && - widget.icon == (isChecked ? iconChecked : iconUnchecked), - ), - findsOneWidget, - ); - } - }); - }); -} diff --git a/packages/remix/test/components/radio_test.dart b/packages/remix/test/components/radio_test.dart deleted file mode 100644 index ee994c5ae..000000000 --- a/packages/remix/test/components/radio_test.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:remix/components/radio/radio.dart'; - -void main() { - group('RemixRadio', () { - testWidgets( - 'when pressed must call the onChanged with the oposite value of isChecked', - (tester) async { - const isActive = true; - - await tester.pumpWidget( - MaterialApp( - home: RemixRadio( - active: isActive, - label: 'Radio', - onChanged: (value) { - expect(value, !isActive); - }, - ), - ), - ); - - await tester.tap(find.byType(RemixRadio)); - await tester.pumpAndSettle(const Duration(milliseconds: 150)); - }); - - testWidgets('when disabled must not call onChanged', - (WidgetTester tester) async { - bool didCallOnChanged = false; - - await tester.pumpWidget(MaterialApp( - home: Scaffold( - body: RemixRadio( - active: false, - disabled: true, - onChanged: (value) { - didCallOnChanged = true; - }, - ), - ), - )); - - await tester.tap(find.byType(RemixRadio)); - await tester.pumpAndSettle(const Duration(milliseconds: 150)); - - expect(didCallOnChanged, isFalse); - }); - - testWidgets('initially checked or unchecked based on isChecked value', - (WidgetTester tester) async { - for (var isChecked in [true, false]) { - await tester.pumpWidget(MaterialApp( - home: RemixRadio( - active: isChecked, - label: 'Radio', - onChanged: (value) {}, - ), - )); - - expect( - find.byWidgetPredicate( - (widget) => widget is RemixRadio && widget.active == isChecked, - ), - findsOneWidget, - ); - } - }); - - testWidgets('label is displayed correctly', (WidgetTester tester) async { - const label = 'Test Radio'; - - await tester.pumpWidget(MaterialApp( - home: RemixRadio( - active: false, - label: label, - onChanged: (value) {}, - ), - )); - - expect( - find.byWidgetPredicate( - (widget) => widget is Text && widget.data == label, - ), - findsOneWidget, - ); - }); - }); -} diff --git a/packages/remix/test/components/switch_test.dart b/packages/remix/test/components/switch_test.dart deleted file mode 100644 index e2922f7fd..000000000 --- a/packages/remix/test/components/switch_test.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:remix/components/switch/switch.dart'; - -void main() { - group('RemixSwitch', () { - testWidgets( - 'when pressed must call the onChanged with the opposite value of isChecked', - (tester) async { - const isActive = true; - - await tester.pumpWidget( - MaterialApp( - home: RemixSwitch( - active: isActive, - onChanged: (value) { - expect(value, !isActive); - }, - ), - ), - ); - - await tester.tap(find.byType(RemixSwitch)); - await tester.pumpAndSettle(const Duration(milliseconds: 150)); - }); - - testWidgets('when disabled must not call onChanged', - (WidgetTester tester) async { - bool didCallOnChanged = false; - - await tester.pumpWidget(MaterialApp( - home: Scaffold( - body: RemixSwitch( - active: false, - disabled: true, - onChanged: (value) { - didCallOnChanged = true; - }, - ), - ), - )); - - await tester.tap(find.byType(RemixSwitch)); - await tester.pumpAndSettle(const Duration(milliseconds: 150)); - - expect(didCallOnChanged, isFalse); - }); - - testWidgets('initially checked or unchecked based on isChecked value', - (WidgetTester tester) async { - for (var isChecked in [true, false]) { - await tester.pumpWidget(MaterialApp( - home: RemixSwitch( - active: isChecked, - onChanged: (value) {}, - ), - )); - - expect( - find.byWidgetPredicate( - (widget) => widget is RemixSwitch && widget.active == isChecked, - ), - findsOneWidget, - ); - } - }); - }); -} From ebc4ec1c337e7e2ab1970d6f7017dd6ae531c0a3 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Fri, 21 Jun 2024 19:11:53 -0400 Subject: [PATCH 03/24] Spinner component --- packages/remix/analysis_options.yaml | 1 + .../remix/demo/lib/components/button.dart | 10 +- .../remix/lib/components/button/button.dart | 45 ++-- .../lib/components/button/button.style.dart | 54 +++- .../components/button/button.variants.dart | 1 + .../lib/components/button/button_spec.dart | 8 +- .../lib/components/button/button_spec.g.dart | 16 +- .../painters/dotted_spinner_painter.dart | 47 ++++ .../painters/solid_spinner_painter.dart | 40 +++ .../remix/lib/components/spinner/spinner.dart | 96 +++++++ .../lib/components/spinner/spinner.style.dart | 11 + .../components/spinner/spinner.variants.dart | 16 ++ .../lib/components/spinner/spinner_spec.dart | 54 ++++ .../components/spinner/spinner_spec.g.dart | 251 ++++++++++++++++++ packages/remix/pubspec.yaml | 2 +- 15 files changed, 605 insertions(+), 47 deletions(-) create mode 100644 packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart create mode 100644 packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart create mode 100644 packages/remix/lib/components/spinner/spinner.dart create mode 100644 packages/remix/lib/components/spinner/spinner.style.dart create mode 100644 packages/remix/lib/components/spinner/spinner.variants.dart create mode 100644 packages/remix/lib/components/spinner/spinner_spec.dart create mode 100644 packages/remix/lib/components/spinner/spinner_spec.g.dart diff --git a/packages/remix/analysis_options.yaml b/packages/remix/analysis_options.yaml index 61b6c4de1..f93a130ef 100644 --- a/packages/remix/analysis_options.yaml +++ b/packages/remix/analysis_options.yaml @@ -22,6 +22,7 @@ linter: # `// ignore_for_file: name_of_lint` syntax on the line or in the file # producing the lint. rules: + library_private_types_in_public_api: false # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button.dart index f017024fb..3d1ae3fea 100644 --- a/packages/remix/demo/lib/components/button.dart +++ b/packages/remix/demo/lib/components/button.dart @@ -36,7 +36,13 @@ Widget buildButtonUseCase(BuildContext context) { ); } - return Center( - child: Wrap(children: ButtonType.values.map(buildButton).toList()), + return Container( + color: Colors.white, + child: Center( + child: Wrap( + spacing: 12, + children: ButtonType.values.map(buildButton).toList(), + ), + ), ); } diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button.dart index d7ce22e03..b5efa0e74 100644 --- a/packages/remix/lib/components/button/button.dart +++ b/packages/remix/lib/components/button/button.dart @@ -37,34 +37,21 @@ class RXButton extends StatelessWidget { .applyVariants([size, type]).animate(); } - List _buildChildren(IconSpec iconSpec, TextSpec labelSpec) { - return loading - ? _buildLoadingChildren(iconSpec, labelSpec) - : _buildDefaultChildren(iconSpec, labelSpec); + List _buildChildren(ButtonSpec spec) { + return loading ? _buildLoadingChildren(spec) : _buildDefaultChildren(spec); } - List _buildLoadingChildren(IconSpec iconSpec, TextSpec labelSpec) => [ - _buildLoadingIndicator(iconSpec), - if (loadingLabel != null) labelSpec(loadingLabel!), - ]; - - Widget _buildLoadingIndicator(IconSpec iconSpec) { - const indicatorWidth = 2.5; - - return SizedBox( - width: iconSpec.size, - height: iconSpec.size, - child: CircularProgressIndicator( - strokeWidth: indicatorWidth, - color: iconSpec.color, - ), - ); + List _buildLoadingChildren(ButtonSpec spec) { + return [ + spec.spinner(), + if (loadingLabel != null) spec.label(loadingLabel!), + ]; } - List _buildDefaultChildren(IconSpec iconSpec, TextSpec labelSpec) => [ - if (iconLeft != null) iconSpec(iconLeft), - if (label.isNotEmpty) labelSpec(label), - if (iconRight != null) iconSpec(iconRight), + List _buildDefaultChildren(ButtonSpec spec) => [ + if (iconLeft != null) spec.icon(iconLeft), + if (label.isNotEmpty) spec.label(label), + if (iconRight != null) spec.icon(iconRight), ]; @override @@ -74,17 +61,15 @@ class RXButton extends StatelessWidget { child: SpecBuilder( style: _buildStyle(), builder: (context) { - final buttonSpec = ButtonSpec.of(context); + var spec = ButtonSpec.of(context); - final containerSpec = buttonSpec.container; - final flexSpec = buttonSpec.flex; - final iconSpec = buttonSpec.icon; - final labelSpec = buttonSpec.label; + final containerSpec = spec.container; + final flexSpec = spec.flex; return containerSpec( child: flexSpec( direction: Axis.horizontal, - children: _buildChildren(iconSpec, labelSpec), + children: _buildChildren(spec), ), ); }), diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 85eee3a44..7012a3050 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -8,14 +8,7 @@ import 'package:remix/components/button/button_spec.dart'; final _button = ButtonSpecUtility.self; Style get defaultButtonStyle => Style( - _button.flex.gap(6), - _button.flex.mainAxisAlignment.center(), - _button.flex.crossAxisAlignment.center(), - _button.flex.mainAxisSize.min(), - _button.container.borderRadius(6), - _button.label.style.height(1.1), - _button.label.style.letterSpacing(0.5), - _button.label.style.fontWeight(FontWeight.w600), + _baseStyle(), /// Size Variants _xsmallVariant(), @@ -30,6 +23,21 @@ Style get defaultButtonStyle => Style( _ghostVariant(), _linkVariant(), _destructiveVariant(), + _futuristic(), + ); + +Style get _baseStyle => Style( + _button.flex.gap(6), + _button.flex.mainAxisAlignment.center(), + _button.flex.crossAxisAlignment.center(), + _button.flex.mainAxisSize.min(), + _button.container.borderRadius(6), + _button.label.style.height(1.1), + _button.label.style.letterSpacing(0.5), + _button.label.style.fontWeight(FontWeight.w600), + _button.spinner.strokeWidth(.5), + _button.spinner.color(Colors.black), + _button.spinner.size(24), ); Style get _xsmallVariant { @@ -79,6 +87,10 @@ Style get _primaryVariant { ButtonType.primary( _button.container.color.black(), _button.icon.color(Colors.white), + _button.spinner.color(Colors.green), + _button.spinner.strokeWidth(1), + _button.spinner.duration.milliseconds(6000), + _button.spinner.style.dotted(), _button.label.style.color.white(), $on.hover( _button.container.color.black87(), @@ -87,11 +99,31 @@ Style get _primaryVariant { ); } +Style get _futuristic { + return Style( + ButtonType.futuristic( + _button.container.color.transparent(), + _button.container.shape.beveledRectangle.borderRadius(10, 0, 0, 10), + _button.container.shape.beveledRectangle.side.color(Colors.green), + _button.icon.color(Colors.black), + _button.spinner.color(Colors.green), + _button.spinner.strokeWidth(1), + _button.spinner.duration.milliseconds(6000), + _button.spinner.style.dotted(), + _button.label.style.color.black(), + $on.hover( + _button.container.color.black87(), + ), + ), + ); +} + Style get _secondaryVariant { return Style( ButtonType.secondary( _button.container.color.grey.shade200(), _button.icon.color(Colors.black), + _button.spinner.color(Colors.black), _button.label.style.color.black87(), $on.hover( _button.container.color.grey.shade100(), @@ -118,10 +150,8 @@ Style get _outlineVariant { ButtonType.outline( _button.container.color.transparent(), _button.label.style.color.black(), - _button.container.border.width(1.5), - _button.container.border.color.black12(), - _button.container.shadow.color(Colors.black12.withOpacity(0.1)), - _button.container.shadow.blurRadius(1), + _button.container.border.width(0.5), + _button.container.border.color(Colors.black), _button.icon.color(Colors.black), ), ); diff --git a/packages/remix/lib/components/button/button.variants.dart b/packages/remix/lib/components/button/button.variants.dart index b6b3f2ff9..d03edd694 100644 --- a/packages/remix/lib/components/button/button.variants.dart +++ b/packages/remix/lib/components/button/button.variants.dart @@ -24,6 +24,7 @@ class ButtonType extends ButtonVariant { static const outline = ButtonType('remix.button.outline'); static const ghost = ButtonType('remix.button.ghost'); static const link = ButtonType('remix.button.link'); + static const futuristic = ButtonType('remix.button.link'); static List get values => [ primary, diff --git a/packages/remix/lib/components/button/button_spec.dart b/packages/remix/lib/components/button/button_spec.dart index 6729eeb8f..e3216dfe6 100644 --- a/packages/remix/lib/components/button/button_spec.dart +++ b/packages/remix/lib/components/button/button_spec.dart @@ -1,6 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:mix/mix.dart'; import 'package:mix_annotations/mix_annotations.dart'; +import 'package:remix/components/spinner/spinner_spec.dart'; part 'button_spec.g.dart'; @@ -11,6 +12,9 @@ base class ButtonSpec extends Spec with _$ButtonSpec { final IconSpec icon; final TextSpec label; + @MixableProperty(dto: MixableFieldDto(type: 'SpinnerSpecAttribute')) + final SpinnerSpec spinner; + /// {@macro button_spec_of} static const of = _$ButtonSpec.of; @@ -21,9 +25,11 @@ base class ButtonSpec extends Spec with _$ButtonSpec { FlexSpec? flex, IconSpec? icon, TextSpec? label, + SpinnerSpec? spinner, super.animated, }) : flex = flex ?? const FlexSpec(), container = container ?? const BoxSpec(), icon = icon ?? const IconSpec(), - label = label ?? const TextSpec(); + label = label ?? const TextSpec(), + spinner = spinner ?? const SpinnerSpec(); } diff --git a/packages/remix/lib/components/button/button_spec.g.dart b/packages/remix/lib/components/button/button_spec.g.dart index 558cd420c..097c249bd 100644 --- a/packages/remix/lib/components/button/button_spec.g.dart +++ b/packages/remix/lib/components/button/button_spec.g.dart @@ -37,6 +37,7 @@ base mixin _$ButtonSpec on Spec { FlexSpec? flex, IconSpec? icon, TextSpec? label, + SpinnerSpec? spinner, AnimatedData? animated, }) { return ButtonSpec( @@ -44,6 +45,7 @@ base mixin _$ButtonSpec on Spec { flex: flex ?? _$this.flex, icon: icon ?? _$this.icon, label: label ?? _$this.label, + spinner: spinner ?? _$this.spinner, animated: animated ?? _$this.animated, ); } @@ -64,7 +66,7 @@ base mixin _$ButtonSpec on Spec { /// - [IconSpec.lerp] for [icon]. /// - [TextSpec.lerp] for [label]. - /// For [animated], the interpolation is performed using a step function. + /// For [spinner] and [animated], the interpolation is performed using a step function. /// If [t] is less than 0.5, the value from the current [ButtonSpec] is used. Otherwise, the value /// from the [other] [ButtonSpec] is used. /// @@ -79,6 +81,7 @@ base mixin _$ButtonSpec on Spec { flex: _$this.flex.lerp(other.flex, t), icon: _$this.icon.lerp(other.icon, t), label: _$this.label.lerp(other.label, t), + spinner: t < 0.5 ? _$this.spinner : other.spinner, animated: t < 0.5 ? _$this.animated : other.animated, ); } @@ -93,6 +96,7 @@ base mixin _$ButtonSpec on Spec { _$this.flex, _$this.icon, _$this.label, + _$this.spinner, _$this.animated, ]; @@ -111,12 +115,14 @@ final class ButtonSpecAttribute extends SpecAttribute { final FlexSpecAttribute? flex; final IconSpecAttribute? icon; final TextSpecAttribute? label; + final SpinnerSpecAttribute? spinner; const ButtonSpecAttribute({ this.container, this.flex, this.icon, this.label, + this.spinner, super.animated, }); @@ -135,6 +141,7 @@ final class ButtonSpecAttribute extends SpecAttribute { flex: flex?.resolve(mix), icon: icon?.resolve(mix), label: label?.resolve(mix), + spinner: spinner?.resolve(mix), animated: animated?.resolve(mix) ?? mix.animation, ); } @@ -156,6 +163,7 @@ final class ButtonSpecAttribute extends SpecAttribute { flex: flex?.merge(other.flex) ?? other.flex, icon: icon?.merge(other.icon) ?? other.icon, label: label?.merge(other.label) ?? other.label, + spinner: spinner?.merge(other.spinner) ?? other.spinner, animated: animated?.merge(other.animated) ?? other.animated, ); } @@ -170,6 +178,7 @@ final class ButtonSpecAttribute extends SpecAttribute { flex, icon, label, + spinner, animated, ]; } @@ -192,6 +201,9 @@ base class ButtonSpecUtility /// Utility for defining [ButtonSpecAttribute.label] late final label = TextSpecUtility((v) => only(label: v)); + /// Utility for defining [ButtonSpecAttribute.spinner] + late final spinner = SpinnerSpecUtility((v) => only(spinner: v)); + /// Utility for defining [ButtonSpecAttribute.animated] late final animated = AnimatedUtility((v) => only(animated: v)); @@ -206,6 +218,7 @@ base class ButtonSpecUtility FlexSpecAttribute? flex, IconSpecAttribute? icon, TextSpecAttribute? label, + SpinnerSpecAttribute? spinner, AnimatedDataDto? animated, }) { return builder(ButtonSpecAttribute( @@ -213,6 +226,7 @@ base class ButtonSpecUtility flex: flex, icon: icon, label: label, + spinner: spinner, animated: animated, )); } diff --git a/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart b/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart new file mode 100644 index 000000000..1bbb1572c --- /dev/null +++ b/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart @@ -0,0 +1,47 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:remix/components/spinner/spinner_spec.dart'; + +class DottedSpinnerPainter extends CustomPainter { + final Animation? animation; + final SpinnerSpec spec; + + DottedSpinnerPainter({ + this.animation, + required this.spec, + }) : super(repaint: animation); + + @override + void paint(Canvas canvas, Size size) { + final specStrokeWidth = spec.strokeWidth ?? 1; + + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 2 * specStrokeWidth; + + canvas.translate(size.width / 2, size.height / 2); + + final radius = min(size.width, size.height) / 2 - paint.strokeWidth; + const lines = 12; + const lineAngle = 2 * pi / lines; + + for (int i = 0; i < lines; i++) { + final angle = i * lineAngle; + final opacity = (lines - i + animation!.value * lines) % lines / lines; + + paint.color = spec.color.withOpacity(opacity); + + final lineHeight = radius * 0.45; + + canvas.drawLine( + Offset(radius * 0.9 * cos(angle), radius * 0.9 * sin(angle)), + Offset(lineHeight * cos(angle), lineHeight * sin(angle)), + paint, + ); + } + } + + @override + bool shouldRepaint(DottedSpinnerPainter oldDelegate) => true; +} diff --git a/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart b/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart new file mode 100644 index 000000000..adc546b6f --- /dev/null +++ b/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart @@ -0,0 +1,40 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:remix/components/spinner/spinner_spec.dart'; + +class SolidSpinnerPainter extends CustomPainter { + final Animation? animation; + final SpinnerSpec spec; + + SolidSpinnerPainter({ + this.animation, + required this.spec, + }) : super(repaint: animation); + + @override + void paint(Canvas canvas, Size size) { + final specStrokeWidth = spec.strokeWidth ?? 1; + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 2 * specStrokeWidth + ..color = spec.color; + + canvas.translate(size.width / 2, size.height / 2); + + final radius = min(size.width, size.height) / 2 - paint.strokeWidth; + const startAngle = pi / 3; + const sweepAngle = 2 * pi / 3; + + canvas.drawArc( + Rect.fromCircle(center: Offset.zero, radius: radius), + startAngle + animation!.value * 2 * pi, + sweepAngle, + false, + paint, + ); + } + + @override + bool shouldRepaint(SolidSpinnerPainter oldDelegate) => true; +} diff --git a/packages/remix/lib/components/spinner/spinner.dart b/packages/remix/lib/components/spinner/spinner.dart new file mode 100644 index 000000000..3365cd61d --- /dev/null +++ b/packages/remix/lib/components/spinner/spinner.dart @@ -0,0 +1,96 @@ +// ignore_for_file: library_private_types_in_public_api + +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/spinner/painters/dotted_spinner_painter.dart'; +import 'package:remix/components/spinner/painters/solid_spinner_painter.dart'; +import 'package:remix/components/spinner/spinner.style.dart'; +import 'package:remix/components/spinner/spinner.variants.dart'; +import 'package:remix/components/spinner/spinner_spec.dart'; + +class RXSpinner extends StatelessWidget { + const RXSpinner({ + this.style, + super.key, + this.size = SpinnerSize.medium, + }); + + final Style? style; + final SpinnerSize size; + + Style _buildStyle() { + return defaultSpinnerStyle.merge(style).applyVariants([size]).animate(); + } + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spinnerSpec = SpinnerSpec.of(context); + return RxSpinnerSpecWidget(spec: spinnerSpec); + }, + ); + } +} + +class RxSpinnerSpecWidget extends StatefulWidget { + const RxSpinnerSpecWidget({ + this.spec = const SpinnerSpec(), + super.key, + }); + + final SpinnerSpec spec; + + @override + _RxSpinnerSpecWidgetState createState() => _RxSpinnerSpecWidgetState(); +} + +class _RxSpinnerSpecWidgetState extends State + with SingleTickerProviderStateMixin { + late AnimationController controller; + + @override + void initState() { + super.initState(); + controller = AnimationController( + duration: widget.spec.duration, + vsync: this, + )..repeat(); + } + + @override + void didUpdateWidget(covariant RxSpinnerSpecWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.spec.duration != widget.spec.duration) { + controller.duration = widget.spec.duration; + controller.repeat(); + } + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final painter = widget.spec.style == SpinnerStyle.dotted + ? DottedSpinnerPainter(animation: controller, spec: widget.spec) + : SolidSpinnerPainter(animation: controller, spec: widget.spec); + + return AnimatedBuilder( + animation: controller, + builder: (context, child) { + return SizedBox( + width: widget.spec.size, + height: widget.spec.size, + child: CustomPaint( + painter: painter, + ), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/spinner/spinner.style.dart b/packages/remix/lib/components/spinner/spinner.style.dart new file mode 100644 index 000000000..1b039f870 --- /dev/null +++ b/packages/remix/lib/components/spinner/spinner.style.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/spinner/spinner_spec.dart'; + +final _spinner = SpinnerSpecUtility.self; + +Style get defaultSpinnerStyle => Style( + _spinner.strokeWidth(2), + _spinner.color(Colors.black), + _spinner.size(24), + ); diff --git a/packages/remix/lib/components/spinner/spinner.variants.dart b/packages/remix/lib/components/spinner/spinner.variants.dart new file mode 100644 index 000000000..6e3d990c2 --- /dev/null +++ b/packages/remix/lib/components/spinner/spinner.variants.dart @@ -0,0 +1,16 @@ +import 'package:mix/mix.dart'; + +class SpinnerVariant extends Variant { + const SpinnerVariant(super.name); +} + +class SpinnerSize extends SpinnerVariant { + const SpinnerSize(super.name); + + static const xsmall = SpinnerSize('remix.spinner.xsmall'); + static const small = SpinnerSize('remix.spinner.small'); + static const medium = SpinnerSize('remix.spinner.medium'); + static const large = SpinnerSize('remix.spinner.large'); + + static List get values => [xsmall, small, medium, large]; +} diff --git a/packages/remix/lib/components/spinner/spinner_spec.dart b/packages/remix/lib/components/spinner/spinner_spec.dart new file mode 100644 index 000000000..9aa5a35dc --- /dev/null +++ b/packages/remix/lib/components/spinner/spinner_spec.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; +import 'package:remix/components/spinner/spinner.dart'; + +part 'spinner_spec.g.dart'; + +enum SpinnerStyle { + solid, + dotted, +} + +@MixableSpec() +final class SpinnerSpec extends Spec with _$SpinnerSpec { + /// Size of the spinner + final double size; + + /// Width of the stroke of the line + /// Needs to be a double between 0 and 1 + final double? strokeWidth; + + /// Color of the spinner line + final Color color; + + /// Duration of a full cycle of spin + final Duration duration; + + final SpinnerStyle style; + + static const of = _$SpinnerSpec.of; + static const from = _$SpinnerSpec.from; + + const SpinnerSpec({ + double? size, + this.strokeWidth, + Color? color, + Duration? duration, + SpinnerStyle? style, + super.animated, + }) : size = size ?? 24, + color = color ?? Colors.white, + style = style ?? SpinnerStyle.solid, + duration = duration ?? const Duration(milliseconds: 500); + + Widget call() => RxSpinnerSpecWidget(spec: this); +} + +final class SpinnerStyleUtility + extends ScalarUtility { + SpinnerStyleUtility(super.builder); + + T dotted() => call(SpinnerStyle.dotted); + T solid() => call(SpinnerStyle.solid); +} diff --git a/packages/remix/lib/components/spinner/spinner_spec.g.dart b/packages/remix/lib/components/spinner/spinner_spec.g.dart new file mode 100644 index 000000000..5b9c1e514 --- /dev/null +++ b/packages/remix/lib/components/spinner/spinner_spec.g.dart @@ -0,0 +1,251 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'spinner_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$SpinnerSpec on Spec { + static SpinnerSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const SpinnerSpec(); + } + + /// {@template spinner_spec_of} + /// Retrieves the [SpinnerSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [SpinnerSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [SpinnerSpec]. + /// + /// Example: + /// + /// ```dart + /// final spinnerSpec = SpinnerSpec.of(context); + /// ``` + /// {@endtemplate} + static SpinnerSpec of(BuildContext context) { + return _$SpinnerSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [SpinnerSpec] but with the given fields + /// replaced with the new values. + @override + SpinnerSpec copyWith({ + double? size, + double? strokeWidth, + Color? color, + Duration? duration, + SpinnerStyle? style, + AnimatedData? animated, + }) { + return SpinnerSpec( + size: size ?? _$this.size, + strokeWidth: strokeWidth ?? _$this.strokeWidth, + color: color ?? _$this.color, + duration: duration ?? _$this.duration, + style: style ?? _$this.style, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [SpinnerSpec] and another [SpinnerSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [SpinnerSpec] is returned. When [t] is 1.0, the [other] [SpinnerSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [SpinnerSpec] is returned. + /// + /// If [other] is null, this method returns the current [SpinnerSpec] instance. + /// + /// The interpolation is performed on each property of the [SpinnerSpec] using the appropriate + /// interpolation method: + /// + /// - [MixHelpers.lerpDouble] for [size] and [strokeWidth]. + /// - [Color.lerp] for [color]. + + /// For [duration] and [style] and [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [SpinnerSpec] is used. Otherwise, the value + /// from the [other] [SpinnerSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [SpinnerSpec] configurations. + @override + SpinnerSpec lerp(SpinnerSpec? other, double t) { + if (other == null) return _$this; + + return SpinnerSpec( + size: MixHelpers.lerpDouble(_$this.size, other.size, t), + strokeWidth: + MixHelpers.lerpDouble(_$this.strokeWidth, other.strokeWidth, t), + color: Color.lerp(_$this.color, other.color, t), + duration: t < 0.5 ? _$this.duration : other.duration, + style: t < 0.5 ? _$this.style : other.style, + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [SpinnerSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [SpinnerSpec] instances for equality. + @override + List get props => [ + _$this.size, + _$this.strokeWidth, + _$this.color, + _$this.duration, + _$this.style, + _$this.animated, + ]; + + SpinnerSpec get _$this => this as SpinnerSpec; +} + +/// Represents the attributes of a [SpinnerSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [SpinnerSpec]. +/// +/// Use this class to configure the attributes of a [SpinnerSpec] and pass it to +/// the [SpinnerSpec] constructor. +final class SpinnerSpecAttribute extends SpecAttribute { + final double? size; + final double? strokeWidth; + final ColorDto? color; + final Duration? duration; + final SpinnerStyle? style; + + const SpinnerSpecAttribute({ + this.size, + this.strokeWidth, + this.color, + this.duration, + this.style, + super.animated, + }); + + /// Resolves to [SpinnerSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final spinnerSpec = SpinnerSpecAttribute(...).resolve(mix); + /// ``` + @override + SpinnerSpec resolve(MixData mix) { + return SpinnerSpec( + size: size, + strokeWidth: strokeWidth, + color: color?.resolve(mix), + duration: duration, + style: style, + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [SpinnerSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [SpinnerSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + SpinnerSpecAttribute merge(SpinnerSpecAttribute? other) { + if (other == null) return this; + + return SpinnerSpecAttribute( + size: other.size, + strokeWidth: other.strokeWidth ?? strokeWidth, + color: color?.merge(other.color) ?? other.color, + duration: other.duration, + style: other.style, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [SpinnerSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [SpinnerSpecAttribute] instances for equality. + @override + List get props => [ + size, + strokeWidth, + color, + duration, + style, + animated, + ]; +} + +/// Utility class for configuring [SpinnerSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [SpinnerSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [SpinnerSpecAttribute]. +base class SpinnerSpecUtility + extends SpecUtility { + /// Utility for defining [SpinnerSpecAttribute.size] + late final size = DoubleUtility((v) => only(size: v)); + + /// Utility for defining [SpinnerSpecAttribute.strokeWidth] + late final strokeWidth = DoubleUtility((v) => only(strokeWidth: v)); + + /// Utility for defining [SpinnerSpecAttribute.color] + late final color = ColorUtility((v) => only(color: v)); + + /// Utility for defining [SpinnerSpecAttribute.duration] + late final duration = DurationUtility((v) => only(duration: v)); + + /// Utility for defining [SpinnerSpecAttribute.style] + late final style = SpinnerStyleUtility((v) => only(style: v)); + + /// Utility for defining [SpinnerSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + SpinnerSpecUtility(super.builder); + + static final self = SpinnerSpecUtility((v) => v); + + /// Returns a new [SpinnerSpecAttribute] with the specified properties. + @override + T only({ + double? size, + double? strokeWidth, + ColorDto? color, + Duration? duration, + SpinnerStyle? style, + AnimatedDataDto? animated, + }) { + return builder(SpinnerSpecAttribute( + size: size, + strokeWidth: strokeWidth, + color: color, + duration: duration, + style: style, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [SpinnerSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [SpinnerSpec] specifications. +class SpinnerSpecTween extends Tween { + SpinnerSpecTween({ + super.begin, + super.end, + }); + + @override + SpinnerSpec lerp(double t) { + if (begin == null && end == null) return const SpinnerSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/pubspec.yaml b/packages/remix/pubspec.yaml index 987aefdc7..f14bd52e5 100644 --- a/packages/remix/pubspec.yaml +++ b/packages/remix/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - mix: ^1.1.1 + mix: ^1.1.2 mix_annotations: ^0.1.0 dev_dependencies: From 3d3b8da9e1fcc28f6dd0db75b32c0cffd8d794d4 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Fri, 28 Jun 2024 18:31:44 -0400 Subject: [PATCH 04/24] Implemented tokens and loading behavior --- .all-contributorsrc | 92 - .fvmrc | 5 +- .gitignore | 6 +- mix.code-workspace | 8 +- .../lib/src/attributes/border/border_dto.dart | 9 +- .../attributes/text_style/text_style_dto.dart | 8 +- .../lib/src/builders/method_merge.dart | 9 +- packages/remix/.vscode/launch.json | 3 +- packages/remix/analysis_options.yaml | 26 +- .../remix/demo/lib/components/button.dart | 9 +- packages/remix/demo/lib/main.dart | 6 +- .../ephemeral/FlutterInputs.xcfilelist | 29 +- packages/remix/demo/pubspec.yaml | 2 +- .../remix/lib/components/button/button.dart | 47 +- .../lib/components/button/button.style.dart | 266 ++- .../components/button/button.variants.dart | 41 +- .../remix/lib/components/spinner/spinner.dart | 14 +- .../components/spinner/spinner_spec.g.dart | 6 +- packages/remix/lib/helpers/color_palette.dart | 2126 +++++++++++++++++ packages/remix/lib/helpers/color_utils.dart | 168 +- packages/remix/lib/helpers/context_ext.dart | 6 + packages/remix/lib/remix.dart | 1 + packages/remix/lib/tokens/color_tokens.dart | 173 ++ packages/remix/lib/tokens/radius_tokens.dart | 30 + packages/remix/lib/tokens/remix_tokens.dart | 117 + packages/remix/lib/tokens/space_tokens.dart | 38 + .../remix/lib/tokens/text_style_tokens.dart | 80 + .../remix/test/components/button_test.dart | 1 - 28 files changed, 2985 insertions(+), 341 deletions(-) delete mode 100644 .all-contributorsrc create mode 100644 packages/remix/lib/helpers/color_palette.dart create mode 100644 packages/remix/lib/helpers/context_ext.dart create mode 100644 packages/remix/lib/tokens/color_tokens.dart create mode 100644 packages/remix/lib/tokens/radius_tokens.dart create mode 100644 packages/remix/lib/tokens/remix_tokens.dart create mode 100644 packages/remix/lib/tokens/space_tokens.dart create mode 100644 packages/remix/lib/tokens/text_style_tokens.dart diff --git a/.all-contributorsrc b/.all-contributorsrc deleted file mode 100644 index 98c387311..000000000 --- a/.all-contributorsrc +++ /dev/null @@ -1,92 +0,0 @@ -{ - "projectName": "mix", - "projectOwner": "conceptadev", - "repoType": "github", - "repoHost": "https://github.com", - "files": [ - "README.md" - ], - "imageSize": 50, - "commit": true, - "commitConvention": "eslint", - "contributors": [ - { - "login": "leoafarias", - "name": "Leo Farias", - "avatar_url": "https://avatars.githubusercontent.com/u/435833?v=4", - "profile": "https://github.com/leoafarias", - "contributions": [ - "ideas", - "code", - "doc" - ] - }, - { - "login": "bdlukaa", - "name": "Bruno D'Luka", - "avatar_url": "https://avatars.githubusercontent.com/u/45696119?v=4", - "profile": "https://github.com/bdlukaa", - "contributions": [ - "code" - ] - }, - { - "login": "rickbsgu", - "name": "Rick Berger", - "avatar_url": "https://avatars.githubusercontent.com/u/161474?v=4", - "profile": "https://github.com/rickbsgu", - "contributions": [ - "doc" - ] - }, - { - "login": "sbis04", - "name": "Souvik Biswas", - "avatar_url": "https://avatars.githubusercontent.com/u/43280874?v=4", - "profile": "https://github.com/sbis04", - "contributions": [ - "content", - "tutorial" - ] - }, - { - "login": "tilucasoli", - "name": "Lucas Oliveira", - "avatar_url": "https://avatars.githubusercontent.com/u/62367544?v=4", - "profile": "https://github.com/tilucasoli", - "contributions": [ - "code" - ] - }, - { - "login": "pbissonho", - "name": "Pedro Bissonho", - "avatar_url": "https://avatars.githubusercontent.com/u/43250625?v=4", - "profile": "https://www.linkedin.com/in/pedrobissonho/", - "contributions": [ - "code", - "ideas" - ] - }, - { - "login": "marcobraghim", - "name": "Marco A. Braghim", - "avatar_url": "https://avatars.githubusercontent.com/u/2068045?v=4", - "profile": "https://webstandapp.com.br", - "contributions": [ - "code" - ] - }, - { - "login": "aguilaair", - "name": "Eduardo M.", - "avatar_url": "https://avatars.githubusercontent.com/u/29983481?v=4", - "profile": "http://eduardom.dev", - "contributions": [ - "code" - ] - } - ], - "contributorsPerLine": 7, - "commitType": "docs" -} diff --git a/.fvmrc b/.fvmrc index a09a8c2f3..0af42f1bf 100644 --- a/.fvmrc +++ b/.fvmrc @@ -3,5 +3,8 @@ "flavors": { "prod": "stable", "mincompat": "3.10.6" - } + }, + "runPubGetOnSdkChanges": true, + "updateVscodeSettings": true, + "updateGitIgnore": false } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 35a561c1e..96ec726a7 100644 --- a/.gitignore +++ b/.gitignore @@ -88,11 +88,11 @@ node_modules # FVM -# FVM Version Cache -.fvm - .packages .pub/ .dart_tool/ pubspec_overrides.yaml pubspec.lock + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/mix.code-workspace b/mix.code-workspace index 6c533fa66..7148b31e5 100644 --- a/mix.code-workspace +++ b/mix.code-workspace @@ -4,6 +4,10 @@ "name": "mix", "path": "packages/mix" }, + { + "name": "root", + "path": "." + }, { "name": "mix_generator", "path": "packages/mix_generator" @@ -17,8 +21,4 @@ "path": "packages/remix" } ], - "settings": {}, - "extensions": { - "recommendations": [] - } } diff --git a/packages/mix/lib/src/attributes/border/border_dto.dart b/packages/mix/lib/src/attributes/border/border_dto.dart index 14ea2cf4d..2e96f029c 100644 --- a/packages/mix/lib/src/attributes/border/border_dto.dart +++ b/packages/mix/lib/src/attributes/border/border_dto.dart @@ -1,5 +1,5 @@ // ignore_for_file: prefer_relative_imports,avoid-importing-entrypoint-exports -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:mix_annotations/mix_annotations.dart'; @@ -84,7 +84,7 @@ final class BorderDto extends BoxBorderDto with _$BorderDto { bool get isUniform => top == bottom && top == left && top == right; @override - Border get defaultValue => const Border(); + Border get defaultValue => Border.all(color: Colors.transparent, width: 0.0); } @MixableDto(generateUtility: false) @@ -144,7 +144,10 @@ final class BorderSideDto extends Dto with _$BorderSideDto { const BorderSideDto.none() : this(style: BorderStyle.none, width: 0.0); @override - BorderSide get defaultValue => const BorderSide(); + BorderSide get defaultValue => const BorderSide( + width: 0.0, + color: Colors.transparent, + ); } extension BoxBorderExt on BoxBorder { diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart index 3fcdef084..d8786203b 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart @@ -165,7 +165,13 @@ final class TextStyleDto extends Dto with _$TextStyleDto { } extension TextStyleExt on TextStyle { - TextStyleDto toDto() => TextStyleDto._(value: [_toData()]); + TextStyleDto toDto() { + if (this is TextStyleRef) { + return TextStyleDto.ref((this as TextStyleRef).token); + } + return TextStyleDto._(value: [_toData()]); + } + TextStyleData _toData() => TextStyleData( background: background, backgroundColor: backgroundColor?.toDto(), diff --git a/packages/mix_generator/lib/src/builders/method_merge.dart b/packages/mix_generator/lib/src/builders/method_merge.dart index 0f806e537..ac79fff44 100644 --- a/packages/mix_generator/lib/src/builders/method_merge.dart +++ b/packages/mix_generator/lib/src/builders/method_merge.dart @@ -23,10 +23,11 @@ String mergeMethodBuilder({ var propAssignment = '$propName:'; if (field.isListType) { + final listNullable = field.nullable ? '?' : ''; if (shouldMergeLists) { return '$propAssignment ${MixHelperRef.mergeList}($thisName, other.$propName)'; } else { - return '$propAssignment [...$nullable$thisName,...${nullable}other.$propName]'; + return '$propAssignment [...$listNullable$thisName,...${listNullable}other.$propName]'; } } if (field.hasDto) { @@ -49,11 +50,7 @@ String mergeMethodBuilder({ return '$propAssignment $thisName$nullable.merge(other.$propName) ?? other.$propName'; } else { - if (field.nullable) { - return '$propAssignment other.$propName ?? $thisName'; - } else { - return '$propAssignment other.$propName'; - } + return '$propAssignment other.$propName ?? $thisName'; } }).join(',\n '); diff --git a/packages/remix/.vscode/launch.json b/packages/remix/.vscode/launch.json index 4ec263107..369beefba 100644 --- a/packages/remix/.vscode/launch.json +++ b/packages/remix/.vscode/launch.json @@ -9,7 +9,8 @@ "name": "demo", "cwd": "demo", "request": "launch", - "type": "dart" + "type": "dart", + "deviceId": "macos" }, { "name": "demo (profile mode)", diff --git a/packages/remix/analysis_options.yaml b/packages/remix/analysis_options.yaml index f93a130ef..099c1131f 100644 --- a/packages/remix/analysis_options.yaml +++ b/packages/remix/analysis_options.yaml @@ -1,30 +1,6 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. rules: library_private_types_in_public_api: false - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options + non_constant_identifier_names: false diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button.dart index 3d1ae3fea..fd644a074 100644 --- a/packages/remix/demo/lib/components/button.dart +++ b/packages/remix/demo/lib/components/button.dart @@ -8,7 +8,7 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; type: RXButton, ) Widget buildButtonUseCase(BuildContext context) { - Widget buildButton(ButtonType type) { + Widget buildButton(ButtonVariant type) { return RXButton( label: context.knobs.string( label: 'Title', @@ -19,10 +19,6 @@ Widget buildButtonUseCase(BuildContext context) { label: 'Is loading', initialValue: false, ), - loadingLabel: context.knobs.string( - label: 'Loading label', - initialValue: 'Loading', - ), disabled: context.knobs.boolean( label: 'Disabled', initialValue: false, @@ -30,6 +26,7 @@ Widget buildButtonUseCase(BuildContext context) { size: context.knobs.list( label: 'Size', options: ButtonSize.values, + initialOption: ButtonSize.medium, labelBuilder: (value) => value.name.split('.').last, ), type: type, @@ -41,7 +38,7 @@ Widget buildButtonUseCase(BuildContext context) { child: Center( child: Wrap( spacing: 12, - children: ButtonType.values.map(buildButton).toList(), + children: ButtonVariant.values.map(buildButton).toList(), ), ), ); diff --git a/packages/remix/demo/lib/main.dart b/packages/remix/demo/lib/main.dart index b2b270629..5f29e155c 100644 --- a/packages/remix/demo/lib/main.dart +++ b/packages/remix/demo/lib/main.dart @@ -1,5 +1,5 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; import 'package:widgetbook/widgetbook.dart'; import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; @@ -16,6 +16,10 @@ class HotReload extends StatelessWidget { @override Widget build(BuildContext context) { return Widgetbook.material( + appBuilder: (context, child) => MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold(body: Center(child: RemixTokens(child: child))), + ), directories: directories, ); } diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index b8f66e7fd..be5474262 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -667,22 +667,28 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/color/color_directives.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/color/color_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/color/color_util.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/color/material_colors_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/constraints/constraints_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/constraints/constraints_dto.g.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/decoration/decoration_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/decoration/decoration_dto.g.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/decoration/image/decoration_image_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/decoration/image/decoration_image_dto.g.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/enum/enum_util.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/enum/enum_util.g.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gap/gap_util.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gap/spacing_side_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gradient/gradient_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gradient/gradient_dto.g.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/nested_style/nested_style_attribute.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/nested_style/nested_style_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/scalars/scalar_util.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/scalars/scalar_util.g.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/shadow/shadow_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/shadow/shadow_dto.g.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/shadow/shadow_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/spacing/edge_insets_dto.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/spacing/spacing_dto.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/spacing/edge_insets_dto.g.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/spacing/spacing_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/strut_style/strut_style_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/strut_style/strut_style_dto.g.dart @@ -703,6 +709,7 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/core/modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/spec.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/styled_widget.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/core/utility.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/variant.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/build_context_ext.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/compare_mixin.dart @@ -770,9 +777,9 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/variants/context_variant_util/on_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/variants/variant_attribute.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/variants/variants.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/pressable/pressable_state.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/pressable/pressable_util.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/pressable/pressable_widget.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widget_state/pressable_widget.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widget_state/widget_state.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widget_state/widget_state_variant.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widgets.dart /Users/leofarias/Projects/mix/packages/mix_annotations/LICENSE /Users/leofarias/Projects/mix/packages/mix_annotations/lib/mix_annotations.dart @@ -787,7 +794,21 @@ /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/helpers/color_palette.dart +/Users/leofarias/Projects/mix/packages/remix/lib/helpers/context_ext.dart /Users/leofarias/Projects/mix/packages/remix/lib/remix.dart +/Users/leofarias/Projects/mix/packages/remix/lib/tokens/color_tokens.dart +/Users/leofarias/Projects/mix/packages/remix/lib/tokens/radius_tokens.dart +/Users/leofarias/Projects/mix/packages/remix/lib/tokens/remix_tokens.dart +/Users/leofarias/Projects/mix/packages/remix/lib/tokens/space_tokens.dart +/Users/leofarias/Projects/mix/packages/remix/lib/tokens/text_style_tokens.dart /Users/leofarias/fvm/versions/3.10.6/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf /Users/leofarias/fvm/versions/3.10.6/bin/cache/pkg/sky_engine/LICENSE /Users/leofarias/fvm/versions/3.10.6/bin/internal/engine.version diff --git a/packages/remix/demo/pubspec.yaml b/packages/remix/demo/pubspec.yaml index 8a6295e3f..a15026322 100644 --- a/packages/remix/demo/pubspec.yaml +++ b/packages/remix/demo/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.19.2 <4.0.0" + sdk: ">=3.0.6 <4.0.0" dependencies: flutter: diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button.dart index b5efa0e74..dc15c97ee 100644 --- a/packages/remix/lib/components/button/button.dart +++ b/packages/remix/lib/components/button/button.dart @@ -12,9 +12,8 @@ class RXButton extends StatelessWidget { this.loading = false, this.iconLeft, this.iconRight, - this.type = ButtonType.primary, - this.size = ButtonSize.xsmall, - this.loadingLabel, + this.type = ButtonVariant.solid, + this.size = ButtonSize.medium, required this.onPressed, this.style, }); @@ -22,52 +21,56 @@ class RXButton extends StatelessWidget { final String label; final bool disabled; final bool loading; - final String? loadingLabel; + final IconData? iconLeft; final IconData? iconRight; - final ButtonType type; + final ButtonVariant type; final ButtonSize size; final VoidCallback? onPressed; final Style? style; Style _buildStyle() { - return defaultButtonStyle + return buildDefaultButtonStyle() .merge(style) .applyVariants([size, type]).animate(); } List _buildChildren(ButtonSpec spec) { - return loading ? _buildLoadingChildren(spec) : _buildDefaultChildren(spec); - } - - List _buildLoadingChildren(ButtonSpec spec) { + if (loading) { + return [ + Stack( + alignment: Alignment.center, + children: [ + spec.spinner(), + Opacity(opacity: 0.0, child: spec.label(label)), + ], + ) + ]; + } return [ - spec.spinner(), - if (loadingLabel != null) spec.label(loadingLabel!), + if (iconLeft != null) spec.icon(iconLeft), + if (label.isNotEmpty) spec.label(label), + if (iconRight != null) spec.icon(iconRight), ]; } - List _buildDefaultChildren(ButtonSpec spec) => [ - if (iconLeft != null) spec.icon(iconLeft), - if (label.isNotEmpty) spec.label(label), - if (iconRight != null) spec.icon(iconRight), - ]; - @override Widget build(BuildContext context) { + final isDisabled = disabled || loading; return Pressable( onPress: disabled || loading ? null : onPressed, + enabled: !isDisabled, child: SpecBuilder( style: _buildStyle(), builder: (context) { var spec = ButtonSpec.of(context); - final containerSpec = spec.container; - final flexSpec = spec.flex; + final ContainerSpecWidget = spec.container; + final FlexSpecWidget = spec.flex; - return containerSpec( - child: flexSpec( + return ContainerSpecWidget( + child: FlexSpecWidget( direction: Axis.horizontal, children: _buildChildren(spec), ), diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 7012a3050..286d8810a 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -4,181 +4,183 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:remix/components/button/button.variants.dart'; import 'package:remix/components/button/button_spec.dart'; +import 'package:remix/tokens/remix_tokens.dart'; final _button = ButtonSpecUtility.self; +final _label = _button.label; +final _spinner = _button.spinner; +final _container = _button.container; +final _flex = _button.flex; + +/// This applies to the icon, label, and spinner +final _foreground = _button.foreground; + +Style buildDefaultButtonStyle() { + final baseStyle = Style( + _flex.gap(0), + _flex.mainAxisAlignment.center(), + _flex.crossAxisAlignment.center(), + _flex.mainAxisSize.min(), + _container.borderRadius(6), + _label.style.fontWeight(FontWeight.w500), + _spinner.strokeWidth(1), + _label.textHeightBehavior(const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + )), + ); -Style get defaultButtonStyle => Style( - _baseStyle(), - - /// Size Variants - _xsmallVariant(), - _smallVariant(), - _mediumVariant(), - _largeVariant(), - - // Type variants - _primaryVariant(), - _secondaryVariant(), - _outlineVariant(), - _ghostVariant(), - _linkVariant(), - _destructiveVariant(), - _futuristic(), - ); - -Style get _baseStyle => Style( - _button.flex.gap(6), - _button.flex.mainAxisAlignment.center(), - _button.flex.crossAxisAlignment.center(), - _button.flex.mainAxisSize.min(), - _button.container.borderRadius(6), - _button.label.style.height(1.1), - _button.label.style.letterSpacing(0.5), - _button.label.style.fontWeight(FontWeight.w600), - _button.spinner.strokeWidth(.5), - _button.spinner.color(Colors.black), - _button.spinner.size(24), - ); - -Style get _xsmallVariant { - return Style(ButtonSize.xsmall( - _button.container.padding.horizontal(8), - _button.container.padding.vertical(4), - _button.label.style.fontSize(12), - _button.icon.size(12), - )); -} - -Style get _smallVariant { - return Style( + final smallVariant = Style( ButtonSize.small( - _button.container.padding.horizontal(12), - _button.container.padding.vertical(6), - _button.label.style.fontSize(14), - _button.icon.size(14), + _label.style.as($rx.text1()), + _container.padding.vertical($rx.space1()), + _container.padding.horizontal($rx.space2()), + _flex.gap($rx.space1()), + _foreground(size: 12), ), ); -} -Style get _mediumVariant { - return Style( + final mediumVariant = Style( ButtonSize.medium( - _button.container.padding.horizontal(16), - _button.container.padding.vertical(8), - _button.label.style.fontSize(16), - _button.icon.size(16), + _container.padding.vertical($rx.space2()), + _container.padding.horizontal($rx.space3()), + _flex.gap($rx.space2()), + _label.style.as($rx.text2()), + _foreground(size: 14), ), ); -} -Style get _largeVariant { - return Style( + final largeVariant = Style( ButtonSize.large( - _button.container.padding.horizontal(20), - _button.container.padding.vertical(10), - _button.label.style.fontSize(18), - _button.icon.size(18), + _container.padding.vertical($rx.space2()), + _container.padding.horizontal($rx.space4()), + _flex.gap($rx.space3()), + _label.style.as($rx.text3()), + _foreground(size: 16), ), ); -} -Style get _primaryVariant { - return Style( - ButtonType.primary( - _button.container.color.black(), - _button.icon.color(Colors.white), - _button.spinner.color(Colors.green), - _button.spinner.strokeWidth(1), - _button.spinner.duration.milliseconds(6000), - _button.spinner.style.dotted(), - _button.label.style.color.white(), - $on.hover( - _button.container.color.black87(), - ), + final xLargeVariant = Style( + ButtonSize.xlarge( + _container.padding.vertical($rx.space3()), + _container.padding.horizontal($rx.space5()), + _flex.gap($rx.space3()), + _label.style.as($rx.text4()), + _foreground(size: 18), ), ); -} -Style get _futuristic { - return Style( - ButtonType.futuristic( - _button.container.color.transparent(), - _button.container.shape.beveledRectangle.borderRadius(10, 0, 0, 10), - _button.container.shape.beveledRectangle.side.color(Colors.green), - _button.icon.color(Colors.black), - _button.spinner.color(Colors.green), - _button.spinner.strokeWidth(1), - _button.spinner.duration.milliseconds(6000), - _button.spinner.style.dotted(), - _button.label.style.color.black(), + final solidVariant = Style( + ButtonVariant.solid( + _container.color($rx.accent9()), + _foreground(color: Colors.white), + $on.dark( + _foreground(color: Colors.black), + ), $on.hover( - _button.container.color.black87(), + _container.color($rx.accent12()), + ), + $on.disabled( + _container.color($rx.neutral2A()), ), ), ); -} -Style get _secondaryVariant { - return Style( - ButtonType.secondary( - _button.container.color.grey.shade200(), - _button.icon.color(Colors.black), - _button.spinner.color(Colors.black), - _button.label.style.color.black87(), + final softVariant = Style( + ButtonVariant.soft( + _container.color($rx.accent3A()), + _foreground(color: $rx.accent11A()), $on.hover( - _button.container.color.grey.shade100(), + _container.color($rx.accent4A()), + ), + $on.disabled( + _container.color($rx.neutral2A()), ), ), ); -} -Style get _destructiveVariant { - return Style( - ButtonType.destructive( - _button.container.color.redAccent(), - _button.icon.color(Colors.white), - _button.label.style.color.white(), + final surfaceVariant = Style( + ButtonVariant.surface( + _container.color($rx.accent2A()), + _container.border.width(1), + _container.border.color($rx.accent7A()), + _foreground(color: $rx.accent11()), $on.hover( - _button.container.color.redAccent.shade200(), + _container.color($rx.accent3A()), + _container.border.color($rx.accent8A()), + ), + $on.disabled( + _container.color($rx.neutral2A()), + _container.border.color( + $rx.neutral6A(), + ), ), ), ); -} -Style get _outlineVariant { - return Style( - ButtonType.outline( - _button.container.color.transparent(), - _button.label.style.color.black(), - _button.container.border.width(0.5), - _button.container.border.color(Colors.black), - _button.icon.color(Colors.black), + final outlineVariant = Style( + ButtonVariant.outline( + _container.color(Colors.transparent), + _container.border.width(1), + _container.border.color($rx.accent8A()), + _foreground(color: $rx.accent8A()), + $on.hover( + _container.color($rx.accent2A()), + ), + $on.disabled( + _container.border.color( + $rx.neutral6A(), + ), + ), ), ); -} -Style get _ghostVariant { - return Style( - ButtonType.ghost( - _button.container.color.transparent(), - _button.label.style.color.black(), + final ghostVariant = Style( + ButtonVariant.ghost( + _container.border.style.none(), + _container.color(Colors.transparent), + _foreground(color: $rx.accent11A()), $on.hover( - _button.container.color.black12(), + _container.color($rx.accent3A()), ), ), ); -} -Style get _linkVariant { return Style( - ButtonType.link( - _button.label.style.color.black(), - _button.container.color.transparent(), - _button.icon.color(Colors.black), - $on.hover( - _button.label.style.decoration(TextDecoration.underline), - _button.container.color.black12(), + baseStyle(), + + /// Size Variants + smallVariant(), + mediumVariant(), + largeVariant(), + xLargeVariant(), + + // Type variants + solidVariant(), + surfaceVariant(), + softVariant(), + outlineVariant(), + ghostVariant(), + $on.disabled( + _label.style.color( + $rx.neutral6A(), ), + _spinner.color($rx.neutral6A()), ), ); } + +extension ButtonSpecUtilityX on ButtonSpecUtility { + Attribute foreground({Color? color, double? size}) { + final style = Style.create([ + if (color != null) ...[ + label.style.color(color), + icon.color(color), + spinner.color(color), + ], + if (size != null) ...[icon.size(size), spinner.size(size)], + ]); + + return style(); + } +} diff --git a/packages/remix/lib/components/button/button.variants.dart b/packages/remix/lib/components/button/button.variants.dart index d03edd694..9150ab590 100644 --- a/packages/remix/lib/components/button/button.variants.dart +++ b/packages/remix/lib/components/button/button.variants.dart @@ -1,37 +1,34 @@ import 'package:mix/mix.dart'; -abstract class ButtonVariant extends Variant { - const ButtonVariant(super.name); +interface class IButtonVariant extends Variant { + const IButtonVariant(super.name); } -class ButtonSize extends ButtonVariant { +class ButtonSize extends IButtonVariant { const ButtonSize(super.name); - static const xsmall = ButtonSize('remix.button.xsmall'); - static const small = ButtonSize('remix.button.small'); - static const medium = ButtonSize('remix.button.medium'); - static const large = ButtonSize('remix.button.large'); + static const small = ButtonSize('small'); + static const medium = ButtonSize('medium'); + static const large = ButtonSize('large'); + static const xlarge = ButtonSize('xlarge'); - static List get values => [xsmall, small, medium, large]; + static List get values => [small, medium, large, xlarge]; } -class ButtonType extends ButtonVariant { - const ButtonType(super.name); +class ButtonVariant extends IButtonVariant { + const ButtonVariant(super.name); - static const primary = ButtonType('remix.button.primary'); - static const secondary = ButtonType('remix.button.secondary'); - static const destructive = ButtonType('remix.button.destructive'); - static const outline = ButtonType('remix.button.outline'); - static const ghost = ButtonType('remix.button.ghost'); - static const link = ButtonType('remix.button.link'); - static const futuristic = ButtonType('remix.button.link'); + static const solid = ButtonVariant('solid'); + static const soft = ButtonVariant('soft'); + static const surface = ButtonVariant('surface'); + static const outline = ButtonVariant('outline'); + static const ghost = ButtonVariant('ghost'); - static List get values => [ - primary, - secondary, - destructive, + static List get values => [ + solid, + soft, + surface, outline, ghost, - link, ]; } diff --git a/packages/remix/lib/components/spinner/spinner.dart b/packages/remix/lib/components/spinner/spinner.dart index 3365cd61d..5e26b80c2 100644 --- a/packages/remix/lib/components/spinner/spinner.dart +++ b/packages/remix/lib/components/spinner/spinner.dart @@ -27,8 +27,8 @@ class RXSpinner extends StatelessWidget { return SpecBuilder( style: _buildStyle(), builder: (context) { - final spinnerSpec = SpinnerSpec.of(context); - return RxSpinnerSpecWidget(spec: spinnerSpec); + final SpinnerWidget = SpinnerSpec.of(context); + return SpinnerWidget(); }, ); } @@ -83,12 +83,10 @@ class _RxSpinnerSpecWidgetState extends State return AnimatedBuilder( animation: controller, builder: (context, child) { - return SizedBox( - width: widget.spec.size, - height: widget.spec.size, - child: CustomPaint( - painter: painter, - ), + final size = widget.spec.size; + return CustomPaint( + size: Size(size, size), + painter: painter, ); }, ); diff --git a/packages/remix/lib/components/spinner/spinner_spec.g.dart b/packages/remix/lib/components/spinner/spinner_spec.g.dart index 5b9c1e514..81ad8d8b8 100644 --- a/packages/remix/lib/components/spinner/spinner_spec.g.dart +++ b/packages/remix/lib/components/spinner/spinner_spec.g.dart @@ -158,11 +158,11 @@ final class SpinnerSpecAttribute extends SpecAttribute { if (other == null) return this; return SpinnerSpecAttribute( - size: other.size, + size: other.size ?? size, strokeWidth: other.strokeWidth ?? strokeWidth, color: color?.merge(other.color) ?? other.color, - duration: other.duration, - style: other.style, + duration: other.duration ?? duration, + style: other.style ?? style, animated: animated?.merge(other.animated) ?? other.animated, ); } diff --git a/packages/remix/lib/helpers/color_palette.dart b/packages/remix/lib/helpers/color_palette.dart new file mode 100644 index 000000000..cd26a0d10 --- /dev/null +++ b/packages/remix/lib/helpers/color_palette.dart @@ -0,0 +1,2126 @@ +import 'package:flutter/painting.dart'; + +/// Radix color swatch +/// https://www.radix-ui.com/colors/docs/palette-composition/understanding-the-scale +/// + +class RadixColors { + final ColorSwatch swatch; + final ColorSwatch alphaSwatch; + const RadixColors(this.swatch, this.alphaSwatch); + + static const amber = RadixColors(_amber, _amberAlpha); + static const amberDark = RadixColors(_amberDark, _amberDarkAlpha); + static const blackAlpha = RadixColors(_blackAlpha, _blackAlpha); + static const blue = RadixColors(_blue, _blueAlpha); + static const blueDark = RadixColors(_blueDark, _blueDarkAlpha); + static const bronze = RadixColors(_bronze, _bronzeAlpha); + static const bronzeDark = RadixColors(_bronzeDark, _bronzeDarkAlpha); + static const brown = RadixColors(_brown, _brownAlpha); + static const brownDark = RadixColors(_brownDark, _brownDarkAlpha); + static const crimson = RadixColors(_crimson, _crimsonAlpha); + static const crimsonDark = RadixColors(_crimsonDark, _crimsonDarkAlpha); + static const cyan = RadixColors(_cyan, _cyanAlpha); + static const cyanDark = RadixColors(_cyanDark, _cyanDarkAlpha); + static const gold = RadixColors(_gold, _goldAlpha); + static const goldDark = RadixColors(_goldDark, _goldDarkAlpha); + static const gray = RadixColors(_gray, _grayAlpha); + static const grayDark = RadixColors(_grayDark, _grayDarkAlpha); + static const green = RadixColors(_green, _greenAlpha); + static const greenDark = RadixColors(_greenDark, _greenDarkAlpha); + static const indigo = RadixColors(_indigo, _indigoAlpha); + static const indigoDark = RadixColors(_indigoDark, _indigoDarkAlpha); + static const lime = RadixColors(_lime, _limeAlpha); + static const limeDark = RadixColors(_limeDark, _limeDarkAlpha); + static const orange = RadixColors(_orange, _orangeAlpha); + static const orangeDark = RadixColors(_orangeDark, _orangeDarkAlpha); + static const pink = RadixColors(_pink, _pinkAlpha); + static const pinkDark = RadixColors(_pinkDark, _pinkDarkAlpha); + static const purple = RadixColors(_purple, _purpleAlpha); + static const purpleDark = RadixColors(_purpleDark, _purpleDarkAlpha); + static const red = RadixColors(_red, _redAlpha); + static const redDark = RadixColors(_redDark, _redDarkAlpha); + static const teal = RadixColors(_teal, _tealAlpha); + static const tealDark = RadixColors(_tealDark, _tealDarkAlpha); + static const violet = RadixColors(_violet, _violetAlpha); + static const violetDark = RadixColors(_violetDark, _violetDarkAlpha); + static const yellow = RadixColors(_yellow, _yellowAlpha); + static const yellowDark = RadixColors(_yellowDark, _yellowDarkAlpha); + + Color get s1 => swatch[1]!; + Color get s1Alpha => alphaSwatch[1]!; + Color get s2 => swatch[2]!; + Color get s2Alpha => alphaSwatch[2]!; + Color get s3 => swatch[3]!; + Color get s3Alpha => alphaSwatch[3]!; + Color get s4 => swatch[4]!; + Color get s4Alpha => alphaSwatch[4]!; + Color get s5 => swatch[5]!; + Color get s5Alpha => alphaSwatch[5]!; + Color get s6 => swatch[6]!; + Color get s6Alpha => alphaSwatch[6]!; + Color get s7 => swatch[7]!; + Color get s7Alpha => alphaSwatch[7]!; + Color get s8 => swatch[8]!; + Color get s8Alpha => alphaSwatch[8]!; + Color get s9 => swatch[9]!; + Color get s9Alpha => alphaSwatch[9]!; + Color get s10 => swatch[10]!; + Color get s10Alpha => alphaSwatch[10]!; + Color get s11 => swatch[11]!; + Color get s11Alpha => alphaSwatch[11]!; + Color get s12 => swatch[12]!; + Color get s12Alpha => alphaSwatch[12]!; +} + +const _amber = ColorSwatch( + 0xffee9d2b, + { + 1: Color(0xfffefdfb), + 2: Color(0xfffff9ed), + 3: Color(0xfffff4d5), + 4: Color(0xffffecbc), + 5: Color(0xffffe3a2), + 6: Color(0xffffd386), + 7: Color(0xfff3ba63), + 8: Color(0xffee9d2b), + 9: Color(0xffffb224), + 10: Color(0xffffa01c), + 11: Color(0xffad5700), + 12: Color(0xff4e2009) + }, +); + +const _amberAlpha = ColorSwatch( + 0xd4ea8900, + { + 1: Color(0x04c08205), + 2: Color(0x12ffab02), + 3: Color(0x2affbb01), + 4: Color(0x43ffb700), + 5: Color(0x5dffb300), + 6: Color(0x79ffa201), + 7: Color(0x9cec8d00), + 8: Color(0xd4ea8900), + 9: Color(0xdbffa600), + 10: Color(0xe3ff9500), + 11: Color(0xfaab5300), + 12: Color(0xf6481800) + }, +); + +const _amberDark = ColorSwatch( + 0xffffb224, + { + 1: Color(0xff1f1300), + 2: Color(0xff271700), + 3: Color(0xff341c00), + 4: Color(0xff3f2200), + 5: Color(0xff4a2900), + 6: Color(0xff573300), + 7: Color(0xff693f05), + 8: Color(0xff824e00), + 9: Color(0xffffb224), + 10: Color(0xffffcb47), + 11: Color(0xfff1a10d), + 12: Color(0xfffef3dd) + }, +); + +const _amberDarkAlpha = ColorSwatch( + 0xfaffb625, + { + 1: Color(0x00000000), + 2: Color(0x09fd8300), + 3: Color(0x18fe7300), + 4: Color(0x24ff7b00), + 5: Color(0x31ff8400), + 6: Color(0x40ff9500), + 7: Color(0x54ff970f), + 8: Color(0x71ff9900), + 9: Color(0xfaffb625), + 10: Color(0xfaffce48), + 11: Color(0xefffab0e), + 12: Color(0xfafff8e1) + }, +); + +const _blackAlpha = ColorSwatch( + 0xe8000000, + { + 1: Color(0x03000000), + 2: Color(0x07000000), + 3: Color(0x0c000000), + 4: Color(0x12000000), + 5: Color(0x17000000), + 6: Color(0x1d000000), + 7: Color(0x24000000), + 8: Color(0x38000000), + 9: Color(0x70000000), + 10: Color(0x7a000000), + 11: Color(0x90000000), + 12: Color(0xe8000000) + }, +); + +const _blue = ColorSwatch( + 0xff0091ff, + { + 1: Color(0xfffbfdff), + 2: Color(0xfff5faff), + 3: Color(0xffedf6ff), + 4: Color(0xffe1f0ff), + 5: Color(0xffcee7fe), + 6: Color(0xffb7d9f8), + 7: Color(0xff96c7f2), + 8: Color(0xff5eb0ef), + 9: Color(0xff0091ff), + 10: Color(0xff0081f1), + 11: Color(0xff006adc), + 12: Color(0xff00254d) + }, +); + +const _blueAlpha = ColorSwatch( + 0xfa0091ff, + { + 1: Color(0x040582ff), + 2: Color(0x0a0582ff), + 3: Color(0x120280ff), + 4: Color(0x1e0180ff), + 5: Color(0x300180ef), + 6: Color(0x480177e6), + 7: Color(0x690077df), + 8: Color(0xa10082e6), + 9: Color(0xfa0091ff), + 10: Color(0xfa0080f1), + 11: Color(0xfa0066db), + 12: Color(0xfa002149) + }, +); + +const _blueDark = ColorSwatch( + 0xff0091ff, + { + 1: Color(0xff0f1720), + 2: Color(0xff0f1b2d), + 3: Color(0xff10243e), + 4: Color(0xff102a4c), + 5: Color(0xff0f3058), + 6: Color(0xff0d3868), + 7: Color(0xff0a4481), + 8: Color(0xff0954a5), + 9: Color(0xff0091ff), + 10: Color(0xff369eff), + 11: Color(0xff52a9ff), + 12: Color(0xffeaf6ff) + }, +); + +const _blueDarkAlpha = ColorSwatch( + 0xfa0095ff, + { + 1: Color(0x00000000), + 2: Color(0x0f0f5afc), + 3: Color(0x221677fe), + 4: Color(0x321476fe), + 5: Color(0x400f7bfe), + 6: Color(0x52097cff), + 7: Color(0x6f047dff), + 8: Color(0x98057eff), + 9: Color(0xfa0095ff), + 10: Color(0xfa37a1ff), + 11: Color(0xfa53acff), + 12: Color(0xfaeffbff) + }, +); + +const _bronze = ColorSwatch( + 0xffa18072, + { + 1: Color(0xfffdfcfc), + 2: Color(0xfffdf8f6), + 3: Color(0xfff8f1ee), + 4: Color(0xfff2e8e4), + 5: Color(0xffeaddd7), + 6: Color(0xffe0cec7), + 7: Color(0xffd1b9b0), + 8: Color(0xffbfa094), + 9: Color(0xffa18072), + 10: Color(0xff977669), + 11: Color(0xff846358), + 12: Color(0xff43302b) + }, +); + +const _bronzeAlpha = ColorSwatch( + 0x8d551a00, + { + 1: Color(0x03580505), + 2: Color(0x09c73c05), + 3: Color(0x11972e01), + 4: Color(0x1b842600), + 5: Color(0x28792700), + 6: Color(0x38722100), + 7: Color(0x4f6e2100), + 8: Color(0x6b671d00), + 9: Color(0x8d551a00), + 10: Color(0x964e1600), + 11: Color(0xa7431100), + 12: Color(0xd41d0600) + }, +); + +const _bronzeDark = ColorSwatch( + 0xffa18072, + { + 1: Color(0xff191514), + 2: Color(0xff1f1917), + 3: Color(0xff2a211f), + 4: Color(0xff332824), + 5: Color(0xff3b2e29), + 6: Color(0xff453530), + 7: Color(0xff57433c), + 8: Color(0xff74594e), + 9: Color(0xffa18072), + 10: Color(0xffb08c7d), + 11: Color(0xffcba393), + 12: Color(0xfff9ede7) + }, +); + +const _bronzeDarkAlpha = ColorSwatch( + 0x97ffcab3, + { + 1: Color(0x00000000), + 2: Color(0x07f7aa83), + 3: Color(0x13ffb7a9), + 4: Color(0x1dfdbca0), + 5: Color(0x26ffbea2), + 6: Color(0x31febca6), + 7: Color(0x45ffbfa8), + 8: Color(0x65ffc1a6), + 9: Color(0x97ffcab3), + 10: Color(0xa8ffcab4), + 11: Color(0xc5ffccb8), + 12: Color(0xf8fff3ed) + }, +); + +const _brown = ColorSwatch( + 0xffad7f58, + { + 1: Color(0xfffefdfc), + 2: Color(0xfffcf9f6), + 3: Color(0xfff8f1ea), + 4: Color(0xfff4e9dd), + 5: Color(0xffefddcc), + 6: Color(0xffe8cdb5), + 7: Color(0xffddb896), + 8: Color(0xffd09e72), + 9: Color(0xffad7f58), + 10: Color(0xffa07653), + 11: Color(0xff886349), + 12: Color(0xff3f2c22) + }, +); + +const _brownAlpha = ColorSwatch( + 0xa7823d00, + { + 1: Color(0x03ab5805), + 2: Color(0x09ab5805), + 3: Color(0x15ab5602), + 4: Color(0x22ad5a01), + 5: Color(0x33af5500), + 6: Color(0x4ab05201), + 7: Color(0x69ac5300), + 8: Color(0x8daa4f00), + 9: Color(0xa7823d00), + 10: Color(0xac723300), + 11: Color(0xb6582500), + 12: Color(0xdd220c00) + }, +); + +const _brownDark = ColorSwatch( + 0xffad7f58, + { + 1: Color(0xff191513), + 2: Color(0xff221813), + 3: Color(0xff2e201a), + 4: Color(0xff36261e), + 5: Color(0xff3e2c22), + 6: Color(0xff493528), + 7: Color(0xff5c4332), + 8: Color(0xff775940), + 9: Color(0xffad7f58), + 10: Color(0xffbd8b60), + 11: Color(0xffdba16e), + 12: Color(0xfffaf0e5) + }, +); + +const _brownDarkAlpha = ColorSwatch( + 0xa4ffba7e, + { + 1: Color(0x00000000), + 2: Color(0x09ff6913), + 3: Color(0x16fd9163), + 4: Color(0x1ffe9f6c), + 5: Color(0x28feac72), + 6: Color(0x35feb079), + 7: Color(0x4afeb47e), + 8: Color(0x68febc82), + 9: Color(0xa4ffba7e), + 10: Color(0xb6ffbb7f), + 11: Color(0xd7ffbb7f), + 12: Color(0xfafff5e9) + }, +); + +const _crimson = ColorSwatch( + 0xffe93d82, + { + 1: Color(0xfffffcfd), + 2: Color(0xfffff7fb), + 3: Color(0xfffeeff6), + 4: Color(0xfffce5f0), + 5: Color(0xfff9d8e7), + 6: Color(0xfff4c6db), + 7: Color(0xffedadc8), + 8: Color(0xffe58fb1), + 9: Color(0xffe93d82), + 10: Color(0xffe03177), + 11: Color(0xffd31e66), + 12: Color(0xff3d0d1d) + }, +); + +const _crimsonAlpha = ColorSwatch( + 0xc2e2005a, + { + 1: Color(0x03ff0558), + 2: Color(0x08ff0582), + 3: Color(0x10ef0170), + 4: Color(0x1ae2006d), + 5: Color(0x27d80061), + 6: Color(0x39ce015d), + 7: Color(0x52c70053), + 8: Color(0x70c4004f), + 9: Color(0xc2e2005a), + 10: Color(0xced90057), + 11: Color(0xe1cd0052), + 12: Color(0xf2330011) + }, +); + +const _crimsonDark = ColorSwatch( + 0xffe93d82, + { + 1: Color(0xff1d1418), + 2: Color(0xff27141c), + 3: Color(0xff3c1827), + 4: Color(0xff481a2d), + 5: Color(0xff541b33), + 6: Color(0xff641d3b), + 7: Color(0xff801d45), + 8: Color(0xffae1955), + 9: Color(0xffe93d82), + 10: Color(0xfff04f88), + 11: Color(0xfff76190), + 12: Color(0xfffeecf4) + }, +); + +const _crimsonDarkAlpha = ColorSwatch( + 0xe6ff418d, + { + 1: Color(0x00000000), + 2: Color(0x0bfb1471), + 3: Color(0x23fe3186), + 4: Color(0x31fe3384), + 5: Color(0x3efe3186), + 6: Color(0x50fe3186), + 7: Color(0x70fe287e), + 8: Color(0xa4ff1c77), + 9: Color(0xe6ff418d), + 10: Color(0xeeff538f), + 11: Color(0xf6ff6495), + 12: Color(0xfafff0f8) + }, +); + +const _cyan = ColorSwatch( + 0xff05a2c2, + { + 1: Color(0xfffafdfe), + 2: Color(0xfff2fcfd), + 3: Color(0xffe7f9fb), + 4: Color(0xffd8f3f6), + 5: Color(0xffc4eaef), + 6: Color(0xffaadee6), + 7: Color(0xff84cdda), + 8: Color(0xff3db9cf), + 9: Color(0xff05a2c2), + 10: Color(0xff0894b3), + 11: Color(0xff0c7792), + 12: Color(0xff04313c) + }, +); + +const _cyanAlpha = ColorSwatch( + 0xfa00a1c1, + { + 1: Color(0x05059bcd), + 2: Color(0x0d00c6d8), + 3: Color(0x1802c0d5), + 4: Color(0x2700b1c4), + 5: Color(0x3b01a4ba), + 6: Color(0x55019cb4), + 7: Color(0x7b0097b2), + 8: Color(0xc200a3c0), + 9: Color(0xfa00a1c1), + 10: Color(0xf70090b0), + 11: Color(0xf300718d), + 12: Color(0xfa002d38) + }, +); + +const _cyanDark = ColorSwatch( + 0xff05a2c2, + { + 1: Color(0xff07191d), + 2: Color(0xff061e24), + 3: Color(0xff072830), + 4: Color(0xff07303b), + 5: Color(0xff073844), + 6: Color(0xff064150), + 7: Color(0xff045063), + 8: Color(0xff00647d), + 9: Color(0xff05a2c2), + 10: Color(0xff00b1cc), + 11: Color(0xff00c2d7), + 12: Color(0xffe1f8fa) + }, +); + +const _cyanDarkAlpha = ColorSwatch( + 0xba04d5ff, + { + 1: Color(0x00000000), + 2: Color(0x0800bbff), + 3: Color(0x1607cbfc), + 4: Color(0x2207c5ff), + 5: Color(0x2c07cdfe), + 6: Color(0x3a02c8ff), + 7: Color(0x4f00ccff), + 8: Color(0x6c00c8ff), + 9: Color(0xba04d5ff), + 10: Color(0xc600ddff), + 11: Color(0xd200e5fe), + 12: Color(0xf9e6fdff) + }, +); + +const _gold = ColorSwatch( + 0xff978365, + { + 1: Color(0xfffdfdfc), + 2: Color(0xfffbf9f2), + 3: Color(0xfff5f2e9), + 4: Color(0xffeeeadd), + 5: Color(0xffe5dfd0), + 6: Color(0xffdad1bd), + 7: Color(0xffcbbda4), + 8: Color(0xffb8a383), + 9: Color(0xff978365), + 10: Color(0xff8c795d), + 11: Color(0xff776750), + 12: Color(0xff3b352b) + }, +); + +const _goldAlpha = ColorSwatch( + 0x9a533200, + { + 1: Color(0x03585805), + 2: Color(0x0db08a00), + 3: Color(0x168c6a02), + 4: Color(0x22806301), + 5: Color(0x2f725201), + 6: Color(0x42704d00), + 7: Color(0x5b6e4500), + 8: Color(0x7c6d4200), + 9: Color(0x9a533200), + 10: Color(0xa24a2d00), + 11: Color(0xaf392100), + 12: Color(0xd4130c00) + }, +); + +const _goldDark = ColorSwatch( + 0xff978365, + { + 1: Color(0xff171613), + 2: Color(0xff1c1a15), + 3: Color(0xff26231c), + 4: Color(0xff2e2a21), + 5: Color(0xff353026), + 6: Color(0xff3e382c), + 7: Color(0xff504737), + 8: Color(0xff6b5d48), + 9: Color(0xff978365), + 10: Color(0xffa59071), + 11: Color(0xffbfa888), + 12: Color(0xfff7f4e7) + }, +); + +const _goldDarkAlpha = ColorSwatch( + 0x8dffdca7, + { + 1: Color(0x00000000), + 2: Color(0x06facb6e), + 3: Color(0x11fede9d), + 4: Color(0x1afdde9f), + 5: Color(0x21fedda5), + 6: Color(0x2bfedfa7), + 7: Color(0x3fffdda6), + 8: Color(0x5dfed9a5), + 9: Color(0x8dffdca7), + 10: Color(0x9cffdcac), + 11: Color(0xb9ffe0b4), + 12: Color(0xf6fffcee) + }, +); + +const _grass = ColorSwatch( + 0xff46a758, + { + 1: Color(0xfffbfefb), + 2: Color(0xfff3fcf3), + 3: Color(0xffebf9eb), + 4: Color(0xffdff3df), + 5: Color(0xffceebcf), + 6: Color(0xffb7dfba), + 7: Color(0xff97cf9c), + 8: Color(0xff65ba75), + 9: Color(0xff46a758), + 10: Color(0xff3d9a50), + 11: Color(0xff297c3b), + 12: Color(0xff1b311e) + }, +); + +const _grassAlpha = ColorSwatch( + 0xb9008619, + { + 1: Color(0x0405c005), + 2: Color(0x0c05c005), + 3: Color(0x1402b302), + 4: Color(0x2001a001), + 5: Color(0x31019706), + 6: Color(0x48018e0c), + 7: Color(0x68008a0c), + 8: Color(0x9a008d1a), + 9: Color(0xb9008619), + 10: Color(0xc2007a19), + 11: Color(0xd6006316), + 12: Color(0xe4001904) + }, +); + +const _grassDark = ColorSwatch( + 0xff46a758, + { + 1: Color(0xff0d1912), + 2: Color(0xff0f1e13), + 3: Color(0xff132819), + 4: Color(0xff16301d), + 5: Color(0xff193921), + 6: Color(0xff1d4427), + 7: Color(0xff245530), + 8: Color(0xff2f6e3b), + 9: Color(0xff46a758), + 10: Color(0xff55b467), + 11: Color(0xff63c174), + 12: Color(0xffe5fbeb) + }, +); + +const _grassDarkAlpha = ColorSwatch( + 0x9e69ff82, + { + 1: Color(0x00000000), + 2: Color(0x0668fc3f), + 3: Color(0x1168fc7b), + 4: Color(0x1a67ff80), + 5: Color(0x2463fe7d), + 6: Color(0x3063ff82), + 7: Color(0x4365ff84), + 8: Color(0x5e69ff82), + 9: Color(0x9e69ff82), + 10: Color(0xac78ff91), + 11: Color(0xba83ff97), + 12: Color(0xfaeafff0) + }, +); + +const _gray = ColorSwatch( + 0xff8f8f8f, + { + 1: Color(0xfffcfcfc), + 2: Color(0xfff8f8f8), + 3: Color(0xfff3f3f3), + 4: Color(0xffededed), + 5: Color(0xffe8e8e8), + 6: Color(0xffe2e2e2), + 7: Color(0xffdbdbdb), + 8: Color(0xffc7c7c7), + 9: Color(0xff8f8f8f), + 10: Color(0xff858585), + 11: Color(0xff6f6f6f), + 12: Color(0xff171717) + }, +); + +const _grayAlpha = ColorSwatch( + 0x70000000, + { + 1: Color(0x03000000), + 2: Color(0x07000000), + 3: Color(0x0c000000), + 4: Color(0x12000000), + 5: Color(0x17000000), + 6: Color(0x1d000000), + 7: Color(0x24000000), + 8: Color(0x38000000), + 9: Color(0x70000000), + 10: Color(0x7a000000), + 11: Color(0x90000000), + 12: Color(0xe8000000) + }, +); + +const _grayDark = ColorSwatch( + 0xff707070, + { + 1: Color(0xff161616), + 2: Color(0xff1c1c1c), + 3: Color(0xff232323), + 4: Color(0xff282828), + 5: Color(0xff2e2e2e), + 6: Color(0xff343434), + 7: Color(0xff3e3e3e), + 8: Color(0xff505050), + 9: Color(0xff707070), + 10: Color(0xff7e7e7e), + 11: Color(0xffa0a0a0), + 12: Color(0xffededed) + }, +); + +const _grayDarkAlpha = ColorSwatch( + 0x62ffffff, + { + 1: Color(0x00ffffff), + 2: Color(0x07ffffff), + 3: Color(0x0effffff), + 4: Color(0x14ffffff), + 5: Color(0x1affffff), + 6: Color(0x21ffffff), + 7: Color(0x2cffffff), + 8: Color(0x3fffffff), + 9: Color(0x62ffffff), + 10: Color(0x72ffffff), + 11: Color(0x97ffffff), + 12: Color(0xebffffff) + }, +); + +const _green = ColorSwatch( + 0xff30a46c, + { + 1: Color(0xfffbfefc), + 2: Color(0xfff2fcf5), + 3: Color(0xffe9f9ee), + 4: Color(0xffddf3e4), + 5: Color(0xffccebd7), + 6: Color(0xffb4dfc4), + 7: Color(0xff92ceac), + 8: Color(0xff5bb98c), + 9: Color(0xff30a46c), + 10: Color(0xff299764), + 11: Color(0xff18794e), + 12: Color(0xff153226) + }, +); + +const _greenAlpha = ColorSwatch( + 0xcf008f4a, + { + 1: Color(0x0405c043), + 2: Color(0x0d00c43b), + 3: Color(0x1602ba3c), + 4: Color(0x2201a635), + 5: Color(0x33009b36), + 6: Color(0x4b019336), + 7: Color(0x6d008c3d), + 8: Color(0xa400934c), + 9: Color(0xcf008f4a), + 10: Color(0xd6008346), + 11: Color(0xe7006b3b), + 12: Color(0xea002012) + }, +); + +const _greenDark = ColorSwatch( + 0xff30a46c, + { + 1: Color(0xff0d1912), + 2: Color(0xff0c1f17), + 3: Color(0xff0f291e), + 4: Color(0xff113123), + 5: Color(0xff133929), + 6: Color(0xff164430), + 7: Color(0xff1b543a), + 8: Color(0xff236e4a), + 9: Color(0xff30a46c), + 10: Color(0xff3cb179), + 11: Color(0xff4cc38a), + 12: Color(0xffe5fbeb) + }, +); + +const _greenDarkAlpha = ColorSwatch( + 0x9a47ffa6, + { + 1: Color(0x00000000), + 2: Color(0x0700f7ca), + 3: Color(0x122afebe), + 4: Color(0x1b33feb3), + 5: Color(0x2438feb5), + 6: Color(0x303dffb1), + 7: Color(0x4243ffad), + 8: Color(0x5e49ffaa), + 9: Color(0x9a47ffa6), + 10: Color(0xa954ffaf), + 11: Color(0xbd62ffb3), + 12: Color(0xfaeafff0) + }, +); + +const _indigo = ColorSwatch( + 0xff3e63dd, + { + 1: Color(0xfffdfdfe), + 2: Color(0xfff8faff), + 3: Color(0xfff0f4ff), + 4: Color(0xffe6edfe), + 5: Color(0xffd9e2fc), + 6: Color(0xffc6d4f9), + 7: Color(0xffaec0f5), + 8: Color(0xff8da4ef), + 9: Color(0xff3e63dd), + 10: Color(0xff3a5ccc), + 11: Color(0xff3451b2), + 12: Color(0xff101d46) + }, +); + +const _indigoAlpha = ColorSwatch( + 0xc10031d2, + { + 1: Color(0x02050582), + 2: Color(0x07054cff), + 3: Color(0x0f0144ff), + 4: Color(0x190247f5), + 5: Color(0x26023ceb), + 6: Color(0x39013de4), + 7: Color(0x510038e0), + 8: Color(0x720134db), + 9: Color(0xc10031d2), + 10: Color(0xc5002cbd), + 11: Color(0xcb00259e), + 12: Color(0xef000e3a) + }, +); + +const _indigoDark = ColorSwatch( + 0xff3e63dd, + { + 1: Color(0xff131620), + 2: Color(0xff15192d), + 3: Color(0xff192140), + 4: Color(0xff1c274f), + 5: Color(0xff1f2c5c), + 6: Color(0xff22346e), + 7: Color(0xff273e89), + 8: Color(0xff2f4eb2), + 9: Color(0xff3e63dd), + 10: Color(0xff5373e7), + 11: Color(0xff849dff), + 12: Color(0xffeef1fd) + }, +); + +const _indigoDarkAlpha = ColorSwatch( + 0xd84571ff, + { + 1: Color(0x00000000), + 2: Color(0x0f3549fc), + 3: Color(0x253c63fe), + 4: Color(0x363d67ff), + 5: Color(0x453f69fe), + 6: Color(0x593e6bff), + 7: Color(0x783d6aff), + 8: Color(0xa73e6bff), + 9: Color(0xd84571ff), + 10: Color(0xe45a7eff), + 11: Color(0xfa86a0ff), + 12: Color(0xfaf2f5ff) + }, +); + +const _lime = ColorSwatch( + 0xff94ba2c, + { + 1: Color(0xfffcfdfa), + 2: Color(0xfff7fcf0), + 3: Color(0xffeefadc), + 4: Color(0xffe4f7c7), + 5: Color(0xffd7f2b0), + 6: Color(0xffc9e894), + 7: Color(0xffb1d16a), + 8: Color(0xff94ba2c), + 9: Color(0xff99d52a), + 10: Color(0xff93c926), + 11: Color(0xff5d770d), + 12: Color(0xff263209) + }, +); + +const _limeAlpha = ColorSwatch( + 0xd37eac00, + { + 1: Color(0x05699b05), + 2: Color(0x0f77cc01), + 3: Color(0x2384db01), + 4: Color(0x3883db00), + 5: Color(0x4f7cd500), + 6: Color(0x6b7fc800), + 7: Color(0x9578b000), + 8: Color(0xd37eac00), + 9: Color(0xd585cd00), + 10: Color(0xd980c000), + 11: Color(0xf2547000), + 12: Color(0xf61e2b00) + }, +); + +const _limeDark = ColorSwatch( + 0xff99d52a, + { + 1: Color(0xff141807), + 2: Color(0xff181d08), + 3: Color(0xff1e260d), + 4: Color(0xff252e0f), + 5: Color(0xff2b3711), + 6: Color(0xff344213), + 7: Color(0xff415215), + 8: Color(0xff536716), + 9: Color(0xff99d52a), + 10: Color(0xffc4f042), + 11: Color(0xff87be22), + 12: Color(0xffeffbdd) + }, +); + +const _limeDarkAlpha = ColorSwatch( + 0xd1b7ff32, + { + 1: Color(0x00000000), + 2: Color(0x06cafb35), + 3: Color(0x10b8fd6a), + 4: Color(0x18c4fd5b), + 5: Color(0x22befe51), + 6: Color(0x2ec5ff49), + 7: Color(0x40c8fe3f), + 8: Color(0x57ccff33), + 9: Color(0xd1b7ff32), + 10: Color(0xefd1ff46), + 11: Color(0xb7b5ff2c), + 12: Color(0xfaf4ffe1) + }, +); + +const _mauve = ColorSwatch( + 0xff908e96, + { + 1: Color(0xfffdfcfd), + 2: Color(0xfff9f8f9), + 3: Color(0xfff4f2f4), + 4: Color(0xffeeedef), + 5: Color(0xffe9e8ea), + 6: Color(0xffe4e2e4), + 7: Color(0xffdcdbdd), + 8: Color(0xffc8c7cb), + 9: Color(0xff908e96), + 10: Color(0xff86848d), + 11: Color(0xff6f6e77), + 12: Color(0xff1a1523) + }, +); + +const _mauveAlpha = ColorSwatch( + 0x71050012, + { + 1: Color(0x03580558), + 2: Color(0x07290529), + 3: Color(0x0d270027), + 4: Color(0x1210011e), + 5: Color(0x170d0218), + 6: Color(0x1d120112), + 7: Color(0x2408010f), + 8: Color(0x38050012), + 9: Color(0x71050012), + 10: Color(0x7b040013), + 11: Color(0x91020010), + 12: Color(0xea05000f) + }, +); + +const _mauveDark = ColorSwatch( + 0xff706f78, + { + 1: Color(0xff161618), + 2: Color(0xff1c1c1f), + 3: Color(0xff232326), + 4: Color(0xff28282c), + 5: Color(0xff2e2e32), + 6: Color(0xff34343a), + 7: Color(0xff3e3e44), + 8: Color(0xff504f57), + 9: Color(0xff706f78), + 10: Color(0xff7e7d86), + 11: Color(0xffa09fa6), + 12: Color(0xffededef) + }, +); + +const _mauveDarkAlpha = ColorSwatch( + 0x6aeeecff, + { + 1: Color(0x00000000), + 2: Color(0x08d7d7fa), + 3: Color(0x10ebebfe), + 4: Color(0x16e5e5fe), + 5: Color(0x1deaeafe), + 6: Color(0x26e1e1fe), + 7: Color(0x31e8e8fe), + 8: Color(0x46eae7ff), + 9: Color(0x6aeeecff), + 10: Color(0x7af0eeff), + 11: Color(0x9df7f5ff), + 12: Color(0xedfdfdff) + }, +); + +const _mint = ColorSwatch( + 0xff40c4aa, + { + 1: Color(0xfff9fefd), + 2: Color(0xffeffefa), + 3: Color(0xffe1fbf4), + 4: Color(0xffd2f7ed), + 5: Color(0xffc0efe3), + 6: Color(0xffa5e4d4), + 7: Color(0xff7dd4c0), + 8: Color(0xff40c4aa), + 9: Color(0xff70e1c8), + 10: Color(0xff69d9c1), + 11: Color(0xff147d6f), + 12: Color(0xff09342e) + }, +); + +const _mintAlpha = ColorSwatch( + 0xbf00b08d, + { + 1: Color(0x0605d5ac), + 2: Color(0x1001efb0), + 3: Color(0x1e01dda2), + 4: Color(0x2d01d29a), + 5: Color(0x3f01be8f), + 6: Color(0x5a00b386), + 7: Color(0x8200ab83), + 8: Color(0xbf00b08d), + 9: Color(0x8f00c99e), + 10: Color(0x9600be95), + 11: Color(0xeb007263), + 12: Color(0xf6002d27) + }, +); + +const _mintDark = ColorSwatch( + 0xff70e1c8, + { + 1: Color(0xff081917), + 2: Color(0xff05201e), + 3: Color(0xff052926), + 4: Color(0xff04312c), + 5: Color(0xff033a34), + 6: Color(0xff01453d), + 7: Color(0xff00564a), + 8: Color(0xff006d5b), + 9: Color(0xff70e1c8), + 10: Color(0xff95f3d9), + 11: Color(0xff25d0ab), + 12: Color(0xffe7fcf7) + }, +); + +const _mintDarkAlpha = ColorSwatch( + 0xde80ffe3, + { + 1: Color(0x00000000), + 2: Color(0x0800fbfb), + 3: Color(0x1200fded), + 4: Color(0x1b00fde0), + 5: Color(0x2500fee0), + 6: Color(0x3100fedc), + 7: Color(0x4400fed8), + 8: Color(0x5d00fed0), + 9: Color(0xde80ffe3), + 10: Color(0xf29dffe3), + 11: Color(0xcb2cffd1), + 12: Color(0xfaecfffb) + }, +); + +const _olive = ColorSwatch( + 0xff8b918a, + { + 1: Color(0xfffcfdfc), + 2: Color(0xfff8faf8), + 3: Color(0xfff2f4f2), + 4: Color(0xffecefec), + 5: Color(0xffe6e9e6), + 6: Color(0xffe0e4e0), + 7: Color(0xffd8dcd8), + 8: Color(0xffc3c8c2), + 9: Color(0xff8b918a), + 10: Color(0xff818780), + 11: Color(0xff6b716a), + 12: Color(0xff141e12) + }, +); + +const _oliveAlpha = ColorSwatch( + 0x75020f00, + { + 1: Color(0x03055805), + 2: Color(0x07054d05), + 3: Color(0x0d002700), + 4: Color(0x13022a02), + 5: Color(0x19022102), + 6: Color(0x1f012201), + 7: Color(0x27001a00), + 8: Color(0x3d051a01), + 9: Color(0x75020f00), + 10: Color(0x7f030e00), + 11: Color(0x95020c00), + 12: Color(0xed020d00) + }, +); + +const _oliveDark = ColorSwatch( + 0xff687366, + { + 1: Color(0xff151715), + 2: Color(0xff1a1d19), + 3: Color(0xff20241f), + 4: Color(0xff262925), + 5: Color(0xff2b2f2a), + 6: Color(0xff313530), + 7: Color(0xff3b3f3a), + 8: Color(0xff4c514b), + 9: Color(0xff687366), + 10: Color(0xff778175), + 11: Color(0xff9aa299), + 12: Color(0xffeceeec) + }, +); + +const _oliveDarkAlpha = ColorSwatch( + 0x65e6ffe1, + { + 1: Color(0x00000000), + 2: Color(0x07d5feaf), + 3: Color(0x0fd6fbc4), + 4: Color(0x14effee2), + 5: Color(0x1be9fedf), + 6: Color(0x21ecfee5), + 7: Color(0x2cf1feeb), + 8: Color(0x40f1ffed), + 9: Color(0x65e6ffe1), + 10: Color(0x75ebffe7), + 11: Color(0x99f3fff1), + 12: Color(0xecfdfffd) + }, +); + +const _orange = ColorSwatch( + 0xfff76808, + { + 1: Color(0xfffefcfb), + 2: Color(0xfffef8f4), + 3: Color(0xfffff1e7), + 4: Color(0xffffe8d7), + 5: Color(0xffffdcc3), + 6: Color(0xffffcca7), + 7: Color(0xffffb381), + 8: Color(0xfffa934e), + 9: Color(0xfff76808), + 10: Color(0xffed5f00), + 11: Color(0xffbd4b00), + 12: Color(0xff451e11) + }, +); + +const _orangeAlpha = ColorSwatch( + 0xf7f76300, + { + 1: Color(0x04c04305), + 2: Color(0x0be86005), + 3: Color(0x18ff6c03), + 4: Color(0x28ff6e00), + 5: Color(0x3cff6b01), + 6: Color(0x58ff6b01), + 7: Color(0x7eff6601), + 8: Color(0xb1f86300), + 9: Color(0xf7f76300), + 10: Color(0xfaed5b00), + 11: Color(0xfabc4800), + 12: Color(0xee380e00) + }, +); + +const _orangeDark = ColorSwatch( + 0xfff76808, + { + 1: Color(0xff1f1206), + 2: Color(0xff2b1400), + 3: Color(0xff391a03), + 4: Color(0xff441f04), + 5: Color(0xff4f2305), + 6: Color(0xff5f2a06), + 7: Color(0xff763205), + 8: Color(0xff943e00), + 9: Color(0xfff76808), + 10: Color(0xffff802b), + 11: Color(0xffff8b3e), + 12: Color(0xfffeeadd) + }, +); + +const _orangeDarkAlpha = ColorSwatch( + 0xf6ff6b08, + { + 1: Color(0x00000000), + 2: Color(0x0efd3700), + 3: Color(0x1efd5400), + 4: Color(0x2afe6100), + 5: Color(0x37fe6201), + 6: Color(0x49ff6506), + 7: Color(0x63ff6403), + 8: Color(0x85fe6600), + 9: Color(0xf6ff6b08), + 10: Color(0xfaff842c), + 11: Color(0xfaff8c3f), + 12: Color(0xfaffeee1) + }, +); + +const _pink = ColorSwatch( + 0xffd6409f, + { + 1: Color(0xfffffcfe), + 2: Color(0xfffff7fc), + 3: Color(0xfffeeef8), + 4: Color(0xfffce5f3), + 5: Color(0xfff9d8ec), + 6: Color(0xfff3c6e2), + 7: Color(0xffecadd4), + 8: Color(0xffe38ec3), + 9: Color(0xffd6409f), + 10: Color(0xffd23197), + 11: Color(0xffcd1d8d), + 12: Color(0xff3b0a2a) + }, +); + +const _pinkAlpha = ColorSwatch( + 0xbfc8007f, + { + 1: Color(0x03ff05ac), + 2: Color(0x08ff059f), + 3: Color(0x11f00194), + 4: Color(0x1ae2008b), + 5: Color(0x27d80081), + 6: Color(0x39c9017c), + 7: Color(0x52c40079), + 8: Color(0x71c00076), + 9: Color(0xbfc8007f), + 10: Color(0xcec7007e), + 11: Color(0xe2c7007e), + 12: Color(0xf5330021) + }, +); + +const _pinkDark = ColorSwatch( + 0xffd6409f, + { + 1: Color(0xff1f121b), + 2: Color(0xff271421), + 3: Color(0xff3a182f), + 4: Color(0xff451a37), + 5: Color(0xff501b3f), + 6: Color(0xff601d48), + 7: Color(0xff7a1d5a), + 8: Color(0xffa71873), + 9: Color(0xffd6409f), + 10: Color(0xffe34ba9), + 11: Color(0xfff65cb6), + 12: Color(0xfffeebf7) + }, +); + +const _pinkDarkAlpha = ColorSwatch( + 0xd0ff4abd, + { + 1: Color(0x00000000), + 2: Color(0x09fd4ac1), + 3: Color(0x1ffe44c0), + 4: Color(0x2bff41bf), + 5: Color(0x38ff3bc1), + 6: Color(0x4afe38b6), + 7: Color(0x68ff2db5), + 8: Color(0x9bff1cac), + 9: Color(0xd0ff4abd), + 10: Color(0xdfff53bd), + 11: Color(0xf5ff5fbc), + 12: Color(0xfaffeffb) + }, +); + +const _plum = ColorSwatch( + 0xffab4aba, + { + 1: Color(0xfffefcff), + 2: Color(0xfffff8ff), + 3: Color(0xfffceffc), + 4: Color(0xfff9e5f9), + 5: Color(0xfff3d9f4), + 6: Color(0xffebc8ed), + 7: Color(0xffdfafe3), + 8: Color(0xffcf91d8), + 9: Color(0xffab4aba), + 10: Color(0xffa43cb4), + 11: Color(0xff9c2bad), + 12: Color(0xff340c3b) + }, +); + +const _plumAlpha = ColorSwatch( + 0xb589009e, + { + 1: Color(0x03ac05ff), + 2: Color(0x07ff05ff), + 3: Color(0x10d001d0), + 4: Color(0x1ac400c4), + 5: Color(0x26af02b5), + 6: Color(0x37a300ac), + 7: Color(0x509800a6), + 8: Color(0x6e8f00a5), + 9: Color(0xb589009e), + 10: Color(0xc388009d), + 11: Color(0xd488009c), + 12: Color(0xf32a0031) + }, +); + +const _plumDark = ColorSwatch( + 0xffab4aba, + { + 1: Color(0xff1d131d), + 2: Color(0xff251425), + 3: Color(0xff341a34), + 4: Color(0xff3e1d40), + 5: Color(0xff48214b), + 6: Color(0xff542658), + 7: Color(0xff692d6f), + 8: Color(0xff883894), + 9: Color(0xffab4aba), + 10: Color(0xffbd54c6), + 11: Color(0xffd864d8), + 12: Color(0xfffbecfc) + }, +); + +const _plumDarkAlpha = ColorSwatch( + 0xb1ea62ff, + { + 1: Color(0x00000000), + 2: Color(0x09fb2ffb), + 3: Color(0x1afe58fe), + 4: Color(0x28f153ff), + 5: Color(0x34f158fe), + 6: Color(0x43ee5cfe), + 7: Color(0x5dee5aff), + 8: Color(0x86e959ff), + 9: Color(0xb1ea62ff), + 10: Color(0xbff36aff), + 11: Color(0xd3ff75ff), + 12: Color(0xfafff0ff) + }, +); + +const _purple = ColorSwatch( + 0xff8e4ec6, + { + 1: Color(0xfffefcfe), + 2: Color(0xfffdfaff), + 3: Color(0xfff9f1fe), + 4: Color(0xfff3e7fc), + 5: Color(0xffeddbf9), + 6: Color(0xffe3ccf4), + 7: Color(0xffd3b4ed), + 8: Color(0xffbe93e4), + 9: Color(0xff8e4ec6), + 10: Color(0xff8445bc), + 11: Color(0xff793aaf), + 12: Color(0xff2b0e44) + }, +); + +const _purpleAlpha = ColorSwatch( + 0xb15c00ad, + { + 1: Color(0x03ab05ab), + 2: Color(0x059b05ff), + 3: Color(0x0e9200ed), + 4: Color(0x188002e0), + 5: Color(0x248001d5), + 6: Color(0x337500c8), + 7: Color(0x4b6b01c2), + 8: Color(0x6c6600bf), + 9: Color(0xb15c00ad), + 10: Color(0xba5700a3), + 11: Color(0xc5510097), + 12: Color(0xf11f0039) + }, +); + +const _purpleDark = ColorSwatch( + 0xff8e4ec6, + { + 1: Color(0xff1b141d), + 2: Color(0xff221527), + 3: Color(0xff301a3a), + 4: Color(0xff3a1e48), + 5: Color(0xff432155), + 6: Color(0xff4e2667), + 7: Color(0xff5f2d84), + 8: Color(0xff7938b2), + 9: Color(0xff8e4ec6), + 10: Color(0xff9d5bd2), + 11: Color(0xffbf7af0), + 12: Color(0xfff7ecfc) + }, +); + +const _purpleDarkAlpha = ColorSwatch( + 0xbfb561ff, + { + 1: Color(0x00000000), + 2: Color(0x0bb52afb), + 3: Color(0x21bc43fe), + 4: Color(0x31be48fe), + 5: Color(0x3fbc49ff), + 6: Color(0x54b74bff), + 7: Color(0x74b14aff), + 8: Color(0xa8ab4bff), + 9: Color(0xbfb561ff), + 10: Color(0xccbd6dff), + 11: Color(0xeecb81ff), + 12: Color(0xfafcf0ff) + }, +); + +const _red = ColorSwatch( + 0xffe5484d, + { + 1: Color(0xfffffcfc), + 2: Color(0xfffff8f8), + 3: Color(0xffffefef), + 4: Color(0xffffe5e5), + 5: Color(0xfffdd8d8), + 6: Color(0xfff9c6c6), + 7: Color(0xfff3aeaf), + 8: Color(0xffeb9091), + 9: Color(0xffe5484d), + 10: Color(0xffdc3d43), + 11: Color(0xffcd2b31), + 12: Color(0xff381316) + }, +); + +const _redAlpha = ColorSwatch( + 0xb7db0007, + { + 1: Color(0x03ff0505), + 2: Color(0x08ff0505), + 3: Color(0x10ff0101), + 4: Color(0x1aff0000), + 5: Color(0x27f20000), + 6: Color(0x39e40101), + 7: Color(0x51d90004), + 8: Color(0x6fd10004), + 9: Color(0xb7db0007), + 10: Color(0xc2d10007), + 11: Color(0xd4c30007), + 12: Color(0xec280003) + }, +); + +const _redDark = ColorSwatch( + 0xffe5484d, + { + 1: Color(0xff1f1315), + 2: Color(0xff291415), + 3: Color(0xff3c181a), + 4: Color(0xff481a1d), + 5: Color(0xff541b1f), + 6: Color(0xff671e22), + 7: Color(0xff822025), + 8: Color(0xffaa2429), + 9: Color(0xffe5484d), + 10: Color(0xfff2555a), + 11: Color(0xffff6369), + 12: Color(0xfffeecee) + }, +); + +const _redDarkAlpha = ColorSwatch( + 0xe1ff4f55, + { + 1: Color(0x00000000), + 2: Color(0x0bfd2815), + 3: Color(0x21fe3a3d), + 4: Color(0x2ffe3940), + 5: Color(0x3cff353f), + 6: Color(0x52ff353c), + 7: Color(0x71ff303b), + 8: Color(0x9eff2f36), + 9: Color(0xe1ff4f55), + 10: Color(0xf0ff595f), + 11: Color(0xfaff646a), + 12: Color(0xfafff0f2) + }, +); + +const _sage = ColorSwatch( + 0xff8a918e, + { + 1: Color(0xfffbfdfc), + 2: Color(0xfff8faf9), + 3: Color(0xfff1f4f3), + 4: Color(0xffecefed), + 5: Color(0xffe6e9e8), + 6: Color(0xffdfe4e2), + 7: Color(0xffd7dcda), + 8: Color(0xffc2c9c6), + 9: Color(0xff8a918e), + 10: Color(0xff808784), + 11: Color(0xff6a716e), + 12: Color(0xff111c18) + }, +); + +const _sageAlpha = ColorSwatch( + 0x75000f09, + { + 1: Color(0x04058244), + 2: Color(0x07054d29), + 3: Color(0x0e003725), + 4: Color(0x13022a0f), + 5: Color(0x19022117), + 6: Color(0x20012919), + 7: Color(0x28002013), + 8: Color(0x3d011e11), + 9: Color(0x75000f09), + 10: Color(0x7f000e08), + 11: Color(0x95000c07), + 12: Color(0xee000c08) + }, +); + +const _sageDark = ColorSwatch( + 0xff66736d, + { + 1: Color(0xff141716), + 2: Color(0xff191d1b), + 3: Color(0xff1f2421), + 4: Color(0xff252a27), + 5: Color(0xff2a2f2c), + 6: Color(0xff303633), + 7: Color(0xff393f3c), + 8: Color(0xff4a524e), + 9: Color(0xff66736d), + 10: Color(0xff75817b), + 11: Color(0xff99a29e), + 12: Color(0xffeceeed) + }, +); + +const _sageDarkAlpha = ColorSwatch( + 0x65e3fff1, + { + 1: Color(0x00000000), + 2: Color(0x07d4fed6), + 3: Color(0x0fd5fbd7), + 4: Color(0x15e3ffe5), + 5: Color(0x1be8feea), + 6: Color(0x22e5feee), + 7: Color(0x2ceafef2), + 8: Color(0x41e8fef2), + 9: Color(0x65e3fff1), + 10: Color(0x75e8fff3), + 11: Color(0x99f2fff9), + 12: Color(0xecfdfffe) + }, +); + +const _sand = ColorSwatch( + 0xff90908c, + { + 1: Color(0xfffdfdfc), + 2: Color(0xfff9f9f8), + 3: Color(0xfff3f3f2), + 4: Color(0xffeeeeec), + 5: Color(0xffe9e9e6), + 6: Color(0xffe3e3e0), + 7: Color(0xffdbdbd7), + 8: Color(0xffc8c7c1), + 9: Color(0xff90908c), + 10: Color(0xff868682), + 11: Color(0xff706f6c), + 12: Color(0xff1b1b18) + }, +); + +const _sandAlpha = ColorSwatch( + 0x73090900, + { + 1: Color(0x03585805), + 2: Color(0x07292905), + 3: Color(0x0d141400), + 4: Color(0x131c1c02), + 5: Color(0x19212102), + 6: Color(0x1f1a1a01), + 7: Color(0x281a1a00), + 8: Color(0x3e1e1901), + 9: Color(0x73090900), + 10: Color(0x7d090900), + 11: Color(0x93070600), + 12: Color(0xe7040400) + }, +); + +const _sandDark = ColorSwatch( + 0xff717069, + { + 1: Color(0xff161615), + 2: Color(0xff1c1c1a), + 3: Color(0xff232320), + 4: Color(0xff282826), + 5: Color(0xff2e2e2b), + 6: Color(0xff353431), + 7: Color(0xff3e3e3a), + 8: Color(0xff51504b), + 9: Color(0xff717069), + 10: Color(0xff7f7e77), + 11: Color(0xffa1a09a), + 12: Color(0xffededec) + }, +); + +const _sandDarkAlpha = ColorSwatch( + 0x64fffcec, + { + 1: Color(0x00000000), + 2: Color(0x07fdfdd5), + 3: Color(0x0efefeda), + 4: Color(0x14fdfdef), + 5: Color(0x1bfdfde9), + 6: Color(0x22fdf6e6), + 7: Color(0x2cffffec), + 8: Color(0x41fefbea), + 9: Color(0x64fffcec), + 10: Color(0x73fffdee), + 11: Color(0x98fffdf4), + 12: Color(0xebfffffe) + }, +); + +const _sky = ColorSwatch( + 0xff2ebde5, + { + 1: Color(0xfff9feff), + 2: Color(0xfff1fcff), + 3: Color(0xffe4f9ff), + 4: Color(0xffd5f4fd), + 5: Color(0xffc1ecf9), + 6: Color(0xffa4dff1), + 7: Color(0xff79cfea), + 8: Color(0xff2ebde5), + 9: Color(0xff68ddfd), + 10: Color(0xff5fd4f4), + 11: Color(0xff0078a1), + 12: Color(0xff003242) + }, +); + +const _skyAlpha = ColorSwatch( + 0xd100afdf, + { + 1: Color(0x0605d5ff), + 2: Color(0x0e01c8ff), + 3: Color(0x1b01c8ff), + 4: Color(0x2a00baf3), + 5: Color(0x3e01b1e7), + 6: Color(0x5b00a5d8), + 7: Color(0x8600a5d7), + 8: Color(0xd100afdf), + 9: Color(0x9700c5fc), + 10: Color(0xa000baed), + 11: Color(0xfa00759f), + 12: Color(0xfa002e3e) + }, +); + +const _skyDark = ColorSwatch( + 0xff68ddfd, + { + 1: Color(0xff0c1820), + 2: Color(0xff071d2a), + 3: Color(0xff082636), + 4: Color(0xff082d41), + 5: Color(0xff08354c), + 6: Color(0xff083e59), + 7: Color(0xff064b6b), + 8: Color(0xff005d85), + 9: Color(0xff68ddfd), + 10: Color(0xff8ae8ff), + 11: Color(0xff2ec8ee), + 12: Color(0xffeaf8ff) + }, +); + +const _skyDarkAlpha = ColorSwatch( + 0xfa6ae1ff, + { + 1: Color(0x00000000), + 2: Color(0x0b0087fe), + 3: Color(0x1900a5fe), + 4: Color(0x2600a6ff), + 5: Color(0x3200a9fe), + 6: Color(0x4100aefe), + 7: Color(0x5600aefe), + 8: Color(0x7400aeff), + 9: Color(0xfa6ae1ff), + 10: Color(0xfa8decff), + 11: Color(0xec31d6ff), + 12: Color(0xfaeffdff) + }, +); + +const _slate = ColorSwatch( + 0xff889096, + { + 1: Color(0xfffbfcfd), + 2: Color(0xfff8f9fa), + 3: Color(0xfff1f3f5), + 4: Color(0xffeceef0), + 5: Color(0xffe6e8eb), + 6: Color(0xffdfe3e6), + 7: Color(0xffd7dbdf), + 8: Color(0xffc1c8cd), + 9: Color(0xff889096), + 10: Color(0xff7e868c), + 11: Color(0xff687076), + 12: Color(0xff11181c) + }, +); + +const _slateAlpha = ColorSwatch( + 0x7700111e, + { + 1: Color(0x04054482), + 2: Color(0x0705294d), + 3: Color(0x0e002549), + 4: Color(0x13021c37), + 5: Color(0x19021735), + 6: Color(0x20012139), + 7: Color(0x28001a33), + 8: Color(0x3e011e32), + 9: Color(0x7700111e), + 10: Color(0x8100101b), + 11: Color(0x97000e18), + 12: Color(0xee00080c) + }, +); + +const _slateDark = ColorSwatch( + 0xff697177, + { + 1: Color(0xff151718), + 2: Color(0xff1a1d1e), + 3: Color(0xff202425), + 4: Color(0xff26292b), + 5: Color(0xff2b2f31), + 6: Color(0xff313538), + 7: Color(0xff3a3f42), + 8: Color(0xff4c5155), + 9: Color(0xff697177), + 10: Color(0xff787f85), + 11: Color(0xff9ba1a6), + 12: Color(0xffecedee) + }, +); + +const _slateDarkAlpha = ColorSwatch( + 0x69e1f1ff, + { + 1: Color(0x00000000), + 2: Color(0x07d5feff), + 3: Color(0x0fd6fbfc), + 4: Color(0x15e2f0fd), + 5: Color(0x1cdff3fd), + 6: Color(0x23dfeffe), + 7: Color(0x2ee0f3ff), + 8: Color(0x44e5f2fe), + 9: Color(0x69e1f1ff), + 10: Color(0x78e7f3ff), + 11: Color(0x9deff7ff), + 12: Color(0xecfdfeff) + }, +); + +const _teal = ColorSwatch( + 0xff12a594, + { + 1: Color(0xfffafefd), + 2: Color(0xfff1fcfa), + 3: Color(0xffe7f9f5), + 4: Color(0xffd9f3ee), + 5: Color(0xffc7ebe5), + 6: Color(0xffafdfd7), + 7: Color(0xff8dcec3), + 8: Color(0xff53b9ab), + 9: Color(0xff12a594), + 10: Color(0xff0e9888), + 11: Color(0xff067a6f), + 12: Color(0xff10302b) + }, +); + +const _tealAlpha = ColorSwatch( + 0xed009e8c, + { + 1: Color(0x0505cd9b), + 2: Color(0x0e01c8a4), + 3: Color(0x1802c097), + 4: Color(0x2602af8c), + 5: Color(0x3800a489), + 6: Color(0x50009980), + 7: Color(0x7201927a), + 8: Color(0xac009783), + 9: Color(0xed009e8c), + 10: Color(0xf1009281), + 11: Color(0xf900776b), + 12: Color(0xef00221d) + }, +); + +const _tealDark = ColorSwatch( + 0xff12a594, + { + 1: Color(0xff091915), + 2: Color(0xff04201b), + 3: Color(0xff062923), + 4: Color(0xff07312b), + 5: Color(0xff083932), + 6: Color(0xff09443c), + 7: Color(0xff0b544a), + 8: Color(0xff0c6d62), + 9: Color(0xff12a594), + 10: Color(0xff10b3a3), + 11: Color(0xff0ac5b3), + 12: Color(0xffe1faf4) + }, +); + +const _tealDarkAlpha = ColorSwatch( + 0x9b18ffe4, + { + 1: Color(0x00000000), + 2: Color(0x0800fbd5), + 3: Color(0x1200fddc), + 4: Color(0x1b00fde8), + 5: Color(0x2402fee4), + 6: Color(0x3009ffe6), + 7: Color(0x4211ffe3), + 8: Color(0x5d11ffe7), + 9: Color(0x9b18ffe4), + 10: Color(0xab13ffe7), + 11: Color(0xbf0affe7), + 12: Color(0xfae6fff9) + }, +); + +const _tomato = ColorSwatch( + 0xffe54d2e, + { + 1: Color(0xfffffcfc), + 2: Color(0xfffff8f7), + 3: Color(0xfffff0ee), + 4: Color(0xffffe6e2), + 5: Color(0xfffdd8d3), + 6: Color(0xfffac7be), + 7: Color(0xfff3b0a2), + 8: Color(0xffea9280), + 9: Color(0xffe54d2e), + 10: Color(0xffdb4324), + 11: Color(0xffca3214), + 12: Color(0xff341711) + }, +); + +const _tomatoAlpha = ColorSwatch( + 0xd1df2500, + { + 1: Color(0x03ff0505), + 2: Color(0x08ff2605), + 3: Color(0x11ff1f01), + 4: Color(0x1dff2201), + 5: Color(0x2cf41d01), + 6: Color(0x41ec2300), + 7: Color(0x5dde2500), + 8: Color(0x7fd52401), + 9: Color(0xd1df2500), + 10: Color(0xdbd52400), + 11: Color(0xebc62100), + 12: Color(0xee260600) + }, +); + +const _tomatoDark = ColorSwatch( + 0xffe54d2e, + { + 1: Color(0xff1d1412), + 2: Color(0xff2a1410), + 3: Color(0xff3b1813), + 4: Color(0xff481a14), + 5: Color(0xff541c15), + 6: Color(0xff652016), + 7: Color(0xff7f2315), + 8: Color(0xffa42a12), + 9: Color(0xffe54d2e), + 10: Color(0xffec5e41), + 11: Color(0xfff16a50), + 12: Color(0xfffeefec) + }, +); + +const _tomatoDarkAlpha = ColorSwatch( + 0xe2ff5431, + { + 1: Color(0x00000000), + 2: Color(0x0ffd1500), + 3: Color(0x22ff3019), + 4: Color(0x31fe331c), + 5: Color(0x3efe351e), + 6: Color(0x51ff391e), + 7: Color(0x6fff3719), + 8: Color(0x98ff3a12), + 9: Color(0xe2ff5431), + 10: Color(0xeaff6445), + 11: Color(0xefff7054), + 12: Color(0xfafff3f0) + }, +); + +const _violet = ColorSwatch( + 0xff6e56cf, + { + 1: Color(0xfffdfcfe), + 2: Color(0xfffbfaff), + 3: Color(0xfff5f2ff), + 4: Color(0xffede9fe), + 5: Color(0xffe4defc), + 6: Color(0xffd7cff9), + 7: Color(0xffc4b8f3), + 8: Color(0xffaa99ec), + 9: Color(0xff6e56cf), + 10: Color(0xff644fc1), + 11: Color(0xff5746af), + 12: Color(0xff20134b) + }, +); + +const _violetAlpha = ColorSwatch( + 0xa92500b6, + { + 1: Color(0x035805ab), + 2: Color(0x053705ff), + 3: Color(0x0d3c00ff), + 4: Color(0x162e02f4), + 5: Color(0x212f01e8), + 6: Color(0x302a01df), + 7: Color(0x472b01d4), + 8: Color(0x662a00d0), + 9: Color(0xa92500b6), + 10: Color(0xb01f00a5), + 11: Color(0xb9180091), + 12: Color(0xec0e003d) + }, +); + +const _violetDark = ColorSwatch( + 0xff6e56cf, + { + 1: Color(0xff17151f), + 2: Color(0xff1c172b), + 3: Color(0xff251e40), + 4: Color(0xff2c2250), + 5: Color(0xff32275f), + 6: Color(0xff392c72), + 7: Color(0xff443592), + 8: Color(0xff5842c3), + 9: Color(0xff6e56cf), + 10: Color(0xff7c66dc), + 11: Color(0xff9e8cfc), + 12: Color(0xfff1eefe) + }, +); + +const _violetDarkAlpha = ColorSwatch( + 0xc88668ff, + { + 1: Color(0x00000000), + 2: Color(0x0e743afd), + 3: Color(0x267452fe), + 4: Color(0x387650ff), + 5: Color(0x497654ff), + 6: Color(0x5f7253ff), + 7: Color(0x837053ff), + 8: Color(0xbb6f52ff), + 9: Color(0xc88668ff), + 10: Color(0xd78e75ff), + 11: Color(0xfaa18eff), + 12: Color(0xfaf5f2ff) + }, +); + +const _whiteAlpha = ColorSwatch( + 0xebffffff, + { + 1: Color(0x00ffffff), + 2: Color(0x03ffffff), + 3: Color(0x09ffffff), + 4: Color(0x0effffff), + 5: Color(0x16ffffff), + 6: Color(0x20ffffff), + 7: Color(0x2dffffff), + 8: Color(0x3fffffff), + 9: Color(0x62ffffff), + 10: Color(0x72ffffff), + 11: Color(0x97ffffff), + 12: Color(0xebffffff) + }, +); + +const _yellow = ColorSwatch( + 0xffebbc00, + { + 1: Color(0xfffdfdf9), + 2: Color(0xfffffce8), + 3: Color(0xfffffbd1), + 4: Color(0xfffff8bb), + 5: Color(0xfffef2a4), + 6: Color(0xfff9e68c), + 7: Color(0xffefd36c), + 8: Color(0xffebbc00), + 9: Color(0xfff5d90a), + 10: Color(0xfff7ce00), + 11: Color(0xff946800), + 12: Color(0xff35290f) + }, +); + +const _yellowAlpha = ColorSwatch( + 0xfaebbc00, + { + 1: Color(0x06abab05), + 2: Color(0x17ffdd02), + 3: Color(0x2effea01), + 4: Color(0x44ffe601), + 5: Color(0x5bfcdb00), + 6: Color(0x73f2c900), + 7: Color(0x93e3b200), + 8: Color(0xfaebbc00), + 9: Color(0xf5f5d800), + 10: Color(0xfaf7ce00), + 11: Color(0xfa926600), + 12: Color(0xf0291c00) + }, +); + +const _yellowDark = ColorSwatch( + 0xfff5d90a, + { + 1: Color(0xff1c1500), + 2: Color(0xff221a00), + 3: Color(0xff2c2100), + 4: Color(0xff352800), + 5: Color(0xff3e3000), + 6: Color(0xff493c00), + 7: Color(0xff594a05), + 8: Color(0xff705e00), + 9: Color(0xfff5d90a), + 10: Color(0xffffef5c), + 11: Color(0xfff0c000), + 12: Color(0xfffffad1) + }, +); + +const _yellowDarkAlpha = ColorSwatch( + 0xf4ffe20a, + { + 1: Color(0x00000000), + 2: Color(0x07facd00), + 3: Color(0x12fdbe00), + 4: Color(0x1cfdc200), + 5: Color(0x26fec700), + 6: Color(0x33fed800), + 7: Color(0x45ffdb13), + 8: Color(0x5ffed800), + 9: Color(0xf4ffe20a), + 10: Color(0xfafff45e), + 11: Color(0xeeffcc00), + 12: Color(0xfaffffd5) + }, +); diff --git a/packages/remix/lib/helpers/color_utils.dart b/packages/remix/lib/helpers/color_utils.dart index 38407e25a..7b94d6f5c 100644 --- a/packages/remix/lib/helpers/color_utils.dart +++ b/packages/remix/lib/helpers/color_utils.dart @@ -1,10 +1,54 @@ +import 'dart:math' as math; + import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; + +extension ColorUtilityX on ColorUtility { + T alphaBlend(Color foreground, Color background) => + call(Color.alphaBlend(foreground, background)); +} -Color contrastColor(Color color) { - return color.computeLuminance() > 0.5 ? Colors.black : Colors.white; +double _calculateContrast(Color backgroundColor, Color textColor) { + /// Calculates the contrast ratio between two colors. + /// + /// The contrast ratio is a measure of the perceived difference in brightness + /// between the text color and the background color. A higher ratio indicates + /// better readability. + /// + /// The calculation involves: + /// 1. Computing the relative luminance of each color. + /// 2. Finding the lighter (brightest) and darker (darkest) colors. + /// 3. Applying the contrast ratio formula: (brightest + 0.05) / (darkest + 0.05) + /// + /// Note: Relative luminance calculation is computationally expensive. + var lum1 = textColor.computeLuminance(); + var lum2 = backgroundColor.computeLuminance(); + + var brightest = math.max(lum1, lum2); + var darkest = math.min(lum1, lum2); + + return (brightest + 0.05) / (darkest + 0.05); } -Map getColorSwatch(Color color) { +class RXColor { + final Color color; + final ColorSwatch swatch; + + RXColor(this.color) : swatch = getColorSwatch(color); + + Color get shade50 => swatch[50]!; + Color get shade100 => swatch[100]!; + Color get shade200 => swatch[200]!; + Color get shade300 => swatch[300]!; + Color get shade400 => swatch[400]!; + Color get shade500 => swatch[500]!; + Color get shade600 => swatch[600]!; + Color get shade700 => swatch[700]!; + Color get shade800 => swatch[800]!; + Color get shade900 => swatch[900]!; +} + +ColorSwatch getColorSwatch(Color color) { final hslColor = HSLColor.fromColor(color); final lightness = hslColor.lightness; @@ -23,7 +67,7 @@ Map getColorSwatch(Color color) { final lowStep = (1.0 - lightness) / lowDivisor; final highStep = lightness / highDivisor; - return { + return ColorSwatch(color.value, { 50: (hslColor.withLightness(lightness + (lowStep * 5))).toColor(), 100: (hslColor.withLightness(lightness + (lowStep * 4))).toColor(), 200: (hslColor.withLightness(lightness + (lowStep * 3))).toColor(), @@ -34,5 +78,119 @@ Map getColorSwatch(Color color) { 700: (hslColor.withLightness(lightness - (highStep * 2))).toColor(), 800: (hslColor.withLightness(lightness - (highStep * 3))).toColor(), 900: (hslColor.withLightness(lightness - (highStep * 4))).toColor(), - }; + }); +} + +const amberScale = ColorSwatch( + 0xffee9d2b, + { + 1: Color(0xfffefdfb), + 2: Color(0xfffff9ed), + 3: Color(0xfffff4d5), + 4: Color(0xffffecbc), + 5: Color(0xffffe3a2), + 6: Color(0xffffd386), + 7: Color(0xfff3ba63), + 8: Color(0xffee9d2b), + 9: Color(0xffffb224), + 10: Color(0xffffa01c), + 11: Color(0xffad5700), + 12: Color(0xff4e2009) + }, +); + +const amberAScale = ColorSwatch( + 0xd4ea8900, + { + 1: Color(0x04c08205), + 2: Color(0x12ffab02), + 3: Color(0x2affbb01), + 4: Color(0x43ffb700), + 5: Color(0x5dffb300), + 6: Color(0x79ffa201), + 7: Color(0x9cec8d00), + 8: Color(0xd4ea8900), + 9: Color(0xdbffa600), + 10: Color(0xe3ff9500), + 11: Color(0xfaab5300), + 12: Color(0xf6481800) + }, +); + +const amberDarkScale = ColorSwatch( + 0xffffb224, + { + 1: Color(0xff1f1300), + 2: Color(0xff271700), + 3: Color(0xff341c00), + 4: Color(0xff3f2200), + 5: Color(0xff4a2900), + 6: Color(0xff573300), + 7: Color(0xff693f05), + 8: Color(0xff824e00), + 9: Color(0xffffb224), + 10: Color(0xffffcb47), + 11: Color(0xfff1a10d), + 12: Color(0xfffef3dd) + }, +); + +const amberDarkAScale = ColorSwatch( + 0xfaffb625, + { + 1: Color(0x00000000), + 2: Color(0x09fd8300), + 3: Color(0x18fe7300), + 4: Color(0x24ff7b00), + 5: Color(0x31ff8400), + 6: Color(0x40ff9500), + 7: Color(0x54ff970f), + 8: Color(0x71ff9900), + 9: Color(0xfaffb625), + 10: Color(0xfaffce48), + 11: Color(0xefffab0e), + 12: Color(0xfafff8e1) + }, +); + +const blueScale = ColorSwatch( + 0xff0091ff, + { + 1: Color(0xfffbfdff), + 2: Color(0xfff5faff), + 3: Color(0xffedf6ff), + 4: Color(0xffe1f0ff), + 5: Color(0xffcee7fe), + 6: Color(0xffb7d9f8), + 7: Color(0xff96c7f2), + 8: Color(0xff5eb0ef), + 9: Color(0xff0091ff), + 10: Color(0xff0081f1), + 11: Color(0xff006adc), + 12: Color(0xff00254d) + }, +); + +Color getTextColor(Color background) { + const white = Color(0xFFFFFFFF); + + final contrastRatio = _calculateContrast(white, background); + + if (contrastRatio <= 4.5) { + final hslBackground = HSLColor.fromColor(background); + final lightness = hslBackground.lightness; + final saturation = hslBackground.saturation; + final hue = hslBackground.hue; + + final adjustedLightness = lightness < 0.5 ? 0.95 : 0.05; + + return HSLColor.fromAHSL( + 1.0, + hue, + saturation * 0.08, + adjustedLightness, + ).toColor(); + } + + return white; } diff --git a/packages/remix/lib/helpers/context_ext.dart b/packages/remix/lib/helpers/context_ext.dart new file mode 100644 index 000000000..d4d559a5e --- /dev/null +++ b/packages/remix/lib/helpers/context_ext.dart @@ -0,0 +1,6 @@ +import 'package:flutter/material.dart'; + +extension BuildContextX on BuildContext { + bool get isDarkMode => Theme.of(this).brightness == Brightness.dark; + bool get isLightMode => Theme.of(this).brightness == Brightness.light; +} diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index 211c998e8..0a97203b7 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -3,3 +3,4 @@ library remix; export 'components/button/button.dart'; export 'components/button/button.style.dart'; export 'components/button/button.variants.dart'; +export 'tokens/remix_tokens.dart'; diff --git a/packages/remix/lib/tokens/color_tokens.dart b/packages/remix/lib/tokens/color_tokens.dart new file mode 100644 index 000000000..8a4dfe6d5 --- /dev/null +++ b/packages/remix/lib/tokens/color_tokens.dart @@ -0,0 +1,173 @@ +import 'package:flutter/rendering.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/helpers/color_palette.dart'; + +const _accent1 = ColorToken('accent.1'); +const _accent2 = ColorToken('accent.2'); +const _accent3 = ColorToken('accent.3'); +const _accent4 = ColorToken('accent.4'); +const _accent5 = ColorToken('accent.5'); +const _accent6 = ColorToken('accent.6'); +const _accent7 = ColorToken('accent.7'); +const _accent8 = ColorToken('accent.8'); +const _accent9 = ColorToken('accent.9'); +const _accent10 = ColorToken('accent.10'); +const _accent11 = ColorToken('accent.11'); +const _accent12 = ColorToken('accent.12'); +const _accent1A = ColorToken('accent.1.alpha'); +const _accent2A = ColorToken('accent.2.alpha'); +const _accent3A = ColorToken('accent.3.alpha'); +const _accent4A = ColorToken('accent.4.alpha'); +const _accent5A = ColorToken('accent.5.alpha'); +const _accent6A = ColorToken('accent.6.alpha'); +const _accent7A = ColorToken('accent.7.alpha'); +const _accent8A = ColorToken('accent.8.alpha'); +const _accent9A = ColorToken('accent.9.alpha'); +const _accent10A = ColorToken('accent.10.alpha'); +const _accent11A = ColorToken('accent.11.alpha'); +const _accent12A = ColorToken('accent.12.alpha'); + +const _neutral1 = ColorToken('neutral.1'); +const _neutral2 = ColorToken('neutral.2'); +const _neutral3 = ColorToken('neutral.3'); +const _neutral4 = ColorToken('neutral.4'); +const _neutral5 = ColorToken('neutral.5'); +const _neutral6 = ColorToken('neutral.6'); +const _neutral7 = ColorToken('neutral.7'); +const _neutral8 = ColorToken('neutral.8'); +const _neutral9 = ColorToken('neutral.9'); +const _neutral10 = ColorToken('neutral.10'); +const _neutral11 = ColorToken('neutral.11'); +const _neutral12 = ColorToken('neutral.12'); +const _neutral1A = ColorToken('neutral.1.alpha'); +const _neutral2A = ColorToken('neutral.2.alpha'); +const _neutral3A = ColorToken('neutral.3.alpha'); +const _neutral4A = ColorToken('neutral.4.alpha'); +const _neutral5A = ColorToken('neutral.5.alpha'); +const _neutral6A = ColorToken('neutral.6.alpha'); +const _neutral7A = ColorToken('neutral.7.alpha'); +const _neutral8A = ColorToken('neutral.8.alpha'); +const _neutral9A = ColorToken('neutral.9.alpha'); +const _neutral10A = ColorToken('neutral.10.alpha'); +const _neutral11A = ColorToken('neutral.11.alpha'); +const _neutral12A = ColorToken('neutral.12.alpha'); + +class RemixColor { + const RemixColor(); + + final accent1 = _accent1; + final accent2 = _accent2; + final accent3 = _accent3; + final accent4 = _accent4; + final accent5 = _accent5; + final accent6 = _accent6; + final accent7 = _accent7; + final accent8 = _accent8; + final accent9 = _accent9; + final accent10 = _accent10; + final accent11 = _accent11; + final accent12 = _accent12; + final accent1A = _accent1A; + final accent2A = _accent2A; + final accent3A = _accent3A; + final accent4A = _accent4A; + final accent5A = _accent5A; + final accent6A = _accent6A; + final accent7A = _accent7A; + final accent8A = _accent8A; + final accent9A = _accent9A; + final accent10A = _accent10A; + final accent11A = _accent11A; + final accent12A = _accent12A; + + final neutral1 = _neutral1; + final neutral2 = _neutral2; + final neutral3 = _neutral3; + final neutral4 = _neutral4; + final neutral5 = _neutral5; + final neutral6 = _neutral6; + final neutral7 = _neutral7; + final neutral8 = _neutral8; + final neutral9 = _neutral9; + final neutral10 = _neutral10; + final neutral11 = _neutral11; + final neutral12 = _neutral12; + final neutral1A = _neutral1A; + final neutral2A = _neutral2A; + final neutral3A = _neutral3A; + final neutral4A = _neutral4A; + final neutral5A = _neutral5A; + final neutral6A = _neutral6A; + final neutral7A = _neutral7A; + final neutral8A = _neutral8A; + final neutral9A = _neutral9A; + final neutral10A = _neutral10A; + final neutral11A = _neutral11A; + final neutral12A = _neutral12A; +} + +Map _mapColorRadixTokens({ + required RadixColors accent, + required RadixColors neutral, +}) { + const color = RemixColor(); + return { + color.accent1: accent.s1, + color.accent2: accent.s2, + color.accent3: accent.s3, + color.accent4: accent.s4, + color.accent5: accent.s5, + color.accent6: accent.s6, + color.accent7: accent.s7, + color.accent8: accent.s8, + color.accent9: accent.s9, + color.accent10: accent.s10, + color.accent11: accent.s11, + color.accent12: accent.s12, + color.accent1A: accent.s1Alpha, + color.accent2A: accent.s2Alpha, + color.accent3A: accent.s3Alpha, + color.accent4A: accent.s4Alpha, + color.accent5A: accent.s5Alpha, + color.accent6A: accent.s6Alpha, + color.accent7A: accent.s7Alpha, + color.accent8A: accent.s8Alpha, + color.accent9A: accent.s9Alpha, + color.accent10A: accent.s10Alpha, + color.accent11A: accent.s11Alpha, + color.accent12A: accent.s12Alpha, + color.neutral1: neutral.s1, + color.neutral2: neutral.s2, + color.neutral3: neutral.s3, + color.neutral4: neutral.s4, + color.neutral5: neutral.s5, + color.neutral6: neutral.s6, + color.neutral7: neutral.s7, + color.neutral8: neutral.s8, + color.neutral9: neutral.s9, + color.neutral10: neutral.s10, + color.neutral11: neutral.s11, + color.neutral12: neutral.s12, + color.neutral1A: neutral.s1Alpha, + color.neutral2A: neutral.s2Alpha, + color.neutral3A: neutral.s3Alpha, + color.neutral4A: neutral.s4Alpha, + color.neutral5A: neutral.s5Alpha, + color.neutral6A: neutral.s6Alpha, + color.neutral7A: neutral.s7Alpha, + color.neutral8A: neutral.s8Alpha, + color.neutral9A: neutral.s9Alpha, + color.neutral10A: neutral.s10Alpha, + color.neutral11A: neutral.s11Alpha, + color.neutral12A: neutral.s12Alpha, + }; +} + +final remixColorTokens = _mapColorRadixTokens( + accent: RadixColors.indigo, + neutral: RadixColors.gray, +); +final remixDarkColorTokens = _mapColorRadixTokens( + accent: RadixColors.indigoDark, + neutral: RadixColors.grayDark, +); diff --git a/packages/remix/lib/tokens/radius_tokens.dart b/packages/remix/lib/tokens/radius_tokens.dart new file mode 100644 index 000000000..31e47f54c --- /dev/null +++ b/packages/remix/lib/tokens/radius_tokens.dart @@ -0,0 +1,30 @@ +import 'package:flutter/rendering.dart'; +import 'package:mix/mix.dart'; + +const _radius1 = RadiusToken('r1'); +const _radius2 = RadiusToken('r2'); +const _radius3 = RadiusToken('r3'); +const _radius4 = RadiusToken('r4'); +const _radius5 = RadiusToken('r5'); +const _radius6 = RadiusToken('r6'); + +class RemixRadius { + const RemixRadius(); + + final r1 = _radius1; + final r2 = _radius2; + final r3 = _radius3; + final r4 = _radius4; + final r5 = _radius5; + final r6 = _radius6; +} + +const _radii = RemixRadius(); +final remixRadiusTokens = { + _radii.r1: const Radius.circular(4), + _radii.r2: const Radius.circular(8), + _radii.r3: const Radius.circular(12), + _radii.r4: const Radius.circular(16), + _radii.r5: const Radius.circular(24), + _radii.r6: const Radius.circular(32), +}; diff --git a/packages/remix/lib/tokens/remix_tokens.dart b/packages/remix/lib/tokens/remix_tokens.dart new file mode 100644 index 000000000..50879fa46 --- /dev/null +++ b/packages/remix/lib/tokens/remix_tokens.dart @@ -0,0 +1,117 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/helpers/context_ext.dart'; +import 'package:remix/tokens/color_tokens.dart'; +import 'package:remix/tokens/radius_tokens.dart'; +import 'package:remix/tokens/space_tokens.dart'; +import 'package:remix/tokens/text_style_tokens.dart'; + +final $rx = _RemixTokenRef(); + +class _RemixTokenRef { + _RemixTokenRef(); + final _color = const RemixColor(); + late final accent1 = _color.accent1; + late final accent2 = _color.accent2; + late final accent3 = _color.accent3; + late final accent4 = _color.accent4; + late final accent5 = _color.accent5; + late final accent6 = _color.accent6; + late final accent7 = _color.accent7; + late final accent8 = _color.accent8; + late final accent9 = _color.accent9; + late final accent10 = _color.accent10; + late final accent11 = _color.accent11; + late final accent12 = _color.accent12; + late final accent1A = _color.accent1A; + late final accent2A = _color.accent2A; + late final accent3A = _color.accent3A; + late final accent4A = _color.accent4A; + late final accent5A = _color.accent5A; + late final accent6A = _color.accent6A; + late final accent7A = _color.accent7A; + late final accent8A = _color.accent8A; + late final accent9A = _color.accent9A; + late final accent10A = _color.accent10A; + late final accent11A = _color.accent11A; + late final accent12A = _color.accent12A; + late final neutral1 = _color.neutral1; + late final neutral2 = _color.neutral2; + late final neutral3 = _color.neutral3; + late final neutral4 = _color.neutral4; + late final neutral5 = _color.neutral5; + late final neutral6 = _color.neutral6; + late final neutral7 = _color.neutral7; + late final neutral8 = _color.neutral8; + late final neutral9 = _color.neutral9; + late final neutral10 = _color.neutral10; + late final neutral11 = _color.neutral11; + late final neutral12 = _color.neutral12; + late final neutral1A = _color.neutral1A; + late final neutral2A = _color.neutral2A; + late final neutral3A = _color.neutral3A; + late final neutral4A = _color.neutral4A; + late final neutral5A = _color.neutral5A; + late final neutral6A = _color.neutral6A; + late final neutral7A = _color.neutral7A; + late final neutral8A = _color.neutral8A; + late final neutral9A = _color.neutral9A; + late final neutral10A = _color.neutral10A; + late final neutral11A = _color.neutral11A; + late final neutral12A = _color.neutral12A; + + final _space = const RemixSpace(); + late final space1 = _space.s1; + late final space2 = _space.s2; + late final space3 = _space.s3; + late final space4 = _space.s4; + late final space5 = _space.s5; + late final space6 = _space.s6; + late final space7 = _space.s7; + late final space8 = _space.s8; + late final space9 = _space.s9; + + final _radius = const RemixRadius(); + late final radius1 = _radius.r1; + late final radius2 = _radius.r2; + late final radius3 = _radius.r3; + late final radius4 = _radius.r4; + late final radius5 = _radius.r5; + late final radius6 = _radius.r6; + + final _text = const RemixTypography(); + late final text1 = _text.t1; + late final text2 = _text.t2; + late final text3 = _text.t3; + late final text4 = _text.t4; + late final text5 = _text.t5; + late final text6 = _text.t6; + late final text7 = _text.t7; + late final text8 = _text.t8; + late final text9 = _text.t9; +} + +final _baseRemixTokens = MixThemeData( + colors: remixColorTokens, + textStyles: remixTextTokens, + spaces: remixSpaceTokens, + radii: remixRadiusTokens, +); +final _lightRemixTokens = _baseRemixTokens; +final _darkRemixTokens = _baseRemixTokens.copyWith( + colors: remixDarkColorTokens, +); + +class RemixTokens extends StatelessWidget { + const RemixTokens({super.key, required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + return MixTheme( + data: context.isDarkMode ? _darkRemixTokens : _lightRemixTokens, + child: child, + ); + } +} diff --git a/packages/remix/lib/tokens/space_tokens.dart b/packages/remix/lib/tokens/space_tokens.dart new file mode 100644 index 000000000..68721cc85 --- /dev/null +++ b/packages/remix/lib/tokens/space_tokens.dart @@ -0,0 +1,38 @@ +import 'package:mix/mix.dart'; + +const _space1 = SpaceToken('space1'); +const _space2 = SpaceToken('space2'); +const _space3 = SpaceToken('space3'); +const _space4 = SpaceToken('space4'); +const _space5 = SpaceToken('space5'); +const _space6 = SpaceToken('space6'); +const _space7 = SpaceToken('space7'); +const _space8 = SpaceToken('space8'); +const _space9 = SpaceToken('space9'); + +class RemixSpace { + const RemixSpace(); + + final s1 = _space1; + final s2 = _space2; + final s3 = _space3; + final s4 = _space4; + final s5 = _space5; + final s6 = _space6; + final s7 = _space7; + final s8 = _space8; + final s9 = _space9; +} + +const _radii = RemixSpace(); +final remixSpaceTokens = { + _radii.s1: 4, + _radii.s2: 8, + _radii.s3: 12, + _radii.s4: 16, + _radii.s5: 24, + _radii.s6: 32, + _radii.s7: 40, + _radii.s8: 48, + _radii.s9: 64, +}; diff --git a/packages/remix/lib/tokens/text_style_tokens.dart b/packages/remix/lib/tokens/text_style_tokens.dart new file mode 100644 index 000000000..97ad27b76 --- /dev/null +++ b/packages/remix/lib/tokens/text_style_tokens.dart @@ -0,0 +1,80 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; + +const _text1 = TextStyleToken('text1'); +const _text2 = TextStyleToken('text2'); +const _text3 = TextStyleToken('text3'); +const _text4 = TextStyleToken('text4'); +const _text5 = TextStyleToken('text5'); +const _text6 = TextStyleToken('text6'); +const _text7 = TextStyleToken('text7'); +const _text8 = TextStyleToken('text8'); +const _text9 = TextStyleToken('text9'); + +class RemixTypography { + const RemixTypography(); + + final t1 = _text1; + final t2 = _text2; + final t3 = _text3; + final t4 = _text4; + final t5 = _text5; + final t6 = _text6; + final t7 = _text7; + final t8 = _text8; + final t9 = _text9; +} + +const _typography = RemixTypography(); + +final remixTextTokens = { + _typography.t1: const TextStyle( + inherit: false, + fontSize: 12, + letterSpacing: 0.0025, + height: 1.4, + ), + _typography.t2: const TextStyle( + inherit: false, + fontSize: 14, + letterSpacing: 0, + height: 1.4, + ), + _typography.t3: const TextStyle( + inherit: false, + fontSize: 16, + letterSpacing: 0, + height: 1.4, + ), + _typography.t4: const TextStyle( + inherit: false, + fontSize: 18, + letterSpacing: -0.0025, + height: 1.4, + ), + _typography.t5: const TextStyle( + fontSize: 20, + letterSpacing: -0.005, + height: 1.4, + ), + _typography.t6: const TextStyle( + fontSize: 24, + letterSpacing: -0.00625, + height: 1.4, + ), + _typography.t7: const TextStyle( + fontSize: 28, + letterSpacing: -0.0075, + height: 1.4, + ), + _typography.t8: const TextStyle( + fontSize: 35, + letterSpacing: -0.01, + height: 1.4, + ), + _typography.t9: const TextStyle( + fontSize: 60, + letterSpacing: -0.025, + height: 1.4, + ), +}; diff --git a/packages/remix/test/components/button_test.dart b/packages/remix/test/components/button_test.dart index 96bb4991d..d6f7cd1d4 100644 --- a/packages/remix/test/components/button_test.dart +++ b/packages/remix/test/components/button_test.dart @@ -30,7 +30,6 @@ void main() { home: RXButton( label: 'Test Button', loading: true, - loadingLabel: loadingLabel, onPressed: () {}, ), ), From a2da4ed6110e977e66375e7734c446fac0f2e617 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Mon, 1 Jul 2024 20:15:59 -0400 Subject: [PATCH 05/24] Finished button --- .../lib/src/mixable_dto_generator.dart | 1 - .../demo/lib/addons/brightness_addon.dart | 43 +++ .../remix/demo/lib/addons/icon_data_knob.dart | 65 +++++ .../remix/demo/lib/components/button.dart | 26 +- packages/remix/demo/lib/main.dart | 33 ++- .../ephemeral/FlutterInputs.xcfilelist | 2 +- .../remix/lib/components/button/button.dart | 59 ++-- .../lib/components/button/button.style.dart | 270 +++++++++--------- packages/remix/lib/tokens/remix_tokens.dart | 12 +- .../remix/lib/tokens/text_style_tokens.dart | 6 +- .../remix/test/components/button_test.dart | 14 +- 11 files changed, 333 insertions(+), 198 deletions(-) create mode 100644 packages/remix/demo/lib/addons/brightness_addon.dart create mode 100644 packages/remix/demo/lib/addons/icon_data_knob.dart diff --git a/packages/mix_generator/lib/src/mixable_dto_generator.dart b/packages/mix_generator/lib/src/mixable_dto_generator.dart index 6e725f9ad..c86afd1c5 100644 --- a/packages/mix_generator/lib/src/mixable_dto_generator.dart +++ b/packages/mix_generator/lib/src/mixable_dto_generator.dart @@ -6,7 +6,6 @@ import 'package:mix_annotations/mix_annotations.dart'; import 'package:mix_generator/src/builders/dto/class_utility_dto.dart'; import 'package:mix_generator/src/builders/dto/extension_value.dart'; import 'package:mix_generator/src/builders/dto/mixin_dto.dart'; -// ignore_for_file: prefer_relative_imports import 'package:mix_generator/src/helpers/field_info.dart'; import 'package:mix_generator/src/helpers/settings.dart'; import 'package:mix_generator/src/helpers/visitors.dart'; diff --git a/packages/remix/demo/lib/addons/brightness_addon.dart b/packages/remix/demo/lib/addons/brightness_addon.dart new file mode 100644 index 000000000..d44074d95 --- /dev/null +++ b/packages/remix/demo/lib/addons/brightness_addon.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; + +class BrightnessAddon extends WidgetbookAddon { + final Brightness initialBrightness; + + BrightnessAddon({ + this.initialBrightness = Brightness.light, + }) : super(name: 'Brightness'); + + @override + Widget buildUseCase( + BuildContext context, + Widget child, + Brightness setting, + ) { + return Theme( + data: ThemeData( + brightness: setting, + ), + child: child, + ); + } + + @override + List> get fields { + return [ + ListField( + name: 'brightness', + initialValue: initialBrightness, + values: [ + Brightness.light, + Brightness.dark, + ], + ) + ]; + } + + @override + Brightness valueFromQueryGroup(Map group) { + return valueOf('brightness', group)!; + } +} diff --git a/packages/remix/demo/lib/addons/icon_data_knob.dart b/packages/remix/demo/lib/addons/icon_data_knob.dart new file mode 100644 index 000000000..c6b3452e8 --- /dev/null +++ b/packages/remix/demo/lib/addons/icon_data_knob.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:widgetbook/widgetbook.dart'; + +enum IconDataEnum { + none, + home, + settings, + favorite, + add, + delete, +} + +class IconDataKnob extends Knob { + IconDataKnob({ + required super.label, + super.initialValue, + }); + + @override + List get fields => [ + ListField( + name: label, + initialValue: IconDataEnum.none, + labelBuilder: (value) => value.name, + values: IconDataEnum.values, + ), + ]; + + @override + IconData? valueFromQueryGroup(Map group) { + final iconDataString = group[label]; + if (iconDataString != null) { + final iconDataEnum = IconDataEnum.values.firstWhere( + (e) => e.toString() == 'IconDataEnum.$iconDataString', + orElse: () => IconDataEnum.home, + ); + return _iconDataFromEnum(iconDataEnum); + } + return null; + } + + IconData? _iconDataFromEnum(IconDataEnum iconDataEnum) { + return switch (iconDataEnum) { + IconDataEnum.home => Icons.home, + IconDataEnum.settings => Icons.settings, + IconDataEnum.favorite => Icons.favorite, + IconDataEnum.add => Icons.add, + IconDataEnum.delete => Icons.delete, + IconDataEnum.none => null, + }; + } +} + +extension IconDataKnobBuilder on KnobsBuilder { + IconData? iconData({ + required String label, + IconData? initialValue, + }) => + onKnobAdded( + IconDataKnob( + label: label, + initialValue: initialValue, + ), + ); +} diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button.dart index fd644a074..a975ca89b 100644 --- a/packages/remix/demo/lib/components/button.dart +++ b/packages/remix/demo/lib/components/button.dart @@ -1,3 +1,4 @@ +import 'package:demo/addons/icon_data_knob.dart'; import 'package:flutter/material.dart'; import 'package:remix/remix.dart'; import 'package:widgetbook/widgetbook.dart'; @@ -5,14 +6,14 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; @widgetbook.UseCase( name: 'interactive playground', - type: RXButton, + type: RxButton, ) Widget buildButtonUseCase(BuildContext context) { Widget buildButton(ButtonVariant type) { - return RXButton( + return RxButton( label: context.knobs.string( label: 'Title', - initialValue: 'Title', + initialValue: 'Button', ), onPressed: () {}, loading: context.knobs.boolean( @@ -23,6 +24,14 @@ Widget buildButtonUseCase(BuildContext context) { label: 'Disabled', initialValue: false, ), + iconLeft: context.knobs.iconData( + label: 'Icon left', + initialValue: null, + ), + iconRight: context.knobs.iconData( + label: 'Icon right', + initialValue: null, + ), size: context.knobs.list( label: 'Size', options: ButtonSize.values, @@ -33,13 +42,8 @@ Widget buildButtonUseCase(BuildContext context) { ); } - return Container( - color: Colors.white, - child: Center( - child: Wrap( - spacing: 12, - children: ButtonVariant.values.map(buildButton).toList(), - ), - ), + return Wrap( + spacing: 12, + children: ButtonVariant.values.map(buildButton).toList(), ); } diff --git a/packages/remix/demo/lib/main.dart b/packages/remix/demo/lib/main.dart index 5f29e155c..d20a74a32 100644 --- a/packages/remix/demo/lib/main.dart +++ b/packages/remix/demo/lib/main.dart @@ -16,9 +16,40 @@ class HotReload extends StatelessWidget { @override Widget build(BuildContext context) { return Widgetbook.material( + addons: [ + MaterialThemeAddon( + themes: [ + WidgetbookTheme( + name: 'Light', + data: ThemeData.light(), + ), + WidgetbookTheme( + name: 'Dark', + data: ThemeData.dark(), + ), + ], + initialTheme: WidgetbookTheme( + name: 'Dark', + data: ThemeData.dark(), + ), + ), + BuilderAddon( + name: 'Remix Tokens', + builder: (context, child) { + final isDarkTheme = Theme.of(context).brightness == Brightness.dark; + return RemixTokens( + data: isDarkTheme ? RemixTokens.dark : RemixTokens.light, + child: Container( + color: isDarkTheme ? Colors.black87 : Colors.white, + child: Center(child: child), + ), + ); + }, + ), + ], appBuilder: (context, child) => MaterialApp( debugShowCheckedModeBanner: false, - home: Scaffold(body: Center(child: RemixTokens(child: child))), + home: Scaffold(body: Center(child: child)), ), directories: directories, ); diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index be5474262..ff7c4ab40 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -785,6 +785,7 @@ /Users/leofarias/Projects/mix/packages/mix_annotations/lib/mix_annotations.dart /Users/leofarias/Projects/mix/packages/mix_annotations/lib/src/annotations.dart /Users/leofarias/Projects/mix/packages/remix/LICENSE +/Users/leofarias/Projects/mix/packages/remix/demo/lib/addons/icon_data_knob.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/button.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.directories.g.dart @@ -802,7 +803,6 @@ /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/color_palette.dart -/Users/leofarias/Projects/mix/packages/remix/lib/helpers/context_ext.dart /Users/leofarias/Projects/mix/packages/remix/lib/remix.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/color_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/radius_tokens.dart diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button.dart index dc15c97ee..12b9d5c9e 100644 --- a/packages/remix/lib/components/button/button.dart +++ b/packages/remix/lib/components/button/button.dart @@ -4,8 +4,8 @@ import 'package:remix/components/button/button.style.dart'; import 'package:remix/components/button/button.variants.dart'; import 'package:remix/components/button/button_spec.dart'; -class RXButton extends StatelessWidget { - const RXButton({ +class RxButton extends StatelessWidget { + const RxButton({ super.key, required this.label, this.disabled = false, @@ -30,29 +30,38 @@ class RXButton extends StatelessWidget { final Style? style; + bool get _hasIcon => iconLeft != null || iconRight != null; + Style _buildStyle() { return buildDefaultButtonStyle() .merge(style) .applyVariants([size, type]).animate(); } - List _buildChildren(ButtonSpec spec) { - if (loading) { - return [ - Stack( - alignment: Alignment.center, - children: [ - spec.spinner(), - Opacity(opacity: 0.0, child: spec.label(label)), - ], - ) - ]; - } - return [ - if (iconLeft != null) spec.icon(iconLeft), - if (label.isNotEmpty) spec.label(label), - if (iconRight != null) spec.icon(iconRight), - ]; + Widget _buildLoadingOverlay(Widget child) { + return loading + ? Stack( + alignment: Alignment.center, + children: [ + child, + Opacity(opacity: 0.0, child: child), + ], + ) + : child; + } + + Widget _buildChildren(ButtonSpec spec) { + final flexWidget = spec.flex( + direction: Axis.horizontal, + children: [ + if (iconLeft != null) spec.icon(iconLeft), + // If there is no icon always render the label + if (label.isNotEmpty || !_hasIcon) spec.label(label), + if (iconRight != null) spec.icon(iconRight), + ], + ); + + return loading ? _buildLoadingOverlay(flexWidget) : flexWidget; } @override @@ -64,16 +73,10 @@ class RXButton extends StatelessWidget { child: SpecBuilder( style: _buildStyle(), builder: (context) { - var spec = ButtonSpec.of(context); - - final ContainerSpecWidget = spec.container; - final FlexSpecWidget = spec.flex; + final spec = ButtonSpec.of(context); - return ContainerSpecWidget( - child: FlexSpecWidget( - direction: Axis.horizontal, - children: _buildChildren(spec), - ), + return spec.container( + child: _buildChildren(spec), ); }), ); diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 286d8810a..2e20c0221 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -15,158 +15,144 @@ final _flex = _button.flex; /// This applies to the icon, label, and spinner final _foreground = _button.foreground; -Style buildDefaultButtonStyle() { - final baseStyle = Style( - _flex.gap(0), - _flex.mainAxisAlignment.center(), - _flex.crossAxisAlignment.center(), - _flex.mainAxisSize.min(), - _container.borderRadius(6), - _label.style.fontWeight(FontWeight.w500), - _spinner.strokeWidth(1), - _label.textHeightBehavior(const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, - )), - ); - - final smallVariant = Style( - ButtonSize.small( - _label.style.as($rx.text1()), - _container.padding.vertical($rx.space1()), - _container.padding.horizontal($rx.space2()), - _flex.gap($rx.space1()), - _foreground(size: 12), - ), - ); - - final mediumVariant = Style( - ButtonSize.medium( - _container.padding.vertical($rx.space2()), - _container.padding.horizontal($rx.space3()), - _flex.gap($rx.space2()), - _label.style.as($rx.text2()), - _foreground(size: 14), - ), - ); - - final largeVariant = Style( - ButtonSize.large( - _container.padding.vertical($rx.space2()), - _container.padding.horizontal($rx.space4()), - _flex.gap($rx.space3()), - _label.style.as($rx.text3()), - _foreground(size: 16), - ), - ); - - final xLargeVariant = Style( - ButtonSize.xlarge( - _container.padding.vertical($rx.space3()), - _container.padding.horizontal($rx.space5()), - _flex.gap($rx.space3()), - _label.style.as($rx.text4()), - _foreground(size: 18), - ), - ); - - final solidVariant = Style( - ButtonVariant.solid( - _container.color($rx.accent9()), - _foreground(color: Colors.white), - $on.dark( - _foreground(color: Colors.black), - ), - $on.hover( - _container.color($rx.accent12()), - ), - $on.disabled( - _container.color($rx.neutral2A()), - ), +Style get _baseStyle => Style( + _flex.gap(0), + _flex.mainAxisAlignment.center(), + _flex.crossAxisAlignment.center(), + _flex.mainAxisSize.min(), + _container.borderRadius(6), + _label.style.fontWeight(FontWeight.w500), + _spinner.strokeWidth(1), + _label.textHeightBehavior(const TextHeightBehavior( + // applyHeightToFirstAscent: false, + // applyHeightToLastDescent: false, + // leadingDistribution: TextLeadingDistribution.even, + )), + ); + +final _onDisabledBackground = Style( + $on.disabled( + _container.color( + $rx.neutral3A(), ), - ); - - final softVariant = Style( - ButtonVariant.soft( - _container.color($rx.accent3A()), - _foreground(color: $rx.accent11A()), - $on.hover( - _container.color($rx.accent4A()), - ), - $on.disabled( - _container.color($rx.neutral2A()), - ), + ), +); + +final _onDisabledForeground = Style( + $on.disabled( + _foreground(color: $rx.neutral7A()), + ), +); + +final _solidVariant = Style( + _container.color($rx.accent9()), + _foreground(color: $rx.neutral1()), + $on.hover( + _container.color($rx.accent12()), + ), + _onDisabledBackground(), +); + +final _softVariant = Style( + _container.color($rx.accent3A()), + _foreground(color: $rx.accent11A()), + $on.hover( + _container.color($rx.accent4A()), + ), + _onDisabledBackground(), +); + +final _outlineVariant = Style( + _container.color(Colors.transparent), + _container.border.width(1), + _container.border.strokeAlign(0), + _container.border.color($rx.accent8A()), + _foreground(color: $rx.accent11A()), + $on.hover( + _container.color( + $rx.accent2A(), ), - ); - - final surfaceVariant = Style( - ButtonVariant.surface( - _container.color($rx.accent2A()), - _container.border.width(1), - _container.border.color($rx.accent7A()), - _foreground(color: $rx.accent11()), - $on.hover( - _container.color($rx.accent3A()), - _container.border.color($rx.accent8A()), - ), - $on.disabled( - _container.color($rx.neutral2A()), - _container.border.color( - $rx.neutral6A(), - ), - ), - ), - ); - - final outlineVariant = Style( - ButtonVariant.outline( - _container.color(Colors.transparent), - _container.border.width(1), - _container.border.color($rx.accent8A()), - _foreground(color: $rx.accent8A()), - $on.hover( - _container.color($rx.accent2A()), - ), - $on.disabled( - _container.border.color( - $rx.neutral6A(), - ), - ), + ), + $on.disabled( + _container.border.color( + $rx.neutral8A(), ), - ); - - final ghostVariant = Style( - ButtonVariant.ghost( - _container.border.style.none(), - _container.color(Colors.transparent), - _foreground(color: $rx.accent11A()), - $on.hover( - _container.color($rx.accent3A()), - ), + _container.color.transparent(), + ), +); +final _surfaceVariant = Style( + _outlineVariant(), + _container.color($rx.accent2A()), + $on.hover( + _container.color($rx.accent3A()), + _container.border.color($rx.accent8A()), + ), + $on.disabled( + _container.color( + $rx.neutral2A(), ), - ); + ), +); + +final _ghostVariant = Style( + _container.border.style.none(), + _container.color(Colors.transparent), + _foreground(color: $rx.accent11A()), + $on.hover( + _container.color($rx.accent3A()), + ), +); + +final _smallVariant = Style( + _label.style.as($rx.text1()), + _container.padding.vertical($rx.space1()), + _container.padding.horizontal($rx.space2()), + _flex.gap($rx.space1()), + _foreground(size: 12), +); + +final _mediumVariant = Style( + _container.padding.vertical($rx.space2()), + _container.padding.horizontal($rx.space3()), + _flex.gap($rx.space2()), + _label.style.as($rx.text2()), + _foreground(size: 14), +); + +final _largeVariant = Style( + _container.padding.vertical($rx.space2()), + _container.padding.horizontal($rx.space4()), + _flex.gap($rx.space3()), + _label.style.as($rx.text3()), + _foreground(size: 16), +); + +final _xLargeVariant = Style( + _container.padding.vertical($rx.space3()), + _container.padding.horizontal($rx.space5()), + _flex.gap($rx.space3()), + _label.style.as($rx.text4()), + _foreground(size: 18), +); +Style buildDefaultButtonStyle() { return Style( - baseStyle(), + _baseStyle(), /// Size Variants - smallVariant(), - mediumVariant(), - largeVariant(), - xLargeVariant(), + ButtonSize.small(_smallVariant()), + ButtonSize.medium(_mediumVariant()), + ButtonSize.large(_largeVariant()), + ButtonSize.xlarge(_xLargeVariant()), + + _onDisabledForeground(), // Type variants - solidVariant(), - surfaceVariant(), - softVariant(), - outlineVariant(), - ghostVariant(), - $on.disabled( - _label.style.color( - $rx.neutral6A(), - ), - _spinner.color($rx.neutral6A()), - ), + ButtonVariant.solid(_solidVariant()), + ButtonVariant.surface(_surfaceVariant()), + ButtonVariant.soft(_softVariant()), + ButtonVariant.outline(_outlineVariant()), + ButtonVariant.ghost(_ghostVariant()), ); } diff --git a/packages/remix/lib/tokens/remix_tokens.dart b/packages/remix/lib/tokens/remix_tokens.dart index 50879fa46..cf14334ca 100644 --- a/packages/remix/lib/tokens/remix_tokens.dart +++ b/packages/remix/lib/tokens/remix_tokens.dart @@ -1,6 +1,5 @@ -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/helpers/context_ext.dart'; import 'package:remix/tokens/color_tokens.dart'; import 'package:remix/tokens/radius_tokens.dart'; import 'package:remix/tokens/space_tokens.dart'; @@ -103,14 +102,19 @@ final _darkRemixTokens = _baseRemixTokens.copyWith( ); class RemixTokens extends StatelessWidget { - const RemixTokens({super.key, required this.child}); + const RemixTokens({super.key, required this.child, required this.data}); final Widget child; + final MixThemeData data; + + static MixThemeData light = _lightRemixTokens; + static MixThemeData dark = _darkRemixTokens; + @override Widget build(BuildContext context) { return MixTheme( - data: context.isDarkMode ? _darkRemixTokens : _lightRemixTokens, + data: data, child: child, ); } diff --git a/packages/remix/lib/tokens/text_style_tokens.dart b/packages/remix/lib/tokens/text_style_tokens.dart index 97ad27b76..fc4ec3a98 100644 --- a/packages/remix/lib/tokens/text_style_tokens.dart +++ b/packages/remix/lib/tokens/text_style_tokens.dart @@ -32,7 +32,7 @@ final remixTextTokens = { inherit: false, fontSize: 12, letterSpacing: 0.0025, - height: 1.4, + height: 1.2, ), _typography.t2: const TextStyle( inherit: false, @@ -44,13 +44,13 @@ final remixTextTokens = { inherit: false, fontSize: 16, letterSpacing: 0, - height: 1.4, + height: 1.2, ), _typography.t4: const TextStyle( inherit: false, fontSize: 18, letterSpacing: -0.0025, - height: 1.4, + height: 1.2, ), _typography.t5: const TextStyle( fontSize: 20, diff --git a/packages/remix/test/components/button_test.dart b/packages/remix/test/components/button_test.dart index d6f7cd1d4..c0c69167d 100644 --- a/packages/remix/test/components/button_test.dart +++ b/packages/remix/test/components/button_test.dart @@ -9,7 +9,7 @@ void main() { const label = 'Test Button'; await tester.pumpWidget( MaterialApp( - home: RXButton(label: label, onPressed: () {}), + home: RxButton(label: label, onPressed: () {}), ), ); @@ -27,7 +27,7 @@ void main() { await tester.pumpWidget( MaterialApp( - home: RXButton( + home: RxButton( label: 'Test Button', loading: true, onPressed: () {}, @@ -42,7 +42,7 @@ void main() { testWidgets('displays correct icons when provided', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( - home: RXButton( + home: RxButton( label: 'Test Button', iconLeft: Icons.arrow_back, iconRight: Icons.arrow_forward, @@ -66,7 +66,7 @@ void main() { bool didCallOnPressed = false; await tester.pumpWidget(MaterialApp( - home: RXButton( + home: RxButton( label: 'Disabled Button', onPressed: () { didCallOnPressed = true; @@ -75,7 +75,7 @@ void main() { ), )); - await tester.tap(find.byType(RXButton)); + await tester.tap(find.byType(RxButton)); await tester.pumpAndSettle(const Duration(milliseconds: 200)); expect(didCallOnPressed, false); @@ -85,7 +85,7 @@ void main() { bool didCallOnPressed = false; await tester.pumpWidget(MaterialApp( - home: RXButton( + home: RxButton( label: 'Disabled Button', onPressed: () { didCallOnPressed = true; @@ -93,7 +93,7 @@ void main() { ), )); - await tester.tap(find.byType(RXButton)); + await tester.tap(find.byType(RxButton)); await tester.pumpAndSettle(const Duration(milliseconds: 200)); expect(didCallOnPressed, isTrue); From 1b4336b9818560bec4e4cf152942182dd295b620 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Tue, 2 Jul 2024 09:50:07 -0400 Subject: [PATCH 06/24] Linting fixes --- .../lib/src/attributes/border/border_dto.dart | 2 +- .../attributes/border/shape_border_dto.dart | 68 ++++++++----------- .../attributes/text_style/text_style_dto.dart | 1 + .../mix/lib/src/core/factory/style_mix.dart | 6 +- .../modifiers/sized_box_widget_modifier.dart | 9 +-- .../mix/lib/src/specs/flex/flex_widget.dart | 9 ++- .../mix/lib/src/specs/icon/icon_widget.dart | 8 +-- .../mix/test/bechmarks/widget_build_test.dart | 4 +- packages/mix/test/empty_widget.dart | 2 +- packages/mix/test/helpers/testing_utils.dart | 3 +- 10 files changed, 49 insertions(+), 63 deletions(-) diff --git a/packages/mix/lib/src/attributes/border/border_dto.dart b/packages/mix/lib/src/attributes/border/border_dto.dart index 2e96f029c..8f90e7a7f 100644 --- a/packages/mix/lib/src/attributes/border/border_dto.dart +++ b/packages/mix/lib/src/attributes/border/border_dto.dart @@ -145,8 +145,8 @@ final class BorderSideDto extends Dto with _$BorderSideDto { @override BorderSide get defaultValue => const BorderSide( - width: 0.0, color: Colors.transparent, + width: 0.0, ); } diff --git a/packages/mix/lib/src/attributes/border/shape_border_dto.dart b/packages/mix/lib/src/attributes/border/shape_border_dto.dart index eea788acb..0d17659bd 100644 --- a/packages/mix/lib/src/attributes/border/shape_border_dto.dart +++ b/packages/mix/lib/src/attributes/border/shape_border_dto.dart @@ -39,13 +39,13 @@ sealed class ShapeBorderDto extends Dto { BorderSideDto? get _side => this is OutlinedBorderDto ? (this as OutlinedBorderDto).side : null; - BeveledRectangleBorderDto toBeveledRectangleBorder(); - RoundedRectangleBorderDto toRoundedRectangleBorder(); - ContinuousRectangleBorderDto toContinuousRectangleBorder(); - CircleBorderDto toCircleBorder(); + BeveledRectangleBorderDto toBeveled(); + RoundedRectangleBorderDto toRoundedRectangle(); + ContinuousRectangleBorderDto toContinuous(); + CircleBorderDto toCircle(); StadiumBorderDto toStadiumBorder(); - StarBorderDto toStarBorder(); - LinearBorderDto toLinearBorder(); + StarBorderDto toStar(); + LinearBorderDto toLinear(); @override ShapeBorderDto merge(covariant ShapeBorderDto? other); @@ -71,36 +71,22 @@ sealed class OutlinedBorderDto return _exhaustiveMerge(a, b); } - static OutlinedBorderDto _exhaustiveMerge( - OutlinedBorderDto a, - OutlinedBorderDto b, + static B _exhaustiveMerge( + A a, + B b, ) { - if (a.runtimeType == b.runtimeType) return a.merge(b); - - switch (b.runtimeType) { - case BeveledRectangleBorderDto: - return a - .toBeveledRectangleBorder() - .merge(b as BeveledRectangleBorderDto); - case RoundedRectangleBorderDto: - return a - .toRoundedRectangleBorder() - .merge(b as RoundedRectangleBorderDto); - case ContinuousRectangleBorderDto: - return a - .toContinuousRectangleBorder() - .merge(b as ContinuousRectangleBorderDto); - case CircleBorderDto: - return a.toCircleBorder().merge(b as CircleBorderDto); - case StadiumBorderDto: - return a.toStadiumBorder().merge(b as StadiumBorderDto); - case StarBorderDto: - return a.toStarBorder().merge(b as StarBorderDto); - case LinearBorderDto: - return a.toLinearBorder().merge(b as LinearBorderDto); - default: - throw ArgumentError('Unknown OutlinedBorderDto type: ${b.runtimeType}'); - } + if (a.runtimeType == b.runtimeType) return a.merge(b) as B; + + return switch (b) { + (BeveledRectangleBorderDto g) => a.toBeveled().merge(g) as B, + (RoundedRectangleBorderDto g) => a.toRoundedRectangle().merge(g) as B, + (ContinuousRectangleBorderDto g) => a.toContinuous().merge(g) as B, + (CircleBorderDto g) => a.toCircle().merge(g) as B, + (StadiumBorderDto g) => a.toStadiumBorder().merge(g) as B, + (StarBorderDto g) => a.toStar().merge(g) as B, + (LinearBorderDto g) => a.toLinear().merge(g) as B, + }; } BoxShape? _toBoxShape() { @@ -118,7 +104,7 @@ sealed class OutlinedBorderDto /// Tries to get borderRadius if available for [OutlineBorderDto] @override - BeveledRectangleBorderDto toBeveledRectangleBorder() { + BeveledRectangleBorderDto toBeveled() { if (this is BeveledRectangleBorderDto) { return this as BeveledRectangleBorderDto; } @@ -130,7 +116,7 @@ sealed class OutlinedBorderDto } @override - ContinuousRectangleBorderDto toContinuousRectangleBorder() { + ContinuousRectangleBorderDto toContinuous() { return ContinuousRectangleBorderDto( borderRadius: _borderRadius, side: _side, @@ -138,7 +124,7 @@ sealed class OutlinedBorderDto } @override - RoundedRectangleBorderDto toRoundedRectangleBorder() { + RoundedRectangleBorderDto toRoundedRectangle() { if (this is RoundedRectangleBorderDto) { return this as RoundedRectangleBorderDto; } @@ -150,7 +136,7 @@ sealed class OutlinedBorderDto } @override - CircleBorderDto toCircleBorder() { + CircleBorderDto toCircle() { if (this is CircleBorderDto) return this as CircleBorderDto; return CircleBorderDto(side: _side); @@ -164,14 +150,14 @@ sealed class OutlinedBorderDto } @override - LinearBorderDto toLinearBorder() { + LinearBorderDto toLinear() { if (this is LinearBorderDto) return this as LinearBorderDto; return LinearBorderDto(side: _side); } @override - StarBorderDto toStarBorder() { + StarBorderDto toStar() { if (this is StarBorderDto) return this as StarBorderDto; return StarBorderDto(side: _side); diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart index d8786203b..a28f4d75d 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart @@ -169,6 +169,7 @@ extension TextStyleExt on TextStyle { if (this is TextStyleRef) { return TextStyleDto.ref((this as TextStyleRef).token); } + return TextStyleDto._(value: [_toData()]); } diff --git a/packages/mix/lib/src/core/factory/style_mix.dart b/packages/mix/lib/src/core/factory/style_mix.dart index 5db010600..f502688a8 100644 --- a/packages/mix/lib/src/core/factory/style_mix.dart +++ b/packages/mix/lib/src/core/factory/style_mix.dart @@ -343,10 +343,10 @@ class AnimatedStyle extends Style { final AnimatedData animated; const AnimatedStyle._({ - required AttributeMap styles, - required AttributeMap variants, + required super.styles, + required super.variants, required this.animated, - }) : super._(styles: styles, variants: variants); + }) : super._(); factory AnimatedStyle( Style style, { diff --git a/packages/mix/lib/src/modifiers/sized_box_widget_modifier.dart b/packages/mix/lib/src/modifiers/sized_box_widget_modifier.dart index 49e563657..07780617e 100644 --- a/packages/mix/lib/src/modifiers/sized_box_widget_modifier.dart +++ b/packages/mix/lib/src/modifiers/sized_box_widget_modifier.dart @@ -67,17 +67,18 @@ final class SizedBoxModifierAttribute extends WidgetModifierAttribute< final class SizedBoxModifierUtility extends MixUtility { - SizedBoxModifierUtility(super.builder); - /// Utility for defining [SizedBoxModifierAttribute.height] late final height = DoubleUtility((value) => call(height: value)); /// Utility for defining [SizedBoxModifierAttribute.width] late final width = DoubleUtility((value) => call(width: value)); - /// Utility for defining [SizedBoxModifierAttribute.width] + /// Utility for defining [SizedBoxModifierAttribute.width] /// and [SizedBoxModifierAttribute.height] - late final square = DoubleUtility((value) => call(width: value, height: value)); + late final square = + DoubleUtility((value) => call(width: value, height: value)); + + SizedBoxModifierUtility(super.builder); T call({double? width, double? height}) { return builder(SizedBoxModifierAttribute(width: width, height: height)); diff --git a/packages/mix/lib/src/specs/flex/flex_widget.dart b/packages/mix/lib/src/specs/flex/flex_widget.dart index 2c21f38c1..344fc3d91 100644 --- a/packages/mix/lib/src/specs/flex/flex_widget.dart +++ b/packages/mix/lib/src/specs/flex/flex_widget.dart @@ -2,7 +2,6 @@ import 'package:flutter/widgets.dart'; -import '../../core/factory/style_mix.dart'; import '../../core/styled_widget.dart'; import '../box/box_spec.dart'; import '../box/box_widget.dart'; @@ -211,11 +210,11 @@ class FlexBox extends StyledWidget { /// ``` class HBox extends FlexBox { const HBox({ - Style? style, + super.style, super.key, super.inherit, super.children = const [], - }) : super(style: style, direction: Axis.horizontal); + }) : super(direction: Axis.horizontal); } /// A vertical flex container that uses `Style` for streamlined styling. @@ -236,11 +235,11 @@ class HBox extends FlexBox { /// ``` class VBox extends FlexBox { const VBox({ - Style? style, + super.style, super.key, super.inherit, super.children = const [], - }) : super(style: style, direction: Axis.vertical); + }) : super(direction: Axis.vertical); } final _defaultFlex = Flex(direction: Axis.horizontal, children: const []); diff --git a/packages/mix/lib/src/specs/icon/icon_widget.dart b/packages/mix/lib/src/specs/icon/icon_widget.dart index 56b774956..38ba008b4 100644 --- a/packages/mix/lib/src/specs/icon/icon_widget.dart +++ b/packages/mix/lib/src/specs/icon/icon_widget.dart @@ -118,10 +118,10 @@ class AnimatedIconSpecWidget extends ImplicitlyAnimatedWidget { this.semanticLabel, this.textDirection, this.modifierOrder = const [], - Curve curve = Curves.linear, - required Duration duration, - VoidCallback? onEnd, - }) : super(curve: curve, duration: duration, onEnd: onEnd); + super.curve, + required super.duration, + super.onEnd, + }); final IconData? icon; final IconSpec spec; diff --git a/packages/mix/test/bechmarks/widget_build_test.dart b/packages/mix/test/bechmarks/widget_build_test.dart index 19eab0b31..c58128b20 100644 --- a/packages/mix/test/bechmarks/widget_build_test.dart +++ b/packages/mix/test/bechmarks/widget_build_test.dart @@ -9,7 +9,7 @@ import 'package:mix/mix.dart'; import '../helpers/testing_utils.dart'; class _StyledContainerExample extends StatelessWidget { - const _StyledContainerExample({Key? key}) : super(key: key); + const _StyledContainerExample(); @override Widget build(BuildContext context) { @@ -164,7 +164,7 @@ void main() { } class StyleWidgetExpensiveAttributge extends StatelessWidget { - const StyleWidgetExpensiveAttributge({Key? key}) : super(key: key); + const StyleWidgetExpensiveAttributge({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/mix/test/empty_widget.dart b/packages/mix/test/empty_widget.dart index 9d146db21..2dac67f69 100644 --- a/packages/mix/test/empty_widget.dart +++ b/packages/mix/test/empty_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/widgets.dart'; class Empty extends StatelessWidget { - const Empty({Key? key}) : super(key: key); + const Empty({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/mix/test/helpers/testing_utils.dart b/packages/mix/test/helpers/testing_utils.dart index 937ef1fac..9da6794b5 100644 --- a/packages/mix/test/helpers/testing_utils.dart +++ b/packages/mix/test/helpers/testing_utils.dart @@ -168,8 +168,7 @@ extension WidgetTesterExt on WidgetTester { const FillWidget = SizedBox(width: 25, height: 25); class WrapMixThemeWidget extends StatelessWidget { - const WrapMixThemeWidget({required this.child, this.theme, Key? key}) - : super(key: key); + const WrapMixThemeWidget({required this.child, this.theme, super.key}); final Widget child; final MixThemeData? theme; From 21a2a54a5037c2fa6ed2f9c9a0bf2cf1ce736ff7 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Tue, 2 Jul 2024 09:51:05 -0400 Subject: [PATCH 07/24] Lint fix --- packages/mix/lib/src/attributes/border/shape_border_dto.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/mix/lib/src/attributes/border/shape_border_dto.dart b/packages/mix/lib/src/attributes/border/shape_border_dto.dart index 0d17659bd..046d7bba7 100644 --- a/packages/mix/lib/src/attributes/border/shape_border_dto.dart +++ b/packages/mix/lib/src/attributes/border/shape_border_dto.dart @@ -72,10 +72,7 @@ sealed class OutlinedBorderDto } static B _exhaustiveMerge( - A a, - B b, - ) { + B extends OutlinedBorderDto>(A a, B b) { if (a.runtimeType == b.runtimeType) return a.merge(b) as B; return switch (b) { From 307bf9f3e44003239dc9db8072e6c1826dc11403 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Tue, 2 Jul 2024 13:29:49 -0400 Subject: [PATCH 08/24] Clean up --- .../lib/button/button.style.dart | 17 +- .../lib/src/attributes/border/border_dto.dart | 7 +- .../attributes/text_style/text_style_dto.dart | 13 +- packages/mix/lib/src/theme/mix/mix_theme.dart | 20 +- .../src/theme/tokens/breakpoints_token.dart | 11 +- .../mix/lib/src/theme/tokens/color_token.dart | 2 +- .../mix/lib/src/theme/tokens/mix_token.dart | 7 +- .../lib/src/theme/tokens/radius_token.dart | 2 +- .../src/theme/tokens/text_style_token.dart | 44 +- .../mix/lib/src/theme/tokens/token_util.dart | 22 +- packages/mix/test/helpers/testing_utils.dart | 33 + .../theme/material/material_tokens_test.dart | 4 +- .../mix/test/src/theme/mix_theme_test.dart | 18 +- .../remix/demo/lib/components/button.dart | 14 +- .../remix/demo/lib/main.directories.g.dart | 2 +- .../ephemeral/Flutter-Generated.xcconfig | 4 +- .../ephemeral/FlutterInputs.xcfilelist | 1725 +++++++++-------- .../ephemeral/flutter_export_environment.sh | 4 +- .../macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- packages/remix/demo/test/widget_test.dart | 30 +- .../remix/lib/components/button/button.dart | 6 +- .../lib/components/button/button.style.dart | 13 +- packages/remix/lib/helpers/color_palette.dart | 5 + packages/remix/lib/helpers/color_utils.dart | 90 - packages/remix/lib/tokens/color_tokens.dart | 247 +-- packages/remix/lib/tokens/radius_tokens.dart | 35 +- packages/remix/lib/tokens/remix_tokens.dart | 57 +- packages/remix/lib/tokens/space_tokens.dart | 50 +- .../remix/lib/tokens/text_style_tokens.dart | 73 +- .../remix/test/components/button_test.dart | 193 +- 31 files changed, 1368 insertions(+), 1384 deletions(-) diff --git a/examples/themed_button/lib/button/button.style.dart b/examples/themed_button/lib/button/button.style.dart index d137a34e3..ce0ffb1da 100644 --- a/examples/themed_button/lib/button/button.style.dart +++ b/examples/themed_button/lib/button/button.style.dart @@ -1,5 +1,4 @@ import 'package:mix/mix.dart'; -import 'package:themed_button/styles/tokens.dart'; import 'button.variants.dart'; @@ -16,20 +15,12 @@ Style container() => Style( // $box.padding.horizontal.ref($token.space.xsmall), // $box.padding.vertical.ref($token.space.xxsmall), // ), - ButtonSize.medium( - $box.padding.horizontal.ref($token.space.small), - $box.padding.vertical.ref($token.space.xxsmall), - ), + // ButtonSize.large( // $box.padding.horizontal.ref($token.space.medium), // $box.padding.vertical.ref($token.space.xsmall), // ), - ButtonType.primary( - $box.color.ref($token.color.primary), - $on.hover( - $box.color.ref($token.color.primaryHover), - ), - ), + // ButtonType.secondary( // $box.color.grey.shade200(), // $on.hover( @@ -98,9 +89,7 @@ Style label() => Style( // ButtonSize.large( // $text.style.fontSize(18), // ), - ButtonType.primary( - $text.style.color.ref($token.color.onPrimary), - ), + // ButtonType.secondary( // $text.style.color.ref($token.color.primaryHover), // ), diff --git a/packages/mix/lib/src/attributes/border/border_dto.dart b/packages/mix/lib/src/attributes/border/border_dto.dart index 8f90e7a7f..a891d7bbd 100644 --- a/packages/mix/lib/src/attributes/border/border_dto.dart +++ b/packages/mix/lib/src/attributes/border/border_dto.dart @@ -84,7 +84,7 @@ final class BorderDto extends BoxBorderDto with _$BorderDto { bool get isUniform => top == bottom && top == left && top == right; @override - Border get defaultValue => Border.all(color: Colors.transparent, width: 0.0); + Border get defaultValue => Border.all(); } @MixableDto(generateUtility: false) @@ -144,10 +144,7 @@ final class BorderSideDto extends Dto with _$BorderSideDto { const BorderSideDto.none() : this(style: BorderStyle.none, width: 0.0); @override - BorderSide get defaultValue => const BorderSide( - color: Colors.transparent, - width: 0.0, - ); + BorderSide get defaultValue => const BorderSide(); } extension BoxBorderExt on BoxBorder { diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart index a28f4d75d..0b809fdcd 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart @@ -1,7 +1,5 @@ // ignore_for_file: prefer_relative_imports,avoid-importing-entrypoint-exports -import 'dart:ui'; - import 'package:flutter/widgets.dart'; import 'package:mix/mix.dart'; import 'package:mix_annotations/mix_annotations.dart'; @@ -26,6 +24,10 @@ final class TextStyleDataRef extends TextStyleData { get props => [ref]; } +// TODO: Look for ways to consolidate TextStyleDto and TextStyleData +// If we remove TextStyle from tokens, it means we don't need a list of resolvable values +// to be resolved once we have a context. We can merge the values directly, simplifying the code, +// and this will allow more predictable behavior overall. @MixableDto(generateUtility: false, generateValueExtension: false) base class TextStyleData extends Dto with _$TextStyleData { final String? fontFamily; @@ -151,11 +153,8 @@ final class TextStyleDto extends Dto with _$TextStyleDto { TextStyle resolve(MixData mix) { final result = value .map((e) => e is TextStyleDataRef ? e.resolve(mix)._toData() : e) - .reduce((value, element) { - final singleresult = value.merge(element); - - return singleresult; - }).resolve(mix); + .reduce((a, b) => a.merge(b)) + .resolve(mix); return result; } diff --git a/packages/mix/lib/src/theme/mix/mix_theme.dart b/packages/mix/lib/src/theme/mix/mix_theme.dart index 1df83167c..e2eb76b3f 100644 --- a/packages/mix/lib/src/theme/mix/mix_theme.dart +++ b/packages/mix/lib/src/theme/mix/mix_theme.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import '../../attributes/text_style/text_style_dto.dart'; import '../../internal/compare_mixin.dart'; import '../material/material_theme.dart'; import '../tokens/breakpoints_token.dart'; @@ -36,6 +37,7 @@ class MixThemeData with EqualityMixin { final StyledTokens radii; final StyledTokens colors; final StyledTokens textStyles; + final StyledTokens typography; final StyledTokens breakpoints; final StyledTokens spaces; @@ -45,6 +47,7 @@ class MixThemeData with EqualityMixin { required this.breakpoints, required this.radii, required this.spaces, + required this.typography, }); const MixThemeData.empty() @@ -54,6 +57,7 @@ class MixThemeData with EqualityMixin { breakpoints: const StyledTokens.empty(), radii: const StyledTokens.empty(), spaces: const StyledTokens.empty(), + typography: const StyledTokens.empty(), ); factory MixThemeData({ @@ -62,6 +66,7 @@ class MixThemeData with EqualityMixin { Map? spaces, Map? textStyles, Map? radii, + Map? typography, }) { return MixThemeData.raw( textStyles: StyledTokens(textStyles ?? const {}), @@ -70,6 +75,7 @@ class MixThemeData with EqualityMixin { _breakpointTokenMap.merge(StyledTokens(breakpoints ?? const {})), radii: StyledTokens(radii ?? const {}), spaces: StyledTokens(spaces ?? const {}), + typography: StyledTokens(typography ?? const {}), ); } @@ -79,6 +85,7 @@ class MixThemeData with EqualityMixin { Map? spaces, Map? textStyles, Map? radii, + Map? typography, }) { return materialMixTheme.merge( MixThemeData( @@ -87,6 +94,7 @@ class MixThemeData with EqualityMixin { spaces: spaces, textStyles: textStyles, radii: radii, + typography: typography, ), ); } @@ -97,6 +105,7 @@ class MixThemeData with EqualityMixin { Map? spaces, Map? textStyles, Map? radii, + Map? typography, }) { return MixThemeData.raw( textStyles: @@ -106,6 +115,8 @@ class MixThemeData with EqualityMixin { breakpoints == null ? this.breakpoints : StyledTokens(breakpoints), radii: radii == null ? this.radii : StyledTokens(radii), spaces: spaces == null ? this.spaces : StyledTokens(spaces), + typography: + typography == null ? this.typography : StyledTokens(typography), ); } @@ -116,17 +127,20 @@ class MixThemeData with EqualityMixin { breakpoints: breakpoints.merge(other.breakpoints), radii: radii.merge(other.radii), spaces: spaces.merge(other.spaces), + typography: typography.merge(other.typography), ); } @override - get props => [spaces, breakpoints, colors, textStyles, radii]; + get props => [spaces, breakpoints, colors, textStyles, radii, typography]; } final _breakpointTokenMap = StyledTokens({ BreakpointToken.xsmall: const Breakpoint(maxWidth: 599), BreakpointToken.small: const Breakpoint(minWidth: 600, maxWidth: 1023), BreakpointToken.medium: const Breakpoint(minWidth: 1024, maxWidth: 1439), - BreakpointToken.large: - const Breakpoint(minWidth: 1440, maxWidth: double.infinity), + BreakpointToken.large: const Breakpoint( + minWidth: 1440, + maxWidth: double.infinity, + ), }); diff --git a/packages/mix/lib/src/theme/tokens/breakpoints_token.dart b/packages/mix/lib/src/theme/tokens/breakpoints_token.dart index 7bacd87d1..1ea4b0ae8 100644 --- a/packages/mix/lib/src/theme/tokens/breakpoints_token.dart +++ b/packages/mix/lib/src/theme/tokens/breakpoints_token.dart @@ -86,11 +86,18 @@ class BreakpointResolver extends Breakpoint with WithTokenResolver { /// A reference to a breakpoint token. @immutable -class BreakpointRef extends Breakpoint - with TokenRef { +class BreakpointRef extends Breakpoint with TokenRef { @override final BreakpointToken token; /// Creates a new breakpoint reference with the given [token]. const BreakpointRef(this.token); } + +class BreakpointTokenUtil { + final xsmall = BreakpointToken.xsmall; + final small = BreakpointToken.small; + final medium = BreakpointToken.medium; + final large = BreakpointToken.large; + const BreakpointTokenUtil(); +} diff --git a/packages/mix/lib/src/theme/tokens/color_token.dart b/packages/mix/lib/src/theme/tokens/color_token.dart index 653e54ccc..b1e7bf514 100644 --- a/packages/mix/lib/src/theme/tokens/color_token.dart +++ b/packages/mix/lib/src/theme/tokens/color_token.dart @@ -51,7 +51,7 @@ class ColorResolver extends Color with WithTokenResolver { /// /// This is used to reference a color token in a theme, and is used to resolve the color value. /// Allows pass a [ColorToken] as a [Color] value. -class ColorRef extends Color with TokenRef { +class ColorRef extends Color with TokenRef { /// The token associated with the color reference. @override final ColorToken token; diff --git a/packages/mix/lib/src/theme/tokens/mix_token.dart b/packages/mix/lib/src/theme/tokens/mix_token.dart index 5051684cb..d01612b51 100644 --- a/packages/mix/lib/src/theme/tokens/mix_token.dart +++ b/packages/mix/lib/src/theme/tokens/mix_token.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import '../../core/dto.dart'; import '../../internal/compare_mixin.dart'; import '../../internal/iterable_ext.dart'; import 'color_token.dart'; @@ -36,14 +35,10 @@ abstract class MixToken { int get hashCode => Object.hash(name, runtimeType); } -mixin TokenRef, V> { +mixin TokenRef { T get token; } -mixin DtoRef, V> { - T get data; -} - mixin WithTokenResolver { BuildContextResolver get resolve; } diff --git a/packages/mix/lib/src/theme/tokens/radius_token.dart b/packages/mix/lib/src/theme/tokens/radius_token.dart index 8108297f4..61bdc7ce3 100644 --- a/packages/mix/lib/src/theme/tokens/radius_token.dart +++ b/packages/mix/lib/src/theme/tokens/radius_token.dart @@ -33,7 +33,7 @@ class RadiusResolver extends Radius with WithTokenResolver { } @immutable -class RadiusRef extends Radius with TokenRef { +class RadiusRef extends Radius with TokenRef { @override final RadiusToken token; diff --git a/packages/mix/lib/src/theme/tokens/text_style_token.dart b/packages/mix/lib/src/theme/tokens/text_style_token.dart index 37bb4c3d4..1ea31cbbf 100644 --- a/packages/mix/lib/src/theme/tokens/text_style_token.dart +++ b/packages/mix/lib/src/theme/tokens/text_style_token.dart @@ -2,9 +2,29 @@ import 'dart:ui'; import 'package:flutter/widgets.dart'; +import '../../attributes/text_style/text_style_dto.dart'; +import '../../core/factory/mix_data.dart'; import '../mix/mix_theme.dart'; import 'mix_token.dart'; +class TypographyToken extends MixToken { + const TypographyToken(super.name); + + @override + TypographyRef call() => TypographyRef(this); + + @override + TextStyleData resolve(BuildContext context) { + final themeValue = MixTheme.of(context).typography[this]; + assert( + themeValue != null, + 'TypographyToken $name is not defined in the theme', + ); + + return themeValue!; + } +} + class TextStyleToken extends MixToken { const TextStyleToken(super.name); @@ -36,7 +56,29 @@ class TextStyleResolver extends TextStyle with WithTokenResolver { } @immutable -class TextStyleRef extends TextStyle with TokenRef { +final class TypographyRef extends TextStyleData with TokenRef { + @override + final TypographyToken token; + const TypographyRef(this.token); + + @override + operator ==(Object other) { + if (identical(this, other)) return true; + + return other is TypographyRef && other.token == token; + } + + @override + int get hashCode => token.hashCode; + + @override + TextStyle resolve(MixData mix) { + throw Exception('Cannot resolve a reference '); + } +} + +@immutable +final class TextStyleRef extends TextStyle with TokenRef { @override final TextStyleToken token; diff --git a/packages/mix/lib/src/theme/tokens/token_util.dart b/packages/mix/lib/src/theme/tokens/token_util.dart index 70d90b533..3401c23a6 100644 --- a/packages/mix/lib/src/theme/tokens/token_util.dart +++ b/packages/mix/lib/src/theme/tokens/token_util.dart @@ -1,14 +1,13 @@ -import 'package:flutter/widgets.dart'; - import '../material/material_tokens.dart'; import 'breakpoints_token.dart'; import 'radius_token.dart'; import 'space_token.dart'; const $material = MaterialTokens(); +@Deprecated('You should define your own token utility') const $token = MixTokens(); -@immutable +@Deprecated('You should define your own token utility') class MixTokens { final space = const SpaceTokenUtil(); final radius = const RadiusTokenUtil(); @@ -19,7 +18,7 @@ class MixTokens { const MixTokens(); } -@immutable +@Deprecated('You should define your own token utility') class RadiusTokenUtil { final small = const RadiusToken('mix.radius.small'); final medium = const RadiusToken('mix.radius.medium'); @@ -27,7 +26,7 @@ class RadiusTokenUtil { const RadiusTokenUtil(); } -@immutable +@Deprecated('You should define your own token utility') class SpaceTokenUtil { final large = const SpaceToken('mix.space.large'); final medium = const SpaceToken('mix.space.medium'); @@ -36,21 +35,12 @@ class SpaceTokenUtil { const SpaceTokenUtil(); } -@immutable +@Deprecated('You should define your own token utility') class ColorTokenUtil { const ColorTokenUtil(); } -@immutable +@Deprecated('You should define your own token utility') class TextStyleTokenUtil { const TextStyleTokenUtil(); } - -@immutable -class BreakpointTokenUtil { - final xsmall = BreakpointToken.xsmall; - final small = BreakpointToken.small; - final medium = BreakpointToken.medium; - final large = BreakpointToken.large; - const BreakpointTokenUtil(); -} diff --git a/packages/mix/test/helpers/testing_utils.dart b/packages/mix/test/helpers/testing_utils.dart index 9da6794b5..faad679b1 100644 --- a/packages/mix/test/helpers/testing_utils.dart +++ b/packages/mix/test/helpers/testing_utils.dart @@ -387,3 +387,36 @@ abstract base class TestScalarAttribute< return other ?? this as Self; } } + +class MixTokensTest { + final space = const SpaceTokenUtil(); + final radius = const RadiusTokenUtil(); + final color = const ColorTokenUtil(); + final breakpoint = const BreakpointTokenUtil(); + final textStyle = const TextStyleTokenUtil(); + + const MixTokensTest(); +} + +class RadiusTokenUtil { + final small = const RadiusToken('mix.radius.small'); + final medium = const RadiusToken('mix.radius.medium'); + final large = const RadiusToken('mix.radius.large'); + const RadiusTokenUtil(); +} + +class SpaceTokenUtil { + final large = const SpaceToken('mix.space.large'); + final medium = const SpaceToken('mix.space.medium'); + final small = const SpaceToken('mix.space.small'); + + const SpaceTokenUtil(); +} + +class ColorTokenUtil { + const ColorTokenUtil(); +} + +class TextStyleTokenUtil { + const TextStyleTokenUtil(); +} diff --git a/packages/mix/test/src/theme/material/material_tokens_test.dart b/packages/mix/test/src/theme/material/material_tokens_test.dart index 3581e3eb4..0725afd90 100644 --- a/packages/mix/test/src/theme/material/material_tokens_test.dart +++ b/packages/mix/test/src/theme/material/material_tokens_test.dart @@ -9,8 +9,8 @@ import '../../../helpers/testing_utils.dart'; void main() { // Create a test that checks if all the values of these tokens match the ThemeData from the MaterialApp group('Material tokens', () { - Value refResolver, R extends TokenRef, - Value>(R ref, BuildContext context) { + Value refResolver, R extends TokenRef, Value>( + R ref, BuildContext context) { return ref.token.resolve(context); } diff --git a/packages/mix/test/src/theme/mix_theme_test.dart b/packages/mix/test/src/theme/mix_theme_test.dart index 2dcd49ab1..fcbeb602e 100644 --- a/packages/mix/test/src/theme/mix_theme_test.dart +++ b/packages/mix/test/src/theme/mix_theme_test.dart @@ -6,15 +6,16 @@ import '../../helpers/testing_utils.dart'; void main() { const primaryColor = ColorToken('primary'); + const tokenUtil = MixTokensTest(); final theme = MixThemeData( breakpoints: { - $token.breakpoint.small: const Breakpoint(minWidth: 0, maxWidth: 599), + tokenUtil.breakpoint.small: const Breakpoint(minWidth: 0, maxWidth: 599), }, colors: { primaryColor: Colors.blue, $material.colorScheme.error: Colors.redAccent, }, - spaces: {$token.space.small: 30}, + spaces: {tokenUtil.space.small: 30}, textStyles: { $material.textTheme.bodyLarge: const TextStyle( fontSize: 200, @@ -22,8 +23,8 @@ void main() { ), }, radii: { - $token.radius.small: const Radius.circular(200), - $token.radius.large: const Radius.circular(2000), + tokenUtil.radius.small: const Radius.circular(200), + tokenUtil.radius.large: const Radius.circular(2000), }, ); @@ -46,8 +47,8 @@ void main() { Box( style: Style( $box.color.ref(primaryColor), - $box.borderRadius.all.ref($token.radius.small), - $box.padding.horizontal.ref($token.space.small), + $box.borderRadius.all.ref(tokenUtil.radius.small), + $box.padding.horizontal.ref(tokenUtil.space.small), $text.style.ref($material.textTheme.bodyLarge), ), key: key, @@ -67,12 +68,13 @@ void main() { container.decoration, BoxDecoration( color: theme.colors[primaryColor], - borderRadius: BorderRadius.all(theme.radii[$token.radius.small]!), + borderRadius: + BorderRadius.all(theme.radii[tokenUtil.radius.small]!), ), ); expect(container.padding!.horizontal / 2, - theme.spaces[$token.space.small]); + theme.spaces[tokenUtil.space.small]); final textWidget = tester.widget( find.descendant(of: find.byKey(key), matching: find.byType(Text)), diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button.dart index a975ca89b..b89c06383 100644 --- a/packages/remix/demo/lib/components/button.dart +++ b/packages/remix/demo/lib/components/button.dart @@ -5,7 +5,7 @@ import 'package:widgetbook/widgetbook.dart'; import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; @widgetbook.UseCase( - name: 'interactive playground', + name: 'Button Component', type: RxButton, ) Widget buildButtonUseCase(BuildContext context) { @@ -16,6 +16,12 @@ Widget buildButtonUseCase(BuildContext context) { initialValue: 'Button', ), onPressed: () {}, + size: context.knobs.list( + label: 'Size', + options: ButtonSize.values, + initialOption: ButtonSize.medium, + labelBuilder: (value) => value.name.split('.').last, + ), loading: context.knobs.boolean( label: 'Is loading', initialValue: false, @@ -32,12 +38,6 @@ Widget buildButtonUseCase(BuildContext context) { label: 'Icon right', initialValue: null, ), - size: context.knobs.list( - label: 'Size', - options: ButtonSize.values, - initialOption: ButtonSize.medium, - labelBuilder: (value) => value.name.split('.').last, - ), type: type, ); } diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index 351a5f73a..4ff635236 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -20,7 +20,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'button', children: [ _i1.WidgetbookLeafComponent( - name: 'RXButton', + name: 'RxButton', useCase: _i1.WidgetbookUseCase( name: 'interactive playground', builder: _i2.buildButtonUseCase, diff --git a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 84a846e69..1526d5ce0 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,12 +1,12 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6 +FLUTTER_ROOT=/Users/leofarias/fvm/versions/stable FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart FLUTTER_BUILD_DIR=build FLUTTER_BUILD_NAME=1.0.0 FLUTTER_BUILD_NUMBER=1 -DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw== +DART_DEFINES=RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC81NWVhZTY4NjRiMjk2ZGQ5ZjQzYjJjYzc1NzdlYzI1NmU1YzMyYThkLw== DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true TREE_SHAKE_ICONS=false diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index ff7c4ab40..af65198b8 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -96,31 +96,31 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/src/stopwatch.dart /Users/leofarias/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/code_builder-4.10.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/collection.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/algorithms.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/boollist.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/canonicalized_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_iterable.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_iterator.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_list.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/comparators.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/empty_unmodifiable_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/functions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/iterable_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/iterable_zip.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/list_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/priority_queue.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/queue_list.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/union_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/union_set_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/unmodifiable_wrappers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/wrappers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/collection.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/algorithms.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/boollist.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/canonicalized_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_iterable.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_iterator.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_list.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/comparators.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/empty_unmodifiable_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/functions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/iterable_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/iterable_zip.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/list_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/priority_queue.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/queue_list.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/union_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/union_set_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/unmodifiable_wrappers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/wrappers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/convert-3.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/crypto-3.0.3/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/LICENSE @@ -252,81 +252,140 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_serializable.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_serializable.g.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_value.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/leak_tracker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/_protocol.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/_registration.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/delivery.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/messages.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/primitives.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_baseliner.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_leak_filter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_leak_reporter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_leak_tracker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_record.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_record_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_records.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_tracker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/helpers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/leak_tracking.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_dispatcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_finalizer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_gc_counter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_print_bytes.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_retaining_path/_connection.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_retaining_path/_retaining_path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_retaining_path/_retaining_path_isolate.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_test_helper_detector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/model.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/_formatting.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/_primitives.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/_util.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/shared_model.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/leak_tracker_flutter_testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/model.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing_for_testing/leaking_classes.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing_for_testing/test_case.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing_for_testing/test_settings.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/lib/leak_tracker_testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/lib/src/leak_testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/lib/src/matchers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/lints-2.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/logging-1.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/core_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/custom_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/description.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/equals_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/error_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/async_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/expect_async.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/future_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/never_called.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/prints_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/stream_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/stream_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/throws_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/throws_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/util/placeholder.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/util/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/feature_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/having_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/interfaces.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/iterable_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/map_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/numeric_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/operator_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/order_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/string_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/type_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/util.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/blend/blend.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/cam16.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/hct.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/hct_solver.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/viewing_conditions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/material_color_utilities.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/palettes/core_palette.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/palettes/tonal_palette.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/point_provider.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/point_provider_lab.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_celebi.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_wsmeans.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_wu.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/scheme/scheme.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/score/score.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/utils/color_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/utils/math_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/meta.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/meta_meta.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/core_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/custom_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/description.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/equals_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/error_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/async_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/expect_async.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/future_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/never_called.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/prints_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/stream_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/stream_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/throws_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/throws_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/util/placeholder.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/util/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/feature_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/having_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/interfaces.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/iterable_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/map_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/numeric_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/operator_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/order_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/string_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/type_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/util.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/blend/blend.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/contrast/contrast.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dislike/dislike_analyzer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/dynamic_color.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/material_dynamic_colors.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/src/contrast_curve.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/src/tone_delta_pair.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/cam16.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/hct.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/src/hct_solver.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/viewing_conditions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/material_color_utilities.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/palettes/core_palette.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/palettes/tonal_palette.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_celebi.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_wsmeans.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_wu.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/src/point_provider.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/src/point_provider_lab.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/dynamic_scheme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_content.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_expressive.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_fidelity.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_monochrome.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_neutral.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_tonal_spot.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_vibrant.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/variant.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/score/score.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/temperature/temperature_cache.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/color_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/math_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/string_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/lib/meta.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/lib/meta_meta.dart /Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart /Users/leofarias/.pub-cache/hosted/pub.dev/package_config-2.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/characters.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/context.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/internal_style.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/parsed_path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/posix.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/url.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/windows.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/characters.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/context.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/internal_style.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/parsed_path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/posix.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/url.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/windows.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/pool-1.5.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3/LICENSE @@ -344,41 +403,41 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/shelf-1.4.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/source_gen-1.5.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/source_span.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/charcode.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/colors.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/file.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/highlighter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/location.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/location_mixin.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_mixin.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_with_context.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/chain.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/lazy_chain.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/lazy_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/stack_zone_specification.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/unparsed_frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/vm_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/stack_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/close_guarantee_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/delegating_stream_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/disconnector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/guarantee_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/json_document_transformer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/multi_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_completer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_transformer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/stream_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/source_span.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/charcode.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/colors.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/file.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/highlighter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/location.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/location_mixin.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_mixin.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_with_context.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/chain.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/lazy_chain.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/lazy_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/stack_zone_specification.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/unparsed_frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/vm_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/stack_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/close_guarantee_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/delegating_stream_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/disconnector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/guarantee_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/json_document_transformer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/multi_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_completer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_transformer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/stream_channel.dart /Users/leofarias/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib/src/charcode.dart @@ -396,47 +455,44 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/src/generated/top_level.dart /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/src/generated/unicode_glyph_set.dart /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/term_glyph.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/fake.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/hooks.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/scaffolding.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/closed_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/compiler.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/on_platform.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/retry.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/skip.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/tags.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/test_on.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/timeout.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/declarer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/group.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/group_entry.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/invoker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/live_test.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/live_test_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/message.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/metadata.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/operating_system.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/platform_selector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/remote_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/runtime.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/stack_trace_formatter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/stack_trace_mapper.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/state.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/suite.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/suite_platform.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/test.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/test_failure.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/util/identifier_regex.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/util/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/expect/async_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/frontend/fake.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/spawn_hybrid.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/test_structure.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/test_api.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/fake.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/hooks.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/scaffolding.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/closed_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/compiler.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/on_platform.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/retry.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/skip.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/tags.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/test_on.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/timeout.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/declarer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/group.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/group_entry.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/invoker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/live_test.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/live_test_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/message.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/metadata.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/operating_system.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/platform_selector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/remote_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/runtime.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/stack_trace_formatter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/stack_trace_mapper.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/state.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/suite.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/suite_platform.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/test.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/test_failure.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/util/identifier_regex.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/util/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/frontend/fake.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/scaffolding/spawn_hybrid.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/scaffolding/test_structure.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/scaffolding/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/timing-1.0.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/typed_data-1.3.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/LICENSE @@ -465,6 +521,13 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector3.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector4.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math_64.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/_stream_helpers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/dart_io_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/snapshot_graph.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/vm_service.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/vm_service.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/vm_service_io.dart /Users/leofarias/.pub-cache/hosted/pub.dev/watcher-1.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/LICENSE @@ -809,651 +872,677 @@ /Users/leofarias/Projects/mix/packages/remix/lib/tokens/remix_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/space_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/text_style_tokens.dart -/Users/leofarias/fvm/versions/3.10.6/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf -/Users/leofarias/fvm/versions/3.10.6/bin/cache/pkg/sky_engine/LICENSE -/Users/leofarias/fvm/versions/3.10.6/bin/internal/engine.version -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/LICENSE -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/animation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/cupertino.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/foundation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/gestures.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/material.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/painting.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/physics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/rendering.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/scheduler.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/semantics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/services.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animation_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/curves.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/listener_helpers.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/tween.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/tween_sequence.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/activity_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/app.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/checkbox.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/colors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/context_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/context_menu_action.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/date_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/dialog.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/form_row.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/form_section.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/icon_theme_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/interface_level.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/list_section.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/localizations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/magnifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/nav_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/page_scaffold.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/radio.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/refresh.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/route.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/scrollbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/search_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/segmented_control.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/slider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/switch.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/tab_scaffold.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/tab_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_form_field_row.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/thumb_painter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/toggleable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_bitfield_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_capabilities_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_isolates_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_platform_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/annotations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/assertions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/basic_types.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/bitfield.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/capabilities.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/change_notifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/collections.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/consolidate_response.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/diagnostics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/isolates.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/key.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/licenses.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/math.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/memory_allocations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/node.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/object.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/observer_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/persistent_hash_map.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/platform.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/print.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/serialization.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/stack_frame.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/synchronous_future.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/unicode.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/arena.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/converter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/drag.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/drag_details.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/eager.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/events.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/force_press.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/gesture_settings.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/hit_test.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/long_press.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/lsq_solver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/monodrag.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/multidrag.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/multitap.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/pointer_router.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/recognizer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/resampler.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/scale.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/tap.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/team.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/velocity_tracker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/about.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_buttons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_icons_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/animated_icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/arc.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/autocomplete.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/back_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/badge.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/badge_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/banner.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/banner_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_app_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_app_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_navigation_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_sheet.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_sheet_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_style_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/calendar_date_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/card.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/card_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox_list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/chip_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/choice_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/circle_avatar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/color_scheme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/colors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/curves.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table_source.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date_picker_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dialog.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dialog_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/divider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/divider_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown_menu_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevated_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevated_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevation_overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expand_icon.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_panel.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_tile_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/feedback.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filled_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filled_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filter_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/flexible_space_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button_location.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/flutter_logo.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/grid_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/grid_tile_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icon_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icon_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_highlight.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_ripple.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_sparkle.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_splash.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_well.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_date_picker_form_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_decorator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/list_tile_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/magnifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_localizations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_state.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_state_mixin.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_anchor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/mergeable_material.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_drawer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_drawer_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_rail.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_rail_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/no_splash.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/outlined_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/outlined_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/page.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/page_transitions_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/paginated_data_table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/popup_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/popup_menu_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/progress_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/progress_indicator_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio_list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/range_slider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/refresh_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/reorderable_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scaffold.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scrollbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scrollbar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_anchor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_view_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/segmented_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/segmented_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/selectable_text.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/selection_area.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/shaders/ink_sparkle.frag -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/shadows.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/slider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/slider_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/snack_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/snack_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/stepper.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch_list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tabs.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_form_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/theme_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time_picker_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggle_buttons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggle_buttons_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggleable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip_visibility.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/typography.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/user_accounts_drawer_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/_network_image_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/alignment.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/basic_types.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/beveled_rectangle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/border_radius.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/borders.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_fit.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_shadow.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/circle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/clip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/colors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/continuous_rectangle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/decoration_image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/edge_insets.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/flutter_logo.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/fractional_offset.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/geometry.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/gradient.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_cache.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_decoder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_provider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_resolution.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_stream.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/inline_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/linear_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/matrix_utils.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/notched_shapes.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/oval_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/paint_utilities.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/placeholder_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/rounded_rectangle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/shader_warm_up.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/shape_decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/stadium_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/star_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/strut_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_painter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/clamped_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/friction_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/gravity_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/spring_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/tolerance.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/utils.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/animated_size.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/custom_layout.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/custom_paint.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/editable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/error.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/flex.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/flow.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/layer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/layout_helper.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/list_body.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/list_wheel_viewport.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/mouse_tracker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/object.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/paragraph.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/performance_overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/platform_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/proxy_box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/proxy_sliver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/rotated_box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/shifted_box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_fill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_grid.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_padding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_persistent_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/stack.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/table_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/texture.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/tweens.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/viewport.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/viewport_offset.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/wrap.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/priority.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/ticker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics_event.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics_service.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/asset_bundle.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/asset_manifest.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/autofill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/binary_messenger.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/browser_context_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/clipboard.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/deferred_component.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/font_loader.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/haptic_feedback.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/hardware_keyboard.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_inserted_content.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_key.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_maps.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/message_codec.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/message_codecs.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/mouse_cursor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/mouse_tracking.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/platform_channel.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/platform_views.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_android.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_ios.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_linux.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_macos.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_web.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_windows.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/restoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/spell_check.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_channels.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_chrome.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_navigator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_sound.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_boundary.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_editing.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_editing_delta.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_formatter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_input.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_layout_metrics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/undo_manager.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/actions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_cross_fade.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_size.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_switcher.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/annotated_region.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/app.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/async.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/autocomplete.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/autofill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/automatic_keep_alive.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/banner.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/basic.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/color_filter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/container.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/context_menu_button_item.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/context_menu_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/default_selection_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/dismissible.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/disposable_build_context.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/drag_target.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/dual_transition_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/editable_text.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/fade_in_image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_manager.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_scope.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_traversal.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/form.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/framework.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/gesture_detector.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/grid_paper.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/heroes.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_theme_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image_filter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image_icon.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/implicit_animations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_model.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_notifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/interactive_viewer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/keyboard_listener.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/layout_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/localizations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/lookup_boundary.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/magnifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/media_query.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/modal_barrier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/navigation_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/navigator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/nested_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/notification_listener.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/orientation_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overflow_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overscroll_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/page_storage.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/page_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/pages.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/performance_overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/placeholder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_menu_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/preferred_size.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/primary_scroll_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/reorderable_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/restoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/restoration_properties.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/router.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/routes.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/safe_area.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_activity.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_configuration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_context.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_metrics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_notification.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_notification_observer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_physics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_position.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollable_helpers.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/selectable_region.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/selection_container.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/semantics_debugger.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/shared_app_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/shortcuts.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/single_child_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_fill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_layout_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_persistent_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/snapshot_widget.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/spacer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/spell_check.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/status_transitions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tap_region.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_editing_intents.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/texture.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/ticker_provider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/title.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/transitions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tween_animation_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/undo_history.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/unique_widget.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/value_listenable_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/viewport.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/visibility.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/widget_inspector.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/widget_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/will_pop_scope.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/widgets.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/flutter_test.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_binding_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_goldens_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_matchers_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/accessibility.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/all_elements.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/animation_sheet.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/deprecated.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/event_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/finders.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/frame_timing_summarizer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/goldens.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/matchers.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/nonconst.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/platform.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/restoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/stack_manipulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_async_utils.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_compat.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_default_binary_messenger.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_exception_reporter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_pointer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_text_input.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_text_input_key_handler.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_vsync.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/widget_tester.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/window.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/common.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/macos.dart +/Users/leofarias/fvm/versions/stable/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf +/Users/leofarias/fvm/versions/stable/bin/cache/pkg/sky_engine/LICENSE +/Users/leofarias/fvm/versions/stable/bin/internal/engine.version +/Users/leofarias/fvm/versions/stable/packages/flutter/LICENSE +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/animation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/cupertino.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/foundation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/gestures.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/material.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/painting.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/physics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/rendering.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/scheduler.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/semantics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/services.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animation_controller.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animation_style.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/curves.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/listener_helpers.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/tween.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/tween_sequence.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/activity_indicator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/app.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/checkbox.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/colors.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/constants.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/context_menu.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/context_menu_action.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/date_picker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/desktop_text_selection.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/dialog.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/form_row.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/form_section.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/icon_theme_data.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/icons.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/interface_level.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/list_section.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/list_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/localizations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/magnifier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/nav_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/page_scaffold.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/picker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/radio.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/refresh.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/route.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/scrollbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/search_field.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/segmented_control.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/slider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/switch.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/tab_scaffold.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/tab_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_field.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_form_field_row.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_selection.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/thumb_painter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/toggleable.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_bitfield_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_capabilities_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_isolates_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_platform_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_timeline_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/annotations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/assertions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/basic_types.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/bitfield.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/capabilities.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/change_notifier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/collections.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/consolidate_response.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/constants.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/diagnostics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/isolates.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/key.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/licenses.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/memory_allocations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/node.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/object.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/observer_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/persistent_hash_map.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/platform.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/print.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/serialization.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/service_extensions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/stack_frame.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/synchronous_future.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/timeline.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/unicode.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/arena.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/constants.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/converter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/drag.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/drag_details.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/eager.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/events.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/force_press.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/gesture_settings.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/hit_test.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/long_press.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/lsq_solver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/monodrag.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/multidrag.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/multitap.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/pointer_router.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/recognizer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/resampler.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/scale.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/tap.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/tap_and_drag.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/team.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/velocity_tracker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/about.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/action_buttons.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/action_chip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/action_icons_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/animated_icons.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/app.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/app_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/app_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/arc.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/autocomplete.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/back_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/badge.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/badge_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/banner.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/banner_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_app_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_app_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_navigation_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_sheet.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_sheet_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_style.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_style_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/calendar_date_picker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/card.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/card_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/checkbox.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/checkbox_list_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/checkbox_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/chip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/chip_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/choice_chip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/circle_avatar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/color_scheme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/colors.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/constants.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/curves.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/data_table.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/data_table_source.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/data_table_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/date.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/date_picker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/date_picker_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/desktop_text_selection.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dialog.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dialog_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/divider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/divider_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/drawer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/drawer_header.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/drawer_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dropdown.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dropdown_menu.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dropdown_menu_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/elevated_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/elevated_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/elevation_overlay.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expand_icon.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expansion_panel.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expansion_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expansion_tile_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/feedback.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/filled_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/filled_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/filter_chip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/flexible_space_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/floating_action_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/floating_action_button_location.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/floating_action_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/flutter_logo.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/grid_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/grid_tile_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/icon_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/icon_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/icons.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_decoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_highlight.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_ripple.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_sparkle.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_splash.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_well.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_chip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_date_picker_form_field.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_decorator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/list_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/list_tile_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/magnifier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_localizations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_state.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_state_mixin.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_anchor.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_style.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/mergeable_material.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/motion.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_drawer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_drawer_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_rail.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_rail_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/no_splash.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/outlined_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/outlined_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/page.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/page_transitions_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/paginated_data_table.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/popup_menu.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/popup_menu_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/predictive_back_page_transitions_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/progress_indicator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/progress_indicator_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/radio.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/radio_list_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/radio_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/range_slider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/refresh_indicator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/reorderable_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/scaffold.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/scrollbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/scrollbar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search_anchor.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search_view_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/segmented_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/segmented_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/selectable_text.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/selection_area.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/shaders/ink_sparkle.frag +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/shadows.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/slider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/slider_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/snack_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/snack_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/stepper.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/switch.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/switch_list_tile.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/switch_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tab_bar_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tab_controller.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tab_indicator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tabs.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_button_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_field.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_form_field.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/theme_data.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/time.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/time_picker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/time_picker_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/toggle_buttons.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/toggle_buttons_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/toggleable.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tooltip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tooltip_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tooltip_visibility.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/typography.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/user_accounts_drawer_header.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/_network_image_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/alignment.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/basic_types.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/beveled_rectangle_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/border_radius.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/borders.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_decoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_fit.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_shadow.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/circle_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/clip.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/colors.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/continuous_rectangle_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/decoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/decoration_image.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/edge_insets.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/flutter_logo.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/fractional_offset.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/geometry.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/gradient.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_cache.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_decoder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_provider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_resolution.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_stream.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/inline_span.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/linear_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/matrix_utils.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/notched_shapes.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/oval_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/paint_utilities.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/placeholder_span.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/rounded_rectangle_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/shader_warm_up.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/shape_decoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/stadium_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/star_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/strut_style.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_painter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_scaler.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_span.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_style.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/clamped_simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/friction_simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/gravity_simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/spring_simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/tolerance.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/utils.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/animated_size.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/box.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/custom_layout.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/custom_paint.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/decorated_sliver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/editable.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/error.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/flex.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/flow.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/image.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/layer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/layout_helper.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/list_body.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/list_wheel_viewport.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/mouse_tracker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/object.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/paragraph.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/performance_overlay.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/platform_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/proxy_box.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/proxy_sliver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/rotated_box.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/selection.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/service_extensions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/shifted_box.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_fill.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_grid.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_group.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_padding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_persistent_header.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/stack.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/table.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/table_border.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/texture.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/tweens.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/viewport.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/viewport_offset.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/wrap.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/priority.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/service_extensions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/ticker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/semantics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/semantics_event.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/semantics_service.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/asset_bundle.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/asset_manifest.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/autofill.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/binary_messenger.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/browser_context_menu.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/clipboard.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/deferred_component.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/flavor.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/font_loader.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/haptic_feedback.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/hardware_keyboard.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/keyboard_inserted_content.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/keyboard_key.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/keyboard_maps.g.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/live_text.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/message_codec.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/message_codecs.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/mouse_cursor.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/mouse_tracking.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/platform_channel.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/platform_views.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/predictive_back_event.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/process_text.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_android.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_ios.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_linux.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_macos.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_web.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_windows.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/restoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/service_extensions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/spell_check.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_channels.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_chrome.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_navigator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_sound.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_boundary.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_editing.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_editing_delta.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_formatter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_input.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_layout_metrics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/undo_manager.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/_html_element_view_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/actions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/adapter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_cross_fade.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_scroll_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_size.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_switcher.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/annotated_region.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/app.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/app_lifecycle_listener.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/async.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/autocomplete.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/autofill.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/automatic_keep_alive.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/banner.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/basic.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/color_filter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/constants.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/container.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/context_menu_button_item.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/context_menu_controller.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/debug.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/decorated_sliver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/default_selection_style.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/dismissible.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/disposable_build_context.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/drag_target.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/dual_transition_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/editable_text.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/fade_in_image.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/focus_manager.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/focus_scope.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/focus_traversal.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/form.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/framework.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/gesture_detector.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/grid_paper.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/heroes.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon_data.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon_theme_data.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/image.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/image_filter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/image_icon.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/implicit_animations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/inherited_model.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/inherited_notifier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/inherited_theme.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/interactive_viewer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/keyboard_listener.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/layout_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/localizations.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/lookup_boundary.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/magnifier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/media_query.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/modal_barrier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/navigation_toolbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/navigator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/navigator_pop_handler.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/nested_scroll_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/notification_listener.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/orientation_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/overflow_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/overlay.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/overscroll_indicator.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/page_storage.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/page_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/pages.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/performance_overlay.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/placeholder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/platform_menu_bar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/platform_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/pop_scope.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/preferred_size.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/primary_scroll_controller.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/reorderable_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/restoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/restoration_properties.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/router.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/routes.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/safe_area.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_activity.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_configuration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_context.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_controller.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_delegate.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_metrics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_notification.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_notification_observer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_physics.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_position.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scrollable.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scrollable_helpers.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scrollbar.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/selectable_region.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/selection_container.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/semantics_debugger.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/service_extensions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/shared_app_data.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/shortcuts.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/single_child_scroll_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_fill.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_layout_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_persistent_header.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_varied_extent_list.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/snapshot_widget.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/spacer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/spell_check.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/status_transitions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/table.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/tap_region.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_editing_intents.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_selection.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/texture.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/ticker_provider.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/title.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/transitions.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/tween_animation_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/two_dimensional_scroll_view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/two_dimensional_viewport.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/undo_history.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/unique_widget.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/value_listenable_builder.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/view.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/viewport.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/visibility.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/widget_inspector.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/widget_span.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/widget_state.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/will_pop_scope.dart +/Users/leofarias/fvm/versions/stable/packages/flutter/lib/widgets.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/flutter_test.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_binding_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_goldens_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_matchers_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_test_selector_io.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/accessibility.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/animation_sheet.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/binding.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/controller.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/deprecated.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/event_simulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/finders.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/frame_timing_summarizer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/goldens.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/image.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/matchers.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/mock_canvas.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/mock_event_channel.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/nonconst.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/platform.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/recording_canvas.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/restoration.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/stack_manipulation.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_async_utils.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_compat.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_default_binary_messenger.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_exception_reporter.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_pointer.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_text_input.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_text_input_key_handler.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_vsync.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/tree_traversal.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/widget_tester.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/window.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/common.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/macos.dart +/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart diff --git a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh index 701777f05..634a032f7 100755 --- a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,13 +1,13 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6" +export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/stable" export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=1.0.0" export "FLUTTER_BUILD_NUMBER=1" -export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw==" +export "DART_DEFINES=RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC81NWVhZTY4NjRiMjk2ZGQ5ZjQzYjJjYzc1NzdlYzI1NmU1YzMyYThkLw==" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" diff --git a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj index de4d66361..5da3a824e 100644 --- a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj @@ -227,7 +227,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { diff --git a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 0b1d244f9..ae8764fa2 100644 --- a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Style( _flex.crossAxisAlignment.center(), _flex.mainAxisSize.min(), _container.borderRadius(6), - _label.style.fontWeight(FontWeight.w500), _spinner.strokeWidth(1), - _label.textHeightBehavior(const TextHeightBehavior( - // applyHeightToFirstAscent: false, - // applyHeightToLastDescent: false, - // leadingDistribution: TextLeadingDistribution.even, - )), + _label.style.fontWeight(FontWeight.w500), + _label.textHeightBehavior( + const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: true, + ), + ), ); final _onDisabledBackground = Style( diff --git a/packages/remix/lib/helpers/color_palette.dart b/packages/remix/lib/helpers/color_palette.dart index cd26a0d10..7e6d7155b 100644 --- a/packages/remix/lib/helpers/color_palette.dart +++ b/packages/remix/lib/helpers/color_palette.dart @@ -46,6 +46,11 @@ class RadixColors { static const violetDark = RadixColors(_violetDark, _violetDarkAlpha); static const yellow = RadixColors(_yellow, _yellowAlpha); static const yellowDark = RadixColors(_yellowDark, _yellowDarkAlpha); + static const grass = RadixColors(_grass, _grassAlpha); + static const grassDark = RadixColors(_grassDark, _grassDarkAlpha); + static const sky = RadixColors(_sky, _skyAlpha); + static const skyDark = RadixColors(_skyDark, _skyDarkAlpha); + //TODO: ADD REMAINING COLORS Color get s1 => swatch[1]!; Color get s1Alpha => alphaSwatch[1]!; diff --git a/packages/remix/lib/helpers/color_utils.dart b/packages/remix/lib/helpers/color_utils.dart index 7b94d6f5c..968eab390 100644 --- a/packages/remix/lib/helpers/color_utils.dart +++ b/packages/remix/lib/helpers/color_utils.dart @@ -81,96 +81,6 @@ ColorSwatch getColorSwatch(Color color) { }); } -const amberScale = ColorSwatch( - 0xffee9d2b, - { - 1: Color(0xfffefdfb), - 2: Color(0xfffff9ed), - 3: Color(0xfffff4d5), - 4: Color(0xffffecbc), - 5: Color(0xffffe3a2), - 6: Color(0xffffd386), - 7: Color(0xfff3ba63), - 8: Color(0xffee9d2b), - 9: Color(0xffffb224), - 10: Color(0xffffa01c), - 11: Color(0xffad5700), - 12: Color(0xff4e2009) - }, -); - -const amberAScale = ColorSwatch( - 0xd4ea8900, - { - 1: Color(0x04c08205), - 2: Color(0x12ffab02), - 3: Color(0x2affbb01), - 4: Color(0x43ffb700), - 5: Color(0x5dffb300), - 6: Color(0x79ffa201), - 7: Color(0x9cec8d00), - 8: Color(0xd4ea8900), - 9: Color(0xdbffa600), - 10: Color(0xe3ff9500), - 11: Color(0xfaab5300), - 12: Color(0xf6481800) - }, -); - -const amberDarkScale = ColorSwatch( - 0xffffb224, - { - 1: Color(0xff1f1300), - 2: Color(0xff271700), - 3: Color(0xff341c00), - 4: Color(0xff3f2200), - 5: Color(0xff4a2900), - 6: Color(0xff573300), - 7: Color(0xff693f05), - 8: Color(0xff824e00), - 9: Color(0xffffb224), - 10: Color(0xffffcb47), - 11: Color(0xfff1a10d), - 12: Color(0xfffef3dd) - }, -); - -const amberDarkAScale = ColorSwatch( - 0xfaffb625, - { - 1: Color(0x00000000), - 2: Color(0x09fd8300), - 3: Color(0x18fe7300), - 4: Color(0x24ff7b00), - 5: Color(0x31ff8400), - 6: Color(0x40ff9500), - 7: Color(0x54ff970f), - 8: Color(0x71ff9900), - 9: Color(0xfaffb625), - 10: Color(0xfaffce48), - 11: Color(0xefffab0e), - 12: Color(0xfafff8e1) - }, -); - -const blueScale = ColorSwatch( - 0xff0091ff, - { - 1: Color(0xfffbfdff), - 2: Color(0xfff5faff), - 3: Color(0xffedf6ff), - 4: Color(0xffe1f0ff), - 5: Color(0xffcee7fe), - 6: Color(0xffb7d9f8), - 7: Color(0xff96c7f2), - 8: Color(0xff5eb0ef), - 9: Color(0xff0091ff), - 10: Color(0xff0081f1), - 11: Color(0xff006adc), - 12: Color(0xff00254d) - }, -); - Color getTextColor(Color background) { const white = Color(0xFFFFFFFF); diff --git a/packages/remix/lib/tokens/color_tokens.dart b/packages/remix/lib/tokens/color_tokens.dart index 8a4dfe6d5..762119979 100644 --- a/packages/remix/lib/tokens/color_tokens.dart +++ b/packages/remix/lib/tokens/color_tokens.dart @@ -2,164 +2,115 @@ import 'package:flutter/rendering.dart'; import 'package:mix/mix.dart'; import 'package:remix/helpers/color_palette.dart'; -const _accent1 = ColorToken('accent.1'); -const _accent2 = ColorToken('accent.2'); -const _accent3 = ColorToken('accent.3'); -const _accent4 = ColorToken('accent.4'); -const _accent5 = ColorToken('accent.5'); -const _accent6 = ColorToken('accent.6'); -const _accent7 = ColorToken('accent.7'); -const _accent8 = ColorToken('accent.8'); -const _accent9 = ColorToken('accent.9'); -const _accent10 = ColorToken('accent.10'); -const _accent11 = ColorToken('accent.11'); -const _accent12 = ColorToken('accent.12'); -const _accent1A = ColorToken('accent.1.alpha'); -const _accent2A = ColorToken('accent.2.alpha'); -const _accent3A = ColorToken('accent.3.alpha'); -const _accent4A = ColorToken('accent.4.alpha'); -const _accent5A = ColorToken('accent.5.alpha'); -const _accent6A = ColorToken('accent.6.alpha'); -const _accent7A = ColorToken('accent.7.alpha'); -const _accent8A = ColorToken('accent.8.alpha'); -const _accent9A = ColorToken('accent.9.alpha'); -const _accent10A = ColorToken('accent.10.alpha'); -const _accent11A = ColorToken('accent.11.alpha'); -const _accent12A = ColorToken('accent.12.alpha'); - -const _neutral1 = ColorToken('neutral.1'); -const _neutral2 = ColorToken('neutral.2'); -const _neutral3 = ColorToken('neutral.3'); -const _neutral4 = ColorToken('neutral.4'); -const _neutral5 = ColorToken('neutral.5'); -const _neutral6 = ColorToken('neutral.6'); -const _neutral7 = ColorToken('neutral.7'); -const _neutral8 = ColorToken('neutral.8'); -const _neutral9 = ColorToken('neutral.9'); -const _neutral10 = ColorToken('neutral.10'); -const _neutral11 = ColorToken('neutral.11'); -const _neutral12 = ColorToken('neutral.12'); -const _neutral1A = ColorToken('neutral.1.alpha'); -const _neutral2A = ColorToken('neutral.2.alpha'); -const _neutral3A = ColorToken('neutral.3.alpha'); -const _neutral4A = ColorToken('neutral.4.alpha'); -const _neutral5A = ColorToken('neutral.5.alpha'); -const _neutral6A = ColorToken('neutral.6.alpha'); -const _neutral7A = ColorToken('neutral.7.alpha'); -const _neutral8A = ColorToken('neutral.8.alpha'); -const _neutral9A = ColorToken('neutral.9.alpha'); -const _neutral10A = ColorToken('neutral.10.alpha'); -const _neutral11A = ColorToken('neutral.11.alpha'); -const _neutral12A = ColorToken('neutral.12.alpha'); - class RemixColor { - const RemixColor(); + RemixColor(); - final accent1 = _accent1; - final accent2 = _accent2; - final accent3 = _accent3; - final accent4 = _accent4; - final accent5 = _accent5; - final accent6 = _accent6; - final accent7 = _accent7; - final accent8 = _accent8; - final accent9 = _accent9; - final accent10 = _accent10; - final accent11 = _accent11; - final accent12 = _accent12; - final accent1A = _accent1A; - final accent2A = _accent2A; - final accent3A = _accent3A; - final accent4A = _accent4A; - final accent5A = _accent5A; - final accent6A = _accent6A; - final accent7A = _accent7A; - final accent8A = _accent8A; - final accent9A = _accent9A; - final accent10A = _accent10A; - final accent11A = _accent11A; - final accent12A = _accent12A; + final accent1 = const ColorToken('--accent-1'); + final accent2 = const ColorToken('--accent-2'); + final accent3 = const ColorToken('--accent-3'); + final accent4 = const ColorToken('--accent-4'); + final accent5 = const ColorToken('--accent-5'); + final accent6 = const ColorToken('--accent-6'); + final accent7 = const ColorToken('--accent-7'); + final accent8 = const ColorToken('--accent-8'); + final accent9 = const ColorToken('--accent-9'); + final accent10 = const ColorToken('--accent-10'); + final accent11 = const ColorToken('--accent-11'); + final accent12 = const ColorToken('--accent-12'); + final accent1A = const ColorToken('--accent-1a'); + final accent2A = const ColorToken('--accent-2a'); + final accent3A = const ColorToken('--accent-3a'); + final accent4A = const ColorToken('--accent-4a'); + final accent5A = const ColorToken('--accent-5a'); + final accent6A = const ColorToken('--accent-6a'); + final accent7A = const ColorToken('--accent-7a'); + final accent8A = const ColorToken('--accent-8a'); + final accent9A = const ColorToken('--accent-9a'); + final accent10A = const ColorToken('--accent-10a'); + final accent11A = const ColorToken('--accent-11a'); + final accent12A = const ColorToken('--accent-12a'); - final neutral1 = _neutral1; - final neutral2 = _neutral2; - final neutral3 = _neutral3; - final neutral4 = _neutral4; - final neutral5 = _neutral5; - final neutral6 = _neutral6; - final neutral7 = _neutral7; - final neutral8 = _neutral8; - final neutral9 = _neutral9; - final neutral10 = _neutral10; - final neutral11 = _neutral11; - final neutral12 = _neutral12; - final neutral1A = _neutral1A; - final neutral2A = _neutral2A; - final neutral3A = _neutral3A; - final neutral4A = _neutral4A; - final neutral5A = _neutral5A; - final neutral6A = _neutral6A; - final neutral7A = _neutral7A; - final neutral8A = _neutral8A; - final neutral9A = _neutral9A; - final neutral10A = _neutral10A; - final neutral11A = _neutral11A; - final neutral12A = _neutral12A; + final neutral1 = const ColorToken('--neutral-1'); + final neutral2 = const ColorToken('--neutral-2'); + final neutral3 = const ColorToken('--neutral-3'); + final neutral4 = const ColorToken('--neutral-4'); + final neutral5 = const ColorToken('--neutral-5'); + final neutral6 = const ColorToken('--neutral-6'); + final neutral7 = const ColorToken('--neutral-7'); + final neutral8 = const ColorToken('--neutral-8'); + final neutral9 = const ColorToken('--neutral-9'); + final neutral10 = const ColorToken('--neutral-10'); + final neutral11 = const ColorToken('--neutral-11'); + final neutral12 = const ColorToken('--neutral-12'); + final neutral1A = const ColorToken('--neutral-1a'); + final neutral2A = const ColorToken('--neutral-2a'); + final neutral3A = const ColorToken('--neutral-3a'); + final neutral4A = const ColorToken('--neutral-4a'); + final neutral5A = const ColorToken('--neutral-5a'); + final neutral6A = const ColorToken('--neutral-6a'); + final neutral7A = const ColorToken('--neutral-7a'); + final neutral8A = const ColorToken('--neutral-8a'); + final neutral9A = const ColorToken('--neutral-9a'); + final neutral10A = const ColorToken('--neutral-10a'); + final neutral11A = const ColorToken('--neutral-11a'); + final neutral12A = const ColorToken('--neutral-12a'); } +final _c = RemixColor(); + Map _mapColorRadixTokens({ required RadixColors accent, required RadixColors neutral, }) { - const color = RemixColor(); return { - color.accent1: accent.s1, - color.accent2: accent.s2, - color.accent3: accent.s3, - color.accent4: accent.s4, - color.accent5: accent.s5, - color.accent6: accent.s6, - color.accent7: accent.s7, - color.accent8: accent.s8, - color.accent9: accent.s9, - color.accent10: accent.s10, - color.accent11: accent.s11, - color.accent12: accent.s12, - color.accent1A: accent.s1Alpha, - color.accent2A: accent.s2Alpha, - color.accent3A: accent.s3Alpha, - color.accent4A: accent.s4Alpha, - color.accent5A: accent.s5Alpha, - color.accent6A: accent.s6Alpha, - color.accent7A: accent.s7Alpha, - color.accent8A: accent.s8Alpha, - color.accent9A: accent.s9Alpha, - color.accent10A: accent.s10Alpha, - color.accent11A: accent.s11Alpha, - color.accent12A: accent.s12Alpha, - color.neutral1: neutral.s1, - color.neutral2: neutral.s2, - color.neutral3: neutral.s3, - color.neutral4: neutral.s4, - color.neutral5: neutral.s5, - color.neutral6: neutral.s6, - color.neutral7: neutral.s7, - color.neutral8: neutral.s8, - color.neutral9: neutral.s9, - color.neutral10: neutral.s10, - color.neutral11: neutral.s11, - color.neutral12: neutral.s12, - color.neutral1A: neutral.s1Alpha, - color.neutral2A: neutral.s2Alpha, - color.neutral3A: neutral.s3Alpha, - color.neutral4A: neutral.s4Alpha, - color.neutral5A: neutral.s5Alpha, - color.neutral6A: neutral.s6Alpha, - color.neutral7A: neutral.s7Alpha, - color.neutral8A: neutral.s8Alpha, - color.neutral9A: neutral.s9Alpha, - color.neutral10A: neutral.s10Alpha, - color.neutral11A: neutral.s11Alpha, - color.neutral12A: neutral.s12Alpha, + _c.accent1: accent.s1, + _c.accent2: accent.s2, + _c.accent3: accent.s3, + _c.accent4: accent.s4, + _c.accent5: accent.s5, + _c.accent6: accent.s6, + _c.accent7: accent.s7, + _c.accent8: accent.s8, + _c.accent9: accent.s9, + _c.accent10: accent.s10, + _c.accent11: accent.s11, + _c.accent12: accent.s12, + _c.accent1A: accent.s1Alpha, + _c.accent2A: accent.s2Alpha, + _c.accent3A: accent.s3Alpha, + _c.accent4A: accent.s4Alpha, + _c.accent5A: accent.s5Alpha, + _c.accent6A: accent.s6Alpha, + _c.accent7A: accent.s7Alpha, + _c.accent8A: accent.s8Alpha, + _c.accent9A: accent.s9Alpha, + _c.accent10A: accent.s10Alpha, + _c.accent11A: accent.s11Alpha, + _c.accent12A: accent.s12Alpha, + _c.neutral1: neutral.s1, + _c.neutral2: neutral.s2, + _c.neutral3: neutral.s3, + _c.neutral4: neutral.s4, + _c.neutral5: neutral.s5, + _c.neutral6: neutral.s6, + _c.neutral7: neutral.s7, + _c.neutral8: neutral.s8, + _c.neutral9: neutral.s9, + _c.neutral10: neutral.s10, + _c.neutral11: neutral.s11, + _c.neutral12: neutral.s12, + _c.neutral1A: neutral.s1Alpha, + _c.neutral2A: neutral.s2Alpha, + _c.neutral3A: neutral.s3Alpha, + _c.neutral4A: neutral.s4Alpha, + _c.neutral5A: neutral.s5Alpha, + _c.neutral6A: neutral.s6Alpha, + _c.neutral7A: neutral.s7Alpha, + _c.neutral8A: neutral.s8Alpha, + _c.neutral9A: neutral.s9Alpha, + _c.neutral10A: neutral.s10Alpha, + _c.neutral11A: neutral.s11Alpha, + _c.neutral12A: neutral.s12Alpha, }; } diff --git a/packages/remix/lib/tokens/radius_tokens.dart b/packages/remix/lib/tokens/radius_tokens.dart index 31e47f54c..1d4bdfb0e 100644 --- a/packages/remix/lib/tokens/radius_tokens.dart +++ b/packages/remix/lib/tokens/radius_tokens.dart @@ -1,30 +1,23 @@ import 'package:flutter/rendering.dart'; import 'package:mix/mix.dart'; -const _radius1 = RadiusToken('r1'); -const _radius2 = RadiusToken('r2'); -const _radius3 = RadiusToken('r3'); -const _radius4 = RadiusToken('r4'); -const _radius5 = RadiusToken('r5'); -const _radius6 = RadiusToken('r6'); - class RemixRadius { - const RemixRadius(); + RemixRadius(); - final r1 = _radius1; - final r2 = _radius2; - final r3 = _radius3; - final r4 = _radius4; - final r5 = _radius5; - final r6 = _radius6; + final radius1 = const RadiusToken('--radius-1'); + final radius2 = const RadiusToken('--radius-2'); + final radius3 = const RadiusToken('--radius-3'); + final radius4 = const RadiusToken('--radius-4'); + final radius5 = const RadiusToken('--radius-5'); + final radius6 = const RadiusToken('--radius-6'); } -const _radii = RemixRadius(); +final _r = RemixRadius(); final remixRadiusTokens = { - _radii.r1: const Radius.circular(4), - _radii.r2: const Radius.circular(8), - _radii.r3: const Radius.circular(12), - _radii.r4: const Radius.circular(16), - _radii.r5: const Radius.circular(24), - _radii.r6: const Radius.circular(32), + _r.radius1: const Radius.circular(4), + _r.radius2: const Radius.circular(8), + _r.radius3: const Radius.circular(12), + _r.radius4: const Radius.circular(16), + _r.radius5: const Radius.circular(24), + _r.radius6: const Radius.circular(32), }; diff --git a/packages/remix/lib/tokens/remix_tokens.dart b/packages/remix/lib/tokens/remix_tokens.dart index cf14334ca..0822094dd 100644 --- a/packages/remix/lib/tokens/remix_tokens.dart +++ b/packages/remix/lib/tokens/remix_tokens.dart @@ -9,7 +9,7 @@ final $rx = _RemixTokenRef(); class _RemixTokenRef { _RemixTokenRef(); - final _color = const RemixColor(); + final _color = RemixColor(); late final accent1 = _color.accent1; late final accent2 = _color.accent2; late final accent3 = _color.accent3; @@ -59,35 +59,35 @@ class _RemixTokenRef { late final neutral11A = _color.neutral11A; late final neutral12A = _color.neutral12A; - final _space = const RemixSpace(); - late final space1 = _space.s1; - late final space2 = _space.s2; - late final space3 = _space.s3; - late final space4 = _space.s4; - late final space5 = _space.s5; - late final space6 = _space.s6; - late final space7 = _space.s7; - late final space8 = _space.s8; - late final space9 = _space.s9; + final _space = RemixSpace(); + late final space1 = _space.space1; + late final space2 = _space.space2; + late final space3 = _space.space3; + late final space4 = _space.space4; + late final space5 = _space.space5; + late final space6 = _space.space6; + late final space7 = _space.space7; + late final space8 = _space.space8; + late final space9 = _space.space9; - final _radius = const RemixRadius(); - late final radius1 = _radius.r1; - late final radius2 = _radius.r2; - late final radius3 = _radius.r3; - late final radius4 = _radius.r4; - late final radius5 = _radius.r5; - late final radius6 = _radius.r6; + final _radius = RemixRadius(); + late final radius1 = _radius.radius1; + late final radius2 = _radius.radius2; + late final radius3 = _radius.radius3; + late final radius4 = _radius.radius4; + late final radius5 = _radius.radius5; + late final radius6 = _radius.radius6; - final _text = const RemixTypography(); - late final text1 = _text.t1; - late final text2 = _text.t2; - late final text3 = _text.t3; - late final text4 = _text.t4; - late final text5 = _text.t5; - late final text6 = _text.t6; - late final text7 = _text.t7; - late final text8 = _text.t8; - late final text9 = _text.t9; + final _text = RemixTypography(); + late final text1 = _text.text1; + late final text2 = _text.text2; + late final text3 = _text.text3; + late final text4 = _text.text4; + late final text5 = _text.text5; + late final text6 = _text.text6; + late final text7 = _text.text7; + late final text8 = _text.text8; + late final text9 = _text.text9; } final _baseRemixTokens = MixThemeData( @@ -96,6 +96,7 @@ final _baseRemixTokens = MixThemeData( spaces: remixSpaceTokens, radii: remixRadiusTokens, ); + final _lightRemixTokens = _baseRemixTokens; final _darkRemixTokens = _baseRemixTokens.copyWith( colors: remixDarkColorTokens, diff --git a/packages/remix/lib/tokens/space_tokens.dart b/packages/remix/lib/tokens/space_tokens.dart index 68721cc85..5e04705c5 100644 --- a/packages/remix/lib/tokens/space_tokens.dart +++ b/packages/remix/lib/tokens/space_tokens.dart @@ -1,38 +1,28 @@ import 'package:mix/mix.dart'; -const _space1 = SpaceToken('space1'); -const _space2 = SpaceToken('space2'); -const _space3 = SpaceToken('space3'); -const _space4 = SpaceToken('space4'); -const _space5 = SpaceToken('space5'); -const _space6 = SpaceToken('space6'); -const _space7 = SpaceToken('space7'); -const _space8 = SpaceToken('space8'); -const _space9 = SpaceToken('space9'); - class RemixSpace { - const RemixSpace(); + RemixSpace(); - final s1 = _space1; - final s2 = _space2; - final s3 = _space3; - final s4 = _space4; - final s5 = _space5; - final s6 = _space6; - final s7 = _space7; - final s8 = _space8; - final s9 = _space9; + final space1 = const SpaceToken('--space-1'); + final space2 = const SpaceToken('--space-2'); + final space3 = const SpaceToken('--space-3'); + final space4 = const SpaceToken('--space-4'); + final space5 = const SpaceToken('--space-5'); + final space6 = const SpaceToken('--space-6'); + final space7 = const SpaceToken('--space-7'); + final space8 = const SpaceToken('--space-8'); + final space9 = const SpaceToken('--space-9'); } -const _radii = RemixSpace(); +final _s = RemixSpace(); final remixSpaceTokens = { - _radii.s1: 4, - _radii.s2: 8, - _radii.s3: 12, - _radii.s4: 16, - _radii.s5: 24, - _radii.s6: 32, - _radii.s7: 40, - _radii.s8: 48, - _radii.s9: 64, + _s.space1: 4, + _s.space2: 8, + _s.space3: 12, + _s.space4: 16, + _s.space5: 24, + _s.space6: 32, + _s.space7: 40, + _s.space8: 48, + _s.space9: 64, }; diff --git a/packages/remix/lib/tokens/text_style_tokens.dart b/packages/remix/lib/tokens/text_style_tokens.dart index fc4ec3a98..90c32f5dd 100644 --- a/packages/remix/lib/tokens/text_style_tokens.dart +++ b/packages/remix/lib/tokens/text_style_tokens.dart @@ -1,80 +1,65 @@ import 'package:flutter/widgets.dart'; import 'package:mix/mix.dart'; -const _text1 = TextStyleToken('text1'); -const _text2 = TextStyleToken('text2'); -const _text3 = TextStyleToken('text3'); -const _text4 = TextStyleToken('text4'); -const _text5 = TextStyleToken('text5'); -const _text6 = TextStyleToken('text6'); -const _text7 = TextStyleToken('text7'); -const _text8 = TextStyleToken('text8'); -const _text9 = TextStyleToken('text9'); - class RemixTypography { - const RemixTypography(); + RemixTypography(); - final t1 = _text1; - final t2 = _text2; - final t3 = _text3; - final t4 = _text4; - final t5 = _text5; - final t6 = _text6; - final t7 = _text7; - final t8 = _text8; - final t9 = _text9; + final text1 = const TextStyleToken('--text-1'); + final text2 = const TextStyleToken('--text-2'); + final text3 = const TextStyleToken('--text-3'); + final text4 = const TextStyleToken('--text-4'); + final text5 = const TextStyleToken('--text-5'); + final text6 = const TextStyleToken('--text-6'); + final text7 = const TextStyleToken('--text-7'); + final text8 = const TextStyleToken('--text-8'); + final text9 = const TextStyleToken('--text-9'); } -const _typography = RemixTypography(); - +final _t = RemixTypography(); final remixTextTokens = { - _typography.t1: const TextStyle( - inherit: false, + _t.text1: const TextStyle( fontSize: 12, letterSpacing: 0.0025, - height: 1.2, + height: 1.33, ), - _typography.t2: const TextStyle( - inherit: false, + _t.text2: const TextStyle( fontSize: 14, letterSpacing: 0, - height: 1.4, + height: 1.43, ), - _typography.t3: const TextStyle( - inherit: false, + _t.text3: const TextStyle( fontSize: 16, letterSpacing: 0, - height: 1.2, + height: 1.50, ), - _typography.t4: const TextStyle( - inherit: false, + _t.text4: const TextStyle( fontSize: 18, letterSpacing: -0.0025, - height: 1.2, + height: 1.44, ), - _typography.t5: const TextStyle( + _t.text5: const TextStyle( fontSize: 20, letterSpacing: -0.005, - height: 1.4, + height: 1.40, ), - _typography.t6: const TextStyle( + _t.text6: const TextStyle( fontSize: 24, letterSpacing: -0.00625, - height: 1.4, + height: 1.25, ), - _typography.t7: const TextStyle( + _t.text7: const TextStyle( fontSize: 28, letterSpacing: -0.0075, - height: 1.4, + height: 1.29, ), - _typography.t8: const TextStyle( + _t.text8: const TextStyle( fontSize: 35, letterSpacing: -0.01, - height: 1.4, + height: 1.14, ), - _typography.t9: const TextStyle( + _t.text9: const TextStyle( fontSize: 60, letterSpacing: -0.025, - height: 1.4, + height: 1.00, ), }; diff --git a/packages/remix/test/components/button_test.dart b/packages/remix/test/components/button_test.dart index c0c69167d..9b12a080e 100644 --- a/packages/remix/test/components/button_test.dart +++ b/packages/remix/test/components/button_test.dart @@ -1,101 +1,96 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/components/button/button.dart'; - void main() { - group('RemixButton', () { - testWidgets('renders with correct label', (WidgetTester tester) async { - const label = 'Test Button'; - await tester.pumpWidget( - MaterialApp( - home: RxButton(label: label, onPressed: () {}), - ), - ); - - expect( - find.byWidgetPredicate( - (widget) => widget is Text && widget.data == label, - ), - findsOneWidget, - ); - }); - - testWidgets('shows loading indicator and label when isLoading is true', - (WidgetTester tester) async { - const loadingLabel = 'Loading...'; - - await tester.pumpWidget( - MaterialApp( - home: RxButton( - label: 'Test Button', - loading: true, - onPressed: () {}, - ), - ), - ); - - expect(find.byType(CircularProgressIndicator), findsOneWidget); - expect(find.text(loadingLabel), findsOneWidget); - }); - - testWidgets('displays correct icons when provided', - (WidgetTester tester) async { - await tester.pumpWidget(MaterialApp( - home: RxButton( - label: 'Test Button', - iconLeft: Icons.arrow_back, - iconRight: Icons.arrow_forward, - onPressed: () {}, - ), - )); - - expect(find.byIcon(Icons.arrow_back), findsOneWidget); - expect(find.byIcon(Icons.arrow_forward), findsOneWidget); - - final HBox iconRow = tester.widget(find.byType(HBox)); - expect(iconRow.children.first, isInstanceOf()); - expect((iconRow.children.first as StyledIcon).icon, Icons.arrow_back); - expect(iconRow.children.last, isInstanceOf()); - expect((iconRow.children.last as StyledIcon).icon, Icons.arrow_forward); - }); - }); - - testWidgets('when disabled must not call onPressed', - (WidgetTester tester) async { - bool didCallOnPressed = false; - - await tester.pumpWidget(MaterialApp( - home: RxButton( - label: 'Disabled Button', - onPressed: () { - didCallOnPressed = true; - }, - disabled: true, - ), - )); - - await tester.tap(find.byType(RxButton)); - await tester.pumpAndSettle(const Duration(milliseconds: 200)); - - expect(didCallOnPressed, false); - }); - - testWidgets('when enabled must call onPressed', (WidgetTester tester) async { - bool didCallOnPressed = false; - - await tester.pumpWidget(MaterialApp( - home: RxButton( - label: 'Disabled Button', - onPressed: () { - didCallOnPressed = true; - }, - ), - )); - - await tester.tap(find.byType(RxButton)); - await tester.pumpAndSettle(const Duration(milliseconds: 200)); - - expect(didCallOnPressed, isTrue); - }); + // group('RemixButton', () { + // testWidgets('renders with correct label', (WidgetTester tester) async { + // const label = 'Test Button'; + // await tester.pumpWidget( + // MaterialApp( + // home: RxButton(label: label, onPressed: () {}), + // ), + // ); + + // expect( + // find.byWidgetPredicate( + // (widget) => widget is Text && widget.data == label, + // ), + // findsOneWidget, + // ); + // }); + + // testWidgets('shows loading indicator and label when isLoading is true', + // (WidgetTester tester) async { + // const loadingLabel = 'Loading...'; + + // await tester.pumpWidget( + // MaterialApp( + // home: RxButton( + // label: 'Test Button', + // loading: true, + // onPressed: () {}, + // ), + // ), + // ); + + // expect(find.byType(CircularProgressIndicator), findsOneWidget); + // expect(find.text(loadingLabel), findsOneWidget); + // }); + + // testWidgets('displays correct icons when provided', + // (WidgetTester tester) async { + // await tester.pumpWidget(MaterialApp( + // home: RxButton( + // label: 'Test Button', + // iconLeft: Icons.arrow_back, + // iconRight: Icons.arrow_forward, + // onPressed: () {}, + // ), + // )); + + // expect(find.byIcon(Icons.arrow_back), findsOneWidget); + // expect(find.byIcon(Icons.arrow_forward), findsOneWidget); + + // final HBox iconRow = tester.widget(find.byType(HBox)); + // expect(iconRow.children.first, isInstanceOf()); + // expect((iconRow.children.first as StyledIcon).icon, Icons.arrow_back); + // expect(iconRow.children.last, isInstanceOf()); + // expect((iconRow.children.last as StyledIcon).icon, Icons.arrow_forward); + // }); + // }); + + // testWidgets('when disabled must not call onPressed', + // (WidgetTester tester) async { + // bool didCallOnPressed = false; + + // await tester.pumpWidget(MaterialApp( + // home: RxButton( + // label: 'Disabled Button', + // onPressed: () { + // didCallOnPressed = true; + // }, + // disabled: true, + // ), + // )); + + // await tester.tap(find.byType(RxButton)); + // await tester.pumpAndSettle(const Duration(milliseconds: 200)); + + // expect(didCallOnPressed, false); + // }); + + // testWidgets('when enabled must call onPressed', (WidgetTester tester) async { + // bool didCallOnPressed = false; + + // await tester.pumpWidget(MaterialApp( + // home: RxButton( + // label: 'Disabled Button', + // onPressed: () { + // didCallOnPressed = true; + // }, + // ), + // )); + + // await tester.tap(find.byType(RxButton)); + // await tester.pumpAndSettle(const Duration(milliseconds: 200)); + + // expect(didCallOnPressed, isTrue); + // }); } From 2da0cb746486e3b02b05c427f0b31629cd6cd37d Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Wed, 3 Jul 2024 09:18:42 -0400 Subject: [PATCH 09/24] Checkbox --- .../remix/demo/lib/components/checkbox.dart | 34 +++ packages/remix/demo/lib/main.dart | 1 + .../remix/demo/lib/main.directories.g.dart | 17 +- .../ephemeral/FlutterInputs.xcfilelist | 235 +++++++++--------- .../remix/lib/components/button/button.dart | 38 +++ .../lib/components/checkbox/checkbox.dart | 63 +++++ .../components/checkbox/checkbox_spec.dart | 23 ++ .../components/checkbox/checkbox_spec.g.dart | 208 ++++++++++++++++ .../components/checkbox/checkbox_style.dart | 63 +++++ .../components/checkbox/checkbox_variant.dart | 32 +++ .../painters/solid_spinner_painter.dart | 40 --- .../remix/lib/components/spinner/spinner.dart | 3 +- .../components/spinner/spinner.variants.dart | 6 +- ...nner_painter.dart => spinner_painter.dart} | 44 +++- packages/remix/lib/remix.dart | 5 + 15 files changed, 649 insertions(+), 163 deletions(-) create mode 100644 packages/remix/demo/lib/components/checkbox.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox_spec.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox_spec.g.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox_style.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox_variant.dart delete mode 100644 packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart rename packages/remix/lib/components/spinner/{painters/dotted_spinner_painter.dart => spinner_painter.dart} (54%) diff --git a/packages/remix/demo/lib/components/checkbox.dart b/packages/remix/demo/lib/components/checkbox.dart new file mode 100644 index 000000000..8c34b2f49 --- /dev/null +++ b/packages/remix/demo/lib/components/checkbox.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'Checkbox Component', + type: RxCheckbox, +) +Widget buildCheckboxUseCase(BuildContext context) { + Widget buildCheckbox(CheckboxVariant variant) { + return RxCheckbox( + label: context.knobs.string( + label: 'Label', + initialValue: 'Checkbox', + ), + value: context.knobs.boolean(label: 'Value', initialValue: true), + onChanged: (value) {}, + size: context.knobs.list( + label: 'Size', + options: CheckboxSize.values, + initialOption: CheckboxSize.medium, + labelBuilder: (value) => value.name.split('.').last, + ), + disabled: context.knobs.boolean(label: 'Disabled', initialValue: false), + ); + } + + return Wrap( + spacing: 12, + runSpacing: 12, + children: CheckboxVariant.values.map(buildCheckbox).toList(), + ); +} diff --git a/packages/remix/demo/lib/main.dart b/packages/remix/demo/lib/main.dart index d20a74a32..6db213484 100644 --- a/packages/remix/demo/lib/main.dart +++ b/packages/remix/demo/lib/main.dart @@ -46,6 +46,7 @@ class HotReload extends StatelessWidget { ); }, ), + InspectorAddon(), ], appBuilder: (context, child) => MaterialApp( debugShowCheckedModeBanner: false, diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index 4ff635236..aefbc8520 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -10,6 +10,7 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:demo/components/button.dart' as _i2; +import 'package:demo/components/checkbox.dart' as _i3; import 'package:widgetbook/widgetbook.dart' as _i1; final directories = <_i1.WidgetbookNode>[ @@ -22,12 +23,24 @@ final directories = <_i1.WidgetbookNode>[ _i1.WidgetbookLeafComponent( name: 'RxButton', useCase: _i1.WidgetbookUseCase( - name: 'interactive playground', + name: 'Button Component', builder: _i2.buildButtonUseCase, ), ) ], - ) + ), + _i1.WidgetbookFolder( + name: 'checkbox', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RxCheckbox', + useCase: _i1.WidgetbookUseCase( + name: 'Checkbox Component', + builder: _i3.buildCheckboxUseCase, + ), + ) + ], + ), ], ) ]; diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index af65198b8..bb1d90e52 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -1,4 +1,4 @@ -/Users/leofarias/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-64.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-67.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/accessibility_tools.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/accessibility_issue.dart @@ -10,8 +10,8 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/minimum_tap_area_checker.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/mixin.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/semantic_label_checker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/analyzer-6.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/args-2.4.2/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/analyzer-6.4.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/args-2.5.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/lib/async.dart /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/lib/src/async_cache.dart @@ -74,12 +74,12 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib/src/visitor.dart /Users/leofarias/.pub-cache/hosted/pub.dev/build-2.4.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/build_config-1.1.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/build_daemon-4.0.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/build_daemon-4.0.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/build_resolvers-2.4.2/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner-2.4.8/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner_core-7.3.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner-2.4.11/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner_core-7.3.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/built_collection-5.1.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/built_value-8.9.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/built_value-8.9.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/characters-1.3.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/characters-1.3.0/lib/characters.dart /Users/leofarias/.pub-cache/hosted/pub.dev/characters-1.3.0/lib/src/characters.dart @@ -123,100 +123,100 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/wrappers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/convert-3.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/crypto-3.0.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/assets/CupertinoIcons.ttf +/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/assets/CupertinoIcons.ttf /Users/leofarias/.pub-cache/hosted/pub.dev/dart_style-2.3.6/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/device_frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/oneplus_8_pro/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/oneplus_8_pro/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/oneplus_8_pro/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_a50/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_a50/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_a50/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20_ultra/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20_ultra/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20_ultra/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_s20/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_s20/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_s20/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/sony_xperia_1_ii/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/sony_xperia_1_ii/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/sony_xperia_1_ii/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/base/draw_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/desktop_monitor/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/desktop_monitor/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/laptop/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/laptop/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/phone/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/phone/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/tablet/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/tablet/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_air_4/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_air_4/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_air_4/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_11inches/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_11inches/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_11inches/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_mini/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_mini/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_mini/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_pro_max/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_pro_max/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_pro_max/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_mini/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_mini/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_mini/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_pro_max/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_pro_max/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_pro_max/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_se/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_se/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_se/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/linux/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/macos/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/macos/macbook_pro/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/macos/macbook_pro/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/windows/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/device_type.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/identifier.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/info.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/info.freezed.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/keyboard/button.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/keyboard/virtual_keyboard.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/theme.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/theme.freezed.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/device_frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/oneplus_8_pro/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/oneplus_8_pro/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/oneplus_8_pro/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_a50/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_a50/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_a50/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20_ultra/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20_ultra/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20_ultra/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_s20/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_s20/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_s20/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/sony_xperia_1_ii/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/sony_xperia_1_ii/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/sony_xperia_1_ii/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/base/draw_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/desktop_monitor/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/desktop_monitor/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/laptop/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/laptop/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/phone/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/phone/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/tablet/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/tablet/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_air_4/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_air_4/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_air_4/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_11inches/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_11inches/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_11inches/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_mini/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_mini/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_mini/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_pro_max/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_pro_max/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_pro_max/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_mini/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_mini/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_mini/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_pro_max/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_pro_max/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_pro_max/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_se/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_se/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_se/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/linux/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/macos/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/macos/macbook_pro/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/macos/macbook_pro/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/windows/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/device_type.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/identifier.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/info.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/info.freezed.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/keyboard/button.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/keyboard/virtual_keyboard.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/theme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/theme.freezed.dart /Users/leofarias/.pub-cache/hosted/pub.dev/fake_async-1.3.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/fake_async-1.3.1/lib/fake_async.dart /Users/leofarias/.pub-cache/hosted/pub.dev/file-7.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/fixnum-1.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/flutter_lints-2.0.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.1/lib/freezed_annotation.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.1/lib/freezed_annotation.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.2/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.2/lib/freezed_annotation.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.2/lib/freezed_annotation.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/frontend_server_client-4.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/glob-2.1.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/graphs-2.3.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/http_multi_server-3.2.1/LICENSE @@ -239,19 +239,19 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/inspector-2.1.0/lib/src/widgets/panel/inspector_panel.dart /Users/leofarias/.pub-cache/hosted/pub.dev/inspector-2.1.0/lib/src/widgets/zoom/zoom_overlay.dart /Users/leofarias/.pub-cache/hosted/pub.dev/io-1.0.4/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/js-0.6.7/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/json_annotation.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/allowed_keys_helpers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/checked_helpers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/enum_helpers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_converter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_enum.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_key.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_literal.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_serializable.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_serializable.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/src/json_value.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/js-0.7.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/json_annotation.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/allowed_keys_helpers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/checked_helpers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/enum_helpers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_converter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_enum.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_key.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_literal.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_serializable.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_serializable.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_value.dart /Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/leak_tracker.dart /Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/_protocol.dart @@ -368,7 +368,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/lib/meta.dart /Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/lib/meta_meta.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.4/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.5/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart /Users/leofarias/.pub-cache/hosted/pub.dev/package_config-2.1.0/LICENSE @@ -388,7 +388,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/pool-1.5.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/pubspec_parse-1.2.3/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/pubspec_parse-1.3.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/lib/resizable_widget.dart /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/lib/src/resizable_widget.dart @@ -401,7 +401,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/lib/src/separator_controller.dart /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/lib/src/widget_size_info.dart /Users/leofarias/.pub-cache/hosted/pub.dev/shelf-1.4.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/shelf_web_socket-2.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/source_gen-1.5.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/source_span.dart @@ -529,7 +529,9 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/vm_service.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/vm_service_io.dart /Users/leofarias/.pub-cache/hosted/pub.dev/watcher-1.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/web-0.5.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket-0.1.5/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-3.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/assets/fonts/Poppins/Poppins-Black.ttf /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/assets/fonts/Poppins/Poppins-BlackItalic.ttf @@ -850,6 +852,7 @@ /Users/leofarias/Projects/mix/packages/remix/LICENSE /Users/leofarias/Projects/mix/packages/remix/demo/lib/addons/icon_data_knob.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/button.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/checkbox.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.directories.g.dart /Users/leofarias/Projects/mix/packages/remix/demo/pubspec.yaml @@ -858,11 +861,15 @@ /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.g.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_variant.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.style.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_painter.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/color_palette.dart diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button.dart index 405d2c62b..dd86ea746 100644 --- a/packages/remix/lib/components/button/button.dart +++ b/packages/remix/lib/components/button/button.dart @@ -4,6 +4,20 @@ import 'package:remix/components/button/button.style.dart'; import 'package:remix/components/button/button.variants.dart'; import 'package:remix/components/button/button_spec.dart'; +/// A customizable button component with various styling options. +/// +/// The [RxButton] allows you to create buttons with different variants, sizes, +/// and icons. You can also disable the button or show a loading state. +/// +/// Example usage: +/// +/// ```dart +/// RxButton( +/// label: 'Click me', +/// onPressed: () {}, +/// iconLeft: Icons.add, +/// ) +/// ``` class RxButton extends StatelessWidget { const RxButton({ super.key, @@ -18,16 +32,40 @@ class RxButton extends StatelessWidget { this.style, }); + /// The text label displayed on the button. final String label; + + /// Whether the button is disabled. + /// + /// When disabled, the button will not respond to user interactions. final bool disabled; + + /// Whether the button is in a loading state. + /// + /// When loading, the button will display a loading indicator and + /// will not respond to user interactions. final bool loading; + /// An optional icon to display on the left side of the label. final IconData? iconLeft; + + /// An optional icon to display on the right side of the label. final IconData? iconRight; + + /// The button variant. final ButtonVariant type; + + /// The button size. final ButtonSize size; + + /// The callback function called when the button is pressed. + /// + /// This callback will not be called if the button is disabled or in a loading state. final VoidCallback? onPressed; + /// Additional custom styling for the button. + /// + /// This allows you to override or extend the default button styling. final Style? style; bool get _hasIcon => iconLeft != null || iconRight != null; diff --git a/packages/remix/lib/components/checkbox/checkbox.dart b/packages/remix/lib/components/checkbox/checkbox.dart new file mode 100644 index 000000000..4ff145611 --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/checkbox/checkbox_spec.dart'; +import 'package:remix/components/checkbox/checkbox_style.dart'; +import 'package:remix/components/checkbox/checkbox_variant.dart'; + +class RxCheckbox extends StatelessWidget { + const RxCheckbox({ + super.key, + this.disabled = false, + this.value = false, + this.onChanged, + this.iconChecked = Icons.check_rounded, + this.iconUnchecked, + this.style, + this.size = CheckboxSize.medium, + this.variant = CheckboxVariant.solid, + }); + + final bool disabled; + final bool value; + final IconData iconChecked; + final IconData? iconUnchecked; + final ValueChanged? onChanged; + + /// Additional custom styling for the button. + /// + /// This allows you to override or extend the default button styling. + final Style? style; + + final CheckboxSize size; + final CheckboxVariant variant; + + void _handleOnPress() => onChanged?.call(!value); + + Style _buildStyle() { + return buildDefaultCheckboxStyle() + .merge(style) + .applyVariants([size, variant]).animate(); + } + + @override + Widget build(BuildContext context) { + return Pressable( + onPress: disabled ? null : _handleOnPress, + child: SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spec = CheckboxSpec.of(context); + + final ContainerWidget = spec.container; + final IconWidget = spec.icon; + + return ContainerWidget( + child: IconWidget( + value ? iconChecked : iconUnchecked, + ), + ); + }, + ), + ); + } +} diff --git a/packages/remix/lib/components/checkbox/checkbox_spec.dart b/packages/remix/lib/components/checkbox/checkbox_spec.dart new file mode 100644 index 000000000..d52085d0a --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox_spec.dart @@ -0,0 +1,23 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'checkbox_spec.g.dart'; + +@MixableSpec() +base class CheckboxSpec extends Spec with _$CheckboxSpec { + final BoxSpec container; + final IconSpec icon; + + /// {@macro button_spec_of} + static const of = _$CheckboxSpec.of; + + static const from = _$CheckboxSpec.from; + + const CheckboxSpec({ + BoxSpec? container, + IconSpec? icon, + super.animated, + }) : container = container ?? const BoxSpec(), + icon = icon ?? const IconSpec(); +} diff --git a/packages/remix/lib/components/checkbox/checkbox_spec.g.dart b/packages/remix/lib/components/checkbox/checkbox_spec.g.dart new file mode 100644 index 000000000..4374a3e1e --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox_spec.g.dart @@ -0,0 +1,208 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'checkbox_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$CheckboxSpec on Spec { + static CheckboxSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const CheckboxSpec(); + } + + /// {@template checkbox_spec_of} + /// Retrieves the [CheckboxSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [CheckboxSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [CheckboxSpec]. + /// + /// Example: + /// + /// ```dart + /// final checkboxSpec = CheckboxSpec.of(context); + /// ``` + /// {@endtemplate} + static CheckboxSpec of(BuildContext context) { + return _$CheckboxSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [CheckboxSpec] but with the given fields + /// replaced with the new values. + @override + CheckboxSpec copyWith({ + BoxSpec? container, + IconSpec? icon, + AnimatedData? animated, + }) { + return CheckboxSpec( + container: container ?? _$this.container, + icon: icon ?? _$this.icon, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [CheckboxSpec] and another [CheckboxSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [CheckboxSpec] is returned. When [t] is 1.0, the [other] [CheckboxSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [CheckboxSpec] is returned. + /// + /// If [other] is null, this method returns the current [CheckboxSpec] instance. + /// + /// The interpolation is performed on each property of the [CheckboxSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container]. + /// - [IconSpec.lerp] for [icon]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [CheckboxSpec] is used. Otherwise, the value + /// from the [other] [CheckboxSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [CheckboxSpec] configurations. + @override + CheckboxSpec lerp(CheckboxSpec? other, double t) { + if (other == null) return _$this; + + return CheckboxSpec( + container: _$this.container.lerp(other.container, t), + icon: _$this.icon.lerp(other.icon, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [CheckboxSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [CheckboxSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.icon, + _$this.animated, + ]; + + CheckboxSpec get _$this => this as CheckboxSpec; +} + +/// Represents the attributes of a [CheckboxSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [CheckboxSpec]. +/// +/// Use this class to configure the attributes of a [CheckboxSpec] and pass it to +/// the [CheckboxSpec] constructor. +final class CheckboxSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final IconSpecAttribute? icon; + + const CheckboxSpecAttribute({ + this.container, + this.icon, + super.animated, + }); + + /// Resolves to [CheckboxSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final checkboxSpec = CheckboxSpecAttribute(...).resolve(mix); + /// ``` + @override + CheckboxSpec resolve(MixData mix) { + return CheckboxSpec( + container: container?.resolve(mix), + icon: icon?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [CheckboxSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [CheckboxSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + CheckboxSpecAttribute merge(covariant CheckboxSpecAttribute? other) { + if (other == null) return this; + + return CheckboxSpecAttribute( + container: container?.merge(other.container) ?? other.container, + icon: icon?.merge(other.icon) ?? other.icon, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [CheckboxSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [CheckboxSpecAttribute] instances for equality. + @override + List get props => [ + container, + icon, + animated, + ]; +} + +/// Utility class for configuring [CheckboxSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [CheckboxSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [CheckboxSpecAttribute]. +base class CheckboxSpecUtility + extends SpecUtility { + /// Utility for defining [CheckboxSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [CheckboxSpecAttribute.icon] + late final icon = IconSpecUtility((v) => only(icon: v)); + + /// Utility for defining [CheckboxSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + CheckboxSpecUtility(super.builder); + + static final self = CheckboxSpecUtility((v) => v); + + /// Returns a new [CheckboxSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + IconSpecAttribute? icon, + AnimatedDataDto? animated, + }) { + return builder(CheckboxSpecAttribute( + container: container, + icon: icon, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [CheckboxSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [CheckboxSpec] specifications. +class CheckboxSpecTween extends Tween { + CheckboxSpecTween({ + super.begin, + super.end, + }); + + @override + CheckboxSpec lerp(double t) { + if (begin == null && end == null) return const CheckboxSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart new file mode 100644 index 000000000..d9751546c --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -0,0 +1,63 @@ +// ignore_for_file: camel_case_types + +import 'package:mix/mix.dart'; +import 'package:remix/components/checkbox/checkbox_spec.dart'; +import 'package:remix/components/checkbox/checkbox_variant.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _checkbox = CheckboxSpecUtility.self; +final _container = _checkbox.container; +final _icon = _checkbox.icon; + +Style get _baseStyle => Style( + _container.borderRadius(4), + _icon.color($rx.neutral1()), + ); + +Style get _solidVariant => Style( + _container.color($rx.accent9()), + _icon.color($rx.neutral1()), + $on.hover( + _container.color($rx.accent12()), + ), + ); + +final _disabledVariant = Style( + _container.color($rx.neutral3A()), + _container.border.color($rx.neutral5A()), + _icon.color($rx.neutral7A()), +); + +final _smallVariant = Style( + _container.width(16), + _container.height(16), + _icon.size(12), +); + +final _mediumVariant = Style( + _container.width(20), + _container.height(20), + _icon.size(16), +); + +final _largeVariant = Style( + // _container.size(24), + _container.width(24), + _container.height(24), + _icon.size(20), +); + +Style buildDefaultCheckboxStyle() { + return Style( + _baseStyle(), + + /// Size Variants + CheckboxSize.small(_smallVariant()), + CheckboxSize.medium(_mediumVariant()), + CheckboxSize.large(_largeVariant()), + + // State variants + CheckboxVariant.solid(_solidVariant()), + $on.disabled(_disabledVariant()), + ); +} diff --git a/packages/remix/lib/components/checkbox/checkbox_variant.dart b/packages/remix/lib/components/checkbox/checkbox_variant.dart new file mode 100644 index 000000000..be6228440 --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox_variant.dart @@ -0,0 +1,32 @@ +import 'package:mix/mix.dart'; + +abstract interface class ICheckboxVariant extends Variant { + const ICheckboxVariant(super.name); +} + +class CheckboxState extends ICheckboxVariant { + const CheckboxState._(super.name); + + static const checked = CheckboxState._('remix.checkbox.checked'); + static const unchecked = CheckboxState._('remix.checkbox.unchecked'); +} + +class CheckboxVariant extends ICheckboxVariant { + const CheckboxVariant(super.name); + + static const solid = CheckboxVariant('remix.checkbox.solid'); + static const outline = CheckboxVariant('remix.checkbox.outline'); + static const surface = CheckboxVariant('remix.checkbox.surface'); + + static List get values => [solid, outline, surface]; +} + +class CheckboxSize extends ICheckboxVariant { + const CheckboxSize(super.name); + + static const small = CheckboxSize('remix.checkbox.small'); + static const medium = CheckboxSize('remix.checkbox.medium'); + static const large = CheckboxSize('remix.checkbox.large'); + + static List get values => [small, medium, large]; +} diff --git a/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart b/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart deleted file mode 100644 index adc546b6f..000000000 --- a/packages/remix/lib/components/spinner/painters/solid_spinner_painter.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:remix/components/spinner/spinner_spec.dart'; - -class SolidSpinnerPainter extends CustomPainter { - final Animation? animation; - final SpinnerSpec spec; - - SolidSpinnerPainter({ - this.animation, - required this.spec, - }) : super(repaint: animation); - - @override - void paint(Canvas canvas, Size size) { - final specStrokeWidth = spec.strokeWidth ?? 1; - final paint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 2 * specStrokeWidth - ..color = spec.color; - - canvas.translate(size.width / 2, size.height / 2); - - final radius = min(size.width, size.height) / 2 - paint.strokeWidth; - const startAngle = pi / 3; - const sweepAngle = 2 * pi / 3; - - canvas.drawArc( - Rect.fromCircle(center: Offset.zero, radius: radius), - startAngle + animation!.value * 2 * pi, - sweepAngle, - false, - paint, - ); - } - - @override - bool shouldRepaint(SolidSpinnerPainter oldDelegate) => true; -} diff --git a/packages/remix/lib/components/spinner/spinner.dart b/packages/remix/lib/components/spinner/spinner.dart index 5e26b80c2..5f2d86c6e 100644 --- a/packages/remix/lib/components/spinner/spinner.dart +++ b/packages/remix/lib/components/spinner/spinner.dart @@ -2,10 +2,9 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/spinner/painters/dotted_spinner_painter.dart'; -import 'package:remix/components/spinner/painters/solid_spinner_painter.dart'; import 'package:remix/components/spinner/spinner.style.dart'; import 'package:remix/components/spinner/spinner.variants.dart'; +import 'package:remix/components/spinner/spinner_painter.dart'; import 'package:remix/components/spinner/spinner_spec.dart'; class RXSpinner extends StatelessWidget { diff --git a/packages/remix/lib/components/spinner/spinner.variants.dart b/packages/remix/lib/components/spinner/spinner.variants.dart index 6e3d990c2..b4f8fc40a 100644 --- a/packages/remix/lib/components/spinner/spinner.variants.dart +++ b/packages/remix/lib/components/spinner/spinner.variants.dart @@ -1,10 +1,10 @@ import 'package:mix/mix.dart'; -class SpinnerVariant extends Variant { - const SpinnerVariant(super.name); +interface class ISpinnerVariant extends Variant { + const ISpinnerVariant(super.name); } -class SpinnerSize extends SpinnerVariant { +class SpinnerSize extends ISpinnerVariant { const SpinnerSize(super.name); static const xsmall = SpinnerSize('remix.spinner.xsmall'); diff --git a/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart b/packages/remix/lib/components/spinner/spinner_painter.dart similarity index 54% rename from packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart rename to packages/remix/lib/components/spinner/spinner_painter.dart index 1bbb1572c..29a35b116 100644 --- a/packages/remix/lib/components/spinner/painters/dotted_spinner_painter.dart +++ b/packages/remix/lib/components/spinner/spinner_painter.dart @@ -3,14 +3,21 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:remix/components/spinner/spinner_spec.dart'; -class DottedSpinnerPainter extends CustomPainter { +abstract interface class SpinnerPainter extends CustomPainter { final Animation? animation; final SpinnerSpec spec; - DottedSpinnerPainter({ + SpinnerPainter({ this.animation, required this.spec, }) : super(repaint: animation); +} + +class DottedSpinnerPainter extends SpinnerPainter { + DottedSpinnerPainter({ + super.animation, + required super.spec, + }); @override void paint(Canvas canvas, Size size) { @@ -45,3 +52,36 @@ class DottedSpinnerPainter extends CustomPainter { @override bool shouldRepaint(DottedSpinnerPainter oldDelegate) => true; } + +class SolidSpinnerPainter extends SpinnerPainter { + SolidSpinnerPainter({ + super.animation, + required super.spec, + }); + + @override + void paint(Canvas canvas, Size size) { + final specStrokeWidth = spec.strokeWidth ?? 1; + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 2 * specStrokeWidth + ..color = spec.color; + + canvas.translate(size.width / 2, size.height / 2); + + final radius = min(size.width, size.height) / 2 - paint.strokeWidth; + const startAngle = pi / 3; + const sweepAngle = 2 * pi / 3; + + canvas.drawArc( + Rect.fromCircle(center: Offset.zero, radius: radius), + startAngle + animation!.value * 2 * pi, + sweepAngle, + false, + paint, + ); + } + + @override + bool shouldRepaint(SolidSpinnerPainter oldDelegate) => true; +} diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index 0a97203b7..9d95130d1 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -3,4 +3,9 @@ library remix; export 'components/button/button.dart'; export 'components/button/button.style.dart'; export 'components/button/button.variants.dart'; +export 'components/button/button_spec.dart'; +export 'components/checkbox/checkbox.dart'; +export 'components/checkbox/checkbox_spec.dart'; +export 'components/checkbox/checkbox_style.dart'; +export 'components/checkbox/checkbox_variant.dart'; export 'tokens/remix_tokens.dart'; From 2f523b4346aa2d5d6b5fee80dab10147586ef816 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Sun, 7 Jul 2024 14:22:10 -0400 Subject: [PATCH 10/24] Linting fixes --- examples/themed_button/lib/styles/orbit.dart | 36 +++++++------ .../themed_button/lib/styles/schadcn.dart | 9 ++-- examples/themed_button/lib/styles/tokens.dart | 48 +++++++++-------- .../todo_list/lib/pages/add_task_page.dart | 10 ++-- .../todo_list/lib/pages/todo_list_page.dart | 11 ++-- .../lib/style/components/button.dart | 9 ++-- .../lib/style/components/checkbox.dart | 10 ++-- .../lib/style/components/icon_button.dart | 8 +-- .../lib/style/components/list_tile.dart | 9 ++-- .../todo_list/lib/style/design_tokens.dart | 52 ++++++++++--------- .../todo_list/lib/style/patterns/outline.dart | 4 +- .../attributes/text_style/text_style_dto.dart | 2 + .../src/theme/tokens/text_style_token.dart | 6 +-- .../theme/tokens/text_style_token_test.dart | 21 ++++---- .../remix/demo/lib/components/checkbox.dart | 4 -- packages/remix/lib/helpers/color_palette.dart | 26 ++++++++-- 16 files changed, 154 insertions(+), 111 deletions(-) diff --git a/examples/themed_button/lib/styles/orbit.dart b/examples/themed_button/lib/styles/orbit.dart index 15c9e4737..6d55f3e46 100644 --- a/examples/themed_button/lib/styles/orbit.dart +++ b/examples/themed_button/lib/styles/orbit.dart @@ -2,36 +2,40 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:themed_button/styles/tokens.dart'; +final _color = ColorTokens(); +final _radius = RadiusTokens(); +final _space = SpaceTokens(); +final _textStyle = TextStyleTokens(); final orbitTheme = MixThemeData( colors: { - $token.color.primary: const Color(0xff00A58E), - $token.color.primaryHover: const Color(0xFF009580), - $token.color.onPrimary: Colors.white, + _color.primary: const Color(0xff00A58E), + _color.primaryHover: const Color(0xFF009580), + _color.onPrimary: Colors.white, }, radii: { - $token.radius.small: const Radius.circular(4), - $token.radius.normal: const Radius.circular(6), - $token.radius.large: const Radius.circular(12), - $token.radius.full: const Radius.circular(9999), + _radius.small: const Radius.circular(4), + _radius.normal: const Radius.circular(6), + _radius.large: const Radius.circular(12), + _radius.full: const Radius.circular(9999), }, spaces: { - $token.space.xxxsmall: 4, - $token.space.xxsmall: 8, - $token.space.xsmall: 12, - $token.space.small: 16, - $token.space.medium: 24, - $token.space.large: 32, + _space.xxxsmall: 4, + _space.xxsmall: 8, + _space.xsmall: 12, + _space.small: 16, + _space.medium: 24, + _space.large: 32, }, textStyles: { - $token.textStyle.small: const TextStyle( + _textStyle.small: const TextStyle( fontSize: 12, fontWeight: FontWeight.normal, ), - $token.textStyle.normal: const TextStyle( + _textStyle.normal: const TextStyle( fontSize: 14, fontWeight: FontWeight.normal, ), - $token.textStyle.large: const TextStyle( + _textStyle.large: const TextStyle( fontSize: 16, fontWeight: FontWeight.normal, ) diff --git a/examples/themed_button/lib/styles/schadcn.dart b/examples/themed_button/lib/styles/schadcn.dart index eb323d724..4ecc53433 100644 --- a/examples/themed_button/lib/styles/schadcn.dart +++ b/examples/themed_button/lib/styles/schadcn.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; import 'package:themed_button/styles/orbit.dart'; import 'package:themed_button/styles/tokens.dart'; +final _color = ColorTokens(); + final shadcnTheme = orbitTheme.copyWith( colors: { - $token.color.primary: Colors.black, - $token.color.primaryHover: const Color.fromARGB(255, 66, 66, 66), - $token.color.onPrimary: Colors.white, + _color.primary: Colors.black, + _color.primaryHover: const Color.fromARGB(255, 66, 66, 66), + _color.onPrimary: Colors.white, }, ); diff --git a/examples/themed_button/lib/styles/tokens.dart b/examples/themed_button/lib/styles/tokens.dart index ee50df299..48b7055a1 100644 --- a/examples/themed_button/lib/styles/tokens.dart +++ b/examples/themed_button/lib/styles/tokens.dart @@ -1,32 +1,34 @@ import 'package:mix/mix.dart'; -extension ColorExt on ColorTokenUtil { - ColorToken get primary => const ColorToken('primary'); - ColorToken get primaryHover => const ColorToken('primary.hover'); - ColorToken get onPrimary => const ColorToken('on.primary'); - // ColorToken get secondary => const ColorToken('secondary'); - // ColorToken get onSecondary => const ColorToken('on.secondary'); - // ColorToken get outline => const ColorToken('outline'); +class ColorTokens { + final ColorToken primary = const ColorToken('primary'); + final ColorToken primaryHover = const ColorToken('primary.hover'); + final ColorToken onPrimary = const ColorToken('on.primary'); + // final ColorToken secondary = const ColorToken('secondary'); + // final ColorToken onSecondary = const ColorToken('on.secondary'); + // final ColorToken outline = const ColorToken('outline'); } -extension RadiusExt on RadiusTokenUtil { - RadiusToken get small => const RadiusToken('radius.small'); - RadiusToken get normal => const RadiusToken('radius.normal'); - RadiusToken get large => const RadiusToken('radius.large'); - RadiusToken get full => const RadiusToken('radius.full'); +class RadiusTokens { + final RadiusToken small = const RadiusToken('radius.small'); + final RadiusToken normal = const RadiusToken('radius.normal'); + final RadiusToken large = const RadiusToken('radius.large'); + final RadiusToken full = const RadiusToken('radius.full'); } -extension SpacingExt on SpaceTokenUtil { - SpaceToken get xxxsmall => const SpaceToken('space.xxxsmall'); - SpaceToken get xxsmall => const SpaceToken('space.xxsmall'); - SpaceToken get xsmall => const SpaceToken('space.xsmall'); - SpaceToken get small => const SpaceToken('space.small'); - SpaceToken get medium => const SpaceToken('space.medium'); +class SpaceTokens { + final SpaceToken xxxsmall = const SpaceToken('space.xxxsmall'); + final SpaceToken xxsmall = const SpaceToken('space.xxsmall'); + final SpaceToken xsmall = const SpaceToken('space.xsmall'); + final SpaceToken small = const SpaceToken('space.small'); + final SpaceToken medium = const SpaceToken('space.medium'); + final SpaceToken large = const SpaceToken('space.large'); } -extension TextStyleExt on TextStyleTokenUtil { - TextStyleToken get small => const TextStyleToken('textstyle.small'); - TextStyleToken get normal => const TextStyleToken('textstyle.normall'); - TextStyleToken get large => const TextStyleToken('textstyle.large'); - TextStyleToken get extraLarge => const TextStyleToken('textstyle.extraLarge'); +class TextStyleTokens { + final TextStyleToken small = const TextStyleToken('textstyle.small'); + final TextStyleToken normal = const TextStyleToken('textstyle.normall'); + final TextStyleToken large = const TextStyleToken('textstyle.large'); + final TextStyleToken extraLarge = + const TextStyleToken('textstyle.extraLarge'); } diff --git a/examples/todo_list/lib/pages/add_task_page.dart b/examples/todo_list/lib/pages/add_task_page.dart index 4db6378c6..524aee361 100644 --- a/examples/todo_list/lib/pages/add_task_page.dart +++ b/examples/todo_list/lib/pages/add_task_page.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; import 'package:todo_list/model/task.dart'; import 'package:todo_list/pages/controller/task_controller.dart'; import 'package:todo_list/style/design_tokens.dart'; import '../style/components/button.dart'; +const _colors = ColorTokens(); +const _textStyles = TextStyleTokens(); + class AddTaskPage extends StatefulWidget { const AddTaskPage({super.key, required this.controller}); @@ -22,12 +24,12 @@ class _AddTaskPageState extends State { Widget build(BuildContext context) { return Material( child: Scaffold( - backgroundColor: $token.color.surface.resolve(context), + backgroundColor: _colors.surface.resolve(context), appBar: AppBar( - backgroundColor: $token.color.surface.resolve(context), + backgroundColor: _colors.surface.resolve(context), title: Text( 'Create Task', - style: $token.textStyle.heading2.resolve(context), + style: _textStyles.heading2.resolve(context), ), ), body: Padding( diff --git a/examples/todo_list/lib/pages/todo_list_page.dart b/examples/todo_list/lib/pages/todo_list_page.dart index 633f76ca7..04219081d 100644 --- a/examples/todo_list/lib/pages/todo_list_page.dart +++ b/examples/todo_list/lib/pages/todo_list_page.dart @@ -6,6 +6,9 @@ import 'package:todo_list/style/components/icon_button.dart'; import 'package:todo_list/style/components/list_tile.dart'; import 'package:todo_list/style/design_tokens.dart'; +const _colors = ColorTokens(); +const _textStyles = TextStyleTokens(); + class TodoListPage extends StatefulWidget { const TodoListPage({super.key}); @@ -19,13 +22,13 @@ class _TodoListPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: $token.color.surface.resolve(context), + backgroundColor: _colors.surface.resolve(context), appBar: AppBar( - backgroundColor: $token.color.surface.resolve(context), + backgroundColor: _colors.surface.resolve(context), title: StyledText( 'To Do List', style: Style( - $text.style.ref($token.textStyle.heading2), + $text.style.ref(_textStyles.heading2), ), ), ), @@ -39,7 +42,7 @@ class _TodoListPageState extends State { if (index == 0) { return Text( 'Today', - style: $token.textStyle.heading1.resolve(context), + style: _textStyles.heading1.resolve(context), ); } final item = value[index - 1]; diff --git a/examples/todo_list/lib/style/components/button.dart b/examples/todo_list/lib/style/components/button.dart index 57b4ac45c..0e290f31d 100644 --- a/examples/todo_list/lib/style/components/button.dart +++ b/examples/todo_list/lib/style/components/button.dart @@ -4,6 +4,9 @@ import 'package:todo_list/style/design_tokens.dart'; import '../patterns/scale_effect.dart'; +const _colors = ColorTokens(); +const _textStyles = TextStyleTokens(); + class TodoButton extends StatelessWidget { final String text; final VoidCallback? onPressed; @@ -19,7 +22,7 @@ class TodoButton extends StatelessWidget { return PressableBox( onPress: onPressed, style: Style( - $box.color.ref($token.color.primary), + $box.color.ref(_colors.primary), $box.height(50), $box.borderRadius(6), scaleEffect(), @@ -29,8 +32,8 @@ class TodoButton extends StatelessWidget { child: StyledText( text, style: Style( - $text.style.color.ref($token.color.surface), - $text.style.ref($token.textStyle.heading3), + $text.style.color.ref(_colors.surface), + $text.style.ref(_textStyles.heading3), $text.style.bold(), $with.scale(1), $with.align(alignment: Alignment.center), diff --git a/examples/todo_list/lib/style/components/checkbox.dart b/examples/todo_list/lib/style/components/checkbox.dart index d3c47fc54..591ca2b4f 100644 --- a/examples/todo_list/lib/style/components/checkbox.dart +++ b/examples/todo_list/lib/style/components/checkbox.dart @@ -4,6 +4,8 @@ import 'package:todo_list/style/design_tokens.dart'; import 'package:todo_list/style/patterns/outline.dart'; import 'package:todo_list/style/patterns/scale_effect.dart'; +const _colors = ColorTokens(); + class _CheckboxVariant { static const checked = Variant("checked"); static const unchecked = Variant("unchecked"); @@ -26,13 +28,13 @@ class TodoCheckbox extends StatelessWidget { style: Style( $box.height(20), $box.width(20), - $box.color.ref($token.color.surface), + $box.color.ref(_colors.surface), $box.borderRadius(3), scaleEffect(), outlinePattern(), _CheckboxVariant.checked( - $box.color.ref($token.color.primary), - $box.border.color.ref($token.color.primary), + $box.color.ref(_colors.primary), + $box.border.color.ref(_colors.primary), ), ) .applyVariant( @@ -45,7 +47,7 @@ class TodoCheckbox extends StatelessWidget { Icons.check, style: Style( $icon.weight(16), - $icon.color.ref($token.color.surface), + $icon.color.ref(_colors.surface), $with.opacity(0), $with.padding.top(5), _CheckboxVariant.checked( diff --git a/examples/todo_list/lib/style/components/icon_button.dart b/examples/todo_list/lib/style/components/icon_button.dart index 4bc1fa96a..70444af82 100644 --- a/examples/todo_list/lib/style/components/icon_button.dart +++ b/examples/todo_list/lib/style/components/icon_button.dart @@ -5,6 +5,8 @@ import 'package:todo_list/style/design_tokens.dart'; import '../patterns/outline.dart'; import '../patterns/scale_effect.dart'; +const _colors = ColorTokens(); + class TodoIconButton extends StatelessWidget { final IconData icon; final VoidCallback? onPressed; @@ -20,16 +22,16 @@ class TodoIconButton extends StatelessWidget { return PressableBox( onPress: onPressed, style: Style( - $box.color.ref($token.color.surface), + $box.color.ref(_colors.surface), $box.height(50), $box.width(50), $box.borderRadius(4), scaleEffect(), - $icon.color.ref($token.color.primary), + $icon.color.ref(_colors.primary), $icon.weight(20), outlinePattern(), $on.press( - $box.color.ref($token.color.surfaceContainer), + $box.color.ref(_colors.surfaceContainer), ), ).animate( duration: const Duration(milliseconds: 150), diff --git a/examples/todo_list/lib/style/components/list_tile.dart b/examples/todo_list/lib/style/components/list_tile.dart index 8c86054ad..51b5b6683 100644 --- a/examples/todo_list/lib/style/components/list_tile.dart +++ b/examples/todo_list/lib/style/components/list_tile.dart @@ -4,6 +4,9 @@ import 'package:todo_list/style/components/checkbox.dart'; import 'package:todo_list/style/design_tokens.dart'; import 'package:todo_list/style/patterns/scale_effect.dart'; +const _colors = ColorTokens(); +const _textStyles = TextStyleTokens(); + class CheckboxTileVariant { static const checked = Variant("checked"); static const unchecked = Variant("unchecked"); @@ -38,11 +41,11 @@ class TodoCheckboxListTile extends StatelessWidget { StyledText( text, style: Style( - $text.style.ref($token.textStyle.heading3), - $text.style.color.ref($token.color.onSurface), + $text.style.ref(_textStyles.heading3), + $text.style.color.ref(_colors.onSurface), CheckboxTileVariant.checked( $text.style.decoration.lineThrough(), - $text.style.color.ref($token.color.onSurfaceVariant), + $text.style.color.ref(_colors.onSurfaceVariant), ), ) .applyVariant( diff --git a/examples/todo_list/lib/style/design_tokens.dart b/examples/todo_list/lib/style/design_tokens.dart index e0d72c9bc..4b4e887df 100644 --- a/examples/todo_list/lib/style/design_tokens.dart +++ b/examples/todo_list/lib/style/design_tokens.dart @@ -2,49 +2,53 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:mix/mix.dart'; +const _color = ColorTokens(); +const _textStyle = TextStyleTokens(); final lightTheme = MixThemeData( colors: { - $token.color.surface: Colors.white, - $token.color.onSurface: const Color(0xFF141217), - $token.color.onSurfaceVariant: const Color.fromARGB(255, 74, 70, 81), - $token.color.surfaceContainer: const Color(0xFFE0DBE5), - $token.color.outline: const Color(0xFFE0DBE5), - $token.color.primary: const Color(0xFF7326E0), - $token.color.onPrimary: Colors.white, + _color.surface: Colors.white, + _color.onSurface: const Color(0xFF141217), + _color.onSurfaceVariant: const Color.fromARGB(255, 74, 70, 81), + _color.surfaceContainer: const Color(0xFFE0DBE5), + _color.outline: const Color(0xFFE0DBE5), + _color.primary: const Color(0xFF7326E0), + _color.onPrimary: Colors.white, }, textStyles: { - $token.textStyle.heading1: GoogleFonts.manrope( + _textStyle.heading1: GoogleFonts.manrope( fontSize: 28, fontWeight: FontWeight.bold, ), - $token.textStyle.heading2: GoogleFonts.manrope( + _textStyle.heading2: GoogleFonts.manrope( fontSize: 23, fontWeight: FontWeight.bold, ), - $token.textStyle.heading3: GoogleFonts.manrope( + _textStyle.heading3: GoogleFonts.manrope( fontSize: 16, fontWeight: FontWeight.w500, ), - $token.textStyle.body: GoogleFonts.manrope( + _textStyle.body: GoogleFonts.manrope( fontSize: 14, fontWeight: FontWeight.w200, ), }, ); -extension ColorExt on ColorTokenUtil { - ColorToken get surface => const ColorToken('surface'); - ColorToken get onSurface => const ColorToken('on.surface'); - ColorToken get surfaceContainer => const ColorToken('surface.container'); - ColorToken get onSurfaceVariant => const ColorToken('on.surface.variant'); - ColorToken get primary => const ColorToken('primary'); - ColorToken get onPrimary => const ColorToken('on.primary'); - ColorToken get outline => const ColorToken('outline'); +class ColorTokens { + const ColorTokens(); + final surface = const ColorToken('surface'); + final onSurface = const ColorToken('on.surface'); + final surfaceContainer = const ColorToken('surface.container'); + final onSurfaceVariant = const ColorToken('on.surface.variant'); + final primary = const ColorToken('primary'); + final onPrimary = const ColorToken('on.primary'); + final outline = const ColorToken('outline'); } -extension TextStyleExt on TextStyleTokenUtil { - TextStyleToken get heading1 => const TextStyleToken('heading1'); - TextStyleToken get heading2 => const TextStyleToken('heading2'); - TextStyleToken get heading3 => const TextStyleToken('heading3'); - TextStyleToken get body => const TextStyleToken('body'); +class TextStyleTokens { + const TextStyleTokens(); + final heading1 = const TextStyleToken('heading1'); + final heading2 = const TextStyleToken('heading2'); + final heading3 = const TextStyleToken('heading3'); + final body = const TextStyleToken('body'); } diff --git a/examples/todo_list/lib/style/patterns/outline.dart b/examples/todo_list/lib/style/patterns/outline.dart index 31e3a6d2a..3b51e3afe 100644 --- a/examples/todo_list/lib/style/patterns/outline.dart +++ b/examples/todo_list/lib/style/patterns/outline.dart @@ -1,7 +1,9 @@ import 'package:mix/mix.dart'; import 'package:todo_list/style/design_tokens.dart'; +const _colors = ColorTokens(); + Style outlinePattern = Style( $box.border.width(2), - $box.border.color.ref($token.color.outline), + $box.border.color.ref(_colors.outline), ); diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart index 0b809fdcd..e30594ad7 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart @@ -1,5 +1,7 @@ // ignore_for_file: prefer_relative_imports,avoid-importing-entrypoint-exports +import 'dart:ui'; + import 'package:flutter/widgets.dart'; import 'package:mix/mix.dart'; import 'package:mix_annotations/mix_annotations.dart'; diff --git a/packages/mix/lib/src/theme/tokens/text_style_token.dart b/packages/mix/lib/src/theme/tokens/text_style_token.dart index 1ea31cbbf..d1bcb0678 100644 --- a/packages/mix/lib/src/theme/tokens/text_style_token.dart +++ b/packages/mix/lib/src/theme/tokens/text_style_token.dart @@ -68,13 +68,13 @@ final class TypographyRef extends TextStyleData with TokenRef { return other is TypographyRef && other.token == token; } - @override - int get hashCode => token.hashCode; - @override TextStyle resolve(MixData mix) { throw Exception('Cannot resolve a reference '); } + + @override + int get hashCode => token.hashCode; } @immutable diff --git a/packages/mix/test/src/theme/tokens/text_style_token_test.dart b/packages/mix/test/src/theme/tokens/text_style_token_test.dart index 36e83dbb4..73bef9aee 100644 --- a/packages/mix/test/src/theme/tokens/text_style_token_test.dart +++ b/packages/mix/test/src/theme/tokens/text_style_token_test.dart @@ -4,6 +4,7 @@ import 'package:mix/mix.dart'; import '../../../helpers/testing_utils.dart'; +const _tokens = MixTokensTest(); void main() { group('TextStyleToken', () { test('Constructor assigns name correctly', () { @@ -70,8 +71,8 @@ void main() { $material.colorScheme.background: Colors.red, }, spaces: { - $token.space.large: 100, - $token.space.medium: 50, + _tokens.space.large: 100, + _tokens.space.medium: 50, }, textStyles: { $material.textTheme.bodyText1: @@ -80,8 +81,8 @@ void main() { const TextStyle(color: Colors.blue, fontSize: 20), }, radii: { - $token.radius.medium: const Radius.elliptical(10, 50), - $token.radius.large: const Radius.elliptical(50, 50), + _tokens.radius.medium: const Radius.elliptical(10, 50), + _tokens.radius.large: const Radius.elliptical(50, 50), }, ); @@ -94,10 +95,10 @@ void main() { $text.style.ref($material.textTheme.bodyText2), $box.color.ref($material.colorScheme.background), $box.color.ref($material.colorScheme.error), - $box.borderRadius.all.ref($token.radius.medium), - $box.borderRadius.all.ref($token.radius.large), - $box.padding.horizontal.ref($token.space.medium), - $box.padding.horizontal.ref($token.space.large), + $box.borderRadius.all.ref(_tokens.radius.medium), + $box.borderRadius.all.ref(_tokens.radius.large), + $box.padding.horizontal.ref(_tokens.space.medium), + $box.padding.horizontal.ref(_tokens.space.large), ), key: key, child: const StyledText('Hello'), @@ -130,12 +131,12 @@ void main() { expect( (containerWidget.decoration as BoxDecoration).borderRadius, - BorderRadius.all(themeData.radii[$token.radius.large]!), + BorderRadius.all(themeData.radii[_tokens.radius.large]!), ); expect( containerWidget.padding!.horizontal / 2, - themeData.spaces[$token.space.large], + themeData.spaces[_tokens.space.large], ); }); diff --git a/packages/remix/demo/lib/components/checkbox.dart b/packages/remix/demo/lib/components/checkbox.dart index 8c34b2f49..7df982c5b 100644 --- a/packages/remix/demo/lib/components/checkbox.dart +++ b/packages/remix/demo/lib/components/checkbox.dart @@ -10,10 +10,6 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; Widget buildCheckboxUseCase(BuildContext context) { Widget buildCheckbox(CheckboxVariant variant) { return RxCheckbox( - label: context.knobs.string( - label: 'Label', - initialValue: 'Checkbox', - ), value: context.knobs.boolean(label: 'Value', initialValue: true), onChanged: (value) {}, size: context.knobs.list( diff --git a/packages/remix/lib/helpers/color_palette.dart b/packages/remix/lib/helpers/color_palette.dart index 7e6d7155b..e4d444695 100644 --- a/packages/remix/lib/helpers/color_palette.dart +++ b/packages/remix/lib/helpers/color_palette.dart @@ -24,6 +24,8 @@ class RadixColors { static const cyanDark = RadixColors(_cyanDark, _cyanDarkAlpha); static const gold = RadixColors(_gold, _goldAlpha); static const goldDark = RadixColors(_goldDark, _goldDarkAlpha); + static const grass = RadixColors(_grass, _grassAlpha); + static const grassDark = RadixColors(_grassDark, _grassDarkAlpha); static const gray = RadixColors(_gray, _grayAlpha); static const grayDark = RadixColors(_grayDark, _grayDarkAlpha); static const green = RadixColors(_green, _greenAlpha); @@ -32,25 +34,39 @@ class RadixColors { static const indigoDark = RadixColors(_indigoDark, _indigoDarkAlpha); static const lime = RadixColors(_lime, _limeAlpha); static const limeDark = RadixColors(_limeDark, _limeDarkAlpha); + static const mauve = RadixColors(_mauve, _mauveAlpha); + static const mauveDark = RadixColors(_mauveDark, _mauveDarkAlpha); + static const mint = RadixColors(_mint, _mintAlpha); + static const mintDark = RadixColors(_mintDark, _mintDarkAlpha); static const orange = RadixColors(_orange, _orangeAlpha); static const orangeDark = RadixColors(_orangeDark, _orangeDarkAlpha); static const pink = RadixColors(_pink, _pinkAlpha); static const pinkDark = RadixColors(_pinkDark, _pinkDarkAlpha); + static const plum = RadixColors(_plum, _plumAlpha); + static const plumDark = RadixColors(_plumDark, _plumDarkAlpha); static const purple = RadixColors(_purple, _purpleAlpha); static const purpleDark = RadixColors(_purpleDark, _purpleDarkAlpha); static const red = RadixColors(_red, _redAlpha); static const redDark = RadixColors(_redDark, _redDarkAlpha); + static const sand = RadixColors(_sand, _sandAlpha); + static const sandDark = RadixColors(_sandDark, _sandDarkAlpha); + static const sky = RadixColors(_sky, _skyAlpha); + static const skyDark = RadixColors(_skyDark, _skyDarkAlpha); + static const slate = RadixColors(_slate, _slateAlpha); + static const slateDark = RadixColors(_slateDark, _slateDarkAlpha); static const teal = RadixColors(_teal, _tealAlpha); static const tealDark = RadixColors(_tealDark, _tealDarkAlpha); + static const tomato = RadixColors(_tomato, _tomatoAlpha); + static const tomatoDark = RadixColors(_tomatoDark, _tomatoDarkAlpha); static const violet = RadixColors(_violet, _violetAlpha); static const violetDark = RadixColors(_violetDark, _violetDarkAlpha); static const yellow = RadixColors(_yellow, _yellowAlpha); static const yellowDark = RadixColors(_yellowDark, _yellowDarkAlpha); - static const grass = RadixColors(_grass, _grassAlpha); - static const grassDark = RadixColors(_grassDark, _grassDarkAlpha); - static const sky = RadixColors(_sky, _skyAlpha); - static const skyDark = RadixColors(_skyDark, _skyDarkAlpha); - //TODO: ADD REMAINING COLORS + static const olive = RadixColors(_olive, _oliveAlpha); + static const oliveDark = RadixColors(_oliveDark, _oliveDarkAlpha); + static const whiteAlpha = RadixColors(_whiteAlpha, _whiteAlpha); + static const sage = RadixColors(_sage, _sageAlpha); + static const sageDark = RadixColors(_sageDark, _sageDarkAlpha); Color get s1 => swatch[1]!; Color get s1Alpha => alphaSwatch[1]!; From 15da0fa3c1706770111949bd4f127933a58ac1f0 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Sun, 7 Jul 2024 16:02:44 -0400 Subject: [PATCH 11/24] linting --- packages/mix/test/src/specs/flex/flex_attribute_test.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mix/test/src/specs/flex/flex_attribute_test.dart b/packages/mix/test/src/specs/flex/flex_attribute_test.dart index 69685147b..a1ec9e1b2 100644 --- a/packages/mix/test/src/specs/flex/flex_attribute_test.dart +++ b/packages/mix/test/src/specs/flex/flex_attribute_test.dart @@ -5,6 +5,7 @@ import 'package:mix/mix.dart'; import '../../../helpers/testing_utils.dart'; void main() { + const token = MixTokensTest(); group('FlexMixAttribute', () { test('of returns correct FlexMixAttribute', () { const attribute = FlexSpecAttribute(); @@ -51,7 +52,7 @@ void main() { final theme = MixThemeData( spaces: { - $token.space.small: tokenValue, + token.space.small: tokenValue, }, ); @@ -67,7 +68,7 @@ void main() { mixData = MixData.create( context, Style( - $flex.gap.ref($token.space.small), + $flex.gap.ref(token.space.small), ), ); From 58f2e84d08735479974262924e804001778eeadd Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Tue, 9 Jul 2024 12:07:26 -0400 Subject: [PATCH 12/24] wip --- .../remix/demo/lib/components/checkbox.dart | 33 +- packages/remix/demo/lib/components/radio.dart | 44 + .../remix/demo/lib/components/spinner.dart | 35 + .../demo/lib/helpers/use_case_state.dart | 11 + .../remix/demo/lib/main.directories.g.dart | 26 + .../ephemeral/Flutter-Generated.xcconfig | 4 +- .../ephemeral/FlutterInputs.xcfilelist | 1919 ++++++++--------- .../ephemeral/flutter_export_environment.sh | 4 +- .../macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../lib/components/avatar/avatar.style.dart | 99 + .../components/avatar/avatar.variants.dart | 50 + .../lib/components/avatar/avatar_spec.dart | 26 + .../lib/components/avatar/avatar_spec.g.dart | 223 ++ .../lib/components/avatar/avatar_widget.dart | 0 .../lib/components/badge/badge.style.dart | 73 + .../lib/components/badge/badge.variants.dart | 26 + .../lib/components/badge/badge_spec.dart | 23 + .../lib/components/badge/badge_spec.g.dart | 208 ++ .../lib/components/badge/badget_widget.dart | 45 + .../lib/components/button/button.style.dart | 237 +- .../components/button/button.variants.dart | 10 +- .../{button.dart => button_widget.dart} | 0 .../lib/components/checkbox/checkbox.dart | 3 +- .../components/checkbox/checkbox_style.dart | 112 +- .../components/checkbox/checkbox_variant.dart | 32 - .../checkbox/checkbox_variants.dart | 40 + .../checkbox_group/checkbox_group.dart | 72 + .../components/progress/progress.style.dart | 87 + .../progress/progress.variants.dart | 37 + .../components/progress/progress_spec.dart | 26 + .../components/progress/progress_spec.g.dart | 221 ++ .../components/progress/progress_widget.dart | 55 + .../lib/components/radio/radio_spec.dart | 23 + .../lib/components/radio/radio_spec.g.dart | 207 ++ .../lib/components/radio/radio_style.dart | 113 + .../lib/components/radio/radio_variants.dart | 40 + .../lib/components/radio/radio_widget.dart | 53 + .../lib/components/spinner/spinner.style.dart | 12 +- .../components/spinner/spinner.variants.dart | 25 +- .../lib/components/spinner/spinner_spec.dart | 2 +- .../{spinner.dart => spinner_widget.dart} | 16 +- .../remix/lib/helpers/utility_extension.dart | 5 + packages/remix/lib/helpers/variant.dart | 7 + packages/remix/lib/remix.dart | 4 +- 45 files changed, 3064 insertions(+), 1228 deletions(-) create mode 100644 packages/remix/demo/lib/components/radio.dart create mode 100644 packages/remix/demo/lib/components/spinner.dart create mode 100644 packages/remix/demo/lib/helpers/use_case_state.dart create mode 100644 packages/remix/lib/components/avatar/avatar.style.dart create mode 100644 packages/remix/lib/components/avatar/avatar.variants.dart create mode 100644 packages/remix/lib/components/avatar/avatar_spec.dart create mode 100644 packages/remix/lib/components/avatar/avatar_spec.g.dart create mode 100644 packages/remix/lib/components/avatar/avatar_widget.dart create mode 100644 packages/remix/lib/components/badge/badge.style.dart create mode 100644 packages/remix/lib/components/badge/badge.variants.dart create mode 100644 packages/remix/lib/components/badge/badge_spec.dart create mode 100644 packages/remix/lib/components/badge/badge_spec.g.dart create mode 100644 packages/remix/lib/components/badge/badget_widget.dart rename packages/remix/lib/components/button/{button.dart => button_widget.dart} (100%) delete mode 100644 packages/remix/lib/components/checkbox/checkbox_variant.dart create mode 100644 packages/remix/lib/components/checkbox/checkbox_variants.dart create mode 100644 packages/remix/lib/components/checkbox_group/checkbox_group.dart create mode 100644 packages/remix/lib/components/progress/progress.style.dart create mode 100644 packages/remix/lib/components/progress/progress.variants.dart create mode 100644 packages/remix/lib/components/progress/progress_spec.dart create mode 100644 packages/remix/lib/components/progress/progress_spec.g.dart create mode 100644 packages/remix/lib/components/progress/progress_widget.dart create mode 100644 packages/remix/lib/components/radio/radio_spec.dart create mode 100644 packages/remix/lib/components/radio/radio_spec.g.dart create mode 100644 packages/remix/lib/components/radio/radio_style.dart create mode 100644 packages/remix/lib/components/radio/radio_variants.dart create mode 100644 packages/remix/lib/components/radio/radio_widget.dart rename packages/remix/lib/components/spinner/{spinner.dart => spinner_widget.dart} (83%) create mode 100644 packages/remix/lib/helpers/utility_extension.dart create mode 100644 packages/remix/lib/helpers/variant.dart diff --git a/packages/remix/demo/lib/components/checkbox.dart b/packages/remix/demo/lib/components/checkbox.dart index 7df982c5b..116a46235 100644 --- a/packages/remix/demo/lib/components/checkbox.dart +++ b/packages/remix/demo/lib/components/checkbox.dart @@ -1,3 +1,4 @@ +import 'package:demo/helpers/use_case_state.dart'; import 'package:flutter/material.dart'; import 'package:remix/remix.dart'; import 'package:widgetbook/widgetbook.dart'; @@ -8,17 +9,29 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; type: RxCheckbox, ) Widget buildCheckboxUseCase(BuildContext context) { + final knobState = WidgetbookState.of(context); + Widget buildCheckbox(CheckboxVariant variant) { - return RxCheckbox( - value: context.knobs.boolean(label: 'Value', initialValue: true), - onChanged: (value) {}, - size: context.knobs.list( - label: 'Size', - options: CheckboxSize.values, - initialOption: CheckboxSize.medium, - labelBuilder: (value) => value.name.split('.').last, - ), - disabled: context.knobs.boolean(label: 'Disabled', initialValue: false), + return Column( + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxCheckbox( + value: context.knobs.boolean(label: 'Checked', initialValue: true), + onChanged: (value) => knobState.updateKnob('Checked', value), + variant: variant, + size: context.knobs.list( + label: 'Size', + options: CheckboxSize.values, + initialOption: CheckboxSize.medium, + labelBuilder: (value) => value.name.split('.').last, + ), + disabled: context.knobs.boolean( + label: 'Disabled', + initialValue: false, + ), + ), + ], ); } diff --git a/packages/remix/demo/lib/components/radio.dart b/packages/remix/demo/lib/components/radio.dart new file mode 100644 index 000000000..60ba33ec1 --- /dev/null +++ b/packages/remix/demo/lib/components/radio.dart @@ -0,0 +1,44 @@ +import 'package:demo/helpers/use_case_state.dart'; +import 'package:flutter/material.dart'; +import 'package:remix/components/radio/radio_variants.dart'; +import 'package:remix/components/radio/radio_widget.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'Radio Component', + type: RxRadio, +) +Widget buildRadioUseCase(BuildContext context) { + final knobState = WidgetbookState.of(context); + + Widget buildRadio(RadioVariant variant) { + return Column( + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxRadio( + value: context.knobs.boolean(label: 'Selected', initialValue: true), + onChanged: (value) => knobState.updateKnob('Selected', value), + variant: variant, + size: context.knobs.list( + label: 'Size', + options: RadioSize.values, + initialOption: RadioSize.medium, + labelBuilder: (value) => value.label, + ), + disabled: context.knobs.boolean( + label: 'Disabled', + initialValue: false, + ), + ), + ], + ); + } + + return Wrap( + spacing: 12, + runSpacing: 12, + children: RadioVariant.values.map(buildRadio).toList(), + ); +} diff --git a/packages/remix/demo/lib/components/spinner.dart b/packages/remix/demo/lib/components/spinner.dart new file mode 100644 index 000000000..ec381aae9 --- /dev/null +++ b/packages/remix/demo/lib/components/spinner.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:remix/components/spinner/spinner.variants.dart'; +import 'package:remix/components/spinner/spinner_widget.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'Spinner Component', + type: RxSpinner, +) +Widget buildSpinnerUseCase(BuildContext context) { + Widget buildSpinner(SpinnerVariant variant) { + return Column( + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxSpinner( + size: context.knobs.list( + label: 'Size', + options: SpinnerSize.values, + initialOption: SpinnerSize.medium, + labelBuilder: (value) => value.label, + ), + variant: variant, + ), + ], + ); + } + + return Wrap( + spacing: 12, + runSpacing: 12, + children: SpinnerVariant.values.map(buildSpinner).toList(), + ); +} diff --git a/packages/remix/demo/lib/helpers/use_case_state.dart b/packages/remix/demo/lib/helpers/use_case_state.dart new file mode 100644 index 000000000..5a652e725 --- /dev/null +++ b/packages/remix/demo/lib/helpers/use_case_state.dart @@ -0,0 +1,11 @@ +import 'package:widgetbook/widgetbook.dart'; + +extension WidgetBookStateX on WidgetbookState { + void updateKnob(String label, T value) { + updateQueryField( + group: 'knobs', + field: label, + value: '$value', + ); + } +} diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index aefbc8520..8b4028177 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -11,6 +11,8 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:demo/components/button.dart' as _i2; import 'package:demo/components/checkbox.dart' as _i3; +import 'package:demo/components/radio.dart' as _i4; +import 'package:demo/components/spinner.dart' as _i5; import 'package:widgetbook/widgetbook.dart' as _i1; final directories = <_i1.WidgetbookNode>[ @@ -41,6 +43,30 @@ final directories = <_i1.WidgetbookNode>[ ) ], ), + _i1.WidgetbookFolder( + name: 'radio', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RxRadio', + useCase: _i1.WidgetbookUseCase( + name: 'Radio Component', + builder: _i4.buildRadioUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'spinner', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RxSpinner', + useCase: _i1.WidgetbookUseCase( + name: 'Spinner Component', + builder: _i5.buildSpinnerUseCase, + ), + ) + ], + ), ], ) ]; diff --git a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 1526d5ce0..84a846e69 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,12 +1,12 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/Users/leofarias/fvm/versions/stable +FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6 FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart FLUTTER_BUILD_DIR=build FLUTTER_BUILD_NAME=1.0.0 FLUTTER_BUILD_NUMBER=1 -DART_DEFINES=RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC81NWVhZTY4NjRiMjk2ZGQ5ZjQzYjJjYzc1NzdlYzI1NmU1YzMyYThkLw== +DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw== DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true TREE_SHAKE_ICONS=false diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index bb1d90e52..fdb49cb8a 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -1,4 +1,4 @@ -/Users/leofarias/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-67.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-64.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/accessibility_tools.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/accessibility_issue.dart @@ -10,7 +10,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/minimum_tap_area_checker.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/mixin.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/semantic_label_checker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/analyzer-6.4.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/analyzer-6.2.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/args-2.5.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/lib/async.dart @@ -74,10 +74,10 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib/src/visitor.dart /Users/leofarias/.pub-cache/hosted/pub.dev/build-2.4.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/build_config-1.1.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/build_daemon-4.0.2/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/build_daemon-4.0.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/build_resolvers-2.4.2/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner-2.4.11/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner_core-7.3.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner-2.4.9/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/build_runner_core-7.3.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/built_collection-5.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/built_value-8.9.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/characters-1.3.0/LICENSE @@ -96,118 +96,118 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/src/stopwatch.dart /Users/leofarias/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/code_builder-4.10.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/collection.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/algorithms.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/boollist.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/canonicalized_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_iterable.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_iterator.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_list.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/comparators.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/empty_unmodifiable_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/functions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/iterable_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/iterable_zip.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/list_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/priority_queue.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/queue_list.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/union_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/union_set_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/unmodifiable_wrappers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/wrappers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/collection.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/algorithms.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/boollist.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/canonicalized_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_iterable.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_iterator.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_list.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/comparators.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/empty_unmodifiable_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/functions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/iterable_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/iterable_zip.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/list_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/priority_queue.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/queue_list.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/union_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/union_set_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/unmodifiable_wrappers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/wrappers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/convert-3.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/crypto-3.0.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/assets/CupertinoIcons.ttf +/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/assets/CupertinoIcons.ttf /Users/leofarias/.pub-cache/hosted/pub.dev/dart_style-2.3.6/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/device_frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/oneplus_8_pro/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/oneplus_8_pro/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/oneplus_8_pro/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_a50/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_a50/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_a50/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20_ultra/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20_ultra/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_note20_ultra/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_s20/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_s20/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/samsung_galaxy_s20/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/sony_xperia_1_ii/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/sony_xperia_1_ii/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/android/sony_xperia_1_ii/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/base/draw_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/desktop_monitor/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/desktop_monitor/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/laptop/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/laptop/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/phone/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/phone/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/tablet/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/generic/tablet/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_air_4/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_air_4/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_air_4/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_11inches/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_11inches/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_11inches/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_mini/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_mini/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_mini/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_pro_max/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_pro_max/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_12_pro_max/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_mini/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_mini/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_mini/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_pro_max/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_pro_max/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_13_pro_max/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_se/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_se/frame.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/ios/iphone_se/screen.g.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/linux/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/macos/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/macos/macbook_pro/device.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/macos/macbook_pro/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/devices/windows/devices.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/device_type.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/identifier.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/info.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/info/info.freezed.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/keyboard/button.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/keyboard/virtual_keyboard.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/theme.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.2.0/lib/src/theme.freezed.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/device_frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/oneplus_8_pro/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/oneplus_8_pro/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/oneplus_8_pro/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_a50/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_a50/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_a50/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20_ultra/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20_ultra/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_note20_ultra/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_s20/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_s20/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/samsung_galaxy_s20/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/sony_xperia_1_ii/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/sony_xperia_1_ii/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/android/sony_xperia_1_ii/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/base/draw_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/desktop_monitor/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/desktop_monitor/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/laptop/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/laptop/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/phone/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/phone/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/tablet/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/generic/tablet/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_air_4/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_air_4/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_air_4/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_11inches/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_11inches/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_11inches/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen2/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/ipad_pro_12Inches_gen4/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_mini/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_mini/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_mini/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_pro_max/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_pro_max/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_12_pro_max/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_mini/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_mini/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_mini/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_pro_max/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_pro_max/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_13_pro_max/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_se/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_se/frame.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/ios/iphone_se/screen.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/linux/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/macos/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/macos/macbook_pro/device.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/macos/macbook_pro/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/devices/windows/devices.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/device_type.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/identifier.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/info.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/info/info.freezed.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/keyboard/button.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/keyboard/virtual_keyboard.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/theme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/src/theme.freezed.dart /Users/leofarias/.pub-cache/hosted/pub.dev/fake_async-1.3.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/fake_async-1.3.1/lib/fake_async.dart /Users/leofarias/.pub-cache/hosted/pub.dev/file-7.0.0/LICENSE @@ -239,7 +239,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/inspector-2.1.0/lib/src/widgets/panel/inspector_panel.dart /Users/leofarias/.pub-cache/hosted/pub.dev/inspector-2.1.0/lib/src/widgets/zoom/zoom_overlay.dart /Users/leofarias/.pub-cache/hosted/pub.dev/io-1.0.4/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/js-0.7.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/js-0.6.7/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/json_annotation.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/allowed_keys_helpers.dart @@ -252,140 +252,81 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_serializable.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_serializable.g.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_value.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/leak_tracker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/_protocol.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/_registration.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/delivery.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/messages.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/devtools_integration/primitives.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_baseliner.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_leak_filter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_leak_reporter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_leak_tracker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_record.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_record_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_records.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/_object_tracker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/helpers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/leak_tracking.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_dispatcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_finalizer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_gc_counter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_print_bytes.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_retaining_path/_connection.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_retaining_path/_retaining_path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_retaining_path/_retaining_path_isolate.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/_test_helper_detector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/leak_tracking/primitives/model.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/_formatting.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/_primitives.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/_util.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.4/lib/src/shared/shared_model.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/leak_tracker_flutter_testing.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/model.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing_for_testing/leaking_classes.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing_for_testing/test_case.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.3/lib/src/testing_for_testing/test_settings.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/lib/leak_tracker_testing.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/lib/src/leak_testing.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.1/lib/src/matchers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/lints-2.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/logging-1.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/core_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/custom_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/description.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/equals_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/error_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/async_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/expect_async.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/future_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/never_called.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/prints_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/stream_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/stream_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/throws_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/throws_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/util/placeholder.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/util/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/feature_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/having_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/interfaces.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/iterable_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/map_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/numeric_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/operator_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/order_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/string_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/type_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/util.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/blend/blend.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/contrast/contrast.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dislike/dislike_analyzer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/dynamic_color.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/material_dynamic_colors.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/src/contrast_curve.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/src/tone_delta_pair.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/cam16.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/hct.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/src/hct_solver.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/viewing_conditions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/material_color_utilities.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/palettes/core_palette.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/palettes/tonal_palette.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_celebi.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_wsmeans.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_wu.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/src/point_provider.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/src/point_provider_lab.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/dynamic_scheme.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_content.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_expressive.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_fidelity.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_monochrome.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_neutral.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_tonal_spot.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_vibrant.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/variant.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/score/score.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/temperature/temperature_cache.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/color_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/math_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/string_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/lib/meta.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.12.0/lib/meta_meta.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.5/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/core_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/custom_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/description.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/equals_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/error_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/async_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/expect_async.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/future_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/never_called.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/prints_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/stream_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/stream_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/throws_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/throws_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/util/placeholder.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/util/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/feature_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/having_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/interfaces.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/iterable_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/map_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/numeric_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/operator_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/order_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/string_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/type_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/util.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/blend/blend.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/cam16.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/hct.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/hct_solver.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/viewing_conditions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/material_color_utilities.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/palettes/core_palette.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/palettes/tonal_palette.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/point_provider.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/point_provider_lab.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_celebi.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_wsmeans.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_wu.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/scheme/scheme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/score/score.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/utils/color_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/utils/math_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/meta.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/meta_meta.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart /Users/leofarias/.pub-cache/hosted/pub.dev/package_config-2.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/characters.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/context.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/internal_style.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/parsed_path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/posix.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/url.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/windows.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/characters.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/context.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/internal_style.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/parsed_path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/posix.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/url.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/windows.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/pool-1.5.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pubspec_parse-1.3.0/LICENSE @@ -401,43 +342,43 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/lib/src/separator_controller.dart /Users/leofarias/.pub-cache/hosted/pub.dev/resizable_widget-1.0.5/lib/src/widget_size_info.dart /Users/leofarias/.pub-cache/hosted/pub.dev/shelf-1.4.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/shelf_web_socket-2.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/source_gen-1.5.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/source_span.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/charcode.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/colors.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/file.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/highlighter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/location.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/location_mixin.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_mixin.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_with_context.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/chain.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/lazy_chain.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/lazy_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/stack_zone_specification.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/unparsed_frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/vm_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/stack_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/close_guarantee_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/delegating_stream_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/disconnector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/guarantee_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/json_document_transformer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/multi_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_completer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_transformer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/stream_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/source_span.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/charcode.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/colors.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/file.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/highlighter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/location.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/location_mixin.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_mixin.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_with_context.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/chain.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/lazy_chain.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/lazy_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/stack_zone_specification.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/unparsed_frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/vm_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/stack_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/close_guarantee_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/delegating_stream_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/disconnector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/guarantee_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/json_document_transformer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/multi_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_completer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_transformer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/stream_channel.dart /Users/leofarias/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib/src/charcode.dart @@ -455,44 +396,47 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/src/generated/top_level.dart /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/src/generated/unicode_glyph_set.dart /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/term_glyph.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/fake.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/hooks.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/scaffolding.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/closed_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/compiler.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/on_platform.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/retry.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/skip.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/tags.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/test_on.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/configuration/timeout.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/declarer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/group.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/group_entry.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/invoker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/live_test.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/live_test_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/message.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/metadata.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/operating_system.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/platform_selector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/remote_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/runtime.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/stack_trace_formatter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/stack_trace_mapper.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/state.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/suite.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/suite_platform.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/test.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/test_failure.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/util/identifier_regex.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/backend/util/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/frontend/fake.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/scaffolding/spawn_hybrid.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/scaffolding/test_structure.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/scaffolding/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.7.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/fake.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/hooks.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/scaffolding.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/closed_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/compiler.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/on_platform.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/retry.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/skip.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/tags.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/test_on.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/timeout.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/declarer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/group.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/group_entry.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/invoker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/live_test.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/live_test_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/message.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/metadata.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/operating_system.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/platform_selector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/remote_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/runtime.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/stack_trace_formatter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/stack_trace_mapper.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/state.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/suite.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/suite_platform.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/test.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/test_failure.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/util/identifier_regex.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/util/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/expect/async_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/frontend/fake.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/spawn_hybrid.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/test_structure.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/test_api.dart /Users/leofarias/.pub-cache/hosted/pub.dev/timing-1.0.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/typed_data-1.3.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/LICENSE @@ -521,17 +465,8 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector3.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector4.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math_64.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/_stream_helpers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/dart_io_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/snapshot_graph.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/src/vm_service.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/vm_service.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-14.2.1/lib/vm_service_io.dart /Users/leofarias/.pub-cache/hosted/pub.dev/watcher-1.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/web-0.5.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket-0.1.5/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-3.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/assets/fonts/Poppins/Poppins-Black.ttf /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/assets/fonts/Poppins/Poppins-BlackItalic.ttf @@ -853,19 +788,20 @@ /Users/leofarias/Projects/mix/packages/remix/demo/lib/addons/icon_data_knob.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/button.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/checkbox.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/helpers/use_case_state.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.directories.g.dart /Users/leofarias/Projects/mix/packages/remix/demo/pubspec.yaml -/Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.style.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_style.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_variant.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.style.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.variants.dart @@ -873,683 +809,658 @@ /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/color_palette.dart +/Users/leofarias/Projects/mix/packages/remix/lib/helpers/utility_extension.dart /Users/leofarias/Projects/mix/packages/remix/lib/remix.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/color_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/radius_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/remix_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/space_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/text_style_tokens.dart -/Users/leofarias/fvm/versions/stable/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf -/Users/leofarias/fvm/versions/stable/bin/cache/pkg/sky_engine/LICENSE -/Users/leofarias/fvm/versions/stable/bin/internal/engine.version -/Users/leofarias/fvm/versions/stable/packages/flutter/LICENSE -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/animation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/cupertino.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/foundation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/gestures.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/material.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/painting.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/physics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/rendering.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/scheduler.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/semantics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/services.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animation_controller.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animation_style.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/animations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/curves.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/listener_helpers.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/tween.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/animation/tween_sequence.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/activity_indicator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/app.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/checkbox.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/colors.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/constants.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/context_menu.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/context_menu_action.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/date_picker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/desktop_text_selection.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/dialog.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/form_row.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/form_section.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/icon_theme_data.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/icons.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/interface_level.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/list_section.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/list_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/localizations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/magnifier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/nav_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/page_scaffold.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/picker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/radio.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/refresh.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/route.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/scrollbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/search_field.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/segmented_control.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/slider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/switch.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/tab_scaffold.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/tab_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_field.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_form_field_row.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_selection.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/text_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/thumb_painter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/cupertino/toggleable.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_bitfield_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_capabilities_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_isolates_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_platform_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/_timeline_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/annotations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/assertions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/basic_types.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/bitfield.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/capabilities.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/change_notifier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/collections.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/consolidate_response.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/constants.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/diagnostics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/isolates.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/key.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/licenses.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/memory_allocations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/node.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/object.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/observer_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/persistent_hash_map.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/platform.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/print.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/serialization.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/service_extensions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/stack_frame.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/synchronous_future.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/timeline.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/foundation/unicode.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/arena.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/constants.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/converter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/drag.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/drag_details.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/eager.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/events.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/force_press.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/gesture_settings.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/hit_test.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/long_press.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/lsq_solver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/monodrag.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/multidrag.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/multitap.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/pointer_router.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/recognizer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/resampler.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/scale.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/tap.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/tap_and_drag.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/team.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/gestures/velocity_tracker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/about.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/action_buttons.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/action_chip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/action_icons_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/animated_icons.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/app.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/app_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/app_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/arc.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/autocomplete.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/back_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/badge.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/badge_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/banner.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/banner_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_app_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_app_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_navigation_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_sheet.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/bottom_sheet_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_style.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_style_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/calendar_date_picker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/card.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/card_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/checkbox.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/checkbox_list_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/checkbox_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/chip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/chip_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/choice_chip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/circle_avatar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/color_scheme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/colors.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/constants.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/curves.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/data_table.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/data_table_source.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/data_table_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/date.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/date_picker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/date_picker_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/desktop_text_selection.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dialog.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dialog_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/divider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/divider_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/drawer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/drawer_header.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/drawer_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dropdown.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dropdown_menu.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/dropdown_menu_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/elevated_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/elevated_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/elevation_overlay.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expand_icon.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expansion_panel.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expansion_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/expansion_tile_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/feedback.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/filled_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/filled_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/filter_chip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/flexible_space_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/floating_action_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/floating_action_button_location.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/floating_action_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/flutter_logo.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/grid_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/grid_tile_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/icon_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/icon_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/icons.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_decoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_highlight.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_ripple.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_sparkle.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_splash.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/ink_well.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_chip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_date_picker_form_field.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/input_decorator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/list_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/list_tile_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/magnifier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_localizations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_state.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/material_state_mixin.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_anchor.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_style.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/menu_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/mergeable_material.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/motion.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_drawer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_drawer_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_rail.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/navigation_rail_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/no_splash.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/outlined_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/outlined_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/page.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/page_transitions_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/paginated_data_table.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/popup_menu.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/popup_menu_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/predictive_back_page_transitions_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/progress_indicator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/progress_indicator_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/radio.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/radio_list_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/radio_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/range_slider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/refresh_indicator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/reorderable_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/scaffold.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/scrollbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/scrollbar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search_anchor.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/search_view_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/segmented_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/segmented_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/selectable_text.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/selection_area.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/shaders/ink_sparkle.frag -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/shadows.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/slider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/slider_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/snack_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/snack_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/stepper.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/switch.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/switch_list_tile.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/switch_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tab_bar_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tab_controller.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tab_indicator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tabs.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_button_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_field.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_form_field.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/text_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/theme_data.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/time.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/time_picker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/time_picker_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/toggle_buttons.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/toggle_buttons_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/toggleable.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tooltip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tooltip_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/tooltip_visibility.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/typography.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/material/user_accounts_drawer_header.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/_network_image_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/alignment.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/basic_types.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/beveled_rectangle_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/border_radius.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/borders.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_decoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_fit.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/box_shadow.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/circle_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/clip.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/colors.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/continuous_rectangle_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/decoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/decoration_image.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/edge_insets.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/flutter_logo.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/fractional_offset.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/geometry.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/gradient.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_cache.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_decoder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_provider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_resolution.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/image_stream.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/inline_span.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/linear_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/matrix_utils.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/notched_shapes.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/oval_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/paint_utilities.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/placeholder_span.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/rounded_rectangle_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/shader_warm_up.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/shape_decoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/stadium_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/star_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/strut_style.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_painter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_scaler.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_span.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/painting/text_style.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/clamped_simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/friction_simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/gravity_simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/spring_simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/tolerance.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/physics/utils.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/animated_size.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/box.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/custom_layout.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/custom_paint.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/decorated_sliver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/editable.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/error.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/flex.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/flow.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/image.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/layer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/layout_helper.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/list_body.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/list_wheel_viewport.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/mouse_tracker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/object.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/paragraph.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/performance_overlay.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/platform_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/proxy_box.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/proxy_sliver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/rotated_box.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/selection.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/service_extensions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/shifted_box.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_fill.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_grid.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_group.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_padding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/sliver_persistent_header.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/stack.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/table.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/table_border.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/texture.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/tweens.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/viewport.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/viewport_offset.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/rendering/wrap.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/priority.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/service_extensions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/scheduler/ticker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/semantics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/semantics_event.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/semantics/semantics_service.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/asset_bundle.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/asset_manifest.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/autofill.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/binary_messenger.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/browser_context_menu.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/clipboard.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/deferred_component.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/flavor.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/font_loader.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/haptic_feedback.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/hardware_keyboard.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/keyboard_inserted_content.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/keyboard_key.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/keyboard_maps.g.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/live_text.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/message_codec.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/message_codecs.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/mouse_cursor.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/mouse_tracking.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/platform_channel.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/platform_views.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/predictive_back_event.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/process_text.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_android.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_ios.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_linux.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_macos.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_web.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/raw_keyboard_windows.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/restoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/service_extensions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/spell_check.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_channels.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_chrome.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_navigator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/system_sound.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_boundary.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_editing.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_editing_delta.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_formatter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_input.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/text_layout_metrics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/services/undo_manager.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/_html_element_view_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/actions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/adapter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_cross_fade.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_scroll_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_size.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/animated_switcher.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/annotated_region.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/app.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/app_lifecycle_listener.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/async.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/autocomplete.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/autofill.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/automatic_keep_alive.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/banner.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/basic.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/color_filter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/constants.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/container.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/context_menu_button_item.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/context_menu_controller.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/debug.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/decorated_sliver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/default_selection_style.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/dismissible.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/disposable_build_context.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/drag_target.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/dual_transition_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/editable_text.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/fade_in_image.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/focus_manager.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/focus_scope.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/focus_traversal.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/form.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/framework.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/gesture_detector.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/grid_paper.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/heroes.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon_data.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/icon_theme_data.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/image.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/image_filter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/image_icon.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/implicit_animations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/inherited_model.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/inherited_notifier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/inherited_theme.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/interactive_viewer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/keyboard_listener.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/layout_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/localizations.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/lookup_boundary.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/magnifier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/media_query.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/modal_barrier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/navigation_toolbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/navigator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/navigator_pop_handler.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/nested_scroll_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/notification_listener.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/orientation_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/overflow_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/overlay.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/overscroll_indicator.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/page_storage.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/page_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/pages.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/performance_overlay.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/placeholder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/platform_menu_bar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/platform_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/pop_scope.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/preferred_size.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/primary_scroll_controller.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/reorderable_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/restoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/restoration_properties.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/router.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/routes.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/safe_area.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_activity.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_configuration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_context.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_controller.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_delegate.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_metrics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_notification.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_notification_observer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_physics.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_position.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scroll_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scrollable.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scrollable_helpers.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/scrollbar.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/selectable_region.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/selection_container.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/semantics_debugger.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/service_extensions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/shared_app_data.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/shortcuts.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/single_child_scroll_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_fill.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_layout_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_persistent_header.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/sliver_varied_extent_list.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/snapshot_widget.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/spacer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/spell_check.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/status_transitions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/table.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/tap_region.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_editing_intents.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_selection.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/texture.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/ticker_provider.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/title.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/transitions.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/tween_animation_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/two_dimensional_scroll_view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/two_dimensional_viewport.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/undo_history.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/unique_widget.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/value_listenable_builder.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/view.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/viewport.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/visibility.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/widget_inspector.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/widget_span.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/widget_state.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/src/widgets/will_pop_scope.dart -/Users/leofarias/fvm/versions/stable/packages/flutter/lib/widgets.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/flutter_test.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_binding_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_goldens_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_matchers_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/_test_selector_io.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/accessibility.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/animation_sheet.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/binding.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/controller.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/deprecated.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/event_simulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/finders.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/frame_timing_summarizer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/goldens.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/image.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/matchers.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/mock_canvas.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/mock_event_channel.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/nonconst.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/platform.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/recording_canvas.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/restoration.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/stack_manipulation.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_async_utils.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_compat.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_default_binary_messenger.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_exception_reporter.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_pointer.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_text_input.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_text_input_key_handler.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/test_vsync.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/tree_traversal.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/widget_tester.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_test/lib/src/window.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/common.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/macos.dart -/Users/leofarias/fvm/versions/stable/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart +/Users/leofarias/fvm/versions/3.10.6/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf +/Users/leofarias/fvm/versions/3.10.6/bin/cache/pkg/sky_engine/LICENSE +/Users/leofarias/fvm/versions/3.10.6/bin/internal/engine.version +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/LICENSE +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/animation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/cupertino.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/foundation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/gestures.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/material.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/painting.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/physics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/rendering.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/scheduler.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/semantics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/services.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animation_controller.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/curves.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/listener_helpers.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/tween.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/tween_sequence.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/activity_indicator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/app.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/checkbox.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/colors.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/constants.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/context_menu.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/context_menu_action.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/date_picker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/dialog.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/form_row.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/form_section.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/icon_theme_data.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/icons.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/interface_level.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/list_section.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/list_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/localizations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/magnifier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/nav_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/page_scaffold.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/picker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/radio.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/refresh.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/route.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/scrollbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/search_field.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/segmented_control.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/slider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/switch.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/tab_scaffold.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/tab_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_field.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_form_field_row.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/thumb_painter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/toggleable.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_bitfield_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_capabilities_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_isolates_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_platform_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/annotations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/assertions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/basic_types.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/bitfield.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/capabilities.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/change_notifier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/collections.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/consolidate_response.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/constants.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/diagnostics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/isolates.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/key.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/licenses.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/math.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/memory_allocations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/node.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/object.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/observer_list.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/persistent_hash_map.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/platform.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/print.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/serialization.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/service_extensions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/stack_frame.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/synchronous_future.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/unicode.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/arena.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/constants.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/converter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/drag.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/drag_details.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/eager.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/events.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/force_press.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/gesture_settings.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/hit_test.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/long_press.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/lsq_solver.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/monodrag.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/multidrag.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/multitap.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/pointer_router.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/recognizer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/resampler.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/scale.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/tap.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/team.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/velocity_tracker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/about.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_buttons.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_chip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_icons_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/animated_icons.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/arc.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/autocomplete.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/back_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/badge.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/badge_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/banner.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/banner_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_app_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_app_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_navigation_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_sheet.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_sheet_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_style.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_style_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/calendar_date_picker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/card.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/card_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox_list_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/chip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/chip_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/choice_chip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/circle_avatar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/color_scheme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/colors.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/constants.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/curves.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table_source.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date_picker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date_picker_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dialog.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dialog_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/divider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/divider_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer_header.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown_menu.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown_menu_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevated_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevated_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevation_overlay.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expand_icon.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_panel.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_tile_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/feedback.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filled_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filled_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filter_chip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/flexible_space_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button_location.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/flutter_logo.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/grid_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/grid_tile_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icon_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icon_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icons.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_decoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_highlight.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_ripple.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_sparkle.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_splash.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_well.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_chip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_date_picker_form_field.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_decorator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/list_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/list_tile_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/magnifier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_localizations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_state.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_state_mixin.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_anchor.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_style.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/mergeable_material.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_drawer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_drawer_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_rail.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_rail_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/no_splash.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/outlined_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/outlined_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/page.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/page_transitions_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/paginated_data_table.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/popup_menu.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/popup_menu_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/progress_indicator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/progress_indicator_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio_list_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/range_slider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/refresh_indicator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/reorderable_list.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scaffold.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scrollbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scrollbar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_anchor.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_view_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/segmented_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/segmented_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/selectable_text.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/selection_area.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/shaders/ink_sparkle.frag +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/shadows.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/slider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/slider_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/snack_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/snack_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/stepper.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch_list_tile.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_bar_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_controller.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_indicator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tabs.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_button_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_field.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_form_field.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/theme_data.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time_picker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time_picker_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggle_buttons.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggle_buttons_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggleable.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip_visibility.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/typography.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/user_accounts_drawer_header.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/_network_image_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/alignment.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/basic_types.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/beveled_rectangle_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/border_radius.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/borders.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_decoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_fit.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_shadow.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/circle_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/clip.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/colors.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/continuous_rectangle_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/decoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/decoration_image.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/edge_insets.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/flutter_logo.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/fractional_offset.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/geometry.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/gradient.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_cache.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_decoder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_provider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_resolution.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_stream.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/inline_span.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/linear_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/matrix_utils.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/notched_shapes.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/oval_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/paint_utilities.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/placeholder_span.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/rounded_rectangle_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/shader_warm_up.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/shape_decoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/stadium_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/star_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/strut_style.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_painter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_span.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_style.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/clamped_simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/friction_simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/gravity_simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/spring_simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/tolerance.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/utils.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/animated_size.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/box.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/custom_layout.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/custom_paint.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/editable.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/error.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/flex.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/flow.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/image.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/layer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/layout_helper.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/list_body.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/list_wheel_viewport.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/mouse_tracker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/object.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/paragraph.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/performance_overlay.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/platform_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/proxy_box.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/proxy_sliver.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/rotated_box.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/selection.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/service_extensions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/shifted_box.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_fill.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_grid.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_list.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_padding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_persistent_header.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/stack.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/table.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/table_border.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/texture.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/tweens.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/viewport.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/viewport_offset.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/wrap.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/priority.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/service_extensions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/ticker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics_event.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics_service.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/asset_bundle.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/asset_manifest.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/autofill.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/binary_messenger.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/browser_context_menu.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/clipboard.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/deferred_component.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/font_loader.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/haptic_feedback.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/hardware_keyboard.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_inserted_content.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_key.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_maps.g.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/message_codec.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/message_codecs.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/mouse_cursor.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/mouse_tracking.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/platform_channel.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/platform_views.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_android.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_ios.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_linux.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_macos.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_web.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_windows.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/restoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/service_extensions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/spell_check.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_channels.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_chrome.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_navigator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_sound.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_boundary.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_editing.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_editing_delta.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_formatter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_input.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_layout_metrics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/undo_manager.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/actions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_cross_fade.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_scroll_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_size.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_switcher.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/annotated_region.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/app.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/async.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/autocomplete.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/autofill.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/automatic_keep_alive.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/banner.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/basic.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/color_filter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/constants.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/container.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/context_menu_button_item.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/context_menu_controller.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/debug.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/default_selection_style.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/dismissible.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/disposable_build_context.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/drag_target.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/dual_transition_builder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/editable_text.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/fade_in_image.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_manager.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_scope.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_traversal.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/form.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/framework.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/gesture_detector.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/grid_paper.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/heroes.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_data.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_theme_data.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image_filter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image_icon.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/implicit_animations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_model.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_notifier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_theme.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/interactive_viewer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/keyboard_listener.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/layout_builder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/localizations.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/lookup_boundary.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/magnifier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/media_query.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/modal_barrier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/navigation_toolbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/navigator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/nested_scroll_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/notification_listener.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/orientation_builder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overflow_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overlay.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overscroll_indicator.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/page_storage.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/page_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/pages.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/performance_overlay.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/placeholder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_menu_bar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/preferred_size.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/primary_scroll_controller.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/reorderable_list.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/restoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/restoration_properties.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/router.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/routes.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/safe_area.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_activity.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_configuration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_context.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_controller.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_delegate.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_metrics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_notification.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_notification_observer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_physics.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_position.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollable.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollable_helpers.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollbar.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/selectable_region.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/selection_container.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/semantics_debugger.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/service_extensions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/shared_app_data.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/shortcuts.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/single_child_scroll_view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_fill.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_layout_builder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_persistent_header.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/snapshot_widget.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/spacer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/spell_check.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/status_transitions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/table.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tap_region.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_editing_intents.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/texture.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/ticker_provider.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/title.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/transitions.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tween_animation_builder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/undo_history.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/unique_widget.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/value_listenable_builder.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/view.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/viewport.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/visibility.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/widget_inspector.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/widget_span.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/will_pop_scope.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/widgets.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/flutter_test.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_binding_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_goldens_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_matchers_io.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/accessibility.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/all_elements.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/animation_sheet.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/binding.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/controller.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/deprecated.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/event_simulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/finders.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/frame_timing_summarizer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/goldens.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/image.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/matchers.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/nonconst.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/platform.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/restoration.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/stack_manipulation.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_async_utils.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_compat.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_default_binary_messenger.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_exception_reporter.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_pointer.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_text_input.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_text_input_key_handler.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_vsync.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/widget_tester.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/window.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/common.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart +/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/macos.dart diff --git a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh index 634a032f7..701777f05 100755 --- a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,13 +1,13 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/stable" +export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6" export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=1.0.0" export "FLUTTER_BUILD_NUMBER=1" -export "DART_DEFINES=RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC81NWVhZTY4NjRiMjk2ZGQ5ZjQzYjJjYzc1NzdlYzI1NmU1YzMyYThkLw==" +export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw==" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" diff --git a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj index 5da3a824e..de4d66361 100644 --- a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj @@ -227,7 +227,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1510; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { diff --git a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ae8764fa2..0b1d244f9 100644 --- a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ get values => [solid, soft]; +} + +class AvatarSize extends IAvatarVariant { + const AvatarSize(super.name); + + static const size1 = AvatarSize('remix.avatar.size1'); + static const size2 = AvatarSize('remix.avatar.size2'); + static const size3 = AvatarSize('remix.avatar.size3'); + static const size4 = AvatarSize('remix.avatar.size4'); + static const size5 = AvatarSize('remix.avatar.size5'); + static const size6 = AvatarSize('remix.avatar.size6'); + static const size7 = AvatarSize('remix.avatar.size7'); + static const size8 = AvatarSize('remix.avatar.size8'); + + static List get values => [ + size1, + size2, + size3, + size4, + size5, + size6, + size7, + size8, + ]; +} + +class AvatarRadius extends IAvatarVariant { + const AvatarRadius(super.name); + + static const none = AvatarRadius('remix.avatar.none'); + static const small = AvatarRadius('remix.avatar.small'); + static const medium = AvatarRadius('remix.avatar.medium'); + static const large = AvatarRadius('remix.avatar.large'); + static const full = AvatarRadius('remix.avatar.full'); + + static List get values => [none, small, medium, large, full]; +} diff --git a/packages/remix/lib/components/avatar/avatar_spec.dart b/packages/remix/lib/components/avatar/avatar_spec.dart new file mode 100644 index 000000000..24922f58f --- /dev/null +++ b/packages/remix/lib/components/avatar/avatar_spec.dart @@ -0,0 +1,26 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'avatar_spec.g.dart'; + +@MixableSpec() +base class AvatarSpec extends Spec with _$AvatarSpec { + final BoxSpec container; + final ImageSpec image; + final TextSpec fallback; + + /// {@macro avatar_spec_of} + static const of = _$AvatarSpec.of; + + static const from = _$AvatarSpec.from; + + const AvatarSpec({ + BoxSpec? container, + ImageSpec? image, + TextSpec? fallback, + super.animated, + }) : container = container ?? const BoxSpec(), + image = image ?? const ImageSpec(), + fallback = fallback ?? const TextSpec(); +} diff --git a/packages/remix/lib/components/avatar/avatar_spec.g.dart b/packages/remix/lib/components/avatar/avatar_spec.g.dart new file mode 100644 index 000000000..c60a12899 --- /dev/null +++ b/packages/remix/lib/components/avatar/avatar_spec.g.dart @@ -0,0 +1,223 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'avatar_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$AvatarSpec on Spec { + static AvatarSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const AvatarSpec(); + } + + /// {@template avatar_spec_of} + /// Retrieves the [AvatarSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [AvatarSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [AvatarSpec]. + /// + /// Example: + /// + /// ```dart + /// final avatarSpec = AvatarSpec.of(context); + /// ``` + /// {@endtemplate} + static AvatarSpec of(BuildContext context) { + return _$AvatarSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [AvatarSpec] but with the given fields + /// replaced with the new values. + @override + AvatarSpec copyWith({ + BoxSpec? container, + ImageSpec? image, + TextSpec? fallback, + AnimatedData? animated, + }) { + return AvatarSpec( + container: container ?? _$this.container, + image: image ?? _$this.image, + fallback: fallback ?? _$this.fallback, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [AvatarSpec] and another [AvatarSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [AvatarSpec] is returned. When [t] is 1.0, the [other] [AvatarSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [AvatarSpec] is returned. + /// + /// If [other] is null, this method returns the current [AvatarSpec] instance. + /// + /// The interpolation is performed on each property of the [AvatarSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container]. + /// - [ImageSpec.lerp] for [image]. + /// - [TextSpec.lerp] for [fallback]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [AvatarSpec] is used. Otherwise, the value + /// from the [other] [AvatarSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [AvatarSpec] configurations. + @override + AvatarSpec lerp(AvatarSpec? other, double t) { + if (other == null) return _$this; + + return AvatarSpec( + container: _$this.container.lerp(other.container, t), + image: _$this.image.lerp(other.image, t), + fallback: _$this.fallback.lerp(other.fallback, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [AvatarSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [AvatarSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.image, + _$this.fallback, + _$this.animated, + ]; + + AvatarSpec get _$this => this as AvatarSpec; +} + +/// Represents the attributes of a [AvatarSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [AvatarSpec]. +/// +/// Use this class to configure the attributes of a [AvatarSpec] and pass it to +/// the [AvatarSpec] constructor. +final class AvatarSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final ImageSpecAttribute? image; + final TextSpecAttribute? fallback; + + const AvatarSpecAttribute({ + this.container, + this.image, + this.fallback, + super.animated, + }); + + /// Resolves to [AvatarSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final avatarSpec = AvatarSpecAttribute(...).resolve(mix); + /// ``` + @override + AvatarSpec resolve(MixData mix) { + return AvatarSpec( + container: container?.resolve(mix), + image: image?.resolve(mix), + fallback: fallback?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [AvatarSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [AvatarSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + AvatarSpecAttribute merge(covariant AvatarSpecAttribute? other) { + if (other == null) return this; + + return AvatarSpecAttribute( + container: container?.merge(other.container) ?? other.container, + image: image?.merge(other.image) ?? other.image, + fallback: fallback?.merge(other.fallback) ?? other.fallback, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [AvatarSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [AvatarSpecAttribute] instances for equality. + @override + List get props => [ + container, + image, + fallback, + animated, + ]; +} + +/// Utility class for configuring [AvatarSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [AvatarSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [AvatarSpecAttribute]. +base class AvatarSpecUtility + extends SpecUtility { + /// Utility for defining [AvatarSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [AvatarSpecAttribute.image] + late final image = ImageSpecUtility((v) => only(image: v)); + + /// Utility for defining [AvatarSpecAttribute.fallback] + late final fallback = TextSpecUtility((v) => only(fallback: v)); + + /// Utility for defining [AvatarSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + AvatarSpecUtility(super.builder); + + static final self = AvatarSpecUtility((v) => v); + + /// Returns a new [AvatarSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + ImageSpecAttribute? image, + TextSpecAttribute? fallback, + AnimatedDataDto? animated, + }) { + return builder(AvatarSpecAttribute( + container: container, + image: image, + fallback: fallback, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [AvatarSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [AvatarSpec] specifications. +class AvatarSpecTween extends Tween { + AvatarSpecTween({ + super.begin, + super.end, + }); + + @override + AvatarSpec lerp(double t) { + if (begin == null && end == null) return const AvatarSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/avatar/avatar_widget.dart b/packages/remix/lib/components/avatar/avatar_widget.dart new file mode 100644 index 000000000..e69de29bb diff --git a/packages/remix/lib/components/badge/badge.style.dart b/packages/remix/lib/components/badge/badge.style.dart new file mode 100644 index 000000000..ce140fb72 --- /dev/null +++ b/packages/remix/lib/components/badge/badge.style.dart @@ -0,0 +1,73 @@ +// ignore_for_file: camel_case_types + +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/badge/badge.variants.dart'; +import 'package:remix/components/badge/badge_spec.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _badge = BadgeSpecUtility.self; +final _container = _badge.container; +final _label = _badge.label; + +Style get _baseStyle => Style( + _container.borderRadius(99), + _label.style.fontWeight(FontWeight.w500), + ); + +Style get _solidVariant => Style( + _container.color($rx.accent9()), + _label.style.color($rx.neutral1()), + ); + +Style get _softVariant => Style( + _container.color($rx.accent3A()), + _label.style.color($rx.accent11A()), + ); + +Style get _surfaceVariant => Style( + _container.color($rx.accent2A()), + _label.style.color($rx.accent11A()), + ); + +Style get _outlineVariant => Style( + _container.color(Colors.transparent), + _container.border.width(1), + _container.border.color($rx.accent8A()), + _label.style.color($rx.accent11A()), + ); + +final _smallVariant = Style( + _container.padding.vertical($rx.space1()), + _container.padding.horizontal($rx.space2()), + _label.style.as($rx.text1()), +); + +final _mediumVariant = Style( + _container.padding.vertical($rx.space1()), + _container.padding.horizontal($rx.space3()), + _label.style.as($rx.text2()), +); + +final _largeVariant = Style( + _container.padding.vertical($rx.space2()), + _container.padding.horizontal($rx.space4()), + _label.style.as($rx.text3()), +); + +Style buildDefaultBadgeStyle() { + return Style( + _baseStyle(), + + /// Size Variants + BadgeSize.small(_smallVariant()), + BadgeSize.medium(_mediumVariant()), + BadgeSize.large(_largeVariant()), + + // Type variants + BadgeVariant.solid(_solidVariant()), + BadgeVariant.soft(_softVariant()), + BadgeVariant.surface(_surfaceVariant()), + BadgeVariant.outline(_outlineVariant()), + ); +} diff --git a/packages/remix/lib/components/badge/badge.variants.dart b/packages/remix/lib/components/badge/badge.variants.dart new file mode 100644 index 000000000..42d7bf3fe --- /dev/null +++ b/packages/remix/lib/components/badge/badge.variants.dart @@ -0,0 +1,26 @@ +import 'package:mix/mix.dart'; + +abstract interface class IBadgeVariant extends Variant { + const IBadgeVariant(super.name); +} + +class BadgeVariant extends IBadgeVariant { + const BadgeVariant(super.name); + + static const solid = BadgeVariant('remix.badge.solid'); + static const soft = BadgeVariant('remix.badge.soft'); + static const surface = BadgeVariant('remix.badge.surface'); + static const outline = BadgeVariant('remix.badge.outline'); + + static List get values => [solid, soft, surface, outline]; +} + +class BadgeSize extends IBadgeVariant { + const BadgeSize(super.name); + + static const small = BadgeSize('remix.badge.small'); + static const medium = BadgeSize('remix.badge.medium'); + static const large = BadgeSize('remix.badge.large'); + + static List get values => [small, medium, large]; +} diff --git a/packages/remix/lib/components/badge/badge_spec.dart b/packages/remix/lib/components/badge/badge_spec.dart new file mode 100644 index 000000000..5992f9752 --- /dev/null +++ b/packages/remix/lib/components/badge/badge_spec.dart @@ -0,0 +1,23 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'badge_spec.g.dart'; + +@MixableSpec() +base class BadgeSpec extends Spec with _$BadgeSpec { + final BoxSpec container; + final TextSpec label; + + /// {@macro badge_spec_of} + static const of = _$BadgeSpec.of; + + static const from = _$BadgeSpec.from; + + const BadgeSpec({ + BoxSpec? container, + TextSpec? label, + super.animated, + }) : container = container ?? const BoxSpec(), + label = label ?? const TextSpec(); +} diff --git a/packages/remix/lib/components/badge/badge_spec.g.dart b/packages/remix/lib/components/badge/badge_spec.g.dart new file mode 100644 index 000000000..58bcae518 --- /dev/null +++ b/packages/remix/lib/components/badge/badge_spec.g.dart @@ -0,0 +1,208 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'badge_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$BadgeSpec on Spec { + static BadgeSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const BadgeSpec(); + } + + /// {@template badge_spec_of} + /// Retrieves the [BadgeSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [BadgeSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [BadgeSpec]. + /// + /// Example: + /// + /// ```dart + /// final badgeSpec = BadgeSpec.of(context); + /// ``` + /// {@endtemplate} + static BadgeSpec of(BuildContext context) { + return _$BadgeSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [BadgeSpec] but with the given fields + /// replaced with the new values. + @override + BadgeSpec copyWith({ + BoxSpec? container, + TextSpec? label, + AnimatedData? animated, + }) { + return BadgeSpec( + container: container ?? _$this.container, + label: label ?? _$this.label, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [BadgeSpec] and another [BadgeSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [BadgeSpec] is returned. When [t] is 1.0, the [other] [BadgeSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [BadgeSpec] is returned. + /// + /// If [other] is null, this method returns the current [BadgeSpec] instance. + /// + /// The interpolation is performed on each property of the [BadgeSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container]. + /// - [TextSpec.lerp] for [label]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [BadgeSpec] is used. Otherwise, the value + /// from the [other] [BadgeSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [BadgeSpec] configurations. + @override + BadgeSpec lerp(BadgeSpec? other, double t) { + if (other == null) return _$this; + + return BadgeSpec( + container: _$this.container.lerp(other.container, t), + label: _$this.label.lerp(other.label, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [BadgeSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [BadgeSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.label, + _$this.animated, + ]; + + BadgeSpec get _$this => this as BadgeSpec; +} + +/// Represents the attributes of a [BadgeSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [BadgeSpec]. +/// +/// Use this class to configure the attributes of a [BadgeSpec] and pass it to +/// the [BadgeSpec] constructor. +final class BadgeSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final TextSpecAttribute? label; + + const BadgeSpecAttribute({ + this.container, + this.label, + super.animated, + }); + + /// Resolves to [BadgeSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final badgeSpec = BadgeSpecAttribute(...).resolve(mix); + /// ``` + @override + BadgeSpec resolve(MixData mix) { + return BadgeSpec( + container: container?.resolve(mix), + label: label?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [BadgeSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [BadgeSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + BadgeSpecAttribute merge(covariant BadgeSpecAttribute? other) { + if (other == null) return this; + + return BadgeSpecAttribute( + container: container?.merge(other.container) ?? other.container, + label: label?.merge(other.label) ?? other.label, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [BadgeSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [BadgeSpecAttribute] instances for equality. + @override + List get props => [ + container, + label, + animated, + ]; +} + +/// Utility class for configuring [BadgeSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [BadgeSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [BadgeSpecAttribute]. +base class BadgeSpecUtility + extends SpecUtility { + /// Utility for defining [BadgeSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [BadgeSpecAttribute.label] + late final label = TextSpecUtility((v) => only(label: v)); + + /// Utility for defining [BadgeSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + BadgeSpecUtility(super.builder); + + static final self = BadgeSpecUtility((v) => v); + + /// Returns a new [BadgeSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + TextSpecAttribute? label, + AnimatedDataDto? animated, + }) { + return builder(BadgeSpecAttribute( + container: container, + label: label, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [BadgeSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [BadgeSpec] specifications. +class BadgeSpecTween extends Tween { + BadgeSpecTween({ + super.begin, + super.end, + }); + + @override + BadgeSpec lerp(double t) { + if (begin == null && end == null) return const BadgeSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/badge/badget_widget.dart b/packages/remix/lib/components/badge/badget_widget.dart new file mode 100644 index 000000000..74df0876c --- /dev/null +++ b/packages/remix/lib/components/badge/badget_widget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/badge/badge.style.dart'; +import 'package:remix/components/badge/badge.variants.dart'; +import 'package:remix/components/badge/badge_spec.dart'; + +class RxBadge extends StatelessWidget { + const RxBadge({ + super.key, + required this.label, + this.style, + this.size = BadgeSize.medium, + this.variant = BadgeVariant.soft, + }); + + final String label; + + /// Additional custom styling for the badge. + /// + /// This allows you to override or extend the default badge styling. + final Style? style; + + final BadgeSize size; + final BadgeVariant variant; + + Style _buildStyle() { + return buildDefaultBadgeStyle() + .merge(style) + .applyVariants([size, variant]).animate(); + } + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spec = BadgeSpec.of(context); + + return spec.container( + child: spec.label(label), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 4225a597f..84823250a 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -6,14 +6,14 @@ import 'package:remix/components/button/button.variants.dart'; import 'package:remix/components/button/button_spec.dart'; import 'package:remix/tokens/remix_tokens.dart'; -final _button = ButtonSpecUtility.self; -final _label = _button.label; -final _spinner = _button.spinner; -final _container = _button.container; -final _flex = _button.flex; +final _util = ButtonSpecUtility.self; +final _label = _util.label; +final _spinner = _util.spinner; +final _container = _util.container; +final _flex = _util.flex; /// This applies to the icon, label, and spinner -final _foreground = _button.foreground; +final _foreground = _util.foreground; Style get _baseStyle => Style( _flex.gap(0), @@ -31,110 +31,100 @@ Style get _baseStyle => Style( ), ); -final _onDisabledBackground = Style( - $on.disabled( - _container.color( - $rx.neutral3A(), - ), - ), -); - -final _onDisabledForeground = Style( - $on.disabled( - _foreground(color: $rx.neutral7A()), - ), -); - -final _solidVariant = Style( - _container.color($rx.accent9()), - _foreground(color: $rx.neutral1()), - $on.hover( - _container.color($rx.accent12()), - ), - _onDisabledBackground(), -); - -final _softVariant = Style( - _container.color($rx.accent3A()), - _foreground(color: $rx.accent11A()), - $on.hover( - _container.color($rx.accent4A()), - ), - _onDisabledBackground(), -); - -final _outlineVariant = Style( - _container.color(Colors.transparent), - _container.border.width(1), - _container.border.strokeAlign(0), - _container.border.color($rx.accent8A()), - _foreground(color: $rx.accent11A()), - $on.hover( - _container.color( - $rx.accent2A(), - ), - ), - $on.disabled( - _container.border.color( - $rx.neutral8A(), - ), - _container.color.transparent(), - ), -); -final _surfaceVariant = Style( - _outlineVariant(), - _container.color($rx.accent2A()), - $on.hover( - _container.color($rx.accent3A()), - _container.border.color($rx.accent8A()), - ), - $on.disabled( - _container.color( - $rx.neutral2A(), - ), - ), -); - -final _ghostVariant = Style( - _container.border.style.none(), - _container.color(Colors.transparent), - _foreground(color: $rx.accent11A()), - $on.hover( - _container.color($rx.accent3A()), - ), -); - -final _smallVariant = Style( - _label.style.as($rx.text1()), - _container.padding.vertical($rx.space1()), - _container.padding.horizontal($rx.space2()), - _flex.gap($rx.space1()), - _foreground(size: 12), -); - -final _mediumVariant = Style( - _container.padding.vertical($rx.space2()), - _container.padding.horizontal($rx.space3()), - _flex.gap($rx.space2()), - _label.style.as($rx.text2()), - _foreground(size: 14), -); - -final _largeVariant = Style( - _container.padding.vertical($rx.space2()), - _container.padding.horizontal($rx.space4()), - _flex.gap($rx.space3()), - _label.style.as($rx.text3()), - _foreground(size: 16), -); - -final _xLargeVariant = Style( - _container.padding.vertical($rx.space3()), - _container.padding.horizontal($rx.space5()), - _flex.gap($rx.space3()), - _label.style.as($rx.text4()), - _foreground(size: 18), -); +Style get _onDisabledForeground => Style( + $on.disabled( + _foreground.color.ref($rx.neutral7A), + ), + ); + +Style get _solidVariant => Style( + _container.color.ref($rx.accent9), + _foreground.color.ref($rx.neutral1), + $on.hover( + _container.color.ref($rx.accent12), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + ); + +Style get _softVariant => Style( + _container.color.ref($rx.accent3A), + _foreground.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent4A), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + ); + +Style get _outlineVariant => Style( + _container.color(Colors.transparent), + _container.border.width(1), + _container.border.strokeAlign(0), + _container.border.color.ref($rx.accent8A), + _foreground.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent2A), + ), + $on.disabled( + _container.border.color.ref($rx.neutral8A), + _container.color.transparent(), + ), + ); +Style get _surfaceVariant => Style( + _outlineVariant(), + _container.color.ref($rx.accent3A), + $on.hover( + _container.color.ref($rx.accent4A), + _container.border.color.ref($rx.accent8A), + ), + $on.disabled( + _container.color.ref($rx.neutral2A), + ), + ); + +Style get _ghostVariant => Style( + _container.border.style.none(), + _container.color(Colors.transparent), + _foreground.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent3A), + ), + ); + +Style get _smallVariant => Style( + _label.style.ref($rx.text1), + _container.padding.vertical.ref($rx.space1), + _container.padding.horizontal.ref($rx.space2), + _flex.gap.ref($rx.space1), + _foreground.size(12), + ); + +Style get _mediumVariant => Style( + _container.padding.vertical.ref($rx.space2), + _container.padding.horizontal.ref($rx.space3), + _flex.gap.ref($rx.space2), + _label.style.ref($rx.text2), + _foreground.size(14), + ); + +Style get _largeVariant => Style( + _container.padding.vertical.ref($rx.space2), + _container.padding.horizontal.ref($rx.space4), + _flex.gap.ref($rx.space3), + _label.style.ref($rx.text3), + _foreground.size(16), + ); + +Style get _xLargeVariant => Style( + _container.padding.vertical.ref($rx.space3), + _container.padding.horizontal.ref($rx.space5), + _flex.gap.ref($rx.space3), + _label.style.ref($rx.text4), + _foreground.size(18), + ); Style buildDefaultButtonStyle() { return Style( @@ -158,16 +148,21 @@ Style buildDefaultButtonStyle() { } extension ButtonSpecUtilityX on ButtonSpecUtility { - Attribute foreground({Color? color, double? size}) { - final style = Style.create([ - if (color != null) ...[ - label.style.color(color), - icon.color(color), - spinner.color(color), - ], - if (size != null) ...[icon.size(size), spinner.size(size)], - ]); - - return style(); + ForegroundUtility get foreground => ForegroundUtility((v) { + return only().merge(label.style + .only(color: v.color) + .merge(icon.only(color: v.color, size: v.size)) + .merge(spinner.only(color: v.color, size: v.size))) as T; + }); +} + +class ForegroundUtility + extends MixUtility { + ForegroundUtility(super.builder); + late final color = ColorUtility((v) => only(color: v)); + + late final size = FontSizeUtility((v) => only(size: v)); + T only({ColorDto? color, double? size}) { + return builder((color: color, size: size)); } } diff --git a/packages/remix/lib/components/button/button.variants.dart b/packages/remix/lib/components/button/button.variants.dart index 9150ab590..2047c2739 100644 --- a/packages/remix/lib/components/button/button.variants.dart +++ b/packages/remix/lib/components/button/button.variants.dart @@ -1,11 +1,11 @@ -import 'package:mix/mix.dart'; +import 'package:remix/helpers/variant.dart'; -interface class IButtonVariant extends Variant { - const IButtonVariant(super.name); +interface class IButtonVariant extends RemixVariant { + const IButtonVariant(String name) : super('button.$name'); } class ButtonSize extends IButtonVariant { - const ButtonSize(super.name); + const ButtonSize(String name) : super('size.$name'); static const small = ButtonSize('small'); static const medium = ButtonSize('medium'); @@ -16,7 +16,7 @@ class ButtonSize extends IButtonVariant { } class ButtonVariant extends IButtonVariant { - const ButtonVariant(super.name); + const ButtonVariant(String name) : super('variant.$name'); static const solid = ButtonVariant('solid'); static const soft = ButtonVariant('soft'); diff --git a/packages/remix/lib/components/button/button.dart b/packages/remix/lib/components/button/button_widget.dart similarity index 100% rename from packages/remix/lib/components/button/button.dart rename to packages/remix/lib/components/button/button_widget.dart diff --git a/packages/remix/lib/components/checkbox/checkbox.dart b/packages/remix/lib/components/checkbox/checkbox.dart index 4ff145611..9d243c110 100644 --- a/packages/remix/lib/components/checkbox/checkbox.dart +++ b/packages/remix/lib/components/checkbox/checkbox.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:remix/components/checkbox/checkbox_spec.dart'; import 'package:remix/components/checkbox/checkbox_style.dart'; -import 'package:remix/components/checkbox/checkbox_variant.dart'; +import 'package:remix/components/checkbox/checkbox_variants.dart'; class RxCheckbox extends StatelessWidget { const RxCheckbox({ @@ -43,6 +43,7 @@ class RxCheckbox extends StatelessWidget { Widget build(BuildContext context) { return Pressable( onPress: disabled ? null : _handleOnPress, + enabled: !disabled, child: SpecBuilder( style: _buildStyle(), builder: (context) { diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart index d9751546c..96705fd75 100644 --- a/packages/remix/lib/components/checkbox/checkbox_style.dart +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -1,51 +1,101 @@ // ignore_for_file: camel_case_types +import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:remix/components/checkbox/checkbox_spec.dart'; -import 'package:remix/components/checkbox/checkbox_variant.dart'; +import 'package:remix/components/checkbox/checkbox_variants.dart'; +import 'package:remix/helpers/utility_extension.dart'; import 'package:remix/tokens/remix_tokens.dart'; -final _checkbox = CheckboxSpecUtility.self; -final _container = _checkbox.container; -final _icon = _checkbox.icon; +final _util = CheckboxSpecUtility.self; +final _container = _util.container; +final _icon = _util.icon; Style get _baseStyle => Style( _container.borderRadius(4), - _icon.color($rx.neutral1()), + ); + +Style get _onDisabledForeground => Style( + $on.disabled( + _icon.color.ref($rx.neutral7A), + ), ); Style get _solidVariant => Style( - _container.color($rx.accent9()), - _icon.color($rx.neutral1()), + _container.color.ref($rx.accent9), + _icon.color.ref($rx.neutral1), $on.hover( - _container.color($rx.accent12()), + _container.color.ref($rx.accent12), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), ), ); -final _disabledVariant = Style( - _container.color($rx.neutral3A()), - _container.border.color($rx.neutral5A()), - _icon.color($rx.neutral7A()), -); +Style get _softVariant => Style( + _container.color.ref($rx.accent3A), + _icon.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent4A), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + ); +Style get _outlineVariant => Style( + _container.color(Colors.transparent), + _container.border.color.ref($rx.accent8A), + _icon.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent2A), + ), + $on.disabled( + _container.border.color.ref($rx.neutral8A), + _container.color.transparent(), + ), + ); -final _smallVariant = Style( - _container.width(16), - _container.height(16), - _icon.size(12), -); +Style get _surfaceVariant => Style( + _outlineVariant(), + _container.color.ref($rx.accent3A), + $on.hover( + _container.color.ref($rx.accent4A), + _container.border.color.ref($rx.accent8A), + ), + $on.disabled( + _container.color.ref($rx.neutral2A), + ), + ); -final _mediumVariant = Style( - _container.width(20), - _container.height(20), - _icon.size(16), +final _ghostVariant = Style( + _container.border.style.none(), + _container.color(Colors.transparent), + _icon.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent3A), + ), ); -final _largeVariant = Style( - // _container.size(24), - _container.width(24), - _container.height(24), - _icon.size(20), -); +Style get _disabledVariant => Style( + _container.color.ref($rx.neutral3A), + _container.border.color.ref($rx.neutral5A), + _icon.color.ref($rx.neutral7A), + ); + +Style get _smallVariant => Style( + _container.size(16), + _icon.size(12), + ); + +Style get _mediumVariant => Style( + _container.size(20), + _icon.size(16), + ); + +Style get _largeVariant => Style( + _container.size(24), + _icon.size(20), + ); Style buildDefaultCheckboxStyle() { return Style( @@ -56,8 +106,14 @@ Style buildDefaultCheckboxStyle() { CheckboxSize.medium(_mediumVariant()), CheckboxSize.large(_largeVariant()), + _onDisabledForeground(), + // State variants CheckboxVariant.solid(_solidVariant()), + CheckboxVariant.soft(_softVariant()), + CheckboxVariant.surface(_surfaceVariant()), + CheckboxVariant.outline(_outlineVariant()), + CheckboxVariant.ghost(_ghostVariant()), $on.disabled(_disabledVariant()), ); } diff --git a/packages/remix/lib/components/checkbox/checkbox_variant.dart b/packages/remix/lib/components/checkbox/checkbox_variant.dart deleted file mode 100644 index be6228440..000000000 --- a/packages/remix/lib/components/checkbox/checkbox_variant.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:mix/mix.dart'; - -abstract interface class ICheckboxVariant extends Variant { - const ICheckboxVariant(super.name); -} - -class CheckboxState extends ICheckboxVariant { - const CheckboxState._(super.name); - - static const checked = CheckboxState._('remix.checkbox.checked'); - static const unchecked = CheckboxState._('remix.checkbox.unchecked'); -} - -class CheckboxVariant extends ICheckboxVariant { - const CheckboxVariant(super.name); - - static const solid = CheckboxVariant('remix.checkbox.solid'); - static const outline = CheckboxVariant('remix.checkbox.outline'); - static const surface = CheckboxVariant('remix.checkbox.surface'); - - static List get values => [solid, outline, surface]; -} - -class CheckboxSize extends ICheckboxVariant { - const CheckboxSize(super.name); - - static const small = CheckboxSize('remix.checkbox.small'); - static const medium = CheckboxSize('remix.checkbox.medium'); - static const large = CheckboxSize('remix.checkbox.large'); - - static List get values => [small, medium, large]; -} diff --git a/packages/remix/lib/components/checkbox/checkbox_variants.dart b/packages/remix/lib/components/checkbox/checkbox_variants.dart new file mode 100644 index 000000000..aabd45901 --- /dev/null +++ b/packages/remix/lib/components/checkbox/checkbox_variants.dart @@ -0,0 +1,40 @@ +import 'package:remix/helpers/variant.dart'; + +abstract interface class ICheckboxVariant extends RemixVariant { + const ICheckboxVariant(String name) : super('checkbox.$name'); +} + +class CheckboxStatus extends ICheckboxVariant { + const CheckboxStatus(String name) : super('status.$name'); + + static const checked = CheckboxStatus('checked'); + static const unchecked = CheckboxStatus('unchecked'); +} + +class CheckboxVariant extends ICheckboxVariant { + const CheckboxVariant(String name) : super('variant.$name'); + + static const solid = CheckboxVariant('solid'); + static const soft = CheckboxVariant('soft'); + static const surface = CheckboxVariant('surface'); + static const outline = CheckboxVariant('outline'); + static const ghost = CheckboxVariant('ghost'); + + static List get values => [ + solid, + soft, + surface, + outline, + ghost, + ]; +} + +class CheckboxSize extends ICheckboxVariant { + const CheckboxSize(String name) : super('size.$name'); + + static const small = CheckboxSize('small'); + static const medium = CheckboxSize('medium'); + static const large = CheckboxSize('large'); + + static List get values => [small, medium, large]; +} diff --git a/packages/remix/lib/components/checkbox_group/checkbox_group.dart b/packages/remix/lib/components/checkbox_group/checkbox_group.dart new file mode 100644 index 000000000..a803b0e14 --- /dev/null +++ b/packages/remix/lib/components/checkbox_group/checkbox_group.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/checkbox/checkbox.dart'; +import 'package:remix/components/checkbox/checkbox_variants.dart'; + +class RxCheckboxGroup extends StatefulWidget { + const RxCheckboxGroup({ + super.key, + required this.items, + this.defaultValue = const [], + this.onValueChange, + this.size = CheckboxSize.medium, + this.variant = CheckboxVariant.solid, + }); + + final List items; + final List defaultValue; + final ValueChanged>? onValueChange; + final CheckboxSize size; + final CheckboxVariant variant; + + @override + _RxCheckboxGroupState createState() => _RxCheckboxGroupState(); +} + +class _RxCheckboxGroupState extends State { + late List _selectedValues; + + @override + void initState() { + super.initState(); + _selectedValues = List.from(widget.defaultValue); + } + + void _handleValueChange(String value, bool isSelected) { + setState(() { + if (isSelected) { + _selectedValues.add(value); + } else { + _selectedValues.remove(value); + } + }); + + widget.onValueChange?.call(_selectedValues); + } + + @override + Widget build(BuildContext context) { + return Column( + children: widget.items.map((item) { + final isSelected = _selectedValues.contains(item.value); + return RxCheckbox( + value: isSelected, + onChanged: (isSelected) => _handleValueChange(item.value, isSelected), + size: widget.size, + variant: widget.variant, + style: item.style, + ); + }).toList(), + ); + } +} + +class RxCheckboxItem { + const RxCheckboxItem({ + required this.value, + this.style, + }); + + final String value; + final Style? style; +} diff --git a/packages/remix/lib/components/progress/progress.style.dart b/packages/remix/lib/components/progress/progress.style.dart new file mode 100644 index 000000000..8ba7385c7 --- /dev/null +++ b/packages/remix/lib/components/progress/progress.style.dart @@ -0,0 +1,87 @@ +// ignore_for_file: camel_case_types + +import 'package:mix/mix.dart'; +import 'package:remix/components/progress/progress.variants.dart'; +import 'package:remix/components/progress/progress_spec.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _progress = ProgressSpecUtility.self; +final _container = _progress.container; +final _track = _progress.track; +final _fill = _progress.fill; + +Style get _baseStyle => Style( + _container.borderRadius(99), + _track.color($rx.neutral3A()), + _fill.color($rx.accent9()), + ); + +final _smallVariant = Style( + _container.height(4), +); + +final _mediumVariant = Style( + _container.height(8), +); + +final _largeVariant = Style( + _container.height(12), +); + +final _classicVariant = Style( + _track.color($rx.neutral3A()), + _fill.color($rx.accent9()), +); + +final _surfaceVariant = Style( + _track.color($rx.neutral2A()), + _fill.color($rx.accent9()), +); + +final _softVariant = Style( + _track.color($rx.accent3A()), + _fill.color($rx.accent9()), +); + +final _noneRadiusVariant = Style( + _container.borderRadius(0), +); + +final _smallRadiusVariant = Style( + _container.borderRadius(4), +); + +final _mediumRadiusVariant = Style( + _container.borderRadius(8), +); + +final _largeRadiusVariant = Style( + _container.borderRadius(12), +); + +final _fullRadiusVariant = Style( + _container.borderRadius(99), +); + +Style buildDefaultProgressStyle() { + return Style( + _baseStyle(), + + /// Size Variants + ProgressSize.small(_smallVariant()), + ProgressSize.medium(_mediumVariant()), + ProgressSize.large(_largeVariant()), + + // Type variants + ProgressVariant.classic(_classicVariant()), + ProgressVariant.surface(_surfaceVariant()), + ProgressVariant.soft(_softVariant()), + + // Radius variants + ProgressRadius.none(_noneRadiusVariant()), + ProgressRadius.small(_smallRadiusVariant()), + ProgressRadius.medium(_mediumRadiusVariant()), + ProgressRadius.large(_largeRadiusVariant()), + ProgressRadius.full(_fullRadiusVariant()), + ); +} diff --git a/packages/remix/lib/components/progress/progress.variants.dart b/packages/remix/lib/components/progress/progress.variants.dart new file mode 100644 index 000000000..45026588b --- /dev/null +++ b/packages/remix/lib/components/progress/progress.variants.dart @@ -0,0 +1,37 @@ +import 'package:mix/mix.dart'; + +abstract interface class IProgressVariant extends Variant { + const IProgressVariant(super.name); +} + +class ProgressVariant extends IProgressVariant { + const ProgressVariant(super.name); + + static const classic = ProgressVariant('remix.progress.classic'); + static const surface = ProgressVariant('remix.progress.surface'); + static const soft = ProgressVariant('remix.progress.soft'); + + static List get values => [classic, surface, soft]; +} + +class ProgressSize extends IProgressVariant { + const ProgressSize(super.name); + + static const small = ProgressSize('remix.progress.small'); + static const medium = ProgressSize('remix.progress.medium'); + static const large = ProgressSize('remix.progress.large'); + + static List get values => [small, medium, large]; +} + +class ProgressRadius extends IProgressVariant { + const ProgressRadius(super.name); + + static const none = ProgressRadius('remix.progress.none'); + static const small = ProgressRadius('remix.progress.small'); + static const medium = ProgressRadius('remix.progress.medium'); + static const large = ProgressRadius('remix.progress.large'); + static const full = ProgressRadius('remix.progress.full'); + + static List get values => [none, small, medium, large, full]; +} diff --git a/packages/remix/lib/components/progress/progress_spec.dart b/packages/remix/lib/components/progress/progress_spec.dart new file mode 100644 index 000000000..d087d7016 --- /dev/null +++ b/packages/remix/lib/components/progress/progress_spec.dart @@ -0,0 +1,26 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'progress_spec.g.dart'; + +@MixableSpec() +base class ProgressSpec extends Spec with _$ProgressSpec { + final BoxSpec container; + final BoxSpec track; + final BoxSpec fill; + + /// {@macro progress_spec_of} + static const of = _$ProgressSpec.of; + + static const from = _$ProgressSpec.from; + + const ProgressSpec({ + BoxSpec? container, + BoxSpec? track, + BoxSpec? fill, + super.animated, + }) : container = container ?? const BoxSpec(), + track = track ?? const BoxSpec(), + fill = fill ?? const BoxSpec(); +} diff --git a/packages/remix/lib/components/progress/progress_spec.g.dart b/packages/remix/lib/components/progress/progress_spec.g.dart new file mode 100644 index 000000000..c4b5ba787 --- /dev/null +++ b/packages/remix/lib/components/progress/progress_spec.g.dart @@ -0,0 +1,221 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'progress_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$ProgressSpec on Spec { + static ProgressSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const ProgressSpec(); + } + + /// {@template progress_spec_of} + /// Retrieves the [ProgressSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [ProgressSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [ProgressSpec]. + /// + /// Example: + /// + /// ```dart + /// final progressSpec = ProgressSpec.of(context); + /// ``` + /// {@endtemplate} + static ProgressSpec of(BuildContext context) { + return _$ProgressSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [ProgressSpec] but with the given fields + /// replaced with the new values. + @override + ProgressSpec copyWith({ + BoxSpec? container, + BoxSpec? track, + BoxSpec? fill, + AnimatedData? animated, + }) { + return ProgressSpec( + container: container ?? _$this.container, + track: track ?? _$this.track, + fill: fill ?? _$this.fill, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [ProgressSpec] and another [ProgressSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [ProgressSpec] is returned. When [t] is 1.0, the [other] [ProgressSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [ProgressSpec] is returned. + /// + /// If [other] is null, this method returns the current [ProgressSpec] instance. + /// + /// The interpolation is performed on each property of the [ProgressSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container] and [track] and [fill]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [ProgressSpec] is used. Otherwise, the value + /// from the [other] [ProgressSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [ProgressSpec] configurations. + @override + ProgressSpec lerp(ProgressSpec? other, double t) { + if (other == null) return _$this; + + return ProgressSpec( + container: _$this.container.lerp(other.container, t), + track: _$this.track.lerp(other.track, t), + fill: _$this.fill.lerp(other.fill, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [ProgressSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [ProgressSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.track, + _$this.fill, + _$this.animated, + ]; + + ProgressSpec get _$this => this as ProgressSpec; +} + +/// Represents the attributes of a [ProgressSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [ProgressSpec]. +/// +/// Use this class to configure the attributes of a [ProgressSpec] and pass it to +/// the [ProgressSpec] constructor. +final class ProgressSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final BoxSpecAttribute? track; + final BoxSpecAttribute? fill; + + const ProgressSpecAttribute({ + this.container, + this.track, + this.fill, + super.animated, + }); + + /// Resolves to [ProgressSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final progressSpec = ProgressSpecAttribute(...).resolve(mix); + /// ``` + @override + ProgressSpec resolve(MixData mix) { + return ProgressSpec( + container: container?.resolve(mix), + track: track?.resolve(mix), + fill: fill?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [ProgressSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [ProgressSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + ProgressSpecAttribute merge(covariant ProgressSpecAttribute? other) { + if (other == null) return this; + + return ProgressSpecAttribute( + container: container?.merge(other.container) ?? other.container, + track: track?.merge(other.track) ?? other.track, + fill: fill?.merge(other.fill) ?? other.fill, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [ProgressSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [ProgressSpecAttribute] instances for equality. + @override + List get props => [ + container, + track, + fill, + animated, + ]; +} + +/// Utility class for configuring [ProgressSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [ProgressSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [ProgressSpecAttribute]. +base class ProgressSpecUtility + extends SpecUtility { + /// Utility for defining [ProgressSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [ProgressSpecAttribute.track] + late final track = BoxSpecUtility((v) => only(track: v)); + + /// Utility for defining [ProgressSpecAttribute.fill] + late final fill = BoxSpecUtility((v) => only(fill: v)); + + /// Utility for defining [ProgressSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + ProgressSpecUtility(super.builder); + + static final self = ProgressSpecUtility((v) => v); + + /// Returns a new [ProgressSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + BoxSpecAttribute? track, + BoxSpecAttribute? fill, + AnimatedDataDto? animated, + }) { + return builder(ProgressSpecAttribute( + container: container, + track: track, + fill: fill, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [ProgressSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [ProgressSpec] specifications. +class ProgressSpecTween extends Tween { + ProgressSpecTween({ + super.begin, + super.end, + }); + + @override + ProgressSpec lerp(double t) { + if (begin == null && end == null) return const ProgressSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/progress/progress_widget.dart b/packages/remix/lib/components/progress/progress_widget.dart new file mode 100644 index 000000000..23a930724 --- /dev/null +++ b/packages/remix/lib/components/progress/progress_widget.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/progress/progress.style.dart'; +import 'package:remix/components/progress/progress.variants.dart'; +import 'package:remix/components/progress/progress_spec.dart'; + +class RxProgress extends StatelessWidget { + const RxProgress({ + super.key, + this.value = 0.0, + this.size = ProgressSize.medium, + this.variant = ProgressVariant.surface, + this.highContrast = false, + this.radius = ProgressRadius.none, + this.duration, + }); + + final double value; + final ProgressSize size; + final ProgressVariant variant; + + final bool highContrast; + final ProgressRadius radius; + final Duration? duration; + + Style _buildStyle() { + return buildDefaultProgressStyle().applyVariants( + [size, variant, radius], + ).animate(); + } + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spec = ProgressSpec.of(context); + + final FillWidget = spec.fill.copyWith( + width: value * 100, + ); + + return spec.container( + child: Stack( + fit: StackFit.expand, + children: [ + spec.track(), + FillWidget(), + ], + ), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/radio/radio_spec.dart b/packages/remix/lib/components/radio/radio_spec.dart new file mode 100644 index 000000000..9da3047c5 --- /dev/null +++ b/packages/remix/lib/components/radio/radio_spec.dart @@ -0,0 +1,23 @@ +import 'package:flutter/cupertino.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'radio_spec.g.dart'; + +@MixableSpec() +base class RadioSpec extends Spec with _$RadioSpec { + final BoxSpec container; + final BoxSpec indicator; + + /// {@macro radio_spec_of} + static const of = _$RadioSpec.of; + + static const from = _$RadioSpec.from; + + const RadioSpec({ + BoxSpec? container, + BoxSpec? indicator, + super.animated, + }) : container = container ?? const BoxSpec(), + indicator = indicator ?? const BoxSpec(); +} diff --git a/packages/remix/lib/components/radio/radio_spec.g.dart b/packages/remix/lib/components/radio/radio_spec.g.dart new file mode 100644 index 000000000..32011b898 --- /dev/null +++ b/packages/remix/lib/components/radio/radio_spec.g.dart @@ -0,0 +1,207 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'radio_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$RadioSpec on Spec { + static RadioSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const RadioSpec(); + } + + /// {@template radio_spec_of} + /// Retrieves the [RadioSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [RadioSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [RadioSpec]. + /// + /// Example: + /// + /// ```dart + /// final radioSpec = RadioSpec.of(context); + /// ``` + /// {@endtemplate} + static RadioSpec of(BuildContext context) { + return _$RadioSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [RadioSpec] but with the given fields + /// replaced with the new values. + @override + RadioSpec copyWith({ + BoxSpec? container, + BoxSpec? indicator, + AnimatedData? animated, + }) { + return RadioSpec( + container: container ?? _$this.container, + indicator: indicator ?? _$this.indicator, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [RadioSpec] and another [RadioSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [RadioSpec] is returned. When [t] is 1.0, the [other] [RadioSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [RadioSpec] is returned. + /// + /// If [other] is null, this method returns the current [RadioSpec] instance. + /// + /// The interpolation is performed on each property of the [RadioSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container] and [indicator]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [RadioSpec] is used. Otherwise, the value + /// from the [other] [RadioSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [RadioSpec] configurations. + @override + RadioSpec lerp(RadioSpec? other, double t) { + if (other == null) return _$this; + + return RadioSpec( + container: _$this.container.lerp(other.container, t), + indicator: _$this.indicator.lerp(other.indicator, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [RadioSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [RadioSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.indicator, + _$this.animated, + ]; + + RadioSpec get _$this => this as RadioSpec; +} + +/// Represents the attributes of a [RadioSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [RadioSpec]. +/// +/// Use this class to configure the attributes of a [RadioSpec] and pass it to +/// the [RadioSpec] constructor. +final class RadioSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final BoxSpecAttribute? indicator; + + const RadioSpecAttribute({ + this.container, + this.indicator, + super.animated, + }); + + /// Resolves to [RadioSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final radioSpec = RadioSpecAttribute(...).resolve(mix); + /// ``` + @override + RadioSpec resolve(MixData mix) { + return RadioSpec( + container: container?.resolve(mix), + indicator: indicator?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [RadioSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [RadioSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + RadioSpecAttribute merge(covariant RadioSpecAttribute? other) { + if (other == null) return this; + + return RadioSpecAttribute( + container: container?.merge(other.container) ?? other.container, + indicator: indicator?.merge(other.indicator) ?? other.indicator, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [RadioSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [RadioSpecAttribute] instances for equality. + @override + List get props => [ + container, + indicator, + animated, + ]; +} + +/// Utility class for configuring [RadioSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [RadioSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [RadioSpecAttribute]. +base class RadioSpecUtility + extends SpecUtility { + /// Utility for defining [RadioSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [RadioSpecAttribute.indicator] + late final indicator = BoxSpecUtility((v) => only(indicator: v)); + + /// Utility for defining [RadioSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + RadioSpecUtility(super.builder); + + static final self = RadioSpecUtility((v) => v); + + /// Returns a new [RadioSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + BoxSpecAttribute? indicator, + AnimatedDataDto? animated, + }) { + return builder(RadioSpecAttribute( + container: container, + indicator: indicator, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [RadioSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [RadioSpec] specifications. +class RadioSpecTween extends Tween { + RadioSpecTween({ + super.begin, + super.end, + }); + + @override + RadioSpec lerp(double t) { + if (begin == null && end == null) return const RadioSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/radio/radio_style.dart b/packages/remix/lib/components/radio/radio_style.dart new file mode 100644 index 000000000..9826ee983 --- /dev/null +++ b/packages/remix/lib/components/radio/radio_style.dart @@ -0,0 +1,113 @@ +// ignore_for_file: camel_case_types + +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/radio/radio_spec.dart'; +import 'package:remix/components/radio/radio_variants.dart'; +import 'package:remix/helpers/utility_extension.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _radio = RadioSpecUtility.self; +final _container = _radio.container; +final _indicator = _radio.indicator; + +Style get _baseStyle => Style( + _container.borderRadius(99), + _container.alignment.center(), + _indicator.borderRadius(99), + ); + +Style get _solidVariant => Style( + _container.color.ref($rx.accent9), + _indicator.color.ref($rx.neutral1), + $on.hover( + _container.color.ref($rx.accent12), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + ); + +Style get _softVariant => Style( + _container.color.ref($rx.accent3A), + _indicator.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent4A), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + ); + +Style get _outlineVariant => Style( + _container.color(Colors.transparent), + _container.border.color.ref($rx.accent8A), + _indicator.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent2A), + ), + $on.disabled( + _container.border.color.ref($rx.neutral8A), + _container.color.transparent(), + ), + ); + +Style get _surfaceVariant => Style( + _outlineVariant(), + _container.color.ref($rx.accent3A), + $on.hover( + _container.color.ref($rx.accent4A), + _container.border.color.ref($rx.accent8A), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + ); + +Style get _ghostVariant => Style( + _container.border.style.none(), + _container.color(Colors.transparent), + _indicator.color.ref($rx.accent11A), + $on.hover( + _container.color.ref($rx.accent3A), + ), + ); +Style get _smallVariant => Style( + _container.size(16), + _indicator.size(8), + ); + +Style get _mediumVariant => Style( + _container.size(20), + _indicator.size(10), + ); + +Style get _largeVariant => Style( + _container.size(24), + _indicator.size(12), + ); + +Style get _disabledVariant => Style( + _container.color.ref($rx.neutral3A), + _container.border.color.ref($rx.neutral5A), + _indicator.color.ref($rx.neutral7A), + ); + +Style buildDefaultRadioStyle() { + return Style( + _baseStyle(), + + /// Size Variants + RadioSize.small(_smallVariant()), + RadioSize.medium(_mediumVariant()), + RadioSize.large(_largeVariant()), + + // State variants + RadioVariant.solid(_solidVariant()), + RadioVariant.soft(_softVariant()), + RadioVariant.outline(_outlineVariant()), + RadioVariant.surface(_surfaceVariant()), + RadioVariant.ghost(_ghostVariant()), + $on.disabled(_disabledVariant()), + ); +} diff --git a/packages/remix/lib/components/radio/radio_variants.dart b/packages/remix/lib/components/radio/radio_variants.dart new file mode 100644 index 000000000..fb2f3991b --- /dev/null +++ b/packages/remix/lib/components/radio/radio_variants.dart @@ -0,0 +1,40 @@ +import 'package:remix/helpers/variant.dart'; + +abstract interface class IRadioVariant extends RemixVariant { + const IRadioVariant(String name) : super('radio.$name'); +} + +class RadioStatus extends IRadioVariant { + const RadioStatus(String name) : super('status.$name'); + + static const checked = RadioStatus('checked'); + static const unchecked = RadioStatus('unchecked'); +} + +class RadioVariant extends IRadioVariant { + const RadioVariant(String name) : super('variant.$name'); + + static const solid = RadioVariant('solid'); + static const soft = RadioVariant('soft'); + static const surface = RadioVariant('surface'); + static const outline = RadioVariant('outline'); + static const ghost = RadioVariant('ghost'); + + static List get values => [ + solid, + soft, + surface, + outline, + ghost, + ]; +} + +class RadioSize extends IRadioVariant { + const RadioSize(String name) : super('size.$name'); + + static const small = RadioSize('small'); + static const medium = RadioSize('medium'); + static const large = RadioSize('large'); + + static List get values => [small, medium, large]; +} diff --git a/packages/remix/lib/components/radio/radio_widget.dart b/packages/remix/lib/components/radio/radio_widget.dart new file mode 100644 index 000000000..47ce07722 --- /dev/null +++ b/packages/remix/lib/components/radio/radio_widget.dart @@ -0,0 +1,53 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/radio/radio_spec.dart'; +import 'package:remix/components/radio/radio_style.dart'; +import 'package:remix/components/radio/radio_variants.dart'; + +class RxRadio extends StatelessWidget { + const RxRadio({ + super.key, + required this.value, + required this.onChanged, + this.variant = RadioVariant.solid, + this.size = RadioSize.medium, + this.disabled = false, + this.style, + }); + + final bool value; + final ValueChanged onChanged; + final RadioVariant variant; + final RadioSize size; + final Style? style; + final bool disabled; + + void _handleOnPress() => onChanged.call(!value); + + Style _buildStyle() { + return buildDefaultRadioStyle() + .merge(style) + .applyVariants([size, variant]).animate(); + } + + @override + Widget build(BuildContext context) { + return Pressable( + onPress: disabled ? null : _handleOnPress, + enabled: !disabled, + child: SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spec = RadioSpec.of(context); + + final ContainerWidget = spec.container; + final IndicatorWidget = spec.indicator; + + return ContainerWidget( + child: value ? IndicatorWidget() : null, + ); + }, + ), + ); + } +} diff --git a/packages/remix/lib/components/spinner/spinner.style.dart b/packages/remix/lib/components/spinner/spinner.style.dart index 1b039f870..bd90baece 100644 --- a/packages/remix/lib/components/spinner/spinner.style.dart +++ b/packages/remix/lib/components/spinner/spinner.style.dart @@ -1,11 +1,11 @@ -import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:remix/components/spinner/spinner_spec.dart'; +import 'package:remix/tokens/remix_tokens.dart'; -final _spinner = SpinnerSpecUtility.self; +final _util = SpinnerSpecUtility.self; -Style get defaultSpinnerStyle => Style( - _spinner.strokeWidth(2), - _spinner.color(Colors.black), - _spinner.size(24), +Style defaultSpinnerStyle() => Style( + _util.strokeWidth(2), + _util.color.ref($rx.accent9), + _util.size(24), ); diff --git a/packages/remix/lib/components/spinner/spinner.variants.dart b/packages/remix/lib/components/spinner/spinner.variants.dart index b4f8fc40a..edb26321b 100644 --- a/packages/remix/lib/components/spinner/spinner.variants.dart +++ b/packages/remix/lib/components/spinner/spinner.variants.dart @@ -1,16 +1,25 @@ -import 'package:mix/mix.dart'; +import 'package:remix/helpers/variant.dart'; -interface class ISpinnerVariant extends Variant { - const ISpinnerVariant(super.name); +interface class ISpinnerVariant extends RemixVariant { + const ISpinnerVariant(String name) : super('spinner.$name'); } class SpinnerSize extends ISpinnerVariant { - const SpinnerSize(super.name); + const SpinnerSize(String name) : super('size.$name'); - static const xsmall = SpinnerSize('remix.spinner.xsmall'); - static const small = SpinnerSize('remix.spinner.small'); - static const medium = SpinnerSize('remix.spinner.medium'); - static const large = SpinnerSize('remix.spinner.large'); + static const xsmall = SpinnerSize('xsmall'); + static const small = SpinnerSize('small'); + static const medium = SpinnerSize('medium'); + static const large = SpinnerSize('large'); static List get values => [xsmall, small, medium, large]; } + +class SpinnerVariant extends ISpinnerVariant { + const SpinnerVariant(String name) : super('variant.$name'); + + static const solid = SpinnerVariant('solid'); + static const dotted = SpinnerVariant('dotted'); + + static List get values => [dotted, solid]; +} diff --git a/packages/remix/lib/components/spinner/spinner_spec.dart b/packages/remix/lib/components/spinner/spinner_spec.dart index 9aa5a35dc..bb47a05c8 100644 --- a/packages/remix/lib/components/spinner/spinner_spec.dart +++ b/packages/remix/lib/components/spinner/spinner_spec.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; import 'package:mix_annotations/mix_annotations.dart'; -import 'package:remix/components/spinner/spinner.dart'; +import 'package:remix/components/spinner/spinner_widget.dart'; part 'spinner_spec.g.dart'; diff --git a/packages/remix/lib/components/spinner/spinner.dart b/packages/remix/lib/components/spinner/spinner_widget.dart similarity index 83% rename from packages/remix/lib/components/spinner/spinner.dart rename to packages/remix/lib/components/spinner/spinner_widget.dart index 5f2d86c6e..a41ade256 100644 --- a/packages/remix/lib/components/spinner/spinner.dart +++ b/packages/remix/lib/components/spinner/spinner_widget.dart @@ -7,18 +7,22 @@ import 'package:remix/components/spinner/spinner.variants.dart'; import 'package:remix/components/spinner/spinner_painter.dart'; import 'package:remix/components/spinner/spinner_spec.dart'; -class RXSpinner extends StatelessWidget { - const RXSpinner({ +class RxSpinner extends StatelessWidget { + const RxSpinner({ this.style, super.key, this.size = SpinnerSize.medium, + this.variant = SpinnerVariant.solid, }); final Style? style; final SpinnerSize size; + final SpinnerVariant variant; Style _buildStyle() { - return defaultSpinnerStyle.merge(style).applyVariants([size]).animate(); + return defaultSpinnerStyle() + .merge(style) + .applyVariants([variant, size]).animate(); } @override @@ -26,7 +30,11 @@ class RXSpinner extends StatelessWidget { return SpecBuilder( style: _buildStyle(), builder: (context) { - final SpinnerWidget = SpinnerSpec.of(context); + final SpinnerWidget = SpinnerSpec.of(context).copyWith( + style: variant == SpinnerVariant.dotted + ? SpinnerStyle.dotted + : SpinnerStyle.solid, + ); return SpinnerWidget(); }, ); diff --git a/packages/remix/lib/helpers/utility_extension.dart b/packages/remix/lib/helpers/utility_extension.dart new file mode 100644 index 000000000..a1687f269 --- /dev/null +++ b/packages/remix/lib/helpers/utility_extension.dart @@ -0,0 +1,5 @@ +import 'package:mix/mix.dart'; + +extension BoxSpecUtilityX on BoxSpecUtility { + T size(double value) => only(height: value, width: value); +} diff --git a/packages/remix/lib/helpers/variant.dart b/packages/remix/lib/helpers/variant.dart new file mode 100644 index 000000000..6a2ed75cb --- /dev/null +++ b/packages/remix/lib/helpers/variant.dart @@ -0,0 +1,7 @@ +import 'package:mix/mix.dart'; + +abstract class RemixVariant extends Variant { + const RemixVariant(String name) : super('remix.$name'); + + String get label => name.split('.').last; +} diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index 9d95130d1..fa851dfb4 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -1,11 +1,11 @@ library remix; -export 'components/button/button.dart'; export 'components/button/button.style.dart'; export 'components/button/button.variants.dart'; export 'components/button/button_spec.dart'; +export 'components/button/button_widget.dart'; export 'components/checkbox/checkbox.dart'; export 'components/checkbox/checkbox_spec.dart'; export 'components/checkbox/checkbox_style.dart'; -export 'components/checkbox/checkbox_variant.dart'; +export 'components/checkbox/checkbox_variants.dart'; export 'tokens/remix_tokens.dart'; From dec693a8ecaef1e7270b157ab4d79f8301d58450 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Tue, 9 Jul 2024 15:21:47 -0400 Subject: [PATCH 13/24] wip --- .../{button.dart => button_use_case.dart} | 0 .../{checkbox.dart => checkbox_use_case.dart} | 0 .../lib/components/progress_use_case.dart | 1 + .../{radio.dart => radio_use_case.dart} | 0 .../{spinner.dart => spinner_use_case.dart} | 12 +- .../demo/lib/components/switch_use_case.dart | 44 ++++ .../remix/demo/lib/main.directories.g.dart | 21 +- .../ephemeral/FlutterInputs.xcfilelist | 20 +- .../lib/components/button/button.style.dart | 2 +- .../components/checkbox/checkbox_style.dart | 1 + .../lib/components/radio/radio_style.dart | 1 + .../lib/components/spinner/spinner.style.dart | 27 ++- .../components/spinner/spinner.variants.dart | 3 +- .../components/spinner/spinner_painter.dart | 74 +++++-- .../components/spinner/spinner_widget.dart | 31 +-- .../lib/components/switch/switch.style.dart | 70 ++++++ .../components/switch/switch.variants.dart | 40 ++++ .../lib/components/switch/switch_spec.dart | 22 ++ .../lib/components/switch/switch_spec.g.dart | 207 ++++++++++++++++++ .../lib/components/switch/switch_widget.dart | 55 +++++ packages/remix/lib/remix.dart | 11 + .../ephemeral/Flutter-Generated.xcconfig | 8 +- .../ephemeral/flutter_export_environment.sh | 8 +- packages/remix/scripts/context_markdown.dart | 0 24 files changed, 605 insertions(+), 53 deletions(-) rename packages/remix/demo/lib/components/{button.dart => button_use_case.dart} (100%) rename packages/remix/demo/lib/components/{checkbox.dart => checkbox_use_case.dart} (100%) create mode 100644 packages/remix/demo/lib/components/progress_use_case.dart rename packages/remix/demo/lib/components/{radio.dart => radio_use_case.dart} (100%) rename packages/remix/demo/lib/components/{spinner.dart => spinner_use_case.dart} (72%) create mode 100644 packages/remix/demo/lib/components/switch_use_case.dart create mode 100644 packages/remix/lib/components/switch/switch.style.dart create mode 100644 packages/remix/lib/components/switch/switch.variants.dart create mode 100644 packages/remix/lib/components/switch/switch_spec.dart create mode 100644 packages/remix/lib/components/switch/switch_spec.g.dart create mode 100644 packages/remix/lib/components/switch/switch_widget.dart create mode 100644 packages/remix/scripts/context_markdown.dart diff --git a/packages/remix/demo/lib/components/button.dart b/packages/remix/demo/lib/components/button_use_case.dart similarity index 100% rename from packages/remix/demo/lib/components/button.dart rename to packages/remix/demo/lib/components/button_use_case.dart diff --git a/packages/remix/demo/lib/components/checkbox.dart b/packages/remix/demo/lib/components/checkbox_use_case.dart similarity index 100% rename from packages/remix/demo/lib/components/checkbox.dart rename to packages/remix/demo/lib/components/checkbox_use_case.dart diff --git a/packages/remix/demo/lib/components/progress_use_case.dart b/packages/remix/demo/lib/components/progress_use_case.dart new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/packages/remix/demo/lib/components/progress_use_case.dart @@ -0,0 +1 @@ + diff --git a/packages/remix/demo/lib/components/radio.dart b/packages/remix/demo/lib/components/radio_use_case.dart similarity index 100% rename from packages/remix/demo/lib/components/radio.dart rename to packages/remix/demo/lib/components/radio_use_case.dart diff --git a/packages/remix/demo/lib/components/spinner.dart b/packages/remix/demo/lib/components/spinner_use_case.dart similarity index 72% rename from packages/remix/demo/lib/components/spinner.dart rename to packages/remix/demo/lib/components/spinner_use_case.dart index ec381aae9..ea080d910 100644 --- a/packages/remix/demo/lib/components/spinner.dart +++ b/packages/remix/demo/lib/components/spinner_use_case.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; import 'package:remix/components/spinner/spinner.variants.dart'; +import 'package:remix/components/spinner/spinner_spec.dart'; import 'package:remix/components/spinner/spinner_widget.dart'; import 'package:widgetbook/widgetbook.dart'; import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; @@ -9,19 +11,21 @@ import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; type: RxSpinner, ) Widget buildSpinnerUseCase(BuildContext context) { - Widget buildSpinner(SpinnerVariant variant) { + Widget buildSpinner(SpinnerStyle style) { return Column( children: [ - Text(variant.label), + Text(style.name), const SizedBox(height: 10), RxSpinner( + style: Style( + SpinnerSpecUtility.self.style(style), + ), size: context.knobs.list( label: 'Size', options: SpinnerSize.values, initialOption: SpinnerSize.medium, labelBuilder: (value) => value.label, ), - variant: variant, ), ], ); @@ -30,6 +34,6 @@ Widget buildSpinnerUseCase(BuildContext context) { return Wrap( spacing: 12, runSpacing: 12, - children: SpinnerVariant.values.map(buildSpinner).toList(), + children: SpinnerStyle.values.map(buildSpinner).toList(), ); } diff --git a/packages/remix/demo/lib/components/switch_use_case.dart b/packages/remix/demo/lib/components/switch_use_case.dart new file mode 100644 index 000000000..2f1d7f082 --- /dev/null +++ b/packages/remix/demo/lib/components/switch_use_case.dart @@ -0,0 +1,44 @@ +import 'package:demo/helpers/use_case_state.dart'; +import 'package:flutter/material.dart'; +import 'package:remix/components/switch/switch.variants.dart'; +import 'package:remix/components/switch/switch_widget.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'Switch Component', + type: RxSwitch, +) +Widget buildSwitchUseCase(BuildContext context) { + final knobState = WidgetbookState.of(context); + + Widget buildSwitch(SwitchVariant variant) { + return Column( + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxSwitch( + value: context.knobs.boolean(label: 'Toggle', initialValue: true), + onChanged: (value) => knobState.updateKnob('Toggle', value), + variant: variant, + size: context.knobs.list( + label: 'Size', + options: SwitchSize.values, + initialOption: SwitchSize.medium, + labelBuilder: (value) => value.label, + ), + disabled: context.knobs.boolean( + label: 'Disabled', + initialValue: false, + ), + ), + ], + ); + } + + return Wrap( + spacing: 12, + runSpacing: 12, + children: SwitchVariant.values.map(buildSwitch).toList(), + ); +} diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index 8b4028177..cfca67c69 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -9,10 +9,11 @@ // ************************************************************************** // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:demo/components/button.dart' as _i2; -import 'package:demo/components/checkbox.dart' as _i3; -import 'package:demo/components/radio.dart' as _i4; -import 'package:demo/components/spinner.dart' as _i5; +import 'package:demo/components/button_use_case.dart' as _i2; +import 'package:demo/components/checkbox_use_case.dart' as _i3; +import 'package:demo/components/radio_use_case.dart' as _i4; +import 'package:demo/components/spinner_use_case.dart' as _i5; +import 'package:demo/components/switch_use_case.dart' as _i6; import 'package:widgetbook/widgetbook.dart' as _i1; final directories = <_i1.WidgetbookNode>[ @@ -67,6 +68,18 @@ final directories = <_i1.WidgetbookNode>[ ) ], ), + _i1.WidgetbookFolder( + name: 'switch', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RxSwitch', + useCase: _i1.WidgetbookUseCase( + name: 'Switch Component', + builder: _i6.buildSwitchUseCase, + ), + ) + ], + ), ], ) ]; diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index fdb49cb8a..b686663ac 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -786,8 +786,11 @@ /Users/leofarias/Projects/mix/packages/mix_annotations/lib/src/annotations.dart /Users/leofarias/Projects/mix/packages/remix/LICENSE /Users/leofarias/Projects/mix/packages/remix/demo/lib/addons/icon_data_knob.dart -/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/button.dart -/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/checkbox.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/button_use_case.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/checkbox_use_case.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/radio_use_case.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/spinner_use_case.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/switch_use_case.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/helpers/use_case_state.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.directories.g.dart @@ -802,14 +805,25 @@ /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_style.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_variants.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.style.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner.variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_painter.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_widget.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch.style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch.variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/color_palette.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/utility_extension.dart +/Users/leofarias/Projects/mix/packages/remix/lib/helpers/variant.dart /Users/leofarias/Projects/mix/packages/remix/lib/remix.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/color_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/radius_tokens.dart diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 84823250a..6e233eb46 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -61,7 +61,7 @@ Style get _softVariant => Style( Style get _outlineVariant => Style( _container.color(Colors.transparent), - _container.border.width(1), + _container.border.width(1.5), _container.border.strokeAlign(0), _container.border.color.ref($rx.accent8A), _foreground.color.ref($rx.accent11A), diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart index 96705fd75..3833da3b3 100644 --- a/packages/remix/lib/components/checkbox/checkbox_style.dart +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -45,6 +45,7 @@ Style get _softVariant => Style( Style get _outlineVariant => Style( _container.color(Colors.transparent), _container.border.color.ref($rx.accent8A), + _container.border.width(1.5), _icon.color.ref($rx.accent11A), $on.hover( _container.color.ref($rx.accent2A), diff --git a/packages/remix/lib/components/radio/radio_style.dart b/packages/remix/lib/components/radio/radio_style.dart index 9826ee983..8b7c3fb70 100644 --- a/packages/remix/lib/components/radio/radio_style.dart +++ b/packages/remix/lib/components/radio/radio_style.dart @@ -42,6 +42,7 @@ Style get _softVariant => Style( Style get _outlineVariant => Style( _container.color(Colors.transparent), _container.border.color.ref($rx.accent8A), + _container.border.width(1.5), _indicator.color.ref($rx.accent11A), $on.hover( _container.color.ref($rx.accent2A), diff --git a/packages/remix/lib/components/spinner/spinner.style.dart b/packages/remix/lib/components/spinner/spinner.style.dart index bd90baece..5b96e30e9 100644 --- a/packages/remix/lib/components/spinner/spinner.style.dart +++ b/packages/remix/lib/components/spinner/spinner.style.dart @@ -1,11 +1,34 @@ import 'package:mix/mix.dart'; +import 'package:remix/components/spinner/spinner.variants.dart'; import 'package:remix/components/spinner/spinner_spec.dart'; import 'package:remix/tokens/remix_tokens.dart'; final _util = SpinnerSpecUtility.self; -Style defaultSpinnerStyle() => Style( - _util.strokeWidth(2), +Style get _baseStyle => Style( _util.color.ref($rx.accent9), + ); + +Style get _smallVariant => Style( + _util.size(16), + _util.strokeWidth(1), + ); + +Style get _mediumVariant => Style( _util.size(24), + _util.strokeWidth(1.5), ); + +Style get _largeVariant => Style( + _util.size(32), + _util.strokeWidth(2), + ); + +Style buildSpinnerStyle() { + return Style( + _baseStyle(), + SpinnerSize.small(_smallVariant()), + SpinnerSize.medium(_mediumVariant()), + SpinnerSize.large(_largeVariant()), + ); +} diff --git a/packages/remix/lib/components/spinner/spinner.variants.dart b/packages/remix/lib/components/spinner/spinner.variants.dart index edb26321b..918d07336 100644 --- a/packages/remix/lib/components/spinner/spinner.variants.dart +++ b/packages/remix/lib/components/spinner/spinner.variants.dart @@ -7,12 +7,11 @@ interface class ISpinnerVariant extends RemixVariant { class SpinnerSize extends ISpinnerVariant { const SpinnerSize(String name) : super('size.$name'); - static const xsmall = SpinnerSize('xsmall'); static const small = SpinnerSize('small'); static const medium = SpinnerSize('medium'); static const large = SpinnerSize('large'); - static List get values => [xsmall, small, medium, large]; + static List get values => [small, medium, large]; } class SpinnerVariant extends ISpinnerVariant { diff --git a/packages/remix/lib/components/spinner/spinner_painter.dart b/packages/remix/lib/components/spinner/spinner_painter.dart index 29a35b116..41bde9267 100644 --- a/packages/remix/lib/components/spinner/spinner_painter.dart +++ b/packages/remix/lib/components/spinner/spinner_painter.dart @@ -1,27 +1,29 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:remix/components/spinner/spinner_spec.dart'; abstract interface class SpinnerPainter extends CustomPainter { - final Animation? animation; - final SpinnerSpec spec; + final Animation animation; + final double strokeWidth; + final Color color; SpinnerPainter({ - this.animation, - required this.spec, + required this.animation, + required this.strokeWidth, + required this.color, }) : super(repaint: animation); } class DottedSpinnerPainter extends SpinnerPainter { DottedSpinnerPainter({ - super.animation, - required super.spec, + required super.animation, + required super.strokeWidth, + required super.color, }); @override void paint(Canvas canvas, Size size) { - final specStrokeWidth = spec.strokeWidth ?? 1; + final specStrokeWidth = strokeWidth / 2; final paint = Paint() ..style = PaintingStyle.stroke @@ -35,9 +37,9 @@ class DottedSpinnerPainter extends SpinnerPainter { for (int i = 0; i < lines; i++) { final angle = i * lineAngle; - final opacity = (lines - i + animation!.value * lines) % lines / lines; + final opacity = (lines - i + animation.value * lines) % lines / lines; - paint.color = spec.color.withOpacity(opacity); + paint.color = color.withOpacity(opacity); final lineHeight = radius * 0.45; @@ -53,19 +55,61 @@ class DottedSpinnerPainter extends SpinnerPainter { bool shouldRepaint(DottedSpinnerPainter oldDelegate) => true; } +class StrippedSpinnerPainter extends SpinnerPainter { + StrippedSpinnerPainter({ + required super.animation, + required super.strokeWidth, + required super.color, + }); + + @override + void paint(Canvas canvas, Size size) { + final specStrokeWidth = strokeWidth / 2; + + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 2 * specStrokeWidth; + + canvas.translate(size.width / 2, size.height / 2); + + final radius = min(size.width, size.height) / 2 - paint.strokeWidth; + const lines = 12; + const lineAngle = 2 * pi / lines; + + for (int i = 0; i < lines; i++) { + final angle = i * lineAngle; + final opacity = (lines - i + animation.value * lines) % lines / lines; + + paint.color = color.withOpacity(opacity); + + final lineHeight = radius * 0.8; + + canvas.drawLine( + Offset(radius * 0.9 * cos(angle), radius * 0.9 * sin(angle)), + Offset(lineHeight * cos(angle), lineHeight * sin(angle)), + paint, + ); + } + } + + @override + bool shouldRepaint(DottedSpinnerPainter oldDelegate) => true; +} + class SolidSpinnerPainter extends SpinnerPainter { SolidSpinnerPainter({ - super.animation, - required super.spec, + required super.animation, + required super.strokeWidth, + required super.color, }); @override void paint(Canvas canvas, Size size) { - final specStrokeWidth = spec.strokeWidth ?? 1; + final specStrokeWidth = strokeWidth; final paint = Paint() ..style = PaintingStyle.stroke ..strokeWidth = 2 * specStrokeWidth - ..color = spec.color; + ..color = color; canvas.translate(size.width / 2, size.height / 2); @@ -75,7 +119,7 @@ class SolidSpinnerPainter extends SpinnerPainter { canvas.drawArc( Rect.fromCircle(center: Offset.zero, radius: radius), - startAngle + animation!.value * 2 * pi, + startAngle + animation.value * 2 * pi, sweepAngle, false, paint, diff --git a/packages/remix/lib/components/spinner/spinner_widget.dart b/packages/remix/lib/components/spinner/spinner_widget.dart index a41ade256..8a40ca44d 100644 --- a/packages/remix/lib/components/spinner/spinner_widget.dart +++ b/packages/remix/lib/components/spinner/spinner_widget.dart @@ -12,17 +12,13 @@ class RxSpinner extends StatelessWidget { this.style, super.key, this.size = SpinnerSize.medium, - this.variant = SpinnerVariant.solid, }); final Style? style; final SpinnerSize size; - final SpinnerVariant variant; Style _buildStyle() { - return defaultSpinnerStyle() - .merge(style) - .applyVariants([variant, size]).animate(); + return buildSpinnerStyle().merge(style).applyVariant(size).animate(); } @override @@ -30,11 +26,7 @@ class RxSpinner extends StatelessWidget { return SpecBuilder( style: _buildStyle(), builder: (context) { - final SpinnerWidget = SpinnerSpec.of(context).copyWith( - style: variant == SpinnerVariant.dotted - ? SpinnerStyle.dotted - : SpinnerStyle.solid, - ); + final SpinnerWidget = SpinnerSpec.of(context); return SpinnerWidget(); }, ); @@ -83,14 +75,25 @@ class _RxSpinnerSpecWidgetState extends State @override Widget build(BuildContext context) { - final painter = widget.spec.style == SpinnerStyle.dotted - ? DottedSpinnerPainter(animation: controller, spec: widget.spec) - : SolidSpinnerPainter(animation: controller, spec: widget.spec); + final spec = widget.spec; + final color = spec.color; + final strokeWidth = spec.strokeWidth ?? 1; + final size = spec.size; + final painter = spec.style == SpinnerStyle.dotted + ? DottedSpinnerPainter( + animation: controller, + color: color, + strokeWidth: strokeWidth, + ) + : SolidSpinnerPainter( + animation: controller, + color: color, + strokeWidth: strokeWidth, + ); return AnimatedBuilder( animation: controller, builder: (context, child) { - final size = widget.spec.size; return CustomPaint( size: Size(size, size), painter: painter, diff --git a/packages/remix/lib/components/switch/switch.style.dart b/packages/remix/lib/components/switch/switch.style.dart new file mode 100644 index 000000000..21281acb2 --- /dev/null +++ b/packages/remix/lib/components/switch/switch.style.dart @@ -0,0 +1,70 @@ +import 'package:mix/mix.dart'; +import 'package:remix/components/switch/switch.variants.dart'; +import 'package:remix/components/switch/switch_spec.dart'; +import 'package:remix/helpers/utility_extension.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _util = SwitchSpecUtility.self; + +final _container = _util.container; +final _indicator = _util.indicator; + +Style get _baseStyle => Style( + _container.borderRadius(99), + _indicator.borderRadius(99), + SwitchStatus.on( + _container.alignment.centerRight(), + ), + SwitchStatus.off( + _container.alignment.centerLeft(), + ), + ); + +Style get _solidVariant => Style( + $on.hover( + _container.color.ref($rx.accent12), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + ), + SwitchStatus.on( + _container.color.ref($rx.accent9), + _indicator.color.ref($rx.neutral1), + ), + SwitchStatus.off( + _container.color.ref($rx.neutral4), + _indicator.color.ref($rx.neutral1), + ), + ); + +Style get _smallVariant => Style( + _container.width(24), + _container.padding.horizontal(1), + _container.height(16), + _indicator.size(12), + ); + +Style get _mediumVariant => Style( + _container.width(32), + _container.padding.horizontal(2), + _container.height(20), + _indicator.size(16), + ); + +Style get _largeVariant => Style( + _container.width(40), + _container.padding.horizontal(3), + _container.height(24), + _indicator.size(20), + ); + +Style buildSwitchStyle() { + return Style( + _baseStyle(), + // Sizes + SwitchSize.small(_smallVariant()), + SwitchSize.medium(_mediumVariant()), + SwitchSize.large(_largeVariant()), + SwitchVariant.solid(_solidVariant()), + ); +} diff --git a/packages/remix/lib/components/switch/switch.variants.dart b/packages/remix/lib/components/switch/switch.variants.dart new file mode 100644 index 000000000..cd1f8a4b2 --- /dev/null +++ b/packages/remix/lib/components/switch/switch.variants.dart @@ -0,0 +1,40 @@ +import 'package:remix/helpers/variant.dart'; + +interface class ISwitchVariant extends RemixVariant { + const ISwitchVariant(String name) : super('switch.$name'); +} + +class SwitchStatus extends ISwitchVariant { + const SwitchStatus(String name) : super('status.$name'); + + static const on = SwitchStatus('on'); + static const off = SwitchStatus('off'); + + static List get values => [on, off]; +} + +class SwitchSize extends ISwitchVariant { + const SwitchSize(String name) : super('size.$name'); + + static const small = SwitchSize('small'); + static const medium = SwitchSize('medium'); + static const large = SwitchSize('large'); + + static List get values => [small, medium, large]; +} + +class SwitchVariant extends ISwitchVariant { + const SwitchVariant(String name) : super('variant.$name'); + + static const solid = SwitchVariant('solid'); + static const soft = SwitchVariant('soft'); + static const surface = SwitchVariant('surface'); + static const outline = SwitchVariant('outline'); + + static List get values => [ + solid, + soft, + surface, + outline, + ]; +} diff --git a/packages/remix/lib/components/switch/switch_spec.dart b/packages/remix/lib/components/switch/switch_spec.dart new file mode 100644 index 000000000..2b4a90d01 --- /dev/null +++ b/packages/remix/lib/components/switch/switch_spec.dart @@ -0,0 +1,22 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'switch_spec.g.dart'; + +@MixableSpec() +base class SwitchSpec extends Spec with _$SwitchSpec { + final BoxSpec container; + final BoxSpec indicator; + + static const of = _$SwitchSpec.of; + + static const from = _$SwitchSpec.from; + + const SwitchSpec({ + BoxSpec? container, + BoxSpec? indicator, + super.animated, + }) : container = container ?? const BoxSpec(), + indicator = indicator ?? const BoxSpec(); +} diff --git a/packages/remix/lib/components/switch/switch_spec.g.dart b/packages/remix/lib/components/switch/switch_spec.g.dart new file mode 100644 index 000000000..4703e8d77 --- /dev/null +++ b/packages/remix/lib/components/switch/switch_spec.g.dart @@ -0,0 +1,207 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'switch_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +base mixin _$SwitchSpec on Spec { + static SwitchSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const SwitchSpec(); + } + + /// {@template switch_spec_of} + /// Retrieves the [SwitchSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [SwitchSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [SwitchSpec]. + /// + /// Example: + /// + /// ```dart + /// final switchSpec = SwitchSpec.of(context); + /// ``` + /// {@endtemplate} + static SwitchSpec of(BuildContext context) { + return _$SwitchSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [SwitchSpec] but with the given fields + /// replaced with the new values. + @override + SwitchSpec copyWith({ + BoxSpec? container, + BoxSpec? indicator, + AnimatedData? animated, + }) { + return SwitchSpec( + container: container ?? _$this.container, + indicator: indicator ?? _$this.indicator, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [SwitchSpec] and another [SwitchSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [SwitchSpec] is returned. When [t] is 1.0, the [other] [SwitchSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [SwitchSpec] is returned. + /// + /// If [other] is null, this method returns the current [SwitchSpec] instance. + /// + /// The interpolation is performed on each property of the [SwitchSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container] and [indicator]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [SwitchSpec] is used. Otherwise, the value + /// from the [other] [SwitchSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [SwitchSpec] configurations. + @override + SwitchSpec lerp(SwitchSpec? other, double t) { + if (other == null) return _$this; + + return SwitchSpec( + container: _$this.container.lerp(other.container, t), + indicator: _$this.indicator.lerp(other.indicator, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [SwitchSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [SwitchSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.indicator, + _$this.animated, + ]; + + SwitchSpec get _$this => this as SwitchSpec; +} + +/// Represents the attributes of a [SwitchSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [SwitchSpec]. +/// +/// Use this class to configure the attributes of a [SwitchSpec] and pass it to +/// the [SwitchSpec] constructor. +final class SwitchSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final BoxSpecAttribute? indicator; + + const SwitchSpecAttribute({ + this.container, + this.indicator, + super.animated, + }); + + /// Resolves to [SwitchSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final switchSpec = SwitchSpecAttribute(...).resolve(mix); + /// ``` + @override + SwitchSpec resolve(MixData mix) { + return SwitchSpec( + container: container?.resolve(mix), + indicator: indicator?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [SwitchSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [SwitchSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + SwitchSpecAttribute merge(covariant SwitchSpecAttribute? other) { + if (other == null) return this; + + return SwitchSpecAttribute( + container: container?.merge(other.container) ?? other.container, + indicator: indicator?.merge(other.indicator) ?? other.indicator, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [SwitchSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [SwitchSpecAttribute] instances for equality. + @override + List get props => [ + container, + indicator, + animated, + ]; +} + +/// Utility class for configuring [SwitchSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [SwitchSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [SwitchSpecAttribute]. +base class SwitchSpecUtility + extends SpecUtility { + /// Utility for defining [SwitchSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [SwitchSpecAttribute.indicator] + late final indicator = BoxSpecUtility((v) => only(indicator: v)); + + /// Utility for defining [SwitchSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + SwitchSpecUtility(super.builder); + + static final self = SwitchSpecUtility((v) => v); + + /// Returns a new [SwitchSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + BoxSpecAttribute? indicator, + AnimatedDataDto? animated, + }) { + return builder(SwitchSpecAttribute( + container: container, + indicator: indicator, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [SwitchSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [SwitchSpec] specifications. +class SwitchSpecTween extends Tween { + SwitchSpecTween({ + super.begin, + super.end, + }); + + @override + SwitchSpec lerp(double t) { + if (begin == null && end == null) return const SwitchSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/switch/switch_widget.dart b/packages/remix/lib/components/switch/switch_widget.dart new file mode 100644 index 000000000..863caa165 --- /dev/null +++ b/packages/remix/lib/components/switch/switch_widget.dart @@ -0,0 +1,55 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/switch/switch.style.dart'; +import 'package:remix/components/switch/switch.variants.dart'; +import 'package:remix/components/switch/switch_spec.dart'; + +class RxSwitch extends StatelessWidget { + const RxSwitch({ + super.key, + required this.value, + required this.onChanged, + this.variant = SwitchVariant.solid, + this.size = SwitchSize.medium, + this.disabled = false, + this.style, + }); + + final bool value; + final ValueChanged onChanged; + final SwitchVariant variant; + final SwitchSize size; + final Style? style; + final bool disabled; + + void _handleOnPress() => onChanged.call(!value); + + Style _buildStyle() { + return buildSwitchStyle().merge(style).applyVariants([ + size, + variant, + value ? SwitchStatus.on : SwitchStatus.off, + ]).animate(); + } + + @override + Widget build(BuildContext context) { + return Pressable( + onPress: disabled ? null : _handleOnPress, + enabled: !disabled, + child: SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spec = SwitchSpec.of(context); + + final ContainerWidget = spec.container; + final IndicatorWidget = spec.indicator; + + return ContainerWidget( + child: IndicatorWidget(), + ); + }, + ), + ); + } +} diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index fa851dfb4..c56f9c085 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -8,4 +8,15 @@ export 'components/checkbox/checkbox.dart'; export 'components/checkbox/checkbox_spec.dart'; export 'components/checkbox/checkbox_style.dart'; export 'components/checkbox/checkbox_variants.dart'; +export 'components/radio/radio_spec.dart'; +export 'components/radio/radio_style.dart'; +export 'components/radio/radio_variants.dart'; +export 'components/spinner/spinner.style.dart'; +export 'components/spinner/spinner.variants.dart'; +export 'components/spinner/spinner_spec.dart'; +export 'components/spinner/spinner_widget.dart'; +export 'components/switch/switch.style.dart'; +export 'components/switch/switch.variants.dart'; +export 'components/switch/switch_spec.dart'; +export 'components/switch/switch_widget.dart'; export 'tokens/remix_tokens.dart'; diff --git a/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 610b0a4af..008cc46c9 100644 --- a/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,10 +1,10 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/Users/leofarias/flutter -FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui +FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6 +FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=1.0.0 -FLUTTER_BUILD_NUMBER=1 +FLUTTER_BUILD_NAME=0.0.1 +FLUTTER_BUILD_NUMBER=0.0.1 DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true TREE_SHAKE_ICONS=false diff --git a/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh index c27e21fac..6f1822b15 100755 --- a/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,11 +1,11 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/Users/leofarias/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Concepta/remix_ui" +export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6" +export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=1.0.0" -export "FLUTTER_BUILD_NUMBER=1" +export "FLUTTER_BUILD_NAME=0.0.1" +export "FLUTTER_BUILD_NUMBER=0.0.1" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" diff --git a/packages/remix/scripts/context_markdown.dart b/packages/remix/scripts/context_markdown.dart new file mode 100644 index 000000000..e69de29bb From fc973f470f2f385e48adbcaef2c204c3d8d6b327 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Wed, 10 Jul 2024 10:46:10 -0400 Subject: [PATCH 14/24] card component --- .fvmrc | 3 +- .../demo/lib/components/card_use_case.dart | 59 + .../lib/components/checkbox_use_case.dart | 13 +- .../demo/lib/components/switch_use_case.dart | 13 +- .../remix/demo/lib/main.directories.g.dart | 35 +- .../ephemeral/Flutter-Generated.xcconfig | 4 +- .../ephemeral/FlutterInputs.xcfilelist | 1737 +++++++++-------- .../ephemeral/flutter_export_environment.sh | 4 +- .../macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- packages/remix/demo/pubspec.yaml | 2 +- .../lib/components/avatar/avatar_spec.g.dart | 2 + .../lib/components/badge/badge.variants.dart | 24 +- .../lib/components/button/button.style.dart | 2 +- .../remix/lib/components/card/card.style.dart | 39 + .../lib/components/card/card.variants.dart | 21 + .../remix/lib/components/card/card_spec.dart | 24 + .../lib/components/card/card_spec.g.dart | 210 ++ .../lib/components/card/card_widget.dart | 45 + .../components/checkbox/checkbox_spec.dart | 6 +- .../components/checkbox/checkbox_spec.g.dart | 30 +- .../components/checkbox/checkbox_style.dart | 22 +- .../checkbox/checkbox_variants.dart | 6 +- .../{checkbox.dart => checkbox_widget.dart} | 10 +- .../checkbox_group/checkbox_group.dart | 2 +- .../components/progress/progress_spec.g.dart | 2 + .../lib/components/radio/radio_spec.g.dart | 2 + .../lib/components/radio/radio_style.dart | 2 +- .../components/spinner/spinner_spec.g.dart | 2 + .../lib/components/switch/switch.style.dart | 71 +- .../lib/components/switch/switch_spec.g.dart | 2 + packages/remix/lib/remix.dart | 6 +- .../ephemeral/Flutter-Generated.xcconfig | 2 +- .../ephemeral/flutter_export_environment.sh | 2 +- packages/remix/pubspec.yaml | 2 +- .../pages/docs/tutorials/custom-component.mdx | 272 +++ ...ts.mdx => supporting-new-widgets copy.mdx} | 0 37 files changed, 1766 insertions(+), 916 deletions(-) create mode 100644 packages/remix/demo/lib/components/card_use_case.dart create mode 100644 packages/remix/lib/components/card/card.style.dart create mode 100644 packages/remix/lib/components/card/card.variants.dart create mode 100644 packages/remix/lib/components/card/card_spec.dart create mode 100644 packages/remix/lib/components/card/card_spec.g.dart create mode 100644 packages/remix/lib/components/card/card_widget.dart rename packages/remix/lib/components/checkbox/{checkbox.dart => checkbox_widget.dart} (87%) create mode 100644 website/pages/docs/tutorials/custom-component.mdx rename website/pages/docs/tutorials/{supporting-new-widgets.mdx => supporting-new-widgets copy.mdx} (100%) diff --git a/.fvmrc b/.fvmrc index 399301a6d..08dc7d2b4 100644 --- a/.fvmrc +++ b/.fvmrc @@ -2,10 +2,9 @@ "flutter": "3.19.0", "flavors": { "prod": "stable", - "mincompat": "3.10.6" + "mincompat": "3.19.0" }, "runPubGetOnSdkChanges": true, "updateVscodeSettings": true, "updateGitIgnore": false - } } \ No newline at end of file diff --git a/packages/remix/demo/lib/components/card_use_case.dart b/packages/remix/demo/lib/components/card_use_case.dart new file mode 100644 index 000000000..7c8bf34b5 --- /dev/null +++ b/packages/remix/demo/lib/components/card_use_case.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/remix.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +@widgetbook.UseCase( + name: 'Card Component', + type: RxCard, +) +Widget buildCard(BuildContext context) { + Widget buildCard(CardVariant variant) { + return Column( + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxCard( + variant: variant, + children: const [StyledText('Hi'), StyledText('This is a test')], + ), + ], + ); + } + + return Wrap( + spacing: 12, + runSpacing: 12, + children: CardVariant.values.map(buildCard).toList(), + ); +} + +@widgetbook.UseCase( + name: 'With button', + type: RxCard, +) +Widget buildRadioUseCase(BuildContext context) { + Widget buildCard(CardVariant variant) { + return Column( + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxCard( + variant: variant, + children: const [StyledText('Hi'), StyledText('This is a test')], + ), + const SizedBox(height: 10), + RxButton( + label: 'Click me', + onPressed: () {}, + ), + ], + ); + } + + return Wrap( + spacing: 12, + runSpacing: 12, + children: CardVariant.values.map(buildCard).toList(), + ); +} diff --git a/packages/remix/demo/lib/components/checkbox_use_case.dart b/packages/remix/demo/lib/components/checkbox_use_case.dart index 116a46235..12e29dcf7 100644 --- a/packages/remix/demo/lib/components/checkbox_use_case.dart +++ b/packages/remix/demo/lib/components/checkbox_use_case.dart @@ -4,6 +4,8 @@ import 'package:remix/remix.dart'; import 'package:widgetbook/widgetbook.dart'; import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; +final _key = GlobalKey(); + @widgetbook.UseCase( name: 'Checkbox Component', type: RxCheckbox, @@ -35,9 +37,12 @@ Widget buildCheckboxUseCase(BuildContext context) { ); } - return Wrap( - spacing: 12, - runSpacing: 12, - children: CheckboxVariant.values.map(buildCheckbox).toList(), + return KeyedSubtree( + key: _key, + child: Wrap( + spacing: 12, + runSpacing: 12, + children: CheckboxVariant.values.map(buildCheckbox).toList(), + ), ); } diff --git a/packages/remix/demo/lib/components/switch_use_case.dart b/packages/remix/demo/lib/components/switch_use_case.dart index 2f1d7f082..f93576bb5 100644 --- a/packages/remix/demo/lib/components/switch_use_case.dart +++ b/packages/remix/demo/lib/components/switch_use_case.dart @@ -5,6 +5,8 @@ import 'package:remix/components/switch/switch_widget.dart'; import 'package:widgetbook/widgetbook.dart'; import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; +final _key = GlobalKey(); + @widgetbook.UseCase( name: 'Switch Component', type: RxSwitch, @@ -36,9 +38,12 @@ Widget buildSwitchUseCase(BuildContext context) { ); } - return Wrap( - spacing: 12, - runSpacing: 12, - children: SwitchVariant.values.map(buildSwitch).toList(), + return KeyedSubtree( + key: _key, + child: Wrap( + spacing: 12, + runSpacing: 12, + children: SwitchVariant.values.map(buildSwitch).toList(), + ), ); } diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index cfca67c69..5b0a62927 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -10,10 +10,11 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:demo/components/button_use_case.dart' as _i2; -import 'package:demo/components/checkbox_use_case.dart' as _i3; -import 'package:demo/components/radio_use_case.dart' as _i4; -import 'package:demo/components/spinner_use_case.dart' as _i5; -import 'package:demo/components/switch_use_case.dart' as _i6; +import 'package:demo/components/card_use_case.dart' as _i3; +import 'package:demo/components/checkbox_use_case.dart' as _i4; +import 'package:demo/components/radio_use_case.dart' as _i5; +import 'package:demo/components/spinner_use_case.dart' as _i6; +import 'package:demo/components/switch_use_case.dart' as _i7; import 'package:widgetbook/widgetbook.dart' as _i1; final directories = <_i1.WidgetbookNode>[ @@ -32,6 +33,24 @@ final directories = <_i1.WidgetbookNode>[ ) ], ), + _i1.WidgetbookFolder( + name: 'card', + children: [ + _i1.WidgetbookComponent( + name: 'RxCard', + useCases: [ + _i1.WidgetbookUseCase( + name: 'Card Component', + builder: _i3.buildCard, + ), + _i1.WidgetbookUseCase( + name: 'With button', + builder: _i3.buildRadioUseCase, + ), + ], + ) + ], + ), _i1.WidgetbookFolder( name: 'checkbox', children: [ @@ -39,7 +58,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxCheckbox', useCase: _i1.WidgetbookUseCase( name: 'Checkbox Component', - builder: _i3.buildCheckboxUseCase, + builder: _i4.buildCheckboxUseCase, ), ) ], @@ -51,7 +70,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxRadio', useCase: _i1.WidgetbookUseCase( name: 'Radio Component', - builder: _i4.buildRadioUseCase, + builder: _i5.buildRadioUseCase, ), ) ], @@ -63,7 +82,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxSpinner', useCase: _i1.WidgetbookUseCase( name: 'Spinner Component', - builder: _i5.buildSpinnerUseCase, + builder: _i6.buildSpinnerUseCase, ), ) ], @@ -75,7 +94,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxSwitch', useCase: _i1.WidgetbookUseCase( name: 'Switch Component', - builder: _i6.buildSwitchUseCase, + builder: _i7.buildSwitchUseCase, ), ) ], diff --git a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 84a846e69..c39bb69fd 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/packages/remix/demo/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,12 +1,12 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6 +FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.19.0 FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart FLUTTER_BUILD_DIR=build FLUTTER_BUILD_NAME=1.0.0 FLUTTER_BUILD_NUMBER=1 -DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw== +DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC8wNDgxN2M5OWM5ZmQ0OTU2ZjI3NTA1MjA0ZjdlMzQ0MzM1ODEwYWVkLw== DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true TREE_SHAKE_ICONS=false diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index b686663ac..1a21c1e7a 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -1,4 +1,4 @@ -/Users/leofarias/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-64.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-67.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/accessibility_tools.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/accessibility_issue.dart @@ -10,7 +10,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/minimum_tap_area_checker.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/mixin.dart /Users/leofarias/.pub-cache/hosted/pub.dev/accessibility_tools-1.0.0/lib/src/checkers/semantic_label_checker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/analyzer-6.2.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/analyzer-6.4.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/args-2.5.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/async-2.11.0/lib/async.dart @@ -96,35 +96,35 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/src/stopwatch.dart /Users/leofarias/.pub-cache/hosted/pub.dev/clock-1.1.1/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/code_builder-4.10.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/collection.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/algorithms.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/boollist.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/canonicalized_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_iterable.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_iterator.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_list.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/combined_wrappers/combined_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/comparators.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/empty_unmodifiable_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/equality_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/functions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/iterable_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/iterable_zip.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/list_extensions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/priority_queue.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/queue_list.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/union_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/union_set_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/unmodifiable_wrappers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.17.1/lib/src/wrappers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/collection.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/algorithms.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/boollist.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/canonicalized_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_iterable.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_iterator.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_list.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/combined_wrappers/combined_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/comparators.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/empty_unmodifiable_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/equality_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/functions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/iterable_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/iterable_zip.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/list_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/priority_queue.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/queue_list.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/union_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/union_set_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/unmodifiable_wrappers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/collection-1.18.0/lib/src/wrappers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/convert-3.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/crypto-3.0.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/assets/CupertinoIcons.ttf +/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/assets/CupertinoIcons.ttf /Users/leofarias/.pub-cache/hosted/pub.dev/dart_style-2.3.6/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/device_frame-1.1.0/lib/device_frame.dart @@ -213,9 +213,9 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/file-7.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/fixnum-1.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/flutter_lints-2.0.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.2/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.2/lib/freezed_annotation.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.2/lib/freezed_annotation.g.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.3/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.3/lib/freezed_annotation.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/freezed_annotation-2.4.3/lib/freezed_annotation.g.dart /Users/leofarias/.pub-cache/hosted/pub.dev/frontend_server_client-4.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/glob-2.1.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/graphs-2.3.1/LICENSE @@ -239,7 +239,7 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/inspector-2.1.0/lib/src/widgets/panel/inspector_panel.dart /Users/leofarias/.pub-cache/hosted/pub.dev/inspector-2.1.0/lib/src/widgets/zoom/zoom_overlay.dart /Users/leofarias/.pub-cache/hosted/pub.dev/io-1.0.4/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/js-0.6.7/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/js-0.7.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/json_annotation.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/allowed_keys_helpers.dart @@ -252,81 +252,136 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_serializable.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_serializable.g.dart /Users/leofarias/.pub-cache/hosted/pub.dev/json_annotation-4.9.0/lib/src/json_value.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/leak_tracker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/devtools_integration/_protocol.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/devtools_integration/_registration.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/devtools_integration/delivery.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/devtools_integration/messages.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/devtools_integration/primitives.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_baseliner.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_leak_filter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_leak_reporter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_leak_tracker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_object_record.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_object_record_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_object_records.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/_object_tracker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/helpers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/leak_tracking.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_dispatcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_finalizer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_gc_counter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_print_bytes.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_retaining_path/_connection.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_retaining_path/_retaining_path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/_retaining_path/_retaining_path_isolate.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/leak_tracking/primitives/model.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/shared/_formatting.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/shared/_primitives.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/shared/_util.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib/src/shared/shared_model.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/lib/leak_tracker_flutter_testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/lib/src/matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/lib/src/model.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/lib/src/testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-2.0.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-2.0.1/lib/leak_tracker_testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-2.0.1/lib/src/leak_testing.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/leak_tracker_testing-2.0.1/lib/src/matchers.dart /Users/leofarias/.pub-cache/hosted/pub.dev/lints-2.1.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/logging-1.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/core_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/custom_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/description.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/equals_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/error_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/async_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/expect_async.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/future_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/never_called.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/prints_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/stream_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/stream_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/throws_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/throws_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/util/placeholder.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/expect/util/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/feature_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/having_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/interfaces.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/iterable_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/map_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/numeric_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/operator_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/order_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/string_matchers.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/type_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib/src/util.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/blend/blend.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/cam16.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/hct.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/hct_solver.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/hct/viewing_conditions.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/material_color_utilities.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/palettes/core_palette.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/palettes/tonal_palette.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/point_provider.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/point_provider_lab.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_celebi.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_wsmeans.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/quantize/quantizer_wu.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/scheme/scheme.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/score/score.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/utils/color_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib/utils/math_utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/meta.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/meta_meta.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.4/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/core_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/custom_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/description.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/equals_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/error_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/async_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/expect.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/expect_async.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/future_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/never_called.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/prints_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/stream_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/stream_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/throws_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/throws_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/util/placeholder.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/expect/util/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/feature_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/having_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/interfaces.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/iterable_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/map_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/numeric_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/operator_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/order_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/string_matchers.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/type_matcher.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib/src/util.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/blend/blend.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/contrast/contrast.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dislike/dislike_analyzer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/dynamic_color.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/material_dynamic_colors.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/src/contrast_curve.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/dynamiccolor/src/tone_delta_pair.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/cam16.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/hct.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/src/hct_solver.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/hct/viewing_conditions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/material_color_utilities.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/palettes/core_palette.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/palettes/tonal_palette.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_celebi.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_wsmeans.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/quantizer_wu.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/src/point_provider.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/quantize/src/point_provider_lab.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/dynamic_scheme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_content.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_expressive.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_fidelity.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_monochrome.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_neutral.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_tonal_spot.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/scheme_vibrant.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/scheme/variant.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/score/score.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/temperature/temperature_cache.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/color_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/math_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib/utils/string_utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.11.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.11.0/lib/meta.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/meta-1.11.0/lib/meta_meta.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/mime-1.0.5/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/nested-1.0.0/lib/nested.dart /Users/leofarias/.pub-cache/hosted/pub.dev/package_config-2.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/characters.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/context.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/internal_style.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/parsed_path.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_map.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/path_set.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/posix.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/url.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/style/windows.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.8.3/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/characters.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/context.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/internal_style.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/parsed_path.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_map.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/path_set.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/posix.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/url.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/style/windows.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/path-1.9.0/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/pool-1.5.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/pubspec_parse-1.3.0/LICENSE @@ -344,41 +399,41 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/shelf-1.4.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/shelf_web_socket-1.0.4/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/source_gen-1.5.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/source_span.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/charcode.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/colors.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/file.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/highlighter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/location.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/location_mixin.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_mixin.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/span_with_context.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/chain.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/lazy_chain.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/lazy_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/stack_zone_specification.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/unparsed_frame.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/src/vm_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/stack_trace.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/close_guarantee_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/delegating_stream_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/disconnector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/guarantee_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/json_document_transformer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/multi_channel.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_completer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/src/stream_channel_transformer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/stream_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/source_span.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/charcode.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/colors.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/file.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/highlighter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/location.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/location_mixin.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_mixin.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/span_with_context.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/chain.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/lazy_chain.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/lazy_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/stack_zone_specification.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/unparsed_frame.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/src/vm_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib/stack_trace.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/close_guarantee_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/delegating_stream_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/disconnector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/guarantee_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/json_document_transformer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/multi_channel.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_completer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/src/stream_channel_transformer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib/stream_channel.dart /Users/leofarias/.pub-cache/hosted/pub.dev/stream_transform-2.1.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib/src/charcode.dart @@ -396,47 +451,44 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/src/generated/top_level.dart /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/src/generated/unicode_glyph_set.dart /Users/leofarias/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/term_glyph.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/expect.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/fake.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/hooks.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/scaffolding.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/closed_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/compiler.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/on_platform.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/retry.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/skip.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/tags.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/test_on.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/configuration/timeout.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/declarer.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/group.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/group_entry.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/invoker.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/live_test.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/live_test_controller.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/message.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/metadata.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/operating_system.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/platform_selector.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/remote_exception.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/runtime.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/stack_trace_formatter.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/stack_trace_mapper.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/state.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/suite.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/suite_platform.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/test.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/test_failure.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/util/identifier_regex.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/backend/util/pretty_print.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/expect/async_matcher.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/frontend/fake.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/spawn_hybrid.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/test_structure.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/scaffolding/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/src/utils.dart -/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib/test_api.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/fake.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/hooks.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/scaffolding.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/closed_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/compiler.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/configuration/on_platform.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/configuration/retry.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/configuration/skip.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/configuration/tags.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/configuration/test_on.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/configuration/timeout.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/declarer.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/group.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/group_entry.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/invoker.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/live_test.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/live_test_controller.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/message.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/metadata.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/operating_system.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/platform_selector.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/remote_exception.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/runtime.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/stack_trace_formatter.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/stack_trace_mapper.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/state.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/suite.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/suite_platform.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/test.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/test_failure.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/util/identifier_regex.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/backend/util/pretty_print.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/frontend/fake.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/scaffolding/spawn_hybrid.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/scaffolding/test_structure.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/scaffolding/utils.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib/src/utils.dart /Users/leofarias/.pub-cache/hosted/pub.dev/timing-1.0.1/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/typed_data-1.3.2/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/LICENSE @@ -465,8 +517,15 @@ /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector3.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector4.dart /Users/leofarias/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math_64.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-13.0.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib/src/dart_io_extensions.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib/src/snapshot_graph.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib/src/vm_service.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib/vm_service.dart +/Users/leofarias/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib/vm_service_io.dart /Users/leofarias/.pub-cache/hosted/pub.dev/watcher-1.1.0/LICENSE -/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/web-0.5.1/LICENSE +/Users/leofarias/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.5/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/LICENSE /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/assets/fonts/Poppins/Poppins-Black.ttf /Users/leofarias/.pub-cache/hosted/pub.dev/widgetbook-3.8.0/assets/fonts/Poppins/Poppins-BlackItalic.ttf @@ -830,651 +889,673 @@ /Users/leofarias/Projects/mix/packages/remix/lib/tokens/remix_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/space_tokens.dart /Users/leofarias/Projects/mix/packages/remix/lib/tokens/text_style_tokens.dart -/Users/leofarias/fvm/versions/3.10.6/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf -/Users/leofarias/fvm/versions/3.10.6/bin/cache/pkg/sky_engine/LICENSE -/Users/leofarias/fvm/versions/3.10.6/bin/internal/engine.version -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/LICENSE -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/animation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/cupertino.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/foundation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/gestures.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/material.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/painting.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/physics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/rendering.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/scheduler.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/semantics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/services.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animation_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/animations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/curves.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/listener_helpers.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/tween.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/animation/tween_sequence.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/activity_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/app.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/checkbox.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/colors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/context_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/context_menu_action.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/date_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/dialog.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/form_row.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/form_section.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/icon_theme_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/interface_level.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/list_section.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/localizations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/magnifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/nav_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/page_scaffold.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/radio.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/refresh.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/route.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/scrollbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/search_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/segmented_control.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/slider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/switch.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/tab_scaffold.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/tab_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_form_field_row.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/text_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/thumb_painter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/cupertino/toggleable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_bitfield_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_capabilities_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_isolates_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/_platform_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/annotations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/assertions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/basic_types.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/bitfield.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/capabilities.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/change_notifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/collections.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/consolidate_response.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/diagnostics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/isolates.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/key.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/licenses.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/math.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/memory_allocations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/node.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/object.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/observer_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/persistent_hash_map.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/platform.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/print.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/serialization.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/stack_frame.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/synchronous_future.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/foundation/unicode.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/arena.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/converter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/drag.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/drag_details.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/eager.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/events.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/force_press.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/gesture_settings.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/hit_test.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/long_press.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/lsq_solver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/monodrag.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/multidrag.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/multitap.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/pointer_router.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/recognizer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/resampler.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/scale.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/tap.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/team.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/gestures/velocity_tracker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/about.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_buttons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/action_icons_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/animated_icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/app_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/arc.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/autocomplete.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/back_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/badge.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/badge_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/banner.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/banner_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_app_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_app_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_navigation_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_sheet.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/bottom_sheet_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_style_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/calendar_date_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/card.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/card_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox_list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/checkbox_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/chip_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/choice_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/circle_avatar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/color_scheme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/colors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/curves.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table_source.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/data_table_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/date_picker_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dialog.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dialog_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/divider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/divider_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/drawer_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/dropdown_menu_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevated_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevated_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/elevation_overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expand_icon.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_panel.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/expansion_tile_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/feedback.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filled_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filled_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/filter_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/flexible_space_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button_location.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/floating_action_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/flutter_logo.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/grid_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/grid_tile_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icon_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icon_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/icons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_highlight.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_ripple.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_sparkle.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_splash.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/ink_well.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_chip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_date_picker_form_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/input_decorator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/list_tile_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/magnifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_localizations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_state.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/material_state_mixin.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_anchor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/menu_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/mergeable_material.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_drawer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_drawer_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_rail.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/navigation_rail_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/no_splash.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/outlined_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/outlined_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/page.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/page_transitions_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/paginated_data_table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/popup_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/popup_menu_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/progress_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/progress_indicator_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio_list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/radio_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/range_slider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/refresh_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/reorderable_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scaffold.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scrollbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/scrollbar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_anchor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/search_view_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/segmented_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/segmented_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/selectable_text.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/selection_area.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/shaders/ink_sparkle.frag -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/shadows.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/slider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/slider_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/snack_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/snack_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/stepper.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch_list_tile.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/switch_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_bar_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tab_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tabs.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_button_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_form_field.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/text_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/theme_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time_picker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/time_picker_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggle_buttons.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggle_buttons_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/toggleable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/tooltip_visibility.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/typography.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/material/user_accounts_drawer_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/_network_image_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/alignment.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/basic_types.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/beveled_rectangle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/border_radius.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/borders.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_fit.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/box_shadow.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/circle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/clip.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/colors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/continuous_rectangle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/decoration_image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/edge_insets.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/flutter_logo.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/fractional_offset.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/geometry.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/gradient.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_cache.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_decoder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_provider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_resolution.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/image_stream.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/inline_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/linear_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/matrix_utils.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/notched_shapes.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/oval_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/paint_utilities.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/placeholder_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/rounded_rectangle_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/shader_warm_up.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/shape_decoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/stadium_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/star_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/strut_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_painter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/painting/text_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/clamped_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/friction_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/gravity_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/spring_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/tolerance.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/physics/utils.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/animated_size.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/custom_layout.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/custom_paint.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/editable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/error.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/flex.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/flow.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/layer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/layout_helper.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/list_body.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/list_wheel_viewport.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/mouse_tracker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/object.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/paragraph.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/performance_overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/platform_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/proxy_box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/proxy_sliver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/rotated_box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/shifted_box.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_fill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_grid.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_padding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/sliver_persistent_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/stack.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/table_border.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/texture.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/tweens.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/viewport.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/viewport_offset.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/rendering/wrap.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/priority.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/scheduler/ticker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics_event.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/semantics/semantics_service.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/asset_bundle.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/asset_manifest.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/autofill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/binary_messenger.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/browser_context_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/clipboard.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/deferred_component.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/font_loader.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/haptic_feedback.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/hardware_keyboard.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_inserted_content.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_key.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/keyboard_maps.g.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/message_codec.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/message_codecs.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/mouse_cursor.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/mouse_tracking.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/platform_channel.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/platform_views.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_android.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_ios.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_linux.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_macos.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_web.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/raw_keyboard_windows.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/restoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/spell_check.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_channels.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_chrome.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_navigator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/system_sound.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_boundary.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_editing.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_editing_delta.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_formatter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_input.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/text_layout_metrics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/services/undo_manager.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/actions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_cross_fade.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_size.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/animated_switcher.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/annotated_region.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/app.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/async.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/autocomplete.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/autofill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/automatic_keep_alive.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/banner.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/basic.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/color_filter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/constants.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/container.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/context_menu_button_item.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/context_menu_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/debug.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/default_selection_style.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/dismissible.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/disposable_build_context.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/drag_target.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/dual_transition_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/editable_text.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/fade_in_image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_manager.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_scope.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/focus_traversal.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/form.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/framework.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/gesture_detector.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/grid_paper.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/heroes.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/icon_theme_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image_filter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/image_icon.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/implicit_animations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_model.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_notifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/inherited_theme.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/interactive_viewer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/keyboard_listener.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/layout_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/localizations.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/lookup_boundary.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/magnifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/media_query.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/modal_barrier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/navigation_toolbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/navigator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/nested_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/notification_listener.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/orientation_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overflow_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/overscroll_indicator.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/page_storage.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/page_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/pages.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/performance_overlay.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/placeholder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_menu_bar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/platform_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/preferred_size.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/primary_scroll_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/reorderable_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/restoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/restoration_properties.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/router.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/routes.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/safe_area.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_activity.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_configuration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_context.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_metrics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_notification.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_notification_observer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_physics.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_position.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollable.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollable_helpers.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/scrollbar.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/selectable_region.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/selection_container.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/semantics_debugger.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/service_extensions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/shared_app_data.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/shortcuts.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/single_child_scroll_view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_fill.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_layout_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_persistent_header.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/snapshot_widget.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/spacer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/spell_check.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/status_transitions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/table.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tap_region.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_editing_intents.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/texture.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/ticker_provider.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/title.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/transitions.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/tween_animation_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/undo_history.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/unique_widget.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/value_listenable_builder.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/view.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/viewport.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/visibility.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/widget_inspector.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/widget_span.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/src/widgets/will_pop_scope.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter/lib/widgets.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/flutter_test.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_binding_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_goldens_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/_matchers_io.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/accessibility.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/all_elements.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/animation_sheet.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/binding.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/controller.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/deprecated.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/event_simulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/finders.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/frame_timing_summarizer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/goldens.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/image.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/matchers.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/nonconst.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/platform.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/restoration.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/stack_manipulation.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_async_utils.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_compat.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_default_binary_messenger.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_exception_reporter.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_pointer.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_text_input.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_text_input_key_handler.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/test_vsync.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/widget_tester.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_test/lib/src/window.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/common.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart -/Users/leofarias/fvm/versions/3.10.6/packages/flutter_tools/lib/src/build_system/targets/macos.dart +/Users/leofarias/fvm/versions/3.19.0/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf +/Users/leofarias/fvm/versions/3.19.0/bin/cache/pkg/sky_engine/LICENSE +/Users/leofarias/fvm/versions/3.19.0/bin/internal/engine.version +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/LICENSE +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/animation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/cupertino.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/foundation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/gestures.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/material.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/painting.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/physics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/rendering.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/scheduler.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/semantics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/services.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/animation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/animation_controller.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/animation_style.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/animations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/curves.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/listener_helpers.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/tween.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/animation/tween_sequence.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/activity_indicator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/adaptive_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/app.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/checkbox.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/colors.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/constants.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/context_menu.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/context_menu_action.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/date_picker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/desktop_text_selection.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/desktop_text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/dialog.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/form_row.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/form_section.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/icon_theme_data.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/icons.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/interface_level.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/list_section.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/list_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/localizations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/magnifier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/nav_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/page_scaffold.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/picker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/radio.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/refresh.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/route.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/scrollbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/search_field.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/segmented_control.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/slider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/spell_check_suggestions_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/switch.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/tab_scaffold.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/tab_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/text_field.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/text_form_field_row.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/text_selection.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/text_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/thumb_painter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/cupertino/toggleable.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/_bitfield_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/_capabilities_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/_isolates_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/_platform_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/_timeline_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/annotations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/assertions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/basic_types.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/bitfield.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/capabilities.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/change_notifier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/collections.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/consolidate_response.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/constants.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/diagnostics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/isolates.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/key.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/licenses.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/memory_allocations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/node.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/object.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/observer_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/persistent_hash_map.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/platform.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/print.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/serialization.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/service_extensions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/stack_frame.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/synchronous_future.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/timeline.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/foundation/unicode.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/arena.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/constants.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/converter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/drag.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/drag_details.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/eager.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/events.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/force_press.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/gesture_settings.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/hit_test.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/long_press.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/lsq_solver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/monodrag.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/multidrag.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/multitap.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/pointer_router.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/pointer_signal_resolver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/recognizer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/resampler.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/scale.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/tap.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/tap_and_drag.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/team.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/gestures/velocity_tracker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/about.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/action_buttons.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/action_chip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/action_icons_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/adaptive_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/animated_icons.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/animated_icons_data.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/add_event.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/arrow_menu.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/close_menu.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/ellipsis_search.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/event_add.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/home_menu.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/list_view.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/menu_arrow.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/menu_close.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/menu_home.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/pause_play.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/play_pause.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/search_ellipsis.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/animated_icons/data/view_list.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/app.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/app_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/app_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/arc.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/autocomplete.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/back_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/badge.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/badge_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/banner.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/banner_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/bottom_app_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/bottom_app_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/bottom_navigation_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/bottom_sheet.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/bottom_sheet_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/button_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/button_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/button_style.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/button_style_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/calendar_date_picker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/card.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/card_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/checkbox.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/checkbox_list_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/checkbox_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/chip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/chip_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/choice_chip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/circle_avatar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/color_scheme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/colors.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/constants.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/curves.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/data_table.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/data_table_source.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/data_table_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/date.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/date_picker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/date_picker_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/desktop_text_selection.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/desktop_text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/desktop_text_selection_toolbar_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/dialog.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/dialog_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/divider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/divider_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/drawer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/drawer_header.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/drawer_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/dropdown.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/dropdown_menu.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/dropdown_menu_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/elevated_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/elevated_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/elevation_overlay.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/expand_icon.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/expansion_panel.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/expansion_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/expansion_tile_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/feedback.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/filled_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/filled_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/filter_chip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/flexible_space_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/floating_action_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/floating_action_button_location.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/floating_action_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/flutter_logo.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/grid_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/grid_tile_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/icon_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/icon_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/icons.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/ink_decoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/ink_highlight.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/ink_ripple.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/ink_sparkle.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/ink_splash.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/ink_well.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/input_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/input_chip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/input_date_picker_form_field.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/input_decorator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/list_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/list_tile_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/magnifier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/material.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/material_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/material_localizations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/material_state.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/material_state_mixin.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/menu_anchor.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/menu_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/menu_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/menu_style.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/menu_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/mergeable_material.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/motion.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/navigation_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/navigation_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/navigation_drawer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/navigation_drawer_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/navigation_rail.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/navigation_rail_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/no_splash.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/outlined_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/outlined_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/page.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/page_transitions_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/paginated_data_table.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/popup_menu.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/popup_menu_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/progress_indicator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/progress_indicator_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/radio.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/radio_list_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/radio_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/range_slider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/refresh_indicator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/reorderable_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/scaffold.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/scrollbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/scrollbar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/search.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/search_anchor.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/search_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/search_view_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/segmented_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/segmented_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/selectable_text.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/selection_area.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/shaders/ink_sparkle.frag +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/shadows.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/slider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/slider_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/snack_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/snack_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/spell_check_suggestions_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/spell_check_suggestions_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/stepper.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/switch.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/switch_list_tile.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/switch_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tab_bar_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tab_controller.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tab_indicator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tabs.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_button_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_field.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_form_field.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_selection.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_selection_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_selection_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_selection_toolbar_text_button.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/text_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/theme_data.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/time.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/time_picker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/time_picker_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/toggle_buttons.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/toggle_buttons_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/toggleable.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tooltip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tooltip_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/tooltip_visibility.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/typography.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/material/user_accounts_drawer_header.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/_network_image_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/alignment.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/basic_types.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/beveled_rectangle_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/border_radius.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/borders.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/box_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/box_decoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/box_fit.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/box_shadow.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/circle_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/clip.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/colors.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/continuous_rectangle_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/decoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/decoration_image.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/edge_insets.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/flutter_logo.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/fractional_offset.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/geometry.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/gradient.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/image_cache.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/image_decoder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/image_provider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/image_resolution.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/image_stream.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/inline_span.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/linear_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/matrix_utils.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/notched_shapes.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/oval_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/paint_utilities.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/placeholder_span.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/rounded_rectangle_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/shader_warm_up.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/shape_decoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/stadium_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/star_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/strut_style.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/text_painter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/text_scaler.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/text_span.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/painting/text_style.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/clamped_simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/friction_simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/gravity_simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/spring_simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/tolerance.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/physics/utils.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/animated_size.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/box.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/custom_layout.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/custom_paint.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/decorated_sliver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/editable.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/error.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/flex.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/flow.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/image.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/layer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/layout_helper.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/list_body.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/list_wheel_viewport.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/mouse_tracker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/object.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/paragraph.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/performance_overlay.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/platform_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/proxy_box.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/proxy_sliver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/rotated_box.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/selection.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/service_extensions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/shifted_box.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_fill.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_grid.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_group.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_padding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/sliver_persistent_header.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/stack.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/table.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/table_border.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/texture.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/tweens.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/viewport.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/viewport_offset.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/rendering/wrap.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/scheduler/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/scheduler/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/scheduler/priority.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/scheduler/service_extensions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/scheduler/ticker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/semantics/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/semantics/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/semantics/semantics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/semantics/semantics_event.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/semantics/semantics_service.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/_background_isolate_binary_messenger_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/asset_bundle.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/asset_manifest.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/autofill.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/binary_messenger.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/browser_context_menu.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/clipboard.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/deferred_component.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/flavor.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/font_loader.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/haptic_feedback.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/hardware_keyboard.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/keyboard_inserted_content.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/keyboard_key.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/keyboard_maps.g.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/live_text.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/message_codec.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/message_codecs.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/mouse_cursor.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/mouse_tracking.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/platform_channel.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/platform_views.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/process_text.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_android.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_fuchsia.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_ios.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_linux.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_macos.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_web.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/raw_keyboard_windows.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/restoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/service_extensions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/spell_check.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/system_channels.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/system_chrome.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/system_navigator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/system_sound.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/text_boundary.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/text_editing.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/text_editing_delta.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/text_formatter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/text_input.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/text_layout_metrics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/services/undo_manager.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/_html_element_view_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/_platform_selectable_region_context_menu_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/actions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/adapter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/animated_cross_fade.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/animated_scroll_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/animated_size.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/animated_switcher.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/annotated_region.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/app.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/app_lifecycle_listener.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/async.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/autocomplete.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/autofill.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/automatic_keep_alive.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/banner.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/basic.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/bottom_navigation_bar_item.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/color_filter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/constants.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/container.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/context_menu_button_item.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/context_menu_controller.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/debug.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/decorated_sliver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/default_selection_style.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/default_text_editing_shortcuts.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/desktop_text_selection_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/dismissible.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/display_feature_sub_screen.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/disposable_build_context.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/drag_target.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/dual_transition_builder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/editable_text.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/fade_in_image.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/focus_manager.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/focus_scope.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/focus_traversal.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/form.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/framework.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/gesture_detector.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/grid_paper.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/heroes.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/icon.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/icon_data.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/icon_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/icon_theme_data.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/image.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/image_filter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/image_icon.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/implicit_animations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/inherited_model.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/inherited_notifier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/inherited_theme.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/interactive_viewer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/keyboard_listener.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/layout_builder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/localizations.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/lookup_boundary.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/magnifier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/media_query.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/modal_barrier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/navigation_toolbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/navigator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/navigator_pop_handler.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/nested_scroll_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/notification_listener.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/orientation_builder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/overflow_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/overlay.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/overscroll_indicator.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/page_storage.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/page_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/pages.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/performance_overlay.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/placeholder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/platform_menu_bar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/platform_selectable_region_context_menu.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/platform_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/pop_scope.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/preferred_size.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/primary_scroll_controller.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/reorderable_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/restoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/restoration_properties.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/router.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/routes.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/safe_area.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_activity.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_aware_image_provider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_configuration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_context.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_controller.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_delegate.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_metrics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_notification.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_notification_observer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_physics.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_position.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scroll_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scrollable.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scrollable_helpers.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/scrollbar.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/selectable_region.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/selection_container.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/semantics_debugger.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/service_extensions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/shared_app_data.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/shortcuts.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/single_child_scroll_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/size_changed_layout_notifier.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/sliver.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/sliver_fill.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/sliver_layout_builder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/sliver_persistent_header.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/sliver_prototype_extent_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/sliver_varied_extent_list.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/slotted_render_object_widget.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/snapshot_widget.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/spacer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/spell_check.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/status_transitions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/table.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/tap_region.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/text.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/text_editing_intents.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/text_selection.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/text_selection_toolbar_anchors.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/text_selection_toolbar_layout_delegate.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/texture.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/ticker_provider.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/title.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/transitions.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/tween_animation_builder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/two_dimensional_scroll_view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/two_dimensional_viewport.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/undo_history.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/unique_widget.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/value_listenable_builder.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/view.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/viewport.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/visibility.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/widget_inspector.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/widget_span.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/src/widgets/will_pop_scope.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter/lib/widgets.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/flutter_test.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/_binding_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/_goldens_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/_matchers_io.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/accessibility.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/animation_sheet.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/binding.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/controller.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/deprecated.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/event_simulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/finders.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/frame_timing_summarizer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/goldens.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/image.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/matchers.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/mock_canvas.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/mock_event_channel.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/nonconst.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/platform.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/recording_canvas.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/restoration.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/stack_manipulation.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_async_utils.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_compat.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_default_binary_messenger.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_exception_reporter.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_pointer.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_text_input.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_text_input_key_handler.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/test_vsync.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/tree_traversal.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/widget_tester.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_test/lib/src/window.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_tools/lib/src/build_system/targets/common.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_tools/lib/src/build_system/targets/macos.dart +/Users/leofarias/fvm/versions/3.19.0/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart diff --git a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh index 701777f05..f550ea72f 100755 --- a/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/packages/remix/demo/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,13 +1,13 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6" +export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.19.0" export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix/demo" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=/Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=1.0.0" export "FLUTTER_BUILD_NUMBER=1" -export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw==" +export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC8wNDgxN2M5OWM5ZmQ0OTU2ZjI3NTA1MjA0ZjdlMzQ0MzM1ODEwYWVkLw==" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" diff --git a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj index de4d66361..5da3a824e 100644 --- a/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/remix/demo/macos/Runner.xcodeproj/project.pbxproj @@ -227,7 +227,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { diff --git a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 0b1d244f9..ae8764fa2 100644 --- a/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/remix/demo/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ =3.0.6 <4.0.0" + sdk: ">=3.3.0 <4.0.0" dependencies: flutter: diff --git a/packages/remix/lib/components/avatar/avatar_spec.g.dart b/packages/remix/lib/components/avatar/avatar_spec.g.dart index c60a12899..ed5e99c57 100644 --- a/packages/remix/lib/components/avatar/avatar_spec.g.dart +++ b/packages/remix/lib/components/avatar/avatar_spec.g.dart @@ -6,6 +6,8 @@ part of 'avatar_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$AvatarSpec on Spec { static AvatarSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/components/badge/badge.variants.dart b/packages/remix/lib/components/badge/badge.variants.dart index 42d7bf3fe..becfaaecd 100644 --- a/packages/remix/lib/components/badge/badge.variants.dart +++ b/packages/remix/lib/components/badge/badge.variants.dart @@ -1,26 +1,26 @@ -import 'package:mix/mix.dart'; +import 'package:remix/helpers/variant.dart'; -abstract interface class IBadgeVariant extends Variant { - const IBadgeVariant(super.name); +abstract interface class IBadgeVariant extends RemixVariant { + const IBadgeVariant(String name) : super('badge.$name'); } class BadgeVariant extends IBadgeVariant { - const BadgeVariant(super.name); + const BadgeVariant(String name) : super('variant.$name'); - static const solid = BadgeVariant('remix.badge.solid'); - static const soft = BadgeVariant('remix.badge.soft'); - static const surface = BadgeVariant('remix.badge.surface'); - static const outline = BadgeVariant('remix.badge.outline'); + static const solid = BadgeVariant('solid'); + static const soft = BadgeVariant('soft'); + static const surface = BadgeVariant('surface'); + static const outline = BadgeVariant('outline'); static List get values => [solid, soft, surface, outline]; } class BadgeSize extends IBadgeVariant { - const BadgeSize(super.name); + const BadgeSize(String name) : super('size.$name'); - static const small = BadgeSize('remix.badge.small'); - static const medium = BadgeSize('remix.badge.medium'); - static const large = BadgeSize('remix.badge.large'); + static const small = BadgeSize('small'); + static const medium = BadgeSize('medium'); + static const large = BadgeSize('large'); static List get values => [small, medium, large]; } diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button.style.dart index 6e233eb46..78d5fb6ac 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button.style.dart @@ -41,7 +41,7 @@ Style get _solidVariant => Style( _container.color.ref($rx.accent9), _foreground.color.ref($rx.neutral1), $on.hover( - _container.color.ref($rx.accent12), + _container.color.ref($rx.accent10), ), $on.disabled( _container.color.ref($rx.neutral3A), diff --git a/packages/remix/lib/components/card/card.style.dart b/packages/remix/lib/components/card/card.style.dart new file mode 100644 index 000000000..00d02175e --- /dev/null +++ b/packages/remix/lib/components/card/card.style.dart @@ -0,0 +1,39 @@ +import 'package:mix/mix.dart'; +import 'package:remix/components/card/card.variants.dart'; +import 'package:remix/components/card/card_spec.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _util = CardSpecUtility.self; +final _container = _util.container; +final _flex = _util.flex; +Style get _baseStyle => Style( + _container.padding(16), + _flex.column(), + _flex.gap(24), + _container.borderRadius(8), + ); + +Style get _solidVariant => Style( + _container.border.color.ref($rx.neutral1), + ); + +Style get _softVariant => Style( + _container.color.ref($rx.neutral3A), + ); + +Style get _surfaceVariant => Style( + _container.color.ref($rx.neutral3A), + _container.border.color.ref($rx.neutral7A), + _container.border.strokeAlign(1), + ); + +Style get _ghostVariant => Style(); +Style buildCardstyle(Style? style) { + return Style( + _baseStyle(), + CardVariant.solid(_solidVariant()), + CardVariant.soft(_softVariant()), + CardVariant.ghost(_ghostVariant()), + CardVariant.surface(_surfaceVariant()), + ).merge(style); +} diff --git a/packages/remix/lib/components/card/card.variants.dart b/packages/remix/lib/components/card/card.variants.dart new file mode 100644 index 000000000..ddb325d8a --- /dev/null +++ b/packages/remix/lib/components/card/card.variants.dart @@ -0,0 +1,21 @@ +import 'package:remix/helpers/variant.dart'; + +interface class ICardVariant extends RemixVariant { + const ICardVariant(String name) : super('card.$name'); +} + +class CardVariant extends ICardVariant { + const CardVariant(String name) : super('variant.$name'); + + static const solid = CardVariant('solid'); + static const soft = CardVariant('soft'); + static const surface = CardVariant('surface'); + static const ghost = CardVariant('ghost'); + + static List get values => [ + solid, + soft, + surface, + ghost, + ]; +} diff --git a/packages/remix/lib/components/card/card_spec.dart b/packages/remix/lib/components/card/card_spec.dart new file mode 100644 index 000000000..f7d7f4889 --- /dev/null +++ b/packages/remix/lib/components/card/card_spec.dart @@ -0,0 +1,24 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'card_spec.g.dart'; + +@MixableSpec() +base class CardSpec extends Spec with _$CardSpec { + final BoxSpec container; + + final FlexSpec flex; + + /// {@macro card_spec_of} + static const of = _$CardSpec.of; + + static const from = _$CardSpec.from; + + const CardSpec({ + BoxSpec? container, + FlexSpec? flex, + super.animated, + }) : container = container ?? const BoxSpec(), + flex = flex ?? const FlexSpec(); +} diff --git a/packages/remix/lib/components/card/card_spec.g.dart b/packages/remix/lib/components/card/card_spec.g.dart new file mode 100644 index 000000000..d85e89a76 --- /dev/null +++ b/packages/remix/lib/components/card/card_spec.g.dart @@ -0,0 +1,210 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'card_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +// ignore_for_file: deprecated_member_use_from_same_package + +base mixin _$CardSpec on Spec { + static CardSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const CardSpec(); + } + + /// {@template card_spec_of} + /// Retrieves the [CardSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [CardSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [CardSpec]. + /// + /// Example: + /// + /// ```dart + /// final cardSpec = CardSpec.of(context); + /// ``` + /// {@endtemplate} + static CardSpec of(BuildContext context) { + return _$CardSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [CardSpec] but with the given fields + /// replaced with the new values. + @override + CardSpec copyWith({ + BoxSpec? container, + FlexSpec? flex, + AnimatedData? animated, + }) { + return CardSpec( + container: container ?? _$this.container, + flex: flex ?? _$this.flex, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [CardSpec] and another [CardSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [CardSpec] is returned. When [t] is 1.0, the [other] [CardSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [CardSpec] is returned. + /// + /// If [other] is null, this method returns the current [CardSpec] instance. + /// + /// The interpolation is performed on each property of the [CardSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container]. + /// - [FlexSpec.lerp] for [flex]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [CardSpec] is used. Otherwise, the value + /// from the [other] [CardSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [CardSpec] configurations. + @override + CardSpec lerp(CardSpec? other, double t) { + if (other == null) return _$this; + + return CardSpec( + container: _$this.container.lerp(other.container, t), + flex: _$this.flex.lerp(other.flex, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [CardSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [CardSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.flex, + _$this.animated, + ]; + + CardSpec get _$this => this as CardSpec; +} + +/// Represents the attributes of a [CardSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [CardSpec]. +/// +/// Use this class to configure the attributes of a [CardSpec] and pass it to +/// the [CardSpec] constructor. +final class CardSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final FlexSpecAttribute? flex; + + const CardSpecAttribute({ + this.container, + this.flex, + super.animated, + }); + + /// Resolves to [CardSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final cardSpec = CardSpecAttribute(...).resolve(mix); + /// ``` + @override + CardSpec resolve(MixData mix) { + return CardSpec( + container: container?.resolve(mix), + flex: flex?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [CardSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [CardSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + CardSpecAttribute merge(covariant CardSpecAttribute? other) { + if (other == null) return this; + + return CardSpecAttribute( + container: container?.merge(other.container) ?? other.container, + flex: flex?.merge(other.flex) ?? other.flex, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [CardSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [CardSpecAttribute] instances for equality. + @override + List get props => [ + container, + flex, + animated, + ]; +} + +/// Utility class for configuring [CardSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [CardSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [CardSpecAttribute]. +base class CardSpecUtility + extends SpecUtility { + /// Utility for defining [CardSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [CardSpecAttribute.flex] + late final flex = FlexSpecUtility((v) => only(flex: v)); + + /// Utility for defining [CardSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + CardSpecUtility(super.builder); + + static final self = CardSpecUtility((v) => v); + + /// Returns a new [CardSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + FlexSpecAttribute? flex, + AnimatedDataDto? animated, + }) { + return builder(CardSpecAttribute( + container: container, + flex: flex, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [CardSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [CardSpec] specifications. +class CardSpecTween extends Tween { + CardSpecTween({ + super.begin, + super.end, + }); + + @override + CardSpec lerp(double t) { + if (begin == null && end == null) return const CardSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/card/card_widget.dart b/packages/remix/lib/components/card/card_widget.dart new file mode 100644 index 000000000..13c8e7244 --- /dev/null +++ b/packages/remix/lib/components/card/card_widget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/card/card.style.dart'; +import 'package:remix/components/card/card.variants.dart'; +import 'package:remix/components/card/card_spec.dart'; + +class RxCard extends StatelessWidget { + const RxCard({ + super.key, + required this.children, + this.variant = CardVariant.solid, + this.style, + }); + + /// The list of child widgets to be displayed inside the card. + final List children; + + final CardVariant variant; + + /// Additional custom styling for the card. + /// + /// This allows you to override or extend the default card styling. + final Style? style; + + Style _buildStyle() { + return buildCardstyle(style).applyVariant(variant).animate(); + } + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: _buildStyle(), + builder: (context) { + final spec = CardSpec.of(context); + + return spec.container( + child: spec.flex( + direction: Axis.vertical, + children: children, + ), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/checkbox/checkbox_spec.dart b/packages/remix/lib/components/checkbox/checkbox_spec.dart index d52085d0a..99fe7be47 100644 --- a/packages/remix/lib/components/checkbox/checkbox_spec.dart +++ b/packages/remix/lib/components/checkbox/checkbox_spec.dart @@ -7,7 +7,7 @@ part 'checkbox_spec.g.dart'; @MixableSpec() base class CheckboxSpec extends Spec with _$CheckboxSpec { final BoxSpec container; - final IconSpec icon; + final IconSpec indicator; /// {@macro button_spec_of} static const of = _$CheckboxSpec.of; @@ -16,8 +16,8 @@ base class CheckboxSpec extends Spec with _$CheckboxSpec { const CheckboxSpec({ BoxSpec? container, - IconSpec? icon, + IconSpec? indicator, super.animated, }) : container = container ?? const BoxSpec(), - icon = icon ?? const IconSpec(); + indicator = indicator ?? const IconSpec(); } diff --git a/packages/remix/lib/components/checkbox/checkbox_spec.g.dart b/packages/remix/lib/components/checkbox/checkbox_spec.g.dart index 4374a3e1e..596dcdac7 100644 --- a/packages/remix/lib/components/checkbox/checkbox_spec.g.dart +++ b/packages/remix/lib/components/checkbox/checkbox_spec.g.dart @@ -6,6 +6,8 @@ part of 'checkbox_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$CheckboxSpec on Spec { static CheckboxSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? @@ -34,12 +36,12 @@ base mixin _$CheckboxSpec on Spec { @override CheckboxSpec copyWith({ BoxSpec? container, - IconSpec? icon, + IconSpec? indicator, AnimatedData? animated, }) { return CheckboxSpec( container: container ?? _$this.container, - icon: icon ?? _$this.icon, + indicator: indicator ?? _$this.indicator, animated: animated ?? _$this.animated, ); } @@ -56,7 +58,7 @@ base mixin _$CheckboxSpec on Spec { /// interpolation method: /// /// - [BoxSpec.lerp] for [container]. - /// - [IconSpec.lerp] for [icon]. + /// - [IconSpec.lerp] for [indicator]. /// For [animated], the interpolation is performed using a step function. /// If [t] is less than 0.5, the value from the current [CheckboxSpec] is used. Otherwise, the value @@ -70,7 +72,7 @@ base mixin _$CheckboxSpec on Spec { return CheckboxSpec( container: _$this.container.lerp(other.container, t), - icon: _$this.icon.lerp(other.icon, t), + indicator: _$this.indicator.lerp(other.indicator, t), animated: t < 0.5 ? _$this.animated : other.animated, ); } @@ -82,7 +84,7 @@ base mixin _$CheckboxSpec on Spec { @override List get props => [ _$this.container, - _$this.icon, + _$this.indicator, _$this.animated, ]; @@ -98,11 +100,11 @@ base mixin _$CheckboxSpec on Spec { /// the [CheckboxSpec] constructor. final class CheckboxSpecAttribute extends SpecAttribute { final BoxSpecAttribute? container; - final IconSpecAttribute? icon; + final IconSpecAttribute? indicator; const CheckboxSpecAttribute({ this.container, - this.icon, + this.indicator, super.animated, }); @@ -118,7 +120,7 @@ final class CheckboxSpecAttribute extends SpecAttribute { CheckboxSpec resolve(MixData mix) { return CheckboxSpec( container: container?.resolve(mix), - icon: icon?.resolve(mix), + indicator: indicator?.resolve(mix), animated: animated?.resolve(mix) ?? mix.animation, ); } @@ -137,7 +139,7 @@ final class CheckboxSpecAttribute extends SpecAttribute { return CheckboxSpecAttribute( container: container?.merge(other.container) ?? other.container, - icon: icon?.merge(other.icon) ?? other.icon, + indicator: indicator?.merge(other.indicator) ?? other.indicator, animated: animated?.merge(other.animated) ?? other.animated, ); } @@ -149,7 +151,7 @@ final class CheckboxSpecAttribute extends SpecAttribute { @override List get props => [ container, - icon, + indicator, animated, ]; } @@ -163,8 +165,8 @@ base class CheckboxSpecUtility /// Utility for defining [CheckboxSpecAttribute.container] late final container = BoxSpecUtility((v) => only(container: v)); - /// Utility for defining [CheckboxSpecAttribute.icon] - late final icon = IconSpecUtility((v) => only(icon: v)); + /// Utility for defining [CheckboxSpecAttribute.indicator] + late final indicator = IconSpecUtility((v) => only(indicator: v)); /// Utility for defining [CheckboxSpecAttribute.animated] late final animated = AnimatedUtility((v) => only(animated: v)); @@ -177,12 +179,12 @@ base class CheckboxSpecUtility @override T only({ BoxSpecAttribute? container, - IconSpecAttribute? icon, + IconSpecAttribute? indicator, AnimatedDataDto? animated, }) { return builder(CheckboxSpecAttribute( container: container, - icon: icon, + indicator: indicator, animated: animated, )); } diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart index 3833da3b3..3f07e6441 100644 --- a/packages/remix/lib/components/checkbox/checkbox_style.dart +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -9,7 +9,7 @@ import 'package:remix/tokens/remix_tokens.dart'; final _util = CheckboxSpecUtility.self; final _container = _util.container; -final _icon = _util.icon; +final _indicator = _util.indicator; Style get _baseStyle => Style( _container.borderRadius(4), @@ -17,15 +17,15 @@ Style get _baseStyle => Style( Style get _onDisabledForeground => Style( $on.disabled( - _icon.color.ref($rx.neutral7A), + _indicator.color.ref($rx.neutral7A), ), ); Style get _solidVariant => Style( _container.color.ref($rx.accent9), - _icon.color.ref($rx.neutral1), + _indicator.color.ref($rx.neutral1), $on.hover( - _container.color.ref($rx.accent12), + _container.color.ref($rx.accent10), ), $on.disabled( _container.color.ref($rx.neutral3A), @@ -34,7 +34,7 @@ Style get _solidVariant => Style( Style get _softVariant => Style( _container.color.ref($rx.accent3A), - _icon.color.ref($rx.accent11A), + _indicator.color.ref($rx.accent11A), $on.hover( _container.color.ref($rx.accent4A), ), @@ -46,7 +46,7 @@ Style get _outlineVariant => Style( _container.color(Colors.transparent), _container.border.color.ref($rx.accent8A), _container.border.width(1.5), - _icon.color.ref($rx.accent11A), + _indicator.color.ref($rx.accent11A), $on.hover( _container.color.ref($rx.accent2A), ), @@ -71,7 +71,7 @@ Style get _surfaceVariant => Style( final _ghostVariant = Style( _container.border.style.none(), _container.color(Colors.transparent), - _icon.color.ref($rx.accent11A), + _indicator.color.ref($rx.accent11A), $on.hover( _container.color.ref($rx.accent3A), ), @@ -80,22 +80,22 @@ final _ghostVariant = Style( Style get _disabledVariant => Style( _container.color.ref($rx.neutral3A), _container.border.color.ref($rx.neutral5A), - _icon.color.ref($rx.neutral7A), + _indicator.color.ref($rx.neutral7A), ); Style get _smallVariant => Style( _container.size(16), - _icon.size(12), + _indicator.size(12), ); Style get _mediumVariant => Style( _container.size(20), - _icon.size(16), + _indicator.size(16), ); Style get _largeVariant => Style( _container.size(24), - _icon.size(20), + _indicator.size(20), ); Style buildDefaultCheckboxStyle() { diff --git a/packages/remix/lib/components/checkbox/checkbox_variants.dart b/packages/remix/lib/components/checkbox/checkbox_variants.dart index aabd45901..d3f84d275 100644 --- a/packages/remix/lib/components/checkbox/checkbox_variants.dart +++ b/packages/remix/lib/components/checkbox/checkbox_variants.dart @@ -5,10 +5,10 @@ abstract interface class ICheckboxVariant extends RemixVariant { } class CheckboxStatus extends ICheckboxVariant { - const CheckboxStatus(String name) : super('status.$name'); + const CheckboxStatus._(String name) : super('status.$name'); - static const checked = CheckboxStatus('checked'); - static const unchecked = CheckboxStatus('unchecked'); + static const checked = CheckboxStatus._('checked'); + static const unchecked = CheckboxStatus._('unchecked'); } class CheckboxVariant extends ICheckboxVariant { diff --git a/packages/remix/lib/components/checkbox/checkbox.dart b/packages/remix/lib/components/checkbox/checkbox_widget.dart similarity index 87% rename from packages/remix/lib/components/checkbox/checkbox.dart rename to packages/remix/lib/components/checkbox/checkbox_widget.dart index 9d243c110..444754993 100644 --- a/packages/remix/lib/components/checkbox/checkbox.dart +++ b/packages/remix/lib/components/checkbox/checkbox_widget.dart @@ -34,9 +34,11 @@ class RxCheckbox extends StatelessWidget { void _handleOnPress() => onChanged?.call(!value); Style _buildStyle() { - return buildDefaultCheckboxStyle() - .merge(style) - .applyVariants([size, variant]).animate(); + return buildDefaultCheckboxStyle().merge(style).applyVariants([ + size, + variant, + value ? CheckboxStatus.checked : CheckboxStatus.unchecked + ]).animate(); } @override @@ -50,7 +52,7 @@ class RxCheckbox extends StatelessWidget { final spec = CheckboxSpec.of(context); final ContainerWidget = spec.container; - final IconWidget = spec.icon; + final IconWidget = spec.indicator; return ContainerWidget( child: IconWidget( diff --git a/packages/remix/lib/components/checkbox_group/checkbox_group.dart b/packages/remix/lib/components/checkbox_group/checkbox_group.dart index a803b0e14..28b9c3ba1 100644 --- a/packages/remix/lib/components/checkbox_group/checkbox_group.dart +++ b/packages/remix/lib/components/checkbox_group/checkbox_group.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/checkbox/checkbox.dart'; import 'package:remix/components/checkbox/checkbox_variants.dart'; +import 'package:remix/components/checkbox/checkbox_widget.dart'; class RxCheckboxGroup extends StatefulWidget { const RxCheckboxGroup({ diff --git a/packages/remix/lib/components/progress/progress_spec.g.dart b/packages/remix/lib/components/progress/progress_spec.g.dart index c4b5ba787..6d66148d2 100644 --- a/packages/remix/lib/components/progress/progress_spec.g.dart +++ b/packages/remix/lib/components/progress/progress_spec.g.dart @@ -6,6 +6,8 @@ part of 'progress_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$ProgressSpec on Spec { static ProgressSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/components/radio/radio_spec.g.dart b/packages/remix/lib/components/radio/radio_spec.g.dart index 32011b898..72e145e23 100644 --- a/packages/remix/lib/components/radio/radio_spec.g.dart +++ b/packages/remix/lib/components/radio/radio_spec.g.dart @@ -6,6 +6,8 @@ part of 'radio_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$RadioSpec on Spec { static RadioSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/components/radio/radio_style.dart b/packages/remix/lib/components/radio/radio_style.dart index 8b7c3fb70..52316380e 100644 --- a/packages/remix/lib/components/radio/radio_style.dart +++ b/packages/remix/lib/components/radio/radio_style.dart @@ -21,7 +21,7 @@ Style get _solidVariant => Style( _container.color.ref($rx.accent9), _indicator.color.ref($rx.neutral1), $on.hover( - _container.color.ref($rx.accent12), + _container.color.ref($rx.accent10), ), $on.disabled( _container.color.ref($rx.neutral3A), diff --git a/packages/remix/lib/components/spinner/spinner_spec.g.dart b/packages/remix/lib/components/spinner/spinner_spec.g.dart index 81ad8d8b8..7392543ad 100644 --- a/packages/remix/lib/components/spinner/spinner_spec.g.dart +++ b/packages/remix/lib/components/spinner/spinner_spec.g.dart @@ -6,6 +6,8 @@ part of 'spinner_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$SpinnerSpec on Spec { static SpinnerSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/components/switch/switch.style.dart b/packages/remix/lib/components/switch/switch.style.dart index 21281acb2..4265f1065 100644 --- a/packages/remix/lib/components/switch/switch.style.dart +++ b/packages/remix/lib/components/switch/switch.style.dart @@ -21,41 +21,91 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - $on.hover( - _container.color.ref($rx.accent12), + _indicator.color.ref($rx.neutral1), + SwitchStatus.on( + _container.color.ref($rx.accent9), + ), + SwitchStatus.off( + _container.color.ref($rx.neutral3), ), $on.disabled( _container.color.ref($rx.neutral3A), + _indicator.color.ref($rx.neutral7A), ), + ); + +Style get _softVariant => Style( + _indicator.color.ref($rx.accent11A), SwitchStatus.on( - _container.color.ref($rx.accent9), - _indicator.color.ref($rx.neutral1), + _container.color.ref($rx.accent3A), ), SwitchStatus.off( _container.color.ref($rx.neutral4), - _indicator.color.ref($rx.neutral1), + ), + $on.disabled( + _container.color.ref($rx.neutral3A), + _indicator.color.ref($rx.neutral7A), + ), + ); + +Style get _outlineVariant => Style( + _container.color.transparent(), + _container.border.width(1.5), + _container.border.strokeAlign(1), + _indicator.color.ref($rx.accent11A), + SwitchStatus.on( + _container.border.color.ref($rx.accent8A), + ), + SwitchStatus.off( + _container.border.color.ref($rx.neutral4), + ), + $on.disabled( + _container.border.color.ref($rx.neutral8A), + _indicator.color.ref($rx.neutral7A), + ), + ); + +Style get _surfaceVariant => Style( + _outlineVariant(), + SwitchStatus.on( + _container.color.ref($rx.accent3A), + ), + SwitchStatus.off( + _container.color.ref($rx.neutral3A), + _container.border.color.ref($rx.neutral4), + ), + $on.disabled( + _container.color.ref($rx.neutral2A), ), ); Style get _smallVariant => Style( _container.width(24), - _container.padding.horizontal(1), + _container.padding.horizontal(2), _container.height(16), _indicator.size(12), + SwitchStatus.off( + _indicator.size(8), + _container.padding.horizontal(2), + ), ); Style get _mediumVariant => Style( _container.width(32), - _container.padding.horizontal(2), + _container.padding.horizontal(3), _container.height(20), - _indicator.size(16), + _indicator.size(14), + SwitchStatus.off( + _indicator.size(12), + ), ); Style get _largeVariant => Style( _container.width(40), _container.padding.horizontal(3), _container.height(24), - _indicator.size(20), + _indicator.size(18), + SwitchStatus.off(_indicator.size(16)), ); Style buildSwitchStyle() { @@ -66,5 +116,8 @@ Style buildSwitchStyle() { SwitchSize.medium(_mediumVariant()), SwitchSize.large(_largeVariant()), SwitchVariant.solid(_solidVariant()), + SwitchVariant.soft(_softVariant()), + SwitchVariant.outline(_outlineVariant()), + SwitchVariant.surface(_surfaceVariant()), ); } diff --git a/packages/remix/lib/components/switch/switch_spec.g.dart b/packages/remix/lib/components/switch/switch_spec.g.dart index 4703e8d77..4ec9f523b 100644 --- a/packages/remix/lib/components/switch/switch_spec.g.dart +++ b/packages/remix/lib/components/switch/switch_spec.g.dart @@ -6,6 +6,8 @@ part of 'switch_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$SwitchSpec on Spec { static SwitchSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index c56f9c085..50bb19774 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -4,10 +4,14 @@ export 'components/button/button.style.dart'; export 'components/button/button.variants.dart'; export 'components/button/button_spec.dart'; export 'components/button/button_widget.dart'; -export 'components/checkbox/checkbox.dart'; +export 'components/card/card.style.dart'; +export 'components/card/card.variants.dart'; +export 'components/card/card_spec.dart'; +export 'components/card/card_widget.dart'; export 'components/checkbox/checkbox_spec.dart'; export 'components/checkbox/checkbox_style.dart'; export 'components/checkbox/checkbox_variants.dart'; +export 'components/checkbox/checkbox_widget.dart'; export 'components/radio/radio_spec.dart'; export 'components/radio/radio_style.dart'; export 'components/radio/radio_variants.dart'; diff --git a/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 008cc46c9..8e5ab25f5 100644 --- a/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/packages/remix/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,5 +1,5 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6 +FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.19.0 FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_BUILD_DIR=build diff --git a/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh index 6f1822b15..54c982787 100755 --- a/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/packages/remix/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,6 +1,6 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.10.6" +export "FLUTTER_ROOT=/Users/leofarias/fvm/versions/3.19.0" export "FLUTTER_APPLICATION_PATH=/Users/leofarias/Projects/mix/packages/remix" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_BUILD_DIR=build" diff --git a/packages/remix/pubspec.yaml b/packages/remix/pubspec.yaml index f14bd52e5..d198dc789 100644 --- a/packages/remix/pubspec.yaml +++ b/packages/remix/pubspec.yaml @@ -4,7 +4,7 @@ description: Completely unstyled, widgets designed to integrate with Mix version: 0.0.1 environment: - sdk: ">=3.0.6 <4.0.0" + sdk: ">=3.3.0 <4.0.0" dependencies: flutter: diff --git a/website/pages/docs/tutorials/custom-component.mdx b/website/pages/docs/tutorials/custom-component.mdx new file mode 100644 index 000000000..ed462b3e8 --- /dev/null +++ b/website/pages/docs/tutorials/custom-component.mdx @@ -0,0 +1,272 @@ + + +import { Callout } from "nextra-theme-docs"; + +# Building Custom Design System Component + +Mix is a powerful tool, and to make it even more powerful, we can add support for new widgets and increase its functionality for more and more use cases. Therefore, this guide will help you add support for new widgets. + +To make this tutorial more practical, we will add support for a widget from `Material`, the TextField. Specifically, we will add support for the `decoration` attribute, which defines most of the visual aspects of the TextField. As a result, we will be able to go from the default TextField, which looks like this: + + + +## 1. Define the Spec + +As we are adding support for a new widget and its attributes that you want to customize, we need to define the spec for it. The spec is an object that defines the attributes the widget has and how to handle them. The spec for the `InputDecoration` is: + +```dart +class InputDecorationSpec extends Spec { + final InputBorder? border; + final bool? filled; + final Color? fillColor; + final EdgeInsetsGeometry? contentPadding; + + const InputDecorationSpec({ + this.border, + this.filled, + this.fillColor, + this.contentPadding, + }); + + const InputDecorationSpec.empty() + : border = null, + filled = null, + fillColor = null, + contentPadding = null; + + static InputDecorationSpec of(BuildContext context) { + final mix = Mix.of(context); + return mix.attributeOf()?.resolve(mix) ?? + const InputDecorationSpec.empty(); + } + + @override + InputDecorationSpec lerp(InputDecorationSpec? other, double t) { + return InputDecorationSpec( + border: other?.border, + filled: t < 0.5 ? filled : other?.filled, + fillColor: Color.lerp(fillColor, other?.fillColor, t), + contentPadding: EdgeInsetsGeometry.lerp( + contentPadding, + other?.contentPadding, + t, + ), + ); + } + + InputDecorationSpec copyWith({ + InputBorder? border, + bool? filled, + Color? fillColor, + EdgeInsetsGeometry? contentPadding, + }) { + return InputDecorationSpec( + border: border ?? this.border, + filled: filled ?? this.filled, + fillColor: fillColor ?? this.fillColor, + contentPadding: contentPadding ?? this.contentPadding, + ); + } + + @override + get props => [ + border, + filled, + fillColor, + contentPadding, + ]; +} +``` + +At first glance, it may seem a bit complex, but it's not. The `InputDecorationSpec` is a class that extends `Spec` and has a constructor that receives the attributes of the `InputDecoration`. For this example, I chose just four attributes: `border`, `filled`, `fillColor`, and `contentPadding`. However, for a real implementation, you should add all the attributes that the `InputDecoration` has. + +Looking at the rest of the class, you can see the named constructor `empty`, which returns a default implementation of the `InputDecorationSpec`, the `of` method that receives a `MixData` and returns an `InputDecorationSpec` with the values of the `MixData`. The `lerp` method is used to interpolate between two `InputDecorationSpec` instances. + +The Spec is the base for supporting a new widget and its attributes. + +## 2. Create the Attribute + +The attribute is the class that will be used to handle the `InputDecorationSpec`. The `InputDecorationSpecAttribute` is: + +```dart +class InputDecorationSpecAttribute extends SpecAttribute { + final InputBorder? border; + final bool? filled; + final ColorDto? fillColor; + final SpacingDto? contentPadding; + + const InputDecorationSpecAttribute({ + this.border, + this.filled, + this.fillColor, + this.contentPadding, + }); + + @override + InputDecorationSpec resolve(MixData mix) { + return InputDecorationSpec( + border: border, + filled: filled, + fillColor: fillColor?.resolve(mix), + contentPadding: contentPadding?.resolve(mix), + ); + } + + @override + InputDecorationSpecAttribute merge( + covariant InputDecorationSpecAttribute? other) { + if (other == null) return this; + + return InputDecorationSpecAttribute( + border: other.border ?? border, + filled: other.filled ?? filled, + fillColor: other.fillColor ?? fillColor, + contentPadding: other.contentPadding ?? contentPadding, + ); + } + + @override + get props => [ + border, + filled, + fillColor, + contentPadding, + ]; +} + +``` + +Looking at the properties' definition, you will see some changes in the property types. For example, now `fillColor` is a `ColorDto`, and `contentPadding` is a `SpacingDto`. This is because the Mix uses `Dto` classes to handle more complex types and provide facilities to use them. + +The `InputDecorationSpecAttribute` is a class that extends `SpecAttribute` and has a `resolve` method, which is a useful method to transform the `InputDecorationSpec` from the `MixData`. The `merge` method is used to merge two different declarations of the `InputDecorationSpecAttribute`. A good example of this is: + +```dart +final style = Style( + InputDecorationSpecAttribute( + border: OutlineInputBorder(), + fillColor: ColorDto(Colors.blue), + filled: true, + ), + InputDecorationSpecAttribute( + fillColor: ColorDto(Colors.red), + contentPadding: SpacingDto.only(top: 10), + ), +) +``` + +In this case, the `style` will have the `border` and `filled` from the first declaration, and the `fillColor` and `contentPadding` from the second declaration. Be aware that the second declaration of `fillColor` will override the first one, so the final `InputDecorationSpec` will have the `fillColor` as `Colors.red`. + +## 3. Build the Custom Widget + +The custom widget is the widget that will use the `InputDecorationSpec` to build itself. It's a class that has a `SpecBuilder` in its composition. For this example, the `CustomTextField` is: + +```dart +class StyledTextField extends StyledWidget { + const StyledTextField({ + super.key, + super.style, + super.orderOfModifiers = const [], + }); + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: style, + orderOfModifiers: orderOfModifiers, + builder: (context) { + final inputDecoration = InputDecorationSpec.of(context); + + return TextField( + decoration: InputDecoration( + border: inputDecoration.border, + filled: inputDecoration.filled, + fillColor: inputDecoration.fillColor, + contentPadding: inputDecoration.contentPadding, + ), + ); + }, + ); + } +} +``` + +The `SpecBuilder` is a class that extends `StyledWidget`. The `build` method uses the `withMix` method to transform the style received from StyledTextField to a `MixData`, it also verifies if there are some inheritable attributes from the parent widgets, but this only happens if the `inherit` property is `true`. With the `MixData` instance in hands, you can use the `InputDecorationSpec.of` method to get the `InputDecorationSpec` from the `MixData`. Now you are able to apply the `InputDecorationSpec` to the `TextField` and return it. + +Now you are already ready to use the `StyledTextField` in your app and customize the `InputDecoration` of the `TextField` with Mix. + +```dart +final style = Style( + InputDecorationSpecAttribute( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + borderSide: BorderSide.none, + ), + fillColor: ColorDto(Colors.blueAccent.shade200), + filled: true, + contentPadding: SpacingDto.all(24), + ), +); +``` + +## 4. Create the Utility + +In the last step, we mentioned that you're ready to use the `StyledTextField` in your app, which is true. However, there's an opportunity to enhance its usability further. By creating a utility, you can simplify the process of applying attributes to the `InputDecoration`, making it even more convenient to customize your text fields. + +```dart +class InputDecorationUtility + extends SpecUtility { + InputDecorationUtility(super.builder); + + @override + T only({ + InputBorder? border, + bool? filled, + ColorDto? fillColor, + SpacingDto? contentPadding, + }) { + return builder( + InputDecorationSpecAttribute( + border: border, + filled: filled, + fillColor: fillColor, + contentPadding: contentPadding, + ), + ); + } + + late final fillColor = ColorUtility((color) => only(fillColor: color)); + + late final filled = BoolUtility((boolean) => only(filled: boolean)); + + late final contentPadding = + SpacingUtility((spacing) => only(contentPadding: spacing)); + + T border(InputBorder inputBorder) => only(border: inputBorder); +} + +``` + +The `InputDecorationUtility` is a class that extends `SpecUtility` and has methods to create the `InputDecorationSpecAttribute` with the attributes of the `InputDecoration`. The awesome thing about it is that each pre-defined Utility has some facilities to use the attributes. For example, the `filled` returns a `BoolUtility` that comes with `on` and `off` methods to make the code more readable, or the `fillColor` that returns a `ColorUtility` that comes with a bunch of methods to make it easier to use the `Color` attributes and perform operations with them. + +To finish, you can create a variable to use the `InputDecorationUtility`, like this: + +```dart +final $inputDecoration = InputDecorationUtility(MixUtility.selfBuilder); +``` + +So you can write the `Style` like this: + +```dart +final style = Style( + $inputDecoration.border( + OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + borderSide: BorderSide.none, + ), + ), + $inputDecoration.filled.on(), + $inputDecoration.fillColor., + $inputDecoration.contentPadding.all(24), + $with.scale(2), +); +``` diff --git a/website/pages/docs/tutorials/supporting-new-widgets.mdx b/website/pages/docs/tutorials/supporting-new-widgets copy.mdx similarity index 100% rename from website/pages/docs/tutorials/supporting-new-widgets.mdx rename to website/pages/docs/tutorials/supporting-new-widgets copy.mdx From c400db62de307fe36dec96ee2ef94d3cf55e2ee7 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Thu, 11 Jul 2024 12:43:24 -0400 Subject: [PATCH 15/24] Color token improvements --- .../demo/lib/components/avatar_use_case.dart | 56 ++++ .../demo/lib/components/callout_use_case.dart | 53 ++++ .../demo/lib/components/switch_use_case.dart | 2 +- .../remix/demo/lib/main.directories.g.dart | 52 +++- .../ephemeral/FlutterInputs.xcfilelist | 28 +- .../macos/Runner/DebugProfile.entitlements | 2 + .../demo/macos/Runner/Release.entitlements | 2 + .../lib/components/avatar/avatar.style.dart | 99 -------- .../components/avatar/avatar.variants.dart | 50 ---- .../lib/components/avatar/avatar_style.dart | 104 ++++++++ .../components/avatar/avatar_variants.dart | 50 ++++ .../lib/components/avatar/avatar_widget.dart | 49 ++++ .../lib/components/badge/badge_spec.g.dart | 2 + .../{badge.style.dart => badge_style.dart} | 40 +-- ...adge.variants.dart => badge_variants.dart} | 0 .../lib/components/badge/badget_widget.dart | 12 +- .../lib/components/button/button_spec.g.dart | 2 + .../{button.style.dart => button_style.dart} | 84 +++--- ...ton.variants.dart => button_variants.dart} | 0 .../lib/components/button/button_widget.dart | 4 +- .../lib/components/callout/callout_spec.dart | 29 +++ .../components/callout/callout_spec.g.dart | 240 ++++++++++++++++++ .../lib/components/callout/callout_style.dart | 50 ++++ .../components/callout/callout_variants.dart | 15 ++ .../components/callout/callout_widget.dart | 45 ++++ .../card/{card.style.dart => card_style.dart} | 10 +- ...{card.variants.dart => card_variants.dart} | 0 .../lib/components/card/card_widget.dart | 4 +- .../components/checkbox/checkbox_style.dart | 44 ++-- .../components/context.md} | 0 ...rogress.style.dart => progress_style.dart} | 18 +- ...s.variants.dart => progress_variants.dart} | 0 .../components/progress/progress_widget.dart | 4 +- .../lib/components/radio/radio_style.dart | 42 +-- .../lib/components/spinner/spinner.style.dart | 2 +- .../{switch.style.dart => switch_style.dart} | 40 +-- ...tch.variants.dart => switch_variants.dart} | 0 .../lib/components/switch/switch_widget.dart | 4 +- packages/remix/lib/helpers/color_palette.dart | 25 -- packages/remix/lib/remix.dart | 12 +- packages/remix/lib/tokens/color_tokens.dart | 142 +++-------- packages/remix/lib/tokens/remix_tokens.dart | 80 +----- packages/remix/lib/tokens/space_tokens.dart | 31 +++ packages/remix/scripts/generate.dart | 53 ++++ packages/remix/scripts/markdown.dart | 28 ++ 45 files changed, 1076 insertions(+), 533 deletions(-) create mode 100644 packages/remix/demo/lib/components/avatar_use_case.dart create mode 100644 packages/remix/demo/lib/components/callout_use_case.dart delete mode 100644 packages/remix/lib/components/avatar/avatar.style.dart delete mode 100644 packages/remix/lib/components/avatar/avatar.variants.dart create mode 100644 packages/remix/lib/components/avatar/avatar_style.dart create mode 100644 packages/remix/lib/components/avatar/avatar_variants.dart rename packages/remix/lib/components/badge/{badge.style.dart => badge_style.dart} (53%) rename packages/remix/lib/components/badge/{badge.variants.dart => badge_variants.dart} (100%) rename packages/remix/lib/components/button/{button.style.dart => button_style.dart} (60%) rename packages/remix/lib/components/button/{button.variants.dart => button_variants.dart} (100%) create mode 100644 packages/remix/lib/components/callout/callout_spec.dart create mode 100644 packages/remix/lib/components/callout/callout_spec.g.dart create mode 100644 packages/remix/lib/components/callout/callout_style.dart create mode 100644 packages/remix/lib/components/callout/callout_variants.dart create mode 100644 packages/remix/lib/components/callout/callout_widget.dart rename packages/remix/lib/components/card/{card.style.dart => card_style.dart} (74%) rename packages/remix/lib/components/card/{card.variants.dart => card_variants.dart} (100%) rename packages/remix/{scripts/context_markdown.dart => lib/components/context.md} (100%) rename packages/remix/lib/components/progress/{progress.style.dart => progress_style.dart} (80%) rename packages/remix/lib/components/progress/{progress.variants.dart => progress_variants.dart} (100%) rename packages/remix/lib/components/switch/{switch.style.dart => switch_style.dart} (67%) rename packages/remix/lib/components/switch/{switch.variants.dart => switch_variants.dart} (100%) create mode 100644 packages/remix/scripts/generate.dart create mode 100644 packages/remix/scripts/markdown.dart diff --git a/packages/remix/demo/lib/components/avatar_use_case.dart b/packages/remix/demo/lib/components/avatar_use_case.dart new file mode 100644 index 000000000..0b85249ef --- /dev/null +++ b/packages/remix/demo/lib/components/avatar_use_case.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:remix/components/avatar/avatar_variants.dart'; +import 'package:remix/components/avatar/avatar_widget.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +final _key = GlobalKey(); + +@widgetbook.UseCase( + name: 'Avatar Component', + type: RxAvatar, +) +Widget buildAvatarUseCase(BuildContext context) { + final imageUrl = context.knobs.string( + label: 'Image URL', + initialValue: 'https://i.pravatar.cc/150?img=48', + ); + + Widget buildAvatar(AvatarVariant variant) { + return Column( + children: [ + Text(variant.name.split('.').last), + const SizedBox(height: 10), + RxAvatar( + image: NetworkImage(imageUrl), + fallback: context.knobs.string( + label: 'Fallback', + initialValue: 'AB', + ), + variant: variant, + size: context.knobs.list( + label: 'Size', + options: AvatarSize.values, + initialOption: AvatarSize.size4, + labelBuilder: (value) => value.name.split('.').last, + ), + radius: context.knobs.list( + label: 'Radius', + options: AvatarRadius.values, + initialOption: AvatarRadius.full, + labelBuilder: (value) => value.name.split('.').last, + ), + ), + ], + ); + } + + return KeyedSubtree( + key: _key, + child: Wrap( + spacing: 12, + runSpacing: 12, + children: AvatarVariant.values.map(buildAvatar).toList(), + ), + ); +} diff --git a/packages/remix/demo/lib/components/callout_use_case.dart b/packages/remix/demo/lib/components/callout_use_case.dart new file mode 100644 index 000000000..e1b400d2e --- /dev/null +++ b/packages/remix/demo/lib/components/callout_use_case.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:remix/components/callout/callout_variants.dart'; +import 'package:remix/components/callout/callout_widget.dart'; +import 'package:widgetbook/widgetbook.dart'; +import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; + +final _key = GlobalKey(); + +@widgetbook.UseCase( + name: 'Callout Component', + type: RxCallout, +) +Widget buildCalloutUseCase(BuildContext context) { + Widget buildCallout(CalloutVariant variant) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(variant.label), + const SizedBox(height: 10), + RxCallout( + icon: context.knobs.list( + label: 'Icon', + options: [ + Icons.info, + Icons.warning, + Icons.error, + Icons.check_circle, + ], + initialOption: Icons.info, + labelBuilder: (value) => value.toString().split('.').last, + ), + variant: variant, + text: context.knobs.string( + label: 'Text', + initialValue: 'Content for the callout goes here', + ), + ), + ], + ); + } + + return KeyedSubtree( + key: _key, + child: Column( + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: CalloutVariant.values.map(buildCallout).toList(), + ), + ], + ), + ); +} diff --git a/packages/remix/demo/lib/components/switch_use_case.dart b/packages/remix/demo/lib/components/switch_use_case.dart index f93576bb5..8ca9d6a0f 100644 --- a/packages/remix/demo/lib/components/switch_use_case.dart +++ b/packages/remix/demo/lib/components/switch_use_case.dart @@ -1,6 +1,6 @@ import 'package:demo/helpers/use_case_state.dart'; import 'package:flutter/material.dart'; -import 'package:remix/components/switch/switch.variants.dart'; +import 'package:remix/components/switch/switch_variants.dart'; import 'package:remix/components/switch/switch_widget.dart'; import 'package:widgetbook/widgetbook.dart'; import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook; diff --git a/packages/remix/demo/lib/main.directories.g.dart b/packages/remix/demo/lib/main.directories.g.dart index 5b0a62927..c2a5e7634 100644 --- a/packages/remix/demo/lib/main.directories.g.dart +++ b/packages/remix/demo/lib/main.directories.g.dart @@ -9,18 +9,32 @@ // ************************************************************************** // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:demo/components/button_use_case.dart' as _i2; -import 'package:demo/components/card_use_case.dart' as _i3; -import 'package:demo/components/checkbox_use_case.dart' as _i4; -import 'package:demo/components/radio_use_case.dart' as _i5; -import 'package:demo/components/spinner_use_case.dart' as _i6; -import 'package:demo/components/switch_use_case.dart' as _i7; +import 'package:demo/components/avatar_use_case.dart' as _i2; +import 'package:demo/components/button_use_case.dart' as _i3; +import 'package:demo/components/callout_use_case.dart' as _i4; +import 'package:demo/components/card_use_case.dart' as _i5; +import 'package:demo/components/checkbox_use_case.dart' as _i6; +import 'package:demo/components/radio_use_case.dart' as _i7; +import 'package:demo/components/spinner_use_case.dart' as _i8; +import 'package:demo/components/switch_use_case.dart' as _i9; import 'package:widgetbook/widgetbook.dart' as _i1; final directories = <_i1.WidgetbookNode>[ _i1.WidgetbookFolder( name: 'components', children: [ + _i1.WidgetbookFolder( + name: 'avatar', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RxAvatar', + useCase: _i1.WidgetbookUseCase( + name: 'Avatar Component', + builder: _i2.buildAvatarUseCase, + ), + ) + ], + ), _i1.WidgetbookFolder( name: 'button', children: [ @@ -28,7 +42,19 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxButton', useCase: _i1.WidgetbookUseCase( name: 'Button Component', - builder: _i2.buildButtonUseCase, + builder: _i3.buildButtonUseCase, + ), + ) + ], + ), + _i1.WidgetbookFolder( + name: 'callout', + children: [ + _i1.WidgetbookLeafComponent( + name: 'RxCallout', + useCase: _i1.WidgetbookUseCase( + name: 'Callout Component', + builder: _i4.buildCalloutUseCase, ), ) ], @@ -41,11 +67,11 @@ final directories = <_i1.WidgetbookNode>[ useCases: [ _i1.WidgetbookUseCase( name: 'Card Component', - builder: _i3.buildCard, + builder: _i5.buildCard, ), _i1.WidgetbookUseCase( name: 'With button', - builder: _i3.buildRadioUseCase, + builder: _i5.buildRadioUseCase, ), ], ) @@ -58,7 +84,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxCheckbox', useCase: _i1.WidgetbookUseCase( name: 'Checkbox Component', - builder: _i4.buildCheckboxUseCase, + builder: _i6.buildCheckboxUseCase, ), ) ], @@ -70,7 +96,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxRadio', useCase: _i1.WidgetbookUseCase( name: 'Radio Component', - builder: _i5.buildRadioUseCase, + builder: _i7.buildRadioUseCase, ), ) ], @@ -82,7 +108,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxSpinner', useCase: _i1.WidgetbookUseCase( name: 'Spinner Component', - builder: _i6.buildSpinnerUseCase, + builder: _i8.buildSpinnerUseCase, ), ) ], @@ -94,7 +120,7 @@ final directories = <_i1.WidgetbookNode>[ name: 'RxSwitch', useCase: _i1.WidgetbookUseCase( name: 'Switch Component', - builder: _i7.buildSwitchUseCase, + builder: _i9.buildSwitchUseCase, ), ) ], diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index 1a21c1e7a..569d43fbd 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -845,7 +845,10 @@ /Users/leofarias/Projects/mix/packages/mix_annotations/lib/src/annotations.dart /Users/leofarias/Projects/mix/packages/remix/LICENSE /Users/leofarias/Projects/mix/packages/remix/demo/lib/addons/icon_data_knob.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/avatar_use_case.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/button_use_case.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/callout_use_case.dart +/Users/leofarias/Projects/mix/packages/remix/demo/lib/components/card_use_case.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/checkbox_use_case.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/radio_use_case.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/components/spinner_use_case.dart @@ -854,16 +857,31 @@ /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.directories.g.dart /Users/leofarias/Projects/mix/packages/remix/demo/pubspec.yaml -/Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.style.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/button/button.variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar.style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar.variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_widget.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/callout/callout_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/callout/callout_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/callout/callout_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/callout/callout_variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/callout/callout_widget.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/card/card_spec.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/card/card_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/card/card_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/card/card_variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/card/card_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_style.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_variants.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/checkbox/checkbox_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/radio/radio_style.dart @@ -875,10 +893,10 @@ /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_spec.g.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/spinner/spinner_widget.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch.style.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch.variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/switch/switch_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/color_palette.dart /Users/leofarias/Projects/mix/packages/remix/lib/helpers/utility_extension.dart diff --git a/packages/remix/demo/macos/Runner/DebugProfile.entitlements b/packages/remix/demo/macos/Runner/DebugProfile.entitlements index dddb8a30c..4ec85ba67 100644 --- a/packages/remix/demo/macos/Runner/DebugProfile.entitlements +++ b/packages/remix/demo/macos/Runner/DebugProfile.entitlements @@ -3,6 +3,8 @@ com.apple.security.app-sandbox + + com.apple.security.network.client com.apple.security.cs.allow-jit diff --git a/packages/remix/demo/macos/Runner/Release.entitlements b/packages/remix/demo/macos/Runner/Release.entitlements index 852fa1a47..08ba3a3fa 100644 --- a/packages/remix/demo/macos/Runner/Release.entitlements +++ b/packages/remix/demo/macos/Runner/Release.entitlements @@ -3,6 +3,8 @@ com.apple.security.app-sandbox + + com.apple.security.network.client diff --git a/packages/remix/lib/components/avatar/avatar.style.dart b/packages/remix/lib/components/avatar/avatar.style.dart deleted file mode 100644 index 1daf8a2e5..000000000 --- a/packages/remix/lib/components/avatar/avatar.style.dart +++ /dev/null @@ -1,99 +0,0 @@ -// ignore_for_file: camel_case_types - -import 'package:flutter/material.dart'; -import 'package:mix/mix.dart'; -import 'package:remix/components/avatar/avatar.variants.dart'; -import 'package:remix/components/avatar/avatar_spec.dart'; -import 'package:remix/helpers/utility_extension.dart'; -import 'package:remix/tokens/remix_tokens.dart'; - -final _avatar = AvatarSpecUtility.self; -final _container = _avatar.container; -final _image = _avatar.image; -final _fallback = _avatar.fallback; -final _baseStyle = Style( - _container.borderRadius(99), - _image.fit.cover(), - _fallback.textAlign.center(), - _fallback.style.fontWeight(FontWeight.bold), - _fallback.style.color($rx.neutral1()), -); - -final _solidVariant = Style( - _container.color($rx.accent9()), -); - -final _softVariant = Style( - _container.color($rx.accent4()), -); - -final _size1 = Style( - _container.size(16), - _fallback.style.fontSize(10), -); - -final _size2 = Style( - _container.size(20), - _fallback.style.fontSize(12), -); - -final _size3 = Style( - _container.size(24), - _fallback.style.fontSize(14), -); - -final _size4 = Style( - _container.size(32), - _fallback.style.fontSize(16), -); - -final _size5 = Style( - _container.size(40), - _fallback.style.fontSize(20), -); - -final _size6 = Style( - _container.size(48), - _fallback.style.fontSize(24), -); - -final _size7 = Style( - _container.size(56), - _fallback.style.fontSize(28), -); - -final _size8 = Style( - _container.size(64), - _fallback.style.fontSize(32), -); - -final _radiusNone = Style(_container.borderRadius(0)); -final _radiusSmall = Style(_container.borderRadius(4)); -final _radiusMedium = Style(_container.borderRadius(6)); -final _radiusLarge = Style(_container.borderRadius(8)); -final _radiusFull = Style(_container.borderRadius(99)); - -Style buildDefaultAvatarStyle() { - return Style( - _baseStyle(), - AvatarVariant.solid(_solidVariant()), - AvatarVariant.soft(_softVariant()), - - // Sizes - AvatarSize.size1(_size1()), - AvatarSize.size2(_size2()), - AvatarSize.size3(_size3()), - AvatarSize.size4(_size4()), - AvatarSize.size5(_size5()), - AvatarSize.size6(_size6()), - AvatarSize.size7(_size7()), - AvatarSize.size8(_size8()), - - // Radius - AvatarRadius.none(_radiusNone()), - AvatarRadius.small(_radiusSmall()), - AvatarRadius.medium(_radiusMedium()), - AvatarRadius.large(_radiusLarge()), - AvatarRadius.full(_radiusFull()), - ); -} diff --git a/packages/remix/lib/components/avatar/avatar.variants.dart b/packages/remix/lib/components/avatar/avatar.variants.dart deleted file mode 100644 index a4edd3c22..000000000 --- a/packages/remix/lib/components/avatar/avatar.variants.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:mix/mix.dart'; - -abstract interface class IAvatarVariant extends Variant { - const IAvatarVariant(super.name); -} - -class AvatarVariant extends IAvatarVariant { - const AvatarVariant(super.name); - - static const solid = AvatarVariant('remix.avatar.solid'); - static const soft = AvatarVariant('remix.avatar.soft'); - - static List get values => [solid, soft]; -} - -class AvatarSize extends IAvatarVariant { - const AvatarSize(super.name); - - static const size1 = AvatarSize('remix.avatar.size1'); - static const size2 = AvatarSize('remix.avatar.size2'); - static const size3 = AvatarSize('remix.avatar.size3'); - static const size4 = AvatarSize('remix.avatar.size4'); - static const size5 = AvatarSize('remix.avatar.size5'); - static const size6 = AvatarSize('remix.avatar.size6'); - static const size7 = AvatarSize('remix.avatar.size7'); - static const size8 = AvatarSize('remix.avatar.size8'); - - static List get values => [ - size1, - size2, - size3, - size4, - size5, - size6, - size7, - size8, - ]; -} - -class AvatarRadius extends IAvatarVariant { - const AvatarRadius(super.name); - - static const none = AvatarRadius('remix.avatar.none'); - static const small = AvatarRadius('remix.avatar.small'); - static const medium = AvatarRadius('remix.avatar.medium'); - static const large = AvatarRadius('remix.avatar.large'); - static const full = AvatarRadius('remix.avatar.full'); - - static List get values => [none, small, medium, large, full]; -} diff --git a/packages/remix/lib/components/avatar/avatar_style.dart b/packages/remix/lib/components/avatar/avatar_style.dart new file mode 100644 index 000000000..652ff27d0 --- /dev/null +++ b/packages/remix/lib/components/avatar/avatar_style.dart @@ -0,0 +1,104 @@ +// ignore_for_file: camel_case_types + +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/avatar/avatar_spec.dart'; +import 'package:remix/components/avatar/avatar_variants.dart'; +import 'package:remix/helpers/utility_extension.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _avatar = AvatarSpecUtility.self; +final _container = _avatar.container; +final _image = _avatar.image; +final _fallback = _avatar.fallback; +Style get _baseStyle => Style( + _container.borderRadius(99), + _image.fit.cover(), + _container.alignment.center(), + _fallback.textAlign.center(), + _fallback.style.fontWeight(FontWeight.bold), + _fallback.style.color($rx.color.neutral(1)()), + ); + +Style get _solidVariant => Style( + _container.color($rx.color.accent(9)()), + ); + +Style get _softVariant => Style( + _container.color.ref($rx.color.accent(4)), + ); + +Style get _size1 => Style( + _container.size(16), + _fallback.style.fontSize(10), + ); + +Style get _size2 => Style( + _container.size(20), + _fallback.style.fontSize(12), + ); + +Style get _size3 => Style( + _container.size(24), + _fallback.style.fontSize(14), + ); + +Style get _size4 => Style( + _container.size(32), + _fallback.style.fontSize(16), + ); + +Style get _size5 => Style( + _container.size(40), + _fallback.style.fontSize(20), + ); + +Style get _size6 => Style( + _container.size(48), + _fallback.style.fontSize(24), + ); + +Style get _size7 => Style( + _container.size(56), + _fallback.style.fontSize(28), + ); + +Style get _size8 => Style( + _container.size(64), + _fallback.style.fontSize(32), + ); + +Style get _radiusNone => + Style($with.clipRRect(borderRadius: BorderRadius.zero)); +Style get _radiusSmall => + Style($with.clipRRect(borderRadius: BorderRadius.circular(4))); +Style get _radiusMedium => + Style($with.clipRRect(borderRadius: BorderRadius.circular(8))); +Style get _radiusLarge => + Style($with.clipRRect(borderRadius: BorderRadius.circular(12))); +Style get _radiusFull => Style($with.clipOval()); + +Style avatarStyle(Style? style, List variants) { + return Style( + _baseStyle(), + AvatarVariant.solid(_solidVariant()), + AvatarVariant.soft(_softVariant()), + + // Sizes + AvatarSize.size1(_size1()), + AvatarSize.size2(_size2()), + AvatarSize.size3(_size3()), + AvatarSize.size4(_size4()), + AvatarSize.size5(_size5()), + AvatarSize.size6(_size6()), + AvatarSize.size7(_size7()), + AvatarSize.size8(_size8()), + + // Radius + AvatarRadius.none(_radiusNone()), + AvatarRadius.small(_radiusSmall()), + AvatarRadius.medium(_radiusMedium()), + AvatarRadius.large(_radiusLarge()), + AvatarRadius.full(_radiusFull()), + ).merge(style).applyVariants(variants); +} diff --git a/packages/remix/lib/components/avatar/avatar_variants.dart b/packages/remix/lib/components/avatar/avatar_variants.dart new file mode 100644 index 000000000..04c79efbe --- /dev/null +++ b/packages/remix/lib/components/avatar/avatar_variants.dart @@ -0,0 +1,50 @@ +import 'package:remix/helpers/variant.dart'; + +abstract interface class IAvatarVariant extends RemixVariant { + const IAvatarVariant(String name) : super('avatar.$name'); +} + +class AvatarVariant extends IAvatarVariant { + const AvatarVariant(String name) : super('variant.$name'); + + static const solid = AvatarVariant('solid'); + static const soft = AvatarVariant('soft'); + + static List get values => [solid, soft]; +} + +class AvatarSize extends IAvatarVariant { + const AvatarSize(String name) : super('size.$name'); + + static const size1 = AvatarSize('size1'); + static const size2 = AvatarSize('size2'); + static const size3 = AvatarSize('size3'); + static const size4 = AvatarSize('size4'); + static const size5 = AvatarSize('size5'); + static const size6 = AvatarSize('size6'); + static const size7 = AvatarSize('size7'); + static const size8 = AvatarSize('size8'); + + static List get values => [ + size1, + size2, + size3, + size4, + size5, + size6, + size7, + size8, + ]; +} + +class AvatarRadius extends IAvatarVariant { + const AvatarRadius(String name) : super('radius.$name'); + + static const none = AvatarRadius('none'); + static const small = AvatarRadius('small'); + static const medium = AvatarRadius('medium'); + static const large = AvatarRadius('large'); + static const full = AvatarRadius('full'); + + static List get values => [none, small, medium, large, full]; +} diff --git a/packages/remix/lib/components/avatar/avatar_widget.dart b/packages/remix/lib/components/avatar/avatar_widget.dart index e69de29bb..14eb51503 100644 --- a/packages/remix/lib/components/avatar/avatar_widget.dart +++ b/packages/remix/lib/components/avatar/avatar_widget.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/avatar/avatar_spec.dart'; +import 'package:remix/components/avatar/avatar_style.dart'; +import 'package:remix/components/avatar/avatar_variants.dart'; + +class RxAvatar extends StatelessWidget { + const RxAvatar({ + super.key, + this.image, + this.fallback, + this.size = AvatarSize.size4, + this.variant = AvatarVariant.solid, + this.radius = AvatarRadius.full, + this.style, + }); + + final ImageProvider? image; + final String? fallback; + final AvatarSize size; + final AvatarVariant variant; + final AvatarRadius radius; + final Style? style; + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: avatarStyle(style, [size, variant, radius]), + builder: (context) { + final spec = AvatarSpec.of(context); + + final ContainerWidget = spec.container; + final ImageWidget = spec.image; + final FallbackWidget = spec.fallback; + + return ContainerWidget( + child: image != null + ? ImageWidget( + image: image!, + errorBuilder: (context, error, stackTrace) { + return FallbackWidget(fallback ?? ''); + }, + ) + : FallbackWidget(fallback ?? ''), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/badge/badge_spec.g.dart b/packages/remix/lib/components/badge/badge_spec.g.dart index 58bcae518..5d53385c9 100644 --- a/packages/remix/lib/components/badge/badge_spec.g.dart +++ b/packages/remix/lib/components/badge/badge_spec.g.dart @@ -6,6 +6,8 @@ part of 'badge_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$BadgeSpec on Spec { static BadgeSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/components/badge/badge.style.dart b/packages/remix/lib/components/badge/badge_style.dart similarity index 53% rename from packages/remix/lib/components/badge/badge.style.dart rename to packages/remix/lib/components/badge/badge_style.dart index ce140fb72..0f772afc5 100644 --- a/packages/remix/lib/components/badge/badge.style.dart +++ b/packages/remix/lib/components/badge/badge_style.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/badge/badge.variants.dart'; import 'package:remix/components/badge/badge_spec.dart'; +import 'package:remix/components/badge/badge_variants.dart'; import 'package:remix/tokens/remix_tokens.dart'; final _badge = BadgeSpecUtility.self; @@ -16,46 +16,46 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.color($rx.accent9()), - _label.style.color($rx.neutral1()), + _container.color($rx.color.accent(9)()), + _label.style.color($rx.color.neutral(1)()), ); Style get _softVariant => Style( - _container.color($rx.accent3A()), - _label.style.color($rx.accent11A()), + _container.color($rx.color.accentAlpha(3)()), + _label.style.color($rx.color.accentAlpha(11)()), ); Style get _surfaceVariant => Style( - _container.color($rx.accent2A()), - _label.style.color($rx.accent11A()), + _container.color($rx.color.accentAlpha(2)()), + _label.style.color($rx.color.accentAlpha(11)()), ); Style get _outlineVariant => Style( _container.color(Colors.transparent), _container.border.width(1), - _container.border.color($rx.accent8A()), - _label.style.color($rx.accent11A()), + _container.border.color($rx.color.accentAlpha(8)()), + _label.style.color($rx.color.accentAlpha(11)()), ); final _smallVariant = Style( - _container.padding.vertical($rx.space1()), - _container.padding.horizontal($rx.space2()), - _label.style.as($rx.text1()), + _container.padding.vertical.ref($rx.space.space1), + _container.padding.horizontal.ref($rx.space.space2), + _label.style.as($rx.text.text1()), ); final _mediumVariant = Style( - _container.padding.vertical($rx.space1()), - _container.padding.horizontal($rx.space3()), - _label.style.as($rx.text2()), + _container.padding.vertical.ref($rx.space.space1), + _container.padding.horizontal.ref($rx.space.space3), + _label.style.as($rx.text.text2()), ); final _largeVariant = Style( - _container.padding.vertical($rx.space2()), - _container.padding.horizontal($rx.space4()), - _label.style.as($rx.text3()), + _container.padding.vertical.ref($rx.space.space2), + _container.padding.horizontal.ref($rx.space.space4), + _label.style.as($rx.text.text3()), ); -Style buildDefaultBadgeStyle() { +Style badgeStyle(Style? style, List variants) { return Style( _baseStyle(), @@ -69,5 +69,5 @@ Style buildDefaultBadgeStyle() { BadgeVariant.soft(_softVariant()), BadgeVariant.surface(_surfaceVariant()), BadgeVariant.outline(_outlineVariant()), - ); + ).merge(style).applyVariants(variants); } diff --git a/packages/remix/lib/components/badge/badge.variants.dart b/packages/remix/lib/components/badge/badge_variants.dart similarity index 100% rename from packages/remix/lib/components/badge/badge.variants.dart rename to packages/remix/lib/components/badge/badge_variants.dart diff --git a/packages/remix/lib/components/badge/badget_widget.dart b/packages/remix/lib/components/badge/badget_widget.dart index 74df0876c..feb09bfe1 100644 --- a/packages/remix/lib/components/badge/badget_widget.dart +++ b/packages/remix/lib/components/badge/badget_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/badge/badge.style.dart'; -import 'package:remix/components/badge/badge.variants.dart'; import 'package:remix/components/badge/badge_spec.dart'; +import 'package:remix/components/badge/badge_style.dart'; +import 'package:remix/components/badge/badge_variants.dart'; class RxBadge extends StatelessWidget { const RxBadge({ @@ -23,16 +23,10 @@ class RxBadge extends StatelessWidget { final BadgeSize size; final BadgeVariant variant; - Style _buildStyle() { - return buildDefaultBadgeStyle() - .merge(style) - .applyVariants([size, variant]).animate(); - } - @override Widget build(BuildContext context) { return SpecBuilder( - style: _buildStyle(), + style: badgeStyle(style, [size, variant]), builder: (context) { final spec = BadgeSpec.of(context); diff --git a/packages/remix/lib/components/button/button_spec.g.dart b/packages/remix/lib/components/button/button_spec.g.dart index 097c249bd..f8ce7da0a 100644 --- a/packages/remix/lib/components/button/button_spec.g.dart +++ b/packages/remix/lib/components/button/button_spec.g.dart @@ -6,6 +6,8 @@ part of 'button_spec.dart'; // MixableSpecGenerator // ************************************************************************** +// ignore_for_file: deprecated_member_use_from_same_package + base mixin _$ButtonSpec on Spec { static ButtonSpec from(MixData mix) { return mix.attributeOf()?.resolve(mix) ?? diff --git a/packages/remix/lib/components/button/button.style.dart b/packages/remix/lib/components/button/button_style.dart similarity index 60% rename from packages/remix/lib/components/button/button.style.dart rename to packages/remix/lib/components/button/button_style.dart index 78d5fb6ac..a17f30e9d 100644 --- a/packages/remix/lib/components/button/button.style.dart +++ b/packages/remix/lib/components/button/button_style.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/button/button.variants.dart'; import 'package:remix/components/button/button_spec.dart'; +import 'package:remix/components/button/button_variants.dart'; import 'package:remix/tokens/remix_tokens.dart'; final _util = ButtonSpecUtility.self; @@ -13,7 +13,7 @@ final _container = _util.container; final _flex = _util.flex; /// This applies to the icon, label, and spinner -final _foreground = _util.foreground; +final _items = _util.items; Style get _baseStyle => Style( _flex.gap(0), @@ -33,29 +33,29 @@ Style get _baseStyle => Style( Style get _onDisabledForeground => Style( $on.disabled( - _foreground.color.ref($rx.neutral7A), + _items.color.ref($rx.color.neutralAlpha(7)), ), ); Style get _solidVariant => Style( - _container.color.ref($rx.accent9), - _foreground.color.ref($rx.neutral1), + _container.color.ref($rx.color.accent(9)), + _items.color.ref($rx.color.white()), $on.hover( - _container.color.ref($rx.accent10), + _container.color.ref($rx.color.accent(10)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); Style get _softVariant => Style( - _container.color.ref($rx.accent3A), - _foreground.color.ref($rx.accent11A), + _container.color.ref($rx.color.accentAlpha(3)), + _items.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent4A), + _container.color.ref($rx.color.accentAlpha(4)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); @@ -63,67 +63,67 @@ Style get _outlineVariant => Style( _container.color(Colors.transparent), _container.border.width(1.5), _container.border.strokeAlign(0), - _container.border.color.ref($rx.accent8A), - _foreground.color.ref($rx.accent11A), + _container.border.color.ref($rx.color.accentAlpha(8)), + _items.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent2A), + _container.color.ref($rx.color.accentAlpha(2)), ), $on.disabled( - _container.border.color.ref($rx.neutral8A), + _container.border.color.ref($rx.color.neutralAlpha(8)), _container.color.transparent(), ), ); Style get _surfaceVariant => Style( _outlineVariant(), - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), $on.hover( - _container.color.ref($rx.accent4A), - _container.border.color.ref($rx.accent8A), + _container.color.ref($rx.color.accentAlpha(4)), + _container.border.color.ref($rx.color.accentAlpha(8)), ), $on.disabled( - _container.color.ref($rx.neutral2A), + _container.color.ref($rx.color.neutralAlpha(2)), ), ); Style get _ghostVariant => Style( _container.border.style.none(), _container.color(Colors.transparent), - _foreground.color.ref($rx.accent11A), + _items.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), ), ); Style get _smallVariant => Style( - _label.style.ref($rx.text1), - _container.padding.vertical.ref($rx.space1), - _container.padding.horizontal.ref($rx.space2), - _flex.gap.ref($rx.space1), - _foreground.size(12), + _label.style.ref($rx.text.text1), + _container.padding.vertical.ref($rx.space(1)), + _container.padding.horizontal.ref($rx.space(2)), + _flex.gap.ref($rx.space(1)), + _items.size(12), ); Style get _mediumVariant => Style( - _container.padding.vertical.ref($rx.space2), - _container.padding.horizontal.ref($rx.space3), - _flex.gap.ref($rx.space2), - _label.style.ref($rx.text2), - _foreground.size(14), + _container.padding.vertical.ref($rx.space(2)), + _container.padding.horizontal.ref($rx.space(3)), + _flex.gap.ref($rx.space(2)), + _label.style.ref($rx.text.text2), + _items.size(14), ); Style get _largeVariant => Style( - _container.padding.vertical.ref($rx.space2), - _container.padding.horizontal.ref($rx.space4), - _flex.gap.ref($rx.space3), - _label.style.ref($rx.text3), - _foreground.size(16), + _container.padding.vertical.ref($rx.space(2)), + _container.padding.horizontal.ref($rx.space(4)), + _flex.gap.ref($rx.space(3)), + _label.style.ref($rx.text.text3), + _items.size(16), ); Style get _xLargeVariant => Style( - _container.padding.vertical.ref($rx.space3), - _container.padding.horizontal.ref($rx.space5), - _flex.gap.ref($rx.space3), - _label.style.ref($rx.text4), - _foreground.size(18), + _container.padding.vertical.ref($rx.space(3)), + _container.padding.horizontal.ref($rx.space(5)), + _flex.gap.ref($rx.space(3)), + _label.style.ref($rx.text.text4), + _items.size(18), ); Style buildDefaultButtonStyle() { @@ -148,7 +148,7 @@ Style buildDefaultButtonStyle() { } extension ButtonSpecUtilityX on ButtonSpecUtility { - ForegroundUtility get foreground => ForegroundUtility((v) { + ForegroundUtility get items => ForegroundUtility((v) { return only().merge(label.style .only(color: v.color) .merge(icon.only(color: v.color, size: v.size)) diff --git a/packages/remix/lib/components/button/button.variants.dart b/packages/remix/lib/components/button/button_variants.dart similarity index 100% rename from packages/remix/lib/components/button/button.variants.dart rename to packages/remix/lib/components/button/button_variants.dart diff --git a/packages/remix/lib/components/button/button_widget.dart b/packages/remix/lib/components/button/button_widget.dart index dd86ea746..df7672aa5 100644 --- a/packages/remix/lib/components/button/button_widget.dart +++ b/packages/remix/lib/components/button/button_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/button/button.style.dart'; -import 'package:remix/components/button/button.variants.dart'; import 'package:remix/components/button/button_spec.dart'; +import 'package:remix/components/button/button_style.dart'; +import 'package:remix/components/button/button_variants.dart'; /// A customizable button component with various styling options. /// diff --git a/packages/remix/lib/components/callout/callout_spec.dart b/packages/remix/lib/components/callout/callout_spec.dart new file mode 100644 index 000000000..7625053c0 --- /dev/null +++ b/packages/remix/lib/components/callout/callout_spec.dart @@ -0,0 +1,29 @@ +import 'package:flutter/widgets.dart'; +import 'package:mix/mix.dart'; +import 'package:mix_annotations/mix_annotations.dart'; + +part 'callout_spec.g.dart'; + +@MixableSpec() +base class CalloutSpec extends Spec with _$CalloutSpec { + final BoxSpec container; + final FlexSpec flex; + final IconSpec icon; + final TextSpec text; + + /// {@macro callout_spec_of} + static const of = _$CalloutSpec.of; + + static const from = _$CalloutSpec.from; + + const CalloutSpec({ + BoxSpec? container, + FlexSpec? flex, + IconSpec? icon, + TextSpec? text, + super.animated, + }) : container = container ?? const BoxSpec(), + flex = flex ?? const FlexSpec(), + icon = icon ?? const IconSpec(), + text = text ?? const TextSpec(); +} diff --git a/packages/remix/lib/components/callout/callout_spec.g.dart b/packages/remix/lib/components/callout/callout_spec.g.dart new file mode 100644 index 000000000..22c716db1 --- /dev/null +++ b/packages/remix/lib/components/callout/callout_spec.g.dart @@ -0,0 +1,240 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'callout_spec.dart'; + +// ************************************************************************** +// MixableSpecGenerator +// ************************************************************************** + +// ignore_for_file: deprecated_member_use_from_same_package + +base mixin _$CalloutSpec on Spec { + static CalloutSpec from(MixData mix) { + return mix.attributeOf()?.resolve(mix) ?? + const CalloutSpec(); + } + + /// {@template callout_spec_of} + /// Retrieves the [CalloutSpec] from the nearest [Mix] ancestor in the widget tree. + /// + /// This method uses [Mix.of] to obtain the [Mix] instance associated with the + /// given [BuildContext], and then retrieves the [CalloutSpec] from that [Mix]. + /// If no ancestor [Mix] is found, this method returns an empty [CalloutSpec]. + /// + /// Example: + /// + /// ```dart + /// final calloutSpec = CalloutSpec.of(context); + /// ``` + /// {@endtemplate} + static CalloutSpec of(BuildContext context) { + return _$CalloutSpec.from(Mix.of(context)); + } + + /// Creates a copy of this [CalloutSpec] but with the given fields + /// replaced with the new values. + @override + CalloutSpec copyWith({ + BoxSpec? container, + FlexSpec? flex, + IconSpec? icon, + TextSpec? text, + AnimatedData? animated, + }) { + return CalloutSpec( + container: container ?? _$this.container, + flex: flex ?? _$this.flex, + icon: icon ?? _$this.icon, + text: text ?? _$this.text, + animated: animated ?? _$this.animated, + ); + } + + /// Linearly interpolates between this [CalloutSpec] and another [CalloutSpec] based on the given parameter [t]. + /// + /// The parameter [t] represents the interpolation factor, typically ranging from 0.0 to 1.0. + /// When [t] is 0.0, the current [CalloutSpec] is returned. When [t] is 1.0, the [other] [CalloutSpec] is returned. + /// For values of [t] between 0.0 and 1.0, an interpolated [CalloutSpec] is returned. + /// + /// If [other] is null, this method returns the current [CalloutSpec] instance. + /// + /// The interpolation is performed on each property of the [CalloutSpec] using the appropriate + /// interpolation method: + /// + /// - [BoxSpec.lerp] for [container]. + /// - [FlexSpec.lerp] for [flex]. + /// - [IconSpec.lerp] for [icon]. + /// - [TextSpec.lerp] for [text]. + + /// For [animated], the interpolation is performed using a step function. + /// If [t] is less than 0.5, the value from the current [CalloutSpec] is used. Otherwise, the value + /// from the [other] [CalloutSpec] is used. + /// + /// This method is typically used in animations to smoothly transition between + /// different [CalloutSpec] configurations. + @override + CalloutSpec lerp(CalloutSpec? other, double t) { + if (other == null) return _$this; + + return CalloutSpec( + container: _$this.container.lerp(other.container, t), + flex: _$this.flex.lerp(other.flex, t), + icon: _$this.icon.lerp(other.icon, t), + text: _$this.text.lerp(other.text, t), + animated: t < 0.5 ? _$this.animated : other.animated, + ); + } + + /// The list of properties that constitute the state of this [CalloutSpec]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [CalloutSpec] instances for equality. + @override + List get props => [ + _$this.container, + _$this.flex, + _$this.icon, + _$this.text, + _$this.animated, + ]; + + CalloutSpec get _$this => this as CalloutSpec; +} + +/// Represents the attributes of a [CalloutSpec]. +/// +/// This class encapsulates properties defining the layout and +/// appearance of a [CalloutSpec]. +/// +/// Use this class to configure the attributes of a [CalloutSpec] and pass it to +/// the [CalloutSpec] constructor. +final class CalloutSpecAttribute extends SpecAttribute { + final BoxSpecAttribute? container; + final FlexSpecAttribute? flex; + final IconSpecAttribute? icon; + final TextSpecAttribute? text; + + const CalloutSpecAttribute({ + this.container, + this.flex, + this.icon, + this.text, + super.animated, + }); + + /// Resolves to [CalloutSpec] using the provided [MixData]. + /// + /// If a property is null in the [MixData], it falls back to the + /// default value defined in the `defaultValue` for that property. + /// + /// ```dart + /// final calloutSpec = CalloutSpecAttribute(...).resolve(mix); + /// ``` + @override + CalloutSpec resolve(MixData mix) { + return CalloutSpec( + container: container?.resolve(mix), + flex: flex?.resolve(mix), + icon: icon?.resolve(mix), + text: text?.resolve(mix), + animated: animated?.resolve(mix) ?? mix.animation, + ); + } + + /// Merges the properties of this [CalloutSpecAttribute] with the properties of [other]. + /// + /// If [other] is null, returns this instance unchanged. Otherwise, returns a new + /// [CalloutSpecAttribute] with the properties of [other] taking precedence over + /// the corresponding properties of this instance. + /// + /// Properties from [other] that are null will fall back + /// to the values from this instance. + @override + CalloutSpecAttribute merge(covariant CalloutSpecAttribute? other) { + if (other == null) return this; + + return CalloutSpecAttribute( + container: container?.merge(other.container) ?? other.container, + flex: flex?.merge(other.flex) ?? other.flex, + icon: icon?.merge(other.icon) ?? other.icon, + text: text?.merge(other.text) ?? other.text, + animated: animated?.merge(other.animated) ?? other.animated, + ); + } + + /// The list of properties that constitute the state of this [CalloutSpecAttribute]. + /// + /// This property is used by the [==] operator and the [hashCode] getter to + /// compare two [CalloutSpecAttribute] instances for equality. + @override + List get props => [ + container, + flex, + icon, + text, + animated, + ]; +} + +/// Utility class for configuring [CalloutSpecAttribute] properties. +/// +/// This class provides methods to set individual properties of a [CalloutSpecAttribute]. +/// Use the methods of this class to configure specific properties of a [CalloutSpecAttribute]. +base class CalloutSpecUtility + extends SpecUtility { + /// Utility for defining [CalloutSpecAttribute.container] + late final container = BoxSpecUtility((v) => only(container: v)); + + /// Utility for defining [CalloutSpecAttribute.flex] + late final flex = FlexSpecUtility((v) => only(flex: v)); + + /// Utility for defining [CalloutSpecAttribute.icon] + late final icon = IconSpecUtility((v) => only(icon: v)); + + /// Utility for defining [CalloutSpecAttribute.text] + late final text = TextSpecUtility((v) => only(text: v)); + + /// Utility for defining [CalloutSpecAttribute.animated] + late final animated = AnimatedUtility((v) => only(animated: v)); + + CalloutSpecUtility(super.builder); + + static final self = CalloutSpecUtility((v) => v); + + /// Returns a new [CalloutSpecAttribute] with the specified properties. + @override + T only({ + BoxSpecAttribute? container, + FlexSpecAttribute? flex, + IconSpecAttribute? icon, + TextSpecAttribute? text, + AnimatedDataDto? animated, + }) { + return builder(CalloutSpecAttribute( + container: container, + flex: flex, + icon: icon, + text: text, + animated: animated, + )); + } +} + +/// A tween that interpolates between two [CalloutSpec] instances. +/// +/// This class can be used in animations to smoothly transition between +/// different [CalloutSpec] specifications. +class CalloutSpecTween extends Tween { + CalloutSpecTween({ + super.begin, + super.end, + }); + + @override + CalloutSpec lerp(double t) { + if (begin == null && end == null) return const CalloutSpec(); + if (begin == null) return end!; + + return begin!.lerp(end!, t); + } +} diff --git a/packages/remix/lib/components/callout/callout_style.dart b/packages/remix/lib/components/callout/callout_style.dart new file mode 100644 index 000000000..c9ae9ae44 --- /dev/null +++ b/packages/remix/lib/components/callout/callout_style.dart @@ -0,0 +1,50 @@ +// ignore_for_file: camel_case_types + +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/callout/callout_spec.dart'; +import 'package:remix/components/callout/callout_variants.dart'; +import 'package:remix/tokens/remix_tokens.dart'; + +final _callout = CalloutSpecUtility.self; +final _container = _callout.container; +final _flex = _callout.flex; +final _icon = _callout.icon; +final _text = _callout.text; + +Style get _baseStyle => Style( + _container.borderRadius(8), + _container.padding(16), + _flex.gap(16), + _icon.size(24), + _icon.color.ref($rx.color.accentAlpha(11)), + _text.style.color.ref($rx.color.accentAlpha(11)), + _icon.size(20), + ); + +Style get _softVariant => Style( + _container.color.ref($rx.color.accentAlpha(3)), + ); + +Style get _surfaceVariant => Style( + _container.color.ref($rx.color.accentAlpha(2)), + _container.border.width(1), + _container.border.color.ref($rx.color.accentAlpha(5)), + ); + +Style get _outlineVariant => Style( + _container.color(Colors.transparent), + _container.border.width(1), + _container.border.color.ref($rx.color.accentAlpha(8)), + ); + +Style calloutStyle(Style? style, List variants) { + return Style( + _baseStyle(), + + // variants + CalloutVariant.soft(_softVariant()), + CalloutVariant.surface(_surfaceVariant()), + CalloutVariant.outline(_outlineVariant()), + ).merge(style).applyVariants(variants); +} diff --git a/packages/remix/lib/components/callout/callout_variants.dart b/packages/remix/lib/components/callout/callout_variants.dart new file mode 100644 index 000000000..4d906425f --- /dev/null +++ b/packages/remix/lib/components/callout/callout_variants.dart @@ -0,0 +1,15 @@ +import 'package:remix/helpers/variant.dart'; + +abstract interface class ICalloutVariant extends RemixVariant { + const ICalloutVariant(String name) : super('callout.$name'); +} + +class CalloutVariant extends ICalloutVariant { + const CalloutVariant(String name) : super('variant.$name'); + + static const soft = CalloutVariant('soft'); + static const surface = CalloutVariant('surface'); + static const outline = CalloutVariant('outline'); + + static List get values => [soft, surface, outline]; +} diff --git a/packages/remix/lib/components/callout/callout_widget.dart b/packages/remix/lib/components/callout/callout_widget.dart new file mode 100644 index 000000000..3d1015375 --- /dev/null +++ b/packages/remix/lib/components/callout/callout_widget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:mix/mix.dart'; +import 'package:remix/components/callout/callout_spec.dart'; +import 'package:remix/components/callout/callout_style.dart'; +import 'package:remix/components/callout/callout_variants.dart'; + +class RxCallout extends StatelessWidget { + const RxCallout({ + super.key, + required this.text, + this.icon, + this.style, + this.variant = CalloutVariant.soft, + }); + + final String text; + final IconData? icon; + + /// Additional custom styling for the callout. + /// + /// This allows you to override or extend the default callout styling. + final Style? style; + + final CalloutVariant variant; + + @override + Widget build(BuildContext context) { + return SpecBuilder( + style: calloutStyle(style, [variant]), + builder: (context) { + final spec = CalloutSpec.of(context); + + return spec.container( + child: spec.flex( + direction: Axis.horizontal, + children: [ + if (icon != null) spec.icon(icon!), + spec.text(text), + ], + ), + ); + }, + ); + } +} diff --git a/packages/remix/lib/components/card/card.style.dart b/packages/remix/lib/components/card/card_style.dart similarity index 74% rename from packages/remix/lib/components/card/card.style.dart rename to packages/remix/lib/components/card/card_style.dart index 00d02175e..472eb2f71 100644 --- a/packages/remix/lib/components/card/card.style.dart +++ b/packages/remix/lib/components/card/card_style.dart @@ -1,6 +1,6 @@ import 'package:mix/mix.dart'; -import 'package:remix/components/card/card.variants.dart'; import 'package:remix/components/card/card_spec.dart'; +import 'package:remix/components/card/card_variants.dart'; import 'package:remix/tokens/remix_tokens.dart'; final _util = CardSpecUtility.self; @@ -14,16 +14,16 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.border.color.ref($rx.neutral1), + _container.border.color.ref($rx.color.neutral(1)), ); Style get _softVariant => Style( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ); Style get _surfaceVariant => Style( - _container.color.ref($rx.neutral3A), - _container.border.color.ref($rx.neutral7A), + _container.color.ref($rx.color.neutralAlpha(3)), + _container.border.color.ref($rx.color.neutralAlpha(7)), _container.border.strokeAlign(1), ); diff --git a/packages/remix/lib/components/card/card.variants.dart b/packages/remix/lib/components/card/card_variants.dart similarity index 100% rename from packages/remix/lib/components/card/card.variants.dart rename to packages/remix/lib/components/card/card_variants.dart diff --git a/packages/remix/lib/components/card/card_widget.dart b/packages/remix/lib/components/card/card_widget.dart index 13c8e7244..9c0b3108a 100644 --- a/packages/remix/lib/components/card/card_widget.dart +++ b/packages/remix/lib/components/card/card_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/card/card.style.dart'; -import 'package:remix/components/card/card.variants.dart'; import 'package:remix/components/card/card_spec.dart'; +import 'package:remix/components/card/card_style.dart'; +import 'package:remix/components/card/card_variants.dart'; class RxCard extends StatelessWidget { const RxCard({ diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart index 3f07e6441..c4319324c 100644 --- a/packages/remix/lib/components/checkbox/checkbox_style.dart +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -17,70 +17,70 @@ Style get _baseStyle => Style( Style get _onDisabledForeground => Style( $on.disabled( - _indicator.color.ref($rx.neutral7A), + _indicator.color.ref($rx.color.neutralAlpha(7)), ), ); Style get _solidVariant => Style( - _container.color.ref($rx.accent9), - _indicator.color.ref($rx.neutral1), + _container.color.ref($rx.color.accent(9)), + _indicator.color.ref($rx.color.neutral(1)), $on.hover( - _container.color.ref($rx.accent10), + _container.color.ref($rx.color.accent(10)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); Style get _softVariant => Style( - _container.color.ref($rx.accent3A), - _indicator.color.ref($rx.accent11A), + _container.color.ref($rx.color.accentAlpha(3)), + _indicator.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent4A), + _container.color.ref($rx.color.accentAlpha(4)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); Style get _outlineVariant => Style( _container.color(Colors.transparent), - _container.border.color.ref($rx.accent8A), + _container.border.color.ref($rx.color.accentAlpha(8)), _container.border.width(1.5), - _indicator.color.ref($rx.accent11A), + _indicator.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent2A), + _container.color.ref($rx.color.accentAlpha(2)), ), $on.disabled( - _container.border.color.ref($rx.neutral8A), + _container.border.color.ref($rx.color.neutralAlpha(8)), _container.color.transparent(), ), ); Style get _surfaceVariant => Style( _outlineVariant(), - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), $on.hover( - _container.color.ref($rx.accent4A), - _container.border.color.ref($rx.accent8A), + _container.color.ref($rx.color.accentAlpha(4)), + _container.border.color.ref($rx.color.accentAlpha(8)), ), $on.disabled( - _container.color.ref($rx.neutral2A), + _container.color.ref($rx.color.neutralAlpha(2)), ), ); final _ghostVariant = Style( _container.border.style.none(), _container.color(Colors.transparent), - _indicator.color.ref($rx.accent11A), + _indicator.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), ), ); Style get _disabledVariant => Style( - _container.color.ref($rx.neutral3A), - _container.border.color.ref($rx.neutral5A), - _indicator.color.ref($rx.neutral7A), + _container.color.ref($rx.color.neutralAlpha(3)), + _container.border.color.ref($rx.color.neutralAlpha(5)), + _indicator.color.ref($rx.color.neutralAlpha(7)), ); Style get _smallVariant => Style( diff --git a/packages/remix/scripts/context_markdown.dart b/packages/remix/lib/components/context.md similarity index 100% rename from packages/remix/scripts/context_markdown.dart rename to packages/remix/lib/components/context.md diff --git a/packages/remix/lib/components/progress/progress.style.dart b/packages/remix/lib/components/progress/progress_style.dart similarity index 80% rename from packages/remix/lib/components/progress/progress.style.dart rename to packages/remix/lib/components/progress/progress_style.dart index 8ba7385c7..72f2515e1 100644 --- a/packages/remix/lib/components/progress/progress.style.dart +++ b/packages/remix/lib/components/progress/progress_style.dart @@ -1,8 +1,8 @@ // ignore_for_file: camel_case_types import 'package:mix/mix.dart'; -import 'package:remix/components/progress/progress.variants.dart'; import 'package:remix/components/progress/progress_spec.dart'; +import 'package:remix/components/progress/progress_variants.dart'; import 'package:remix/tokens/remix_tokens.dart'; final _progress = ProgressSpecUtility.self; @@ -12,8 +12,8 @@ final _fill = _progress.fill; Style get _baseStyle => Style( _container.borderRadius(99), - _track.color($rx.neutral3A()), - _fill.color($rx.accent9()), + _track.color($rx.color.neutralAlpha(3)()), + _fill.color($rx.color.accent(9)()), ); final _smallVariant = Style( @@ -29,18 +29,18 @@ final _largeVariant = Style( ); final _classicVariant = Style( - _track.color($rx.neutral3A()), - _fill.color($rx.accent9()), + _track.color($rx.color.neutralAlpha(3)()), + _fill.color($rx.color.accent(9)()), ); final _surfaceVariant = Style( - _track.color($rx.neutral2A()), - _fill.color($rx.accent9()), + _track.color($rx.color.neutralAlpha(2)()), + _fill.color($rx.color.accent(9)()), ); final _softVariant = Style( - _track.color($rx.accent3A()), - _fill.color($rx.accent9()), + _track.color($rx.color.accentAlpha(3)()), + _fill.color($rx.color.accent(9)()), ); final _noneRadiusVariant = Style( diff --git a/packages/remix/lib/components/progress/progress.variants.dart b/packages/remix/lib/components/progress/progress_variants.dart similarity index 100% rename from packages/remix/lib/components/progress/progress.variants.dart rename to packages/remix/lib/components/progress/progress_variants.dart diff --git a/packages/remix/lib/components/progress/progress_widget.dart b/packages/remix/lib/components/progress/progress_widget.dart index 23a930724..550d606e8 100644 --- a/packages/remix/lib/components/progress/progress_widget.dart +++ b/packages/remix/lib/components/progress/progress_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/progress/progress.style.dart'; -import 'package:remix/components/progress/progress.variants.dart'; import 'package:remix/components/progress/progress_spec.dart'; +import 'package:remix/components/progress/progress_style.dart'; +import 'package:remix/components/progress/progress_variants.dart'; class RxProgress extends StatelessWidget { const RxProgress({ diff --git a/packages/remix/lib/components/radio/radio_style.dart b/packages/remix/lib/components/radio/radio_style.dart index 52316380e..bf2d8341e 100644 --- a/packages/remix/lib/components/radio/radio_style.dart +++ b/packages/remix/lib/components/radio/radio_style.dart @@ -18,59 +18,59 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.color.ref($rx.accent9), - _indicator.color.ref($rx.neutral1), + _container.color.ref($rx.color.accent(9)), + _indicator.color.ref($rx.color.neutral(1)), $on.hover( - _container.color.ref($rx.accent10), + _container.color.ref($rx.color.accent(10)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); Style get _softVariant => Style( - _container.color.ref($rx.accent3A), - _indicator.color.ref($rx.accent11A), + _container.color.ref($rx.color.accentAlpha(3)), + _indicator.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent4A), + _container.color.ref($rx.color.accentAlpha(4)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); Style get _outlineVariant => Style( _container.color(Colors.transparent), - _container.border.color.ref($rx.accent8A), + _container.border.color.ref($rx.color.accentAlpha(8)), _container.border.width(1.5), - _indicator.color.ref($rx.accent11A), + _indicator.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent2A), + _container.color.ref($rx.color.accentAlpha(2)), ), $on.disabled( - _container.border.color.ref($rx.neutral8A), + _container.border.color.ref($rx.color.neutralAlpha(8)), _container.color.transparent(), ), ); Style get _surfaceVariant => Style( _outlineVariant(), - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), $on.hover( - _container.color.ref($rx.accent4A), - _container.border.color.ref($rx.accent8A), + _container.color.ref($rx.color.accentAlpha(4)), + _container.border.color.ref($rx.color.accentAlpha(8)), ), $on.disabled( - _container.color.ref($rx.neutral3A), + _container.color.ref($rx.color.neutralAlpha(3)), ), ); Style get _ghostVariant => Style( _container.border.style.none(), _container.color(Colors.transparent), - _indicator.color.ref($rx.accent11A), + _indicator.color.ref($rx.color.accentAlpha(11)), $on.hover( - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), ), ); Style get _smallVariant => Style( @@ -89,9 +89,9 @@ Style get _largeVariant => Style( ); Style get _disabledVariant => Style( - _container.color.ref($rx.neutral3A), - _container.border.color.ref($rx.neutral5A), - _indicator.color.ref($rx.neutral7A), + _container.color.ref($rx.color.neutralAlpha(3)), + _container.border.color.ref($rx.color.neutralAlpha(5)), + _indicator.color.ref($rx.color.neutralAlpha(7)), ); Style buildDefaultRadioStyle() { diff --git a/packages/remix/lib/components/spinner/spinner.style.dart b/packages/remix/lib/components/spinner/spinner.style.dart index 5b96e30e9..882efd468 100644 --- a/packages/remix/lib/components/spinner/spinner.style.dart +++ b/packages/remix/lib/components/spinner/spinner.style.dart @@ -6,7 +6,7 @@ import 'package:remix/tokens/remix_tokens.dart'; final _util = SpinnerSpecUtility.self; Style get _baseStyle => Style( - _util.color.ref($rx.accent9), + _util.color.ref($rx.color.accent(9)), ); Style get _smallVariant => Style( diff --git a/packages/remix/lib/components/switch/switch.style.dart b/packages/remix/lib/components/switch/switch_style.dart similarity index 67% rename from packages/remix/lib/components/switch/switch.style.dart rename to packages/remix/lib/components/switch/switch_style.dart index 4265f1065..7d8f461e6 100644 --- a/packages/remix/lib/components/switch/switch.style.dart +++ b/packages/remix/lib/components/switch/switch_style.dart @@ -1,6 +1,6 @@ import 'package:mix/mix.dart'; -import 'package:remix/components/switch/switch.variants.dart'; import 'package:remix/components/switch/switch_spec.dart'; +import 'package:remix/components/switch/switch_variants.dart'; import 'package:remix/helpers/utility_extension.dart'; import 'package:remix/tokens/remix_tokens.dart'; @@ -21,30 +21,30 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _indicator.color.ref($rx.neutral1), + _indicator.color.ref($rx.color.neutral(1)), SwitchStatus.on( - _container.color.ref($rx.accent9), + _container.color.ref($rx.color.accent(9)), ), SwitchStatus.off( - _container.color.ref($rx.neutral3), + _container.color.ref($rx.color.neutral(3)), ), $on.disabled( - _container.color.ref($rx.neutral3A), - _indicator.color.ref($rx.neutral7A), + _container.color.ref($rx.color.neutralAlpha(3)), + _indicator.color.ref($rx.color.neutralAlpha(7)), ), ); Style get _softVariant => Style( - _indicator.color.ref($rx.accent11A), + _indicator.color.ref($rx.color.accentAlpha(11)), SwitchStatus.on( - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), ), SwitchStatus.off( - _container.color.ref($rx.neutral4), + _container.color.ref($rx.color.neutral(4)), ), $on.disabled( - _container.color.ref($rx.neutral3A), - _indicator.color.ref($rx.neutral7A), + _container.color.ref($rx.color.neutralAlpha(3)), + _indicator.color.ref($rx.color.neutralAlpha(7)), ), ); @@ -52,30 +52,30 @@ Style get _outlineVariant => Style( _container.color.transparent(), _container.border.width(1.5), _container.border.strokeAlign(1), - _indicator.color.ref($rx.accent11A), + _indicator.color.ref($rx.color.accentAlpha(11)), SwitchStatus.on( - _container.border.color.ref($rx.accent8A), + _container.border.color.ref($rx.color.accentAlpha(8)), ), SwitchStatus.off( - _container.border.color.ref($rx.neutral4), + _container.border.color.ref($rx.color.neutral(4)), ), $on.disabled( - _container.border.color.ref($rx.neutral8A), - _indicator.color.ref($rx.neutral7A), + _container.border.color.ref($rx.color.neutralAlpha(8)), + _indicator.color.ref($rx.color.neutralAlpha(7)), ), ); Style get _surfaceVariant => Style( _outlineVariant(), SwitchStatus.on( - _container.color.ref($rx.accent3A), + _container.color.ref($rx.color.accentAlpha(3)), ), SwitchStatus.off( - _container.color.ref($rx.neutral3A), - _container.border.color.ref($rx.neutral4), + _container.color.ref($rx.color.neutralAlpha(3)), + _container.border.color.ref($rx.color.neutral(4)), ), $on.disabled( - _container.color.ref($rx.neutral2A), + _container.color.ref($rx.color.neutralAlpha(2)), ), ); diff --git a/packages/remix/lib/components/switch/switch.variants.dart b/packages/remix/lib/components/switch/switch_variants.dart similarity index 100% rename from packages/remix/lib/components/switch/switch.variants.dart rename to packages/remix/lib/components/switch/switch_variants.dart diff --git a/packages/remix/lib/components/switch/switch_widget.dart b/packages/remix/lib/components/switch/switch_widget.dart index 863caa165..2d53e9c17 100644 --- a/packages/remix/lib/components/switch/switch_widget.dart +++ b/packages/remix/lib/components/switch/switch_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/widgets.dart'; import 'package:mix/mix.dart'; -import 'package:remix/components/switch/switch.style.dart'; -import 'package:remix/components/switch/switch.variants.dart'; import 'package:remix/components/switch/switch_spec.dart'; +import 'package:remix/components/switch/switch_style.dart'; +import 'package:remix/components/switch/switch_variants.dart'; class RxSwitch extends StatelessWidget { const RxSwitch({ diff --git a/packages/remix/lib/helpers/color_palette.dart b/packages/remix/lib/helpers/color_palette.dart index e4d444695..9c74c0947 100644 --- a/packages/remix/lib/helpers/color_palette.dart +++ b/packages/remix/lib/helpers/color_palette.dart @@ -67,31 +67,6 @@ class RadixColors { static const whiteAlpha = RadixColors(_whiteAlpha, _whiteAlpha); static const sage = RadixColors(_sage, _sageAlpha); static const sageDark = RadixColors(_sageDark, _sageDarkAlpha); - - Color get s1 => swatch[1]!; - Color get s1Alpha => alphaSwatch[1]!; - Color get s2 => swatch[2]!; - Color get s2Alpha => alphaSwatch[2]!; - Color get s3 => swatch[3]!; - Color get s3Alpha => alphaSwatch[3]!; - Color get s4 => swatch[4]!; - Color get s4Alpha => alphaSwatch[4]!; - Color get s5 => swatch[5]!; - Color get s5Alpha => alphaSwatch[5]!; - Color get s6 => swatch[6]!; - Color get s6Alpha => alphaSwatch[6]!; - Color get s7 => swatch[7]!; - Color get s7Alpha => alphaSwatch[7]!; - Color get s8 => swatch[8]!; - Color get s8Alpha => alphaSwatch[8]!; - Color get s9 => swatch[9]!; - Color get s9Alpha => alphaSwatch[9]!; - Color get s10 => swatch[10]!; - Color get s10Alpha => alphaSwatch[10]!; - Color get s11 => swatch[11]!; - Color get s11Alpha => alphaSwatch[11]!; - Color get s12 => swatch[12]!; - Color get s12Alpha => alphaSwatch[12]!; } const _amber = ColorSwatch( diff --git a/packages/remix/lib/remix.dart b/packages/remix/lib/remix.dart index 50bb19774..26ab54451 100644 --- a/packages/remix/lib/remix.dart +++ b/packages/remix/lib/remix.dart @@ -1,12 +1,12 @@ library remix; -export 'components/button/button.style.dart'; -export 'components/button/button.variants.dart'; export 'components/button/button_spec.dart'; +export 'components/button/button_style.dart'; +export 'components/button/button_variants.dart'; export 'components/button/button_widget.dart'; -export 'components/card/card.style.dart'; -export 'components/card/card.variants.dart'; export 'components/card/card_spec.dart'; +export 'components/card/card_style.dart'; +export 'components/card/card_variants.dart'; export 'components/card/card_widget.dart'; export 'components/checkbox/checkbox_spec.dart'; export 'components/checkbox/checkbox_style.dart'; @@ -19,8 +19,8 @@ export 'components/spinner/spinner.style.dart'; export 'components/spinner/spinner.variants.dart'; export 'components/spinner/spinner_spec.dart'; export 'components/spinner/spinner_widget.dart'; -export 'components/switch/switch.style.dart'; -export 'components/switch/switch.variants.dart'; export 'components/switch/switch_spec.dart'; +export 'components/switch/switch_style.dart'; +export 'components/switch/switch_variants.dart'; export 'components/switch/switch_widget.dart'; export 'tokens/remix_tokens.dart'; diff --git a/packages/remix/lib/tokens/color_tokens.dart b/packages/remix/lib/tokens/color_tokens.dart index 762119979..fb20539dc 100644 --- a/packages/remix/lib/tokens/color_tokens.dart +++ b/packages/remix/lib/tokens/color_tokens.dart @@ -3,122 +3,62 @@ import 'package:mix/mix.dart'; import 'package:remix/helpers/color_palette.dart'; class RemixColor { - RemixColor(); + const RemixColor(this.value); - final accent1 = const ColorToken('--accent-1'); - final accent2 = const ColorToken('--accent-2'); - final accent3 = const ColorToken('--accent-3'); - final accent4 = const ColorToken('--accent-4'); - final accent5 = const ColorToken('--accent-5'); - final accent6 = const ColorToken('--accent-6'); - final accent7 = const ColorToken('--accent-7'); - final accent8 = const ColorToken('--accent-8'); - final accent9 = const ColorToken('--accent-9'); - final accent10 = const ColorToken('--accent-10'); - final accent11 = const ColorToken('--accent-11'); - final accent12 = const ColorToken('--accent-12'); - final accent1A = const ColorToken('--accent-1a'); - final accent2A = const ColorToken('--accent-2a'); - final accent3A = const ColorToken('--accent-3a'); - final accent4A = const ColorToken('--accent-4a'); - final accent5A = const ColorToken('--accent-5a'); - final accent6A = const ColorToken('--accent-6a'); - final accent7A = const ColorToken('--accent-7a'); - final accent8A = const ColorToken('--accent-8a'); - final accent9A = const ColorToken('--accent-9a'); - final accent10A = const ColorToken('--accent-10a'); - final accent11A = const ColorToken('--accent-11a'); - final accent12A = const ColorToken('--accent-12a'); - - final neutral1 = const ColorToken('--neutral-1'); - final neutral2 = const ColorToken('--neutral-2'); - final neutral3 = const ColorToken('--neutral-3'); - final neutral4 = const ColorToken('--neutral-4'); - final neutral5 = const ColorToken('--neutral-5'); - final neutral6 = const ColorToken('--neutral-6'); - final neutral7 = const ColorToken('--neutral-7'); - final neutral8 = const ColorToken('--neutral-8'); - final neutral9 = const ColorToken('--neutral-9'); - final neutral10 = const ColorToken('--neutral-10'); - final neutral11 = const ColorToken('--neutral-11'); - final neutral12 = const ColorToken('--neutral-12'); - final neutral1A = const ColorToken('--neutral-1a'); - final neutral2A = const ColorToken('--neutral-2a'); - final neutral3A = const ColorToken('--neutral-3a'); - final neutral4A = const ColorToken('--neutral-4a'); - final neutral5A = const ColorToken('--neutral-5a'); - final neutral6A = const ColorToken('--neutral-6a'); - final neutral7A = const ColorToken('--neutral-7a'); - final neutral8A = const ColorToken('--neutral-8a'); - final neutral9A = const ColorToken('--neutral-9a'); - final neutral10A = const ColorToken('--neutral-10a'); - final neutral11A = const ColorToken('--neutral-11a'); - final neutral12A = const ColorToken('--neutral-12a'); + final Color value; } -final _c = RemixColor(); +class RemixColors { + RemixColors(); + + final _blackColor = const ColorToken('--black'); + final _whiteColor = const ColorToken('--white'); + final _accentSwatch = ColorSwatchToken.scale('--accent', 12); + final _accentAlphaSwatch = ColorSwatchToken.scale('--accent-alpha', 12); + + final _neutralSwatch = ColorSwatchToken.scale('--neutral', 12); + final _neutralAlphaSwatch = ColorSwatchToken.scale('--neutral-alpha', 12); + + ColorToken black() => _blackColor; + ColorToken white() => _whiteColor; + ColorToken accent([int? step]) { + return step == null ? _accentSwatch : _accentSwatch[step]; + } + + ColorToken accentAlpha([int? step]) { + return step == null ? _accentAlphaSwatch : _accentAlphaSwatch[step]; + } + + ColorToken neutral([int? step]) { + return step == null ? _neutralSwatch : _neutralSwatch[step]; + } + + ColorToken neutralAlpha([int? step]) { + return step == null ? _neutralAlphaSwatch : _neutralAlphaSwatch[step]; + } +} Map _mapColorRadixTokens({ required RadixColors accent, required RadixColors neutral, }) { + final remix = RemixColors(); + return { - _c.accent1: accent.s1, - _c.accent2: accent.s2, - _c.accent3: accent.s3, - _c.accent4: accent.s4, - _c.accent5: accent.s5, - _c.accent6: accent.s6, - _c.accent7: accent.s7, - _c.accent8: accent.s8, - _c.accent9: accent.s9, - _c.accent10: accent.s10, - _c.accent11: accent.s11, - _c.accent12: accent.s12, - _c.accent1A: accent.s1Alpha, - _c.accent2A: accent.s2Alpha, - _c.accent3A: accent.s3Alpha, - _c.accent4A: accent.s4Alpha, - _c.accent5A: accent.s5Alpha, - _c.accent6A: accent.s6Alpha, - _c.accent7A: accent.s7Alpha, - _c.accent8A: accent.s8Alpha, - _c.accent9A: accent.s9Alpha, - _c.accent10A: accent.s10Alpha, - _c.accent11A: accent.s11Alpha, - _c.accent12A: accent.s12Alpha, - _c.neutral1: neutral.s1, - _c.neutral2: neutral.s2, - _c.neutral3: neutral.s3, - _c.neutral4: neutral.s4, - _c.neutral5: neutral.s5, - _c.neutral6: neutral.s6, - _c.neutral7: neutral.s7, - _c.neutral8: neutral.s8, - _c.neutral9: neutral.s9, - _c.neutral10: neutral.s10, - _c.neutral11: neutral.s11, - _c.neutral12: neutral.s12, - _c.neutral1A: neutral.s1Alpha, - _c.neutral2A: neutral.s2Alpha, - _c.neutral3A: neutral.s3Alpha, - _c.neutral4A: neutral.s4Alpha, - _c.neutral5A: neutral.s5Alpha, - _c.neutral6A: neutral.s6Alpha, - _c.neutral7A: neutral.s7Alpha, - _c.neutral8A: neutral.s8Alpha, - _c.neutral9A: neutral.s9Alpha, - _c.neutral10A: neutral.s10Alpha, - _c.neutral11A: neutral.s11Alpha, - _c.neutral12A: neutral.s12Alpha, + remix._whiteColor: const Color(0xFFFFFFFF), + remix._blackColor: const Color(0xFF1C2024), + remix._accentSwatch: accent.swatch, + remix._accentAlphaSwatch: accent.alphaSwatch, + remix._neutralSwatch: neutral.swatch, + remix._neutralAlphaSwatch: neutral.alphaSwatch, }; } final remixColorTokens = _mapColorRadixTokens( accent: RadixColors.indigo, - neutral: RadixColors.gray, + neutral: RadixColors.slate, ); final remixDarkColorTokens = _mapColorRadixTokens( accent: RadixColors.indigoDark, - neutral: RadixColors.grayDark, + neutral: RadixColors.slateDark, ); diff --git a/packages/remix/lib/tokens/remix_tokens.dart b/packages/remix/lib/tokens/remix_tokens.dart index 0822094dd..24de66fca 100644 --- a/packages/remix/lib/tokens/remix_tokens.dart +++ b/packages/remix/lib/tokens/remix_tokens.dart @@ -9,85 +9,13 @@ final $rx = _RemixTokenRef(); class _RemixTokenRef { _RemixTokenRef(); - final _color = RemixColor(); - late final accent1 = _color.accent1; - late final accent2 = _color.accent2; - late final accent3 = _color.accent3; - late final accent4 = _color.accent4; - late final accent5 = _color.accent5; - late final accent6 = _color.accent6; - late final accent7 = _color.accent7; - late final accent8 = _color.accent8; - late final accent9 = _color.accent9; - late final accent10 = _color.accent10; - late final accent11 = _color.accent11; - late final accent12 = _color.accent12; - late final accent1A = _color.accent1A; - late final accent2A = _color.accent2A; - late final accent3A = _color.accent3A; - late final accent4A = _color.accent4A; - late final accent5A = _color.accent5A; - late final accent6A = _color.accent6A; - late final accent7A = _color.accent7A; - late final accent8A = _color.accent8A; - late final accent9A = _color.accent9A; - late final accent10A = _color.accent10A; - late final accent11A = _color.accent11A; - late final accent12A = _color.accent12A; - late final neutral1 = _color.neutral1; - late final neutral2 = _color.neutral2; - late final neutral3 = _color.neutral3; - late final neutral4 = _color.neutral4; - late final neutral5 = _color.neutral5; - late final neutral6 = _color.neutral6; - late final neutral7 = _color.neutral7; - late final neutral8 = _color.neutral8; - late final neutral9 = _color.neutral9; - late final neutral10 = _color.neutral10; - late final neutral11 = _color.neutral11; - late final neutral12 = _color.neutral12; - late final neutral1A = _color.neutral1A; - late final neutral2A = _color.neutral2A; - late final neutral3A = _color.neutral3A; - late final neutral4A = _color.neutral4A; - late final neutral5A = _color.neutral5A; - late final neutral6A = _color.neutral6A; - late final neutral7A = _color.neutral7A; - late final neutral8A = _color.neutral8A; - late final neutral9A = _color.neutral9A; - late final neutral10A = _color.neutral10A; - late final neutral11A = _color.neutral11A; - late final neutral12A = _color.neutral12A; + final color = RemixColors(); - final _space = RemixSpace(); - late final space1 = _space.space1; - late final space2 = _space.space2; - late final space3 = _space.space3; - late final space4 = _space.space4; - late final space5 = _space.space5; - late final space6 = _space.space6; - late final space7 = _space.space7; - late final space8 = _space.space8; - late final space9 = _space.space9; + final space = RemixSpace(); - final _radius = RemixRadius(); - late final radius1 = _radius.radius1; - late final radius2 = _radius.radius2; - late final radius3 = _radius.radius3; - late final radius4 = _radius.radius4; - late final radius5 = _radius.radius5; - late final radius6 = _radius.radius6; + final radii = RemixRadius(); - final _text = RemixTypography(); - late final text1 = _text.text1; - late final text2 = _text.text2; - late final text3 = _text.text3; - late final text4 = _text.text4; - late final text5 = _text.text5; - late final text6 = _text.text6; - late final text7 = _text.text7; - late final text8 = _text.text8; - late final text9 = _text.text9; + final text = RemixTypography(); } final _baseRemixTokens = MixThemeData( diff --git a/packages/remix/lib/tokens/space_tokens.dart b/packages/remix/lib/tokens/space_tokens.dart index 5e04705c5..de2435ed6 100644 --- a/packages/remix/lib/tokens/space_tokens.dart +++ b/packages/remix/lib/tokens/space_tokens.dart @@ -12,6 +12,37 @@ class RemixSpace { final space7 = const SpaceToken('--space-7'); final space8 = const SpaceToken('--space-8'); final space9 = const SpaceToken('--space-9'); + + operator [](int index) { + return call(index); + } + + SpaceToken call(int step) { + switch (step) { + case 1: + return space1; + case 2: + return space2; + case 3: + return space3; + case 4: + return space4; + case 5: + return space5; + case 6: + return space6; + case 7: + return space7; + case 8: + return space8; + case 9: + return space9; + default: + throw Exception( + 'Invalid space step: $step found. Space step should be between 1 and 9.', + ); + } + } } final _s = RemixSpace(); diff --git a/packages/remix/scripts/generate.dart b/packages/remix/scripts/generate.dart new file mode 100644 index 000000000..0b7d48156 --- /dev/null +++ b/packages/remix/scripts/generate.dart @@ -0,0 +1,53 @@ +import 'dart:io'; + +void main(List arguments) { + if (arguments.isEmpty) { + print('Please provide a component name as an argument.'); + return; + } + + final componentName = arguments[0]; + + generateSpecFile(componentName); + generateWidgetFile(componentName); + generateStyleFile(componentName); + generateVariantsFile(componentName); + + print('Files generated successfully!'); +} + +void generateSpecFile(String componentName) { + final directory = 'lib/components/$componentName'; + final fileName = '$directory/${componentName}_spec.dart'; + const content = ''; + + Directory(directory).createSync(recursive: true); + File(fileName).writeAsStringSync(content); +} + +void generateWidgetFile(String componentName) { + final directory = 'lib/components/$componentName'; + final fileName = '$directory/${componentName}_widget.dart'; + const content = ''; + + Directory(directory).createSync(recursive: true); + File(fileName).writeAsStringSync(content); +} + +void generateStyleFile(String componentName) { + final directory = 'lib/components/$componentName'; + final fileName = '$directory/$componentName.style.dart'; + const content = ''; + + Directory(directory).createSync(recursive: true); + File(fileName).writeAsStringSync(content); +} + +void generateVariantsFile(String componentName) { + final directory = 'lib/components/$componentName'; + final fileName = '$directory/$componentName.variants.dart'; + const content = ''; + + Directory(directory).createSync(recursive: true); + File(fileName).writeAsStringSync(content); +} diff --git a/packages/remix/scripts/markdown.dart b/packages/remix/scripts/markdown.dart new file mode 100644 index 000000000..41905042c --- /dev/null +++ b/packages/remix/scripts/markdown.dart @@ -0,0 +1,28 @@ +import 'dart:io'; + +void main() { + final rootDirectory = Directory.current; + final contextFile = File('context.md'); + + void processDirectory(Directory directory) { + for (var fileOrDir in directory.listSync()) { + if (fileOrDir is File && + fileOrDir.path.endsWith('.dart') && + !fileOrDir.path.endsWith('.g.dart')) { + final fileName = fileOrDir.path.split('/').last; + final fileContent = fileOrDir.readAsStringSync(); + + contextFile.writeAsStringSync('# $fileName\n', mode: FileMode.append); + contextFile.writeAsStringSync('```dart\n', mode: FileMode.append); + contextFile.writeAsStringSync(fileContent, mode: FileMode.append); + contextFile.writeAsStringSync('\n```\n', mode: FileMode.append); + } else if (fileOrDir is Directory) { + processDirectory(fileOrDir); + } + } + } + + contextFile.writeAsStringSync('# Dart Files\n'); + processDirectory(rootDirectory); + print('context.md file generated successfully.'); +} From 8745c96dbd45086bae8444a38483ea80aad7b430 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Thu, 11 Jul 2024 12:44:48 -0400 Subject: [PATCH 16/24] Added color swatch token --- .../mix/lib/src/theme/tokens/color_token.dart | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/packages/mix/lib/src/theme/tokens/color_token.dart b/packages/mix/lib/src/theme/tokens/color_token.dart index b1e7bf514..c596fd1bb 100644 --- a/packages/mix/lib/src/theme/tokens/color_token.dart +++ b/packages/mix/lib/src/theme/tokens/color_token.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import '../mix/mix_theme.dart'; @@ -35,6 +36,43 @@ class ColorToken extends MixToken { } } +@immutable +class ColorSwatchToken extends ColorToken { + final Map swatch; + const ColorSwatchToken(super.name, this.swatch); + + operator [](int index) => swatch[index]; + + static ColorSwatchToken scale(String name, int steps) { + return ColorSwatchToken(name, { + for (var i = 1; i <= steps; i++) i: ColorToken('$name-$i'), + }); + } + + @override + ColorSwatch resolve(BuildContext context) { + final themeValue = MixTheme.of(context).colors[this]; + assert( + themeValue != null, + 'ColorSwatchToken $name is not defined in the theme', + ); + + return themeValue as ColorSwatch; + } + + @override + operator ==(Object other) { + if (identical(this, other)) return true; + + return other is ColorSwatchToken && + other.name == name && + mapEquals(other.swatch, swatch); + } + + @override + int get hashCode => name.hashCode ^ swatch.hashCode; +} + /// A color resolver that allows dynamic resolution of a color value. /// /// This is useful when the color value is dependent on the current [BuildContext], From 3f2de8996053f44ca49651170628b503d2122ae5 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Fri, 12 Jul 2024 17:17:04 -0400 Subject: [PATCH 17/24] Token clean up --- .../ephemeral/FlutterInputs.xcfilelist | 4 ++-- .../lib/components/avatar/avatar_style.dart | 2 +- .../lib/components/badge/badge_style.dart | 2 +- .../lib/components/button/button_style.dart | 2 +- .../components/checkbox/checkbox_style.dart | 2 +- .../components/progress/progress_style.dart | 8 +++---- .../lib/components/radio/radio_style.dart | 2 +- .../lib/components/spinner/spinner.style.dart | 2 +- .../lib/components/switch/switch_style.dart | 4 ++-- packages/remix/lib/tokens/color_tokens.dart | 24 +++++++++++++++++++ 10 files changed, 38 insertions(+), 14 deletions(-) diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index 569d43fbd..e96caf091 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -857,10 +857,10 @@ /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.dart /Users/leofarias/Projects/mix/packages/remix/demo/lib/main.directories.g.dart /Users/leofarias/Projects/mix/packages/remix/demo/pubspec.yaml -/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar.style.dart -/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar.variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_spec.g.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_style.dart +/Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_variants.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/avatar/avatar_widget.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.dart /Users/leofarias/Projects/mix/packages/remix/lib/components/button/button_spec.g.dart diff --git a/packages/remix/lib/components/avatar/avatar_style.dart b/packages/remix/lib/components/avatar/avatar_style.dart index 652ff27d0..4e46ea8be 100644 --- a/packages/remix/lib/components/avatar/avatar_style.dart +++ b/packages/remix/lib/components/avatar/avatar_style.dart @@ -21,7 +21,7 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.color($rx.color.accent(9)()), + _container.color($rx.color.accent()()), ); Style get _softVariant => Style( diff --git a/packages/remix/lib/components/badge/badge_style.dart b/packages/remix/lib/components/badge/badge_style.dart index 0f772afc5..92a1054f0 100644 --- a/packages/remix/lib/components/badge/badge_style.dart +++ b/packages/remix/lib/components/badge/badge_style.dart @@ -16,7 +16,7 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.color($rx.color.accent(9)()), + _container.color($rx.color.accent()()), _label.style.color($rx.color.neutral(1)()), ); diff --git a/packages/remix/lib/components/button/button_style.dart b/packages/remix/lib/components/button/button_style.dart index a17f30e9d..9a07a3a30 100644 --- a/packages/remix/lib/components/button/button_style.dart +++ b/packages/remix/lib/components/button/button_style.dart @@ -38,7 +38,7 @@ Style get _onDisabledForeground => Style( ); Style get _solidVariant => Style( - _container.color.ref($rx.color.accent(9)), + _container.color.ref($rx.color.accent()), _items.color.ref($rx.color.white()), $on.hover( _container.color.ref($rx.color.accent(10)), diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart index c4319324c..8f59214cf 100644 --- a/packages/remix/lib/components/checkbox/checkbox_style.dart +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -22,7 +22,7 @@ Style get _onDisabledForeground => Style( ); Style get _solidVariant => Style( - _container.color.ref($rx.color.accent(9)), + _container.color.ref($rx.color.accent()), _indicator.color.ref($rx.color.neutral(1)), $on.hover( _container.color.ref($rx.color.accent(10)), diff --git a/packages/remix/lib/components/progress/progress_style.dart b/packages/remix/lib/components/progress/progress_style.dart index 72f2515e1..e22296839 100644 --- a/packages/remix/lib/components/progress/progress_style.dart +++ b/packages/remix/lib/components/progress/progress_style.dart @@ -13,7 +13,7 @@ final _fill = _progress.fill; Style get _baseStyle => Style( _container.borderRadius(99), _track.color($rx.color.neutralAlpha(3)()), - _fill.color($rx.color.accent(9)()), + _fill.color($rx.color.accent()()), ); final _smallVariant = Style( @@ -30,17 +30,17 @@ final _largeVariant = Style( final _classicVariant = Style( _track.color($rx.color.neutralAlpha(3)()), - _fill.color($rx.color.accent(9)()), + _fill.color($rx.color.accent()()), ); final _surfaceVariant = Style( _track.color($rx.color.neutralAlpha(2)()), - _fill.color($rx.color.accent(9)()), + _fill.color($rx.color.accent()()), ); final _softVariant = Style( _track.color($rx.color.accentAlpha(3)()), - _fill.color($rx.color.accent(9)()), + _fill.color($rx.color.accent()()), ); final _noneRadiusVariant = Style( diff --git a/packages/remix/lib/components/radio/radio_style.dart b/packages/remix/lib/components/radio/radio_style.dart index bf2d8341e..679e2e454 100644 --- a/packages/remix/lib/components/radio/radio_style.dart +++ b/packages/remix/lib/components/radio/radio_style.dart @@ -18,7 +18,7 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.color.ref($rx.color.accent(9)), + _container.color.ref($rx.color.accent()), _indicator.color.ref($rx.color.neutral(1)), $on.hover( _container.color.ref($rx.color.accent(10)), diff --git a/packages/remix/lib/components/spinner/spinner.style.dart b/packages/remix/lib/components/spinner/spinner.style.dart index 882efd468..2e14e9800 100644 --- a/packages/remix/lib/components/spinner/spinner.style.dart +++ b/packages/remix/lib/components/spinner/spinner.style.dart @@ -6,7 +6,7 @@ import 'package:remix/tokens/remix_tokens.dart'; final _util = SpinnerSpecUtility.self; Style get _baseStyle => Style( - _util.color.ref($rx.color.accent(9)), + _util.color.ref($rx.color.accent()), ); Style get _smallVariant => Style( diff --git a/packages/remix/lib/components/switch/switch_style.dart b/packages/remix/lib/components/switch/switch_style.dart index 7d8f461e6..f5c74c3d5 100644 --- a/packages/remix/lib/components/switch/switch_style.dart +++ b/packages/remix/lib/components/switch/switch_style.dart @@ -21,9 +21,9 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _indicator.color.ref($rx.color.neutral(1)), + _indicator.color.ref($rx.color.white()), SwitchStatus.on( - _container.color.ref($rx.color.accent(9)), + _container.color.ref($rx.color.accent()), ), SwitchStatus.off( _container.color.ref($rx.color.neutral(3)), diff --git a/packages/remix/lib/tokens/color_tokens.dart b/packages/remix/lib/tokens/color_tokens.dart index fb20539dc..61bca1794 100644 --- a/packages/remix/lib/tokens/color_tokens.dart +++ b/packages/remix/lib/tokens/color_tokens.dart @@ -62,3 +62,27 @@ final remixDarkColorTokens = _mapColorRadixTokens( accent: RadixColors.indigoDark, neutral: RadixColors.slateDark, ); +// class RemixColorUtility { +// final ColorSwatchToken swatch; +// const RemixColorUtility(this.swatch); + +// ColorToken call([int? index]) => index == null ? swatch : swatch[index]; + +// operator +(int index) { +// if (index == 0) return this; + +// // check if index on swatch exists +// if (swatch[index] == null) return this; + +// return swatch[index]; +// } + +// operator -(int index) { +// if (index == 0) return this; + +// // check if index on swatch exists +// if (swatch[index] == null) return this; + +// return swatch[index]; +// } +// } From 8e5f16316c828a5308891cfd76ad1c6acde554b3 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Fri, 12 Jul 2024 17:21:01 -0400 Subject: [PATCH 18/24] Color swatch --- .../mix/lib/src/theme/tokens/color_token.dart | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/mix/lib/src/theme/tokens/color_token.dart b/packages/mix/lib/src/theme/tokens/color_token.dart index c596fd1bb..bdceb315d 100644 --- a/packages/mix/lib/src/theme/tokens/color_token.dart +++ b/packages/mix/lib/src/theme/tokens/color_token.dart @@ -25,6 +25,10 @@ class ColorToken extends MixToken { @override Color resolve(BuildContext context) { final themeValue = MixTheme.of(context).colors[this]; + + if (themeValue == null) { + // Look for maybe been a swatch token + } assert( themeValue != null, 'ColorToken $name is not defined in the theme', @@ -43,9 +47,13 @@ class ColorSwatchToken extends ColorToken { operator [](int index) => swatch[index]; - static ColorSwatchToken scale(String name, int steps) { + static ColorSwatchToken scale( + String name, + int steps, { + String separator = '-', + }) { return ColorSwatchToken(name, { - for (var i = 1; i <= steps; i++) i: ColorToken('$name-$i'), + for (var i = 1; i <= steps; i++) i: ColorToken('$name$separator$i'), }); } @@ -59,18 +67,6 @@ class ColorSwatchToken extends ColorToken { return themeValue as ColorSwatch; } - - @override - operator ==(Object other) { - if (identical(this, other)) return true; - - return other is ColorSwatchToken && - other.name == name && - mapEquals(other.swatch, swatch); - } - - @override - int get hashCode => name.hashCode ^ swatch.hashCode; } /// A color resolver that allows dynamic resolution of a color value. From a5e3f7d2d16571d014e23dc12447246e0eb0c180 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Sat, 13 Jul 2024 16:47:39 -0400 Subject: [PATCH 19/24] Implemented ColorSwatchToken --- .../lib/style/components/checkbox.dart | 4 ++-- packages/remix/.vscode/launch.json | 6 ++--- .../ephemeral/FlutterInputs.xcfilelist | 4 ++++ .../lib/components/avatar/avatar_style.dart | 4 ++-- .../lib/components/badge/badge_style.dart | 16 ++++++------- .../components/checkbox/checkbox_style.dart | 2 +- .../components/progress/progress_style.dart | 16 ++++++------- .../lib/components/radio/radio_style.dart | 2 +- packages/remix/lib/tokens/color_tokens.dart | 24 ------------------- 9 files changed, 29 insertions(+), 49 deletions(-) diff --git a/examples/todo_list/lib/style/components/checkbox.dart b/examples/todo_list/lib/style/components/checkbox.dart index 540cf5b45..0944cc394 100644 --- a/examples/todo_list/lib/style/components/checkbox.dart +++ b/examples/todo_list/lib/style/components/checkbox.dart @@ -33,7 +33,7 @@ class TodoCheckbox extends StatelessWidget { scaleEffect(), outlinePattern(), $icon.size(16), - $icon.color.ref($token.color.surface), + $icon.color.ref($material.colorScheme.surface), $icon.wrap.opacity(0), $icon.wrap.padding.top(5), $icon.wrap.scale(0.5), @@ -48,7 +48,7 @@ class TodoCheckbox extends StatelessWidget { .animate( duration: const Duration(milliseconds: 150), ), - child: const StyledIcon( + child: StyledIcon( Icons.check, style: Style( $icon.weight(16), diff --git a/packages/remix/.vscode/launch.json b/packages/remix/.vscode/launch.json index 369beefba..c68fc4769 100644 --- a/packages/remix/.vscode/launch.json +++ b/packages/remix/.vscode/launch.json @@ -6,21 +6,21 @@ "configurations": [ { - "name": "demo", + "name": "Remix (debug mode)", "cwd": "demo", "request": "launch", "type": "dart", "deviceId": "macos" }, { - "name": "demo (profile mode)", + "name": "Remix (profile mode)", "cwd": "demo", "request": "launch", "type": "dart", "flutterMode": "profile" }, { - "name": "demo (release mode)", + "name": "Remix (release mode)", "cwd": "demo", "request": "launch", "type": "dart", diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index e96caf091..ae1b8aac3 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -739,6 +739,9 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gap/spacing_side_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gradient/gradient_dto.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/gradient/gradient_dto.g.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/modifiers/widget_modifiers_data.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/modifiers/widget_modifiers_data_dto.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/modifiers/widget_modifiers_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/nested_style/nested_style_attribute.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/nested_style/nested_style_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/attributes/scalars/scalar_util.dart @@ -775,6 +778,7 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/constants.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/custom_focusable_action_detector.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/deep_collection_equality.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/internal/diagnostic_properties_builder_ext.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/helper_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/iterable_ext.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/lerp_helpers.dart diff --git a/packages/remix/lib/components/avatar/avatar_style.dart b/packages/remix/lib/components/avatar/avatar_style.dart index 4e46ea8be..cbb6fcb90 100644 --- a/packages/remix/lib/components/avatar/avatar_style.dart +++ b/packages/remix/lib/components/avatar/avatar_style.dart @@ -17,11 +17,11 @@ Style get _baseStyle => Style( _container.alignment.center(), _fallback.textAlign.center(), _fallback.style.fontWeight(FontWeight.bold), - _fallback.style.color($rx.color.neutral(1)()), + _fallback.style.color.ref($rx.color.neutral(1)), ); Style get _solidVariant => Style( - _container.color($rx.color.accent()()), + _container.color.ref($rx.color.accent()), ); Style get _softVariant => Style( diff --git a/packages/remix/lib/components/badge/badge_style.dart b/packages/remix/lib/components/badge/badge_style.dart index 92a1054f0..5bd0df0a1 100644 --- a/packages/remix/lib/components/badge/badge_style.dart +++ b/packages/remix/lib/components/badge/badge_style.dart @@ -16,25 +16,25 @@ Style get _baseStyle => Style( ); Style get _solidVariant => Style( - _container.color($rx.color.accent()()), - _label.style.color($rx.color.neutral(1)()), + _container.color.ref($rx.color.accent()), + _label.style.color.ref($rx.color.neutral(1)), ); Style get _softVariant => Style( - _container.color($rx.color.accentAlpha(3)()), - _label.style.color($rx.color.accentAlpha(11)()), + _container.color.ref($rx.color.accentAlpha(3)), + _label.style.color.ref($rx.color.accentAlpha(11)), ); Style get _surfaceVariant => Style( - _container.color($rx.color.accentAlpha(2)()), - _label.style.color($rx.color.accentAlpha(11)()), + _container.color.ref($rx.color.accentAlpha(2)), + _label.style.color.ref($rx.color.accentAlpha(11)), ); Style get _outlineVariant => Style( _container.color(Colors.transparent), _container.border.width(1), - _container.border.color($rx.color.accentAlpha(8)()), - _label.style.color($rx.color.accentAlpha(11)()), + _container.border.color.ref($rx.color.accentAlpha(8)), + _label.style.color.ref($rx.color.accentAlpha(11)), ); final _smallVariant = Style( diff --git a/packages/remix/lib/components/checkbox/checkbox_style.dart b/packages/remix/lib/components/checkbox/checkbox_style.dart index 8f59214cf..04776a86f 100644 --- a/packages/remix/lib/components/checkbox/checkbox_style.dart +++ b/packages/remix/lib/components/checkbox/checkbox_style.dart @@ -23,7 +23,7 @@ Style get _onDisabledForeground => Style( Style get _solidVariant => Style( _container.color.ref($rx.color.accent()), - _indicator.color.ref($rx.color.neutral(1)), + _indicator.color.ref($rx.color.white()), $on.hover( _container.color.ref($rx.color.accent(10)), ), diff --git a/packages/remix/lib/components/progress/progress_style.dart b/packages/remix/lib/components/progress/progress_style.dart index e22296839..572ab6a71 100644 --- a/packages/remix/lib/components/progress/progress_style.dart +++ b/packages/remix/lib/components/progress/progress_style.dart @@ -12,8 +12,8 @@ final _fill = _progress.fill; Style get _baseStyle => Style( _container.borderRadius(99), - _track.color($rx.color.neutralAlpha(3)()), - _fill.color($rx.color.accent()()), + _track.color.ref($rx.color.neutralAlpha(3)), + _fill.color.ref($rx.color.accent()), ); final _smallVariant = Style( @@ -29,18 +29,18 @@ final _largeVariant = Style( ); final _classicVariant = Style( - _track.color($rx.color.neutralAlpha(3)()), - _fill.color($rx.color.accent()()), + _track.color.ref($rx.color.neutralAlpha(3)), + _fill.color.ref($rx.color.accent()), ); final _surfaceVariant = Style( - _track.color($rx.color.neutralAlpha(2)()), - _fill.color($rx.color.accent()()), + _track.color.ref($rx.color.neutralAlpha(2)), + _fill.color.ref($rx.color.accent()), ); final _softVariant = Style( - _track.color($rx.color.accentAlpha(3)()), - _fill.color($rx.color.accent()()), + _track.color.ref($rx.color.accentAlpha(3)), + _fill.color.ref($rx.color.accent()), ); final _noneRadiusVariant = Style( diff --git a/packages/remix/lib/components/radio/radio_style.dart b/packages/remix/lib/components/radio/radio_style.dart index 679e2e454..7dc526d47 100644 --- a/packages/remix/lib/components/radio/radio_style.dart +++ b/packages/remix/lib/components/radio/radio_style.dart @@ -19,7 +19,7 @@ Style get _baseStyle => Style( Style get _solidVariant => Style( _container.color.ref($rx.color.accent()), - _indicator.color.ref($rx.color.neutral(1)), + _indicator.color.ref($rx.color.white()), $on.hover( _container.color.ref($rx.color.accent(10)), ), diff --git a/packages/remix/lib/tokens/color_tokens.dart b/packages/remix/lib/tokens/color_tokens.dart index 61bca1794..fb20539dc 100644 --- a/packages/remix/lib/tokens/color_tokens.dart +++ b/packages/remix/lib/tokens/color_tokens.dart @@ -62,27 +62,3 @@ final remixDarkColorTokens = _mapColorRadixTokens( accent: RadixColors.indigoDark, neutral: RadixColors.slateDark, ); -// class RemixColorUtility { -// final ColorSwatchToken swatch; -// const RemixColorUtility(this.swatch); - -// ColorToken call([int? index]) => index == null ? swatch : swatch[index]; - -// operator +(int index) { -// if (index == 0) return this; - -// // check if index on swatch exists -// if (swatch[index] == null) return this; - -// return swatch[index]; -// } - -// operator -(int index) { -// if (index == 0) return this; - -// // check if index on swatch exists -// if (swatch[index] == null) return this; - -// return swatch[index]; -// } -// } From e144836f70342cfcdd692e9c91f5f55833cff2e5 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Sat, 13 Jul 2024 16:49:58 -0400 Subject: [PATCH 20/24] ColorSwatch Token --- packages/mix/lib/src/theme/mix/mix_theme.dart | 25 +++++++++-- .../mix/lib/src/theme/tokens/color_token.dart | 41 +++++++++++++++++-- .../mix/lib/src/theme/tokens/mix_token.dart | 27 ++++++------ .../lib/src/theme/tokens/radius_token.dart | 3 +- 4 files changed, 75 insertions(+), 21 deletions(-) diff --git a/packages/mix/lib/src/theme/mix/mix_theme.dart b/packages/mix/lib/src/theme/mix/mix_theme.dart index e2eb76b3f..719843aec 100644 --- a/packages/mix/lib/src/theme/mix/mix_theme.dart +++ b/packages/mix/lib/src/theme/mix/mix_theme.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import '../../attributes/text_style/text_style_dto.dart'; -import '../../internal/compare_mixin.dart'; import '../material/material_theme.dart'; import '../tokens/breakpoints_token.dart'; import '../tokens/color_token.dart'; @@ -33,7 +32,7 @@ class MixTheme extends InheritedWidget { } @immutable -class MixThemeData with EqualityMixin { +class MixThemeData { final StyledTokens radii; final StyledTokens colors; final StyledTokens textStyles; @@ -132,7 +131,27 @@ class MixThemeData with EqualityMixin { } @override - get props => [spaces, breakpoints, colors, textStyles, radii, typography]; + operator ==(Object other) { + if (identical(this, other)) return true; + + return other is MixThemeData && + other.textStyles == textStyles && + other.colors == colors && + other.breakpoints == breakpoints && + other.radii == radii && + other.spaces == spaces && + other.typography == typography; + } + + @override + int get hashCode { + return textStyles.hashCode ^ + colors.hashCode ^ + breakpoints.hashCode ^ + radii.hashCode ^ + spaces.hashCode ^ + typography.hashCode; + } } final _breakpointTokenMap = StyledTokens({ diff --git a/packages/mix/lib/src/theme/tokens/color_token.dart b/packages/mix/lib/src/theme/tokens/color_token.dart index bdceb315d..3bab132e0 100644 --- a/packages/mix/lib/src/theme/tokens/color_token.dart +++ b/packages/mix/lib/src/theme/tokens/color_token.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import '../mix/mix_theme.dart'; @@ -40,12 +39,46 @@ class ColorToken extends MixToken { } } +@immutable +class ColorTokenOfSwatch extends ColorToken { + final ColorSwatchToken _swatchToken; + final T index; + + const ColorTokenOfSwatch(super.name, this._swatchToken, this.index); + + @override + ColorRef call() => ColorRef(this); + + @override + Color resolve(BuildContext context) { + final colorSwatch = MixTheme.of(context).colors[_swatchToken]; + assert( + colorSwatch != null, + 'ColorSwatchToken $name is not defined in the theme', + ); + + assert( + colorSwatch is ColorSwatch, + 'ColorSwatchToken $name is not of type ColorSwatch<$T>', + ); + + return (colorSwatch as ColorSwatch)[index]!; + } +} + @immutable class ColorSwatchToken extends ColorToken { - final Map swatch; + final Map swatch; const ColorSwatchToken(super.name, this.swatch); - operator [](int index) => swatch[index]; + operator [](T index) { + final colorName = swatch[index]; + assert( + colorName != null, + 'ColorSwatchToken $name does not have a value for index $index', + ); + return ColorTokenOfSwatch(colorName!, this, index); + } static ColorSwatchToken scale( String name, @@ -53,7 +86,7 @@ class ColorSwatchToken extends ColorToken { String separator = '-', }) { return ColorSwatchToken(name, { - for (var i = 1; i <= steps; i++) i: ColorToken('$name$separator$i'), + for (var i = 1; i <= steps; i++) i: '$name$separator$i', }); } diff --git a/packages/mix/lib/src/theme/tokens/mix_token.dart b/packages/mix/lib/src/theme/tokens/mix_token.dart index 7cc836bbf..d45a51c4f 100644 --- a/packages/mix/lib/src/theme/tokens/mix_token.dart +++ b/packages/mix/lib/src/theme/tokens/mix_token.dart @@ -1,26 +1,18 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import '../../internal/compare_mixin.dart'; import '../../internal/iterable_ext.dart'; -import 'color_token.dart'; -import 'radius_token.dart'; -import 'text_style_token.dart'; @immutable abstract class MixToken { final String name; const MixToken(this.name); - static ColorToken color(String name) => ColorToken(name); - - static TextStyleToken textStyle(String name) => TextStyleToken(name); - - static RadiusToken radius(String name) => RadiusToken(name); - T call(); T resolve(BuildContext context); + @override operator ==(Object other) { if (identical(this, other)) return true; @@ -44,7 +36,7 @@ mixin WithTokenResolver { typedef BuildContextResolver = T Function(BuildContext context); -class StyledTokens, V> with EqualityMixin { +class StyledTokens, V> { final Map _map; const StyledTokens(this._map); @@ -69,5 +61,16 @@ class StyledTokens, V> with EqualityMixin { } @override - get props => [_map]; + operator ==(Object other) { + if (identical(this, other)) return true; + + return other is StyledTokens && + mapEquals( + other._map, + _map, + ); + } + + @override + int get hashCode => _map.hashCode; } diff --git a/packages/mix/lib/src/theme/tokens/radius_token.dart b/packages/mix/lib/src/theme/tokens/radius_token.dart index d599f2f91..a77c271fa 100644 --- a/packages/mix/lib/src/theme/tokens/radius_token.dart +++ b/packages/mix/lib/src/theme/tokens/radius_token.dart @@ -35,8 +35,7 @@ class RadiusResolver extends Radius with WithTokenResolver { } @immutable -class RadiusRef extends Radius - with TokenRef, Diagnosticable { +class RadiusRef extends Radius with TokenRef, Diagnosticable { @override final RadiusToken token; From 2daf51b5d094ec7b8efa8331e0533febe9666801 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Sat, 13 Jul 2024 17:25:49 -0400 Subject: [PATCH 21/24] Typography token removal --- packages/mix/lib/src/theme/mix/mix_theme.dart | 12 +---------- .../src/theme/tokens/text_style_token.dart | 20 ------------------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/packages/mix/lib/src/theme/mix/mix_theme.dart b/packages/mix/lib/src/theme/mix/mix_theme.dart index 8026fd1f6..d70bac97c 100644 --- a/packages/mix/lib/src/theme/mix/mix_theme.dart +++ b/packages/mix/lib/src/theme/mix/mix_theme.dart @@ -35,7 +35,7 @@ class MixThemeData { final StyledTokens radii; final StyledTokens colors; final StyledTokens textStyles; - final StyledTokens typography; + final StyledTokens breakpoints; final StyledTokens spaces; @@ -45,7 +45,6 @@ class MixThemeData { required this.breakpoints, required this.radii, required this.spaces, - required this.typography, }); const MixThemeData.empty() @@ -55,7 +54,6 @@ class MixThemeData { breakpoints: const StyledTokens.empty(), radii: const StyledTokens.empty(), spaces: const StyledTokens.empty(), - typography: const StyledTokens.empty(), ); factory MixThemeData({ @@ -64,7 +62,6 @@ class MixThemeData { Map? spaces, Map? textStyles, Map? radii, - Map? typography, }) { return MixThemeData.raw( textStyles: StyledTokens(textStyles ?? const {}), @@ -73,7 +70,6 @@ class MixThemeData { _breakpointTokenMap.merge(StyledTokens(breakpoints ?? const {})), radii: StyledTokens(radii ?? const {}), spaces: StyledTokens(spaces ?? const {}), - typography: StyledTokens(typography ?? const {}), ); } @@ -83,7 +79,6 @@ class MixThemeData { Map? spaces, Map? textStyles, Map? radii, - Map? typography, }) { return materialMixTheme.merge( MixThemeData( @@ -92,7 +87,6 @@ class MixThemeData { spaces: spaces, textStyles: textStyles, radii: radii, - typography: typography, ), ); } @@ -103,7 +97,6 @@ class MixThemeData { Map? spaces, Map? textStyles, Map? radii, - Map? typography, }) { return MixThemeData.raw( textStyles: @@ -113,8 +106,6 @@ class MixThemeData { breakpoints == null ? this.breakpoints : StyledTokens(breakpoints), radii: radii == null ? this.radii : StyledTokens(radii), spaces: spaces == null ? this.spaces : StyledTokens(spaces), - typography: - typography == null ? this.typography : StyledTokens(typography), ); } @@ -125,7 +116,6 @@ class MixThemeData { breakpoints: breakpoints.merge(other.breakpoints), radii: radii.merge(other.radii), spaces: spaces.merge(other.spaces), - typography: typography.merge(other.typography), ); } diff --git a/packages/mix/lib/src/theme/tokens/text_style_token.dart b/packages/mix/lib/src/theme/tokens/text_style_token.dart index fe8b9e8c8..ccce86cae 100644 --- a/packages/mix/lib/src/theme/tokens/text_style_token.dart +++ b/packages/mix/lib/src/theme/tokens/text_style_token.dart @@ -1,28 +1,8 @@ import 'package:flutter/widgets.dart'; -import '../../attributes/text_style/text_style_dto.dart'; -import '../../core/factory/mix_data.dart'; import '../mix/mix_theme.dart'; import 'mix_token.dart'; -class TypographyToken extends MixToken { - const TypographyToken(super.name); - - @override - TypographyRef call() => TypographyRef(this); - - @override - TextStyleData resolve(BuildContext context) { - final themeValue = MixTheme.of(context).typography[this]; - assert( - themeValue != null, - 'TypographyToken $name is not defined in the theme', - ); - - return themeValue!; - } -} - class TextStyleToken extends MixToken { const TextStyleToken(super.name); From 8f01f96d0bfae1f57d94ad51e3893ac761fead79 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Wed, 17 Jul 2024 18:17:00 -0400 Subject: [PATCH 22/24] Remix update --- .../mix/lib/src/core/deprecation_notices.dart | 13 +- packages/mix/lib/src/core/styled_widget.dart | 17 +- .../widget_state/gesturable_builder.dart | 327 ++++++++++++++++ .../widget_state/interactive_widget.dart | 336 ++++++++++++++++ .../internal/widget_state/widget_state.dart | 50 +++ .../mix/lib/src/variants/context_variant.dart | 18 - .../context_variant_util/on_util.dart | 2 +- packages/mix/lib/src/variants/variants.dart | 1 + .../widget_state_variant.dart | 36 +- .../mix/lib/src/widgets/pressable_widget.dart | 219 +++++++++++ .../widget_state/pressable_widget.dart | 366 ------------------ .../widgets/widget_state/widget_state.dart | 172 -------- packages/mix/lib/src/widgets/widgets.dart | 4 +- packages/mix/test/helpers/testing_utils.dart | 18 +- .../widget_state/gesturable_builder_test.dart | 108 ++++++ .../widget_state/interactive_widget_test.dart | 134 +++++++ .../widget_state_variant_test.dart | 2 +- .../pressable/pressable_widget_test.dart | 29 +- .../pressable_widget_test.dart | 9 +- .../widget_state/widget_state_test.dart | 157 ++++---- 20 files changed, 1332 insertions(+), 686 deletions(-) create mode 100644 packages/mix/lib/src/internal/widget_state/gesturable_builder.dart create mode 100644 packages/mix/lib/src/internal/widget_state/interactive_widget.dart create mode 100644 packages/mix/lib/src/internal/widget_state/widget_state.dart rename packages/mix/lib/src/{widgets/widget_state => variants}/widget_state_variant.dart (67%) create mode 100644 packages/mix/lib/src/widgets/pressable_widget.dart delete mode 100644 packages/mix/lib/src/widgets/widget_state/pressable_widget.dart delete mode 100644 packages/mix/lib/src/widgets/widget_state/widget_state.dart create mode 100644 packages/mix/test/src/internal/widget_state/gesturable_builder_test.dart create mode 100644 packages/mix/test/src/internal/widget_state/interactive_widget_test.dart rename packages/mix/test/src/{widgets/widget_state => variants}/widget_state_variant_test.dart (98%) rename packages/mix/test/src/widgets/{widget_state => }/pressable_widget_test.dart (97%) diff --git a/packages/mix/lib/src/core/deprecation_notices.dart b/packages/mix/lib/src/core/deprecation_notices.dart index 53ec2fc6b..b92ef1b90 100644 --- a/packages/mix/lib/src/core/deprecation_notices.dart +++ b/packages/mix/lib/src/core/deprecation_notices.dart @@ -1,9 +1,9 @@ // ignore_for_file: camel_case_types import '../attributes/enum/enum_util.dart'; +import '../internal/widget_state/widget_state.dart'; import '../specs/image/image_spec.dart'; -import '../variants/context_variant.dart'; -import '../widgets/widgets.dart'; +import '../variants/widget_state_variant.dart'; import 'attribute.dart'; class InternalMixDeprecatedAnnotation extends Deprecated { @@ -50,15 +50,10 @@ typedef WidgetContextVariant = WidgetStateVariant; updatedName: 'WidgetStateModel', ) typedef PressableState = WidgetStateModel; -@RenamedDeprecated( - message: 'Use `WidgetStateAspect` instead.', - version: '2.0.0', - updatedName: 'WidgetStateAspect', -) -typedef PressableStateAspect = WidgetStateAspect; + @RenamedDeprecated( message: 'Use `MixWidgetState` instead.', version: '2.0.0', updatedName: 'MixWidgetState', ) -typedef PressableCurrentState = MixWidgetState; +typedef PressableCurrentState = WidgetMixState; diff --git a/packages/mix/lib/src/core/styled_widget.dart b/packages/mix/lib/src/core/styled_widget.dart index 1fa95e541..20e6082dd 100644 --- a/packages/mix/lib/src/core/styled_widget.dart +++ b/packages/mix/lib/src/core/styled_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/widgets.dart'; +import '../internal/widget_state/interactive_widget.dart'; import '../modifiers/modifiers.dart'; import 'core.dart'; @@ -45,16 +46,18 @@ abstract class StyledWidget extends StatelessWidget { BuildContext context, Widget Function(BuildContext context) builder, ) { - final inheritedMix = inherit ? Mix.maybeOfInherited(context) : null; + return InteractiveBuilder(builder: (context) { + final inheritedMix = inherit ? Mix.maybeOfInherited(context) : null; - final mix = style.of(context); + final mix = style.of(context); - final mergedMix = inheritedMix?.merge(mix) ?? mix; + final mergedMix = inheritedMix?.merge(mix) ?? mix; - return Mix( - data: mergedMix, - child: applyModifiers(mergedMix, Builder(builder: builder)), - ); + return Mix( + data: mergedMix, + child: applyModifiers(mergedMix, Builder(builder: builder)), + ); + }); } Widget applyModifiers(MixData mix, Widget child) { diff --git a/packages/mix/lib/src/internal/widget_state/gesturable_builder.dart b/packages/mix/lib/src/internal/widget_state/gesturable_builder.dart new file mode 100644 index 000000000..a0824af90 --- /dev/null +++ b/packages/mix/lib/src/internal/widget_state/gesturable_builder.dart @@ -0,0 +1,327 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +class GesturableWidget extends GesturableWidgetBuilder { + const GesturableWidget({ + super.key, + required super.child, + super.enableFeedback = false, + super.enabled = true, + super.onTap, + super.onLongPress, + super.onTapUp, + super.onTapCancel, + super.onLongPressStart, + super.onLongPressEnd, + super.onLongPressCancel, + super.onPanDown, + super.onPanUpdate, + super.onPanEnd, + super.excludeFromSemantics = false, + super.hitTestBehavior = HitTestBehavior.opaque, + required super.unpressDelay, + }); + + @override + State createState() => _GesturableState(); +} + +class _GesturableState extends GesturableWidgetStateBuilder {} + +abstract class GesturableWidgetBuilder extends StatefulWidget { + const GesturableWidgetBuilder({ + super.key, + required this.enabled, + required this.child, + this.enableFeedback = false, + this.onTap, + this.onLongPress, + this.onTapUp, + this.onTapCancel, + this.onLongPressStart, + this.onLongPressEnd, + this.onLongPressCancel, + this.onPanDown, + this.onPanUpdate, + this.onPanEnd, + this.excludeFromSemantics = false, + this.hitTestBehavior = HitTestBehavior.opaque, + required this.unpressDelay, + }); + + final bool enabled; + + /// The child widget. + + final Widget child; + + /// Whether to provide feedback for gestures. + final bool enableFeedback; + + /// The callback that is called when the user stops touching the screen after a tap gesture. + final GestureTapUpCallback? onTapUp; + + /// The callback that is called when the user cancels a tap gesture. + final GestureTapCancelCallback? onTapCancel; + + /// The callback that is called when the user starts a long press gesture. + final GestureLongPressStartCallback? onLongPressStart; + + /// The callback that is called when the user ends a long press gesture. + final GestureLongPressEndCallback? onLongPressEnd; + + /// The callback that is called when the user cancels a long press gesture. + final GestureLongPressCallback? onLongPressCancel; + + /// The callback that is called when the user starts a pan gesture. + final GestureDragDownCallback? onPanDown; + + /// The callback that is called when the user moves their finger during a pan gesture. + final GestureDragUpdateCallback? onPanUpdate; + + /// The callback that is called when the user ends a pan gesture. + final GestureDragEndCallback? onPanEnd; + + /// The callback that is called when the widget is pressed. + final VoidCallback? onTap; + + /// The callback that is called when the widget is long-pressed. + final VoidCallback? onLongPress; + + /// Whether to exclude the widget from semantics. + final bool excludeFromSemantics; + + /// How to behave during hit testing. + final HitTestBehavior hitTestBehavior; + + /// The duration to wait after the press is released before updating the press state. + final Duration unpressDelay; +} + +abstract class GesturableWidgetStateBuilder + extends State { + late final _GesturableDataController _controller; + int _pressCount = 0; + Timer? _timer; + + @override + void initState() { + super.initState(); + _controller = _GesturableDataController(); + _controller.enabled = widget.enabled; + } + + void _handlePanUpdate(DragUpdateDetails event) { + widget.onPanUpdate?.call(event); + } + + void _handlePanDown(DragDownDetails details) { + widget.onPanDown?.call(details); + } + + void _handlePanEnd(DragEndDetails details) { + _updatePress(true); + widget.onPanEnd?.call(details); + } + + void _updatePress(bool isPressed) { + if (isPressed == _controller.pressed) return; + + _controller.pressed = isPressed; + + if (isPressed) { + _pressCount++; + final initialPressCount = _pressCount; + _unpressAfterDelay(initialPressCount); + } + } + + void _onTapUp(TapUpDetails details) { + _controller.longPressed = false; + widget.onTapUp?.call(details); + } + + void _onTapCancel() { + _controller.longPressed = false; + widget.onTapCancel?.call(); + } + + void _onLongPressStart(LongPressStartDetails details) { + _controller.longPressed = true; + widget.onLongPressStart?.call(details); + } + + void _onLongPressEnd(LongPressEndDetails details) { + _controller.longPressed = false; + widget.onLongPressEnd?.call(details); + } + + void _onLongPressCancel() { + _controller.longPressed = false; + widget.onLongPressCancel?.call(); + } + + void _unpressAfterDelay(int initialPressCount) { + void unpressCallback() { + if (_controller.pressed && _pressCount == initialPressCount) { + _controller.pressed = false; + } + } + + _timer?.cancel(); + _timer = null; + + final delay = widget.unpressDelay; + + if (delay != Duration.zero) { + _timer = Timer(delay, unpressCallback); + } else { + unpressCallback(); + } + } + + void _onTap() { + _updatePress(true); + widget.onTap?.call(); + if (widget.enableFeedback) Feedback.forTap(context); + } + + void _onLongPress() { + widget.onLongPress?.call(); + if (widget.enableFeedback) Feedback.forLongPress(context); + } + + @override + void didUpdateWidget(T oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.enabled != oldWidget.enabled) { + _controller.enabled = widget.enabled; + } + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTapUp: _onTapUp, + onTap: _onTap, + onTapCancel: _onTapCancel, + onLongPressCancel: _onLongPressCancel, + onLongPress: _onLongPress, + onLongPressStart: _onLongPressStart, + onLongPressEnd: _onLongPressEnd, + onPanDown: _handlePanDown, + onPanUpdate: _handlePanUpdate, + onPanEnd: _handlePanEnd, + behavior: widget.hitTestBehavior, + excludeFromSemantics: widget.excludeFromSemantics, + child: ListenableBuilder( + listenable: _controller, + builder: (context, _) { + return GesturableState( + longPressed: _controller.longPressed, + pressed: _controller.pressed, + child: widget.child, + ); + }, + ), + ); + } +} + +class _GesturableDataController extends ChangeNotifier { + bool _enabled = false; + bool _pressed = false; + bool _longPressed = false; + + bool get enabled => _enabled; + bool get disabled => !_enabled; + bool get pressed => enabled && _pressed; + bool get longPressed => enabled && _longPressed; + + set enabled(bool value) { + if (_enabled == value) return; + + _enabled = value; + notifyListeners(); + } + + set pressed(bool value) { + if (_pressed == value) return; + + _pressed = value; + notifyListeners(); + } + + set longPressed(bool value) { + if (_longPressed == value) return; + _longPressed = value; + notifyListeners(); + } +} + +enum GestureStateAspect { + pressed, + longPressed, +} + +class GesturableState extends InheritedModel { + const GesturableState({ + super.key, + required super.child, + required this.longPressed, + required this.pressed, + }); + + static GesturableState of( + BuildContext context, [ + GestureStateAspect? aspect, + ]) { + final GesturableState? result = maybeOf(context, aspect); + assert(result != null, 'Unable to find an instance of GesturableState...'); + + return result!; + } + + static GesturableState? maybeOf( + BuildContext context, [ + GestureStateAspect? aspect, + ]) { + return InheritedModel.inheritFrom( + context, + aspect: aspect, + ); + } + + static bool pressedOf(BuildContext context) { + return of(context, GestureStateAspect.pressed).pressed; + } + + static bool longPressedOf(BuildContext context) { + return of(context, GestureStateAspect.longPressed).longPressed; + } + + final bool pressed; + final bool longPressed; + @override + bool updateShouldNotify(GesturableState oldWidget) { + return oldWidget.pressed != pressed || oldWidget.longPressed != longPressed; + } + + @override + bool updateShouldNotifyDependent( + GesturableState oldWidget, + Set dependencies, + ) { + return dependencies.contains(GestureStateAspect.pressed) && + oldWidget.pressed != pressed || + dependencies.contains(GestureStateAspect.longPressed) && + oldWidget.longPressed != longPressed; + } +} diff --git a/packages/mix/lib/src/internal/widget_state/interactive_widget.dart b/packages/mix/lib/src/internal/widget_state/interactive_widget.dart new file mode 100644 index 000000000..411e72b31 --- /dev/null +++ b/packages/mix/lib/src/internal/widget_state/interactive_widget.dart @@ -0,0 +1,336 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +class InteractiveBuilder extends StatelessWidget { + const InteractiveBuilder({super.key, required this.builder}); + + final Widget Function(BuildContext context) builder; + @override + Widget build(BuildContext context) { + return InteractiveState.maybeOf(context) == null + ? InteractiveWidget(child: Builder(builder: builder)) + : builder(context); + } +} + +class InteractiveWidget extends _InteractableWidgetBuilder { + const InteractiveWidget({ + super.key, + required super.child, + super.enabled, + Function(bool focus)? super.onFocusChange, + super.autofocus, + super.focusNode, + super.onKey, + super.onKeyEvent, + super.canRequestFocus, + super.mouseCursor, + super.shortcuts, + super.actions, + super.onEnter, + super.onExit, + super.onHover, + super.onShowFocusHighlight, + super.onShowHoverHighlight, + }); + + @override + State createState() => _InterctableState(); +} + +class _InterctableState + extends _InteractableWidgetBuilderState {} + +abstract class _InteractableWidgetBuilder extends StatefulWidget { + const _InteractableWidgetBuilder({ + super.key, + required this.child, + this.enabled = true, + this.onFocusChange, + this.autofocus = false, + this.focusNode, + this.onKey, + this.onShowFocusHighlight, + this.onShowHoverHighlight, + this.onKeyEvent, + this.canRequestFocus = true, + this.mouseCursor = MouseCursor.defer, + this.shortcuts, + this.actions, + this.onEnter, + this.onExit, + this.onHover, + }); + + final bool enabled; + final MouseCursor mouseCursor; + + final bool canRequestFocus; + + final Widget child; + final Function(bool focus)? onShowFocusHighlight; + final Function(bool hover)? onShowHoverHighlight; + + final ValueChanged? onFocusChange; + + final Map? shortcuts; + + final bool autofocus; + + final FocusNode? focusNode; + + final FocusOnKeyEventCallback? onKey; + + final FocusOnKeyEventCallback? onKeyEvent; + + final Map>? actions; + + final void Function(PointerEnterEvent event)? onEnter; + final void Function(PointerExitEvent event)? onExit; + final void Function(PointerHoverEvent event)? onHover; +} + +abstract class _InteractableWidgetBuilderState< + T extends _InteractableWidgetBuilder> extends State { + late final _InteractableDataController _controller; + + @override + void initState() { + super.initState(); + _controller = _InteractableDataController(); + _controller.enabled = widget.enabled; + } + + void _onShowFocusHighlight(bool hasFocus) { + _controller.focused = hasFocus; + widget.onShowFocusHighlight?.call(hasFocus); + } + + void _onShowHoverHighlight(bool isHovered) { + _controller.hovered = isHovered; + widget.onShowHoverHighlight?.call(isHovered); + } + + void _updateCursorPosition(Offset cursorOffset) { + final size = context.size; + if (size != null) { + _controller.updateCursorPosition(cursorOffset, size); + } + } + + void _onHover(PointerHoverEvent event) { + _updateCursorPosition(event.localPosition); + widget.onHover?.call(event); + } + + void _onEnter(PointerEnterEvent event) { + _updateCursorPosition(event.localPosition); + widget.onEnter?.call(event); + } + + void _onExit(PointerExitEvent event) { + _updateCursorPosition(event.localPosition); + widget.onExit?.call(event); + } + + @override + void didUpdateWidget(T oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.enabled != oldWidget.enabled) { + _controller.enabled = widget.enabled; + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + onHover: _onHover, + cursor: widget.mouseCursor, + child: FocusableActionDetector( + enabled: widget.enabled, + focusNode: widget.focusNode, + autofocus: widget.autofocus, + shortcuts: widget.shortcuts, + actions: widget.actions, + onShowFocusHighlight: _onShowFocusHighlight, + onShowHoverHighlight: _onShowHoverHighlight, + onFocusChange: widget.onFocusChange, + child: ListenableBuilder( + listenable: _controller, + builder: (context, _) { + return InteractiveState( + enabled: _controller.enabled, + focused: _controller.focused, + hovered: _controller.hovered, + pointerPosition: _controller.pointerPosition, + child: widget.child, + ); + }, + ), + ), + ); + } +} + +class _InteractableDataController extends ChangeNotifier { + bool _enabled = false; + bool _focused = false; + bool _hovered = false; + PointerPosition? _pointerPosition; + + bool get focused => _enabled && _focused; + bool get hovered => _enabled && _hovered; + bool get enabled => _enabled; + bool get disabled => !_enabled; + PointerPosition? get pointerPosition => _enabled ? _pointerPosition : null; + + set enabled(bool value) { + if (_enabled == value) return; + + _enabled = value; + notifyListeners(); + } + + set focused(bool value) { + if (_focused == value) return; + + _focused = value; + notifyListeners(); + } + + set hovered(bool value) { + if (_hovered == value) return; + _hovered = value; + notifyListeners(); + } + + void updateCursorPosition(Offset cursorOffset, Size size) { + final ax = cursorOffset.dx / size.width; + final ay = cursorOffset.dy / size.height; + final cursorAlignment = Alignment( + ((ax - 0.5) * 2).clamp(-1.0, 1.0), + ((ay - 0.5) * 2).clamp(-1.0, 1.0), + ); + + _pointerPosition = PointerPosition( + position: cursorAlignment, + offset: cursorOffset, + ); + + notifyListeners(); + } +} + +class PointerPosition { + final Alignment position; + final Offset offset; + const PointerPosition({required this.position, required this.offset}); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is PointerPosition && + other.position == position && + other.offset == offset; + } + + @override + int get hashCode => position.hashCode ^ offset.hashCode; +} + +enum InteractiveAspect { + enabled, + focused, + hovered, + pointerPosition, +} + +class InteractiveState extends InheritedModel { + const InteractiveState({ + super.key, + required super.child, + required this.enabled, + required this.focused, + required this.hovered, + required this.pointerPosition, + }); + + static InteractiveState of( + BuildContext context, [ + InteractiveAspect? aspect, + ]) { + final InteractiveState? result = maybeOf(context, aspect); + assert(result != null, 'Unable to find an instance of PressableState...'); + + return result!; + } + + static InteractiveState? maybeOf( + BuildContext context, [ + InteractiveAspect? aspect, + ]) { + return InheritedModel.inheritFrom( + context, + aspect: aspect, + ); + } + + static bool enabledOf(BuildContext context) { + return of(context, InteractiveAspect.enabled).enabled; + } + + static bool disabledOf(BuildContext context) { + return !enabledOf(context); + } + + static bool focusedOf(BuildContext context) { + return of(context, InteractiveAspect.focused).focused; + } + + static bool hoveredOf(BuildContext context) { + return of(context, InteractiveAspect.hovered).hovered; + } + + static PointerPosition? pointerPositionOf(BuildContext context) { + return of(context, InteractiveAspect.pointerPosition).pointerPosition; + } + + final bool enabled; + final bool focused; + final bool hovered; + final PointerPosition? pointerPosition; + + bool get disabled => !enabled; + + @override + bool updateShouldNotify(InteractiveState oldWidget) { + return enabled != oldWidget.enabled || + focused != oldWidget.focused || + hovered != oldWidget.hovered || + pointerPosition != oldWidget.pointerPosition; + } + + @override + bool updateShouldNotifyDependent( + InteractiveState oldWidget, + Set dependencies, + ) { + return dependencies.contains(InteractiveAspect.enabled) && + enabled != oldWidget.enabled || + dependencies.contains(InteractiveAspect.focused) && + focused != oldWidget.focused || + dependencies.contains(InteractiveAspect.hovered) && + hovered != oldWidget.hovered || + dependencies.contains(InteractiveAspect.pointerPosition) && + pointerPosition != oldWidget.pointerPosition; + } +} diff --git a/packages/mix/lib/src/internal/widget_state/widget_state.dart b/packages/mix/lib/src/internal/widget_state/widget_state.dart new file mode 100644 index 000000000..4a36bfe53 --- /dev/null +++ b/packages/mix/lib/src/internal/widget_state/widget_state.dart @@ -0,0 +1,50 @@ +// ignore_for_file: avoid-inferrable-type-arguments + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +import 'gesturable_builder.dart'; +import 'interactive_widget.dart'; + +enum WidgetMixState { + idle, + disabled, + hovered, + pressed, + longPressed, +} + +final class WidgetStateModel { + static const enabledOf = InteractiveState.enabledOf; + + static const disabledOf = InteractiveState.disabledOf; + + static const hoverOf = InteractiveState.hoveredOf; + + static const focusOf = InteractiveState.focusedOf; + + static const pressOf = GesturableState.pressedOf; + + static const longPressOf = GesturableState.longPressedOf; + + static const pointerPositionOf = InteractiveState.pointerPositionOf; + + const WidgetStateModel._(); + + static WidgetMixState stateOf(BuildContext context) { + final enabled = enabledOf(context); + final longPressed = longPressOf(context); + final hovered = hoverOf(context); + + final pressed = pressOf(context); + + if (!enabled) { + return WidgetMixState.disabled; + } + if (longPressed) return WidgetMixState.longPressed; + if (pressed) return WidgetMixState.pressed; + if (hovered) return WidgetMixState.hovered; + + return WidgetMixState.idle; + } +} diff --git a/packages/mix/lib/src/variants/context_variant.dart b/packages/mix/lib/src/variants/context_variant.dart index 5f8a835eb..584afb642 100644 --- a/packages/mix/lib/src/variants/context_variant.dart +++ b/packages/mix/lib/src/variants/context_variant.dart @@ -52,24 +52,6 @@ abstract class ContextVariant extends IVariant { get props => [priority]; } -@immutable -abstract class WidgetStateVariant extends ContextVariant { - @override - final priority = VariantPriority.highest; - - const WidgetStateVariant(); - - ContextVariantBuilder event(Style Function(Value) fn) { - return ContextVariantBuilder( - (BuildContext context) => fn(builder(context)), - this, - ); - } - - @protected - Value builder(BuildContext context); -} - @immutable abstract class MediaQueryContextVariant extends ContextVariant { @override diff --git a/packages/mix/lib/src/variants/context_variant_util/on_util.dart b/packages/mix/lib/src/variants/context_variant_util/on_util.dart index 6f98384dc..4921fcb71 100644 --- a/packages/mix/lib/src/variants/context_variant_util/on_util.dart +++ b/packages/mix/lib/src/variants/context_variant_util/on_util.dart @@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import '../../theme/tokens/breakpoints_token.dart'; -import '../../widgets/widget_state/widget_state_variant.dart'; +import '../widget_state_variant.dart'; import 'on_breakpoint_util.dart'; import 'on_brightness_util.dart'; import 'on_directionality_util.dart'; diff --git a/packages/mix/lib/src/variants/variants.dart b/packages/mix/lib/src/variants/variants.dart index 8528e9cc0..265ac31f2 100644 --- a/packages/mix/lib/src/variants/variants.dart +++ b/packages/mix/lib/src/variants/variants.dart @@ -13,3 +13,4 @@ export 'context_variant_util/on_orientation_util.dart'; export 'context_variant_util/on_util.dart'; export 'variant_attribute.dart'; export 'variants.dart'; +export 'widget_state_variant.dart'; diff --git a/packages/mix/lib/src/widgets/widget_state/widget_state_variant.dart b/packages/mix/lib/src/variants/widget_state_variant.dart similarity index 67% rename from packages/mix/lib/src/widgets/widget_state/widget_state_variant.dart rename to packages/mix/lib/src/variants/widget_state_variant.dart index ccee29c0c..3c6fdd8a6 100644 --- a/packages/mix/lib/src/widgets/widget_state/widget_state_variant.dart +++ b/packages/mix/lib/src/variants/widget_state_variant.dart @@ -1,7 +1,28 @@ import 'package:flutter/widgets.dart'; -import '../../variants/context_variant.dart'; -import 'widget_state.dart'; +import '../core/factory/style_mix.dart'; +import '../core/variant.dart'; +import '../internal/widget_state/interactive_widget.dart'; +import '../internal/widget_state/widget_state.dart'; +import 'context_variant.dart'; + +@immutable +abstract class WidgetStateVariant extends ContextVariant { + @override + final priority = VariantPriority.highest; + + const WidgetStateVariant(); + + ContextVariantBuilder event(Style Function(Value) fn) { + return ContextVariantBuilder( + (BuildContext context) => fn(builder(context)), + this, + ); + } + + @protected + Value builder(BuildContext context); +} /// Applies styles when the widget is pressed. class OnPressVariant extends WidgetStateVariant { @@ -14,6 +35,17 @@ class OnPressVariant extends WidgetStateVariant { bool when(BuildContext context) => builder(context); } +class OnWidgetStateVariant extends WidgetStateVariant { + const OnWidgetStateVariant(); + + @override + WidgetMixState builder(BuildContext context) => + WidgetStateModel.stateOf(context); + + @override + bool when(BuildContext context) => builder(context) != WidgetMixState.idle; +} + /// Applies styles when the widget is long pressed. class OnLongPressVariant extends WidgetStateVariant { const OnLongPressVariant(); diff --git a/packages/mix/lib/src/widgets/pressable_widget.dart b/packages/mix/lib/src/widgets/pressable_widget.dart new file mode 100644 index 000000000..1345b0e86 --- /dev/null +++ b/packages/mix/lib/src/widgets/pressable_widget.dart @@ -0,0 +1,219 @@ +import 'package:flutter/material.dart'; + +import '../core/factory/style_mix.dart'; +import '../internal/constants.dart'; +import '../internal/widget_state/gesturable_builder.dart'; +import '../internal/widget_state/interactive_widget.dart'; +import '../specs/specs.dart'; + +class PressableBox extends StatelessWidget { + const PressableBox({ + super.key, + this.style, + this.onLongPress, + this.focusNode, + this.autofocus = false, + this.enableFeedback = false, + this.unpressDelay = kDefaultAnimationDuration, + this.onFocusChange, + this.onPress, + this.hitTestBehavior = HitTestBehavior.opaque, + this.enabled = true, + required this.child, + }); + + /// Should gestures provide audible and/or haptic feedback + /// + /// On platforms like Android, enabling feedback will result in audible and tactile + /// responses to certain actions. For example, a tap may produce a clicking sound, + /// while a long-press may trigger a short vibration. + final bool enableFeedback; + + /// The callback that is called when the box is tapped or otherwise activated. + /// + /// If this callback and [onLongPress] are null, then it will be disabled automatically. + final VoidCallback? onPress; + + /// The callback that is called when long-pressed. + /// + /// If this callback and [onPress] are null, then `PressableBox` will be disabled automatically. + final VoidCallback? onLongPress; + + final Style? style; + final Widget child; + final bool enabled; + final FocusNode? focusNode; + final bool autofocus; + final Duration unpressDelay; + final Function(bool focus)? onFocusChange; + + final HitTestBehavior hitTestBehavior; + + @override + Widget build(BuildContext context) { + return Pressable( + enabled: enabled, + onPress: onPress, + hitTestBehavior: hitTestBehavior, + onLongPress: onLongPress, + onFocusChange: onFocusChange, + autofocus: autofocus, + focusNode: focusNode, + unpressDelay: unpressDelay, + child: Box(style: style, child: child), + ); + } +} + +class Pressable extends StatefulWidget { + const Pressable({ + super.key, + required this.child, + this.enabled = true, + this.enableFeedback = false, + this.onPress, + this.hitTestBehavior = HitTestBehavior.opaque, + this.onLongPress, + this.onFocusChange, + this.autofocus = false, + this.focusNode, + this.mouseCursor, + this.onKey, + this.canRequestFocus = true, + this.excludeFromSemantics = false, + this.semanticButtonLabel, + this.onKeyEvent, + this.unpressDelay = kDefaultAnimationDuration, + this.actions, + }); + + final Widget child; + + final bool enabled; + + final MouseCursor? mouseCursor; + + final String? semanticButtonLabel; + + final bool excludeFromSemantics; + + final bool canRequestFocus; + + /// Should gestures provide audible and/or haptic feedback + /// + /// On platforms like Android, enabling feedback will result in audible and tactile + /// responses to certain actions. For example, a tap may produce a clicking sound, + /// while a long-press may trigger a short vibration. + final bool enableFeedback; + + /// The callback that is called when the box is tapped or otherwise activated. + /// + /// If this callback and [onLongPress] are null, then it will be disabled automatically. + final VoidCallback? onPress; + + /// The callback that is called when long-pressed. + /// + /// If this callback and [onPress] are null, then `PressableBox` will be disabled automatically. + final VoidCallback? onLongPress; + + /// Called when the focus state of the [Focus] changes. + /// + /// Called with true when the [Focus] node gains focus + /// and false when the [Focus] node loses focus. + final ValueChanged? onFocusChange; + + /// {@macro flutter.widgets.Focus.autofocus} + final bool autofocus; + + /// {@macro flutter.widgets.Focus.focusNode} + final FocusNode? focusNode; + + /// {@macro flutter.widgets.Focus.onKey} + final FocusOnKeyEventCallback? onKey; + + /// {@macro flutter.widgets.Focus.onKeyEvent} + final FocusOnKeyEventCallback? onKeyEvent; + + /// {@macro flutter.widgets.GestureDetector.hitTestBehavior} + final HitTestBehavior hitTestBehavior; + + /// Actions to be bound to the widget + final Map>? actions; + + /// The duration to wait after the press is released before the state of pressed is removed + final Duration unpressDelay; + + @override + // ignore: library_private_types_in_public_api + _PressableState createState() => _PressableState(); +} + +class _PressableState extends State { + bool get _hasOnPress => widget.onPress != null; + + MouseCursor get _mouseCursor { + if (widget.mouseCursor != null) { + return widget.mouseCursor!; + } + + if (!widget.enabled) { + return SystemMouseCursors.forbidden; + } + + return _hasOnPress ? SystemMouseCursors.click : MouseCursor.defer; + } + + /// Binds the [ActivateIntent] from the Flutter SDK to the onPressed callback by default. + /// This enables SPACE and ENTER key activation on most platforms. + /// Additional actions can be provided externally to extend functionality. + Map> get _actions { + return { + if (widget.onPress != null) ...{ + ActivateIntent: + CallbackAction(onInvoke: (_) => _handlePressed()), + }, + ...(widget.actions ?? {}), + }; + } + + void _handlePressed() { + if (widget.enabled) { + widget.onPress?.call(); + } + } + + @override + Widget build(BuildContext context) { + Widget current = GesturableWidget( + enableFeedback: widget.enableFeedback, + onTap: widget.enabled ? _handlePressed : null, + onLongPress: widget.onLongPress, + excludeFromSemantics: widget.excludeFromSemantics, + hitTestBehavior: widget.hitTestBehavior, + unpressDelay: widget.unpressDelay, + child: InteractiveWidget( + enabled: widget.enabled, + onFocusChange: widget.onFocusChange, + autofocus: widget.autofocus, + focusNode: widget.focusNode, + onKey: widget.onKey, + onKeyEvent: widget.onKeyEvent, + canRequestFocus: widget.canRequestFocus, + mouseCursor: _mouseCursor, + actions: _actions, + child: widget.child, + ), + ); + + if (!widget.excludeFromSemantics) { + current = Semantics( + button: true, + label: widget.semanticButtonLabel, + onTap: widget.onPress, + child: current, + ); + } + + return current; + } +} diff --git a/packages/mix/lib/src/widgets/widget_state/pressable_widget.dart b/packages/mix/lib/src/widgets/widget_state/pressable_widget.dart deleted file mode 100644 index ba37929f7..000000000 --- a/packages/mix/lib/src/widgets/widget_state/pressable_widget.dart +++ /dev/null @@ -1,366 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -import '../../core/factory/style_mix.dart'; -import '../../internal/constants.dart'; -import '../../internal/custom_focusable_action_detector.dart'; -import '../../specs/box/box_widget.dart'; -import 'widget_state.dart'; - -class PressableBox extends StatelessWidget { - const PressableBox({ - super.key, - this.style, - this.onLongPress, - this.focusNode, - this.autofocus = false, - this.enableFeedback = false, - this.unpressDelay = kDefaultAnimationDuration, - this.onFocusChange, - this.onPress, - this.hitTestBehavior = HitTestBehavior.opaque, - this.enabled = true, - required this.child, - }); - - /// Should gestures provide audible and/or haptic feedback - /// - /// On platforms like Android, enabling feedback will result in audible and tactile - /// responses to certain actions. For example, a tap may produce a clicking sound, - /// while a long-press may trigger a short vibration. - final bool enableFeedback; - - /// The callback that is called when the box is tapped or otherwise activated. - /// - /// If this callback and [onLongPress] are null, then it will be disabled automatically. - final VoidCallback? onPress; - - /// The callback that is called when long-pressed. - /// - /// If this callback and [onPress] are null, then `PressableBox` will be disabled automatically. - final VoidCallback? onLongPress; - - final Style? style; - final Widget child; - final bool enabled; - final FocusNode? focusNode; - final bool autofocus; - final Duration unpressDelay; - final Function(bool focus)? onFocusChange; - - final HitTestBehavior hitTestBehavior; - - @override - Widget build(BuildContext context) { - return Pressable( - enabled: enabled, - onPress: onPress, - hitTestBehavior: hitTestBehavior, - onLongPress: onLongPress, - onFocusChange: onFocusChange, - autofocus: autofocus, - focusNode: focusNode, - unpressDelay: unpressDelay, - child: Box(style: style, child: child), - ); - } -} - -class Pressable extends _MixStateWidgetBuilder { - const Pressable({ - super.key, - required super.child, - super.enabled, - super.enableFeedback, - super.onPress, - super.hitTestBehavior, - super.onLongPress, - super.onFocusChange, - super.autofocus, - super.focusNode, - super.onKey, - super.onKeyEvent, - super.unpressDelay = kDefaultAnimationDuration, - }); - - @override - MixStateWidgetState createState() => MixStateWidgetState(); -} - -class MixStateWidgetState extends _MixStateWidgetBuilderState {} - -abstract class _MixStateWidgetBuilder extends StatefulWidget { - const _MixStateWidgetBuilder({ - super.key, - required this.child, - this.enabled = true, - this.enableFeedback = false, - this.onPress, - this.onLongPress, - this.onFocusChange, - this.autofocus = false, - this.focusNode, - this.onKey, - this.onKeyEvent, - this.hitTestBehavior = HitTestBehavior.opaque, - required this.unpressDelay, - }); - - final Widget child; - - final bool enabled; - - /// Should gestures provide audible and/or haptic feedback - /// - /// On platforms like Android, enabling feedback will result in audible and tactile - /// responses to certain actions. For example, a tap may produce a clicking sound, - /// while a long-press may trigger a short vibration. - final bool enableFeedback; - - /// The callback that is called when the box is tapped or otherwise activated. - /// - /// If this callback and [onLongPress] are null, then it will be disabled automatically. - final VoidCallback? onPress; - - /// The callback that is called when long-pressed. - /// - /// If this callback and [onPress] are null, then `PressableBox` will be disabled automatically. - final VoidCallback? onLongPress; - - /// Called when the focus state of the [Focus] changes. - /// - /// Called with true when the [Focus] node gains focus - /// and false when the [Focus] node loses focus. - final ValueChanged? onFocusChange; - - /// {@macro flutter.widgets.Focus.autofocus} - final bool autofocus; - - /// {@macro flutter.widgets.Focus.focusNode} - final FocusNode? focusNode; - - /// {@macro flutter.widgets.Focus.onKey} - final FocusOnKeyEventCallback? onKey; - - /// {@macro flutter.widgets.Focus.onKeyEvent} - final FocusOnKeyEventCallback? onKeyEvent; - - /// {@macro flutter.widgets.GestureDetector.hitTestBehavior} - final HitTestBehavior hitTestBehavior; - - /// The duration to wait after the press is released before the state of pressed is removed - final Duration unpressDelay; -} - -abstract class _MixStateWidgetBuilderState - extends State { - bool _isHovered = false; - bool _isFocused = false; - bool _isPressed = false; - bool _isLongPressed = false; - - bool get _preventEvent => !mounted || !widget.enabled; - - PointerPosition? _pointerPosition = const PointerPosition( - position: Alignment.center, - offset: Offset.zero, - ); - int _pressCount = 0; - - late final Map> _actionMap = >{ - ActivateIntent: CallbackAction(onInvoke: activateOnIntent), - ButtonActivateIntent: - CallbackAction(onInvoke: activateOnIntent), - }; - - void _handleFocusUpdate(bool hasFocus) { - updateState(() => _isFocused = hasFocus); - } - - void _handleHoverUpdate(bool isHovered) { - updateState(() => _isHovered = isHovered); - } - - void _updateCursorPosition(Offset cursorOffset) { - setState(() { - final size = context.size; - if (size != null) { - final ax = cursorOffset.dx / size.width; - final ay = cursorOffset.dy / size.height; - final cursorAlignment = Alignment( - ((ax - 0.5) * 2).clamp(-1.0, 1.0), - ((ay - 0.5) * 2).clamp(-1.0, 1.0), - ); - - setState(() { - _pointerPosition = PointerPosition( - position: cursorAlignment, - offset: cursorOffset, - ); - }); - } - }); - } - - void _handlePanUpdate(DragUpdateDetails event) { - if (_preventEvent) return; - _updateCursorPosition(event.localPosition); - } - - void _handlePanDown(DragDownDetails details) { - if (_preventEvent) return; - _updateCursorPosition(details.localPosition); - } - - void _handlePanUp(DragEndDetails details) { - if (_preventEvent) return; - _handlePressUpdate(true); - } - - void _handleMouseHover(PointerHoverEvent event) { - _updateCursorPosition(event.localPosition); - } - - void _handleOnMouseEnter(PointerEnterEvent event) { - _updateCursorPosition(event.localPosition); - } - - void _handleOnMouseExit(PointerExitEvent event) { - _updateCursorPosition(event.localPosition); - } - - void _handlePressUpdate(bool isPressed) { - if (isPressed == _isPressed) return; - - updateState(() => _isPressed = isPressed); - - if (isPressed) { - _pressCount++; - final initialPressCount = _pressCount; - unpressAfterDelay(initialPressCount); - } - } - - void _onTapUp(TapUpDetails details) { - if (_preventEvent) return; - _handlePressUpdate(false); - } - - void _onTapCancel() { - if (_preventEvent) return; - _handlePressUpdate(false); - } - - void _onLongPressStart(LongPressStartDetails details) { - if (_preventEvent) return; - handleLongPressUpdate(true); - } - - void _onLongPressEnd(LongPressEndDetails details) { - if (_preventEvent) return; - handleLongPressUpdate(false); - } - - void _onLongPressCancel() { - if (_preventEvent) return; - handleLongPressUpdate(false); - } - - void handleLongPressUpdate(bool isLongPressed) { - if (isLongPressed == _isLongPressed) return; - - updateState(() => _isLongPressed = isLongPressed); - } - - void updateState(void Function() fn) { - if (!mounted) return; - setState(fn); - } - - Timer? _timer; - - @override - void dispose() { - _timer?.cancel(); - super.dispose(); - } - - void unpressAfterDelay(int initialPressCount) { - void unpressCallback() { - if (_isPressed && _pressCount == initialPressCount) { - updateState(() => _isPressed = false); - } - } - - _timer?.cancel(); - _timer = null; - - final delay = widget.unpressDelay; - - if (delay != Duration.zero) { - _timer = Timer(delay, unpressCallback); - } else { - unpressCallback(); - } - } - - void handleOnPress() { - if (_preventEvent) return; - _handlePressUpdate(true); - widget.onPress?.call(); - if (widget.enableFeedback) Feedback.forTap(context); - } - - void handleOnLongPress() { - if (_preventEvent) return; - - widget.onLongPress?.call(); - if (widget.enableFeedback) Feedback.forLongPress(context); - } - - void activateOnIntent(Intent? intent) { - handleOnPress(); - } - - @override - Widget build(BuildContext context) { - return Actions( - actions: _actionMap, - child: GestureDetector( - onTapUp: _onTapUp, - onTap: handleOnPress, - onTapCancel: _onTapCancel, - onLongPressCancel: _onLongPressCancel, - onLongPress: handleOnLongPress, - onLongPressStart: _onLongPressStart, - onLongPressEnd: _onLongPressEnd, - onPanDown: _handlePanDown, - onPanUpdate: _handlePanUpdate, - onPanEnd: _handlePanUp, - behavior: widget.hitTestBehavior, - child: CustomFocusableActionDetector( - enabled: widget.enabled, - focusNode: widget.focusNode, - autofocus: widget.autofocus, - onShowFocusHighlight: _handleFocusUpdate, - onShowHoverHighlight: _handleHoverUpdate, - onFocusChange: widget.onFocusChange, - onMouseEnter: _handleOnMouseEnter, - onMouseExit: _handleOnMouseExit, - onMouseHover: _handleMouseHover, - child: WidgetStateModel( - enabled: widget.enabled, - hovered: _isHovered, - focused: _isFocused, - pressed: _isPressed, - longPressed: _isLongPressed, - pointerPosition: _pointerPosition, - child: widget.child, - ), - ), - ), - ); - } -} diff --git a/packages/mix/lib/src/widgets/widget_state/widget_state.dart b/packages/mix/lib/src/widgets/widget_state/widget_state.dart deleted file mode 100644 index a54968316..000000000 --- a/packages/mix/lib/src/widgets/widget_state/widget_state.dart +++ /dev/null @@ -1,172 +0,0 @@ -// ignore_for_file: avoid-inferrable-type-arguments - -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; - -import '../../internal/compare_mixin.dart'; - -enum WidgetStateAspect { - currentState, - enabled, - hovered, - focused, - pressed, - longPressed, - pointerPosition -} - -enum MixWidgetState { - idle, - hovered, - pressed, - longPressed, -} - -final class WidgetStateModel extends InheritedModel { - const WidgetStateModel({ - super.key, - required super.child, - required this.enabled, - required this.hovered, - required this.focused, - required this.pressed, - required this.longPressed, - required this.pointerPosition, - }); - - factory WidgetStateModel.none({Key? key, required Widget child}) { - return WidgetStateModel( - key: key, - enabled: false, - hovered: false, - focused: false, - pressed: false, - longPressed: false, - pointerPosition: null, - child: child, - ); - } - - static WidgetStateModel of( - BuildContext context, [ - WidgetStateAspect? aspect, - ]) { - final WidgetStateModel? result = maybeOf(context, aspect); - assert(result != null, 'Unable to find an instance of PressableState...'); - - return result!; - } - - static WidgetStateModel? maybeOf( - BuildContext context, [ - WidgetStateAspect? aspect, - ]) { - return InheritedModel.inheritFrom( - context, - aspect: aspect, - ); - } - - static WidgetStateModel aspectOf( - BuildContext context, - WidgetStateAspect aspect, - ) { - return of(context, aspect); - } - - static bool enabledOf(BuildContext context) { - return of(context, WidgetStateAspect.enabled).enabled; - } - - static bool disabledOf(BuildContext context) { - return !enabledOf(context); - } - - static bool hoverOf(BuildContext context) { - return of(context, WidgetStateAspect.hovered).hovered; - } - - static bool focusOf(BuildContext context) { - return of(context, WidgetStateAspect.focused).focused; - } - - static bool pressOf(BuildContext context) { - return of(context, WidgetStateAspect.pressed).pressed; - } - - static bool longPressOf(BuildContext context) { - return of(context, WidgetStateAspect.longPressed).longPressed; - } - - static PointerPosition? pointerPositionOf(BuildContext context) { - return of(context, WidgetStateAspect.pointerPosition).pointerPosition; - } - - static MixWidgetState stateOf(BuildContext context) { - return of(context, WidgetStateAspect.currentState).currentState; - } - - final bool enabled; - final bool hovered; - final bool focused; - final bool pressed; - final bool longPressed; - - final PointerPosition? pointerPosition; - - MixWidgetState get currentState { - if (enabled) { - // Long pressed has priority over pressed - // Due to delay of removing the _press state - if (longPressed) return MixWidgetState.longPressed; - - if (pressed) return MixWidgetState.pressed; - } - - if (hovered) return MixWidgetState.hovered; - - return MixWidgetState.idle; - } - - bool get disabled => !enabled; - - @override - bool updateShouldNotify(WidgetStateModel oldWidget) { - return oldWidget.enabled != enabled || - oldWidget.hovered != hovered || - oldWidget.focused != focused || - oldWidget.pressed != pressed || - oldWidget.longPressed != longPressed || - oldWidget.pointerPosition != pointerPosition; - } - - @override - bool updateShouldNotifyDependent( - WidgetStateModel oldWidget, - Set dependencies, - ) { - return dependencies.contains(WidgetStateAspect.enabled) && - oldWidget.enabled != enabled || - dependencies.contains(WidgetStateAspect.hovered) && - oldWidget.hovered != hovered || - dependencies.contains(WidgetStateAspect.focused) && - oldWidget.focused != focused || - dependencies.contains(WidgetStateAspect.pressed) && - oldWidget.pressed != pressed || - dependencies.contains(WidgetStateAspect.longPressed) && - oldWidget.longPressed != longPressed || - dependencies.contains(WidgetStateAspect.pointerPosition) && - oldWidget.pointerPosition != pointerPosition || - dependencies.contains(WidgetStateAspect.currentState) && - oldWidget.currentState != currentState; - } -} - -class PointerPosition with EqualityMixin { - final Alignment position; - final Offset offset; - const PointerPosition({required this.position, required this.offset}); - - @override - get props => [position, offset]; -} diff --git a/packages/mix/lib/src/widgets/widgets.dart b/packages/mix/lib/src/widgets/widgets.dart index 44054baea..d84f6e13c 100644 --- a/packages/mix/lib/src/widgets/widgets.dart +++ b/packages/mix/lib/src/widgets/widgets.dart @@ -4,7 +4,5 @@ // \/\ Generated with barrel script \ \ // \///////////////////////////////////////////////// -export 'widget_state/pressable_widget.dart'; -export 'widget_state/widget_state.dart'; -export 'widget_state/widget_state_variant.dart'; +export 'pressable_widget.dart'; export 'widgets.dart'; diff --git a/packages/mix/test/helpers/testing_utils.dart b/packages/mix/test/helpers/testing_utils.dart index 0f3dc01e6..29a4bb85c 100644 --- a/packages/mix/test/helpers/testing_utils.dart +++ b/packages/mix/test/helpers/testing_utils.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; import 'package:mix/src/internal/lerp_helpers.dart'; +import 'package:mix/src/internal/widget_state/gesturable_builder.dart'; +import 'package:mix/src/internal/widget_state/interactive_widget.dart'; export 'package:mix/src/internal/values_ext.dart'; @@ -137,14 +139,16 @@ extension WidgetTesterExt on WidgetTester { }) async { await pumpWidget( MaterialApp( - home: WidgetStateModel( - enabled: !disabled, - focused: focus, - pressed: pressed, - hovered: hovered, + home: GesturableState( longPressed: longPressed, - pointerPosition: null, - child: widget, + pressed: pressed, + child: InteractiveState( + enabled: !disabled, + focused: focus, + hovered: hovered, + pointerPosition: null, + child: widget, + ), ), ), ); diff --git a/packages/mix/test/src/internal/widget_state/gesturable_builder_test.dart b/packages/mix/test/src/internal/widget_state/gesturable_builder_test.dart new file mode 100644 index 000000000..1794a1f86 --- /dev/null +++ b/packages/mix/test/src/internal/widget_state/gesturable_builder_test.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mix/src/internal/widget_state/gesturable_builder.dart'; + +void main() { + group('GesturableWidget', () { + const key = Key('context_key'); + const unpressDelay = Duration(milliseconds: 500); + testWidgets('should update press state when tapped', (tester) async { + bool onTapCalled = false; + await tester.pumpWidget( + GesturableWidget( + onTap: () { + onTapCalled = true; + }, + unpressDelay: unpressDelay, + child: Builder(builder: (context) { + return const SizedBox( + key: key, + ); + }), + ), + ); + + await tester.tap(find.byType(GesturableWidget)); + await tester.pump(); + + final context = tester.element(find.byKey(key)); + + expect(GesturableState.pressedOf(context), isTrue); + expect(onTapCalled, isTrue); + }); + + testWidgets('should update long press state when long pressed', + (tester) async { + bool onLongPressCalled = false; + await tester.pumpWidget( + GesturableWidget( + onLongPress: () { + onLongPressCalled = true; + }, + unpressDelay: unpressDelay, + child: const SizedBox( + key: key, + ), + ), + ); + + final context = tester.element(find.byKey(key)); + await tester.longPress(find.byType(GesturableWidget)); + + expect(onLongPressCalled, isTrue); + expect(GesturableState.longPressedOf(context), isTrue); + }); + + testWidgets('should update press state after delay when tapped', + (tester) async { + await tester.pumpWidget( + const GesturableWidget( + unpressDelay: Duration(milliseconds: 100), + child: SizedBox(key: key), + ), + ); + + await tester.tap(find.byType(GesturableWidget)); + await tester.pump(); + final context = tester.element(find.byKey(key)); + expect( + GesturableState.pressedOf(context), + isTrue, + reason: 'GesturableState should be pressed immediately after tap', + ); + + await tester.pump( + const Duration(milliseconds: 50), + ); + expect( + GesturableState.pressedOf(context), + isTrue, + reason: 'GesturableState should still be pressed 50ms after tap', + ); + + await tester.pump( + const Duration(milliseconds: 100), + ); + expect( + GesturableState.pressedOf(context), + isFalse, + reason: + 'GesturableState should be unpressed after unpressDelay has passed', + ); + }); + + testWidgets('should not update press state when disabled', (tester) async { + await tester.pumpWidget( + const GesturableWidget( + enabled: false, + unpressDelay: Duration.zero, + child: SizedBox(key: key), + ), + ); + + await tester.tap(find.byType(GesturableWidget)); + final context = tester.element(find.byKey(key)); + expect(GesturableState.pressedOf(context), isFalse); + }); + }); +} diff --git a/packages/mix/test/src/internal/widget_state/interactive_widget_test.dart b/packages/mix/test/src/internal/widget_state/interactive_widget_test.dart new file mode 100644 index 000000000..9b2094abd --- /dev/null +++ b/packages/mix/test/src/internal/widget_state/interactive_widget_test.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mix/src/internal/widget_state/interactive_widget.dart'; + +void main() { + group('InteractiveMixState', () { + testWidgets('should update enabled state', (WidgetTester tester) async { + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: false, + hovered: false, + pointerPosition: null, + child: Container(), + ), + ); + + expect(InteractiveState.enabledOf(tester.element(find.byType(Container))), + isTrue); + expect( + InteractiveState.disabledOf(tester.element(find.byType(Container))), + isFalse); + + await tester.pumpWidget( + InteractiveState( + enabled: false, + focused: false, + hovered: false, + pointerPosition: null, + child: Container(), + ), + ); + + expect(InteractiveState.enabledOf(tester.element(find.byType(Container))), + isFalse); + expect( + InteractiveState.disabledOf(tester.element(find.byType(Container))), + isTrue); + }); + + testWidgets('should update focused state', (WidgetTester tester) async { + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: true, + hovered: false, + pointerPosition: null, + child: Container(), + ), + ); + + expect(InteractiveState.focusedOf(tester.element(find.byType(Container))), + isTrue); + + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: false, + hovered: false, + pointerPosition: null, + child: Container(), + ), + ); + + expect(InteractiveState.focusedOf(tester.element(find.byType(Container))), + isFalse); + }); + + testWidgets('should update hovered state', (WidgetTester tester) async { + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: false, + hovered: true, + pointerPosition: null, + child: Container(), + ), + ); + + expect(InteractiveState.hoveredOf(tester.element(find.byType(Container))), + isTrue); + + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: false, + hovered: false, + pointerPosition: null, + child: Container(), + ), + ); + + expect(InteractiveState.hoveredOf(tester.element(find.byType(Container))), + isFalse); + }); + + testWidgets('should update pointer position', (WidgetTester tester) async { + const pointerPosition = PointerPosition( + position: Alignment.center, + offset: Offset.zero, + ); + + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: false, + hovered: false, + pointerPosition: pointerPosition, + child: Container(), + ), + ); + + expect( + InteractiveState.pointerPositionOf( + tester.element(find.byType(Container))), + equals(pointerPosition)); + + await tester.pumpWidget( + InteractiveState( + enabled: true, + focused: false, + hovered: false, + pointerPosition: null, + child: Container(), + ), + ); + + expect( + InteractiveState.pointerPositionOf( + tester.element(find.byType(Container))), + isNull); + }); + }); +} diff --git a/packages/mix/test/src/widgets/widget_state/widget_state_variant_test.dart b/packages/mix/test/src/variants/widget_state_variant_test.dart similarity index 98% rename from packages/mix/test/src/widgets/widget_state/widget_state_variant_test.dart rename to packages/mix/test/src/variants/widget_state_variant_test.dart index 7dbd5c39e..8d10bb8ee 100644 --- a/packages/mix/test/src/widgets/widget_state/widget_state_variant_test.dart +++ b/packages/mix/test/src/variants/widget_state_variant_test.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; -import '../../../helpers/testing_utils.dart'; +import '../../helpers/testing_utils.dart'; void main() { const onPressed = OnPressVariant(); diff --git a/packages/mix/test/src/widgets/pressable/pressable_widget_test.dart b/packages/mix/test/src/widgets/pressable/pressable_widget_test.dart index 5ea8f43e6..31fe39bf6 100644 --- a/packages/mix/test/src/widgets/pressable/pressable_widget_test.dart +++ b/packages/mix/test/src/widgets/pressable/pressable_widget_test.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; +import 'package:mix/src/internal/widget_state/interactive_widget.dart'; import '../../../helpers/testing_utils.dart'; @@ -43,17 +44,23 @@ void main() { final secondContext = tester.element(find.byKey(secondKey)); final thirdContext = tester.element(find.byKey(thirdKey)); - final firstNotifier = WidgetStateModel.of(firstContext); - final secondNotifier = WidgetStateModel.of(secondContext); - final thirdNotifier = WidgetStateModel.of(thirdContext); - - expect(onEnabledAttr.variant.when(firstContext), false); - expect(firstNotifier.disabled, true); - expect(onEnabledAttr.variant.when(secondContext), false); - expect(secondNotifier.disabled, true); - - expect(onEnabledAttr.variant.when(thirdContext), true); - expect(thirdNotifier.disabled, false); + final firstNotifier = InteractiveState.of(firstContext); + final secondNotifier = InteractiveState.of(secondContext); + final thirdNotifier = InteractiveState.of(thirdContext); + + expect(onEnabledAttr.variant.when(firstContext), false, + reason: 'First Pressable should be disabled'); + expect(firstNotifier.disabled, true, + reason: 'First Pressable should have disabled state'); + expect(onEnabledAttr.variant.when(secondContext), false, + reason: 'Second Pressable should be disabled'); + expect(secondNotifier.disabled, true, + reason: 'Second Pressable should have disabled state'); + + expect(onEnabledAttr.variant.when(thirdContext), true, + reason: 'Third Pressable should be enabled'); + expect(thirdNotifier.disabled, false, + reason: 'Third Pressable should not have disabled state'); }); testWidgets( diff --git a/packages/mix/test/src/widgets/widget_state/pressable_widget_test.dart b/packages/mix/test/src/widgets/pressable_widget_test.dart similarity index 97% rename from packages/mix/test/src/widgets/widget_state/pressable_widget_test.dart rename to packages/mix/test/src/widgets/pressable_widget_test.dart index a4bac5f85..1e7cf8920 100644 --- a/packages/mix/test/src/widgets/widget_state/pressable_widget_test.dart +++ b/packages/mix/test/src/widgets/pressable_widget_test.dart @@ -2,8 +2,9 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; +import 'package:mix/src/internal/widget_state/interactive_widget.dart'; -import '../../../helpers/testing_utils.dart'; +import '../../helpers/testing_utils.dart'; void main() { group('Pressable', () { @@ -42,9 +43,9 @@ void main() { final secondContext = tester.element(find.byKey(secondKey)); final thirdContext = tester.element(find.byKey(thirdKey)); - final firstNotifier = WidgetStateModel.of(firstContext); - final secondNotifier = WidgetStateModel.of(secondContext); - final thirdNotifier = WidgetStateModel.of(thirdContext); + final firstNotifier = InteractiveState.of(firstContext); + final secondNotifier = InteractiveState.of(secondContext); + final thirdNotifier = InteractiveState.of(thirdContext); expect(onEnabledAttr.variant.when(firstContext), false); expect(firstNotifier.disabled, true); diff --git a/packages/mix/test/src/widgets/widget_state/widget_state_test.dart b/packages/mix/test/src/widgets/widget_state/widget_state_test.dart index 98fe73003..a2873cd6c 100644 --- a/packages/mix/test/src/widgets/widget_state/widget_state_test.dart +++ b/packages/mix/test/src/widgets/widget_state/widget_state_test.dart @@ -2,7 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mix/mix.dart'; +import 'package:mix/src/internal/widget_state/gesturable_builder.dart'; +import 'package:mix/src/internal/widget_state/interactive_widget.dart'; +import 'package:mix/src/internal/widget_state/widget_state.dart'; class TrackingText extends StatefulWidget { final String text; @@ -44,32 +46,34 @@ void main() { builder: (BuildContext context, StateSetter setState) { return Column( children: [ - WidgetStateModel( - enabled: true, - hovered: hovered, - focused: focused, + GesturableState( pressed: pressed, longPressed: longPressed, - pointerPosition: null, - child: Builder( - builder: (BuildContext context) { - final bool enabled = WidgetStateModel.enabledOf(context); - final bool hovered = WidgetStateModel.hoverOf(context); - final bool pressed = WidgetStateModel.pressOf(context); - final bool longPressed = - WidgetStateModel.longPressOf(context); - final MixWidgetState state = - WidgetStateModel.stateOf(context); - return Column( - children: [ - Text('Enabled: $enabled'), - Text('Hovered: $hovered'), - Text('LongPressed: $longPressed'), - Text('Pressed: $pressed'), - Text('Current State: $state'), - ], - ); - }, + child: InteractiveState( + enabled: true, + hovered: hovered, + focused: focused, + pointerPosition: null, + child: Builder( + builder: (BuildContext context) { + final bool enabled = + WidgetStateModel.enabledOf(context); + final bool hovered = WidgetStateModel.hoverOf(context); + final bool pressed = WidgetStateModel.pressOf(context); + final bool longPressed = + WidgetStateModel.longPressOf(context); + final state = WidgetStateModel.stateOf(context); + return Column( + children: [ + Text('Enabled: $enabled'), + Text('Hovered: $hovered'), + Text('LongPressed: $longPressed'), + Text('Pressed: $pressed'), + Text('Current State: $state'), + ], + ); + }, + ), ), ), ElevatedButton( @@ -95,7 +99,7 @@ void main() { expect(find.text('Pressed: false'), findsOneWidget); expect(find.text('LongPressed: false'), findsOneWidget); expect(find.text('Focused: false'), findsNothing); - expect(find.text('Current State: MixWidgetState.idle'), findsOneWidget); + expect(find.text('Current State: ${WidgetMixState.idle}'), findsOneWidget); await tester.tap(find.text('Update State')); await tester.pump(); @@ -105,27 +109,8 @@ void main() { expect(find.text('Pressed: true'), findsOneWidget); expect(find.text('LongPressed: true'), findsOneWidget); expect(find.text('Focused: true'), findsNothing); - expect( - find.text('Current State: MixWidgetState.longPressed'), findsOneWidget); - }); - - test('PressableState.none() returns a PressableState with correct values', - () { - final WidgetStateModel state = WidgetStateModel.none( - key: const Key('none'), - child: const Text('none'), - ); - - expect(state.enabled, false); - expect(state.hovered, false); - expect(state.pressed, false); - expect(state.longPressed, false); - expect(state.focused, false); - expect(state.pointerPosition, null); - - expect(state.key, const Key('none')); - expect(state.hashCode, isNot(0)); - expect(state.runtimeType, WidgetStateModel); + expect(find.text('Current State: ${WidgetMixState.longPressed}'), + findsOneWidget); }); testWidgets('PressableState updates inherit model', @@ -144,7 +129,7 @@ void main() { expect(find.text('Pressed: Rebuilds(1), State(false)'), findsOneWidget); expect(find.text('LongPressed: Rebuilds(1), State(false)'), findsOneWidget); expect( - find.text('Current State: Rebuilds(1), State(MixWidgetState.idle)'), + find.text('Current State: Rebuilds(1), State(${WidgetMixState.idle})'), findsOneWidget, ); @@ -156,7 +141,7 @@ void main() { expect(find.text('Pressed: Rebuilds(1), State(false)'), findsOneWidget); expect(find.text('LongPressed: Rebuilds(1), State(false)'), findsOneWidget); expect( - find.text('Current State: Rebuilds(2), State(MixWidgetState.hovered)'), + find.text('Current State: Rebuilds(2), State(${WidgetMixState.hovered})'), findsOneWidget, ); @@ -168,7 +153,7 @@ void main() { expect(find.text('Pressed: Rebuilds(2), State(true)'), findsOneWidget); expect(find.text('LongPressed: Rebuilds(1), State(false)'), findsOneWidget); expect( - find.text('Current State: Rebuilds(3), State(MixWidgetState.pressed)'), + find.text('Current State: Rebuilds(3), State(${WidgetMixState.pressed})'), findsOneWidget, ); @@ -181,7 +166,7 @@ void main() { expect(find.text('LongPressed: Rebuilds(2), State(true)'), findsOneWidget); expect( find.text( - 'Current State: Rebuilds(4), State(MixWidgetState.longPressed)'), + 'Current State: Rebuilds(4), State(${WidgetMixState.longPressed})'), findsOneWidget, ); }); @@ -240,42 +225,44 @@ class _PressableStateTestWidgetState extends State { Widget build(BuildContext context) { return Column( children: [ - WidgetStateModel( - enabled: true, - hovered: hovered, - focused: focused, + GesturableState( pressed: pressed, longPressed: longPressed, - pointerPosition: null, - child: Builder( - builder: (BuildContext context) { - return Column( - children: [ - const TrackingText( - text: 'Enabled', - stateBuilder: WidgetStateModel.enabledOf, - ), - const TrackingText( - text: 'Hovered', - stateBuilder: WidgetStateModel.hoverOf, - ), - const TrackingText( - text: 'Pressed', - stateBuilder: WidgetStateModel.pressOf, - ), - const TrackingText( - text: 'LongPressed', - stateBuilder: WidgetStateModel.longPressOf, - ), - TrackingText( - text: 'Current State', - stateBuilder: (BuildContext context) { - return WidgetStateModel.stateOf(context).toString(); - }, - ), - ], - ); - }, + child: InteractiveState( + enabled: true, + hovered: hovered, + focused: focused, + pointerPosition: null, + child: Builder( + builder: (BuildContext context) { + return Column( + children: [ + const TrackingText( + text: 'Enabled', + stateBuilder: WidgetStateModel.enabledOf, + ), + const TrackingText( + text: 'Hovered', + stateBuilder: WidgetStateModel.hoverOf, + ), + const TrackingText( + text: 'Pressed', + stateBuilder: WidgetStateModel.pressOf, + ), + const TrackingText( + text: 'LongPressed', + stateBuilder: WidgetStateModel.longPressOf, + ), + TrackingText( + text: 'Current State', + stateBuilder: (BuildContext context) { + return WidgetStateModel.stateOf(context).toString(); + }, + ), + ], + ); + }, + ), ), ), ], From 1cdc19b7d4f47b9e0737ca271f0215fdb22d15fb Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Thu, 18 Jul 2024 14:09:36 -0400 Subject: [PATCH 23/24] Merged conflicts --- .../mix/lib/src/core/deprecation_notices.dart | 3 +- .../widget_state/gesturable_builder.dart | 327 ----------------- .../widget_state/interactive_widget.dart | 336 ------------------ .../internal/widget_state/widget_state.dart | 50 --- packages/mix/test/helpers/testing_utils.dart | 2 - 5 files changed, 1 insertion(+), 717 deletions(-) delete mode 100644 packages/mix/lib/src/internal/widget_state/gesturable_builder.dart delete mode 100644 packages/mix/lib/src/internal/widget_state/interactive_widget.dart delete mode 100644 packages/mix/lib/src/internal/widget_state/widget_state.dart diff --git a/packages/mix/lib/src/core/deprecation_notices.dart b/packages/mix/lib/src/core/deprecation_notices.dart index c05fcad0f..dbebb5c91 100644 --- a/packages/mix/lib/src/core/deprecation_notices.dart +++ b/packages/mix/lib/src/core/deprecation_notices.dart @@ -1,11 +1,10 @@ // ignore_for_file: camel_case_types import '../attributes/enum/enum_util.dart'; -import '../internal/widget_state/widget_state.dart'; +import '../core/internal/widget_state/widget_state.dart'; import '../specs/image/image_spec.dart'; import '../variants/widget_state_variant.dart'; import 'attribute.dart'; -import 'internal/widget_state/widget_state.dart'; class InternalMixDeprecatedAnnotation extends Deprecated { final String version; diff --git a/packages/mix/lib/src/internal/widget_state/gesturable_builder.dart b/packages/mix/lib/src/internal/widget_state/gesturable_builder.dart deleted file mode 100644 index a0824af90..000000000 --- a/packages/mix/lib/src/internal/widget_state/gesturable_builder.dart +++ /dev/null @@ -1,327 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -class GesturableWidget extends GesturableWidgetBuilder { - const GesturableWidget({ - super.key, - required super.child, - super.enableFeedback = false, - super.enabled = true, - super.onTap, - super.onLongPress, - super.onTapUp, - super.onTapCancel, - super.onLongPressStart, - super.onLongPressEnd, - super.onLongPressCancel, - super.onPanDown, - super.onPanUpdate, - super.onPanEnd, - super.excludeFromSemantics = false, - super.hitTestBehavior = HitTestBehavior.opaque, - required super.unpressDelay, - }); - - @override - State createState() => _GesturableState(); -} - -class _GesturableState extends GesturableWidgetStateBuilder {} - -abstract class GesturableWidgetBuilder extends StatefulWidget { - const GesturableWidgetBuilder({ - super.key, - required this.enabled, - required this.child, - this.enableFeedback = false, - this.onTap, - this.onLongPress, - this.onTapUp, - this.onTapCancel, - this.onLongPressStart, - this.onLongPressEnd, - this.onLongPressCancel, - this.onPanDown, - this.onPanUpdate, - this.onPanEnd, - this.excludeFromSemantics = false, - this.hitTestBehavior = HitTestBehavior.opaque, - required this.unpressDelay, - }); - - final bool enabled; - - /// The child widget. - - final Widget child; - - /// Whether to provide feedback for gestures. - final bool enableFeedback; - - /// The callback that is called when the user stops touching the screen after a tap gesture. - final GestureTapUpCallback? onTapUp; - - /// The callback that is called when the user cancels a tap gesture. - final GestureTapCancelCallback? onTapCancel; - - /// The callback that is called when the user starts a long press gesture. - final GestureLongPressStartCallback? onLongPressStart; - - /// The callback that is called when the user ends a long press gesture. - final GestureLongPressEndCallback? onLongPressEnd; - - /// The callback that is called when the user cancels a long press gesture. - final GestureLongPressCallback? onLongPressCancel; - - /// The callback that is called when the user starts a pan gesture. - final GestureDragDownCallback? onPanDown; - - /// The callback that is called when the user moves their finger during a pan gesture. - final GestureDragUpdateCallback? onPanUpdate; - - /// The callback that is called when the user ends a pan gesture. - final GestureDragEndCallback? onPanEnd; - - /// The callback that is called when the widget is pressed. - final VoidCallback? onTap; - - /// The callback that is called when the widget is long-pressed. - final VoidCallback? onLongPress; - - /// Whether to exclude the widget from semantics. - final bool excludeFromSemantics; - - /// How to behave during hit testing. - final HitTestBehavior hitTestBehavior; - - /// The duration to wait after the press is released before updating the press state. - final Duration unpressDelay; -} - -abstract class GesturableWidgetStateBuilder - extends State { - late final _GesturableDataController _controller; - int _pressCount = 0; - Timer? _timer; - - @override - void initState() { - super.initState(); - _controller = _GesturableDataController(); - _controller.enabled = widget.enabled; - } - - void _handlePanUpdate(DragUpdateDetails event) { - widget.onPanUpdate?.call(event); - } - - void _handlePanDown(DragDownDetails details) { - widget.onPanDown?.call(details); - } - - void _handlePanEnd(DragEndDetails details) { - _updatePress(true); - widget.onPanEnd?.call(details); - } - - void _updatePress(bool isPressed) { - if (isPressed == _controller.pressed) return; - - _controller.pressed = isPressed; - - if (isPressed) { - _pressCount++; - final initialPressCount = _pressCount; - _unpressAfterDelay(initialPressCount); - } - } - - void _onTapUp(TapUpDetails details) { - _controller.longPressed = false; - widget.onTapUp?.call(details); - } - - void _onTapCancel() { - _controller.longPressed = false; - widget.onTapCancel?.call(); - } - - void _onLongPressStart(LongPressStartDetails details) { - _controller.longPressed = true; - widget.onLongPressStart?.call(details); - } - - void _onLongPressEnd(LongPressEndDetails details) { - _controller.longPressed = false; - widget.onLongPressEnd?.call(details); - } - - void _onLongPressCancel() { - _controller.longPressed = false; - widget.onLongPressCancel?.call(); - } - - void _unpressAfterDelay(int initialPressCount) { - void unpressCallback() { - if (_controller.pressed && _pressCount == initialPressCount) { - _controller.pressed = false; - } - } - - _timer?.cancel(); - _timer = null; - - final delay = widget.unpressDelay; - - if (delay != Duration.zero) { - _timer = Timer(delay, unpressCallback); - } else { - unpressCallback(); - } - } - - void _onTap() { - _updatePress(true); - widget.onTap?.call(); - if (widget.enableFeedback) Feedback.forTap(context); - } - - void _onLongPress() { - widget.onLongPress?.call(); - if (widget.enableFeedback) Feedback.forLongPress(context); - } - - @override - void didUpdateWidget(T oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.enabled != oldWidget.enabled) { - _controller.enabled = widget.enabled; - } - } - - @override - void dispose() { - _timer?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTapUp: _onTapUp, - onTap: _onTap, - onTapCancel: _onTapCancel, - onLongPressCancel: _onLongPressCancel, - onLongPress: _onLongPress, - onLongPressStart: _onLongPressStart, - onLongPressEnd: _onLongPressEnd, - onPanDown: _handlePanDown, - onPanUpdate: _handlePanUpdate, - onPanEnd: _handlePanEnd, - behavior: widget.hitTestBehavior, - excludeFromSemantics: widget.excludeFromSemantics, - child: ListenableBuilder( - listenable: _controller, - builder: (context, _) { - return GesturableState( - longPressed: _controller.longPressed, - pressed: _controller.pressed, - child: widget.child, - ); - }, - ), - ); - } -} - -class _GesturableDataController extends ChangeNotifier { - bool _enabled = false; - bool _pressed = false; - bool _longPressed = false; - - bool get enabled => _enabled; - bool get disabled => !_enabled; - bool get pressed => enabled && _pressed; - bool get longPressed => enabled && _longPressed; - - set enabled(bool value) { - if (_enabled == value) return; - - _enabled = value; - notifyListeners(); - } - - set pressed(bool value) { - if (_pressed == value) return; - - _pressed = value; - notifyListeners(); - } - - set longPressed(bool value) { - if (_longPressed == value) return; - _longPressed = value; - notifyListeners(); - } -} - -enum GestureStateAspect { - pressed, - longPressed, -} - -class GesturableState extends InheritedModel { - const GesturableState({ - super.key, - required super.child, - required this.longPressed, - required this.pressed, - }); - - static GesturableState of( - BuildContext context, [ - GestureStateAspect? aspect, - ]) { - final GesturableState? result = maybeOf(context, aspect); - assert(result != null, 'Unable to find an instance of GesturableState...'); - - return result!; - } - - static GesturableState? maybeOf( - BuildContext context, [ - GestureStateAspect? aspect, - ]) { - return InheritedModel.inheritFrom( - context, - aspect: aspect, - ); - } - - static bool pressedOf(BuildContext context) { - return of(context, GestureStateAspect.pressed).pressed; - } - - static bool longPressedOf(BuildContext context) { - return of(context, GestureStateAspect.longPressed).longPressed; - } - - final bool pressed; - final bool longPressed; - @override - bool updateShouldNotify(GesturableState oldWidget) { - return oldWidget.pressed != pressed || oldWidget.longPressed != longPressed; - } - - @override - bool updateShouldNotifyDependent( - GesturableState oldWidget, - Set dependencies, - ) { - return dependencies.contains(GestureStateAspect.pressed) && - oldWidget.pressed != pressed || - dependencies.contains(GestureStateAspect.longPressed) && - oldWidget.longPressed != longPressed; - } -} diff --git a/packages/mix/lib/src/internal/widget_state/interactive_widget.dart b/packages/mix/lib/src/internal/widget_state/interactive_widget.dart deleted file mode 100644 index 411e72b31..000000000 --- a/packages/mix/lib/src/internal/widget_state/interactive_widget.dart +++ /dev/null @@ -1,336 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -class InteractiveBuilder extends StatelessWidget { - const InteractiveBuilder({super.key, required this.builder}); - - final Widget Function(BuildContext context) builder; - @override - Widget build(BuildContext context) { - return InteractiveState.maybeOf(context) == null - ? InteractiveWidget(child: Builder(builder: builder)) - : builder(context); - } -} - -class InteractiveWidget extends _InteractableWidgetBuilder { - const InteractiveWidget({ - super.key, - required super.child, - super.enabled, - Function(bool focus)? super.onFocusChange, - super.autofocus, - super.focusNode, - super.onKey, - super.onKeyEvent, - super.canRequestFocus, - super.mouseCursor, - super.shortcuts, - super.actions, - super.onEnter, - super.onExit, - super.onHover, - super.onShowFocusHighlight, - super.onShowHoverHighlight, - }); - - @override - State createState() => _InterctableState(); -} - -class _InterctableState - extends _InteractableWidgetBuilderState {} - -abstract class _InteractableWidgetBuilder extends StatefulWidget { - const _InteractableWidgetBuilder({ - super.key, - required this.child, - this.enabled = true, - this.onFocusChange, - this.autofocus = false, - this.focusNode, - this.onKey, - this.onShowFocusHighlight, - this.onShowHoverHighlight, - this.onKeyEvent, - this.canRequestFocus = true, - this.mouseCursor = MouseCursor.defer, - this.shortcuts, - this.actions, - this.onEnter, - this.onExit, - this.onHover, - }); - - final bool enabled; - final MouseCursor mouseCursor; - - final bool canRequestFocus; - - final Widget child; - final Function(bool focus)? onShowFocusHighlight; - final Function(bool hover)? onShowHoverHighlight; - - final ValueChanged? onFocusChange; - - final Map? shortcuts; - - final bool autofocus; - - final FocusNode? focusNode; - - final FocusOnKeyEventCallback? onKey; - - final FocusOnKeyEventCallback? onKeyEvent; - - final Map>? actions; - - final void Function(PointerEnterEvent event)? onEnter; - final void Function(PointerExitEvent event)? onExit; - final void Function(PointerHoverEvent event)? onHover; -} - -abstract class _InteractableWidgetBuilderState< - T extends _InteractableWidgetBuilder> extends State { - late final _InteractableDataController _controller; - - @override - void initState() { - super.initState(); - _controller = _InteractableDataController(); - _controller.enabled = widget.enabled; - } - - void _onShowFocusHighlight(bool hasFocus) { - _controller.focused = hasFocus; - widget.onShowFocusHighlight?.call(hasFocus); - } - - void _onShowHoverHighlight(bool isHovered) { - _controller.hovered = isHovered; - widget.onShowHoverHighlight?.call(isHovered); - } - - void _updateCursorPosition(Offset cursorOffset) { - final size = context.size; - if (size != null) { - _controller.updateCursorPosition(cursorOffset, size); - } - } - - void _onHover(PointerHoverEvent event) { - _updateCursorPosition(event.localPosition); - widget.onHover?.call(event); - } - - void _onEnter(PointerEnterEvent event) { - _updateCursorPosition(event.localPosition); - widget.onEnter?.call(event); - } - - void _onExit(PointerExitEvent event) { - _updateCursorPosition(event.localPosition); - widget.onExit?.call(event); - } - - @override - void didUpdateWidget(T oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.enabled != oldWidget.enabled) { - _controller.enabled = widget.enabled; - } - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return MouseRegion( - onEnter: _onEnter, - onExit: _onExit, - onHover: _onHover, - cursor: widget.mouseCursor, - child: FocusableActionDetector( - enabled: widget.enabled, - focusNode: widget.focusNode, - autofocus: widget.autofocus, - shortcuts: widget.shortcuts, - actions: widget.actions, - onShowFocusHighlight: _onShowFocusHighlight, - onShowHoverHighlight: _onShowHoverHighlight, - onFocusChange: widget.onFocusChange, - child: ListenableBuilder( - listenable: _controller, - builder: (context, _) { - return InteractiveState( - enabled: _controller.enabled, - focused: _controller.focused, - hovered: _controller.hovered, - pointerPosition: _controller.pointerPosition, - child: widget.child, - ); - }, - ), - ), - ); - } -} - -class _InteractableDataController extends ChangeNotifier { - bool _enabled = false; - bool _focused = false; - bool _hovered = false; - PointerPosition? _pointerPosition; - - bool get focused => _enabled && _focused; - bool get hovered => _enabled && _hovered; - bool get enabled => _enabled; - bool get disabled => !_enabled; - PointerPosition? get pointerPosition => _enabled ? _pointerPosition : null; - - set enabled(bool value) { - if (_enabled == value) return; - - _enabled = value; - notifyListeners(); - } - - set focused(bool value) { - if (_focused == value) return; - - _focused = value; - notifyListeners(); - } - - set hovered(bool value) { - if (_hovered == value) return; - _hovered = value; - notifyListeners(); - } - - void updateCursorPosition(Offset cursorOffset, Size size) { - final ax = cursorOffset.dx / size.width; - final ay = cursorOffset.dy / size.height; - final cursorAlignment = Alignment( - ((ax - 0.5) * 2).clamp(-1.0, 1.0), - ((ay - 0.5) * 2).clamp(-1.0, 1.0), - ); - - _pointerPosition = PointerPosition( - position: cursorAlignment, - offset: cursorOffset, - ); - - notifyListeners(); - } -} - -class PointerPosition { - final Alignment position; - final Offset offset; - const PointerPosition({required this.position, required this.offset}); - - @override - bool operator ==(Object other) { - if (identical(this, other)) return true; - - return other is PointerPosition && - other.position == position && - other.offset == offset; - } - - @override - int get hashCode => position.hashCode ^ offset.hashCode; -} - -enum InteractiveAspect { - enabled, - focused, - hovered, - pointerPosition, -} - -class InteractiveState extends InheritedModel { - const InteractiveState({ - super.key, - required super.child, - required this.enabled, - required this.focused, - required this.hovered, - required this.pointerPosition, - }); - - static InteractiveState of( - BuildContext context, [ - InteractiveAspect? aspect, - ]) { - final InteractiveState? result = maybeOf(context, aspect); - assert(result != null, 'Unable to find an instance of PressableState...'); - - return result!; - } - - static InteractiveState? maybeOf( - BuildContext context, [ - InteractiveAspect? aspect, - ]) { - return InheritedModel.inheritFrom( - context, - aspect: aspect, - ); - } - - static bool enabledOf(BuildContext context) { - return of(context, InteractiveAspect.enabled).enabled; - } - - static bool disabledOf(BuildContext context) { - return !enabledOf(context); - } - - static bool focusedOf(BuildContext context) { - return of(context, InteractiveAspect.focused).focused; - } - - static bool hoveredOf(BuildContext context) { - return of(context, InteractiveAspect.hovered).hovered; - } - - static PointerPosition? pointerPositionOf(BuildContext context) { - return of(context, InteractiveAspect.pointerPosition).pointerPosition; - } - - final bool enabled; - final bool focused; - final bool hovered; - final PointerPosition? pointerPosition; - - bool get disabled => !enabled; - - @override - bool updateShouldNotify(InteractiveState oldWidget) { - return enabled != oldWidget.enabled || - focused != oldWidget.focused || - hovered != oldWidget.hovered || - pointerPosition != oldWidget.pointerPosition; - } - - @override - bool updateShouldNotifyDependent( - InteractiveState oldWidget, - Set dependencies, - ) { - return dependencies.contains(InteractiveAspect.enabled) && - enabled != oldWidget.enabled || - dependencies.contains(InteractiveAspect.focused) && - focused != oldWidget.focused || - dependencies.contains(InteractiveAspect.hovered) && - hovered != oldWidget.hovered || - dependencies.contains(InteractiveAspect.pointerPosition) && - pointerPosition != oldWidget.pointerPosition; - } -} diff --git a/packages/mix/lib/src/internal/widget_state/widget_state.dart b/packages/mix/lib/src/internal/widget_state/widget_state.dart deleted file mode 100644 index 4a36bfe53..000000000 --- a/packages/mix/lib/src/internal/widget_state/widget_state.dart +++ /dev/null @@ -1,50 +0,0 @@ -// ignore_for_file: avoid-inferrable-type-arguments - -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; - -import 'gesturable_builder.dart'; -import 'interactive_widget.dart'; - -enum WidgetMixState { - idle, - disabled, - hovered, - pressed, - longPressed, -} - -final class WidgetStateModel { - static const enabledOf = InteractiveState.enabledOf; - - static const disabledOf = InteractiveState.disabledOf; - - static const hoverOf = InteractiveState.hoveredOf; - - static const focusOf = InteractiveState.focusedOf; - - static const pressOf = GesturableState.pressedOf; - - static const longPressOf = GesturableState.longPressedOf; - - static const pointerPositionOf = InteractiveState.pointerPositionOf; - - const WidgetStateModel._(); - - static WidgetMixState stateOf(BuildContext context) { - final enabled = enabledOf(context); - final longPressed = longPressOf(context); - final hovered = hoverOf(context); - - final pressed = pressOf(context); - - if (!enabled) { - return WidgetMixState.disabled; - } - if (longPressed) return WidgetMixState.longPressed; - if (pressed) return WidgetMixState.pressed; - if (hovered) return WidgetMixState.hovered; - - return WidgetMixState.idle; - } -} diff --git a/packages/mix/test/helpers/testing_utils.dart b/packages/mix/test/helpers/testing_utils.dart index 6f652855a..bc7c392b3 100644 --- a/packages/mix/test/helpers/testing_utils.dart +++ b/packages/mix/test/helpers/testing_utils.dart @@ -6,8 +6,6 @@ import 'package:mix/mix.dart'; import 'package:mix/src/core/internal/widget_state/gesturable_builder.dart'; import 'package:mix/src/core/internal/widget_state/interactive_widget.dart'; import 'package:mix/src/internal/lerp_helpers.dart'; -import 'package:mix/src/internal/widget_state/gesturable_builder.dart'; -import 'package:mix/src/internal/widget_state/interactive_widget.dart'; export 'package:mix/src/internal/values_ext.dart'; From 6884bbcb23d26001b8587b45a817821053968df4 Mon Sep 17 00:00:00 2001 From: Leo Farias Date: Thu, 18 Jul 2024 14:12:57 -0400 Subject: [PATCH 24/24] macos change --- .../macos/Flutter/ephemeral/FlutterInputs.xcfilelist | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist index ae1b8aac3..390c10104 100644 --- a/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist +++ b/packages/remix/demo/macos/Flutter/ephemeral/FlutterInputs.xcfilelist @@ -768,6 +768,9 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/core/factory/style_mix.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/factory/style_widgets_ext.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/helpers.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/core/internal/widget_state/gesturable_builder.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/core/internal/widget_state/interactive_widget.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/core/internal/widget_state/widget_state.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/spec.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/core/styled_widget.dart @@ -776,7 +779,6 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/build_context_ext.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/compare_mixin.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/constants.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/internal/custom_focusable_action_detector.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/deep_collection_equality.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/diagnostic_properties_builder_ext.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/internal/helper_util.dart @@ -788,11 +790,11 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/clip_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/flexible_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/fractionally_sized_box_widget_modifier.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/internal/render_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/intrinsic_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/modifiers.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/opacity_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/padding_widget_modifier.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/render_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/rotated_box_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/sized_box_widget_modifier.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/modifiers/transform_widget_modifier.dart @@ -840,9 +842,8 @@ /Users/leofarias/Projects/mix/packages/mix/lib/src/variants/context_variant_util/on_util.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/variants/variant_attribute.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/variants/variants.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widget_state/pressable_widget.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widget_state/widget_state.dart -/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widget_state/widget_state_variant.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/variants/widget_state_variant.dart +/Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/pressable_widget.dart /Users/leofarias/Projects/mix/packages/mix/lib/src/widgets/widgets.dart /Users/leofarias/Projects/mix/packages/mix_annotations/LICENSE /Users/leofarias/Projects/mix/packages/mix_annotations/lib/mix_annotations.dart