[READ ONLY MIRROR] Open Source TikTok alternative built on AT Protocol github.com/sprksocial/client
flutter atproto video dart
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

style: icon changes

+512 -124
+2
assets/icons/like2.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M10.41 19.968C7.59 17.858 2 13.035 2 8.695c0-2.869 2.105-5.195 5-5.195 1.5 0 3 .5 5 2.5 2-2 3.5-2.5 5-2.5 2.895 0 5 2.326 5 5.195 0 4.34-5.59 9.164-8.41 11.273-.95.71-2.23.71-3.18 0" transform="translate(-0.5 0)"/></svg> 2 +
+462 -65
lib/src/core/design_system/components/atoms/icons.dart
··· 5 5 class AppIcons { 6 6 static const String _path = 'icons'; 7 7 8 - static Widget addPostFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/add_post_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 9 - static Widget addUser({double size = 24, Color? color}) => SvgPicture.asset('$_path/add_user.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 10 - static Widget add({double size = 24, Color? color}) => SvgPicture.asset('$_path/add.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 11 - static Widget arrowRight({double size = 24, Color? color}) => SvgPicture.asset('$_path/arrow_right.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 12 - static Widget at({double size = 24, Color? color}) => SvgPicture.asset('$_path/at.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 13 - static Widget attach({double size = 24, Color? color}) => SvgPicture.asset('$_path/attach.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 14 - static Widget bookmarkFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/bookmark_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 15 - static Widget bookmarkOutline({double size = 24, Color? color}) => SvgPicture.asset('$_path/bookmark_outline.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 16 - static Widget camera({double size = 24, Color? color}) => SvgPicture.asset('$_path/camera.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 17 - static Widget cancel({double size = 24, Color? color}) => SvgPicture.asset('$_path/cancel.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 18 - static Widget chevronDown({double size = 24, Color? color}) => SvgPicture.asset('$_path/chevron_down.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 19 - static Widget chevronleft({double size = 24, Color? color}) => SvgPicture.asset('$_path/chevronleft.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 20 - static Widget coin({double size = 24, Color? color}) => SvgPicture.asset('$_path/coin.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 21 - static Widget colors({double size = 24, Color? color}) => SvgPicture.asset('$_path/colors.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 22 - static Widget comment({double size = 24, Color? color}) => SvgPicture.asset('$_path/comment.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 23 - static Widget disk({double size = 24, Color? color}) => SvgPicture.asset('$_path/disk.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 24 - static Widget exploreFilled2({double size = 24, Color? color}) => SvgPicture.asset('$_path/explore_filled_2.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 25 - static Widget exploreFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/explore_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 26 - static Widget eyeMin({double size = 24, Color? color}) => SvgPicture.asset('$_path/eye_min.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 27 - static Widget filters({double size = 24, Color? color}) => SvgPicture.asset('$_path/filters.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 28 - static Widget folderMini({double size = 24, Color? color}) => SvgPicture.asset('$_path/folder_mini.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 29 - static Widget gallery({double size = 24, Color? color}) => SvgPicture.asset('$_path/gallery.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 30 - static Widget hashtag({double size = 24, Color? color}) => SvgPicture.asset('$_path/hashtag.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 31 - static Widget homeFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/home_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 32 - static Widget less({double size = 24, Color? color}) => SvgPicture.asset('$_path/less.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 33 - static Widget like({double size = 24, Color? color}) => SvgPicture.asset('$_path/like.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 34 - static Widget likeFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/like_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 35 - static Widget link2({double size = 24, Color? color}) => SvgPicture.asset('$_path/link2.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 36 - static Widget link({double size = 24, Color? color}) => SvgPicture.asset('$_path/link.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 37 - static Widget messagesFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/messages_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 38 - static Widget micro({double size = 24, Color? color}) => SvgPicture.asset('$_path/micro.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 39 - static Widget more1({double size = 24, Color? color}) => SvgPicture.asset('$_path/more1.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 40 - static Widget more2({double size = 24, Color? color}) => SvgPicture.asset('$_path/more2.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 41 - static Widget more21({double size = 24, Color? color}) => SvgPicture.asset('$_path/more21.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 42 - static Widget more({double size = 24, Color? color}) => SvgPicture.asset('$_path/more.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 43 - static Widget music({double size = 24, Color? color}) => SvgPicture.asset('$_path/music.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 44 - static Widget navbarExplore({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_explore.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 45 - static Widget navbarExploreFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_explore_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 46 - static Widget navbarHome({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_home.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 47 - static Widget navbarHomeFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_home_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 48 - static Widget navbarMessages({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_messages.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 49 - static Widget navbarMessagesFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_messages_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 50 - static Widget navbarPost({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_post.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 51 - static Widget navbarPostFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/navbar_post_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 52 - static Widget pin({double size = 24, Color? color}) => SvgPicture.asset('$_path/pin.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 53 - static Widget play1({double size = 24, Color? color}) => SvgPicture.asset('$_path/play1.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 54 - static Widget play({double size = 24, Color? color}) => SvgPicture.asset('$_path/play.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 55 - static Widget plusFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/plus_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 56 - static Widget plus({double size = 24, Color? color}) => SvgPicture.asset('$_path/plus.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 57 - static Widget profileCurate({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_curate.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 58 - static Widget profileGrid({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_grid.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 59 - static Widget profileGridFilled({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_grid_filled.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 60 - static Widget profileLiked({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_liked.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 61 - static Widget profileTagged({double size = 24, Color? color}) => SvgPicture.asset('$_path/profile_tagged.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 62 - static Widget search({double size = 24, Color? color}) => SvgPicture.asset('$_path/search.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 63 - static Widget send({double size = 24, Color? color}) => SvgPicture.asset('$_path/send.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 64 - static Widget share({double size = 24, Color? color}) => SvgPicture.asset('$_path/share.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 65 - static Widget smiley({double size = 24, Color? color}) => SvgPicture.asset('$_path/smiley.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 66 - static Widget tag({double size = 24, Color? color}) => SvgPicture.asset('$_path/tag.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 67 - static Widget typo({double size = 24, Color? color}) => SvgPicture.asset('$_path/typo.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 68 - static Widget verified({double size = 24, Color? color}) => SvgPicture.asset('$_path/verified.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 69 - static Widget volume({double size = 24, Color? color}) => SvgPicture.asset('$_path/volume.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 70 - static Widget sprkMatch({double size = 24, Color? color}) => SvgPicture.asset('$_path/sprk_match.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 71 - static Widget sideShare({double size = 24, Color? color}) => SvgPicture.asset('$_path/side_share.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 72 - static Widget sideCurate({double size = 24, Color? color}) => SvgPicture.asset('$_path/side_curate.svg', width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, package: 'assets'); 8 + static Widget addPostFilled({double size = 24, Color? color}) => SvgPicture.asset( 9 + '$_path/add_post_filled.svg', 10 + width: size, 11 + height: size, 12 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 13 + package: 'assets', 14 + ); 15 + static Widget addUser({double size = 24, Color? color}) => SvgPicture.asset( 16 + '$_path/add_user.svg', 17 + width: size, 18 + height: size, 19 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 20 + package: 'assets', 21 + ); 22 + static Widget add({double size = 24, Color? color}) => SvgPicture.asset( 23 + '$_path/add.svg', 24 + width: size, 25 + height: size, 26 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 27 + package: 'assets', 28 + ); 29 + static Widget arrowRight({double size = 24, Color? color}) => SvgPicture.asset( 30 + '$_path/arrow_right.svg', 31 + width: size, 32 + height: size, 33 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 34 + package: 'assets', 35 + ); 36 + static Widget at({double size = 24, Color? color}) => SvgPicture.asset( 37 + '$_path/at.svg', 38 + width: size, 39 + height: size, 40 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 41 + package: 'assets', 42 + ); 43 + static Widget attach({double size = 24, Color? color}) => SvgPicture.asset( 44 + '$_path/attach.svg', 45 + width: size, 46 + height: size, 47 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 48 + package: 'assets', 49 + ); 50 + static Widget bookmarkFilled({double size = 24, Color? color}) => SvgPicture.asset( 51 + '$_path/bookmark_filled.svg', 52 + width: size, 53 + height: size, 54 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 55 + package: 'assets', 56 + ); 57 + static Widget bookmarkOutline({double size = 24, Color? color}) => SvgPicture.asset( 58 + '$_path/bookmark_outline.svg', 59 + width: size, 60 + height: size, 61 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 62 + package: 'assets', 63 + ); 64 + static Widget camera({double size = 24, Color? color}) => SvgPicture.asset( 65 + '$_path/camera.svg', 66 + width: size, 67 + height: size, 68 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 69 + package: 'assets', 70 + ); 71 + static Widget cancel({double size = 24, Color? color}) => SvgPicture.asset( 72 + '$_path/cancel.svg', 73 + width: size, 74 + height: size, 75 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 76 + package: 'assets', 77 + ); 78 + static Widget chevronDown({double size = 24, Color? color}) => SvgPicture.asset( 79 + '$_path/chevron_down.svg', 80 + width: size, 81 + height: size, 82 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 83 + package: 'assets', 84 + ); 85 + static Widget chevronleft({double size = 24, Color? color}) => SvgPicture.asset( 86 + '$_path/chevronleft.svg', 87 + width: size, 88 + height: size, 89 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 90 + package: 'assets', 91 + ); 92 + static Widget coin({double size = 24, Color? color}) => SvgPicture.asset( 93 + '$_path/coin.svg', 94 + width: size, 95 + height: size, 96 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 97 + package: 'assets', 98 + ); 99 + static Widget colors({double size = 24, Color? color}) => SvgPicture.asset( 100 + '$_path/colors.svg', 101 + width: size, 102 + height: size, 103 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 104 + package: 'assets', 105 + ); 106 + static Widget comment({double size = 24, Color? color}) => SvgPicture.asset( 107 + '$_path/comment.svg', 108 + width: size, 109 + height: size, 110 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 111 + package: 'assets', 112 + ); 113 + static Widget disk({double size = 24, Color? color}) => SvgPicture.asset( 114 + '$_path/disk.svg', 115 + width: size, 116 + height: size, 117 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 118 + package: 'assets', 119 + ); 120 + static Widget exploreFilled2({double size = 24, Color? color}) => SvgPicture.asset( 121 + '$_path/explore_filled_2.svg', 122 + width: size, 123 + height: size, 124 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 125 + package: 'assets', 126 + ); 127 + static Widget exploreFilled({double size = 24, Color? color}) => SvgPicture.asset( 128 + '$_path/explore_filled.svg', 129 + width: size, 130 + height: size, 131 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 132 + package: 'assets', 133 + ); 134 + static Widget eyeMin({double size = 24, Color? color}) => SvgPicture.asset( 135 + '$_path/eye_min.svg', 136 + width: size, 137 + height: size, 138 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 139 + package: 'assets', 140 + ); 141 + static Widget filters({double size = 24, Color? color}) => SvgPicture.asset( 142 + '$_path/filters.svg', 143 + width: size, 144 + height: size, 145 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 146 + package: 'assets', 147 + ); 148 + static Widget folderMini({double size = 24, Color? color}) => SvgPicture.asset( 149 + '$_path/folder_mini.svg', 150 + width: size, 151 + height: size, 152 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 153 + package: 'assets', 154 + ); 155 + static Widget gallery({double size = 24, Color? color}) => SvgPicture.asset( 156 + '$_path/gallery.svg', 157 + width: size, 158 + height: size, 159 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 160 + package: 'assets', 161 + ); 162 + static Widget hashtag({double size = 24, Color? color}) => SvgPicture.asset( 163 + '$_path/hashtag.svg', 164 + width: size, 165 + height: size, 166 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 167 + package: 'assets', 168 + ); 169 + static Widget homeFilled({double size = 24, Color? color}) => SvgPicture.asset( 170 + '$_path/home_filled.svg', 171 + width: size, 172 + height: size, 173 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 174 + package: 'assets', 175 + ); 176 + static Widget less({double size = 24, Color? color}) => SvgPicture.asset( 177 + '$_path/less.svg', 178 + width: size, 179 + height: size, 180 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 181 + package: 'assets', 182 + ); 183 + static Widget like({double size = 24, Color? color}) => SvgPicture.asset( 184 + '$_path/like.svg', 185 + width: size, 186 + height: size, 187 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 188 + package: 'assets', 189 + ); 190 + static Widget likeFilled({double size = 24, Color? color}) => SvgPicture.asset( 191 + '$_path/like_filled.svg', 192 + width: size, 193 + height: size, 194 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 195 + package: 'assets', 196 + ); 197 + static Widget like2({double size = 24, Color? color}) => SvgPicture.asset( 198 + '$_path/like2.svg', 199 + width: size, 200 + height: size, 201 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 202 + package: 'assets', 203 + ); 204 + static Widget link2({double size = 24, Color? color}) => SvgPicture.asset( 205 + '$_path/link2.svg', 206 + width: size, 207 + height: size, 208 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 209 + package: 'assets', 210 + ); 211 + static Widget link({double size = 24, Color? color}) => SvgPicture.asset( 212 + '$_path/link.svg', 213 + width: size, 214 + height: size, 215 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 216 + package: 'assets', 217 + ); 218 + static Widget messagesFilled({double size = 24, Color? color}) => SvgPicture.asset( 219 + '$_path/messages_filled.svg', 220 + width: size, 221 + height: size, 222 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 223 + package: 'assets', 224 + ); 225 + static Widget micro({double size = 24, Color? color}) => SvgPicture.asset( 226 + '$_path/micro.svg', 227 + width: size, 228 + height: size, 229 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 230 + package: 'assets', 231 + ); 232 + static Widget more1({double size = 24, Color? color}) => SvgPicture.asset( 233 + '$_path/more1.svg', 234 + width: size, 235 + height: size, 236 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 237 + package: 'assets', 238 + ); 239 + static Widget more2({double size = 24, Color? color}) => SvgPicture.asset( 240 + '$_path/more2.svg', 241 + width: size, 242 + height: size, 243 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 244 + package: 'assets', 245 + ); 246 + static Widget more21({double size = 24, Color? color}) => SvgPicture.asset( 247 + '$_path/more21.svg', 248 + width: size, 249 + height: size, 250 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 251 + package: 'assets', 252 + ); 253 + static Widget more({double size = 24, Color? color}) => SvgPicture.asset( 254 + '$_path/more.svg', 255 + width: size, 256 + height: size, 257 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 258 + package: 'assets', 259 + ); 260 + static Widget music({double size = 24, Color? color}) => SvgPicture.asset( 261 + '$_path/music.svg', 262 + width: size, 263 + height: size, 264 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 265 + package: 'assets', 266 + ); 267 + static Widget navbarExplore({double size = 24, Color? color}) => SvgPicture.asset( 268 + '$_path/navbar_explore.svg', 269 + width: size, 270 + height: size, 271 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 272 + package: 'assets', 273 + ); 274 + static Widget navbarExploreFilled({double size = 24, Color? color}) => SvgPicture.asset( 275 + '$_path/navbar_explore_filled.svg', 276 + width: size, 277 + height: size, 278 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 279 + package: 'assets', 280 + ); 281 + static Widget navbarHome({double size = 24, Color? color}) => SvgPicture.asset( 282 + '$_path/navbar_home.svg', 283 + width: size, 284 + height: size, 285 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 286 + package: 'assets', 287 + ); 288 + static Widget navbarHomeFilled({double size = 24, Color? color}) => SvgPicture.asset( 289 + '$_path/navbar_home_filled.svg', 290 + width: size, 291 + height: size, 292 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 293 + package: 'assets', 294 + ); 295 + static Widget navbarMessages({double size = 24, Color? color}) => SvgPicture.asset( 296 + '$_path/navbar_messages.svg', 297 + width: size, 298 + height: size, 299 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 300 + package: 'assets', 301 + ); 302 + static Widget navbarMessagesFilled({double size = 24, Color? color}) => SvgPicture.asset( 303 + '$_path/navbar_messages_filled.svg', 304 + width: size, 305 + height: size, 306 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 307 + package: 'assets', 308 + ); 309 + static Widget navbarPost({double size = 24, Color? color}) => SvgPicture.asset( 310 + '$_path/navbar_post.svg', 311 + width: size, 312 + height: size, 313 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 314 + package: 'assets', 315 + ); 316 + static Widget navbarPostFilled({double size = 24, Color? color}) => SvgPicture.asset( 317 + '$_path/navbar_post_filled.svg', 318 + width: size, 319 + height: size, 320 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 321 + package: 'assets', 322 + ); 323 + static Widget pin({double size = 24, Color? color}) => SvgPicture.asset( 324 + '$_path/pin.svg', 325 + width: size, 326 + height: size, 327 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 328 + package: 'assets', 329 + ); 330 + static Widget play1({double size = 24, Color? color}) => SvgPicture.asset( 331 + '$_path/play1.svg', 332 + width: size, 333 + height: size, 334 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 335 + package: 'assets', 336 + ); 337 + static Widget play({double size = 24, Color? color}) => SvgPicture.asset( 338 + '$_path/play.svg', 339 + width: size, 340 + height: size, 341 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 342 + package: 'assets', 343 + ); 344 + static Widget plusFilled({double size = 24, Color? color}) => SvgPicture.asset( 345 + '$_path/plus_filled.svg', 346 + width: size, 347 + height: size, 348 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 349 + package: 'assets', 350 + ); 351 + static Widget plus({double size = 24, Color? color}) => SvgPicture.asset( 352 + '$_path/plus.svg', 353 + width: size, 354 + height: size, 355 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 356 + package: 'assets', 357 + ); 358 + static Widget profileCurate({double size = 24, Color? color}) => SvgPicture.asset( 359 + '$_path/profile_curate.svg', 360 + width: size, 361 + height: size, 362 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 363 + package: 'assets', 364 + ); 365 + static Widget profileGrid({double size = 24, Color? color}) => SvgPicture.asset( 366 + '$_path/profile_grid.svg', 367 + width: size, 368 + height: size, 369 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 370 + package: 'assets', 371 + ); 372 + static Widget profileGridFilled({double size = 24, Color? color}) => SvgPicture.asset( 373 + '$_path/profile_grid_filled.svg', 374 + width: size, 375 + height: size, 376 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 377 + package: 'assets', 378 + ); 379 + static Widget profileLiked({double size = 24, Color? color}) => SvgPicture.asset( 380 + '$_path/profile_liked.svg', 381 + width: size, 382 + height: size, 383 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 384 + package: 'assets', 385 + ); 386 + static Widget profileTagged({double size = 24, Color? color}) => SvgPicture.asset( 387 + '$_path/profile_tagged.svg', 388 + width: size, 389 + height: size, 390 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 391 + package: 'assets', 392 + ); 393 + static Widget search({double size = 24, Color? color}) => SvgPicture.asset( 394 + '$_path/search.svg', 395 + width: size, 396 + height: size, 397 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 398 + package: 'assets', 399 + ); 400 + static Widget send({double size = 24, Color? color}) => SvgPicture.asset( 401 + '$_path/send.svg', 402 + width: size, 403 + height: size, 404 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 405 + package: 'assets', 406 + ); 407 + static Widget share({double size = 24, Color? color}) => SvgPicture.asset( 408 + '$_path/share.svg', 409 + width: size, 410 + height: size, 411 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 412 + package: 'assets', 413 + ); 414 + static Widget smiley({double size = 24, Color? color}) => SvgPicture.asset( 415 + '$_path/smiley.svg', 416 + width: size, 417 + height: size, 418 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 419 + package: 'assets', 420 + ); 421 + static Widget tag({double size = 24, Color? color}) => SvgPicture.asset( 422 + '$_path/tag.svg', 423 + width: size, 424 + height: size, 425 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 426 + package: 'assets', 427 + ); 428 + static Widget typo({double size = 24, Color? color}) => SvgPicture.asset( 429 + '$_path/typo.svg', 430 + width: size, 431 + height: size, 432 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 433 + package: 'assets', 434 + ); 435 + static Widget verified({double size = 24, Color? color}) => SvgPicture.asset( 436 + '$_path/verified.svg', 437 + width: size, 438 + height: size, 439 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 440 + package: 'assets', 441 + ); 442 + static Widget volume({double size = 24, Color? color}) => SvgPicture.asset( 443 + '$_path/volume.svg', 444 + width: size, 445 + height: size, 446 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 447 + package: 'assets', 448 + ); 449 + static Widget sprkMatch({double size = 24, Color? color}) => SvgPicture.asset( 450 + '$_path/sprk_match.svg', 451 + width: size, 452 + height: size, 453 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 454 + package: 'assets', 455 + ); 456 + static Widget sideShare({double size = 24, Color? color}) => SvgPicture.asset( 457 + '$_path/side_share.svg', 458 + width: size, 459 + height: size, 460 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 461 + package: 'assets', 462 + ); 463 + static Widget sideCurate({double size = 24, Color? color}) => SvgPicture.asset( 464 + '$_path/side_curate.svg', 465 + width: size, 466 + height: size, 467 + colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, 468 + package: 'assets', 469 + ); 73 470 }
+1 -1
lib/src/core/design_system/components/atoms/toggles/follow_button.dart
··· 44 44 ) 45 45 : const BoxDecoration( 46 46 borderRadius: BorderRadius.all(Radius.circular(8)), 47 - color: AppColors.primary500, 47 + color: AppColors.primary600, 48 48 ), 49 49 child: Align( 50 50 child: Text(
+13 -6
lib/src/core/design_system/components/molecules/feed_card.dart
··· 2 2 import 'package:fluentui_system_icons/fluentui_system_icons.dart'; 3 3 import 'package:flutter/material.dart'; 4 4 import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; 5 + import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; 5 6 import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; 6 7 import 'package:sparksocial/src/core/design_system/tokens/shapes.dart'; 7 8 import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; ··· 158 159 Widget _buildMetaRow(BuildContext context) { 159 160 final likeCount = generator?.likeCount ?? 0; 160 161 final isDark = Theme.of(context).brightness == Brightness.dark; 162 + final isLiked = generator?.viewer?.like != null; 161 163 162 164 return Row( 163 165 mainAxisSize: MainAxisSize.min, 164 166 children: [ 165 - Icon( 166 - Icons.favorite, 167 - size: 14, 168 - color: generator?.viewer?.like != null ? AppColors.red500 : (isDark ? AppColors.grey200 : AppColors.grey400), 169 - ), 167 + if (isLiked) 168 + AppIcons.likeFilled( 169 + size: 14, 170 + color: AppColors.primary600, 171 + ) 172 + else 173 + AppIcons.like( 174 + size: 14, 175 + color: isDark ? AppColors.grey200 : AppColors.grey400, 176 + ), 170 177 const SizedBox(width: 4), 171 178 Text( 172 179 _formatCount(likeCount), ··· 181 188 final isDark = Theme.of(context).brightness == Brightness.dark; 182 189 final isPrimary = _isPrimaryAction; 183 190 final backgroundColor = isPrimary 184 - ? AppColors.primary500 191 + ? AppColors.primary600 185 192 : isDark 186 193 ? AppColors.darkGreyButton 187 194 : AppColors.lightGreyButton;
+6 -6
lib/src/core/design_system/components/molecules/post_tile.dart
··· 10 10 11 11 class PostTile extends StatelessWidget { 12 12 final String thumbnailUrl; 13 - final int views; 13 + final int likes; 14 14 final bool seen; 15 15 final bool nsfwBlur; 16 16 final VoidCallback onTap; 17 17 18 18 const PostTile({ 19 19 required this.thumbnailUrl, 20 - required this.views, 20 + required this.likes, 21 21 required this.seen, 22 22 required this.onTap, 23 23 this.nsfwBlur = false, ··· 118 118 mainAxisSize: MainAxisSize.min, 119 119 children: [ 120 120 Text( 121 - _formatViews(views), 121 + _formatViews(likes), 122 122 style: AppTypography.textExtraSmallMedium.copyWith( 123 123 color: AppColors.greyWhite, 124 - fontSize: 12, 124 + fontSize: 13, 125 125 ), 126 126 ), 127 127 const SizedBox(width: 4), 128 - AppIcons.eyeMin( 129 - size: 14, 128 + AppIcons.like2( 129 + size: 15, 130 130 color: AppColors.greyWhite, 131 131 ), 132 132 ],
+13 -8
lib/src/core/design_system/components/molecules/settings_feed_card.dart
··· 1 1 import 'package:fluentui_system_icons/fluentui_system_icons.dart'; 2 2 import 'package:flutter/material.dart'; 3 3 import 'package:sparksocial/src/core/design_system/components/atoms/buttons/interactive_pressable.dart'; 4 + import 'package:sparksocial/src/core/design_system/components/atoms/icons.dart'; 4 5 import 'package:sparksocial/src/core/design_system/tokens/colors.dart'; 5 6 import 'package:sparksocial/src/core/design_system/tokens/shapes.dart'; 6 7 import 'package:sparksocial/src/core/design_system/tokens/typography.dart'; ··· 215 216 216 217 Widget _buildLikeButton() { 217 218 if (_isTimeline) return const SizedBox.shrink(); // Don't show like button for timeline 218 - 219 + 219 220 return InteractivePressable( 220 221 onTap: _isLiked ? onUnlike : onLike, 221 222 borderRadius: BorderRadius.circular(6), 222 223 child: Container( 223 224 padding: const EdgeInsets.all(8), 224 225 decoration: BoxDecoration( 225 - color: _isLiked ? AppColors.red500 : Colors.transparent, 226 + color: _isLiked ? AppColors.primary600 : Colors.transparent, 226 227 borderRadius: BorderRadius.circular(6), 227 228 border: Border.all( 228 - color: _isLiked ? AppColors.red500 : (Colors.grey.withAlpha(100)), 229 + color: _isLiked ? AppColors.primary600 : (Colors.grey.withAlpha(100)), 229 230 ), 230 231 ), 231 - child: Icon( 232 - Icons.favorite, 233 - size: 16, 234 - color: _isLiked ? Colors.white : Colors.grey, 235 - ), 232 + child: _isLiked 233 + ? AppIcons.likeFilled( 234 + size: 16, 235 + color: Colors.white, 236 + ) 237 + : AppIcons.like( 238 + size: 16, 239 + color: Colors.grey, 240 + ), 236 241 ), 237 242 ); 238 243 }
+1 -1
lib/src/features/messages/ui/widgets/messages_list.dart
··· 565 565 aspectRatio: 9 / 16, 566 566 child: PostTile( 567 567 thumbnailUrl: thumbUrl ?? '', 568 - views: post.likeCount ?? 0, 568 + likes: post.likeCount ?? 0, 569 569 seen: false, 570 570 onTap: () => context.router.push(StandalonePostRoute(postUri: atUri)), 571 571 ),
+2 -2
lib/src/features/profile/ui/widgets/profile_grid_widget.dart
··· 214 214 final thumbnailUrl = widget.postView.thumbnailUrl; 215 215 216 216 // Use like count as a proxy for views, or 0 if not available 217 - final viewCount = widget.postView.likeCount ?? 0; 217 + final likeCount = widget.postView.likeCount ?? 0; 218 218 219 219 if (thumbnailUrl.isEmpty) { 220 220 return GestureDetector( ··· 231 231 children: [ 232 232 PostTile( 233 233 thumbnailUrl: thumbnailUrl, 234 - views: viewCount, 234 + likes: likeCount, 235 235 seen: false, 236 236 nsfwBlur: _shouldBlur, 237 237 onTap: widget.onTap,
+3 -3
lib/src/features/search/ui/pages/post_results.dart
··· 170 170 } 171 171 172 172 final post = state.searchResults[index]; 173 - 173 + 174 174 return FutureBuilder<bool>( 175 175 future: () async { 176 176 final labels = post.labels ?? []; ··· 178 178 }(), 179 179 builder: (context, snapshot) { 180 180 final shouldBlur = snapshot.data ?? false; 181 - 181 + 182 182 return PostTile( 183 183 thumbnailUrl: post.thumbnailUrl, 184 - views: post.likeCount ?? 0, 184 + likes: post.likeCount ?? 0, 185 185 seen: false, 186 186 nsfwBlur: shouldBlur, 187 187 onTap: () {
+2 -2
lib/src/features/sound/ui/pages/sound_page.dart
··· 167 167 @override 168 168 Widget build(BuildContext context) { 169 169 final thumbnailUrl = post.thumbnailUrl; 170 - final viewCount = post.likeCount ?? 0; 170 + final likeCount = post.likeCount ?? 0; 171 171 172 172 if (thumbnailUrl.isEmpty) { 173 173 return GestureDetector( ··· 181 181 182 182 return PostTile( 183 183 thumbnailUrl: thumbnailUrl, 184 - views: viewCount, 184 + likes: likeCount, 185 185 seen: false, 186 186 onTap: onTap, 187 187 );
+7 -30
widgetbook/lib/molecules/post_tile.dart
··· 9 9 Widget buildPostTileUseCase(BuildContext context) { 10 10 return Center( 11 11 child: SizedBox( 12 - width: context.knobs.double.slider( 13 - label: 'width', 14 - initialValue: 150, 15 - min: 100, 16 - max: 300, 17 - ), 18 - height: context.knobs.double.slider( 19 - label: 'height', 20 - initialValue: 200, 21 - min: 150, 22 - max: 400, 23 - ), 12 + width: context.knobs.double.slider(label: 'width', initialValue: 150, min: 100, max: 300), 13 + height: context.knobs.double.slider(label: 'height', initialValue: 200, min: 150, max: 400), 24 14 child: PostTile( 25 - thumbnailUrl: context.knobs.string( 26 - label: 'thumbnailUrl', 27 - initialValue: _demoThumbnail, 28 - ), 29 - views: context.knobs.int.slider( 30 - label: 'views', 31 - initialValue: 1239, 32 - min: 0, 33 - max: 100000, 34 - ), 15 + thumbnailUrl: context.knobs.string(label: 'thumbnailUrl', initialValue: _demoThumbnail), 16 + likes: context.knobs.int.slider(label: 'likes', initialValue: 1239, min: 0, max: 100000), 35 17 seen: context.knobs.boolean(label: 'seen', initialValue: false), 36 18 nsfwBlur: context.knobs.boolean(label: 'nsfwBlur', initialValue: false), 37 19 onTap: () => print('PostTile tapped'), ··· 48 30 height: 200, 49 31 child: PostTile( 50 32 thumbnailUrl: _demoThumbnail, 51 - views: context.knobs.int.slider( 52 - label: 'views', 53 - initialValue: 5420, 54 - min: 0, 55 - max: 100000, 56 - ), 33 + likes: context.knobs.int.slider(label: 'likes', initialValue: 5420, min: 0, max: 100000), 57 34 seen: true, 58 35 nsfwBlur: false, 59 36 onTap: () => print('Seen PostTile tapped'), ··· 70 47 height: 200, 71 48 child: PostTile( 72 49 thumbnailUrl: _demoThumbnail, 73 - views: context.knobs.int.input(label: 'views', initialValue: 1234567), 50 + likes: context.knobs.int.input(label: 'likes', initialValue: 1234567), 74 51 seen: context.knobs.boolean(label: 'seen', initialValue: false), 75 52 nsfwBlur: context.knobs.boolean(label: 'nsfwBlur', initialValue: false), 76 53 onTap: () => print('High views PostTile tapped'), ··· 94 71 itemBuilder: (context, index) { 95 72 return PostTile( 96 73 thumbnailUrl: 'https://picsum.photos/400/600?random=$index', 97 - views: (index + 1) * 1000, 74 + likes: (index + 1) * 1000, 98 75 seen: index % 3 == 0, 99 76 nsfwBlur: index % 5 == 0, 100 77 onTap: () => print('Grid PostTile $index tapped'),