From 2a5790042ee972863ce9b97f87f68fe7186577d4 Mon Sep 17 00:00:00 2001 From: Aliaksei Date: Mon, 6 Oct 2025 15:00:15 +0300 Subject: [PATCH 1/3] add vector_graphics package usage instead of flutter_svg --- example/pubspec.lock | 48 ------------------- .../create_edit_suggestion_bottom_sheet.dart | 22 +++------ .../pages/suggestion/suggestion_page.dart | 10 ++-- .../suggestions/widgets/list_description.dart | 10 ++-- .../widgets/suggestions_tab_bar.dart | 14 ++---- .../pages/widgets/add_event_photo_button.dart | 12 ++--- .../pages/widgets/avatar_widget.dart | 10 ++-- .../confirmation_bottom_sheet.dart | 24 +++------- .../edit_delete_bottom_sheet.dart | 24 +++------- lib/src/presentation/pages/widgets/fab.dart | 14 ++---- .../pages/widgets/icon_button.dart | 18 +++---- .../widgets/suggestions_back_button.dart | 15 ++---- .../pages/widgets/suggestions_icon.dart | 33 +++++++++++++ .../pages/widgets/votes_counter.dart | 14 ++---- pubspec.yaml | 7 ++- 15 files changed, 97 insertions(+), 178 deletions(-) create mode 100644 lib/src/presentation/pages/widgets/suggestions_icon.dart diff --git a/example/pubspec.lock b/example/pubspec.lock index 5365258..691b9de 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -1,14 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" async: dependency: transitive description: @@ -86,14 +78,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 - url: "https://pub.dev" - source: hosted - version: "2.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -187,22 +171,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.dev" - source: hosted - version: "6.1.0" sky_engine: dependency: transitive description: flutter @@ -287,14 +255,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.13" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" - url: "https://pub.dev" - source: hosted - version: "1.1.17" vector_math: dependency: transitive description: @@ -327,14 +287,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.5" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" sdks: dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.27.0" diff --git a/lib/src/presentation/pages/suggestion/create_edit/create_edit_suggestion_bottom_sheet.dart b/lib/src/presentation/pages/suggestion/create_edit/create_edit_suggestion_bottom_sheet.dart index 728e11f..0a5a241 100644 --- a/lib/src/presentation/pages/suggestion/create_edit/create_edit_suggestion_bottom_sheet.dart +++ b/lib/src/presentation/pages/suggestion/create_edit/create_edit_suggestion_bottom_sheet.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:suggest_a_feature/src/domain/entities/suggestion.dart'; import 'package:suggest_a_feature/src/presentation/di/injector.dart'; import 'package:suggest_a_feature/src/presentation/localization/localization_extensions.dart'; @@ -15,6 +14,7 @@ import 'package:suggest_a_feature/src/presentation/pages/widgets/network_image.d import 'package:suggest_a_feature/src/presentation/pages/widgets/photo_view.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/small_photo_preview.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/state_listener.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_labels.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_switch.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_text_field.dart'; @@ -256,14 +256,10 @@ class _LabelItems extends StatelessWidget { ), trailing: labels.isNotEmpty ? SuggestionLabels(labels: labels) - : SvgPicture.asset( + : SuggestionsIcon( AssetStrings.plusIconThickImage, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), - height: Dimensions.defaultSize, + color: context.theme.colorScheme.onSurface, + size: Dimensions.defaultSize, ), onClick: () => changeLabelsBottomSheetStatus(true), verticalPadding: Dimensions.marginDefault, @@ -521,14 +517,10 @@ class _AddButton extends StatelessWidget { context.theme.colorScheme.onSurface, ), ) - : SvgPicture.asset( + : SuggestionsIcon( AssetStrings.plusIconThickImage, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), - height: isSmall ? Dimensions.smallSize : Dimensions.defaultSize, + color: context.theme.colorScheme.onSurface, + size: isSmall ? Dimensions.smallSize : Dimensions.defaultSize, ), onClick: onUploadPhotos, verticalPadding: Dimensions.marginDefault, diff --git a/lib/src/presentation/pages/suggestion/suggestion_page.dart b/lib/src/presentation/pages/suggestion/suggestion_page.dart index 3b4dd0a..22590b1 100644 --- a/lib/src/presentation/pages/suggestion/suggestion_page.dart +++ b/lib/src/presentation/pages/suggestion/suggestion_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/domain/entities/admin_settings.dart'; import 'package:suggest_a_feature/src/domain/entities/comment.dart'; import 'package:suggest_a_feature/src/domain/entities/suggestion.dart'; @@ -20,6 +19,7 @@ import 'package:suggest_a_feature/src/presentation/pages/widgets/icon_button.dar import 'package:suggest_a_feature/src/presentation/pages/widgets/network_image.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/photo_view.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/state_listener.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_labels.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/votes_counter.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; @@ -834,13 +834,9 @@ class _UpvoteButton extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset( + SuggestionsIcon( AssetStrings.suggestionsUpvoteArrow, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onPrimary, - BlendMode.srcIn, - ), + color: context.theme.colorScheme.onPrimary, ), const SizedBox(width: Dimensions.marginSmall), Flexible( diff --git a/lib/src/presentation/pages/suggestions/widgets/list_description.dart b/lib/src/presentation/pages/suggestions/widgets/list_description.dart index 93c937f..edff41c 100644 --- a/lib/src/presentation/pages/suggestions/widgets/list_description.dart +++ b/lib/src/presentation/pages/suggestions/widgets/list_description.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:suggest_a_feature/src/presentation/localization/localization_extensions.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; import 'package:suggest_a_feature/suggest_a_feature.dart'; @@ -111,13 +111,9 @@ class ListDescription extends StatelessWidget { overflow: TextOverflow.ellipsis, ), ), - SvgPicture.asset( + SuggestionsIcon( AssetStrings.arrowDownIcon, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.primary, - BlendMode.srcIn, - ), + color: context.theme.colorScheme.primary, ), ], ), diff --git a/lib/src/presentation/pages/suggestions/widgets/suggestions_tab_bar.dart b/lib/src/presentation/pages/suggestions/widgets/suggestions_tab_bar.dart index f6d5246..fc1d659 100644 --- a/lib/src/presentation/pages/suggestions/widgets/suggestions_tab_bar.dart +++ b/lib/src/presentation/pages/suggestions/widgets/suggestions_tab_bar.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:suggest_a_feature/src/presentation/localization/localization_extensions.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; import 'package:suggest_a_feature/suggest_a_feature.dart'; @@ -109,15 +109,11 @@ class _TabIcon extends StatelessWidget { @override Widget build(BuildContext context) { return SizedBox( - child: SvgPicture.asset( + child: SuggestionsIcon( iconPath, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - isActive - ? context.theme.colorScheme.onSurface - : context.theme.colorScheme.onSurfaceVariant, - BlendMode.srcIn, - ), + color: isActive + ? context.theme.colorScheme.onSurface + : context.theme.colorScheme.onSurfaceVariant, ), ); } diff --git a/lib/src/presentation/pages/widgets/add_event_photo_button.dart b/lib/src/presentation/pages/widgets/add_event_photo_button.dart index 8be09d6..9f52eba 100644 --- a/lib/src/presentation/pages/widgets/add_event_photo_button.dart +++ b/lib/src/presentation/pages/widgets/add_event_photo_button.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/localization/localization_extensions.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/dotted_border.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; @@ -59,14 +59,10 @@ class _AddButton extends StatelessWidget { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset( + SuggestionsIcon( AssetStrings.addPhotoButton, - package: AssetStrings.packageName, - height: Dimensions.defaultSize, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + color: context.theme.colorScheme.onSurface, + size: Dimensions.defaultSize, ), Padding( padding: const EdgeInsets.only(top: Dimensions.marginSmall), diff --git a/lib/src/presentation/pages/widgets/avatar_widget.dart b/lib/src/presentation/pages/widgets/avatar_widget.dart index 9081e09..7f23319 100644 --- a/lib/src/presentation/pages/widgets/avatar_widget.dart +++ b/lib/src/presentation/pages/widgets/avatar_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/network_image.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; @@ -34,13 +34,9 @@ class AvatarWidget extends StatelessWidget { ? SuggestionsNetworkImage(url: avatar!) : Padding( padding: EdgeInsets.all(iconPadding), - child: SvgPicture.asset( + child: SuggestionsIcon( AssetStrings.profileIconImage, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + color: context.theme.colorScheme.onSurface, ), ), ), diff --git a/lib/src/presentation/pages/widgets/bottom_sheets/confirmation_bottom_sheet.dart b/lib/src/presentation/pages/widgets/bottom_sheets/confirmation_bottom_sheet.dart index f806749..6d1bce6 100644 --- a/lib/src/presentation/pages/widgets/bottom_sheets/confirmation_bottom_sheet.dart +++ b/lib/src/presentation/pages/widgets/bottom_sheets/confirmation_bottom_sheet.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/bottom_sheets/base_bottom_sheet.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/clickable_list_item.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; import 'package:wtf_sliding_sheet/wtf_sliding_sheet.dart'; @@ -144,15 +144,10 @@ class _Confirm extends StatelessWidget { Widget build(BuildContext context) { return ClickableListItem( onClick: onConfirm, - leading: SvgPicture.asset( + leading: SuggestionsIcon( onConfirmAsset, - package: AssetStrings.packageName, - width: Dimensions.defaultSize, - height: Dimensions.defaultSize, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.error, - BlendMode.srcIn, - ), + size: Dimensions.defaultSize, + color: context.theme.colorScheme.error, ), title: Text( onConfirmText, @@ -178,15 +173,10 @@ class _Cancel extends StatelessWidget { Widget build(BuildContext context) { return ClickableListItem( onClick: onCancel, - leading: SvgPicture.asset( + leading: SuggestionsIcon( AssetStrings.closeIconImage, - package: AssetStrings.packageName, - width: Dimensions.defaultSize, - height: Dimensions.defaultSize, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + size: Dimensions.defaultSize, + color: context.theme.colorScheme.onSurface, ), title: Text( onCancelText, diff --git a/lib/src/presentation/pages/widgets/bottom_sheets/edit_delete_bottom_sheet.dart b/lib/src/presentation/pages/widgets/bottom_sheets/edit_delete_bottom_sheet.dart index eb98787..6dccea2 100644 --- a/lib/src/presentation/pages/widgets/bottom_sheets/edit_delete_bottom_sheet.dart +++ b/lib/src/presentation/pages/widgets/bottom_sheets/edit_delete_bottom_sheet.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/localization/localization_extensions.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/bottom_sheets/base_bottom_sheet.dart'; import 'package:suggest_a_feature/src/presentation/pages/widgets/clickable_list_item.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/date_utils.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; @@ -99,15 +99,10 @@ class _EditItem extends StatelessWidget { localization.edit, style: context.theme.textTheme.titleMedium, ), - leading: SvgPicture.asset( + leading: SuggestionsIcon( AssetStrings.penIconImage, - package: AssetStrings.packageName, - height: Dimensions.defaultSize, - width: Dimensions.defaultSize, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + size: Dimensions.defaultSize, + color: context.theme.colorScheme.onSurface, ), onClick: onEditClick, ); @@ -130,15 +125,10 @@ class _DeleteItem extends StatelessWidget { color: context.theme.colorScheme.error, ), ), - leading: SvgPicture.asset( + leading: SuggestionsIcon( AssetStrings.deleteIconImage, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - context.theme.colorScheme.error, - BlendMode.srcIn, - ), - height: Dimensions.defaultSize, - width: Dimensions.defaultSize, + size: Dimensions.defaultSize, + color: context.theme.colorScheme.error, ), onClick: onDeleteClick, ); diff --git a/lib/src/presentation/pages/widgets/fab.dart b/lib/src/presentation/pages/widgets/fab.dart index cf452f3..fc75ea4 100644 --- a/lib/src/presentation/pages/widgets/fab.dart +++ b/lib/src/presentation/pages/widgets/fab.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; -import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; class SuggestionsFab extends StatefulWidget { @@ -90,15 +89,10 @@ class _SuggestionsFabState extends State ), ), Center( - child: SvgPicture.asset( + child: SuggestionsIcon( widget.imageIcon, - package: AssetStrings.packageName, - width: Dimensions.defaultSize, - height: Dimensions.defaultSize, - colorFilter: ColorFilter.mode( - widget.iconColor ?? context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + size: Dimensions.defaultSize, + color: widget.iconColor ?? context.theme.colorScheme.onSurface, ), ), ], diff --git a/lib/src/presentation/pages/widgets/icon_button.dart b/lib/src/presentation/pages/widgets/icon_button.dart index c228c21..144b2f9 100644 --- a/lib/src/presentation/pages/widgets/icon_button.dart +++ b/lib/src/presentation/pages/widgets/icon_button.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; -import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; class SuggestionsIconButton extends StatefulWidget { @@ -39,17 +38,12 @@ class _SuggestionsIconButtonState extends State { onTapCancel: () => _onTap(false), child: Padding( padding: widget.padding, - child: SvgPicture.asset( + child: SuggestionsIcon( widget.imageIcon, - package: AssetStrings.packageName, - width: widget.size, - height: widget.size, - colorFilter: ColorFilter.mode( - _pressed - ? theme.actionPressedColor - : widget.color ?? context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + size: widget.size, + color: _pressed + ? theme.actionPressedColor + : widget.color ?? context.theme.colorScheme.onSurface, ), ), ); diff --git a/lib/src/presentation/pages/widgets/suggestions_back_button.dart b/lib/src/presentation/pages/widgets/suggestions_back_button.dart index 0f246bd..bfd0fea 100644 --- a/lib/src/presentation/pages/widgets/suggestions_back_button.dart +++ b/lib/src/presentation/pages/widgets/suggestions_back_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; @@ -24,16 +24,11 @@ class SuggestionsBackButton extends StatelessWidget { left: Dimensions.marginDefault + Dimensions.marginMicro, right: Dimensions.marginMiddle, ), - child: SvgPicture.asset( + child: SuggestionsIcon( AssetStrings.backIconImage, - package: AssetStrings.packageName, - height: Dimensions.defaultSize, - width: Dimensions.defaultSize, - colorFilter: ColorFilter.mode( - context.theme.appBarTheme.iconTheme?.color ?? - context.theme.colorScheme.onSurface, - BlendMode.srcIn, - ), + size: Dimensions.defaultSize, + color: context.theme.appBarTheme.iconTheme?.color ?? + context.theme.colorScheme.onSurface, ), ), ); diff --git a/lib/src/presentation/pages/widgets/suggestions_icon.dart b/lib/src/presentation/pages/widgets/suggestions_icon.dart new file mode 100644 index 0000000..d00c8a6 --- /dev/null +++ b/lib/src/presentation/pages/widgets/suggestions_icon.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; +import 'package:vector_graphics/vector_graphics.dart'; + +class SuggestionsIcon extends StatelessWidget { + const SuggestionsIcon( + this.iconPath, { + this.size, + this.color, + this.fit, + super.key, + }); + + final String iconPath; + final double? size; + final Color? color; + final BoxFit? fit; + + @override + Widget build(BuildContext context) { + return VectorGraphic( + loader: AssetBytesLoader( + iconPath, + packageName: AssetStrings.packageName, + ), + width: size, + height: size, + colorFilter: + color != null ? ColorFilter.mode(color!, BlendMode.srcIn) : null, + fit: fit ?? BoxFit.contain, + ); + } +} diff --git a/lib/src/presentation/pages/widgets/votes_counter.dart b/lib/src/presentation/pages/widgets/votes_counter.dart index bc23fec..a5abd55 100644 --- a/lib/src/presentation/pages/widgets/votes_counter.dart +++ b/lib/src/presentation/pages/widgets/votes_counter.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:suggest_a_feature/src/presentation/pages/theme/theme_extension.dart'; +import 'package:suggest_a_feature/src/presentation/pages/widgets/suggestions_icon.dart'; import 'package:suggest_a_feature/src/presentation/utils/assets_strings.dart'; import 'package:suggest_a_feature/src/presentation/utils/dimensions.dart'; @@ -23,15 +23,11 @@ class VotesCounter extends StatelessWidget { SizedBox( height: Dimensions.bigSize, width: Dimensions.bigSize, - child: SvgPicture.asset( + child: SuggestionsIcon( AssetStrings.suggestionsUpvoteArrow, - package: AssetStrings.packageName, - colorFilter: ColorFilter.mode( - isVoted - ? context.theme.colorScheme.primary - : theme.upvoteArrowColor, - BlendMode.srcIn, - ), + color: isVoted + ? context.theme.colorScheme.primary + : theme.upvoteArrowColor, fit: BoxFit.none, ), ), diff --git a/pubspec.yaml b/pubspec.yaml index e44ee87..8f4ed8a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,16 +17,19 @@ dependencies: equatable: ^2.0.5 flutter: sdk: flutter - flutter_svg: ^2.0.9 intl: ^0.20.2 + vector_graphics: ^1.1.19 wtf_sliding_sheet: ^1.1.3 dev_dependencies: build_runner: ^2.4.7 flutter_test: sdk: flutter + vector_graphics_compiler: ^1.1.19 very_good_analysis: ^5.1.0 flutter: assets: - - assets/ + - path: assets/ + transformers: + - package: vector_graphics_compiler From b59a4e377a35e2203aa16f86c6ae8c603f5ee994 Mon Sep 17 00:00:00 2001 From: Aliaksei Date: Mon, 6 Oct 2025 21:04:09 +0300 Subject: [PATCH 2/3] add script for .svg files compilation --- CONTRIBUTING.md | 33 ++++++ assets/compiled/add_photo_icon.svg.vec | Bin 0 -> 540 bytes assets/compiled/arrow_down_icon.svg.vec | Bin 0 -> 84 bytes assets/compiled/arrow_left_icon.svg.vec | Bin 0 -> 84 bytes assets/compiled/arrow_up_suggestion.svg.vec | Bin 0 -> 176 bytes assets/compiled/check_icon.svg.vec | Bin 0 -> 84 bytes assets/compiled/close_icon.svg.vec | Bin 0 -> 111 bytes assets/compiled/delete_icon.svg.vec | Bin 0 -> 815 bytes assets/compiled/download_icon.svg.vec | Bin 0 -> 278 bytes assets/compiled/notifications_icon.svg.vec | Bin 0 -> 923 bytes assets/compiled/pen_icon.svg.vec | Bin 0 -> 910 bytes assets/compiled/plus_icon_thick.svg.vec | Bin 0 -> 111 bytes assets/compiled/plus_icon_thin.svg.vec | Bin 0 -> 111 bytes assets/compiled/profile_icon.svg.vec | Bin 0 -> 395 bytes assets/compiled/suggestions_completed.svg.vec | Bin 0 -> 2408 bytes assets/compiled/suggestions_declined.svg.vec | Bin 0 -> 815 bytes .../compiled/suggestions_duplicated.svg.vec | Bin 0 -> 1568 bytes .../compiled/suggestions_in_progress.svg.vec | Bin 0 -> 1263 bytes assets/compiled/suggestions_requests.svg.vec | Bin 0 -> 1151 bytes .../presentation/utils/assets_strings.dart | 44 +++++--- pubspec.yaml | 5 +- scripts/compile_svgs.dart | 104 ++++++++++++++++++ 22 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 assets/compiled/add_photo_icon.svg.vec create mode 100644 assets/compiled/arrow_down_icon.svg.vec create mode 100644 assets/compiled/arrow_left_icon.svg.vec create mode 100644 assets/compiled/arrow_up_suggestion.svg.vec create mode 100644 assets/compiled/check_icon.svg.vec create mode 100644 assets/compiled/close_icon.svg.vec create mode 100644 assets/compiled/delete_icon.svg.vec create mode 100644 assets/compiled/download_icon.svg.vec create mode 100644 assets/compiled/notifications_icon.svg.vec create mode 100644 assets/compiled/pen_icon.svg.vec create mode 100644 assets/compiled/plus_icon_thick.svg.vec create mode 100644 assets/compiled/plus_icon_thin.svg.vec create mode 100644 assets/compiled/profile_icon.svg.vec create mode 100644 assets/compiled/suggestions_completed.svg.vec create mode 100644 assets/compiled/suggestions_declined.svg.vec create mode 100644 assets/compiled/suggestions_duplicated.svg.vec create mode 100644 assets/compiled/suggestions_in_progress.svg.vec create mode 100644 assets/compiled/suggestions_requests.svg.vec create mode 100644 scripts/compile_svgs.dart diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c5f9dfb --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# Contributing to Suggest a Feature + +This document provides guidelines and information for developers working on this package. + +## Working with SVG Assets + +This package uses the `vector_graphics` package for rendering SVG icons. Because `vector_graphics` transformers don't work across package boundaries, we pre-compile all SVG assets into `.vec` format. + +### Adding or Modifying SVG Assets + +When you add new SVG files or modify existing ones in the `assets/` directory, you must re-compile them: + +**Step 1:** Add or update your SVG file in `assets/` + +**Step 2:** Run the compilation script: +```bash +dart run scripts/compile_svgs.dart +``` + +**Step 3:** Reference the compiled asset in code: +```dart +// In assets_strings.dart +static const String myIcon = 'assets/compiled/my_icon.svg.vec'; +``` + +### Why Pre-compilation is Required + +The `vector_graphics_compiler` package uses asset transformers that only work in application projects, not in library packages. By pre-compiling our SVG assets during development, we ensure that: +- Package users only need the `vector_graphics` runtime dependency +- Users don't need to add `vector_graphics_compiler` or configure transformers +- Assets are optimized for faster rendering + +**Important:** Always commit both the source `.svg` files and the compiled `.vec` files to the repository. diff --git a/assets/compiled/add_photo_icon.svg.vec b/assets/compiled/add_photo_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..1adccd3fa3c878be3431df625114d12622811da0 GIT binary patch literal 540 zcmZXQO(;ZB6vxkfZ$^WK+024xrfd{NB4qXMiIUlvo_UfK2`jQhStt>u6gG;okfw*& z&4MypW5Q-q6tl5WK2nO!T<6@0lykfHch3KubH9e`mO#`1BoJT+!-`A@6JSmPq-+4C z3L5-sf;0;NifDpCW>%0h;C@KQ_2ctMF)|%DgtzDKq=j(6&1$A|Ny&LSNpd|iox9Pb z)5uSfpQ2n=llwW(`~B>1fq(#z2}6%ca_@}>eCW>FNBtj?xmPlzd3W|?CmdHYkMpmZ z^{Nv&&c_#!>qfmb{4ZeeqR|p)$@v~<^Zo{gk zMW6LIAMBgKUGGvd0p4s2eE;6?RaP!r_GfWIUCGwv7_I~#r8(V&GbaMCJEHj1Sc+F; z4#qaiDDK6iD#xv+K^)1{YNi{TwLa>NW6ORuUIeEQPs5mbnb%ZR%UaKu(WEQ~hQtBI>9k(a| literal 0 HcmV?d00001 diff --git a/assets/compiled/arrow_down_icon.svg.vec b/assets/compiled/arrow_down_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..b504258d72273d5e097a1535f8600a5fda8c2a24 GIT binary patch literal 84 zcmYe&?O;uFgK1AF=4yXjE7XYlV5Ssu1 literal 0 HcmV?d00001 diff --git a/assets/compiled/arrow_left_icon.svg.vec b/assets/compiled/arrow_left_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..3b9450aa7e76ebf5a776d1067057e3413016e985 GIT binary patch literal 84 zcmYe&?OY5J><4 literal 0 HcmV?d00001 diff --git a/assets/compiled/arrow_up_suggestion.svg.vec b/assets/compiled/arrow_up_suggestion.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..40c9988c631b32cede429595d78a65ebc758bf56 GIT binary patch literal 176 zcmYe&?OhS#9*FB#np90gqb_)7~5YCr~JF@LA0RcH3txVe3zdii2fiJ2c}t%raFSu!|XEvTmSz*0G0tjXaE2J literal 0 HcmV?d00001 diff --git a/assets/compiled/check_icon.svg.vec b/assets/compiled/check_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..bf06db7dcde07e8bf608a2f66466f3790e4f5961 GIT binary patch literal 84 zcmYe&?O bsgO{|sUce(|Akz2WC{^=G>`+y{{IgEQfwC9 literal 0 HcmV?d00001 diff --git a/assets/compiled/close_icon.svg.vec b/assets/compiled/close_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..05e9fb13830343644f96f77b5684eb6b1f881d76 GIT binary patch literal 111 zcmYe&?O`A ik#)r?2WbXIBv}RqkT^&lqz)u+AP3U=|Gyj~m;wNt4;%yl literal 0 HcmV?d00001 diff --git a/assets/compiled/delete_icon.svg.vec b/assets/compiled/delete_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..496cd3635a044e1a4d94a7e0fb4a60413ac8e4b7 GIT binary patch literal 815 zcmYL|ZAep57{|}1mA3*d0-@PxptPbv4TRK%&tJj7q!*F`6^ivn64fVzzJxL?loTbj z7s0yGKye^A!=epF#lliore&17q@@@|Nc)no+j-7L-OF=-=XpQ(IUKL+y0B~)LX@%O znexdH!Zd9bAvQ{ruv)Da`KpgxSTZWuDtz_;W@;wLeI|_g-IMg7a{@hwK9CVMP?#U5 zNYPj1&KUIj{35RDzeuw!!kc4(5m>+huZDqr`oeGOrNtV`%+5 z^531N=#v%ddH$9z1UI0xFh&Ed1(F5vkaleXZ^=|HNP%WB&}CL4?dRmDya`E)+7dz@(0rK0U5*j0aR@2 zQq+UD!EsE^V{)C8Ka`FS;dK8UDV2-om~sm#z-#cas2H}j%^S+m zD=oSE9$k!Xhh;T}XTV%OnBg1bBXHP%x^(pld} z!}-co6qc=o#4u5?bdRJ2_h{v_qS8efWfqw0oI?g3xO}+h_x=68zu&p%9^YKX2@*Jt z+ex3;Fj)~C7Y>UB92ZZvIDzoLB@mJgfiQym%Ss~A?|p{ukO_0@0CxPUg6;8Z6sYPU zv5w+?bSt#BAfW@3b$$}>L|4u*HYM~xA$EcL(o1wbh#c%kbl(F!?H@q(Pz$mgP8@A) z#*=qWgw8ghh-eKNci@n@h|g`*l)0eO*CVsfg_+V?%+I-?klOGz!;QE{Rvf$RM#`>A zM0UC%X{*4S!yXKMHsiV71B1-S=pQ)4xKE;G@%DR%m_9a?!}9g{*(j2_p&m(RJ{ud; znD6&fJmPa*NYyJ?U;Qzutk20_Im~V+7PT@2EKbsg1Z&F&u>HJ<&G$Pv$xo!3ErnT^b@hV&}c=^m>6UiIrJEjbnSpSiq zUslLycIPt|iRFy1R6c(H!d9I2B=K}k(d-uf<_M`tIJbKcG)_tNlqWe2V^C3u=4KZX z*ImTY_l$F2A^mHi&o5;h3SUQ_G7prsDi!0Ulr@aqiWN*3To8ihQL0DIF*aLtpm9p7 zr=w$_pCvyrC*UIK-TQa*BINW{mE1ti+=t>$8zx>%p>VtcTKf!{!N_RZpkuUO z%|i+Q0jr$3ST3Eyo^ML{evYBan~tW3L5v2{uz0`+aYH)VZ}{-_L>8u7eXwh?Q9b5^ zF*64xNq)!+4nk-0WA>UF(_MbNcNCDi0ragbhRzZ|%r+yVMQLV?(v-8f@`#1$d#sf# nU+T4zJK;y-k7}%r_Ct2JhWSKk>X`4+T*(qTWjHJ${~o~~i=L0! literal 0 HcmV?d00001 diff --git a/assets/compiled/pen_icon.svg.vec b/assets/compiled/pen_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..5d3e62561de8a8168b30d206b46ee3262c558cbc GIT binary patch literal 910 zcmXw&dr(YK9LLYz6`}DqddY-##FVW+Dw%Y?O@;By7%D=$jh@sntqr|wDN}loMTC^X zw#Fn(4-KY9v*VARf0QO^ux(*fHZy5k=ichfJ@<3Z@Ao^u=UkafHW4`!Lj3q`Z)QtO zh}mo>BE*u3h=}9ZBX;1wNk2Hv5C}=5JdcXQ1QJ4N#R5H(Q+6H@cx+eSjJ{{ao+p35 z2j$1V3M6C@ydBT!dxPNpOzZhL)A8&?BC?PV&k4D(msrXlN1x~7dr}d#A1+0}_9@?e zn_s~gDW;$Mb%I=((}hE?8>#eZ4{Wr0I+oXi0HY;%N)lFMYeE+u*0_PUSKbZ8vK5W^ z6L$i+Ti!tJD8tna4cI>^gZ*Tkz_Gk(svYZas#%89HMPu_jQJ@+Qt$ytIxb_MgA>~0 zlM%bAn_Azv2ru^z%AfBY`$*dgQxR_4LTB@~BOI}wsf(2+ED_&rw)vhbm~Lx&1^g!x z;U8Uw9Mc)RjeCH0k^p5+3D)0?gUcrfI@@-T|S%zqBE4}wXNh1lYq=o?XC?lNHPz6wvu zDMD7MkS_5>K=38}^Y&r=PRD(XHzt0jz$?-NAL=eZp6bTxPJ(o|E2>=;%#SmAqt0T9 zVLe>U@lZ(CAdx!-z1#*37BOgySq{^96g(wMQ9BulYlDke%t&mmvBFem1e8JZu3tBmtfiJ1gD7~HqcP}l?mS2IFqXDb4~-7)ReFI#x*r0|3?sBTUxy=>f9b9e9h>DI zG^m@<8yJLE|0XQHdkAYy?^&H8;ELbD(^i9*D^;j+(ZY&Lha{p31BUZBr+oqsjS_*6 f9wWK+9L8@}B6C=Q*?CHZAIfZY5V0XMa031V9EfS> literal 0 HcmV?d00001 diff --git a/assets/compiled/plus_icon_thick.svg.vec b/assets/compiled/plus_icon_thick.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..07a634dd039f2afcd68035d02f992ade68d6091c GIT binary patch literal 111 zcmYe&?ObnSr6ffq{Vmi2whW1~Qm{n1PW6L^2dO040E`7Xh(@ Yqcj5}iY!D9p~gTCr04&CIYuxA0J?G%H~;_u literal 0 HcmV?d00001 diff --git a/assets/compiled/plus_icon_thin.svg.vec b/assets/compiled/plus_icon_thin.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..c3fcf6e729ddbc4fdc74f6d95b19533c80c711ea GIT binary patch literal 111 zcmYe&?OG}U(juA`&0BN2Sh5!Hn literal 0 HcmV?d00001 diff --git a/assets/compiled/profile_icon.svg.vec b/assets/compiled/profile_icon.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..695b8acdf3082cd58267d768adc00c6e9c39cefb GIT binary patch literal 395 zcmYe&?O6wviHVVkiCGEA{IgQZG2%bJBZ#&) z-Qci5%ER%)axDkF|Mg&6_|t4Kow{lhSRO=!)PL^VHBGpnz=I^wI!MzWl#Ep>1)@7!QxkHKRRSGEO7ig|FXjzmo;EIBzY&8=4m?S z2$E-7eaX>ifw1Gz1-BhF>I@y*mp^rUurI=qY4t0|=|F#i=$HkQ!SoJ?Nt)h3u4$00he0{p|CJvxflz$ zT!JQJk=tkyAa)zG2x^A$hs1RhZN?EOvzwzpIwMV)Z08*Ks=qO_`|zCeob#Ob?8~<# ztt(U1)r!)B{CcLhx7Vdp6qhSNRg`54{kXZQZv0Xi=HBI3dZUQ$BuU27f*{RUfsN7O zpiEa|+s0&2hib4mzC>`_VyEC|<(-m0SI{l`;j$9^Amm#}3n@qJxlHK5MdcR+UsqZL zbp;N|x0L4q>qmQH;Yvsmu27dk#zeAU)3jOQZ|p{F2&sY24cqYUcsblo+l6~PPQpRM z9_*{Dfx@VG{Jp0c8hw+=*AAP`S@741W8fa2i3@(qhjb-JaMQV?g6{E!l5d(W5`CKS zI5zrL(mXcerv&Hbv|+|XJDuq`9-aOaSf4S`1(uK;yjn0y{#Nq81xfnX&|$tKxG#7{ z;!lr1Cd|XiDFy#(&&9%V6;B1{2=>)w2`1??C7+~EN7lzENjTFp4Tr;;AuOZ>w=J%L z;f^xe`w_wT`|%Rb@Y@NeEho^Y0g2lLPsbe-9I+H2=hcZL$odgW4yK0ez~yQW&4=W3 z9%`ev;^#YCq2I6-+io~v;dMZpUoG(Gof?%yeN?Eoreol9w@qQbM+CV)b9IP)RTy@b zp>{t4R8{ewyHk93RNZnWilUuMJEwMTZ4cUBv_0`Yc@Ml#-lMixZO_{0-EZDSx^hUK ziW1~=@jW<5=W&>wg8PD7|2eNVM}X?4gz#YV7oP9?+)KxQ4)V7k@45n3Db4vhydGQ& zyMx`)&qDiYcgL8HS~za@5RB9>5PUS?g!ir3{0^kPL5yj>0R!5mYw{E#|F)39ii&cNmQ1J52e-z;&M80q`F6 zYcU6k4BXM zC!uh#4`N~$Nqu&TC&fqLVwVo?L|y~t?02y%K>V5WJeJ+ zo&3FUmCuWiSf)_jUb=^~z}V?}1RRfc{z2#5PIKP@t~)V4N$1NV-4y9^1=*kD5s?+5 z%gZm7y0&(^^kL+_9A_Wav9C6FfZ{%XAO3wZ%snCK`S72|gWLS`VbJBEZ`T8OsACQd z76+;mi8!Elpj%HO4!Ue;vBcy0@mGa^lb=oe04C|Pg!h{>ss1Glb*5u#R01YXrBOUi zc)c~2_+dO9hr*4<^^zYNTsyB{gIqt{u}b=d`L3jRHuYH{ejBG(h<|F-TA7Er%TOVC zgS8Tw&zh^G-est!xz=E4SvAGilCB!rFSM*e{F(DSoL48}ByX`KNIlP=(p^cqM64UH zkbP)-;qwm-?jT*U;2~!*_1}SYQ^gqOyOZWBrM|nUu7vy|X^$mTA0as00TQpbnnY(b zZkD=w=kwA}QMQoIM*1z3w;{*Zj~7y(&3G!Zi29o7d$)+r2ZG#}iH!gN literal 0 HcmV?d00001 diff --git a/assets/compiled/suggestions_declined.svg.vec b/assets/compiled/suggestions_declined.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..8d6da2b3e06a9464a74eb64e54dbde7e345dcf67 GIT binary patch literal 815 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 HRRVqkT`zVM literal 0 HcmV?d00001 diff --git a/lib/src/presentation/utils/assets_strings.dart b/lib/src/presentation/utils/assets_strings.dart index bea6f50..4fdf599 100644 --- a/lib/src/presentation/utils/assets_strings.dart +++ b/lib/src/presentation/utils/assets_strings.dart @@ -1,25 +1,33 @@ class AssetStrings { static const String packageName = 'suggest_a_feature'; - static const String arrowDownIcon = 'assets/arrow_down_icon.svg'; - static const String addPhotoButton = 'assets/add_photo_icon.svg'; - static const String backIconImage = 'assets/arrow_left_icon.svg'; - static const String checkIconImage = 'assets/check_icon.svg'; - static const String closeIconImage = 'assets/close_icon.svg'; - static const String deleteIconImage = 'assets/delete_icon.svg'; - static const String downloadIconImage = 'assets/download_icon.svg'; - static const String notificationsIconImage = 'assets/notifications_icon.svg'; - static const String penIconImage = 'assets/pen_icon.svg'; - static const String profileIconImage = 'assets/profile_icon.svg'; - static const String plusIconThinImage = 'assets/plus_icon_thin.svg'; - static const String plusIconThickImage = 'assets/plus_icon_thick.svg'; + static const String arrowDownIcon = 'assets/compiled/arrow_down_icon.svg.vec'; + static const String addPhotoButton = 'assets/compiled/add_photo_icon.svg.vec'; + static const String backIconImage = 'assets/compiled/arrow_left_icon.svg.vec'; + static const String checkIconImage = 'assets/compiled/check_icon.svg.vec'; + static const String closeIconImage = 'assets/compiled/close_icon.svg.vec'; + static const String deleteIconImage = 'assets/compiled/delete_icon.svg.vec'; + static const String downloadIconImage = + 'assets/compiled/download_icon.svg.vec'; + static const String notificationsIconImage = + 'assets/compiled/notifications_icon.svg.vec'; + static const String penIconImage = 'assets/compiled/pen_icon.svg.vec'; + static const String profileIconImage = 'assets/compiled/profile_icon.svg.vec'; + static const String plusIconThinImage = + 'assets/compiled/plus_icon_thin.svg.vec'; + static const String plusIconThickImage = + 'assets/compiled/plus_icon_thick.svg.vec'; - static const String suggestionsRequests = 'assets/suggestions_requests.svg'; + static const String suggestionsRequests = + 'assets/compiled/suggestions_requests.svg.vec'; static const String suggestionsInProgress = - 'assets/suggestions_in_progress.svg'; - static const String suggestionsCompleted = 'assets/suggestions_completed.svg'; - static const String suggestionsDeclined = 'assets/suggestions_declined.svg'; + 'assets/compiled/suggestions_in_progress.svg.vec'; + static const String suggestionsCompleted = + 'assets/compiled/suggestions_completed.svg.vec'; + static const String suggestionsDeclined = + 'assets/compiled/suggestions_declined.svg.vec'; static const String suggestionsDuplicated = - 'assets/suggestions_duplicated.svg'; - static const String suggestionsUpvoteArrow = 'assets/arrow_up_suggestion.svg'; + 'assets/compiled/suggestions_duplicated.svg.vec'; + static const String suggestionsUpvoteArrow = + 'assets/compiled/arrow_up_suggestion.svg.vec'; } diff --git a/pubspec.yaml b/pubspec.yaml index 8f4ed8a..73919d4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,6 +30,5 @@ dev_dependencies: flutter: assets: - - path: assets/ - transformers: - - package: vector_graphics_compiler + - assets/ + - assets/compiled/ diff --git a/scripts/compile_svgs.dart b/scripts/compile_svgs.dart new file mode 100644 index 0000000..01c4136 --- /dev/null +++ b/scripts/compile_svgs.dart @@ -0,0 +1,104 @@ +// ignore_for_file: avoid_print + +/// Compiles all SVG assets to .vec format for vector_graphics package. +/// +/// This script processes all SVG files in the assets/ directory and generates +/// corresponding .vec files in assets/compiled/. +/// +/// Run this script whenever SVG files are added or modified: +/// dart run scripts/compile_svgs.dart +/// +/// Why this is needed: +/// The vector_graphics package requires pre-compiled .vec files when used in +/// a library package. The asset transformer approach only works in +/// applications, not across package boundaries. + +library; + +import 'dart:io'; + +const String _assetsPath = 'assets'; +const String _compiledRelativePath = 'compiled'; +const String _compiledPath = '$_assetsPath/$_compiledRelativePath'; + +void main() async { + final assetsDir = Directory(_assetsPath); + final compiledDir = Directory(_compiledPath); + + // Ensure compiled directory exists + if (!compiledDir.existsSync()) { + await compiledDir.create(recursive: true); + print('Created $_compiledPath/ directory'); + } + + // Find all SVG files + final svgFiles = []; + await for (final entity in assetsDir.list()) { + if (entity is File && entity.path.endsWith('.svg')) { + svgFiles.add(entity); + } + } + + if (svgFiles.isEmpty) { + print('No SVG files found in $_assetsPath/'); + return; + } + + print('Found ${svgFiles.length} SVG file(s) to compile...\n'); + + // Compile all SVG files in parallel + final compilationTasks = >[]; + + for (final svgFile in svgFiles) { + final fileName = svgFile.uri.pathSegments.last; + final inputPath = svgFile.path; + final outputPath = + '${compiledDir.path}${Platform.pathSeparator}$fileName.vec'; + + compilationTasks.add(_compileSvg(fileName, inputPath, outputPath)); + } + + // Wait for all compilations to complete and count results + final results = await Future.wait(compilationTasks); + final successCount = results.where((success) => success).length; + final errorCount = results.where((success) => !success).length; + + print('\n─────────────────────────────────────'); + print('Compilation complete!'); + print('Success: $successCount | Errors: $errorCount'); + print('─────────────────────────────────────'); +} + +/// Compiles a single SVG file to .vec format. +/// Prints the result immediately and returns true on success, false on error. +Future _compileSvg( + String fileName, + String inputPath, + String outputPath, +) async { + try { + final result = await Process.run( + 'dart', + [ + 'run', + 'vector_graphics_compiler', + '-i', + inputPath, + '-o', + outputPath, + ], + ); + + if (result.exitCode == 0) { + print('✓ $fileName -> $_compiledRelativePath/$fileName.vec'); + return true; + } else { + final error = result.stderr.toString().trim(); + print('✗ $fileName - Error: $error'); + return false; + } + } catch (e) { + print('✗ $fileName - Error: $e'); + return false; + } +} From f7283141572f2b8ec72593440b4153327b78cc31 Mon Sep 17 00:00:00 2001 From: Aliaksei Date: Tue, 7 Oct 2025 16:31:08 +0300 Subject: [PATCH 3/3] fix warnings --- scripts/compile_svgs.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/compile_svgs.dart b/scripts/compile_svgs.dart index 01c4136..321ad26 100644 --- a/scripts/compile_svgs.dart +++ b/scripts/compile_svgs.dart @@ -1,3 +1,4 @@ +// Script needs print for CLI progress/output // ignore_for_file: avoid_print /// Compiles all SVG assets to .vec format for vector_graphics package. @@ -97,7 +98,7 @@ Future _compileSvg( print('✗ $fileName - Error: $error'); return false; } - } catch (e) { + } on Exception catch (e) { print('✗ $fileName - Error: $e'); return false; }