[
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish\n\non:\n  push:\n    tags:\n    - 'v[0-9]+.[0-9]+.[0-9]+*'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Install Flutter\n        uses: subosito/flutter-action@v2.10.0\n\n      - name: Install dependencies\n        run: flutter pub get\n\n      - name: Analyze\n        run: flutter analyze\n\n      - name: Run tests\n        run: flutter test\n\n      - name: Format code\n        run: dart format --fix .\n\n      - name: Check Publish Warnings\n        run: dart pub publish --dry-run\n\n      - name: Publish\n        uses: k-paxian/dart-package-publisher@v1.5.1\n        with:\n          credentialJson: ${{ secrets.CREDENTIAL_JSON }}\n          flutter: true\n          skipTests: true"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\n\non: [push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v3\n      - uses: subosito/flutter-action@v2\n      \n      - run: flutter pub get\n\n      - name: Analyze project source\n        run: dart analyze\n\n      - name: Format code\n        run: dart format --fix .\n\n      - name: Run tests\n        run: flutter test\n"
  },
  {
    "path": ".gitignore",
    "content": "#Flutter versions manager\n.fvm/\n\n.idea/\n.vscode/\n\n# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n!flutter_reaction_button.iml"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: b712a172f9694745f50505c93340883493b505e5\n  channel: stable\n\nproject_type: package\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## 3.0.0+3\n* Fix reactions box overflow\n\n## 3.0.0+2\n* Minor updates\n\n## 3.0.0+1\n* Update README\n\n## 3.0.0\n\n- **BREAKING CHANGE**:\n    - `FlutterReactionButton` and `FlutterReactionButtonToggle` removed\n    - `itemSize` is required in `ReactionButton`\n    - `onReactionChanged` callback updated\n    - `VerticalPosition` and `HorizontalPosition` removed\n- Adds `child` to `ReactionButton`\n- Animated `ReactionsBox`\n\n## 2.0.2\n\n* Pipeline setup\n\n## 2.0.1+1\n\n* Minor bugs fixed. Thanks to [Kyle Venn](https://github.com/kvenn)\n\n## 2.0.1\n\n* Adds ReactionContainer\n* Bugs fix and code improvements, Thanks to [Felix Gabler](https://github.com/felixgabler)\n\n## 2.0.0+3\n\n* Upgrade flutter version\n\n## 2.0.0+2\n\n* Fix Offscreen Issue. Thanks to [rlee1990](https://github.com/rlee1990)\n\n## 2.0.0+1\n\n* Dragging improvement\n\n## 2.0.0\n\n* Change `FlutterReactionButton` to `ReactionButton`\n* Change `FlutterReactionButtonCheck` to `ReactionButtonToggle`\n* Change `Function(Reaction, int, bool) onReactionChanged` to `Function(T?, bool) onReactionChanged`\n* Change `Function(Reaction, int) onReactionChanged` to `Function(T?) onReactionChanged`\n* Dynamic scale depending on the hover position\n* Dynamic horizontal alignment\n* Scrollable position\n* Minor bugs fixed\n\n## 1.0.8\n\n* Added support null safety\n\n## 1.0.7+3\n\n* Deprecated Reaction id\n\n## 1.0.7+2\n\n* Improvement box flow\n\n## 1.0.7\n\n* Remove reaction id\n* Clean code\n\n## 1.0.6+2\n\n* Minor bugs fixed\n\n## 1.0.6+1\n\n* Minor bugs fixed\n\n## 1.0.6\n\n* Reaction title\n\n## 1.0.5\n\n* Items spacing\n* Box padding\n\n## 1.0.4\n\n* Reactions box alignment\n\n## 1.0.3\n\n* Change state externally\n\n## 1.0.2\n\n* Code improvements\n\n## 1.0.1\n\n* Define reaction by id.\n* Alternative to popup menu.\n* Enable/disable reaction click.\n\n## 1.0.0\n\n* Adds ripple effect.\n\n## 0.1.3\n\n* Selected rection index.\n\n## 0.1.2+1\n\n* Adds Example.\n\n## 0.1.2\n\n* From plugin to packages.\n\n## 0.1.1\n\n* Reactions List @required.\n\n## 0.1.0\n\n* Update Description pubspec.yaml.\n\n## 0.0.1\n\n* Describe initial release.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Abdelouahed Medjoudja\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[![pub package](https://img.shields.io/pub/v/flutter_reaction_button.svg)](https://pub.dartlang.org/packages/flutter_reaction_button)\n\n# Flutter reaction button\n\nFlutter Reaction Button is a customizable Flutter package that allows you to easily create interactive buttons with reaction emojis, similar to Facebook's iconic reaction buttons.\n\n\n## Screenshot\n\n![App Screenshot](https://raw.githubusercontent.com/GeekAbdelouahed/flutter-reaction-button/master/images/flutter_reaction_button_preview.png)\n\n\n## Installation\n\n```yaml\n# pubspec.yaml\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_reaction_button: <last-version>\n```\n## Usage\n\n```dart\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\n\nReactionButton<String>(\n    onReactionChanged: (Reaction<String>? reaction) {\n        debugPrint('Selected value: ${reaction?.value}');\n    },\n    reactions: <Reaction<String>>[\n        Reaction<String>(\n            value: 'like',\n            icon: widget,\n        ),\n        Reaction<String>(\n            value: 'love',\n            icon: widget,\n        ),\n        ...\n    ],\n    initialReaction: Reaction<String>(\n        value: 'like',\n        icon: widget,\n    ),\n    selectedReaction: Reaction<String>(\n        value: 'like_fill',\n        icon: widget,\n    ),\n)\n```\n\n\n## License\n\n```legal\nMIT License\n\nCopyright (c) 2023 Abdelouahed Medjoudja\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n"
  },
  {
    "path": "analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at\n  # https://dart-lang.github.io/linter/lints/index.html.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options"
  },
  {
    "path": "example/.gitignore",
    "content": "#Flutter versions manager\n.fvm/\n\n# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages"
  },
  {
    "path": "example/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: b712a172f9694745f50505c93340883493b505e5\n  channel: stable\n\nproject_type: app\n"
  },
  {
    "path": "example/README.md",
    "content": "# flutter_reaction_button_example\n\nReactionButton:\n\n```dart\nReactionButton<String>(\n    onReactionChanged: (Reaction<String>? reaction) {\n        debugPrint('Selected value: ${reaction?.value}');\n    },\n    reactions: <Reaction<String>>[\n        Reaction<String>(\n            value: 'like',\n            icon: widget,\n        ),\n        Reaction<String>(\n            value: 'love',\n            icon: widget,\n        ),\n        ...\n    ],\n    initialReaction: Reaction<String>(\n        value: 'like',\n        icon: widget,\n    ),\n    selectedReaction: Reaction<String>(\n        value: 'like_fill',\n        icon: widget,\n    ),\n)\n```\n\n\nReactionButton:\n\n```dart\nReactionButton<String>(\n    toggle: false,\n    onReactionChanged: (Reaction<String>? reaction) {\n        debugPrint('Selected language: ${reaction?.value}');\n    },\n    reactions: <Reaction<String>>[\n        Reaction<String>(\n            value: 'en',\n            icon: widget,\n        ),\n        Reaction<String>(\n            value: 'ar',\n            icon: widget,\n        ),\n        ...\n    ],\n    initialReaction: Reaction<String>(\n        value: null,\n        icon: Icon(Icons.language),\n    ),\n)\n```"
  },
  {
    "path": "example/analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at\n  # https://dart-lang.github.io/linter/lints/index.html.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options"
  },
  {
    "path": "example/android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\n"
  },
  {
    "path": "example/android/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>android</name>\n\t<comment>Project android created by Buildship.</comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.buildship.core.gradleprojectbuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.buildship.core.gradleprojectnature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "example/android/.settings/org.eclipse.buildship.core.prefs",
    "content": "connection.project.dir=\neclipse.preferences.version=1\n"
  },
  {
    "path": "example/android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\nandroid {\n    compileSdkVersion 31\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"abdelouahedmedjoudja.flutter_reaction_button_test\"\n        minSdkVersion 21\n        targetSdkVersion 31\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            // TODO: Add your own signing config for the release build.\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig signingConfigs.debug\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n}\n"
  },
  {
    "path": "example/android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"abdelouahedmedjoudja.flutter_reaction_button_test\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>\n"
  },
  {
    "path": "example/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"abdelouahedmedjoudja.flutter_reaction_button_test\">\n\n    <!-- io.flutter.app.FlutterApplication is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    <application\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"flutter_reaction_button_test\">\n        <activity\n            android:name=\".MainActivity\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:windowSoftInputMode=\"adjustResize\"\n            android:exported=\"true\">\n            <!-- This keeps the window background of the activity showing\n                 until Flutter renders its first frame. It can be removed if\n                 there is no splash screen (such as the default splash screen\n                 defined in @style/LaunchTheme). -->\n            <meta-data\n                android:name=\"io.flutter.app.android.SplashScreenUntilFirstFrame\"\n                android:value=\"true\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n\n    </application>\n</manifest>\n"
  },
  {
    "path": "example/android/app/src/main/kotlin/abdelouahedmedjoudja/example/MainActivity.kt",
    "content": "package abdelouahedmedjoudja.example\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity : FlutterActivity() {\n}\n"
  },
  {
    "path": "example/android/app/src/main/kotlin/abdelouahedmedjoudja/flutter_reaction_button_test/MainActivity.kt",
    "content": "package abdelouahedmedjoudja.flutter_reaction_button_test\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity : FlutterActivity() {\n}\n"
  },
  {
    "path": "example/android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "example/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "example/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"abdelouahedmedjoudja.flutter_reaction_button_test\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>\n"
  },
  {
    "path": "example/android/build.gradle",
    "content": "buildscript {\n    ext.kotlin_version = '1.6.21'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.2.2'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "example/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.4.2-bin.zip\n"
  },
  {
    "path": "example/android/gradle.properties",
    "content": "android.enableJetifier=true\nandroid.useAndroidX=true\norg.gradle.jvmargs=-Xmx1536M\nandroid.enableR8=true\n"
  },
  {
    "path": "example/android/settings.gradle",
    "content": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')\nif (pluginsFile.exists()) {\n    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }\n}\n\nplugins.each { name, path ->\n    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()\n    include \":$name\"\n    project(\":$name\").projectDir = pluginDirectory\n}\n"
  },
  {
    "path": "example/ios/.gitignore",
    "content": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "example/ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>$(DEVELOPMENT_LANGUAGE)</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>11.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/Release.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\": [\n    {\n      \"size\": \"20x20\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-20x20@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"20x20\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-20x20@3x.png\",\n      \"scale\": \"3x\"\n    },\n    {\n      \"size\": \"29x29\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-29x29@1x.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"size\": \"29x29\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-29x29@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"29x29\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-29x29@3x.png\",\n      \"scale\": \"3x\"\n    },\n    {\n      \"size\": \"40x40\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-40x40@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"40x40\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-40x40@3x.png\",\n      \"scale\": \"3x\"\n    },\n    {\n      \"size\": \"60x60\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-60x60@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"60x60\",\n      \"idiom\": \"iphone\",\n      \"filename\": \"Icon-App-60x60@3x.png\",\n      \"scale\": \"3x\"\n    },\n    {\n      \"size\": \"20x20\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-20x20@1x.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"size\": \"20x20\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-20x20@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"29x29\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-29x29@1x.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"size\": \"29x29\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-29x29@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"40x40\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-40x40@1x.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"size\": \"40x40\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-40x40@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"76x76\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-76x76@1x.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"size\": \"76x76\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-76x76@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"83.5x83.5\",\n      \"idiom\": \"ipad\",\n      \"filename\": \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"size\": \"1024x1024\",\n      \"idiom\": \"ios-marketing\",\n      \"filename\": \"Icon-App-1024x1024@1x.png\",\n      \"scale\": \"1x\"\n    }\n  ],\n  \"info\": {\n    \"version\": 1,\n    \"author\": \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\": [\n    {\n      \"idiom\": \"universal\",\n      \"filename\": \"LaunchImage.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"idiom\": \"universal\",\n      \"filename\": \"LaunchImage@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"idiom\": \"universal\",\n      \"filename\": \"LaunchImage@3x.png\",\n      \"scale\": \"3x\"\n    }\n  ],\n  \"info\": {\n    \"version\": 1,\n    \"author\": \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou 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."
  },
  {
    "path": "example/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>flutter_reaction_button_test</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\""
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1430;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 0910;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\",\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 6YQ9LWSA59;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = abdelouahedmedjoudja.flutterReactionButtonTest;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 6YQ9LWSA59;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = abdelouahedmedjoudja.flutterReactionButtonTest;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 6YQ9LWSA59;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = abdelouahedmedjoudja.flutterReactionButtonTest;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1430\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/lib/data.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\n\nfinal List<Reaction<String>> flagsReactions = [\n  Reaction<String>(\n    value: 'en',\n    previewIcon: _buildFlagPreviewIcon(\n      'assets/images/united-kingdom-round.png',\n      'English',\n    ),\n    icon: _buildFlagIcon(\n      'assets/images/united-kingdom.png',\n    ),\n  ),\n  Reaction<String>(\n    value: 'ar',\n    previewIcon: _buildFlagPreviewIcon(\n      'assets/images/algeria-round.png',\n      'Arabic',\n    ),\n    icon: _buildFlagIcon(\n      'assets/images/algeria.png',\n    ),\n  ),\n  Reaction<String>(\n    value: 'gr',\n    previewIcon: _buildFlagPreviewIcon(\n      'assets/images/germany-round.png',\n      'German',\n    ),\n    icon: _buildFlagIcon(\n      'assets/images/germany.png',\n    ),\n  ),\n  Reaction<String>(\n    value: 'sp',\n    previewIcon: _buildFlagPreviewIcon(\n      'assets/images/spain-round.png',\n      'Spanish',\n    ),\n    icon: _buildFlagIcon(\n      'assets/images/spain.png',\n    ),\n  ),\n  Reaction<String>(\n    value: 'ch',\n    previewIcon: _buildFlagPreviewIcon(\n      'assets/images/china-round.png',\n      'Chinese',\n    ),\n    icon: _buildFlagIcon(\n      'assets/images/china.png',\n    ),\n  ),\n];\n\nconst defaultInitialReaction = Reaction<String>(\n  value: null,\n  icon: Text(\n    'No reaction',\n  ),\n);\n\nfinal List<Reaction<String>> reactions = [\n  Reaction<String>(\n    value: 'Happy',\n    title: _buildEmojiTitle(\n      'Happy',\n    ),\n    previewIcon: _buildEmojiPreviewIcon(\n      'assets/images/happy.png',\n    ),\n    icon: _buildReactionsIcon(\n      'assets/images/happy.png',\n      const Text(\n        'Happy',\n        style: TextStyle(\n          color: Color(0XFF3b5998),\n        ),\n      ),\n    ),\n  ),\n  Reaction<String>(\n    value: 'Angry',\n    title: _buildEmojiTitle(\n      'Angry',\n    ),\n    previewIcon: _buildEmojiPreviewIcon(\n      'assets/images/angry.png',\n    ),\n    icon: _buildReactionsIcon(\n      'assets/images/angry.png',\n      const Text(\n        'Angry',\n        style: TextStyle(\n          color: Color(0XFFed5168),\n        ),\n      ),\n    ),\n  ),\n  Reaction<String>(\n    value: 'In love',\n    title: _buildEmojiTitle(\n      'In love',\n    ),\n    previewIcon: _buildEmojiPreviewIcon(\n      'assets/images/in-love.png',\n    ),\n    icon: _buildReactionsIcon(\n      'assets/images/in-love.png',\n      const Text(\n        'In love',\n        style: TextStyle(\n          color: Color(0XFFffda6b),\n        ),\n      ),\n    ),\n  ),\n  Reaction<String>(\n    value: 'Sad',\n    title: _buildEmojiTitle(\n      'Sad',\n    ),\n    previewIcon: _buildEmojiPreviewIcon(\n      'assets/images/sad.png',\n    ),\n    icon: _buildReactionsIcon(\n      'assets/images/sad.png',\n      const Text(\n        'Sad',\n        style: TextStyle(\n          color: Color(0XFFffda6b),\n        ),\n      ),\n    ),\n  ),\n  Reaction<String>(\n    value: 'Surprised',\n    title: _buildEmojiTitle(\n      'Surprised',\n    ),\n    previewIcon: _buildEmojiPreviewIcon(\n      'assets/images/surprised.png',\n    ),\n    icon: _buildReactionsIcon(\n      'assets/images/surprised.png',\n      const Text(\n        'Surprised',\n        style: TextStyle(\n          color: Color(0XFFffda6b),\n        ),\n      ),\n    ),\n  ),\n  Reaction<String>(\n    value: 'Mad',\n    title: _buildEmojiTitle(\n      'Mad',\n    ),\n    previewIcon: _buildEmojiPreviewIcon(\n      'assets/images/mad.png',\n    ),\n    icon: _buildReactionsIcon(\n      'assets/images/mad.png',\n      const Text(\n        'Mad',\n        style: TextStyle(\n          color: Color(0XFFf05766),\n        ),\n      ),\n    ),\n  ),\n];\n\nWidget _buildFlagPreviewIcon(String path, String text) {\n  return Column(\n    mainAxisSize: MainAxisSize.min,\n    children: [\n      Text(\n        text,\n        style: const TextStyle(\n          fontSize: 10,\n          fontWeight: FontWeight.w300,\n          color: Colors.white,\n        ),\n      ),\n      const SizedBox(height: 7.5),\n      Image.asset(path, height: 30),\n    ],\n  );\n}\n\nWidget _buildEmojiTitle(String title) {\n  return Container(\n    margin: const EdgeInsets.only(bottom: 8),\n    padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n    decoration: BoxDecoration(\n      color: Colors.black.withOpacity(.75),\n      borderRadius: BorderRadius.circular(15),\n    ),\n    child: Text(\n      title,\n      style: const TextStyle(\n        color: Colors.white,\n        fontSize: 8,\n        fontWeight: FontWeight.bold,\n      ),\n    ),\n  );\n}\n\nWidget _buildEmojiPreviewIcon(String path) {\n  return Image.asset(path);\n}\n\nWidget _buildFlagIcon(String path) {\n  return Image.asset(path);\n}\n\nWidget _buildReactionsIcon(String path, Text text) {\n  return Container(\n    color: Colors.transparent,\n    child: Row(\n      children: <Widget>[\n        Image.asset(path, height: 20),\n        const SizedBox(width: 5),\n        text,\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "example/lib/image.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\n\nclass ImageWidget extends StatefulWidget {\n  const ImageWidget({\n    Key? key,\n    required this.imgPath,\n    required this.reactions,\n  }) : super(key: key);\n\n  final String imgPath;\n  final List<Reaction<String>> reactions;\n\n  @override\n  State<ImageWidget> createState() => _ImageWidgetState();\n}\n\nclass _ImageWidgetState extends State<ImageWidget> {\n  Reaction<String>? _selectedReaction;\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(\n        horizontal: 10,\n        vertical: 5,\n      ),\n      child: AspectRatio(\n        aspectRatio: 2,\n        child: Stack(\n          children: [\n            Card(\n              margin: EdgeInsets.zero,\n              elevation: 2,\n              clipBehavior: Clip.antiAlias,\n              shape: const RoundedRectangleBorder(\n                borderRadius: BorderRadius.all(\n                  Radius.circular(5),\n                ),\n              ),\n              child: ReactionButton<String>(\n                onReactionChanged: (Reaction<String>? reaction) {\n                  setState(() {\n                    _selectedReaction = reaction;\n                  });\n                  debugPrint('Selected value: ${reaction?.value}');\n                },\n                itemSize: const Size.square(40),\n                reactions: widget.reactions,\n                child: Image.asset(\n                  widget.imgPath,\n                  width: double.infinity,\n                  fit: BoxFit.cover,\n                ),\n              ),\n            ),\n            PositionedDirectional(\n              end: 5,\n              bottom: 5,\n              child: Container(\n                height: 30,\n                width: 30,\n                decoration: BoxDecoration(\n                  color: Colors.black.withOpacity(.35),\n                  shape: BoxShape.circle,\n                  boxShadow: [\n                    BoxShadow(\n                      color: Colors.black.withOpacity(.3),\n                      offset: const Offset(0, 3),\n                      blurRadius: 3,\n                    )\n                  ],\n                ),\n                child: _selectedReaction?.previewIcon,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/main.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\nimport 'package:flutter_reaction_button_test/data.dart' as data;\nimport 'package:flutter_reaction_button_test/image.dart';\nimport 'package:flutter_reaction_button_test/post.dart';\n\nvoid main() {\n  runApp(\n    const MyApp(),\n  );\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      debugShowCheckedModeBanner: false,\n      title: 'Flutter Reaction Button',\n      home: Scaffold(\n        backgroundColor: Colors.grey[200],\n        appBar: AppBar(\n          title: const Text('Flutter Reaction Button'),\n          actions: [\n            Builder(\n              builder: (context) {\n                return SizedBox.square(\n                  dimension: 30,\n                  child: ReactionButton<String>(\n                    toggle: false,\n                    direction: ReactionsBoxAlignment.rtl,\n                    onReactionChanged: (Reaction<String>? reaction) {\n                      ScaffoldMessenger.of(context).showSnackBar(\n                        SnackBar(\n                          content:\n                              Text('Selected language: ${reaction?.value}'),\n                        ),\n                      );\n                    },\n                    reactions: data.flagsReactions,\n                    placeholder: const Reaction<String>(\n                      value: null,\n                      icon: Icon(\n                        Icons.language,\n                      ),\n                    ),\n                    boxColor: Colors.black.withOpacity(0.5),\n                    boxRadius: 10,\n                    itemsSpacing: 20,\n                    itemSize: const Size(40, 60),\n                  ),\n                );\n              },\n            ),\n            const SizedBox(width: 10),\n          ],\n        ),\n        body: SingleChildScrollView(\n          padding: const EdgeInsets.symmetric(vertical: 5),\n          child: Column(\n            children: [\n              PostWidget(\n                title: 'image 1',\n                imgPath: 'assets/images/img1.jpg',\n                reactions: data.reactions,\n              ),\n              ImageWidget(\n                imgPath: 'assets/images/img1.jpg',\n                reactions: data.reactions,\n              ),\n              PostWidget(\n                title: 'image 2',\n                imgPath: 'assets/images/img2.jpg',\n                reactions: data.reactions,\n              ),\n              ImageWidget(\n                imgPath: 'assets/images/img2.jpg',\n                reactions: data.reactions,\n              ),\n              PostWidget(\n                title: 'image 3',\n                imgPath: 'assets/images/img3.jpg',\n                reactions: data.reactions,\n              ),\n              ImageWidget(\n                imgPath: 'assets/images/img3.jpg',\n                reactions: data.reactions,\n              ),\n              PostWidget(\n                title: 'image 4',\n                imgPath: 'assets/images/img4.jpg',\n                reactions: data.reactions,\n              ),\n              ImageWidget(\n                imgPath: 'assets/images/img4.jpg',\n                reactions: data.reactions,\n              ),\n              PostWidget(\n                title: 'image 5',\n                imgPath: 'assets/images/img5.jpg',\n                reactions: data.reactions,\n              ),\n              ImageWidget(\n                imgPath: 'assets/images/img5.jpg',\n                reactions: data.reactions,\n              ),\n              const SafeArea(\n                child: SizedBox(),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/post.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\nimport 'package:flutter_reaction_button_test/data.dart' as data;\n\nclass PostWidget extends StatelessWidget {\n  const PostWidget({\n    Key? key,\n    required this.title,\n    required this.imgPath,\n    required this.reactions,\n  }) : super(key: key);\n\n  final String title;\n  final String imgPath;\n  final List<Reaction<String>> reactions;\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),\n      elevation: 2,\n      child: ClipRRect(\n        borderRadius: const BorderRadius.all(\n          Radius.circular(5),\n        ),\n        child: Column(\n          children: [\n            AspectRatio(\n              aspectRatio: 2,\n              child: Image.asset(\n                imgPath,\n                width: double.infinity,\n                fit: BoxFit.cover,\n              ),\n            ),\n            Container(\n              height: 55,\n              padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  ReactionButton<String>(\n                    itemSize: const Size.square(40),\n                    onReactionChanged: (Reaction<String>? reaction) {\n                      debugPrint('Selected value: ${reaction?.value}');\n                    },\n                    reactions: reactions,\n                    placeholder: data.defaultInitialReaction,\n                    selectedReaction: reactions.first,\n                  ),\n                  Row(\n                    children: [\n                      Icon(\n                        Icons.message,\n                        size: 16,\n                        color: Colors.grey[400],\n                      ),\n                      const SizedBox(width: 5),\n                      Text(\n                        'Comment',\n                        style: TextStyle(\n                          fontSize: 12,\n                          color: Colors.grey[600],\n                          fontWeight: FontWeight.w600,\n                        ),\n                      ),\n                    ],\n                  ),\n                  Row(\n                    children: <Widget>[\n                      Icon(\n                        Icons.share,\n                        size: 16,\n                        color: Colors.grey[400],\n                      ),\n                      const SizedBox(width: 5),\n                      Text(\n                        'Share',\n                        style: TextStyle(\n                          fontSize: 14,\n                          color: Colors.grey[600],\n                          fontWeight: FontWeight.w600,\n                        ),\n                      ),\n                    ],\n                  )\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/pubspec.yaml",
    "content": "name: flutter_reaction_button_test\ndescription: A new Flutter application.\npublish_to: none\nversion: 1.0.0+1\n\nenvironment:\n  sdk: '>=3.0.0 <4.0.0'\n\ndependencies:\n  flutter:\n    sdk: flutter\n  cupertino_icons: ^1.0.5\n  flutter_reaction_button:\n    path: ../\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^2.0.1\n\nflutter:\n\n  uses-material-design: true\n\n  assets:\n    - assets/images/"
  },
  {
    "path": "example/web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta content=\"IE=Edge\" http-equiv=\"X-UA-Compatible\">\n    <meta content=\"A new Flutter project.\" name=\"description\">\n\n    <!-- iOS meta tags & icons -->\n    <meta content=\"yes\" name=\"apple-mobile-web-app-capable\">\n    <meta content=\"black\" name=\"apple-mobile-web-app-status-bar-style\">\n    <meta content=\"example\" name=\"apple-mobile-web-app-title\">\n    <link href=\"icons/Icon-192.png\" rel=\"apple-touch-icon\">\n\n    <!-- Favicon -->\n    <link href=\"favicon.png\" rel=\"icon\" type=\"image/png\"/>\n\n    <title>example</title>\n    <link href=\"manifest.json\" rel=\"manifest\">\n</head>\n<body>\n<!-- This script installs service_worker.js to provide PWA functionality to\n     application. For more information, see:\n     https://developers.google.com/web/fundamentals/primers/service-workers -->\n<script>\n    if ('serviceWorker' in navigator) {\n      window.addEventListener('load', function () {\n        navigator.serviceWorker.register('flutter_service_worker.js');\n      });\n    }\n\n</script>\n<script src=\"main.dart.js\" type=\"application/javascript\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "example/web/manifest.json",
    "content": "{\n  \"name\": \"example\",\n  \"short_name\": \"example\",\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"background_color\": \"#0175C2\",\n  \"theme_color\": \"#0175C2\",\n  \"description\": \"A new Flutter project.\",\n  \"orientation\": \"portrait-primary\",\n  \"prefer_related_applications\": false,\n  \"icons\": [\n    {\n      \"src\": \"icons/Icon-192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"icons/Icon-512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ]\n}\n"
  },
  {
    "path": "flutter_reaction_button.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/lib\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/test\" isTestSource=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.dart_tool\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.idea\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.pub\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 25 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" name=\"Dart Packages\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Dart SDK\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Flutter Plugins\" level=\"project\" />\n  </component>\n</module>"
  },
  {
    "path": "lib/flutter_reaction_button.dart",
    "content": "library flutter_reaction_button;\n\nexport 'src/enums/box.dart';\nexport 'src/models/reaction.dart';\nexport 'src/widgets/reaction_button.dart';\n"
  },
  {
    "path": "lib/src/common/position.dart",
    "content": "import 'package:flutter/cupertino.dart';\n\nclass PositionData {\n  const PositionData({\n    required this.offset,\n    this.isBoxHovered = false,\n  });\n\n  final Offset offset;\n  final bool isBoxHovered;\n\n  const PositionData.init()\n      : offset = Offset.zero,\n        isBoxHovered = false;\n\n  PositionData copyWith({\n    Offset? offset,\n    bool? isBoxHovered,\n  }) {\n    return PositionData(\n      offset: offset ?? this.offset,\n      isBoxHovered: isBoxHovered ?? this.isBoxHovered,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/common/position_notifier.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/src/common/position.dart';\n\nclass PositionNotifier extends ValueNotifier<PositionData> {\n  PositionNotifier() : super(const PositionData.init());\n}\n"
  },
  {
    "path": "lib/src/enums/box.dart",
    "content": "enum ReactionsBoxAlignment {\n  ltr,\n  rtl,\n}\n"
  },
  {
    "path": "lib/src/enums/reaction.dart",
    "content": "enum ReactionType {\n  button,\n  container,\n}\n"
  },
  {
    "path": "lib/src/extensions/key.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nextension GlobalKeyExtensions on GlobalKey {\n  Offset get offset {\n    final RenderBox renderBox = currentContext!.findRenderObject() as RenderBox;\n    return renderBox.localToGlobal(Offset.zero);\n  }\n}\n"
  },
  {
    "path": "lib/src/models/reaction.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass Reaction<T> {\n  const Reaction({\n    required this.value,\n    required this.icon,\n    Widget? previewIcon,\n    this.title,\n  }) : previewIcon = previewIcon ?? icon;\n\n  /// Widget showing as button after selecting preview Icon from box appear.\n  final Widget icon;\n\n  /// Widget showing when reactions box appear.\n  ///\n  /// If it's null will replace by [icon].\n  final Widget previewIcon;\n\n  /// Widget that describes the action that will occur when the button is pressed.\n  ///\n  ///This widget is displayed when the user hover on the button.\n  final Widget? title;\n\n  final T? value;\n\n  @override\n  bool operator ==(Object? other) {\n    return other is Reaction &&\n        icon == other.icon &&\n        icon.key == other.icon.key &&\n        previewIcon == other.previewIcon &&\n        previewIcon.key == other.previewIcon.key &&\n        title == other.title &&\n        title?.key == other.title?.key;\n  }\n\n  @override\n  int get hashCode {\n    return Object.hash(icon, previewIcon, title);\n  }\n}\n"
  },
  {
    "path": "lib/src/widgets/reaction_button.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\nimport 'package:flutter_reaction_button/src/enums/reaction.dart';\nimport 'package:flutter_reaction_button/src/extensions/key.dart';\nimport 'package:flutter_reaction_button/src/widgets/reactions_box.dart';\n\nclass ReactionButton<T> extends StatefulWidget {\n  const ReactionButton({\n    super.key,\n    required this.onReactionChanged,\n    required this.reactions,\n    this.placeholder,\n    this.selectedReaction,\n    this.boxColor = Colors.white,\n    this.boxElevation = 5,\n    this.boxRadius = 50,\n    this.isChecked = false,\n    this.itemsSpacing = 8,\n    this.itemScale = .3,\n    required this.itemSize,\n    this.animateBox = true,\n    this.toggle = true,\n    this.boxPadding = const EdgeInsets.all(4),\n    this.boxAnimationDuration = const Duration(milliseconds: 200),\n    this.itemAnimationDuration = const Duration(milliseconds: 100),\n    this.hoverDuration = const Duration(milliseconds: 400),\n    this.child,\n    this.direction = ReactionsBoxAlignment.ltr,\n  }) : _type = child != null ? ReactionType.container : ReactionType.button;\n\n  /// This triggers when reaction button value changed.\n  final ValueChanged<Reaction<T>?> onReactionChanged;\n\n  /// Default widget if no reaction selected\n  final Reaction<T>? placeholder;\n\n  /// Selected reaction button when tap on widget\n  final Reaction<T>? selectedReaction;\n\n  final List<Reaction<T>?> reactions;\n\n  /// Reactions box color [default = white]\n  final Color boxColor;\n\n  /// Reactions box elevation [default = 5]\n  final double boxElevation;\n\n  /// Reactions box radius [default = 50]\n  final double boxRadius;\n\n  /// Reactions box visibility duration [default = 200 milliseconds]\n  final Duration boxAnimationDuration;\n\n  /// Flag for pre-set reactions if true @link selectedReaction will be\n  /// displayed else @link initialReaction will be displayed [default = false]\n  final bool isChecked;\n\n  /// Reactions box padding [default = const EdgeInsets.all(0)]\n  final EdgeInsetsGeometry boxPadding;\n\n  /// Spacing between the reaction items\n  final double itemsSpacing;\n\n  /// Scale ratio when item hovered [default = 0.3]\n  final double itemScale;\n\n  /// Animation duration while moving [default = const Duration(milliseconds: 100)]\n  final Duration itemAnimationDuration;\n\n  final Size itemSize;\n\n  final bool animateBox;\n\n  final bool toggle;\n\n  final Widget? child;\n\n  final Duration hoverDuration;\n\n  final ReactionsBoxAlignment direction;\n\n  final ReactionType _type;\n\n  @override\n  State<ReactionButton<T>> createState() => _ReactionButtonState<T>();\n}\n\nclass _ReactionButtonState<T> extends State<ReactionButton<T>> {\n  final GlobalKey _globalKey = GlobalKey();\n\n  late Reaction<T>? _selectedReaction =\n      _isChecked ? widget.selectedReaction : widget.placeholder;\n\n  late bool _isChecked = widget.isChecked;\n\n  bool get _isContainer => widget._type == ReactionType.container;\n\n  OverlayEntry? _overlayEntry;\n\n  void _updateReaction(Reaction<T>? reaction) {\n    _isChecked = reaction != widget.placeholder;\n    widget.onReactionChanged.call(reaction);\n    setState(() {\n      _selectedReaction = reaction;\n    });\n  }\n\n  void _onCheck() {\n    _isChecked = !_isChecked;\n    _updateReaction(\n      _isChecked\n          ? widget.selectedReaction ?? widget.reactions.first\n          : widget.placeholder,\n    );\n  }\n\n  void _onShowReactionsBox([Offset? offset]) {\n    _overlayEntry = OverlayEntry(\n      builder: (context) {\n        return ReactionsBox<T>(\n          offset: offset ?? _globalKey.offset,\n          itemSize: widget.itemSize,\n          reactions: widget.reactions,\n          color: widget.boxColor,\n          elevation: widget.boxElevation,\n          radius: widget.boxRadius,\n          boxDuration: widget.boxAnimationDuration,\n          boxPadding: widget.boxPadding,\n          itemSpace: widget.itemsSpacing,\n          itemScale: widget.itemScale,\n          itemScaleDuration: widget.itemAnimationDuration,\n          animateBox: widget.animateBox,\n          direction: widget.direction,\n          onReactionSelected: (reaction) {\n            _updateReaction(reaction);\n            _disposeOverlayEntry();\n          },\n          onClose: () {\n            _disposeOverlayEntry();\n          },\n        );\n      },\n    );\n\n    Overlay.of(context).insert(_overlayEntry!);\n  }\n\n  void _disposeOverlayEntry() {\n    _overlayEntry\n      ?..remove()\n      ..dispose();\n    _overlayEntry = null;\n  }\n\n  @override\n  void dispose() {\n    _disposeOverlayEntry();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final Widget? child = _isContainer\n        ? widget.child\n        : (_selectedReaction ?? widget.reactions.first)!.icon;\n\n    return GestureDetector(\n      key: _globalKey,\n      onTap: () {\n        if (widget.toggle) {\n          _onCheck();\n        } else {\n          _onShowReactionsBox();\n        }\n      },\n      onLongPressStart: (details) {\n        if (widget.toggle) {\n          _onShowReactionsBox(_isContainer ? details.globalPosition : null);\n        }\n      },\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/widgets/reactions_box.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\nimport 'package:flutter_reaction_button/src/common/position.dart';\nimport 'package:flutter_reaction_button/src/common/position_notifier.dart';\nimport 'package:flutter_reaction_button/src/widgets/reactions_box_item.dart';\n\nclass ReactionsBox<T> extends StatefulWidget {\n  const ReactionsBox({\n    super.key,\n    required this.offset,\n    required this.itemSize,\n    required this.reactions,\n    required this.color,\n    required this.elevation,\n    required this.radius,\n    required this.boxDuration,\n    required this.boxPadding,\n    required this.itemSpace,\n    required this.itemScale,\n    required this.itemScaleDuration,\n    required this.onReactionSelected,\n    required this.onClose,\n    required this.animateBox,\n    this.direction = ReactionsBoxAlignment.ltr,\n  }) : assert(itemScale > 0.0 && itemScale < 1);\n\n  final Offset offset;\n\n  final Size itemSize;\n\n  final List<Reaction<T>?> reactions;\n\n  final Color color;\n\n  final double elevation;\n\n  final double radius;\n\n  final Duration boxDuration;\n\n  final EdgeInsetsGeometry boxPadding;\n\n  final double itemSpace;\n\n  final double itemScale;\n\n  final Duration itemScaleDuration;\n\n  final ValueChanged<Reaction<T>?> onReactionSelected;\n\n  final VoidCallback onClose;\n\n  final bool animateBox;\n\n  final ReactionsBoxAlignment direction;\n\n  @override\n  State<ReactionsBox<T>> createState() => _ReactionsBoxState<T>();\n}\n\nclass _ReactionsBoxState<T> extends State<ReactionsBox<T>>\n    with SingleTickerProviderStateMixin {\n  final PositionNotifier _positionNotifier = PositionNotifier();\n\n  late final AnimationController _boxAnimationController = AnimationController(\n    vsync: this,\n    duration: widget.animateBox ? widget.boxDuration : Duration.zero,\n  );\n\n  late final Animation _animation;\n\n  double get _boxHeight => widget.itemSize.height + widget.boxPadding.vertical;\n\n  double get _boxWidth =>\n      (widget.itemSize.width * widget.reactions.length) +\n      (widget.itemSpace * (widget.reactions.length - 1)) +\n      widget.boxPadding.horizontal;\n\n  bool get _isWidthOverflow => widget.direction == ReactionsBoxAlignment.ltr\n      ? widget.offset.dx + _boxWidth > MediaQuery.sizeOf(context).width\n      : widget.offset.dx - _boxWidth < 0;\n\n  bool get _shouldStartFromBottom =>\n      widget.offset.dy - _boxHeight - widget.boxPadding.vertical < 0;\n\n  void _checkIsOffsetOutsideBox(Offset offset) {\n    final Rect boxRect = Rect.fromLTWH(0, 0, _boxWidth, _boxHeight);\n    if (!boxRect.contains(offset)) {\n      widget.onClose();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    final Tween tween = IntTween(begin: 0, end: widget.reactions.length);\n    _animation = tween.animate(_boxAnimationController);\n    _boxAnimationController.forward();\n  }\n\n  @override\n  void dispose() {\n    _positionNotifier.dispose();\n    _boxAnimationController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ValueListenableBuilder<PositionData?>(\n      valueListenable: _positionNotifier,\n      builder: (context, fingerPosition, child) {\n        final bool isBoxHovered = fingerPosition?.isBoxHovered ?? false;\n        final double boxScale =\n            1 - (widget.itemScale / widget.reactions.length);\n\n        final double widthOverflow;\n        if (_isWidthOverflow) {\n          widthOverflow = widget.direction == ReactionsBoxAlignment.ltr\n              ? widget.offset.dx + _boxWidth - MediaQuery.sizeOf(context).width\n              : _boxWidth;\n        } else {\n          widthOverflow = 0;\n        }\n\n        final double start = widget.direction == ReactionsBoxAlignment.ltr\n            ? widget.offset.dx - widthOverflow\n            : widget.offset.dx - _boxWidth + widthOverflow;\n\n        final double top = widget.offset.dy -\n            widget.boxPadding.vertical +\n            (_shouldStartFromBottom ? 1 : -1) * widget.itemSize.height;\n\n        return Stack(\n          children: [\n            Positioned.fill(\n              child: Listener(\n                onPointerDown: (_) {\n                  widget.onClose();\n                },\n                child: Container(\n                  key: const ValueKey('outside'),\n                  color: Colors.transparent,\n                ),\n              ),\n            ),\n            PositionedDirectional(\n              start: start,\n              top: top,\n              child: Listener(\n                onPointerDown: (point) {\n                  _positionNotifier.value = PositionData(\n                    offset: point.localPosition,\n                    isBoxHovered: true,\n                  );\n                },\n                onPointerMove: (point) {\n                  _positionNotifier.value = _positionNotifier.value.copyWith(\n                    offset: point.localPosition,\n                    isBoxHovered: true,\n                  );\n                },\n                onPointerUp: (point) {\n                  _positionNotifier.value = _positionNotifier.value.copyWith(\n                    isBoxHovered: false,\n                  );\n                  _checkIsOffsetOutsideBox(point.localPosition);\n                },\n                onPointerCancel: (point) {\n                  _positionNotifier.value = _positionNotifier.value.copyWith(\n                    isBoxHovered: false,\n                  );\n                  _checkIsOffsetOutsideBox(point.localPosition);\n                },\n                child: Transform.scale(\n                  scale: isBoxHovered ? boxScale : 1,\n                  child: child!,\n                ),\n              ),\n            ),\n          ],\n        );\n      },\n      child: Material(\n        color: widget.color,\n        elevation: widget.elevation,\n        shape: RoundedRectangleBorder(\n          borderRadius: BorderRadius.circular(\n            widget.radius,\n          ),\n        ),\n        child: Container(\n          width: _boxWidth,\n          height: _boxHeight,\n          padding: widget.boxPadding,\n          child: Row(\n            children: [\n              for (int index = 0; index < widget.reactions.length; index++) ...[\n                if (index > 0) ...{\n                  SizedBox(\n                    width: widget.itemSpace,\n                  ),\n                },\n                AnimatedBuilder(\n                  animation: _animation,\n                  builder: (context, child) {\n                    return AnimatedScale(\n                      duration: widget.boxDuration,\n                      scale: _animation.value > index ? 1 : 0,\n                      child: child,\n                    );\n                  },\n                  child: ReactionsBoxItem<T>(\n                    index: index,\n                    fingerPositionNotifier: _positionNotifier,\n                    reaction: widget.reactions[index]!,\n                    size: widget.itemSize,\n                    scale: widget.itemScale,\n                    space: widget.itemSpace,\n                    animationDuration: widget.itemScaleDuration,\n                    onReactionSelected: (reaction) {\n                      widget.onReactionSelected(reaction);\n                    },\n                  ),\n                ),\n              ],\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/widgets/reactions_box_item.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\nimport 'package:flutter_reaction_button/src/common/position_notifier.dart';\n\nclass ReactionsBoxItem<T> extends StatefulWidget {\n  const ReactionsBoxItem({\n    super.key,\n    required this.reaction,\n    required this.onReactionSelected,\n    required this.scale,\n    required this.index,\n    required this.size,\n    required this.space,\n    required this.animationDuration,\n    required this.fingerPositionNotifier,\n  });\n\n  final Reaction<T> reaction;\n\n  final ValueChanged<Reaction<T>?> onReactionSelected;\n\n  final Duration animationDuration;\n\n  final PositionNotifier fingerPositionNotifier;\n\n  final double scale;\n\n  final int index;\n\n  final Size size;\n\n  final double space;\n\n  @override\n  State<ReactionsBoxItem<T>> createState() => _ReactionsBoxItemState<T>();\n}\n\nclass _ReactionsBoxItemState<T> extends State<ReactionsBoxItem<T>>\n    with SingleTickerProviderStateMixin {\n  late final AnimationController _animationController = AnimationController(\n    vsync: this,\n    upperBound: widget.scale,\n    duration: widget.animationDuration,\n    reverseDuration: widget.animationDuration,\n  );\n\n  void _listener() {\n    final Offset fingerOffset = widget.fingerPositionNotifier.value.offset;\n    final Offset topLeft =\n        Offset((widget.size.width + widget.space) * widget.index, 0);\n    final Offset bottomRight = Offset(\n      (widget.size.width + widget.space) * (widget.index + 1),\n      widget.size.height,\n    );\n    final Rect rect = Rect.fromPoints(topLeft, bottomRight);\n    final bool selected = rect.contains(fingerOffset);\n\n    if (selected) {\n      final bool isBoxHovered =\n          widget.fingerPositionNotifier.value.isBoxHovered;\n      if (!isBoxHovered) {\n        widget.onReactionSelected(widget.reaction);\n      }\n      _animationController.forward();\n    } else {\n      _animationController.reverse();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    widget.fingerPositionNotifier.addListener(_listener);\n  }\n\n  @override\n  void dispose() {\n    widget.fingerPositionNotifier.removeListener(_listener);\n    _animationController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: _animationController,\n      builder: (context, child) {\n        final bool showTitle =\n            _animationController.value == _animationController.upperBound &&\n                widget.reaction.title != null;\n\n        return Stack(\n          clipBehavior: Clip.none,\n          alignment: Alignment.center,\n          children: [\n            Transform.scale(\n              scale: 1 + _animationController.value,\n              child: SizedBox.fromSize(\n                size: widget.size,\n                child: widget.reaction.previewIcon,\n              ),\n            ),\n            if (widget.reaction.title != null) ...{\n              Positioned(\n                bottom:\n                    widget.size.height * (1 + (_animationController.value / 2)),\n                child: AnimatedOpacity(\n                  opacity: showTitle ? 1 : 0,\n                  duration: widget.animationDuration,\n                  child: widget.reaction.title!,\n                ),\n              )\n            },\n          ],\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: flutter_reaction_button\ndescription: Flutter Reaction Button is a customizable Flutter package that allows you to easily create interactive buttons with reaction emojis, similar to Facebook's iconic reaction buttons.\nhomepage: https://github.com/GeekAbdelouahed/flutter-reaction-button\nrepository: https://github.com/GeekAbdelouahed/flutter-reaction-button.git\nversion: 3.0.0+3\n\nenvironment:\n  sdk: '>=3.0.0 <4.0.0'\n\ndependencies:\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^2.0.1\n\nflutter:\n"
  },
  {
    "path": "test/main.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\n\nconst Reaction _placeHolder = Reaction(\n  value: 0,\n  icon: Icon(Icons.sunny_snowing),\n);\n\nconst List<Reaction> _reactions = [\n  Reaction(\n    value: 1,\n    icon: Icon(Icons.ac_unit),\n  ),\n  Reaction(\n    value: 2,\n    icon: Icon(Icons.sunny),\n  ),\n  Reaction(\n    value: 3,\n    icon: Icon(Icons.wind_power),\n  ),\n];\n\nclass MyApp extends StatelessWidget {\n  const MyApp({\n    super.key,\n    this.toggle = true,\n  });\n\n  final bool toggle;\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: Scaffold(\n        body: SingleChildScrollView(\n          padding: const EdgeInsets.symmetric(vertical: 5),\n          child: Column(\n            children: List.generate(\n              10,\n              (index) {\n                return ReactionButton(\n                  toggle: toggle,\n                  onReactionChanged: (reaction) {},\n                  reactions: _reactions,\n                  placeholder: _placeHolder,\n                  itemSize: const Size.square(24),\n                );\n              },\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "test/reaction_button_test.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_reaction_button/flutter_reaction_button.dart';\nimport 'package:flutter_reaction_button/src/widgets/reactions_box.dart';\nimport 'package:flutter_reaction_button/src/widgets/reactions_box_item.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'main.dart';\n\nvoid main() {\n  group(\n    'Reaction button with toggle = true',\n    () {\n      testWidgets(\n        'Expect to select initial reaction '\n        'when tap on reaction button',\n        (tester) async {\n          await tester.pumpWidget(const MyApp());\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.tap(reaction);\n          await tester.pump();\n          final Finder initialReaction = find.byIcon(Icons.ac_unit);\n          expect(initialReaction, findsOneWidget);\n        },\n      );\n\n      testWidgets(\n        'Expect to show reactions box '\n        'when long press on reaction button',\n        (tester) async {\n          await tester.pumpWidget(const MyApp());\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.longPress(reaction);\n          await tester.pumpAndSettle();\n          final Finder reactionsBox = find.byType(ReactionsBox);\n          expect(reactionsBox, findsOneWidget);\n        },\n      );\n\n      testWidgets(\n        'Expect reactions box to closed successfully '\n        'when tap outside',\n        (tester) async {\n          await tester.pumpWidget(const MyApp());\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.longPress(reaction);\n          await tester.pumpAndSettle();\n          final Finder outsideWidget = find.byKey(const ValueKey('outside'));\n          await tester.tap(outsideWidget);\n          await tester.pumpAndSettle();\n          final Finder lastReactionIcon = find.byType(ReactionsBox);\n          expect(lastReactionIcon, findsNothing);\n        },\n      );\n\n      testWidgets(\n        'Expect to select last reaction from reactions box '\n        'when long press on reaction button and reactions box is visible',\n        (tester) async {\n          await tester.pumpWidget(const MyApp());\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.longPress(reaction);\n          await tester.pumpAndSettle();\n          final Finder lastReaction = find.byType(ReactionsBoxItem).last;\n          await tester.tap(lastReaction);\n          await tester.pumpAndSettle();\n          final Finder lastReactionIcon = find.byIcon(Icons.wind_power);\n          expect(lastReactionIcon, findsOneWidget);\n        },\n      );\n    },\n  );\n\n  group(\n    'Reaction button with toggle = false',\n    () {\n      testWidgets(\n        'Expect to show reactions box '\n        'when tap on reaction button',\n        (tester) async {\n          await tester.pumpWidget(const MyApp(toggle: false));\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.tap(reaction);\n          await tester.pumpAndSettle();\n          final Finder reactionsBox = find.byType(ReactionsBox);\n          expect(reactionsBox, findsOneWidget);\n        },\n      );\n\n      testWidgets(\n        'Expect reactions box to closed successfully '\n        'when tap outside',\n        (tester) async {\n          await tester.pumpWidget(const MyApp(toggle: false));\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.tap(reaction);\n          await tester.pumpAndSettle();\n          final Finder outsideWidget = find.byKey(const ValueKey('outside'));\n          await tester.tap(outsideWidget);\n          await tester.pumpAndSettle();\n          final Finder lastReactionIcon = find.byType(ReactionsBox);\n          expect(lastReactionIcon, findsNothing);\n        },\n      );\n\n      testWidgets(\n        'Expect to select last reaction from reactions box '\n        'when long press on reaction button and reactions box is visible',\n        (tester) async {\n          await tester.pumpWidget(const MyApp(toggle: false));\n          final Finder reaction = find.byType(ReactionButton).first;\n          await tester.tap(reaction);\n          await tester.pumpAndSettle();\n          final Finder lastReaction = find.byType(ReactionsBoxItem).last;\n          await tester.tap(lastReaction);\n          await tester.pumpAndSettle();\n          final Finder lastReactionIcon = find.byIcon(Icons.wind_power);\n          expect(lastReactionIcon, findsOneWidget);\n        },\n      );\n    },\n  );\n}\n"
  }
]