From 2687545e33516b2e7745827e5d7bbfaca936a77a Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 16 Jun 2026 19:14:14 +0200 Subject: [PATCH] use svg vector format --- analysis_options.yaml | 1 + .../verified_badge_1.svg.vec | Bin 0 -> 764 bytes .../verified_badge_2.svg.vec | Bin 0 -> 1160 bytes .../verified_badge_3.svg.vec | Bin 0 -> 1436 bytes assets/icons/verified_badge_green.svg.vec | Bin 0 -> 784 bytes assets/icons/verified_badge_red.svg.vec | Bin 0 -> 852 bytes .../verification_success_animation.comp.dart | 7 +- lib/src/visual/elements/svg_icon.element.dart | 25 ++++-- pubspec.lock | 2 +- pubspec.yaml | 1 + scripts/compile_svgs.dart | 79 ++++++++++++++++++ 11 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 assets/icons/verification_badge_numeric/verified_badge_1.svg.vec create mode 100644 assets/icons/verification_badge_numeric/verified_badge_2.svg.vec create mode 100644 assets/icons/verification_badge_numeric/verified_badge_3.svg.vec create mode 100644 assets/icons/verified_badge_green.svg.vec create mode 100644 assets/icons/verified_badge_red.svg.vec create mode 100644 scripts/compile_svgs.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 4f5e5b81..bf536544 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -19,6 +19,7 @@ analyzer: - "lib/core/**" - "lib/src/localization/**" - "rust_builder/" + - "scripts/" - "build/" - "dependencies/**" - "pubspec.yaml" diff --git a/assets/icons/verification_badge_numeric/verified_badge_1.svg.vec b/assets/icons/verification_badge_numeric/verified_badge_1.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..3e0567b4fb62a2b25b37be64c2e82528bba78985 GIT binary patch literal 764 zcmaKqPe@cz6o>C~N?f=QQIm?GQX)hs2Nx#HJBO%1T1-PEh?wZYNd#d)5JQy03PhxW zKrqThksFIF$00QX|1G2;$VJSQhzvvFs+2(s#`{eOLePW5dGDTcf8X!icbm%Z8RxVy zy-FM%TCPodj7g`D7-K4Jn5-L^^UvdX&PHR}^N(v_vcWC6UaZN!r@pmNu2w8v zj@VKr`wl0C?}$c)`pMX|&_D5OR7$fyxGS9l^7`?6H*n&H#M@`wQ)jE>PItoHN)-yh zJ8RVF8MnRcX-v#!G-BHgE}GjpBR&|Peg@9LB;$dMC+c{N+kQO5F3m1e*pJRvDf(^U z3kokhennw>Zq+GlzrR^wAFK!}?3&!5;{WP;i^6Wo3n}bKs!L(N{nKMl+9(+|88&s; z&9)zQ^=ga4Mh`anu;IZbcxR0oJ@m2%HX5+eL>tC_=AH*UQO6@}Ji}%N^q2{KW`xJg zusH+RoC$2s2sZx!Hviz_gu|_p{S#;*fju`VdSFbM0*ODFEvnYqY{E(j3&vM|} zHyNIbOa0(Sxm%PF|G+!RzrB&kuR^mjc4^+$rzDz+iq{*q>oIw;@KRPfzuW$2((!Op clD~%p&dq`c@@C0s@P41{`8jjUPH*q{E~d32RR910 literal 0 HcmV?d00001 diff --git a/assets/icons/verification_badge_numeric/verified_badge_2.svg.vec b/assets/icons/verification_badge_numeric/verified_badge_2.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a48a0cb036fbd320587f905b35c052516937bb89 GIT binary patch literal 1160 zcmbu9Ye08FCDp;5qaGRbx|7a4m3uezW10;I z^oO@e${a&CPZ9pN@h~CpG1ft-Z~0kGo|+l z-jT5IjCaVPrcr9KCw8*StTDD|&_i?4sw@yw=7@23wsS!(c~5#535I0Z9z@A)6$I|D&cv20P9!jlpi4KhIz{FK5cB zD2xa;BG|}-9WV7@hkQt6u%QPw^uY!XY%DzE9df8aE%ty74X~jJZ7}|3u6ckbcBiGF4(eV5x9?|Ags>3!uarGL_L~1$Owup9&>o}sIl$J8Qc(nW;O}^UBPVegI z))`+e?s-C1wZ1&JGDMmzA8rpblBvR5<~Bv6^bW{aWsITM&<4<~?->eWb>hp^2y{#NR7xqz__;oLV~D8O*^=^|U`f zK<;)6-7fNznl38&=E3JR`9xR)s-0Ah=;gfj| z#XUxfNw8;A#i;b{z(IzW=9pC2D|g>sJa$l3-v+ij-fW&gv_>2dYcf& zu&jqPq8+3Q8ym=a^f3hnwh}m6-HEK#ub`>2!MBni0Z%-X&Y56=AF995HN2OvluIx*CyD zO~#0vHCGn8CDLdk!1xiJ;4;XXmi=(I!-$mKu%V48ATj#9Z*%Lf{_D2yzR&Y~KhOL1 z{=UDT=So+-ZkVzR<0Wu74}SgVoW(Ha=28s3*I}5=Cewcmi(&ddf0lJ7!>Dw)P}Ef% zT>f|>qBV{ABfIR#9^BZi?qYL(a#VQVjkCgacjPl+{U^USi^tj@{NcGeX*+ZxSd{Uk z3{{4LUVo0f`r>HtkEtcX!D~L_8f)6MmhY5|_QfaD0rj_c7J$6Y_J=^W<>k#FyRdL8$ex#74zlmFmxKNvzPJr! zm&We`+1*onK=$$3Dm^g+oXO@)HrL7Cs`X^&4sQe5)FYevWRpiW2e0{zYph`{-yxeC zWK)ycWc-_X!vj5WogT@iXR^5m>Tyrh=N`%9p2=ngWHS@8nGxAM1G0GrSzD$=yHSo5 znAxRr&xj2Z=c;A4c_G%7}#)89$A!xD=+-2Ob3p>Gb!t9 zmx3OqH>F@l^qK?$%iwA?5PClY`xE1I&4aU3H{q+pUhM6&T#Jtc%FbJSV=p|EE}Hr_z6xN{1U=X`}ibWn%cjaXFQK8~$7| z8Pki*{3Y~HKVJVz-QPUT+ZW4#b<7}q#-saNto`GPWiggX?k#vWl!SzEyn1(Nk1fW= zwF{MN$8SwG)w0F3YPVa!!K_nOTTu7*W$74<)9>i2JeG4wJzSTB@Grvb1A$?=u-uA~ zJwwu%JYUcGM`;*epkBYxZ^o{DI}n?vH=Pi(?`BjV=oIET+x)To{k>J0E!w9ROkO{x z=WXa2HEI7$Yi*Neaz%UUL)E`5%#Likxm`0F5x=cVm{&qLBxIM24oXFDtBhs#%X?Sb zV`F!DxAdR>K+h6o$Waz#3dpz8zL=e5f((0v=~99#2}_cKj_57be=DQRxLi>JLjDHKJRz#bnm$ABHNt1 zq@4BFUmdH(oU7H=Ip?<9anWcb@}CoPbpH(8v+;pcvt}Q41)EQ-)uoYJnT5fmw!Ju1 zw3gRQ!;Zh>Cl{Z3k5Z*8z_Sv+oq_S@Yj!V8lnf}D=#z2Q=E)2@UEiv(ukCMF{7+9D zPr#yn4~L>lB5J!lnHayrIo~hAehFRW$jR$Nz@rLm)^KS++(I+EpGQ;K$_;Dxvxg$L8 z44WOmW+$-O5p2EzY`#IYkk*x4Nmg>7rCMmz(cCB5+1jK{@=*%0jkbq*uM1NpuS4N` z-;amy{CqsTV_K(Y`ftjvD^aic@=r-vJrRDFeEF`N?f)X3sd2BB++$zIxA}fjR~>E8 rc=%l2o@=ysC(Wb9>o3cdu=>mCt(q@Sd+kik2=$8P-MzuKWB>c#S1c}m literal 0 HcmV?d00001 diff --git a/assets/icons/verified_badge_red.svg.vec b/assets/icons/verified_badge_red.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..b5bfb4d97a48f542fa923d6e23790598c9c912ab GIT binary patch literal 852 zcmaKrPe@cz6vpqoso@b*O+gSflvyG}DWkK=f_dj4ZKA-2Rw5Roj1x$Ln<6NsD4a#P znZs}^Uz_uhBz_dEB#H`%5U6G|8} ztW?|>-w*S%(-_li%Q#Lb^q&eF2itLMqvK4m!VGNPqnW4O-o8`Yb@A%m^yk5-woV@_ zTPx7?jz!_Vtgi)s@7$!&Kfdxn8X_;ecjvFmqdU*MO#K;|ADHqQTiWE>#ftZ{x=kpq zd4@+%$@a45bme)FF<0yM$gH{d(lBOzWDdbZnE_=cd}f@t{mcxzA+ld#7u(yE{Qij} z3U8uxLSct5cPi|Tjvj@*zBR9~k4E##{3jRs6m~W?sIbe`3kv(m>X1EQqbO_?Ha_eg z+YkHj$3BHk9&GYq!-Gw6%`-fD=w%ITGGLQQHjICne`jDOd}f5r%&^%5dF+XN_6UzX z!{!WNb0)AkBiOtH*t`Q6_G^-^Q8&= 4) { return verifiedGreen; } - return 'assets/icons/verification_badge_numeric/verified_badge_$value.svg'; + return 'assets/icons/verification_badge_numeric/verified_badge_$value.svg.vec'; } } @@ -26,13 +28,24 @@ class SvgIcon extends StatelessWidget { @override Widget build(BuildContext context) { + final filter = color != null + ? ColorFilter.mode(color!, BlendMode.srcIn) + : null; + + if (assetPath.endsWith('.vec')) { + return SvgPicture( + AssetBytesLoader(assetPath), + width: size, + height: size, + colorFilter: filter, + ); + } + return SvgPicture.asset( assetPath, width: size, height: size, - colorFilter: color != null - ? ColorFilter.mode(color!, BlendMode.srcIn) - : null, + colorFilter: filter, ); } } diff --git a/pubspec.lock b/pubspec.lock index 6ed33552..e506b9cd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2047,7 +2047,7 @@ packages: source: hosted version: "1.1.13" vector_graphics_compiler: - dependency: transitive + dependency: "direct dev" description: name: vector_graphics_compiler sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74" diff --git a/pubspec.yaml b/pubspec.yaml index 683406db..cde64e93 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -181,6 +181,7 @@ dev_dependencies: drift_dev: ^2.25.2 flutter_launcher_icons: ^0.14.1 flutter_lints: ^6.0.0 + vector_graphics_compiler: ^1.2.0 flutter_test: sdk: flutter json_serializable: ^6.8.0 diff --git a/scripts/compile_svgs.dart b/scripts/compile_svgs.dart new file mode 100644 index 00000000..b891ebaa --- /dev/null +++ b/scripts/compile_svgs.dart @@ -0,0 +1,79 @@ +// ignore_for_file: avoid_print + +import 'dart:io'; + +Future main() async { + final iconsDir = Directory('assets/icons'); + if (!iconsDir.existsSync()) { + print( + 'Error: assets/icons directory does not exist at ${iconsDir.absolute.path}', + ); + exit(1); + } + + print('Locating SVG files recursively under assets/icons...'); + final svgFiles = []; + try { + await for (final entity in iconsDir.list(recursive: true)) { + if (entity is File && entity.path.endsWith('.svg')) { + svgFiles.add(entity); + } + } + } catch (e) { + print('Error while scanning directory: $e'); + exit(1); + } + + if (svgFiles.isEmpty) { + print('No SVG files found in assets/icons.'); + return; + } + + print('Found ${svgFiles.length} SVG file(s) to convert.'); + + var compiledCount = 0; + var failedCount = 0; + + for (final svgFile in svgFiles) { + final inputPath = svgFile.path; + final outputPath = '$inputPath.vec'; + + print('Compiling: $inputPath -> $outputPath'); + + // Run the vector_graphics_compiler tool + final result = await Process.run('dart', [ + 'run', + 'vector_graphics_compiler', + '-i', + inputPath, + '-o', + outputPath, + ]); + + if (result.exitCode == 0) { + print(' [Success] Compiled $outputPath'); + compiledCount++; + } else { + print( + ' [Error] Failed to compile $inputPath (Exit Code: ${result.exitCode})', + ); + if (result.stdout.toString().isNotEmpty) { + print(' stdout: ${result.stdout}'); + } + if (result.stderr.toString().isNotEmpty) { + print(' stderr: ${result.stderr}'); + } + failedCount++; + } + } + + print('\n----------------------------------------'); + print('Summary:'); + print(' Successfully compiled: $compiledCount'); + print(' Failed compilation: $failedCount'); + print('----------------------------------------'); + + if (failedCount > 0) { + exit(1); + } +}