From 49e71e4ed694eb9be4cc1ca68c6e27f893aaffe3 Mon Sep 17 00:00:00 2001 From: noahtalerman <47070608+noahtalerman@users.noreply.github.com> Date: Mon, 14 Dec 2020 18:24:16 -0800 Subject: [PATCH] Add new icons for Hosts page. Fix hosts list width on wide screens. (#128) - Add new PNG files for the new icons in the left side navigation and the right side labels on the Hosts page. - Rename the old `` component to `` and create a new `` component. The ultimate goal is to get rid of the `` and `` components and use the encompassing `` component for all icons. The full transition will be made when we have icon assets to replace all the kolide icons and platform icons. Currently, we don't. - Rename the `icon_name_for_label.js` utility to `icon_name.js` because the utility now includes `iconNameForLabel()` and `iconNameForPlatform()` functions. - Fixes issue #127. --- assets/images/icon-all-hosts-20x20@2x.png | Bin 0 -> 777 bytes assets/images/icon-apple-dark-20x20@2x.png | Bin 0 -> 919 bytes assets/images/icon-centos-dark-20x20@2x.png | Bin 0 -> 1193 bytes assets/images/icon-hosts-2-20x20@2x.png | Bin 0 -> 415 bytes assets/images/icon-hosts-3-20x20@2x.png | Bin 0 -> 462 bytes assets/images/icon-label-20x20@2x.png | Bin 0 -> 571 bytes assets/images/icon-linux-dark-20x20@2x.png | Bin 0 -> 1259 bytes .../images/icon-main-admin-white-24x24@2x.png | Bin 0 -> 722 bytes .../images/icon-main-help-white-24x24@2x.png | Bin 0 -> 898 bytes .../images/icon-main-hosts-white-24x24@2x.png | Bin 0 -> 389 bytes .../icon-main-logout-white-24x24@2x.png | Bin 0 -> 747 bytes .../images/icon-main-packs-white-24x24@2x.png | Bin 0 -> 501 bytes .../images/icon-main-query-white-24x24@2x.png | Bin 0 -> 813 bytes .../icon-main-settings-white-24x24@2x.png | Bin 0 -> 991 bytes assets/images/icon-mia-20x20@2x.png | Bin 0 -> 1443 bytes assets/images/icon-new-20x20@2x.png | Bin 0 -> 1208 bytes assets/images/icon-offline-20x20@2x.png | Bin 0 -> 1376 bytes assets/images/icon-online-20x20@2x.png | Bin 0 -> 1330 bytes assets/images/icon-ubuntu-dark-20x20@2x.png | Bin 0 -> 1290 bytes assets/images/icon-windows-dark-20x20@2x.png | Bin 0 -> 440 bytes .../StackedWhiteBoxes/StackedWhiteBoxes.jsx | 4 +- .../WarningBanner/WarningBanner.jsx | 4 +- .../WarningBanner/WarningBanner.tests.jsx | 2 +- .../buttons/DropdownButton/DropdownButton.jsx | 4 +- .../EnrollSecretTable/EnrollSecretTable.jsx | 4 +- .../FlashMessage/FlashMessage.jsx | 6 +- .../PersistentFlash/PersistentFlash.jsx | 4 +- .../ConfigurePackQueryForm.jsx | 4 +- .../admin/AppConfigForm/AppConfigForm.jsx | 4 +- .../InputFieldWithIcon/InputFieldWithIcon.jsx | 4 +- .../TargetOption/TargetIcon.jsx | 4 +- .../TargetOption/TargetOption.jsx | 4 +- .../hosts/AddHostModal/AddHostModal.jsx | 4 +- .../hosts/HostContainer/_styles.scss | 2 - .../hosts/HostsTable/HostsTable.jsx | 10 +- .../hosts/HostsTable/HostsTable.tests.jsx | 6 +- .../components/hosts/HostsTable/_styles.scss | 1 + frontend/components/icons/Icon/Icon.jsx | 14 +- frontend/components/icons/Icon/Icon.tests.jsx | 2 +- frontend/components/icons/Icon/_styles.scss | 11 ++ .../icons/KolideIcon/KolideIcon.jsx | 29 ++++ .../icons/KolideIcon/KolideIcon.tests.jsx | 10 ++ frontend/components/icons/KolideIcon/index.js | 1 + .../icons/PlatformIcon/PlatformIcon.jsx | 4 +- frontend/components/modals/Modal/Modal.jsx | 4 +- .../components/packs/PacksList/Row/Row.jsx | 6 +- .../QueryResultsTable/QueryResultsTable.jsx | 6 +- .../ScheduledQueriesList.jsx | 12 +- .../ScheduledQueriesListItem.jsx | 4 +- .../ScheduledQueriesListItem.tests.jsx | 10 +- .../HostSidePanel/HostSidePanel.jsx | 4 +- .../PanelGroupItem/PanelGroupItem.jsx | 8 +- .../PanelGroupItem/PanelGroupItem.tests.jsx | 3 +- .../HostSidePanel/PanelGroupItem/_styles.scss | 2 +- .../side_panels/HostSidePanel/_styles.scss | 2 +- .../PackInfoSidePanel/PackInfoSidePanel.jsx | 8 +- .../QuerySidePanel/QuerySidePanel.jsx | 6 +- .../SearchPackQuery/SearchPackQuery.jsx | 6 +- .../SiteNavSidePanel/SiteNavSidePanel.jsx | 22 +-- .../side_panels/SiteNavSidePanel/_styles.scss | 126 ++++++++++-------- .../side_panels/SiteNavSidePanel/navItems.js | 4 + .../side_panels/UserMenu/UserMenu.jsx | 6 +- .../side_panels/UserMenu/_styles.scss | 15 +-- .../UserSettingsPage/UserSettingsPage.jsx | 4 +- .../AppSettingsPage/AppSettingsPage.tests.jsx | 2 +- .../pages/hosts/ManageHostsPage/_styles.scss | 7 - .../pages/packs/AllPacksPage/AllPacksPage.jsx | 10 +- .../ManageQueriesPage/ManageQueriesPage.jsx | 4 +- frontend/utilities/icon_class_for_label.js | 17 --- frontend/utilities/icon_name.js | 38 ++++++ frontend/utilities/platform_icon_class.js | 26 ++-- 71 files changed, 292 insertions(+), 212 deletions(-) create mode 100644 assets/images/icon-all-hosts-20x20@2x.png create mode 100644 assets/images/icon-apple-dark-20x20@2x.png create mode 100644 assets/images/icon-centos-dark-20x20@2x.png create mode 100644 assets/images/icon-hosts-2-20x20@2x.png create mode 100644 assets/images/icon-hosts-3-20x20@2x.png create mode 100644 assets/images/icon-label-20x20@2x.png create mode 100644 assets/images/icon-linux-dark-20x20@2x.png create mode 100644 assets/images/icon-main-admin-white-24x24@2x.png create mode 100644 assets/images/icon-main-help-white-24x24@2x.png create mode 100644 assets/images/icon-main-hosts-white-24x24@2x.png create mode 100644 assets/images/icon-main-logout-white-24x24@2x.png create mode 100644 assets/images/icon-main-packs-white-24x24@2x.png create mode 100644 assets/images/icon-main-query-white-24x24@2x.png create mode 100644 assets/images/icon-main-settings-white-24x24@2x.png create mode 100644 assets/images/icon-mia-20x20@2x.png create mode 100644 assets/images/icon-new-20x20@2x.png create mode 100644 assets/images/icon-offline-20x20@2x.png create mode 100644 assets/images/icon-online-20x20@2x.png create mode 100644 assets/images/icon-ubuntu-dark-20x20@2x.png create mode 100644 assets/images/icon-windows-dark-20x20@2x.png create mode 100644 frontend/components/icons/Icon/_styles.scss create mode 100644 frontend/components/icons/KolideIcon/KolideIcon.jsx create mode 100644 frontend/components/icons/KolideIcon/KolideIcon.tests.jsx create mode 100644 frontend/components/icons/KolideIcon/index.js delete mode 100644 frontend/utilities/icon_class_for_label.js create mode 100644 frontend/utilities/icon_name.js diff --git a/assets/images/icon-all-hosts-20x20@2x.png b/assets/images/icon-all-hosts-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..492b780eb75726f6f13ab25d52a25d30ba5755d7 GIT binary patch literal 777 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 Hu0mjf5z!Yk literal 0 HcmV?d00001 diff --git a/assets/images/icon-hosts-2-20x20@2x.png b/assets/images/icon-hosts-2-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..03e26a71604c06ffdafdf41c53906bd2d4efab34 GIT binary patch literal 415 zcmV;Q0bu@#P)fzZP} zgfJAk0J%LR=Np=)xx=5{)AarX@3`7H7%|-wqXa^Pf-$Hyq_p|ox%nXpm!|ZkAy`I# zKwNg5x@(2uM6}~~)iH4br3ffF=oV=Yh;0<0eo;Z~ES}tVx*xc`Yv-;F9`NcinS~Rz zaqfEcGZ;MJ)AQThvzP8??)u;}D6_V|w~N#1R!iW# z`4bdZnheD@UYs>w?(L{e2Xl{Ei_!u9}1o0GJ{*tzz6eRZExT+$$=Hd z6pZ9zt!_Ei>Q-j0ZXK-EWm&5W&01ZSwYt!()vd-_-4ZgbZVbNVr2US1@e}|6002ov JPDHLkV1lRowGRLQ literal 0 HcmV?d00001 diff --git a/assets/images/icon-hosts-3-20x20@2x.png b/assets/images/icon-hosts-3-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c58c855b360d987117563067785a2565e5fad829 GIT binary patch literal 462 zcmV;<0WtoGP)-8MIW_M@jGYO+}o4kT=7&IWJm>dJ*_k>I0^{QS7m8|?XXF9t*vgydB6eW*lYraI9de*0Hsm=G zIUpU+=8`Add@$cu<@K~Hw)YICXEQyNSyMHd$^k2av#$95ml(MGG{=~9g?qmT9SB76 z#pGRAbngPI2d%XtQZEL57*|!fuwC&^PH|P{D#(5(_8;s)O*3gZG6{JC*qrXidKW)4 z@ko!l-hr;KJZ{8&6mi16zwMT+?9O0l*3uLj8Gx`P9}r>E@~u^zHmno~IEM8VT-|X5 zS9dhQ)%_*G)wKz(u5W^?YZF{u-vn3pQ-Z7eH7!^72J*w{UEZNGF8}}l07*qoM6N<$ Ef=)xdIRF3v literal 0 HcmV?d00001 diff --git a/assets/images/icon-label-20x20@2x.png b/assets/images/icon-label-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cac459aa340a17f558b0b81eda79bf2769201df7 GIT binary patch literal 571 zcmV-B0>u4^P)1gGeiPbVPDiU`=z(Ke?f!5> z$p@2*KwS=L>{Bx4!#!}wS-U@`K(D|MR?d*moXw!EToz6QHRK+>FIr#BhJ;euWn(6? z0oI#DRgU#}dYO%`lUW!>wao!ruLNrU8OkU7Sk0hjS>O0zJ|C^w-zsmAv7qjnBS3dn;)#LN>!eS$bQDJft@GFsoN z-dlw23)H>&C**WyDcU5(T~f5te1IW(cXs)4X6I)I;TCxCo!eG5wF5wHAaDR-T~834 z5yA`sXJHV&I{DcfLq#A|KCn;I<_{q}kmnF-|74h+zyHu})|J+pbG>&YKeoQ#HaS0g?-E0^ z$>{K&P5zvJO%Bj*yX#>Ce@l|&v-qj)ELzWC5T@fCd*5T5{FsT^yiwX#ZWJ_>#KY7%6wR@B9!Fv{XN|iU%8O|uyQiw*VTRxgEU-HXq!%Nb?7?|43#{BqvGJN)9o=l|C#D_#^-r;wd zNTP*Yc7e}9dIN3=9jxzg@W;i}m{&k7XwXy`*tE9{3|bWA77!_dTaVlWQ!#o~kTaJ- zsPgxccelE(n;DCclXtHn1;TW6*nt&d>rwBY95ZWhO5KRF*0lzS)PZR;{)*pW<)Bxl znKinJ9-5$Nk3DeDxK&8jU|JErX+lgL$6HO%rae7hGjCQElBI0(ac!xJwD++fT9lBa zf}r>cDajvJ49@XRkxbBlJ;g@;J~c{<$r}}xy`Yx{g8Fu0km#q3)Q;i{PdnlTV_hO$ zQYV`)89T6IkhDwE@F%amJ&G!BU(@3>SSO;#q~I)B1aPpN#l+`u#H;cOg(}chO(q7; z^Egb0x;-+8y||uNbuc7GwUYyibRB2BFqMVQ#R?aq2G@lt^Tx`^t!8Q$Fvu};bF2IG z5N?UEp+lOJ8TL)q$-TJy{^|J_UvFNpnYS}jn_qr)AO8CD*SAmslIz*DKV--G-1YbZ zpPLM<_hLSa$CN;o2H5dO19xXTKlbRkI+a^H+zuF zp7L$ps+dVj#YEP4tNWkG3HZ_ko@sKK&cX)+_pa}n=8Od2(@jqNkPrvE%5=Pv_z%8- V0#(q|`x5{F002ovPDHLkV1f-6Wtac} literal 0 HcmV?d00001 diff --git a/assets/images/icon-main-admin-white-24x24@2x.png b/assets/images/icon-main-admin-white-24x24@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..88b87a717cf441678efe0f76a5903bb03f5c0e9c GIT binary patch literal 722 zcmV;@0xkWCP)ft?BDOb~B?kRf=6cs6B96vZEU z?r`EsqzLc>1OZG;OeBSfDlJc1YC5y$cYjbSTDgUm9ko+yQ78$m(7l#-p`GRIQ~xKLn;Ts3SJow_mH*qvJ@Ty8-aj6Y1F|QoBbbG_;a|QX!y4f!Z#q`! z3E41Xcq6EpfiRmkSvrJlkS85M+N75^N=Zh(rH}WdeUMGeIur(inpwUrQb5g1%Nhei z&8W6QU&QFwl;QTo`@!8C`X#-*(cd5w-Yj%?7M|x($OJ`X{o2whF7Fe*gdg07*qoM6N<$ Ef|bKVFaQ7m literal 0 HcmV?d00001 diff --git a/assets/images/icon-main-help-white-24x24@2x.png b/assets/images/icon-main-help-white-24x24@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea026223a956dd513bec3bf1c294e733a8e3552 GIT binary patch literal 898 zcmV-|1AY97P)z)f)61Z0HUAasIq6NF9x8>rGl?kUC)*>T#wmfw4N z=8@>1CE2nAaK|10H)fCth*;9FAo?uhT!?WZItaZI?Pjyt4*oRA=sD4f=!o&?h_*xp zj6hNZ*l-$FM9aWqH`{ylpNoczjE{!sk)m>dsX@k9ff?u7ToWw}{0pL`@c1%nm=dJm z$y3@&?x)JD1CFd<3P`>>a0Hf+2@(+<)h*|NLEmN58ZK8wwd;2j1I5JYLlAi(V__z$Y0` z)E!zCo@CtJdWqznAQEDO<0}UlRGyj&P4QVe(ehS07;GA@NqpNtULYf+h&!_(ect9; zA%{}PEq}JEw;52pcH6a$vA1Bk+}|Nm+#iZbA?KgHR2)rL%xc;8`DGJi|@q5C1{Pfp0R- zElcCn5F1gNsHDiI6&JJ((%pYLwC%!yhO3Ce8YRV-=9W5r}SGQa>>jG^~lf1RitO=?>z$ z19bo1pI|Hq)%GQ-)W=xSK0ko206 z$}`zw#_JEqU2W1mx5{r?>bjcEl93k9iTA|Mgz{yc40RTnC${R|;j2rpn>7mVnf~Bq z$lPq36~!BxxgYyRn+Fu1v1!=m9^V!G{>A!_dP{8$4)AjxQ@!^3-s#dsQRypNPyMZ} z+jim-b5CGSSbp8FoIqi>3;b7t+EwG8==(3s{{M7?^Y42uYg+kMt;>=y+v^;)=V#!K zdm-xC|BcHpJ0&{0Z*Ak<^HEmm8K+{oK-#1A2Ylx6B&wP57=K(2vPUMs@E)O#Ehgdy@0=t9jAv84n<^iTR$AzCFG6H9(r+|` z^fM*etE;^yTG1`_DPQUPngMH`xa0>WoVZa~3T3q}-!90E8X)>?Ekn%CwZ;UKmmyR7 zDDg3X`zfAy%Y9ZOtiksIa$W|A{yVu6$bpGVG3YK(Hpl>$*$cVvNP+r0MHwL!ewDMUie_FKn}LCyE4#eYW<;S=`)Wkk&7pR0W=8*R6)|Cpb44qsf2 z0|PkL+ITx+eokDkUGITw1!Sj3%+Fc;{$Mw{3{ZHxe6%0940sD(_vVrTdGqpgYWu;! zfYoYs7Jn7y=Ovlbb9=BG$F|Wk*9!CVnd_6Qam;`_uD@b_3a*0;IC8C`GQmvnSwQjM zyAZ)Ob@{mW5i&Pg_d(=BVH*l{N4uJG-xB!gm#4u4La_$8#g(zVuMh+E57-5+1T{B* z@!l5$$=kDv63zwzI#pJkmNzCf!kT=(Rj2+5Z4x6KliwjH)W0<|inhoEuW~)v z#PbVAX=i5pPSlWg8|R^PL&IzFLrA=`$4hIBiXviug$Stmuo+L;_xUCjKXG|LmztaY zpU`BM8w^iIp0*Oa)AL8}b;WkNnU1^=7fCmsEA=yXyCG4O>pupZqEmbikl*HV@~A zd)8un?Hf;Sdc!;`;D>4M+sBcf(iapu{EtdZbZHl`j@=+}x#*T{Zu8-p3pw_x9)2lQ z8zi~c+C}O6v|fct!X@fyPlE6KKAL%(+j&mh#dF(M#oB3CR^}V%tGy{ntNUS zJ>pZB|6b=iu{FeyosHA^d@K9P({8$|la9qszP85Grn~%#xK6H0YyXU}&#(G@wLc1T zeJna`+;w)ATA!KYLeH?*cW3WAwZ+#^z{UH*mV4`Ne-(Hx!B?q~otT>$B32=@4&*#157Q2YrnmKZ!;{an^LB{Ts5h1<`s literal 0 HcmV?d00001 diff --git a/assets/images/icon-main-query-white-24x24@2x.png b/assets/images/icon-main-query-white-24x24@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b6def888773317b0bcdb4c364f9fbeda951dda0b GIT binary patch literal 813 zcmV+|1JeA7P)Vi|K~#7F?V0P5 z+At7+7bgGX4x$c12RI#E33PDo08&9n1*U_f14sps3hb)@I@sIAtFsV(OO}~AzL~}E zl~%I%Apo8{`P|IF0YqHTCMNktqDU5UNm;k%A{UbXBqx^HY?ec4sM9e?N^(YbjwHWG z6bz)(3{V3RZC*(dlE}D}lN_KJRo*{cm0BY!9aQox&(c!1rY_d=lb$_*Ph`Y1Yt%L_ zqh{&eS+kk?(5)L-8;bYbAdCQaSO!HKk~te;b$$Z@5JQg6Mu;NK3IaoI{?W4zLy-6I z`aZ%0u+uPJrx^NTJgi_MsO_!vVcT@yyypDXy-gBmN=~x<+H}*r=^~Egbvm+yp_r}{ zCcttcjo;zCMHdH}H3USyJGX(ud(sdeG~P%3))}Z%qMXitd6t$PUQNkiveHS8WLB^%63p>q%V9d!VR&z<9l>QnpdcaM7~3j zmBw(JiE^Frn`BGvUBDG{1}d&88J#`4ah92kt7g*M4A{tw>_l{|P$IfAv$;T7jq&r| zsc%g%2@_0 zl6(CHG6_0Aq@(Pa^um-r2C+AX=2SveTsx5bgMn#8uRul(aNe`xeJmm{%M!{+tfda_ zU=BsO$Wi&PYeXI#i6sIb%yU>SA=+G1i7{$y=TyQ(I+#O1>LPK@Klm6${TuWJOV{}b zMZJQ);O)v-@S+~eGIsdNp!j!9is6g;3|+HfoVKXW~1a2otH{dq#Z9q2gZJe_p*D|!mx_H^ME}GbS`^iA8v9Q zx1c!gW}xxC5R`2&rXym&-!eW;e8_Vghf2Xo2*&F`S!dfG{LIq}G6rD*Oknh(_$0tL zeusT^pd5k;)`A?zvjaIx9oV=X>z|jktbm3I+Xu9Yt=NF?%@uMrwnm_9lxx%+fbV(} zb14)II`HFV{<#5{la+8(3nJK>2INe4lVBcP+lf5RduwcyJOqA5DtqnVE0Y-GjDCS} zrgCt>+h%yhcq?Ii&0^u07-Jw06Wbb0hgKy4eqhxqJ;Ad9wr$~(Z5rg)j6Ou<@Dw^P zF`!XvRNkjn2K<$86Ee4fC#rzXw^4_aziuLyVFU7g-eD_@Z&UQl_?0%;;r*5HTFv&tL4VdLA3Jc5BKX;ct) zF0^g?9$Nt%V;Fs#koU}uij1KYDti1TfS)dR0$sXFwD9LDv4v?@i6-TpxsxCRh6ugH zWlpEOGj{@eW<=`n;ddtpyt2#i8XViJk^ujM)ugHnZYyZ`30WJ0Ob2T#m)Sam0`(0x@$Eq*8hz^x*zzT@C(v^&TgD&>O%kk N002ovPDHLkV1ht-#Tftq literal 0 HcmV?d00001 diff --git a/assets/images/icon-mia-20x20@2x.png b/assets/images/icon-mia-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..422840908d1deb0416a9682e91470f6ef9d87bfc GIT binary patch literal 1443 zcmV;U1zh@xP)n$pE{GMO;93a_*{I z`vp#y9Z=eK_spzzB(3&GaPBIhUF}TIxBcG@!kqN_N56?RXaJ~91Zn_59gsgl1OvW~ z2rxp5|B7P>Kl~YlFb83k#m%N)k6);LM&OUYlqUfkK4N@wcM(KoHY`anuV1#t?;bJ~}60mHK$AGx!KnQx5?+>5~KvC)N zC7z+Yxj{CF746OoY?9V@{1&U9O$I!}9>Ur^?Ph61Wic272he{|wEA4≷c_u0q;k zWPQ1pv*gUIwNn5^tu8oqPg_;It}KPjQ$37>G$u7pV=7+%iAAsQR~KB76Fikn=)&uf zwVCcB?Hjdta@RJ4y)V;k7-a!Fvyg587nNcEs z<8JTj{Yk+(Sl{-qlUT`8d?ixUPGY2I=n)~8kw|TQ`+#kRj!ULHPu6a1AADS6LF6qY z=WI@?I{q4fKuzW>3(_-Zo|W*f ztF%m~(kTtq$SfS5YSFp#CZDshyHd*!PpQe&7oaRClN~(E!C&7#tkW<)O%CVm^VV70 zWR?0fggz>$Bl2^gmcy>JFcxfs!wnDSzEx@$2?%Oo4O{jpOurDexv7Gz=VHTVuk`|JNEeYmQ)hC5Z+BBK&>QmCVaMQHkHJR=| zUfc2L18MiU)os;!mVlcT;xcD5Tz2m|VMCgoYcXPYCXzl#H|h>J86IV=Ef~M~9DZ;= zxvw&KoCS<4preVdu#=bm3M2gFsLTN6=Bnh>Ae}zo&tt$i1c_71q$_WKxe;*Y;BiEK zJuKJFQ~bqnRf`01-P*C2v8Th6gX1!TscJ*?6zC=t^%avOL0eHreTAUP#Hs002ovPDHLkV1gp%pOgRq literal 0 HcmV?d00001 diff --git a/assets/images/icon-new-20x20@2x.png b/assets/images/icon-new-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..92ed45dde3a282d0bfb415841b9da8da380e55bc GIT binary patch literal 1208 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 literal 0 HcmV?d00001 diff --git a/assets/images/icon-ubuntu-dark-20x20@2x.png b/assets/images/icon-ubuntu-dark-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b430f88738cc67b50a96f8b52096b9d2aa1157c3 GIT binary patch literal 1290 zcmV+l1@-!gP)+YcVIV)NQGBQc{>J?d+tB za)Kx)h|9z_fxHJwGD!i{k7ebXp)CRg@ZsV80^ujXJNDg3;RPz#;dh1DzCn5Rp%V;E z-y^IUOi)VvNGlgIT|@C*?S^4+l^r8s%}`3z3VoTKeouEl0-%NEPo|yFw7|}s!%I(|K7-!7#-BW%RO1V&!drU&>USDV+n|Lc zc~CyRAVPILP|-2-e*tyYySXPpRo^S0Tw(<7t%7zWAw-#f8guL9e)*J0sg#Q#LpkYp zgMg%4C-OB?{18EXVndlMAi<^g12PsbZ+->X?03&!!LlUzh{qDl;EIf)IDRoX;xS?; z4!oH^z)CdUG%QL|PpZL85<;-_UKV4J*tyH`JzYhkwUKQ+ot35snz? zojdgvk$!&cdwQn{gcdGAOTQ+g7v%}cdVEqq7)2?icHsfQHnF*dpOcTy2gW2F1olNWkX!>S;_m=(<*7D2r=G#B>Dz7H#au91v+W_sORk`m31mL{&1 zj?E?Oyx<^`)%V1@L3+IzAgNtivg)NXAsvRdbOvP14SL;1G1)LPpVZcGu3_9wO0^c1 z=p+oA3Bt8D;xuNGWTToVshCBUrN{Yzz6Y}TTXK7*lbOE|J3497*C|U(6k@stiVHCu zC@DYPt;>ZN9&qB4y8uF~*J)JET?-&XRO?R8EtwU(8FFPUie>}hK!HnI=b9p+rI1^w z?xv!?3ZtW^g6XAR(0)s11|4a?+c;FWFx)_>2npVefI(iRxm5bVp^=^Kj7o9}q#jgT z2e0^&fqqxhomlU^J3m_)$s}13Up~3>d{35Jd=$k=wW)ul7gl5Ngshh`5&Ngy6~9yY z%0{Lw*AfO9*#c~gmE2E`b{{6&*d>|Vi2!t!Wga@#$ENlNyXmz>B1=9H_gTX5+V9K- z$7OQ_8{TA2V=@NT44uCUwL7Uo`MMggotFpv0A#^8Ln|{n%>V!Z07*qoM6N<$g6l_3 AqW}N^ literal 0 HcmV?d00001 diff --git a/assets/images/icon-windows-dark-20x20@2x.png b/assets/images/icon-windows-dark-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d802e72af26abda27af3437d956ac36f3ad8c812 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^nn0|nN|*21rIMlm8Be$f>=B? ztrS=8zZ?8WTc-1Lob;9y8|S89f2`hYUA1>rJl`U@+68t`He6rzZIzvs!-OeHFnuLH zlRoxOTcp~3p=jF!>9o4AW9xbT<#hju6Z`Vl?oZ(MM^aPIzmxm4#a&BWDMd?um)f!| zFSjf<3bj^Q7q4aYE-*%C(xi7kp5!jLyXRS2l#IvB3+t8d%~;a;M$`Wp_teI)j`<;% gT0CpMi=PyV_*t^&gKOmpU_di?y85}Sb4q9e0MW6x1ONa4 literal 0 HcmV?d00001 diff --git a/frontend/components/StackedWhiteBoxes/StackedWhiteBoxes.jsx b/frontend/components/StackedWhiteBoxes/StackedWhiteBoxes.jsx index 99f77ca50..0c5906254 100644 --- a/frontend/components/StackedWhiteBoxes/StackedWhiteBoxes.jsx +++ b/frontend/components/StackedWhiteBoxes/StackedWhiteBoxes.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { Link } from 'react-router'; import classnames from 'classnames'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; const baseClass = 'stacked-white-boxes'; @@ -77,7 +77,7 @@ class StackedWhiteBoxes extends Component { return (
- +
); diff --git a/frontend/components/WarningBanner/WarningBanner.jsx b/frontend/components/WarningBanner/WarningBanner.jsx index 95bf7ba0e..7f0dc6bb9 100644 --- a/frontend/components/WarningBanner/WarningBanner.jsx +++ b/frontend/components/WarningBanner/WarningBanner.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import classnames from 'classnames'; import Button from 'components/buttons/Button'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; const baseClass = 'warning-banner'; @@ -19,7 +19,7 @@ const WarningBanner = ({ className, message, labelText, shouldShowWarning, onDis return (
- + {label}
{message} diff --git a/frontend/components/WarningBanner/WarningBanner.tests.jsx b/frontend/components/WarningBanner/WarningBanner.tests.jsx index efcc3e4cb..96cfe6d6d 100644 --- a/frontend/components/WarningBanner/WarningBanner.tests.jsx +++ b/frontend/components/WarningBanner/WarningBanner.tests.jsx @@ -8,7 +8,7 @@ describe('WarningBanner - component', () => { const props = { shouldShowWarning: true, message: 'message' }; const component = shallow(); expect(component.length).toEqual(1); - expect(component.find('Icon').props().name).toEqual('warning-filled'); + expect(component.find('KolideIcon').props().name).toEqual('warning-filled'); expect(component.find('.warning-banner__label').text()).toEqual('Warning:'); expect(component.find('.warning-banner__text').text()).toEqual('message'); }); diff --git a/frontend/components/buttons/DropdownButton/DropdownButton.jsx b/frontend/components/buttons/DropdownButton/DropdownButton.jsx index 576355079..53c62db01 100644 --- a/frontend/components/buttons/DropdownButton/DropdownButton.jsx +++ b/frontend/components/buttons/DropdownButton/DropdownButton.jsx @@ -4,7 +4,7 @@ import { noop } from 'lodash'; import classnames from 'classnames'; import ClickOutside from 'components/ClickOutside'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import Button from 'components/buttons/Button'; const baseClass = 'dropdown-button'; @@ -92,7 +92,7 @@ export class DropdownButton extends Component { type={type} variant={variant} > - {children} + {children}
    diff --git a/frontend/components/config/EnrollSecretTable/EnrollSecretTable.jsx b/frontend/components/config/EnrollSecretTable/EnrollSecretTable.jsx index c6f57e730..ff03d73d0 100644 --- a/frontend/components/config/EnrollSecretTable/EnrollSecretTable.jsx +++ b/frontend/components/config/EnrollSecretTable/EnrollSecretTable.jsx @@ -5,7 +5,7 @@ import FileSaver from 'file-saver'; import Button from 'components/buttons/Button'; import enrollSecretInterface from 'interfaces/enroll_secret'; import InputField from 'components/forms/fields/InputField'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import { stringToClipboard } from 'utilities/copy_text'; import EyeIcon from '../../../../assets/images/icon-eye-16x16@2x.png'; import DownloadIcon from '../../../../assets/images/icon-download-12x12@2x.png'; @@ -76,7 +76,7 @@ class EnrollSecretRow extends Component { className={`${baseClass}__secret-copy-icon`} onClick={onCopySecret} > - +
    - {message} + {message} {undoAction &&
diff --git a/frontend/components/flash_messages/PersistentFlash/PersistentFlash.jsx b/frontend/components/flash_messages/PersistentFlash/PersistentFlash.jsx index 4e49ca3e5..be0da67e4 100644 --- a/frontend/components/flash_messages/PersistentFlash/PersistentFlash.jsx +++ b/frontend/components/flash_messages/PersistentFlash/PersistentFlash.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; const baseClass = 'persistent-flash'; @@ -12,7 +12,7 @@ const PersistentFlash = ({ message }) => { return (
- {message} + {message}
); diff --git a/frontend/components/forms/ConfigurePackQueryForm/ConfigurePackQueryForm.jsx b/frontend/components/forms/ConfigurePackQueryForm/ConfigurePackQueryForm.jsx index 2b83f5f0a..c1f2a1c75 100644 --- a/frontend/components/forms/ConfigurePackQueryForm/ConfigurePackQueryForm.jsx +++ b/frontend/components/forms/ConfigurePackQueryForm/ConfigurePackQueryForm.jsx @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { pull } from 'lodash'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import Button from 'components/buttons/Button'; import Dropdown from 'components/forms/fields/Dropdown'; import Form from 'components/forms/Form'; @@ -142,7 +142,7 @@ export class ConfigurePackQueryForm extends Component { {...fields.version} options={minOsqueryVersionOptions} placeholder="- - -" - label={['minimum ', , ' version']} + label={['minimum ', , ' version']} wrapperClassName={`${baseClass}__form-field ${baseClass}__form-field--osquer-vers`} /> { - const CaratIcon = ; + const CaratIcon = ; return Advanced Options {CaratIcon} Most users do not need to modify these options.; }; diff --git a/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx b/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx index 2c5126c1d..0589e6757 100644 --- a/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx +++ b/frontend/components/forms/fields/InputFieldWithIcon/InputFieldWithIcon.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import InputField from '../InputField'; const baseClass = 'input-icon-field'; @@ -74,7 +74,7 @@ class InputFieldWithIcon extends InputField { type={type} value={value} /> - {iconName && } + {iconName && } {renderHint()} ); diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetIcon.jsx b/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetIcon.jsx index d8c2cebb2..d98d01563 100644 --- a/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetIcon.jsx +++ b/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetIcon.jsx @@ -1,7 +1,7 @@ import React from 'react'; import classnames from 'classnames'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import targetInterface from 'interfaces/target'; const baseClass = 'target-option'; @@ -21,7 +21,7 @@ const TargetIcon = ({ target }) => { const targetClasses = classnames(`${baseClass}__icon`, `${baseClass}__icon--${status}`); - return ; + return ; }; TargetIcon.propTypes = { target: targetInterface.isRequired }; diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetOption.jsx b/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetOption.jsx index 2ed936288..5ad926467 100644 --- a/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetOption.jsx +++ b/frontend/components/forms/fields/SelectTargetsDropdown/TargetOption/TargetOption.jsx @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import targetInterface from 'interfaces/target'; import TargetIcon from './TargetIcon'; @@ -66,7 +66,7 @@ class TargetOption extends Component { {renderTargetDetail()} ); diff --git a/frontend/components/hosts/AddHostModal/AddHostModal.jsx b/frontend/components/hosts/AddHostModal/AddHostModal.jsx index a9aca4605..98780ce2a 100644 --- a/frontend/components/hosts/AddHostModal/AddHostModal.jsx +++ b/frontend/components/hosts/AddHostModal/AddHostModal.jsx @@ -7,7 +7,7 @@ import Button from 'components/buttons/Button'; import configInterface from 'interfaces/config'; import enrollSecretInterface from 'interfaces/enroll_secret'; import EnrollSecretTable from 'components/config/EnrollSecretTable'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import DownloadIcon from '../../../../assets/images/icon-download-12x12@2x.png'; const baseClass = 'add-host-modal'; @@ -113,7 +113,7 @@ class AddHostModal extends Component { target="_blank" rel="noopener noreferrer" > - Add Hosts Documentation + Add Hosts Documentation
diff --git a/frontend/components/hosts/HostContainer/_styles.scss b/frontend/components/hosts/HostContainer/_styles.scss index ec4d5468e..eb297bf34 100644 --- a/frontend/components/hosts/HostContainer/_styles.scss +++ b/frontend/components/hosts/HostContainer/_styles.scss @@ -1,6 +1,4 @@ .host-container { - // We set this equal to the max-width of header-wrap to preserve visual consistency - max-width: 1206px; &--no-hosts { display: flex; diff --git a/frontend/components/hosts/HostsTable/HostsTable.jsx b/frontend/components/hosts/HostsTable/HostsTable.jsx index 7544dd8d3..6578bb806 100644 --- a/frontend/components/hosts/HostsTable/HostsTable.jsx +++ b/frontend/components/hosts/HostsTable/HostsTable.jsx @@ -3,9 +3,9 @@ import PropTypes from 'prop-types'; import classnames from 'classnames'; import Button from 'components/buttons/Button'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import hostInterface from 'interfaces/host'; -import iconClassForLabel from 'utilities/icon_class_for_label'; +import { iconNameForLabel } from 'utilities/icon_name'; import { humanMemory, humanUptime, humanLastSeen } from './helpers'; @@ -15,14 +15,14 @@ const ActionButton = ({ host, onDestroyHost, onQueryHost }) => { if (host.status === 'online') { return ( ); } return ( ); }; @@ -64,7 +64,7 @@ class HostsTable extends Component { {host.hostname} - + {host.os_version} {host.osquery_version} diff --git a/frontend/components/hosts/HostsTable/HostsTable.tests.jsx b/frontend/components/hosts/HostsTable/HostsTable.tests.jsx index c0df57752..a760b12e0 100644 --- a/frontend/components/hosts/HostsTable/HostsTable.tests.jsx +++ b/frontend/components/hosts/HostsTable/HostsTable.tests.jsx @@ -21,7 +21,7 @@ describe('HostsTable - component', () => { ); const btn = offlineComponent.find('Button'); - expect(btn.find('Icon').prop('name')).toEqual('trash'); + expect(btn.find('KolideIcon').prop('name')).toEqual('trash'); btn.simulate('click'); @@ -46,7 +46,7 @@ describe('HostsTable - component', () => { ); const btn = miaComponent.find('Button'); - expect(btn.find('Icon').prop('name')).toEqual('trash'); + expect(btn.find('KolideIcon').prop('name')).toEqual('trash'); btn.simulate('click'); @@ -71,7 +71,7 @@ describe('HostsTable - component', () => { ); const btn = onlineComponent.find('Button'); - expect(btn.find('Icon').prop('name')).toEqual('query'); + expect(btn.find('KolideIcon').prop('name')).toEqual('query'); btn.simulate('click'); diff --git a/frontend/components/hosts/HostsTable/_styles.scss b/frontend/components/hosts/HostsTable/_styles.scss index 91dedf5a6..045a1505f 100644 --- a/frontend/components/hosts/HostsTable/_styles.scss +++ b/frontend/components/hosts/HostsTable/_styles.scss @@ -7,6 +7,7 @@ } &__table { + width: 100%; border-collapse: collapse; color: $core-black; font-size: $x-small; diff --git a/frontend/components/icons/Icon/Icon.jsx b/frontend/components/icons/Icon/Icon.jsx index 9b49ef259..baedcddf4 100644 --- a/frontend/components/icons/Icon/Icon.jsx +++ b/frontend/components/icons/Icon/Icon.jsx @@ -2,26 +2,24 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -const baseClass = 'kolidecon'; +const baseClass = 'icon'; export class Icon extends Component { static propTypes = { className: PropTypes.string, - fw: PropTypes.bool, name: PropTypes.string.isRequired, - size: PropTypes.string, - title: PropTypes.string, + size: PropTypes.string.isRequired, }; render () { - const { className, fw, name, size, title } = this.props; - const iconClasses = classnames(baseClass, `${baseClass}-${name}`, className, { - [`${baseClass}-fw`]: fw, + const { className, name, size } = this.props; + const src = `../../../assets/images/icon-${name}-${size}x${size}@2x.png`; + const iconClasses = classnames(baseClass, className, { [`${baseClass}-${size}`]: size, }); return ( - + {`${name} ); } } diff --git a/frontend/components/icons/Icon/Icon.tests.jsx b/frontend/components/icons/Icon/Icon.tests.jsx index fafa2af5e..b421aab65 100644 --- a/frontend/components/icons/Icon/Icon.tests.jsx +++ b/frontend/components/icons/Icon/Icon.tests.jsx @@ -5,6 +5,6 @@ import Icon from './Icon'; describe('Icon - component', () => { it('renders', () => { - expect(mount()).toBeTruthy(); + expect(mount()).toBeTruthy(); }); }); diff --git a/frontend/components/icons/Icon/_styles.scss b/frontend/components/icons/Icon/_styles.scss new file mode 100644 index 000000000..1c39a5092 --- /dev/null +++ b/frontend/components/icons/Icon/_styles.scss @@ -0,0 +1,11 @@ +.icon { + &-24 { + width: 24px; + height: 24px; + } + + &-20 { + width: 20px; + height: 20px; + } +} diff --git a/frontend/components/icons/KolideIcon/KolideIcon.jsx b/frontend/components/icons/KolideIcon/KolideIcon.jsx new file mode 100644 index 000000000..d42d16e1d --- /dev/null +++ b/frontend/components/icons/KolideIcon/KolideIcon.jsx @@ -0,0 +1,29 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; + +const baseClass = 'kolidecon'; + +export class KolideIcon extends Component { + static propTypes = { + className: PropTypes.string, + fw: PropTypes.bool, + name: PropTypes.string.isRequired, + size: PropTypes.string, + title: PropTypes.string, + }; + + render () { + const { className, fw, name, size, title } = this.props; + const iconClasses = classnames(baseClass, `${baseClass}-${name}`, className, { + [`${baseClass}-fw`]: fw, + [`${baseClass}-${size}`]: size, + }); + + return ( + + ); + } +} + +export default KolideIcon; diff --git a/frontend/components/icons/KolideIcon/KolideIcon.tests.jsx b/frontend/components/icons/KolideIcon/KolideIcon.tests.jsx new file mode 100644 index 000000000..b6af4fef4 --- /dev/null +++ b/frontend/components/icons/KolideIcon/KolideIcon.tests.jsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { mount } from 'enzyme'; + +import KolideIcon from './KolideIcon'; + +describe('KolideIcon - component', () => { + it('renders', () => { + expect(mount()).toBeTruthy(); + }); +}); diff --git a/frontend/components/icons/KolideIcon/index.js b/frontend/components/icons/KolideIcon/index.js new file mode 100644 index 000000000..51b3c5d00 --- /dev/null +++ b/frontend/components/icons/KolideIcon/index.js @@ -0,0 +1 @@ +export default from './KolideIcon'; diff --git a/frontend/components/icons/PlatformIcon/PlatformIcon.jsx b/frontend/components/icons/PlatformIcon/PlatformIcon.jsx index ffe00f3fe..258016095 100644 --- a/frontend/components/icons/PlatformIcon/PlatformIcon.jsx +++ b/frontend/components/icons/PlatformIcon/PlatformIcon.jsx @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import platformIconClass from 'utilities/platform_icon_class'; const baseClass = 'platform-icon'; @@ -26,7 +26,7 @@ export class PlatformIcon extends Component { } return ( - {title}
diff --git a/frontend/components/packs/PacksList/Row/Row.jsx b/frontend/components/packs/PacksList/Row/Row.jsx index eb437f7af..e9f25f100 100644 --- a/frontend/components/packs/PacksList/Row/Row.jsx +++ b/frontend/components/packs/PacksList/Row/Row.jsx @@ -6,7 +6,7 @@ import moment from 'moment'; import Checkbox from 'components/forms/fields/Checkbox'; import ClickableTableRow from 'components/ClickableTableRow'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import packInterface from 'interfaces/pack'; const baseClass = 'packs-list-row'; @@ -53,7 +53,7 @@ class Row extends Component { if (disabled) { return ( - + Disabled ); @@ -61,7 +61,7 @@ class Row extends Component { return ( - + Enabled ); diff --git a/frontend/components/queries/QueryResultsTable/QueryResultsTable.jsx b/frontend/components/queries/QueryResultsTable/QueryResultsTable.jsx index 7da895154..8fe704a6d 100644 --- a/frontend/components/queries/QueryResultsTable/QueryResultsTable.jsx +++ b/frontend/components/queries/QueryResultsTable/QueryResultsTable.jsx @@ -6,7 +6,7 @@ import { keys, omit } from 'lodash'; import Button from 'components/buttons/Button'; import campaignInterface from 'interfaces/campaign'; import filterArrayByHash from 'utilities/filter_array_by_hash'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import InputField from 'components/forms/fields/InputField'; import QueryResultsRow from 'components/queries/QueryResultsTable/QueryResultsRow'; import QueryProgressDetails from 'components/queries/QueryProgressDetails'; @@ -66,7 +66,7 @@ class QueryResultsTable extends Component { return ( - {column} + {column} - + + {active && renderSubItems(subItems)} ); @@ -120,14 +120,14 @@ class SiteNavSidePanel extends Component { key={name} className={baseSubItemItemClass} > - + + ); } diff --git a/frontend/components/side_panels/SiteNavSidePanel/_styles.scss b/frontend/components/side_panels/SiteNavSidePanel/_styles.scss index c04b9395a..0bfb2319a 100644 --- a/frontend/components/side_panels/SiteNavSidePanel/_styles.scss +++ b/frontend/components/side_panels/SiteNavSidePanel/_styles.scss @@ -1,11 +1,39 @@ .site-nav-item { position: relative; + transition: color 200ms ease-in-out; + cursor: pointer; + + &:hover { + background-color: $core-black; + } + + @include breakpoint(smalldesk) { + justify-content: center; + } + + &--multiple.site-nav-item--active { + background-color: transparent; + border-right: 0; + + .site-nav-item__link { + border-right: 3px solid $core-blue; + background-color: $core-black; + } + } &__icon { position: relative; font-size: $large; margin-right: 24px; vertical-align: sub; + + @at-root .site-nav--small & { + margin-right: 0; + } + + @include breakpoint(smalldesk) { + margin-right: 0; + } } &__name { @@ -23,54 +51,57 @@ } } - &__button { - transition: color 200ms ease-in-out; - border-radius: 0; - line-height: 40px; - position: relative; + a { color: $white; - cursor: pointer; - font-size: $x-small; - letter-spacing: 0.5px; - padding: 4px 20px; - text-align: left; - - &:hover { - background-color: $core-black; - } + text-align: center; + display: flex; + align-items: center; + padding: 14px 20px; @include breakpoint(smalldesk) { - padding: 4px 10px; + padding: 11px 14px; } } &--active { - .site-nav-item__button { - background-color: $core-black; + border-right: 3px solid $core-blue; + background-color: $core-black; + + @at-root .site-nav--small & { border-right: 3px solid $core-blue; + } - @at-root .site-nav--small & { - border-right: 3px solid $core-blue; - padding: 4px 10px; - } - - @include breakpoint(smalldesk) { - border-right: 3px solid $core-blue; - padding: 4px 10px; - } + @include breakpoint(smalldesk) { + border-right: 3px solid $core-blue; } .site-nav-item__name { font-weight: $bold; } - .site-nav-item__icon { + .site-sub-item { + a { + padding: 0; + + @at-root .site-nav--small & { + padding: 5px 14px; + } + + @include breakpoint(smalldesk) { + padding: 5px 14px; + } + } + @at-root .site-nav--small & { margin-right: 0; + display: flex; + justify-content: center; } @include breakpoint(smalldesk) { margin-right: 0; + display: flex; + justify-content: center; } } } @@ -107,8 +138,16 @@ text-transform: none; padding: 6px 0; + a { + padding: 0; + } + + i { + color: $ui-medium-grey; + } + &--active { - .site-sub-item__button { + .site-sub-item__link { color: $white; font-size: $x-small; font-weight: $bold; @@ -116,6 +155,10 @@ &:hover { color: $white; } + + i { + color: $white; + } } &::before { @@ -139,29 +182,6 @@ } } - &__button { - transition: color 150ms ease-in-out; - color: rgba($white, 0.75); - font-size: $x-small; - text-transform: none; - cursor: pointer; - font-weight: $regular; - width: 100%; - text-align: left; - - &:hover { - color: rgba($white, 0.9); - } - - @at-root .site-nav--small & { - padding: 4px 10px; - } - - @include breakpoint(smalldesk) { - padding: 4px 10px; - } - } - &__name { @at-root .site-nav--small & { display: none; @@ -225,20 +245,18 @@ } &__list { - padding: 12px 0 0 42px; + padding: 12px 0 0 64px; margin: 0; list-style: none; @at-root .site-nav--small & { padding: 0; text-align: center; - width: 100%; } @include breakpoint(smalldesk) { padding: 0; text-align: center; - width: 100%; } &--expanded { diff --git a/frontend/components/side_panels/SiteNavSidePanel/navItems.js b/frontend/components/side_panels/SiteNavSidePanel/navItems.js index 2228a4737..3be694596 100644 --- a/frontend/components/side_panels/SiteNavSidePanel/navItems.js +++ b/frontend/components/side_panels/SiteNavSidePanel/navItems.js @@ -6,6 +6,7 @@ export default (admin) => { { icon: 'admin', name: 'Admin', + iconName: 'main-admin-white', location: { regex: new RegExp(`^${URL_PREFIX}/admin/`), pathname: PATHS.ADMIN_USERS, @@ -45,6 +46,7 @@ export default (admin) => { { icon: 'hosts', name: 'Hosts', + iconName: 'main-hosts-white', location: { regex: new RegExp(`^${URL_PREFIX}/hosts/`), pathname: PATHS.MANAGE_HOSTS, @@ -54,6 +56,7 @@ export default (admin) => { { icon: 'query', name: 'Queries', + iconName: 'main-query-white', location: { regex: new RegExp(`^${URL_PREFIX}/queries/`), pathname: PATHS.MANAGE_QUERIES, @@ -63,6 +66,7 @@ export default (admin) => { { icon: 'packs', name: 'Packs', + iconName: 'main-packs-white', location: { regex: new RegExp(`^${URL_PREFIX}/packs/`), pathname: PATHS.MANAGE_PACKS, diff --git a/frontend/components/side_panels/UserMenu/UserMenu.jsx b/frontend/components/side_panels/UserMenu/UserMenu.jsx index d2396a254..4aab20573 100644 --- a/frontend/components/side_panels/UserMenu/UserMenu.jsx +++ b/frontend/components/side_panels/UserMenu/UserMenu.jsx @@ -41,9 +41,9 @@ class UserMenu extends Component { diff --git a/frontend/components/side_panels/UserMenu/_styles.scss b/frontend/components/side_panels/UserMenu/_styles.scss index 189193b46..16686f932 100644 --- a/frontend/components/side_panels/UserMenu/_styles.scss +++ b/frontend/components/side_panels/UserMenu/_styles.scss @@ -11,6 +11,7 @@ font-size: $x-small; font-weight: $regular; padding: 11px 20px; + cursor: pointer; &:hover { background-color: $core-black; @@ -25,24 +26,20 @@ a { transition: opacity 75ms $ease-in-quad, background 75ms $ease-in-quad; color: $white; - display: block; + display: flex; + align-items: center; text-decoration: none; text-transform: none; + } - i { - margin-right: 24px; - font-size: $large; - vertical-align: text-bottom; - } + .icon { + margin-right: 24px; } @include breakpoint(smalldesk) { padding: 11px 14px; a { - i { - margin-right: 0; - } span { display: none; diff --git a/frontend/pages/UserSettingsPage/UserSettingsPage.jsx b/frontend/pages/UserSettingsPage/UserSettingsPage.jsx index 93f68655f..ddb280b23 100644 --- a/frontend/pages/UserSettingsPage/UserSettingsPage.jsx +++ b/frontend/pages/UserSettingsPage/UserSettingsPage.jsx @@ -15,7 +15,7 @@ import Button from 'components/buttons/Button'; import ChangeEmailForm from 'components/forms/ChangeEmailForm'; import ChangePasswordForm from 'components/forms/ChangePasswordForm'; import deepDifference from 'utilities/deep_difference'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import InputField from 'components/forms/fields/InputField'; import { logoutUser, updateUser } from 'redux/nodes/auth/actions'; import Modal from 'components/modals/Modal'; @@ -258,7 +258,7 @@ export class UserSettingsPage extends Component { className={`${baseClass}__secret-copy-icon`} onClick={onCopySecret(`.${baseClass}__secret-input`)} > - +
diff --git a/frontend/pages/admin/AppSettingsPage/AppSettingsPage.tests.jsx b/frontend/pages/admin/AppSettingsPage/AppSettingsPage.tests.jsx index bdd5ed01f..ad9aee3e7 100644 --- a/frontend/pages/admin/AppSettingsPage/AppSettingsPage.tests.jsx +++ b/frontend/pages/admin/AppSettingsPage/AppSettingsPage.tests.jsx @@ -40,7 +40,7 @@ describe('AppSettingsPage - component', () => { const smtpWarning = page.find('WarningBanner'); expect(smtpWarning.length).toEqual(1); - expect(smtpWarning.find('Icon').length).toEqual(1); + expect(smtpWarning.find('KolideIcon').length).toEqual(1); expect(smtpWarning.text()).toContain('Warning:SMTP is not currently configured in Fleet. The "Add new user" feature requires that SMTP is configured in order to send invitation emails. Users may also be added with "fleetctl user create".'); }); diff --git a/frontend/pages/hosts/ManageHostsPage/_styles.scss b/frontend/pages/hosts/ManageHostsPage/_styles.scss index 9cf09fc97..b24a22d91 100644 --- a/frontend/pages/hosts/ManageHostsPage/_styles.scss +++ b/frontend/pages/hosts/ManageHostsPage/_styles.scss @@ -5,16 +5,9 @@ display: flex; align-items: center; justify-content: space-between; - // We set this equal to the max-width of the host-container to preserve visual consistency - max-width: 1206px; margin-bottom: 16px; } - .ace-kolide { - // We set this equal to the max-width of the host-container to preserve visual consistency - max-width: 1206px; - } - &__header { display: flex; align-items: center; diff --git a/frontend/pages/packs/AllPacksPage/AllPacksPage.jsx b/frontend/pages/packs/AllPacksPage/AllPacksPage.jsx index badc4a1c8..d5fd89cc3 100644 --- a/frontend/pages/packs/AllPacksPage/AllPacksPage.jsx +++ b/frontend/pages/packs/AllPacksPage/AllPacksPage.jsx @@ -6,7 +6,7 @@ import { push } from 'react-router-redux'; import Button from 'components/buttons/Button'; import entityGetter from 'redux/utilities/entityGetter'; -import Icon from 'components/icons/Icon'; +import KolideIcon from 'components/icons/KolideIcon'; import InputField from 'components/forms/fields/InputField'; import Modal from 'components/modals/Modal'; import packActions from 'redux/nodes/entities/packs/actions'; @@ -227,21 +227,21 @@ export class AllPacksPage extends Component { onClick={onBulkAction('disable')} variant="unstyled" > - Disable + Disable
); @@ -329,7 +329,7 @@ export class AllPacksPage extends Component { placeholder="Filter packs" value={packFilter} /> - +

{packsTotalDisplay}

- +

{queriesTotalDisplay}

diff --git a/frontend/utilities/icon_class_for_label.js b/frontend/utilities/icon_class_for_label.js deleted file mode 100644 index 6324b0571..000000000 --- a/frontend/utilities/icon_class_for_label.js +++ /dev/null @@ -1,17 +0,0 @@ -export const iconClassForLabel = (label) => { - const lowerType = label.type && label.type.toLowerCase(); - const lowerDisplayText = label.display_text && label.display_text.toLowerCase(); - - if (lowerType === 'all') return 'hosts'; - - switch (lowerDisplayText || label) { - case 'offline': return 'offline'; - case 'online': return 'success-check'; - case 'mia': return 'mia'; - case 'new': return 'clock'; - case 'unknown': return 'single-host'; - default: return 'label'; - } -}; - -export default iconClassForLabel; diff --git a/frontend/utilities/icon_name.js b/frontend/utilities/icon_name.js new file mode 100644 index 000000000..aa943bcc0 --- /dev/null +++ b/frontend/utilities/icon_name.js @@ -0,0 +1,38 @@ +export const iconNameForLabel = (label) => { + const lowerType = label.type && label.type.toLowerCase(); + const lowerDisplayText = label.display_text && label.display_text.toLowerCase(); + + if (lowerType === 'all') return 'hosts-3'; + + switch (lowerDisplayText || label) { + case 'offline': return 'offline'; + case 'online': return 'online'; + case 'mia': return 'mia'; + case 'new': return 'new'; + case 'unknown': return 'hosts-2'; + default: return 'label'; + } +}; + +export const iconNameForPlatform = (platform = '') => { + if (!platform.name) return false; + + const lowerPlatform = platform.name.toLowerCase(); + + switch (lowerPlatform) { + case 'macos': return 'apple-dark'; + case 'mac os x': return 'apple-dark'; + case 'mac osx': return 'apple-dark'; + case 'mac os': return 'apple-dark'; + case 'darwin': return 'apple-dark'; + case 'apple': return 'apple-dark'; + case 'centos': return 'centos-dark'; + case 'centos linux': return 'centos-dark'; + case 'ubuntu': return 'ubuntu-dark'; + case 'ubuntu linux': return 'ubuntu-dark'; + case 'linux': return 'linux-dark'; + case 'windows': return 'windows-dark'; + case 'ms windows': return 'windows-dark'; + default: return false; + } +}; diff --git a/frontend/utilities/platform_icon_class.js b/frontend/utilities/platform_icon_class.js index 3f9a28491..290cc99ac 100644 --- a/frontend/utilities/platform_icon_class.js +++ b/frontend/utilities/platform_icon_class.js @@ -4,19 +4,19 @@ export const platformIconClass = (platform = '') => { const lowerPlatform = platform.toLowerCase(); switch (lowerPlatform) { - case 'macos': return 'apple'; - case 'mac os x': return 'apple'; - case 'mac osx': return 'apple'; - case 'mac os': return 'apple'; - case 'darwin': return 'apple'; - case 'apple': return 'apple'; - case 'centos': return 'centos'; - case 'centos linux': return 'centos'; - case 'ubuntu': return 'ubuntu'; - case 'ubuntu linux': return 'ubuntu'; - case 'linux': return 'linux'; - case 'windows': return 'windows'; - case 'ms windows': return 'windows'; + case 'macos': return 'icon-apple-dark-20x20@2x.png'; + case 'mac os x': return 'icon-apple-dark-20x20@2x.png'; + case 'mac osx': return 'icon-apple-dark-20x20@2x.png'; + case 'mac os': return 'icon-apple-dark-20x20@2x.png'; + case 'darwin': return 'icon-apple-dark-20x20@2x.png'; + case 'apple': return 'icon-apple-dark-20x20@2x.png'; + case 'centos': return 'icon-centos-dark-20x20@2x.png'; + case 'centos linux': return 'icon-centos-dark-20x20@2x.png'; + case 'ubuntu': return 'icon-ubuntu-dark-20x20@2x.png'; + case 'ubuntu linux': return 'icon-ubuntu-dark-20x20@2x.png'; + case 'linux': return 'icon-linux-dark-20x20@2x.png'; + case 'windows': return 'icon-windows-dark-20x20@2x.png'; + case 'ms windows': return 'icon-windows-dark-20x20@2x.png'; default: return false; } };