├── dart_test.yaml ├── analysis_options.yaml ├── example ├── web │ ├── favicon.png │ ├── icons │ │ ├── Icon-192.png │ │ ├── Icon-512.png │ │ ├── Icon-maskable-192.png │ │ └── Icon-maskable-512.png │ ├── manifest.json │ └── index.html ├── .metadata ├── README.md ├── .gitignore ├── analysis_options.yaml ├── pubspec.yaml ├── lib │ └── main.dart └── pubspec.lock ├── screenshots ├── base_gradient.png ├── border_with_colorized_icon.png └── gradient_with_border_and_shadow.png ├── assets └── fonts │ └── Roboto │ ├── Roboto-Black.ttf │ ├── Roboto-Bold.ttf │ ├── Roboto-Light.ttf │ ├── Roboto-Thin.ttf │ ├── Roboto-Medium.ttf │ ├── Roboto-Regular.ttf │ └── LICENSE.txt ├── test ├── goldens │ └── ci │ │ ├── border_rendering.png │ │ └── gradient_rendering.png ├── icon_border_test.dart ├── flutter_test_config.dart ├── test_utils │ └── gradients.dart ├── borders_test.dart └── gradient_test.dart ├── lib ├── icon_decoration.dart └── src │ ├── icon_border.dart │ ├── icon_decoration.dart │ ├── gradient_icon.dart │ └── decorated_icon.dart ├── .github ├── dependabot.yml └── workflows │ ├── tests.yml │ └── stale.yml ├── .metadata ├── pubspec.yaml ├── LICENSE ├── CHANGELOG.md ├── .gitignore ├── README.md └── pubspec.lock /dart_test.yaml: -------------------------------------------------------------------------------- 1 | tags: 2 | golden: -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:fd_lints/flutter.yaml 2 | -------------------------------------------------------------------------------- /example/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/example/web/favicon.png -------------------------------------------------------------------------------- /screenshots/base_gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/screenshots/base_gradient.png -------------------------------------------------------------------------------- /example/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/example/web/icons/Icon-192.png -------------------------------------------------------------------------------- /example/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/example/web/icons/Icon-512.png -------------------------------------------------------------------------------- /assets/fonts/Roboto/Roboto-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/assets/fonts/Roboto/Roboto-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/assets/fonts/Roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/assets/fonts/Roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/assets/fonts/Roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /test/goldens/ci/border_rendering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/test/goldens/ci/border_rendering.png -------------------------------------------------------------------------------- /assets/fonts/Roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/assets/fonts/Roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/assets/fonts/Roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /example/web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/example/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /example/web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/example/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /test/goldens/ci/gradient_rendering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/test/goldens/ci/gradient_rendering.png -------------------------------------------------------------------------------- /screenshots/border_with_colorized_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/screenshots/border_with_colorized_icon.png -------------------------------------------------------------------------------- /screenshots/gradient_with_border_and_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TesteurManiak/icon_decoration/HEAD/screenshots/gradient_with_border_and_shadow.png -------------------------------------------------------------------------------- /lib/icon_decoration.dart: -------------------------------------------------------------------------------- 1 | library icon_decoration; 2 | 3 | export 'src/decorated_icon.dart'; 4 | export 'src/icon_border.dart'; 5 | export 'src/icon_decoration.dart'; 6 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | enable-beta-ecosystems: true 3 | updates: 4 | - package-ecosystem: "pub" 5 | directory: "/" 6 | schedule: 7 | interval: "weekly" 8 | -------------------------------------------------------------------------------- /lib/src/icon_border.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class IconBorder { 4 | const IconBorder({ 5 | this.width = 1.0, 6 | this.color = Colors.black, 7 | }) : assert(width >= 0.0); 8 | 9 | /// Border's width 10 | final double width; 11 | 12 | /// Border's color 13 | final Color color; 14 | } 15 | -------------------------------------------------------------------------------- /test/icon_border_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:icon_decoration/icon_decoration.dart'; 3 | 4 | void main() { 5 | group('IconBorder class', () { 6 | test('Width cannot be negative', () { 7 | expect(() => IconBorder(width: -1), throwsAssertionError); 8 | }); 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 3595343e20a61ff16d14e8ecc25f364276bb1b8b 8 | channel: stable 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /example/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 3595343e20a61ff16d14e8ecc25f364276bb1b8b 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Test workflow 2 | 3 | on: 4 | push: 5 | branches: [ main, dev ] 6 | pull_request: 7 | branches: [ main, dev ] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4.2.0 14 | - uses: subosito/flutter-action@v2.16.0 15 | - run: flutter pub get 16 | - name: Test 17 | run: flutter test --coverage --dart-define=CI=true 18 | - name: Collect and report coverage 19 | uses: coverallsapp/github-action@v2.3.0 20 | with: 21 | github-token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # example 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /test/flutter_test_config.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:alchemist/alchemist.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | Future testExecutable(FutureOr Function() testMain) async { 7 | const isRunningInCi = bool.fromEnvironment('CI'); 8 | 9 | return AlchemistConfig.runWithConfig( 10 | config: AlchemistConfig( 11 | theme: ThemeData(useMaterial3: false), 12 | platformGoldensConfig: const PlatformGoldensConfig( 13 | // ignore: avoid_redundant_argument_values 14 | enabled: !isRunningInCi, 15 | ), 16 | ciGoldensConfig: const CiGoldensConfig(tolerance: 0.01), 17 | ), 18 | run: testMain, 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: Mark stale issues and pull requests 2 | 3 | on: 4 | schedule: 5 | - cron: "30 1 * * *" 6 | 7 | jobs: 8 | stale: 9 | 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/stale@v9.0.0 14 | with: 15 | repo-token: ${{ secrets.GITHUB_TOKEN }} 16 | stale-issue-message: 'This issue is stale because it has been open 15 days with no activity. Remove stale label or comment or this will be closed in 5 days.' 17 | stale-pr-message: 'This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 10 days.' 18 | close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.' 19 | days-before-stale: 15 20 | days-before-close: 5 21 | days-before-pr-close: -1 22 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /lib/src/icon_decoration.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:icon_decoration/src/icon_border.dart'; 3 | 4 | /// {@template icon_decoration} 5 | /// Used to specify a decoration to apply to an [Icon] widget. 6 | /// 7 | /// The icon has a [border] and may cast shadows. 8 | /// 9 | /// The [border] paints over the icon; the [boxShadow], naturally, paints 10 | /// below it. 11 | /// {@endtemplate} 12 | class IconDecoration { 13 | /// {@macro icon_decoration} 14 | const IconDecoration({ 15 | this.border, 16 | this.gradient, 17 | }); 18 | 19 | /// A border to draw above the icon color or [gradient]. 20 | final IconBorder? border; 21 | 22 | /// Apply a gradient to the icon. If this is specified the [Icon.color] 23 | /// property has no effect. 24 | /// 25 | /// **Gradients are supported on Flutter Web only with the [canvaskit renderer](https://docs.flutter.dev/platform-integration/web/renderers)** 26 | final Gradient? gradient; 27 | } 28 | -------------------------------------------------------------------------------- /test/test_utils/gradients.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class RainbowGradient extends LinearGradient { 4 | const RainbowGradient() 5 | : super( 6 | colors: const [ 7 | Colors.red, 8 | Colors.orange, 9 | Colors.yellow, 10 | Colors.green, 11 | Colors.blue, 12 | Colors.indigo, 13 | Colors.purple, 14 | ], 15 | ); 16 | } 17 | 18 | class FlutterGradient extends LinearGradient { 19 | const FlutterGradient() 20 | : super( 21 | colors: const [ 22 | Color.fromARGB(255, 66, 165, 245), 23 | Color.fromARGB(255, 13, 71, 161), 24 | ], 25 | ); 26 | } 27 | 28 | class FadeOutGradient extends LinearGradient { 29 | const FadeOutGradient() 30 | : super( 31 | colors: const [ 32 | Colors.white, 33 | Color.fromRGBO(255, 255, 255, 0), 34 | ], 35 | begin: Alignment.topLeft, 36 | end: Alignment.bottomRight, 37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /example/web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "short_name": "example", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: icon_decoration 2 | description: Add decoration capabilities to the Icon widget with borders and gradients. 3 | version: 2.1.0 4 | homepage: https://github.com/TesteurManiak/icon_decoration 5 | repository: https://github.com/TesteurManiak/icon_decoration 6 | issue_tracker: https://github.com/TesteurManiak/icon_decoration/issues 7 | 8 | environment: 9 | sdk: ">=3.0.0 <4.0.0" 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | 15 | dev_dependencies: 16 | alchemist: 17 | git: 18 | url: https://github.com/Betterment/alchemist.git 19 | ref: ab1f2eb49584339be119eaec28a5562f6b325cbc 20 | fd_lints: ^2.3.0 21 | flutter_test: 22 | sdk: flutter 23 | meta: ^1.15.0 24 | 25 | flutter: 26 | uses-material-design: true 27 | # Used for readable platform golden tests. 28 | fonts: 29 | - family: Roboto 30 | fonts: 31 | - asset: assets/fonts/Roboto/Roboto-Thin.ttf 32 | weight: 100 33 | - asset: assets/fonts/Roboto/Roboto-Light.ttf 34 | weight: 300 35 | - asset: assets/fonts/Roboto/Roboto-Regular.ttf 36 | weight: 400 37 | - asset: assets/fonts/Roboto/Roboto-Medium.ttf 38 | weight: 500 39 | - asset: assets/fonts/Roboto/Roboto-Bold.ttf 40 | weight: 700 41 | - asset: assets/fonts/Roboto/Roboto-Black.ttf 42 | weight: 900 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2021, Guillaume Roux 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 2.1.0 2 | 3 | * Chore/bump dependencies by @TesteurManiak in https://github.com/TesteurManiak/icon_decoration/pull/6 4 | * Fallback to the shadows value of the IconTheme by @remi-denele in https://github.com/TesteurManiak/icon_decoration/pull/5 5 | * feat: update alchemist dependency by @TesteurManiak in https://github.com/TesteurManiak/icon_decoration/pull/7 6 | 7 | ### New Contributors 8 | * @remi-denele made their first contribution in https://github.com/TesteurManiak/icon_decoration/pull/5 9 | 10 | **Full Changelog**: https://github.com/TesteurManiak/icon_decoration/compare/2.0.0...2.1.0 11 | 12 | ## 2.0.2 13 | 14 | * Fix README.md 15 | 16 | ## 2.0.1 17 | 18 | * Updated `README.md` with a "Migration Guide" section 19 | * Updated documentation 20 | * Added warning for gradients on Flutter Web 21 | * Upgraded dev dependencies 22 | 23 | ## 2.0.0 24 | 25 | * Removed `IconDecoration.shadows`, use `Icon.shadows` instead 26 | * Support for Dart 3 27 | * Upgraded dependencies 28 | * Updated linting 29 | 30 | ## 1.0.1 31 | 32 | * Fix gradient issue [#3](https://github.com/TesteurManiak/icon_decoration/issues/3) 33 | 34 | ## 1.0.0+3 35 | 36 | * Fixed README.md 37 | 38 | ## 1.0.0+2 39 | 40 | * Updated golden tests with the package [alchemist](https://pub.dev/packages/alchemist) 41 | 42 | ## 1.0.0+1 43 | 44 | * Change license to BSD 2-Clause 45 | 46 | ## 1.0.0 47 | 48 | * First release: Add support for `shadows`, `border` and `gradient` properties. 49 | -------------------------------------------------------------------------------- /example/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /test/borders_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:alchemist/alchemist.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | import 'package:icon_decoration/icon_decoration.dart'; 5 | 6 | void main() { 7 | group('Goldens Borders', () { 8 | goldenTest( 9 | 'Border rendering', 10 | fileName: 'border_rendering', 11 | builder: () { 12 | return GoldenTestGroup( 13 | children: [ 14 | GoldenTestScenario( 15 | name: 'default', 16 | child: const DecoratedIcon( 17 | icon: Icon(Icons.favorite, color: Colors.transparent, size: 50), 18 | decoration: IconDecoration(border: IconBorder()), 19 | ), 20 | ), 21 | GoldenTestScenario( 22 | name: 'with colorized icon', 23 | child: const DecoratedIcon( 24 | icon: Icon(Icons.favorite, color: Colors.green, size: 50), 25 | decoration: IconDecoration(border: IconBorder()), 26 | ), 27 | ), 28 | GoldenTestScenario( 29 | name: 'with shadows', 30 | child: const DecoratedIcon( 31 | icon: Icon( 32 | Icons.favorite, 33 | color: Colors.green, 34 | size: 50, 35 | shadows: [ 36 | Shadow( 37 | color: Colors.red, 38 | blurRadius: 3, 39 | offset: Offset(0, 2), 40 | ), 41 | ], 42 | ), 43 | decoration: IconDecoration(border: IconBorder()), 44 | ), 45 | ), 46 | ], 47 | ); 48 | }, 49 | ); 50 | }); 51 | } 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | build/ 32 | 33 | # Android related 34 | **/android/**/gradle-wrapper.jar 35 | **/android/.gradle 36 | **/android/captures/ 37 | **/android/gradlew 38 | **/android/gradlew.bat 39 | **/android/local.properties 40 | **/android/**/GeneratedPluginRegistrant.java 41 | 42 | # iOS/XCode related 43 | **/ios/**/*.mode1v3 44 | **/ios/**/*.mode2v3 45 | **/ios/**/*.moved-aside 46 | **/ios/**/*.pbxuser 47 | **/ios/**/*.perspectivev3 48 | **/ios/**/*sync/ 49 | **/ios/**/.sconsign.dblite 50 | **/ios/**/.tags* 51 | **/ios/**/.vagrant/ 52 | **/ios/**/DerivedData/ 53 | **/ios/**/Icon? 54 | **/ios/**/Pods/ 55 | **/ios/**/.symlinks/ 56 | **/ios/**/profile 57 | **/ios/**/xcuserdata 58 | **/ios/.generated/ 59 | **/ios/Flutter/App.framework 60 | **/ios/Flutter/Flutter.framework 61 | **/ios/Flutter/Flutter.podspec 62 | **/ios/Flutter/Generated.xcconfig 63 | **/ios/Flutter/ephemeral 64 | **/ios/Flutter/app.flx 65 | **/ios/Flutter/app.zip 66 | **/ios/Flutter/flutter_assets/ 67 | **/ios/Flutter/flutter_export_environment.sh 68 | **/ios/ServiceDefinitions.json 69 | **/ios/Runner/GeneratedPluginRegistrant.* 70 | 71 | # Exceptions to above rules. 72 | !**/ios/**/default.mode1v3 73 | !**/ios/**/default.mode2v3 74 | !**/ios/**/default.pbxuser 75 | !**/ios/**/default.perspectivev3 76 | 77 | # Ignore non-CI golden files and failures 78 | test/**/goldens/**/*.* 79 | test/**/failures/**/*.* 80 | !test/**/goldens/ci/*.* 81 | 82 | coverage/ 83 | -------------------------------------------------------------------------------- /lib/src/gradient_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/rendering.dart'; 3 | 4 | class GradientIcon extends StatelessWidget { 5 | const GradientIcon({ 6 | super.key, 7 | required this.icon, 8 | required this.size, 9 | required this.gradient, 10 | required this.textDirection, 11 | required this.style, 12 | }); 13 | 14 | final IconData icon; 15 | final double size; 16 | final Gradient gradient; 17 | final TextDirection textDirection; 18 | final TextStyle style; 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | final textPainter = TextPainter( 23 | textDirection: textDirection, 24 | text: TextSpan( 25 | text: String.fromCharCode(icon.codePoint), 26 | style: style, 27 | ), 28 | )..layout(maxWidth: size, minWidth: size); 29 | 30 | return SizedBox( 31 | width: size, 32 | height: size, 33 | child: CustomPaint( 34 | painter: _GradientIconPainter( 35 | icon: icon, 36 | gradient: gradient, 37 | textPainter: textPainter, 38 | style: style, 39 | ), 40 | size: Size.square(size), 41 | ), 42 | ); 43 | } 44 | } 45 | 46 | class _GradientIconPainter extends CustomPainter { 47 | _GradientIconPainter({ 48 | required this.gradient, 49 | required this.icon, 50 | required this.style, 51 | required this.textPainter, 52 | }); 53 | final Gradient gradient; 54 | final IconData icon; 55 | final TextStyle style; 56 | final TextPainter textPainter; 57 | 58 | @override 59 | void paint(Canvas canvas, Size size) { 60 | final textSpanRect = 61 | Alignment.center.inscribe(textPainter.size, Offset.zero & size); 62 | 63 | if (debugPaintSizeEnabled) { 64 | debugPaintPadding(canvas, textSpanRect, textSpanRect.deflate(2)); 65 | } 66 | 67 | textPainter 68 | ..text = TextSpan( 69 | text: String.fromCharCode(icon.codePoint), 70 | style: style.copyWith( 71 | foreground: Paint()..shader = gradient.createShader(textSpanRect), 72 | ), 73 | ) 74 | ..layout(minWidth: size.width, maxWidth: size.width) 75 | ..paint(canvas, textSpanRect.topLeft); 76 | } 77 | 78 | @override 79 | bool shouldRepaint(_GradientIconPainter oldDelegate) { 80 | return gradient != oldDelegate.gradient || 81 | icon != oldDelegate.icon || 82 | style != oldDelegate.style; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /test/gradient_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:alchemist/alchemist.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | import 'package:icon_decoration/icon_decoration.dart'; 5 | 6 | import 'test_utils/gradients.dart'; 7 | 8 | void main() { 9 | group('Goldens Gradients', () { 10 | goldenTest( 11 | 'Gradient rendering', 12 | fileName: 'gradient_rendering', 13 | builder: () { 14 | return GoldenTestGroup( 15 | children: [ 16 | GoldenTestScenario( 17 | name: 'rainbow gradient', 18 | child: const DecoratedIcon( 19 | icon: Icon(Icons.all_inbox, size: 50), 20 | decoration: IconDecoration( 21 | gradient: RainbowGradient(), 22 | ), 23 | ), 24 | ), 25 | GoldenTestScenario( 26 | name: 'flutter gradient', 27 | child: const DecoratedIcon( 28 | icon: Icon(Icons.all_inbox, size: 50), 29 | decoration: IconDecoration( 30 | gradient: FlutterGradient(), 31 | ), 32 | ), 33 | ), 34 | GoldenTestScenario( 35 | name: 'fadeOut gradient', 36 | child: const DecoratedIcon( 37 | icon: Icon(Icons.all_inbox, size: 50), 38 | decoration: IconDecoration( 39 | gradient: FadeOutGradient(), 40 | ), 41 | ), 42 | ), 43 | GoldenTestScenario( 44 | name: 'with red shadows', 45 | child: const DecoratedIcon( 46 | icon: Icon( 47 | Icons.all_inbox, 48 | size: 50, 49 | shadows: [ 50 | Shadow( 51 | color: Colors.red, 52 | blurRadius: 3, 53 | offset: Offset(0, 2), 54 | ), 55 | ], 56 | ), 57 | decoration: IconDecoration( 58 | gradient: RainbowGradient(), 59 | ), 60 | ), 61 | ), 62 | GoldenTestScenario( 63 | name: 'with default border', 64 | child: const DecoratedIcon( 65 | icon: Icon(Icons.all_inbox, size: 50), 66 | decoration: IconDecoration( 67 | gradient: RainbowGradient(), 68 | border: IconBorder(), 69 | ), 70 | ), 71 | ), 72 | GoldenTestScenario( 73 | name: 'with border and shadows', 74 | child: const DecoratedIcon( 75 | icon: Icon( 76 | Icons.all_inbox, 77 | size: 50, 78 | shadows: [ 79 | Shadow( 80 | color: Colors.red, 81 | blurRadius: 3, 82 | offset: Offset(0, 2), 83 | ), 84 | ], 85 | ), 86 | decoration: IconDecoration( 87 | gradient: RainbowGradient(), 88 | border: IconBorder(), 89 | ), 90 | ), 91 | ), 92 | ], 93 | ); 94 | }, 95 | ); 96 | }); 97 | } 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # icon_decoration 2 | 3 | [![Pub Version](https://img.shields.io/pub/v/icon_decoration)](https://pub.dev/packages/icon_decoration) 4 | [![Test workflow](https://github.com/TesteurManiak/icon_decoration/actions/workflows/tests.yml/badge.svg)](https://github.com/TesteurManiak/icon_decoration/actions/workflows/tests.yml) 5 | [![Coverage Status](https://coveralls.io/repos/github/TesteurManiak/icon_decoration/badge.svg?branch=main)](https://coveralls.io/github/TesteurManiak/icon_decoration?branch=main) 6 | 7 | Add decoration capabilities to the `Icon` widget with borders and gradients. This new `DecoratedIcon` widget overlap itself with the base `Icon` widget to provide a more complete decoration system through a `IconDecoration` property. 8 | 9 | ## Table of contents 10 | 11 | - [Add to your project](#add-to-your-project) 12 | - [Add dependency to your `pubspec.yaml`](#add-dependency-to-your-pubspecyaml) 13 | - [Import the package](#import-the-package) 14 | - [How to use](#how-to-use) 15 | - [Add borders to icons](#add-borders-to-icons) 16 | - [Add gradients to icons](#add-gradients-to-icons) 17 | - [Mix them all together](#mix-them-all-together) 18 | - [Migration Guide](#migration-guide) 19 | - [v2.0.0](#v200) 20 | 21 | ## Add to your project 22 | 23 | ### Add dependency to your `pubspec.yaml` 24 | 25 | ```yaml 26 | icon_decoration: any 27 | ``` 28 | 29 | ### Import the package 30 | 31 | ```dart 32 | import 'package:icon_decoration/icon_decoration.dart'; 33 | ``` 34 | 35 | ## How to use 36 | 37 | ### Add borders to icons 38 | 39 | 40 | 41 | ```dart 42 | DecoratedIcon( 43 | icon: Icon(Icons.favorite, color: Colors.green), 44 | decoration: IconDecoration(border: IconBorder()), 45 | ) 46 | ``` 47 | 48 | ### Add gradients to icons 49 | 50 | **Gradients are supported on Flutter Web only with the [canvaskit renderer][flutter_web_renderer]** 51 | 52 | 53 | 54 | ```dart 55 | DecoratedIcon( 56 | icon: Icon(Icons.all_inbox), 57 | decoration: IconDecoration( 58 | gradient: rainbowGradient, 59 | ), 60 | ) 61 | ``` 62 | 63 | ### Mix them all together 64 | 65 | 66 | 67 | ```dart 68 | DecoratedIcon( 69 | icon: Icon( 70 | Icons.all_inbox, 71 | shadows: [ 72 | Shadow( 73 | color: Colors.red, 74 | blurRadius: 3, 75 | offset: Offset(0, 2), 76 | ), 77 | ], 78 | ), 79 | decoration: IconDecoration( 80 | gradient: _rainbowGradient, 81 | border: IconBorder(), 82 | ), 83 | ) 84 | ``` 85 | 86 | ## Migration Guide 87 | 88 | ### v2.0.0 89 | 90 | * Removed `IconDecoration.shadows`, use `Icon.shadows` instead. 91 | 92 | **Before** 93 | 94 | ```dart 95 | DecoratedIcon( 96 | icon: Icon(Icons.all_inbox), 97 | decoration: IconDecoration( 98 | shadows: [ 99 | Shadow( 100 | color: Colors.red, 101 | blurRadius: 3, 102 | offset: Offset(0, 2), 103 | ), 104 | ], 105 | ), 106 | ) 107 | ``` 108 | 109 | **After** 110 | 111 | ```dart 112 | Icon( 113 | Icons.all_inbox, 114 | shadows: [ 115 | Shadow( 116 | color: Colors.red, 117 | blurRadius: 3, 118 | offset: Offset(0, 2), 119 | ), 120 | ], 121 | ), 122 | ``` 123 | 124 | [flutter_web_renderer]: https://docs.flutter.dev/platform-integration/web/renderers -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: example 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 6 | publish_to: "none" # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.17.0 <4.0.0" 22 | 23 | # Dependencies specify other packages that your package needs in order to work. 24 | # To automatically upgrade your package dependencies to the latest versions 25 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 26 | # dependencies can be manually updated by changing the version numbers below to 27 | # the latest version available on pub.dev. To see which dependencies have newer 28 | # versions available, run `flutter pub outdated`. 29 | dependencies: 30 | flutter: 31 | sdk: flutter 32 | 33 | # The following adds the Cupertino Icons font to your application. 34 | # Use with the CupertinoIcons class for iOS style icons. 35 | cupertino_icons: ^1.0.2 36 | icon_decoration: 37 | path: ../ 38 | 39 | dev_dependencies: 40 | flutter_test: 41 | sdk: flutter 42 | 43 | # The "flutter_lints" package below contains a set of recommended lints to 44 | # encourage good coding practices. The lint set provided by the package is 45 | # activated in the `analysis_options.yaml` file located at the root of your 46 | # package. See that file for information about deactivating specific lint 47 | # rules and activating additional ones. 48 | flutter_lints: ^1.0.0 49 | 50 | # For information on the generic Dart part of this file, see the 51 | # following page: https://dart.dev/tools/pub/pubspec 52 | 53 | # The following section is specific to Flutter. 54 | flutter: 55 | # The following line ensures that the Material Icons font is 56 | # included with your application, so that you can use the icons in 57 | # the material Icons class. 58 | uses-material-design: true 59 | 60 | # To add assets to your application, add an assets section, like this: 61 | # assets: 62 | # - images/a_dot_burr.jpeg 63 | # - images/a_dot_ham.jpeg 64 | 65 | # An image asset can refer to one or more resolution-specific "variants", see 66 | # https://flutter.dev/assets-and-images/#resolution-aware. 67 | 68 | # For details regarding adding assets from package dependencies, see 69 | # https://flutter.dev/assets-and-images/#from-packages 70 | 71 | # To add custom fonts to your application, add a fonts section here, 72 | # in this "flutter" section. Each entry in this list should have a 73 | # "family" key with the font family name, and a "fonts" key with a 74 | # list giving the asset and other descriptors for the font. For 75 | # example: 76 | # fonts: 77 | # - family: Schyler 78 | # fonts: 79 | # - asset: fonts/Schyler-Regular.ttf 80 | # - asset: fonts/Schyler-Italic.ttf 81 | # style: italic 82 | # - family: Trajan Pro 83 | # fonts: 84 | # - asset: fonts/TrajanPro.ttf 85 | # - asset: fonts/TrajanPro_Bold.ttf 86 | # weight: 700 87 | # 88 | # For details regarding fonts from package dependencies, 89 | # see https://flutter.dev/custom-fonts/#from-packages 90 | -------------------------------------------------------------------------------- /example/web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | example 30 | 31 | 32 | 33 | 36 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /lib/src/decorated_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:icon_decoration/src/gradient_icon.dart'; 3 | import 'package:icon_decoration/src/icon_decoration.dart'; 4 | 5 | /// Reimplementation of the [Icon] widget which adds support for borders and 6 | /// gradients trough its [decoration] property. 7 | class DecoratedIcon extends StatelessWidget { 8 | const DecoratedIcon({ 9 | super.key, 10 | required this.icon, 11 | this.decoration, 12 | }); 13 | 14 | final Icon icon; 15 | final IconDecoration? decoration; 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | final iconData = icon.icon!; 20 | final textDirection = icon.textDirection ?? Directionality.of(context); 21 | final iconTheme = IconTheme.of(context); 22 | final iconSize = icon.size ?? iconTheme.size ?? 24.0; 23 | final iconOpacity = iconTheme.opacity ?? 1.0; 24 | final border = decoration?.border; 25 | final gradient = decoration?.gradient; 26 | final shadows = icon.shadows ?? iconTheme.shadows; 27 | 28 | Color iconColor = icon.color ?? iconTheme.color!; 29 | if (iconOpacity != 1.0) { 30 | iconColor = iconColor.withOpacity(iconColor.opacity * iconOpacity); 31 | } 32 | 33 | final TextStyle iconStyle = TextStyle( 34 | inherit: false, 35 | color: iconColor, 36 | fontSize: iconSize, 37 | fontFamily: iconData.fontFamily, 38 | package: iconData.fontPackage, 39 | shadows: shadows, 40 | ); 41 | 42 | Widget iconWidget = RichText( 43 | overflow: TextOverflow.visible, 44 | textDirection: textDirection, 45 | text: TextSpan( 46 | text: String.fromCharCode(iconData.codePoint), 47 | style: iconStyle, 48 | ), 49 | ); 50 | 51 | Widget? gradientWidgetCpy; 52 | if (gradient != null) { 53 | iconWidget = GradientIcon( 54 | icon: iconData, 55 | size: iconSize, 56 | gradient: gradient, 57 | textDirection: textDirection, 58 | style: iconStyle, 59 | ); 60 | 61 | // Creates a copy to ensure the original gradient is not modified. 62 | gradientWidgetCpy = GradientIcon( 63 | icon: iconData, 64 | size: iconSize, 65 | gradient: gradient, 66 | textDirection: textDirection, 67 | style: iconStyle, 68 | ); 69 | } 70 | 71 | if (iconData.matchTextDirection) { 72 | switch (textDirection) { 73 | case TextDirection.rtl: 74 | iconWidget = Transform( 75 | transform: Matrix4.identity()..scale(-1.0, 1, 1), 76 | alignment: Alignment.center, 77 | transformHitTests: false, 78 | child: iconWidget, 79 | ); 80 | case TextDirection.ltr: 81 | break; 82 | } 83 | } 84 | 85 | if (border != null) { 86 | // Remove shadows from the widget as it will be displayed by the border. 87 | iconWidget = gradientWidgetCpy ?? 88 | RichText( 89 | overflow: TextOverflow.visible, 90 | textDirection: textDirection, 91 | text: TextSpan( 92 | text: String.fromCharCode(iconData.codePoint), 93 | style: iconStyle.copyWith(shadows: []), 94 | ), 95 | ); 96 | iconWidget = Stack( 97 | alignment: Alignment.center, 98 | textDirection: textDirection, 99 | children: [ 100 | RichText( 101 | overflow: TextOverflow.visible, 102 | textDirection: textDirection, 103 | textAlign: TextAlign.center, 104 | text: TextSpan( 105 | text: String.fromCharCode(iconData.codePoint), 106 | style: iconStyle.copyWith( 107 | foreground: Paint() 108 | ..style = PaintingStyle.stroke 109 | ..strokeCap = StrokeCap.round 110 | ..strokeJoin = StrokeJoin.round 111 | ..strokeWidth = border.width 112 | ..color = border.color, 113 | ), 114 | ), 115 | ), 116 | iconWidget, 117 | ], 118 | ); 119 | } 120 | 121 | return Semantics( 122 | label: icon.semanticLabel, 123 | child: ExcludeSemantics( 124 | child: SizedBox( 125 | width: iconSize, 126 | height: iconSize, 127 | child: Center(child: iconWidget), 128 | ), 129 | ), 130 | ); 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:icon_decoration/icon_decoration.dart'; 3 | 4 | void main() { 5 | runApp(const MyApp()); 6 | } 7 | 8 | class MyApp extends StatelessWidget { 9 | const MyApp({super.key}); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | BoxDecoration( 14 | border: Border.all( 15 | color: Colors.black, 16 | width: 1, 17 | style: BorderStyle.solid, 18 | ), 19 | ); 20 | return MaterialApp( 21 | theme: ThemeData(primarySwatch: Colors.blue), 22 | home: Scaffold( 23 | backgroundColor: Colors.black, 24 | body: Center( 25 | child: Column( 26 | mainAxisAlignment: MainAxisAlignment.center, 27 | children: [ 28 | const Row( 29 | mainAxisAlignment: MainAxisAlignment.center, 30 | children: [ 31 | DecoratedIcon( 32 | icon: Icon( 33 | Icons.lightbulb_outline, 34 | color: Colors.lightBlueAccent, 35 | size: 36, 36 | shadows: [ 37 | Shadow(blurRadius: 3, color: Colors.lightBlueAccent), 38 | ], 39 | ), 40 | ), 41 | DecoratedIcon( 42 | icon: Icon(Icons.lightbulb_outline, 43 | color: Colors.lightBlueAccent, 44 | size: 36, 45 | shadows: [ 46 | Shadow( 47 | blurRadius: 3, 48 | color: Color.fromARGB(255, 128, 216, 255), 49 | ), 50 | ]), 51 | ), 52 | DecoratedIcon( 53 | icon: Icon( 54 | Icons.lightbulb_outline, 55 | color: Colors.lightBlueAccent, 56 | size: 36, 57 | shadows: [ 58 | Shadow(blurRadius: 2, color: Colors.lightBlueAccent), 59 | ], 60 | ), 61 | ) 62 | ], 63 | ), 64 | Row( 65 | mainAxisAlignment: MainAxisAlignment.center, 66 | children: [ 67 | DecoratedIcon( 68 | icon: Icon( 69 | Icons.home, 70 | color: Colors.green.shade900, 71 | size: 36, 72 | shadows: const [ 73 | Shadow(color: Colors.yellowAccent, blurRadius: 3), 74 | ], 75 | ), 76 | ), 77 | DecoratedIcon( 78 | icon: Icon( 79 | Icons.home, 80 | color: Colors.green.shade900, 81 | size: 36, 82 | shadows: [ 83 | Shadow(color: Colors.green.shade900, blurRadius: 3), 84 | ], 85 | ), 86 | ), 87 | DecoratedIcon( 88 | icon: Icon( 89 | Icons.home, 90 | color: Colors.green.shade900, 91 | size: 36, 92 | shadows: [ 93 | Shadow(color: Colors.green.shade900, blurRadius: 2), 94 | ], 95 | ), 96 | ) 97 | ], 98 | ), 99 | const Row( 100 | mainAxisAlignment: MainAxisAlignment.center, 101 | children: [ 102 | DecoratedIcon( 103 | icon: Icon( 104 | Icons.access_alarm, 105 | size: 36, 106 | shadows: [ 107 | Shadow( 108 | color: Color.fromARGB(255, 255, 234, 0), 109 | blurRadius: 3, 110 | ), 111 | ], 112 | ), 113 | ), 114 | DecoratedIcon( 115 | icon: Icon( 116 | Icons.access_alarm, 117 | size: 36, 118 | shadows: [ 119 | Shadow( 120 | color: Color.fromARGB(255, 239, 83, 80), 121 | blurRadius: 3, 122 | ), 123 | ], 124 | ), 125 | ), 126 | DecoratedIcon( 127 | icon: Icon( 128 | Icons.access_alarm, 129 | size: 36, 130 | shadows: [ 131 | Shadow( 132 | color: Color.fromARGB(255, 0, 229, 255), 133 | blurRadius: 3, 134 | ), 135 | ], 136 | ), 137 | ) 138 | ], 139 | ), 140 | const Row( 141 | mainAxisAlignment: MainAxisAlignment.center, 142 | children: [ 143 | DecoratedIcon( 144 | icon: Icon(Icons.favorite, size: 36), 145 | decoration: IconDecoration( 146 | border: IconBorder(color: Colors.yellow, width: 4), 147 | ), 148 | ), 149 | DecoratedIcon( 150 | icon: Icon( 151 | Icons.favorite, 152 | size: 36, 153 | shadows: [ 154 | Shadow(color: Colors.red, blurRadius: 6), 155 | ], 156 | ), 157 | decoration: IconDecoration( 158 | border: IconBorder(color: Colors.red, width: 4), 159 | ), 160 | ), 161 | DecoratedIcon( 162 | icon: Icon(Icons.favorite, size: 36, color: Colors.red), 163 | decoration: IconDecoration( 164 | border: IconBorder(color: Colors.cyan, width: 4), 165 | ), 166 | ), 167 | ], 168 | ) 169 | ], 170 | ), 171 | ), 172 | ), 173 | ); 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /example/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.18.0" 44 | cupertino_icons: 45 | dependency: "direct main" 46 | description: 47 | name: cupertino_icons 48 | sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.0.5" 52 | fake_async: 53 | dependency: transitive 54 | description: 55 | name: fake_async 56 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.3.1" 60 | flutter: 61 | dependency: "direct main" 62 | description: flutter 63 | source: sdk 64 | version: "0.0.0" 65 | flutter_lints: 66 | dependency: "direct dev" 67 | description: 68 | name: flutter_lints 69 | sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 70 | url: "https://pub.dev" 71 | source: hosted 72 | version: "1.0.4" 73 | flutter_test: 74 | dependency: "direct dev" 75 | description: flutter 76 | source: sdk 77 | version: "0.0.0" 78 | icon_decoration: 79 | dependency: "direct main" 80 | description: 81 | path: ".." 82 | relative: true 83 | source: path 84 | version: "2.1.0" 85 | leak_tracker: 86 | dependency: transitive 87 | description: 88 | name: leak_tracker 89 | sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" 90 | url: "https://pub.dev" 91 | source: hosted 92 | version: "10.0.5" 93 | leak_tracker_flutter_testing: 94 | dependency: transitive 95 | description: 96 | name: leak_tracker_flutter_testing 97 | sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" 98 | url: "https://pub.dev" 99 | source: hosted 100 | version: "3.0.5" 101 | leak_tracker_testing: 102 | dependency: transitive 103 | description: 104 | name: leak_tracker_testing 105 | sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" 106 | url: "https://pub.dev" 107 | source: hosted 108 | version: "3.0.1" 109 | lints: 110 | dependency: transitive 111 | description: 112 | name: lints 113 | sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c 114 | url: "https://pub.dev" 115 | source: hosted 116 | version: "1.0.1" 117 | matcher: 118 | dependency: transitive 119 | description: 120 | name: matcher 121 | sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb 122 | url: "https://pub.dev" 123 | source: hosted 124 | version: "0.12.16+1" 125 | material_color_utilities: 126 | dependency: transitive 127 | description: 128 | name: material_color_utilities 129 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 130 | url: "https://pub.dev" 131 | source: hosted 132 | version: "0.11.1" 133 | meta: 134 | dependency: transitive 135 | description: 136 | name: meta 137 | sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 138 | url: "https://pub.dev" 139 | source: hosted 140 | version: "1.15.0" 141 | path: 142 | dependency: transitive 143 | description: 144 | name: path 145 | sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" 146 | url: "https://pub.dev" 147 | source: hosted 148 | version: "1.9.0" 149 | sky_engine: 150 | dependency: transitive 151 | description: flutter 152 | source: sdk 153 | version: "0.0.99" 154 | source_span: 155 | dependency: transitive 156 | description: 157 | name: source_span 158 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 159 | url: "https://pub.dev" 160 | source: hosted 161 | version: "1.10.0" 162 | stack_trace: 163 | dependency: transitive 164 | description: 165 | name: stack_trace 166 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" 167 | url: "https://pub.dev" 168 | source: hosted 169 | version: "1.11.1" 170 | stream_channel: 171 | dependency: transitive 172 | description: 173 | name: stream_channel 174 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 175 | url: "https://pub.dev" 176 | source: hosted 177 | version: "2.1.2" 178 | string_scanner: 179 | dependency: transitive 180 | description: 181 | name: string_scanner 182 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 183 | url: "https://pub.dev" 184 | source: hosted 185 | version: "1.2.0" 186 | term_glyph: 187 | dependency: transitive 188 | description: 189 | name: term_glyph 190 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 191 | url: "https://pub.dev" 192 | source: hosted 193 | version: "1.2.1" 194 | test_api: 195 | dependency: transitive 196 | description: 197 | name: test_api 198 | sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" 199 | url: "https://pub.dev" 200 | source: hosted 201 | version: "0.7.2" 202 | vector_math: 203 | dependency: transitive 204 | description: 205 | name: vector_math 206 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 207 | url: "https://pub.dev" 208 | source: hosted 209 | version: "2.1.4" 210 | vm_service: 211 | dependency: transitive 212 | description: 213 | name: vm_service 214 | sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" 215 | url: "https://pub.dev" 216 | source: hosted 217 | version: "14.2.5" 218 | sdks: 219 | dart: ">=3.3.0 <4.0.0" 220 | flutter: ">=3.18.0-18.0.pre.54" 221 | -------------------------------------------------------------------------------- /assets/fonts/Roboto/LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _fe_analyzer_shared: 5 | dependency: transitive 6 | description: 7 | name: _fe_analyzer_shared 8 | sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "76.0.0" 12 | _macros: 13 | dependency: transitive 14 | description: dart 15 | source: sdk 16 | version: "0.3.3" 17 | alchemist: 18 | dependency: "direct dev" 19 | description: 20 | path: "." 21 | ref: ab1f2eb49584339be119eaec28a5562f6b325cbc 22 | resolved-ref: ab1f2eb49584339be119eaec28a5562f6b325cbc 23 | url: "https://github.com/Betterment/alchemist.git" 24 | source: git 25 | version: "0.7.0" 26 | analyzer: 27 | dependency: transitive 28 | description: 29 | name: analyzer 30 | sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" 31 | url: "https://pub.dev" 32 | source: hosted 33 | version: "6.11.0" 34 | analyzer_plugin: 35 | dependency: transitive 36 | description: 37 | name: analyzer_plugin 38 | sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" 39 | url: "https://pub.dev" 40 | source: hosted 41 | version: "0.11.3" 42 | args: 43 | dependency: transitive 44 | description: 45 | name: args 46 | sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 47 | url: "https://pub.dev" 48 | source: hosted 49 | version: "2.4.2" 50 | async: 51 | dependency: transitive 52 | description: 53 | name: async 54 | sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 55 | url: "https://pub.dev" 56 | source: hosted 57 | version: "2.12.0" 58 | boolean_selector: 59 | dependency: transitive 60 | description: 61 | name: boolean_selector 62 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 63 | url: "https://pub.dev" 64 | source: hosted 65 | version: "2.1.2" 66 | characters: 67 | dependency: transitive 68 | description: 69 | name: characters 70 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 71 | url: "https://pub.dev" 72 | source: hosted 73 | version: "1.4.0" 74 | checked_yaml: 75 | dependency: transitive 76 | description: 77 | name: checked_yaml 78 | sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff 79 | url: "https://pub.dev" 80 | source: hosted 81 | version: "2.0.3" 82 | ci: 83 | dependency: transitive 84 | description: 85 | name: ci 86 | sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13" 87 | url: "https://pub.dev" 88 | source: hosted 89 | version: "0.1.0" 90 | cli_util: 91 | dependency: transitive 92 | description: 93 | name: cli_util 94 | sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7 95 | url: "https://pub.dev" 96 | source: hosted 97 | version: "0.4.0" 98 | clock: 99 | dependency: transitive 100 | description: 101 | name: clock 102 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 103 | url: "https://pub.dev" 104 | source: hosted 105 | version: "1.1.2" 106 | collection: 107 | dependency: transitive 108 | description: 109 | name: collection 110 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 111 | url: "https://pub.dev" 112 | source: hosted 113 | version: "1.19.1" 114 | convert: 115 | dependency: transitive 116 | description: 117 | name: convert 118 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" 119 | url: "https://pub.dev" 120 | source: hosted 121 | version: "3.1.1" 122 | crypto: 123 | dependency: transitive 124 | description: 125 | name: crypto 126 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab 127 | url: "https://pub.dev" 128 | source: hosted 129 | version: "3.0.3" 130 | custom_lint: 131 | dependency: transitive 132 | description: 133 | name: custom_lint 134 | sha256: "22bd87a362f433ba6aae127a7bac2838645270737f3721b180916d7c5946cb5d" 135 | url: "https://pub.dev" 136 | source: hosted 137 | version: "0.5.11" 138 | custom_lint_builder: 139 | dependency: transitive 140 | description: 141 | name: custom_lint_builder 142 | sha256: "0d48e002438950f9582e574ef806b2bea5719d8d14c0f9f754fbad729bcf3b19" 143 | url: "https://pub.dev" 144 | source: hosted 145 | version: "0.5.14" 146 | custom_lint_core: 147 | dependency: transitive 148 | description: 149 | name: custom_lint_core 150 | sha256: "2952837953022de610dacb464f045594854ced6506ac7f76af28d4a6490e189b" 151 | url: "https://pub.dev" 152 | source: hosted 153 | version: "0.5.14" 154 | dart_style: 155 | dependency: transitive 156 | description: 157 | name: dart_style 158 | sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" 159 | url: "https://pub.dev" 160 | source: hosted 161 | version: "2.3.2" 162 | equatable: 163 | dependency: transitive 164 | description: 165 | name: equatable 166 | sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 167 | url: "https://pub.dev" 168 | source: hosted 169 | version: "2.0.5" 170 | fake_async: 171 | dependency: transitive 172 | description: 173 | name: fake_async 174 | sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" 175 | url: "https://pub.dev" 176 | source: hosted 177 | version: "1.3.2" 178 | fd_lints: 179 | dependency: "direct dev" 180 | description: 181 | name: fd_lints 182 | sha256: e334971843d1bde7e80653278b234996d4577e8c4c973d8f403dc2cbe124433a 183 | url: "https://pub.dev" 184 | source: hosted 185 | version: "2.4.0" 186 | file: 187 | dependency: transitive 188 | description: 189 | name: file 190 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" 191 | url: "https://pub.dev" 192 | source: hosted 193 | version: "7.0.0" 194 | flutter: 195 | dependency: "direct main" 196 | description: flutter 197 | source: sdk 198 | version: "0.0.0" 199 | flutter_test: 200 | dependency: "direct dev" 201 | description: flutter 202 | source: sdk 203 | version: "0.0.0" 204 | freezed_annotation: 205 | dependency: transitive 206 | description: 207 | name: freezed_annotation 208 | sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d 209 | url: "https://pub.dev" 210 | source: hosted 211 | version: "2.4.1" 212 | glob: 213 | dependency: transitive 214 | description: 215 | name: glob 216 | sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" 217 | url: "https://pub.dev" 218 | source: hosted 219 | version: "2.1.2" 220 | hotreloader: 221 | dependency: transitive 222 | description: 223 | name: hotreloader 224 | sha256: ed56fdc1f3a8ac924e717257621d09e9ec20e308ab6352a73a50a1d7a4d9158e 225 | url: "https://pub.dev" 226 | source: hosted 227 | version: "4.2.0" 228 | json_annotation: 229 | dependency: transitive 230 | description: 231 | name: json_annotation 232 | sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 233 | url: "https://pub.dev" 234 | source: hosted 235 | version: "4.8.1" 236 | leak_tracker: 237 | dependency: transitive 238 | description: 239 | name: leak_tracker 240 | sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec 241 | url: "https://pub.dev" 242 | source: hosted 243 | version: "10.0.8" 244 | leak_tracker_flutter_testing: 245 | dependency: transitive 246 | description: 247 | name: leak_tracker_flutter_testing 248 | sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 249 | url: "https://pub.dev" 250 | source: hosted 251 | version: "3.0.9" 252 | leak_tracker_testing: 253 | dependency: transitive 254 | description: 255 | name: leak_tracker_testing 256 | sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" 257 | url: "https://pub.dev" 258 | source: hosted 259 | version: "3.0.1" 260 | logging: 261 | dependency: transitive 262 | description: 263 | name: logging 264 | sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" 265 | url: "https://pub.dev" 266 | source: hosted 267 | version: "1.2.0" 268 | macros: 269 | dependency: transitive 270 | description: 271 | name: macros 272 | sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" 273 | url: "https://pub.dev" 274 | source: hosted 275 | version: "0.1.3-main.0" 276 | matcher: 277 | dependency: transitive 278 | description: 279 | name: matcher 280 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 281 | url: "https://pub.dev" 282 | source: hosted 283 | version: "0.12.17" 284 | material_color_utilities: 285 | dependency: transitive 286 | description: 287 | name: material_color_utilities 288 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 289 | url: "https://pub.dev" 290 | source: hosted 291 | version: "0.11.1" 292 | meta: 293 | dependency: "direct dev" 294 | description: 295 | name: meta 296 | sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c 297 | url: "https://pub.dev" 298 | source: hosted 299 | version: "1.16.0" 300 | package_config: 301 | dependency: transitive 302 | description: 303 | name: package_config 304 | sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" 305 | url: "https://pub.dev" 306 | source: hosted 307 | version: "2.1.0" 308 | path: 309 | dependency: transitive 310 | description: 311 | name: path 312 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 313 | url: "https://pub.dev" 314 | source: hosted 315 | version: "1.9.1" 316 | pub_semver: 317 | dependency: transitive 318 | description: 319 | name: pub_semver 320 | sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" 321 | url: "https://pub.dev" 322 | source: hosted 323 | version: "2.1.4" 324 | pubspec_parse: 325 | dependency: transitive 326 | description: 327 | name: pubspec_parse 328 | sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 329 | url: "https://pub.dev" 330 | source: hosted 331 | version: "1.2.3" 332 | rxdart: 333 | dependency: transitive 334 | description: 335 | name: rxdart 336 | sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" 337 | url: "https://pub.dev" 338 | source: hosted 339 | version: "0.27.7" 340 | sky_engine: 341 | dependency: transitive 342 | description: flutter 343 | source: sdk 344 | version: "0.0.0" 345 | source_span: 346 | dependency: transitive 347 | description: 348 | name: source_span 349 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" 350 | url: "https://pub.dev" 351 | source: hosted 352 | version: "1.10.1" 353 | stack_trace: 354 | dependency: transitive 355 | description: 356 | name: stack_trace 357 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 358 | url: "https://pub.dev" 359 | source: hosted 360 | version: "1.12.1" 361 | stream_channel: 362 | dependency: transitive 363 | description: 364 | name: stream_channel 365 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 366 | url: "https://pub.dev" 367 | source: hosted 368 | version: "2.1.4" 369 | stream_transform: 370 | dependency: transitive 371 | description: 372 | name: stream_transform 373 | sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" 374 | url: "https://pub.dev" 375 | source: hosted 376 | version: "2.1.0" 377 | string_scanner: 378 | dependency: transitive 379 | description: 380 | name: string_scanner 381 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 382 | url: "https://pub.dev" 383 | source: hosted 384 | version: "1.4.1" 385 | term_glyph: 386 | dependency: transitive 387 | description: 388 | name: term_glyph 389 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 390 | url: "https://pub.dev" 391 | source: hosted 392 | version: "1.2.2" 393 | test_api: 394 | dependency: transitive 395 | description: 396 | name: test_api 397 | sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd 398 | url: "https://pub.dev" 399 | source: hosted 400 | version: "0.7.4" 401 | typed_data: 402 | dependency: transitive 403 | description: 404 | name: typed_data 405 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c 406 | url: "https://pub.dev" 407 | source: hosted 408 | version: "1.3.2" 409 | universal_io: 410 | dependency: transitive 411 | description: 412 | name: universal_io 413 | sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" 414 | url: "https://pub.dev" 415 | source: hosted 416 | version: "2.2.2" 417 | uuid: 418 | dependency: transitive 419 | description: 420 | name: uuid 421 | sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" 422 | url: "https://pub.dev" 423 | source: hosted 424 | version: "3.0.7" 425 | vector_math: 426 | dependency: transitive 427 | description: 428 | name: vector_math 429 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 430 | url: "https://pub.dev" 431 | source: hosted 432 | version: "2.1.4" 433 | vm_service: 434 | dependency: transitive 435 | description: 436 | name: vm_service 437 | sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" 438 | url: "https://pub.dev" 439 | source: hosted 440 | version: "14.3.1" 441 | watcher: 442 | dependency: transitive 443 | description: 444 | name: watcher 445 | sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" 446 | url: "https://pub.dev" 447 | source: hosted 448 | version: "1.1.0" 449 | yaml: 450 | dependency: transitive 451 | description: 452 | name: yaml 453 | sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" 454 | url: "https://pub.dev" 455 | source: hosted 456 | version: "3.1.2" 457 | sdks: 458 | dart: ">=3.3.0 <4.0.0" 459 | flutter: ">=3.18.0-18.0.pre.54" 460 | --------------------------------------------------------------------------------