From 607fc8b7151a318b3abc7658763ff3c8edf4bd5b Mon Sep 17 00:00:00 2001 From: nsamuelreddy Date: Sat, 20 Dec 2025 18:45:38 +0530 Subject: [PATCH 1/2] icons: Add 'archive', custom Zulip design Custom archive icon provided by Karl Stolley for Zulip mobile. Design discussion: https://chat.zulip.org/#narrow/channel/530-mobile-design/topic/archived-channel.20icon/near/1966830 --- assets/icons/ZulipIcons.ttf | Bin 17968 -> 18208 bytes assets/icons/archive.svg | 6 ++ lib/widgets/icons.dart | 122 ++++++++++++++++++------------------ 3 files changed, 68 insertions(+), 60 deletions(-) create mode 100644 assets/icons/archive.svg diff --git a/assets/icons/ZulipIcons.ttf b/assets/icons/ZulipIcons.ttf index 4fa457ba54b862cf9e1a21f1b00a440eeede421b..6089bac678c3dd4c259eee0e88ca89d52351db3f 100644 GIT binary patch delta 2484 zcmbVOYiv_x7=FLg)3a`CcPZ`GGN@ZGQ*jEEZh-4$Yqz%Rx?6WqNtBhb8|(&*G5A4= z;(ib?!A7#5#-K6&FvJl;a507uVhlfk7@~g+5={&tMhr0~4CnKnp33m2>)yWK_kPcN zd*1Jy?ZRpC;d>%Of{2Rg1nFo?thYb>&egY15s4i{`oXT=&EA2VeRV|2B2a@vlj)gH zx0-$>GIYaMJvwo8hSPiJe!2Dquy-L1V=x$mJb?8w#631SJAePm z>I!`SLXOubriTLQkH25MPgF7kz~__c`57@K8gOXCzIrM>Ic&Y$unJHUwNnUd88kgbJhdyZC-Cu8 z5V%(OHBo#F0VFC~;}BIt$53qntPE|UW}x)gbE2f0C}aMM^D}I%@-kgz7$TKUzd^LnWB5h3=5~s@ycx*(6%3Khf$25 z3PD`nJ5!EL9B}S`9R?KvQ@tva4yr;*KiqjVO=`F}bdWY6MBbj~UdF`MQ!RO^8dHg> z33$*6+K3FDz_%m41M3)dAWIKDhitJ7W*)%}GLQ|UtAJ~-N__O_`3ALCxVz^s-%p9Wn5*T1+^K` zfgeW$)SwO`01)4V6utvsf@ysfowi{0taS%cF?Y;QlC~pOezy~Ark#1@f^2BO080dA zqORAvW=$IyX9h3MM{_#hp`%jGmJ(ns_Pp2=J(EeONOxio%mxQ{5+t51?2R_!T5 zG`4#YEd(5+d596j-GcOC_$9E`Umc>2&PF(QT1F$9h@se=g{ijCi)v%}(QN`gj`Jk&rE2*bb8nL{%>2?~E;`f@ zDUzixv!|7iXw2SFoYLy*(gS5kY_`A^KcWOZ^QsQI2rpQ^s`s!j0=W`CyJ?(`J#5S# zH@LR7B2@=Q6-A+K$ieTgE@bRPxqM6dz+)2GyYaSY!IRNT{n_sfhxLufqhxOtrZ*r$ zM=%<0YY)LQ-WiLe`U1&BcXLZmZ$ALXv%eP@vRy?AUT3+VeyH7=v_hvf@k8&?qyu_L zlOXh7O`_1lnuMW8G--n#)ubJIOp_4wcuq3tjA*|mUC4curBnCaLNd%hz zn6acF2Q=w}KB!3m`j93`=vhq?(1*b$z6eAT{xapH8TyDOEzt9t^gtigq!;>_CjCq2 zimynShajJYSeUaJ`iAa^l=xcOBrQtI(%-tE?xgOf?vY#}pOk;rpHpOIR=Hg;P;j~6 zUg2!vrJ{MEm>r3WJ{wVd9UN3W&b(TFUcbD%oZ!!<8`^_?E z`PRD2`jvI1;(DdIa>14{+Rock|L22Z<<(Vuk?uAwc@^GQ80b2uvQbznw$*qW0>W48 z(${#gchxwtt8^;Xa*IRYFevKFeYMzU$}I{`Yk8}8Dwc{y;cbB5E>C^EN0;R9m5aKh zUcYit?=#yyA-Cjnhdg$d-C=!l!|JdLgV|;?FPrUlv+kD9bA~<6czpfx85zGH*v(HK zdx9SPN_xgTd2Dq!th`>fyX|(jurIBY?DXM3l7`4<#o{$8NFN*;8=o6q`YBQ+d56T9 r7#DM5SWJr}Vz=0fe|;vzh?o_l;*i)QCdGbnSj>wVaa0@-JlcN%s!e~y delta 2250 zcma)8OKenS6#o7@x6_%vrY%z_53!b75J8~S@|gFtoj#_oDJDi~hdv3Nc7Or}6NeBN zEQo3;}Lnw)8SP;U37#AdNFkw-R8Wt=tVd0`azH{dvTNftI&3Dg#&-9NzlJh(;OC8BML42Lp@xV}p?O=afhfBpKeKWO`u zF;dgBqrUXT#~+Q*K_3-vWYY6ll~HXJ*7LbxCY>3tyAx~yf=>WrUv~E7-0`Qg$hcO2O)$sE2!H)pKh#-m>S6<57(ZRKiO@Y&KsQldYp4>WdJJyrh(r=;z&iHC$F#fY zRO%n3dmmR3tfkz?%EG++t==_LuM>yxCT%*nj#&QtdG{ibqgn_D*aJUT0oG!%E$%+c zRX@Xbvc5Jt^HDBO`?>Zqbb<~|+HOEITJSQH50N7tB;`%ik_4sdm$(k0iyr#0nKmI7 z=VLKBJL<8XO_DuL(tUvSc9U0PRnSFKsdzI(l16~b zcwjE!V_d^d&RL;yKU0)ar4ybUT}a!4G>`%DkX;-O8LuGrFhGaJmu-pDG=W`AI700h zpJi_o*uf-aGNjcV*v<5dHZ4{ctYPCAo74)?>t3!Tn)2qSjg7f-?wd4DW+A|P+;Sud z1lX03<+LD`l*(A&e`!nj70oIRtUUM9pKSE%lTu;LgQc6Z1S`{9sYNSh#dG0gmx=)- z(c;?0j;v0)4>jaS$ik766H>|^dAKbyA0A4jM}<^#)q20B{#v$125o>x)1--wPch0X z*yL_ZAj@MVdzs)>7_QZcNPn6sm(wBLlf9O4Opz9n3FB4z`j>r<(bCg$Z+;q_E_H6_@sF3UqdUzw)ymAcHL zVB9jkL;iDnt2&r}VsBhDO4DjrEq(B(DpI_Dr?H#lU zcZYoagWg0e+3W8cNacTYevkt@#-AxS`K5?qjR0v{!$W#Rql zh>}ifw3G7lWuXJeu})ZslOEIPA)VF;lV&u!NoO=dq_Y}6(yWH;!Eud2(i0l|UgD%i zf^^OTONnuDN+U^nTBDcrjE0|dUPHc$&uOF + + + + + diff --git a/lib/widgets/icons.dart b/lib/widgets/icons.dart index c9eb68361b..fbd0909aa4 100644 --- a/lib/widgets/icons.dart +++ b/lib/widgets/icons.dart @@ -1,4 +1,3 @@ - import 'package:flutter/widgets.dart'; import '../api/model/model.dart'; @@ -24,179 +23,182 @@ abstract final class ZulipIcons { // // BEGIN GENERATED ICON DATA + /// The Zulip custom icon "archive". + static const IconData archive = IconData(0xf101, fontFamily: "Zulip Icons"); + /// The Zulip custom icon "arrow_down". - static const IconData arrow_down = IconData(0xf101, fontFamily: "Zulip Icons"); + static const IconData arrow_down = IconData(0xf102, fontFamily: "Zulip Icons"); /// The Zulip custom icon "arrow_left_right". - static const IconData arrow_left_right = IconData(0xf102, fontFamily: "Zulip Icons"); + static const IconData arrow_left_right = IconData(0xf103, fontFamily: "Zulip Icons"); /// The Zulip custom icon "arrow_right". - static const IconData arrow_right = IconData(0xf103, fontFamily: "Zulip Icons"); + static const IconData arrow_right = IconData(0xf104, fontFamily: "Zulip Icons"); /// The Zulip custom icon "at_sign". - static const IconData at_sign = IconData(0xf104, fontFamily: "Zulip Icons"); + static const IconData at_sign = IconData(0xf105, fontFamily: "Zulip Icons"); /// The Zulip custom icon "attach_file". - static const IconData attach_file = IconData(0xf105, fontFamily: "Zulip Icons"); + static const IconData attach_file = IconData(0xf106, fontFamily: "Zulip Icons"); /// The Zulip custom icon "bot". - static const IconData bot = IconData(0xf106, fontFamily: "Zulip Icons"); + static const IconData bot = IconData(0xf107, fontFamily: "Zulip Icons"); /// The Zulip custom icon "camera". - static const IconData camera = IconData(0xf107, fontFamily: "Zulip Icons"); + static const IconData camera = IconData(0xf108, fontFamily: "Zulip Icons"); /// The Zulip custom icon "check". - static const IconData check = IconData(0xf108, fontFamily: "Zulip Icons"); + static const IconData check = IconData(0xf109, fontFamily: "Zulip Icons"); /// The Zulip custom icon "check_check". - static const IconData check_check = IconData(0xf109, fontFamily: "Zulip Icons"); + static const IconData check_check = IconData(0xf10a, fontFamily: "Zulip Icons"); /// The Zulip custom icon "check_circle_checked". - static const IconData check_circle_checked = IconData(0xf10a, fontFamily: "Zulip Icons"); + static const IconData check_circle_checked = IconData(0xf10b, fontFamily: "Zulip Icons"); /// The Zulip custom icon "check_circle_unchecked". - static const IconData check_circle_unchecked = IconData(0xf10b, fontFamily: "Zulip Icons"); + static const IconData check_circle_unchecked = IconData(0xf10c, fontFamily: "Zulip Icons"); /// The Zulip custom icon "check_remove". - static const IconData check_remove = IconData(0xf10c, fontFamily: "Zulip Icons"); + static const IconData check_remove = IconData(0xf10d, fontFamily: "Zulip Icons"); /// The Zulip custom icon "chevron_down". - static const IconData chevron_down = IconData(0xf10d, fontFamily: "Zulip Icons"); + static const IconData chevron_down = IconData(0xf10e, fontFamily: "Zulip Icons"); /// The Zulip custom icon "chevron_right". - static const IconData chevron_right = IconData(0xf10e, fontFamily: "Zulip Icons"); + static const IconData chevron_right = IconData(0xf10f, fontFamily: "Zulip Icons"); /// The Zulip custom icon "circle_x". - static const IconData circle_x = IconData(0xf10f, fontFamily: "Zulip Icons"); + static const IconData circle_x = IconData(0xf110, fontFamily: "Zulip Icons"); /// The Zulip custom icon "clock". - static const IconData clock = IconData(0xf110, fontFamily: "Zulip Icons"); + static const IconData clock = IconData(0xf111, fontFamily: "Zulip Icons"); /// The Zulip custom icon "contacts". - static const IconData contacts = IconData(0xf111, fontFamily: "Zulip Icons"); + static const IconData contacts = IconData(0xf112, fontFamily: "Zulip Icons"); /// The Zulip custom icon "copy". - static const IconData copy = IconData(0xf112, fontFamily: "Zulip Icons"); + static const IconData copy = IconData(0xf113, fontFamily: "Zulip Icons"); /// The Zulip custom icon "edit". - static const IconData edit = IconData(0xf113, fontFamily: "Zulip Icons"); + static const IconData edit = IconData(0xf114, fontFamily: "Zulip Icons"); /// The Zulip custom icon "eye". - static const IconData eye = IconData(0xf114, fontFamily: "Zulip Icons"); + static const IconData eye = IconData(0xf115, fontFamily: "Zulip Icons"); /// The Zulip custom icon "eye_off". - static const IconData eye_off = IconData(0xf115, fontFamily: "Zulip Icons"); + static const IconData eye_off = IconData(0xf116, fontFamily: "Zulip Icons"); /// The Zulip custom icon "follow". - static const IconData follow = IconData(0xf116, fontFamily: "Zulip Icons"); + static const IconData follow = IconData(0xf117, fontFamily: "Zulip Icons"); /// The Zulip custom icon "format_quote". - static const IconData format_quote = IconData(0xf117, fontFamily: "Zulip Icons"); + static const IconData format_quote = IconData(0xf118, fontFamily: "Zulip Icons"); /// The Zulip custom icon "globe". - static const IconData globe = IconData(0xf118, fontFamily: "Zulip Icons"); + static const IconData globe = IconData(0xf119, fontFamily: "Zulip Icons"); /// The Zulip custom icon "group_dm". - static const IconData group_dm = IconData(0xf119, fontFamily: "Zulip Icons"); + static const IconData group_dm = IconData(0xf11a, fontFamily: "Zulip Icons"); /// The Zulip custom icon "hash_italic". - static const IconData hash_italic = IconData(0xf11a, fontFamily: "Zulip Icons"); + static const IconData hash_italic = IconData(0xf11b, fontFamily: "Zulip Icons"); /// The Zulip custom icon "hash_sign". - static const IconData hash_sign = IconData(0xf11b, fontFamily: "Zulip Icons"); + static const IconData hash_sign = IconData(0xf11c, fontFamily: "Zulip Icons"); /// The Zulip custom icon "image". - static const IconData image = IconData(0xf11c, fontFamily: "Zulip Icons"); + static const IconData image = IconData(0xf11d, fontFamily: "Zulip Icons"); /// The Zulip custom icon "inbox". - static const IconData inbox = IconData(0xf11d, fontFamily: "Zulip Icons"); + static const IconData inbox = IconData(0xf11e, fontFamily: "Zulip Icons"); /// The Zulip custom icon "info". - static const IconData info = IconData(0xf11e, fontFamily: "Zulip Icons"); + static const IconData info = IconData(0xf11f, fontFamily: "Zulip Icons"); /// The Zulip custom icon "inherit". - static const IconData inherit = IconData(0xf11f, fontFamily: "Zulip Icons"); + static const IconData inherit = IconData(0xf120, fontFamily: "Zulip Icons"); /// The Zulip custom icon "language". - static const IconData language = IconData(0xf120, fontFamily: "Zulip Icons"); + static const IconData language = IconData(0xf121, fontFamily: "Zulip Icons"); /// The Zulip custom icon "link". - static const IconData link = IconData(0xf121, fontFamily: "Zulip Icons"); + static const IconData link = IconData(0xf122, fontFamily: "Zulip Icons"); /// The Zulip custom icon "lock". - static const IconData lock = IconData(0xf122, fontFamily: "Zulip Icons"); + static const IconData lock = IconData(0xf123, fontFamily: "Zulip Icons"); /// The Zulip custom icon "menu". - static const IconData menu = IconData(0xf123, fontFamily: "Zulip Icons"); + static const IconData menu = IconData(0xf124, fontFamily: "Zulip Icons"); /// The Zulip custom icon "message_checked". - static const IconData message_checked = IconData(0xf124, fontFamily: "Zulip Icons"); + static const IconData message_checked = IconData(0xf125, fontFamily: "Zulip Icons"); /// The Zulip custom icon "message_feed". - static const IconData message_feed = IconData(0xf125, fontFamily: "Zulip Icons"); + static const IconData message_feed = IconData(0xf126, fontFamily: "Zulip Icons"); /// The Zulip custom icon "more_horizontal". - static const IconData more_horizontal = IconData(0xf126, fontFamily: "Zulip Icons"); + static const IconData more_horizontal = IconData(0xf127, fontFamily: "Zulip Icons"); /// The Zulip custom icon "mute". - static const IconData mute = IconData(0xf127, fontFamily: "Zulip Icons"); + static const IconData mute = IconData(0xf128, fontFamily: "Zulip Icons"); /// The Zulip custom icon "person". - static const IconData person = IconData(0xf128, fontFamily: "Zulip Icons"); + static const IconData person = IconData(0xf129, fontFamily: "Zulip Icons"); /// The Zulip custom icon "plus". - static const IconData plus = IconData(0xf129, fontFamily: "Zulip Icons"); + static const IconData plus = IconData(0xf12a, fontFamily: "Zulip Icons"); /// The Zulip custom icon "read_receipts". - static const IconData read_receipts = IconData(0xf12a, fontFamily: "Zulip Icons"); + static const IconData read_receipts = IconData(0xf12b, fontFamily: "Zulip Icons"); /// The Zulip custom icon "remove". - static const IconData remove = IconData(0xf12b, fontFamily: "Zulip Icons"); + static const IconData remove = IconData(0xf12c, fontFamily: "Zulip Icons"); /// The Zulip custom icon "search". - static const IconData search = IconData(0xf12c, fontFamily: "Zulip Icons"); + static const IconData search = IconData(0xf12d, fontFamily: "Zulip Icons"); /// The Zulip custom icon "see_who_reacted". - static const IconData see_who_reacted = IconData(0xf12d, fontFamily: "Zulip Icons"); + static const IconData see_who_reacted = IconData(0xf12e, fontFamily: "Zulip Icons"); /// The Zulip custom icon "send". - static const IconData send = IconData(0xf12e, fontFamily: "Zulip Icons"); + static const IconData send = IconData(0xf12f, fontFamily: "Zulip Icons"); /// The Zulip custom icon "settings". - static const IconData settings = IconData(0xf12f, fontFamily: "Zulip Icons"); + static const IconData settings = IconData(0xf130, fontFamily: "Zulip Icons"); /// The Zulip custom icon "share". - static const IconData share = IconData(0xf130, fontFamily: "Zulip Icons"); + static const IconData share = IconData(0xf131, fontFamily: "Zulip Icons"); /// The Zulip custom icon "share_ios". - static const IconData share_ios = IconData(0xf131, fontFamily: "Zulip Icons"); + static const IconData share_ios = IconData(0xf132, fontFamily: "Zulip Icons"); /// The Zulip custom icon "smile". - static const IconData smile = IconData(0xf132, fontFamily: "Zulip Icons"); + static const IconData smile = IconData(0xf133, fontFamily: "Zulip Icons"); /// The Zulip custom icon "star". - static const IconData star = IconData(0xf133, fontFamily: "Zulip Icons"); + static const IconData star = IconData(0xf134, fontFamily: "Zulip Icons"); /// The Zulip custom icon "star_filled". - static const IconData star_filled = IconData(0xf134, fontFamily: "Zulip Icons"); + static const IconData star_filled = IconData(0xf135, fontFamily: "Zulip Icons"); /// The Zulip custom icon "three_person". - static const IconData three_person = IconData(0xf135, fontFamily: "Zulip Icons"); + static const IconData three_person = IconData(0xf136, fontFamily: "Zulip Icons"); /// The Zulip custom icon "topic". - static const IconData topic = IconData(0xf136, fontFamily: "Zulip Icons"); + static const IconData topic = IconData(0xf137, fontFamily: "Zulip Icons"); /// The Zulip custom icon "topics". - static const IconData topics = IconData(0xf137, fontFamily: "Zulip Icons"); + static const IconData topics = IconData(0xf138, fontFamily: "Zulip Icons"); /// The Zulip custom icon "trash". - static const IconData trash = IconData(0xf138, fontFamily: "Zulip Icons"); + static const IconData trash = IconData(0xf139, fontFamily: "Zulip Icons"); /// The Zulip custom icon "two_person". - static const IconData two_person = IconData(0xf139, fontFamily: "Zulip Icons"); + static const IconData two_person = IconData(0xf13a, fontFamily: "Zulip Icons"); /// The Zulip custom icon "unmute". - static const IconData unmute = IconData(0xf13a, fontFamily: "Zulip Icons"); + static const IconData unmute = IconData(0xf13b, fontFamily: "Zulip Icons"); // END GENERATED ICON DATA } @@ -205,7 +207,7 @@ IconData iconDataForStream(ZulipStream stream) { // TODO: these icons aren't quite right yet; // see this message and the one after it: // https://chat.zulip.org/#narrow/stream/243-mobile-team/topic/design.3A.20.23F117.20.22Inbox.22.20screen/near/1680637 - return switch(stream) { + return switch (stream) { ZulipStream(isWebPublic: true) => ZulipIcons.globe, ZulipStream(inviteOnly: true) => ZulipIcons.lock, ZulipStream() => ZulipIcons.hash_sign, From 32cccf5ff3c00b753f8b2ab27af0aab8f04a0714 Mon Sep 17 00:00:00 2001 From: nsamuelreddy Date: Sat, 20 Dec 2025 18:47:45 +0530 Subject: [PATCH 2/2] all_channels: Show archive icon for archived channels Fixes: #1992 --- lib/widgets/icons.dart | 3 ++- test/widgets/all_channels_test.dart | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/widgets/icons.dart b/lib/widgets/icons.dart index fbd0909aa4..2e4575ee2e 100644 --- a/lib/widgets/icons.dart +++ b/lib/widgets/icons.dart @@ -207,7 +207,8 @@ IconData iconDataForStream(ZulipStream stream) { // TODO: these icons aren't quite right yet; // see this message and the one after it: // https://chat.zulip.org/#narrow/stream/243-mobile-team/topic/design.3A.20.23F117.20.22Inbox.22.20screen/near/1680637 - return switch (stream) { + return switch(stream) { + ZulipStream(isArchived: true) => ZulipIcons.archive, ZulipStream(isWebPublic: true) => ZulipIcons.globe, ZulipStream(inviteOnly: true) => ZulipIcons.lock, ZulipStream() => ZulipIcons.hash_sign, diff --git a/test/widgets/all_channels_test.dart b/test/widgets/all_channels_test.dart index f6e1092781..cb388521ef 100644 --- a/test/widgets/all_channels_test.dart +++ b/test/widgets/all_channels_test.dart @@ -309,4 +309,14 @@ void main() { 'subscriptions': jsonEncode([channel.name]), }); }); + + testWidgets('shows archive icon for archived channels', (tester) async { + final archivedChannel = eg.stream(isArchived: true); + final activeChannel = eg.stream(isArchived: false); + await setupAllChannelsPage(tester, channels: [archivedChannel, activeChannel]); + await tester.pump(); + + check(find.byWidgetPredicate((widget) => + widget is Icon && widget.icon == ZulipIcons.archive)).findsOne(); + }); }