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 99f77ca50a..0c5906254f 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 95bf7ba0e3..7f0dc6bb99 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 efcc3e4cb7..96cfe6d6dc 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 576355079e..53c62db019 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 c6f57e7308..ff03d73d0b 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 4e49ca3e5e..be0da67e4e 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 2b83f5f0ae..c1f2a1c75f 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 2c5126c1d3..0589e6757f 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 d8c2cebb22..d98d015635 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 2ed9362889..5ad926467a 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 a9aca46053..98780ce2a3 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 ec4d5468e9..eb297bf342 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 7544dd8d30..6578bb806e 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 c0df577523..a760b12e05 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 91dedf5a6d..045a1505ff 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 9b49ef259c..baedcddf4f 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 fafa2af5e2..b421aab653 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 0000000000..1c39a50921 --- /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 0000000000..d42d16e1d7 --- /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 0000000000..b6af4fef45 --- /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 0000000000..51b3c5d001 --- /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 ffe00f3fe7..2580160959 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 eb437f7afe..e9f25f100a 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 7da8951540..8fe704a6db 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 c04b9395af..0bfb2319a7 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 2228a47374..3be6945960 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 d2396a2540..4aab20573d 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 189193b460..16686f932c 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 93f68655fa..ddb280b23e 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 bdd5ed01fa..ad9aee3e78 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 9cf09fc971..b24a22d91a 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 badc4a1c8b..d5fd89cc34 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 6324b0571f..0000000000 --- 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 0000000000..aa943bcc00 --- /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 3f9a28491e..290cc99acc 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; } };