From 919bd4a03499305093d8882952a9dd3dac1c55a9 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Fri, 22 Mar 2013 11:50:30 -0700 Subject: [PATCH] Rework Mobile Header and Mobile Home. Summary: Mostly finished, wanted to get it into your hands to play with. I need to remove some more dead CSS and figure out where we want to put profile/logout, but overall feels pretty good. Tested a bunch in iOS and other layouts. Test Plan: Test Home, Maniphest, search bars, app menus. Reviewers: epriestley, btrahan Reviewed By: epriestley CC: aran, Korvin, AnhNhan Maniphest Tasks: T2809 Differential Revision: https://secure.phabricator.com/D5407 --- resources/sprite/manifest/menu.json | 24 +-- resources/sprite/menu_1x/app.png | Bin 989 -> 973 bytes resources/sprite/menu_1x/app_blue.png | Bin 1060 -> 1100 bytes resources/sprite/menu_1x/search.png | Bin 0 -> 1280 bytes resources/sprite/menu_1x/search_blue.png | Bin 0 -> 1489 bytes resources/sprite/menu_2x/app.png | Bin 1027 -> 1036 bytes resources/sprite/menu_2x/app_blue.png | Bin 1163 -> 1251 bytes resources/sprite/menu_2x/search.png | Bin 0 -> 1395 bytes resources/sprite/menu_2x/search_blue.png | Bin 0 -> 1625 bytes src/__celerity_resource_map__.php | 92 +++++----- .../PhabricatorDirectoryMainController.php | 3 +- .../celerity/CeleritySpriteGenerator.php | 16 +- .../page/menu/PhabricatorMainMenuView.php | 168 +++++++----------- .../rsrc/css/aphront/phabricator-nav-view.css | 18 +- .../css/application/base/main-menu-view.css | 89 ++++------ .../phabricator-application-launch-view.css | 36 ++-- webroot/rsrc/css/sprite-menu.css | 14 +- webroot/rsrc/image/sprite-menu-X2.png | Bin 7043 -> 7309 bytes webroot/rsrc/image/sprite-menu.png | Bin 3100 -> 3313 bytes 19 files changed, 208 insertions(+), 252 deletions(-) create mode 100644 resources/sprite/menu_1x/search.png create mode 100644 resources/sprite/menu_1x/search_blue.png create mode 100644 resources/sprite/menu_2x/search.png create mode 100644 resources/sprite/menu_2x/search_blue.png diff --git a/resources/sprite/manifest/menu.json b/resources/sprite/manifest/menu.json index fcd98fcf71..336629731a 100644 --- a/resources/sprite/manifest/menu.json +++ b/resources/sprite/manifest/menu.json @@ -4,12 +4,12 @@ "app" : { "name" : "app", "rule" : ".menu-icon-app", - "hash" : "fc525b5b3e3ecaeda3baccc18ace5a0a" + "hash" : "14cd042732abba487dc9c4135d65f2c5" }, "app_blue" : { "name" : "app_blue", "rule" : ".menu-icon-app-blue", - "hash" : "b92f3961cf38ba4d95fa26d7a54031c0" + "hash" : "5f9926e52a4e6fd43fc5fdd0cc5c8053" }, "arrow-right" : { "name" : "arrow-right", @@ -31,21 +31,21 @@ "rule" : ".alert-notifications.message-unread .phabricator-main-menu-message-icon", "hash" : "85d603ae4a9b8004944c6cf59da98b7d" }, - "eye" : { - "name" : "eye", - "rule" : ".menu-icon-eye", - "hash" : "553eb617c19b74b428558e606ff9b066" - }, - "eye_blue" : { - "name" : "eye_blue", - "rule" : ".menu-icon-eye-blue", - "hash" : "3ae3de9e694152bd6dbba58aebc46a45" - }, "logo" : { "name" : "logo", "rule" : ".phabricator-main-menu-logo-image", "hash" : "6eadea2c3dd2ada989eba22b6769b3eb" }, + "search" : { + "name" : "search", + "rule" : ".menu-icon-search", + "hash" : "26fa1f6646d20e159bb5ed5bd125a3b9" + }, + "search_blue" : { + "name" : "search_blue", + "rule" : ".menu-icon-search-blue", + "hash" : "8ddecd3b988a3ec69c2116bfd65959cb" + }, "seen_have_unread" : { "name" : "seen_have_unread", "rule" : ".alert-notifications:hover .phabricator-main-menu-alert-icon", diff --git a/resources/sprite/menu_1x/app.png b/resources/sprite/menu_1x/app.png index c395e306af525b2d51162b413ce103f9fb31a8f7..6e0828173037e8bc9b0150e6657ab4d79b907fdc 100644 GIT binary patch delta 270 zcmcc1ewKZLIF|$m8v_HwgL2y+8x_@=6pRfmT?~xOT`U|ejSLN4jU3(FoE*(v%}iYk z99^8uohD~6$-or3;#9PR$v_iok`pdPN(#j#L8)n0DU%DCgkeTH<5E4@fY~Y9t@Y7o zpkwVlT^vIyZYBNs|KFZjmr;4Ij>EQA!H%bmKNwBV98YE3b>qSIgct6gGPI<8U7Za? pdG~tA`MNG%nW3^=seyr+L2+mN#hIq}gMmgdc)I$ztaD0e0su64P&NPn delta 286 zcmX@hewTfMIF|?q8v_Hw^sRrJH!7+#DVQ0$IGb3wSsGiIxELC`8d;i{8@L!5I2oIp zS~@zqSxnAgl7T65#HnZrlYu7GBy(JfloX0ff>P70QYIHN3B!!Ez@>V!0kczf!MYwk zpkw_#T^vIyZYBNs|KFZjmrSEi-suQ79lHvL(LrbcHn}Lakfz!m?u~BT|I-t=Ep00i_>zopr E01*XH!TR3Nt4>K*^TK?`D@WQ3qNhDQZOrsD#M4z_^8v$OzrXXB zbha`*{=i>FSKU9lG16PiYDk+$6D+Aw_J{H`8JRn|S{NF-8aX*yxLCLuIa<1y zI9V8*yG+htl7T5Q#;IrtlYu7GBm-QEloX0ff>P70QYIHN3B!yu#HD(&0kc#6Z;j>E zK*vt=ba4!+xRvzh|9^XCT}I_tor1en@_DE8@?G5&;^j`%IIMiAuz7| zDQ=S3DZvtPKc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#2=9ZF3nBND}m`vLFjeGsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6qsIL(9V zO~LIJXPkQVfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u)jaOeVBoPvB=ZKF{I+w zmMMF)m>fk~!&^Bk85|`xoT_GFS?#c@wIyU_OGAEwDoe{Ahg%b@_!Vw&goQQDonV%e zuDM2IwsnD+pV{Zl!e-)jA9g)IH*>FbakOio%CrlI78{7Hn^4a=|BzFKvm9TtgT_Nw z3z2^o4$HN^?tidEdrkL_h{bvt3v{~kTSG2f$aoUn-N_|+W`%f+yS&Bc z{}K0t@0~2%_B5_M{qc9lFZsl%Ez9>v-&DHxK9?zZ!{R?ymm0oWPd_;4({c~yYv*I- zcgF8zUpz~`BILWAibRagJPz68hh%M@`|kapDwbFC{;5-u+>cGRdWnOc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#2=9ZF3nBND}m`vLFjeEsTY(OatnYqyQCInmZhe+73JqDfIV%MiN!4jE=I#rX@6rLz><8e@noY1ikjs{Kl7AZ*aZJEQ7tn4bV z=zsuQwK;KYUAPZx?yj)V1N>YHXABD&lpd&U_#yeQW^dao z?vG37*KKb2x7LBH<>vN-JRFTS8io6g6n5OtK6klX^RYm$&YX)oW+ z^E|mGGNLn>kA@tG{lIub={?Kd^NhMhb{lTZj*!ZEaq#WNoYm56XSXju;~jV}!~cNQ zd2eTbJ~83{RY_luJe%rn-08wUUHwzo^$+U)YsHI$SN(pu#`B3_o{7wMxrB)}e>5&U zn#-^A$nL<^=Z(8$*X}!#8{W&Ld++r&sdr)e9@dfb&nbVGm@@O?ekL9URVC9cS6sQ( PL4~ZRtDnm{r-UW|A)GOP literal 0 HcmV?d00001 diff --git a/resources/sprite/menu_2x/app.png b/resources/sprite/menu_2x/app.png index f59dc10f147f84976085cf9ebca698d4d519b05a..5c6bb9c0a7b47a3ec202794f185c860ba48bd51f 100644 GIT binary patch delta 227 zcmZqX=;4?k&Sk*C#=yW3&h)c=qoO*Kg0Z2ci-D23sfDAZk)ffhk)xZNlcTw-nW>9` zql=Td)8q^$8JHq7oQjq(8E9HM8M-;UnOj&mTDW2}NlBr&Bq%k_DrIsZlQ7Ik6P!jG zFgtPd^}bO8I<{_d6?49Fieh9(D+9xX*07)lLJ15VQ$%w`nT5^(AuZNujtTC^gM0WpW{tFw972T&gD7@dGcYiQdb&7&5${KfMe?P zb}m~99=`US-0vFy|NsB6SLMzp=Ghe;-wsTPSk|s!Ref>(!e@*j1~-zJ-Zj?$?{&U|T@O`LhRaP5EK1 za>+)H|BvD&=6bf}>>a+3n|1XA?udQLwDX<#Pj~Aw=2-qek}{qhF(1Ca7x;c)LVx2$ z6_>R^C)Sl1UwiZ-pm@8!vXT6Bt19LhyW9MIeR6^%UZ@z?%obYgnXzJ9E6=6pK}-H0 zI`ibB-`^GNZng#!gZx&XlP_$1|%(vj2vB^jE#*foSn>!3>_zDFv%#GSsEHSS-3fxJGlat zxEeV*TDVxa897?Im^fJ&o4ZWbK`64sspuD@@#LjU`kDsj76yif<|YQ_2rDg|T}@1l zEu2ja9W9g;ic5l0)2vb^7cvPGcAx>XQ+-RR^mCw}cY3-whE&{oGt-glh=Kr%?+3<@ zu9j~nf4BYJ@|F2q%DE(k2M0w;npxQR&5TuhZ{D$;xK({eiUXV4RQvn)?f1Eduixku zF8wxo?X1UQQnIfybGP>K>~{?=E0&DNU2xA~4%=37r<^#sJiYgC9E`tlNX~0~_NqZ* z#;Y)g;tH{>W9OXO+Gm_&u;V_;v2k-ikAN*VXOg20x8YvqFM^BG7j|6!P_AgZ`ow`H sjQh`8s6Y5qdRbphasuNvJw`T$(2C-TI;lxgKwmI;y85}Sb4q9e0KJl!Qvd(} diff --git a/resources/sprite/menu_2x/search.png b/resources/sprite/menu_2x/search.png new file mode 100644 index 0000000000000000000000000000000000000000..9d46a016ccfa1c90c60eb69f23bf192fd174a907 GIT binary patch literal 1395 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NwKIvKh-yO|qVI9j+G8oC-ey16+yn!B2rx)?aR zIGH=a^t$9Hm*%GCmB93-AoLpJ)C)=sxdlL*T~doO%TiO^it=+6z@E0s#O)RXoaRCG zrr>sqAx^#eK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*mu2ecrq|BKJ|2Q45_&F zX6D0*%?bjohN1@t!mvnNgvvSHR^oaMa zKRS1|NWz6LQY#py=&4U-zL2xzLc$&9Xa8SaI=bx48@uA~(XWHN?$kcN-2c(sjf>Nv zKejj3Mc?!L{0T1a1hN=~uieX=cR_%i=d`No+@xcBT|9U@ZROup&;Rvkp+GKI!y>QF zmMOs-HB*9Z|Bift8 z@FGnm-BQtj;aCfs!IRetABx3Vm8?!f}SBbEVt&2!ZuAM^y|J zf=(-5ioNh8v!Lks4<&QyrcLjfzm|M+y23DlHIUoE$Yt_}MYDr0MYzh;ui{k@OIjzW zz_loh!NBD#gFwg5vIc=8E0;;|>T0d$pS|jK^;3IBHU_Vc)z@lF>ZgN>K~Gmdmvv4F FO#qz+^&bEL literal 0 HcmV?d00001 diff --git a/resources/sprite/menu_2x/search_blue.png b/resources/sprite/menu_2x/search_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..55610afcbf500f875ac440a60e2cf5183e8281a0 GIT binary patch literal 1625 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NwKIvKh-yP2C=I9j+G8oC-ey16+yn!B2rx)?aR zIGH=a^t$9Hm*%GCmB93-AoQB!)C)=sxdlL*T~doO%TiO^it=+6z@E0s#O)RnoaRCG zrr>sqDNeomK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*oNEpPh?G=7*cWT z&P?mPI|c#{nhE?1?l`y?%-SOTgvD!q6H|;;L+CQ0k|y2>My(u6Ja)djT;ZSan=LCQ z+GDSFD^pwFqK?B4&tIr&SQ)1MsnBkYq-wZ5Tbky|D>1LaUa`KIbf;Nv$vuy^5iB=( zm?ae^M|nOy@?7-Jj~eArkF`s;H8TFXAbp*aotG<#>BPe?mm1oSJ>1K>Bg~{>?v-pY z_hZaAz5i-$?P0vYQXttC!|d~r=fZ#f4a#}@n8hs`?8}A2Pb+voW%>U2L%h1T%Jlp7 z=WFZofB17dYUtGLW76=k+jXR6%Yn>Uxl)HeGx?oTTh4uB#>q{*ccjm7U?09!z&6)`{ zzrI<_ddJCmW4qw18HH!9RW{rYxGoc`;a<01Su|00&u&L821nK#O5Ge{{vl~mUNX_r z4csY>GZyJNty`J0GV;ZW>K`ANmL5@LIKa8PFuD7?l*EC^6WI(F`=Yp0^f%OrF+GSA z{`w^5jbe1lBF8dCS%-H4R=a!BYZ(1@#mu=C^OCQrH2aCQ#?KE=ukREub`Skr;5*@M z&8)nXM-vsFmZi^b&01pjJmFHnx+A=2gWpbai$212na_*mMon@?S(JCf^X@e!EMd%< z=T(iD9w|KAeBO1L)cd^;S?)K_)D%vidQu}lF_LX$BrzG^b$KoTHMClal?y&xjTr+Ss=Hpu&cvbt(1ifiI&Jef}PJ@pyZW-G`;; zTIC+hy(ciG%`J8Lte>?j1>f9X8GZcB<_P5$mKQ6fGZ array( - 'hash' => '9f5cae08146fbe3b7e865b60c64121d1', - 'uri' => '/res/9f5cae08/rsrc/image/sprite-menu-X2.png', + 'hash' => '867092041ce0a62b7e50136213ca7be1', + 'uri' => '/res/86709204/rsrc/image/sprite-menu-X2.png', 'disk' => '/rsrc/image/sprite-menu-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-menu.png' => array( - 'hash' => 'cc82b64d031dafa2b2a62cc8effa62f6', - 'uri' => '/res/cc82b64d/rsrc/image/sprite-menu.png', + 'hash' => '21508eebdf582d7251d62bb2cd09f66d', + 'uri' => '/res/21508eeb/rsrc/image/sprite-menu.png', 'disk' => '/rsrc/image/sprite-menu.png', 'type' => 'png', ), @@ -2713,7 +2713,7 @@ celerity_register_resource_map(array( ), 'phabricator-application-launch-view-css' => array( - 'uri' => '/res/13c3d7f3/rsrc/css/application/base/phabricator-application-launch-view.css', + 'uri' => '/res/b04e66e6/rsrc/css/application/base/phabricator-application-launch-view.css', 'type' => 'css', 'requires' => array( @@ -2927,7 +2927,7 @@ celerity_register_resource_map(array( ), 'phabricator-main-menu-view' => array( - 'uri' => '/res/c1a73bc2/rsrc/css/application/base/main-menu-view.css', + 'uri' => '/res/401e9389/rsrc/css/application/base/main-menu-view.css', 'type' => 'css', 'requires' => array( @@ -2947,7 +2947,7 @@ celerity_register_resource_map(array( ), 'phabricator-nav-view-css' => array( - 'uri' => '/res/f3c78a53/rsrc/css/aphront/phabricator-nav-view.css', + 'uri' => '/res/0af35d12/rsrc/css/aphront/phabricator-nav-view.css', 'type' => 'css', 'requires' => array( @@ -3631,7 +3631,7 @@ celerity_register_resource_map(array( ), 'sprite-menu-css' => array( - 'uri' => '/res/50bb9cc5/rsrc/css/sprite-menu.css', + 'uri' => '/res/e4e428f9/rsrc/css/sprite-menu.css', 'type' => 'css', 'requires' => array( @@ -3686,7 +3686,7 @@ celerity_register_resource_map(array( ), array( 'packages' => array( - '2fc6daef' => + '8de9d42a' => array( 'name' => 'core.pkg.css', 'symbols' => @@ -3728,7 +3728,7 @@ celerity_register_resource_map(array( 34 => 'phabricator-object-item-list-view-css', 35 => 'global-drag-and-drop-css', ), - 'uri' => '/res/pkg/2fc6daef/core.pkg.css', + 'uri' => '/res/pkg/8de9d42a/core.pkg.css', 'type' => 'css', ), '95ceba95' => @@ -3919,16 +3919,16 @@ celerity_register_resource_map(array( 'reverse' => array( 'aphront-attached-file-view-css' => 'c41b4907', - 'aphront-dialog-view-css' => '2fc6daef', - 'aphront-error-view-css' => '2fc6daef', - 'aphront-form-view-css' => '2fc6daef', - 'aphront-list-filter-view-css' => '2fc6daef', - 'aphront-pager-view-css' => '2fc6daef', - 'aphront-panel-view-css' => '2fc6daef', - 'aphront-table-view-css' => '2fc6daef', - 'aphront-tokenizer-control-css' => '2fc6daef', - 'aphront-tooltip-css' => '2fc6daef', - 'aphront-typeahead-control-css' => '2fc6daef', + 'aphront-dialog-view-css' => '8de9d42a', + 'aphront-error-view-css' => '8de9d42a', + 'aphront-form-view-css' => '8de9d42a', + 'aphront-list-filter-view-css' => '8de9d42a', + 'aphront-pager-view-css' => '8de9d42a', + 'aphront-panel-view-css' => '8de9d42a', + 'aphront-table-view-css' => '8de9d42a', + 'aphront-tokenizer-control-css' => '8de9d42a', + 'aphront-tooltip-css' => '8de9d42a', + 'aphront-typeahead-control-css' => '8de9d42a', 'differential-changeset-view-css' => '8aaacd1b', 'differential-core-view-css' => '8aaacd1b', 'differential-inline-comment-editor' => '322728f3', @@ -3942,7 +3942,7 @@ celerity_register_resource_map(array( 'differential-table-of-contents-css' => '8aaacd1b', 'diffusion-commit-view-css' => 'c8ce2d88', 'diffusion-icons-css' => 'c8ce2d88', - 'global-drag-and-drop-css' => '2fc6daef', + 'global-drag-and-drop-css' => '8de9d42a', 'inline-comment-summary-css' => '8aaacd1b', 'javelin-aphlict' => '95ceba95', 'javelin-behavior' => 'fe22443b', @@ -4014,48 +4014,48 @@ celerity_register_resource_map(array( 'javelin-util' => 'fe22443b', 'javelin-vector' => 'fe22443b', 'javelin-workflow' => 'fe22443b', - 'lightbox-attachment-css' => '2fc6daef', + 'lightbox-attachment-css' => '8de9d42a', 'maniphest-task-summary-css' => 'c41b4907', 'maniphest-transaction-detail-css' => 'c41b4907', 'phabricator-busy' => '95ceba95', 'phabricator-content-source-view-css' => '8aaacd1b', - 'phabricator-core-buttons-css' => '2fc6daef', - 'phabricator-core-css' => '2fc6daef', - 'phabricator-crumbs-view-css' => '2fc6daef', - 'phabricator-directory-css' => '2fc6daef', + 'phabricator-core-buttons-css' => '8de9d42a', + 'phabricator-core-css' => '8de9d42a', + 'phabricator-crumbs-view-css' => '8de9d42a', + 'phabricator-directory-css' => '8de9d42a', 'phabricator-drag-and-drop-file-upload' => '322728f3', 'phabricator-dropdown-menu' => '95ceba95', 'phabricator-file-upload' => '95ceba95', - 'phabricator-filetree-view-css' => '2fc6daef', - 'phabricator-flag-css' => '2fc6daef', - 'phabricator-form-view-css' => '2fc6daef', - 'phabricator-header-view-css' => '2fc6daef', - 'phabricator-jump-nav' => '2fc6daef', + 'phabricator-filetree-view-css' => '8de9d42a', + 'phabricator-flag-css' => '8de9d42a', + 'phabricator-form-view-css' => '8de9d42a', + 'phabricator-header-view-css' => '8de9d42a', + 'phabricator-jump-nav' => '8de9d42a', 'phabricator-keyboard-shortcut' => '95ceba95', 'phabricator-keyboard-shortcut-manager' => '95ceba95', - 'phabricator-main-menu-view' => '2fc6daef', + 'phabricator-main-menu-view' => '8de9d42a', 'phabricator-menu-item' => '95ceba95', - 'phabricator-nav-view-css' => '2fc6daef', + 'phabricator-nav-view-css' => '8de9d42a', 'phabricator-notification' => '95ceba95', - 'phabricator-notification-css' => '2fc6daef', - 'phabricator-notification-menu-css' => '2fc6daef', - 'phabricator-object-item-list-view-css' => '2fc6daef', + 'phabricator-notification-css' => '8de9d42a', + 'phabricator-notification-menu-css' => '8de9d42a', + 'phabricator-object-item-list-view-css' => '8de9d42a', 'phabricator-object-selector-css' => '8aaacd1b', 'phabricator-paste-file-upload' => '95ceba95', 'phabricator-prefab' => '95ceba95', 'phabricator-project-tag-css' => 'c41b4907', - 'phabricator-remarkup-css' => '2fc6daef', + 'phabricator-remarkup-css' => '8de9d42a', 'phabricator-shaped-request' => '322728f3', - 'phabricator-side-menu-view-css' => '2fc6daef', - 'phabricator-standard-page-view' => '2fc6daef', + 'phabricator-side-menu-view-css' => '8de9d42a', + 'phabricator-standard-page-view' => '8de9d42a', 'phabricator-textareautils' => '95ceba95', 'phabricator-tooltip' => '95ceba95', - 'phabricator-transaction-view-css' => '2fc6daef', - 'phabricator-zindex-css' => '2fc6daef', - 'sprite-apps-large-css' => '2fc6daef', - 'sprite-gradient-css' => '2fc6daef', - 'sprite-icon-css' => '2fc6daef', - 'sprite-menu-css' => '2fc6daef', - 'syntax-highlighting-css' => '2fc6daef', + 'phabricator-transaction-view-css' => '8de9d42a', + 'phabricator-zindex-css' => '8de9d42a', + 'sprite-apps-large-css' => '8de9d42a', + 'sprite-gradient-css' => '8de9d42a', + 'sprite-icon-css' => '8de9d42a', + 'sprite-menu-css' => '8de9d42a', + 'syntax-highlighting-css' => '8de9d42a', ), )); diff --git a/src/applications/directory/controller/PhabricatorDirectoryMainController.php b/src/applications/directory/controller/PhabricatorDirectoryMainController.php index ce79ad2bab..52c347f56c 100644 --- a/src/applications/directory/controller/PhabricatorDirectoryMainController.php +++ b/src/applications/directory/controller/PhabricatorDirectoryMainController.php @@ -65,10 +65,11 @@ final class PhabricatorDirectoryMainController $nav->appendChild($content); $nav->appendChild(new PhabricatorGlobalUploadTargetView()); - return $this->buildStandardPageResponse( + return $this->buildApplicationPage( $nav, array( 'title' => 'Phabricator', + 'device' => true, )); } diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php index fa447d9dda..d813643265 100644 --- a/src/infrastructure/celerity/CeleritySpriteGenerator.php +++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php @@ -110,24 +110,24 @@ final class CeleritySpriteGenerator { 'y' => 31, 'css' => '.phabricator-crumb-divider', ), - 'eye' => array( + 'search' => array( 'x' => 24, - 'y' => 20, - 'css' => '.menu-icon-eye', + 'y' => 24, + 'css' => '.menu-icon-search', ), - 'eye_blue' => array( + 'search_blue' => array( 'x' => 24, - 'y' => 20, - 'css' => '.menu-icon-eye-blue', + 'y' => 24, + 'css' => '.menu-icon-search-blue', ), 'app' => array( 'x' => 24, - 'y' => 20, + 'y' => 24, 'css' => '.menu-icon-app', ), 'app_blue' => array( 'x' => 24, - 'y' => 20, + 'y' => 24, 'css' => '.menu-icon-app-blue', ), 'logo' => array( diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index 7c3a3cb163..4e84326dbf 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -41,14 +41,18 @@ final class PhabricatorMainMenuView extends AphrontView { $header_id = celerity_generate_unique_node_id(); $menus = array(); $alerts = array(); + $search_button = ''; + $app_button = ''; if ($user->isLoggedIn()) { list($menu, $dropdown) = $this->renderNotificationMenu(); $alerts[] = $menu; $menus[] = $dropdown; + $app_button = $this->renderApplicationMenuButton($header_id); + $search_button = $this->renderSearchMenuButton($header_id); } - $phabricator_menu = $this->renderPhabricatorMenu(); + $search_menu = $this->renderPhabricatorSearchMenu(); if ($alerts) { $alerts = phutil_tag( @@ -59,11 +63,7 @@ final class PhabricatorMainMenuView extends AphrontView { $alerts); } - $application_menu = $this->getApplicationMenu(); - if ($application_menu) { - $application_menu->addClass('phabricator-dark-menu'); - $application_menu->addClass('phabricator-application-menu'); - } + $application_menu = $this->renderApplicationMenu(); return phutil_tag( 'div', @@ -72,14 +72,12 @@ final class PhabricatorMainMenuView extends AphrontView { 'id' => $header_id, ), array( - $this->renderPhabricatorMenuButton($header_id), - $application_menu - ? $this->renderApplicationMenuButton($header_id) - : null, + $app_button, + $search_button, $this->renderPhabricatorLogo(), $alerts, - $phabricator_menu, $application_menu, + $search_menu, $menus, )); } @@ -116,37 +114,13 @@ final class PhabricatorMainMenuView extends AphrontView { return $result; } - private function renderPhabricatorMenuButton($header_id) { - $button_id = celerity_generate_unique_node_id(); - return javelin_tag( - 'a', - array( - 'class' => 'phabricator-main-menu-expand-button '. - 'phabricator-expand-core-menu', - 'sigil' => 'jx-toggle-class', - 'meta' => array( - 'map' => array( - $header_id => 'phabricator-core-menu-expanded', - $button_id => 'menu-icon-eye-blue', - ), - ), - ), - phutil_tag( - 'span', - array( - 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-eye', - 'id' => $button_id, - ), - '')); - } - public function renderApplicationMenuButton($header_id) { $button_id = celerity_generate_unique_node_id(); return javelin_tag( 'a', array( 'class' => 'phabricator-main-menu-expand-button '. - 'phabricator-expand-application-menu', + 'phabricator-expand-search-menu', 'sigil' => 'jx-toggle-class', 'meta' => array( 'map' => array( @@ -164,81 +138,30 @@ final class PhabricatorMainMenuView extends AphrontView { '')); } - private function renderPhabricatorMenu() { + public function renderApplicationMenu() { $user = $this->getUser(); $controller = $this->getController(); $applications = PhabricatorApplication::getAllInstalledApplications(); - $core = array(); - $more = array(); $actions = array(); - - require_celerity_resource('sprite-apps-large-css'); - - $group_core = PhabricatorApplication::GROUP_CORE; foreach ($applications as $application) { if ($application->shouldAppearInLaunchView()) { - $icon = $application->getIconName().'-light-large'; - - $item = id(new PhabricatorMenuItemView()) - ->setName($application->getName()) - ->setHref($application->getBaseURI()) - ->appendChild($this->renderMenuIcon($icon)); - if ($application->getApplicationGroup() == $group_core) { - $core[] = $item; - } else { - $more[$application->getName()] = $item; + $app_actions = $application->buildMainMenuItems($user, $controller); + foreach ($app_actions as $action) { + $actions[] = $action; } } - - $app_actions = $application->buildMainMenuItems($user, $controller); - foreach ($app_actions as $action) { - $actions[] = $action; - } } + $view = $this->getApplicationMenu(); + + if (!$view) { + $view = new PhabricatorMenuView(); + } - $view = new PhabricatorMenuView(); $view->addClass('phabricator-dark-menu'); - $view->addClass('phabricator-core-menu'); - - $search = $this->renderSearch(); - if ($search) { - $view->addMenuItem($search); - } - - $view - ->newLabel(pht('Home')) - ->addClass('phabricator-core-item-device'); - $view->addMenuItem( - id(new PhabricatorMenuItemView()) - ->addClass('phabricator-core-item-device') - ->setName(pht('Phabricator Home')) - ->setHref('/') - ->appendChild($this->renderMenuIcon('logo-light-large'))); - if ($controller && $controller->getCurrentApplication()) { - $application = $controller->getCurrentApplication(); - $icon = $application->getIconName().'-light-large'; - $view->addMenuItem( - id(new PhabricatorMenuItemView()) - ->addClass('phabricator-core-item-device') - ->setName(pht('%s Home', $application->getName())) - ->appendChild($this->renderMenuIcon($icon)) - ->setHref($controller->getApplicationURI())); - } - - if ($core) { - $view->addMenuItem( - id(new PhabricatorMenuItemView()) - ->addClass('phabricator-core-item-device') - ->setType(PhabricatorMenuItemView::TYPE_LABEL) - ->setName(pht('Core Applications'))); - foreach ($core as $item) { - $item->addClass('phabricator-core-item-device'); - $view->addMenuItem($item); - } - } + $view->addClass('phabricator-application-menu'); if ($actions) { $view->addMenuItem( @@ -259,19 +182,52 @@ final class PhabricatorMainMenuView extends AphrontView { } } - if ($more) { + if ($user->isLoggedIn()) { $view->addMenuItem( id(new PhabricatorMenuItemView()) - ->addClass('phabricator-core-item-device') - ->setType(PhabricatorMenuItemView::TYPE_LABEL) - ->setName(pht('More Applications'))); - ksort($more); - foreach ($more as $item) { - $item->addClass('phabricator-core-item-device'); - $view->addMenuItem($item); - } + ->addClass('phabricator-menu-item-type-link') + ->setName(pht('Log Out')) + ->setHref('/logout/') + ->appendChild($this->renderMenuIcon('power-light-large'))); } + return $view; + } + + public function renderSearchMenuButton($header_id) { + $button_id = celerity_generate_unique_node_id(); + return javelin_tag( + 'a', + array( + 'class' => 'phabricator-main-menu-search-button '. + 'phabricator-expand-application-menu', + 'sigil' => 'jx-toggle-class', + 'meta' => array( + 'map' => array( + $header_id => 'phabricator-search-menu-expanded', + $button_id => 'menu-icon-search-blue', + ), + ), + ), + phutil_tag( + 'span', + array( + 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-search', + 'id' => $button_id, + ), + '')); + } + + private function renderPhabricatorSearchMenu() { + + $view = new PhabricatorMenuView(); + $view->addClass('phabricator-dark-menu'); + $view->addClass('phabricator-search-menu'); + + $search = $this->renderSearch(); + if ($search) { + $view->addMenuItem($search); + } return $view; } diff --git a/webroot/rsrc/css/aphront/phabricator-nav-view.css b/webroot/rsrc/css/aphront/phabricator-nav-view.css index 5c1da125a9..e9bf457908 100644 --- a/webroot/rsrc/css/aphront/phabricator-nav-view.css +++ b/webroot/rsrc/css/aphront/phabricator-nav-view.css @@ -37,6 +37,11 @@ display: block; } +.device .phabricator-side-menu-home .phabricator-nav-column-background, +.device .phabricator-side-menu-home .phabricator-nav-local { + display: block; +} + .phabricator-nav-local { width: 205px; position: absolute; @@ -80,6 +85,17 @@ width: 240px; } -.device-desktop .phabricator-side-menu-home .phabricator-nav-content { +.device-desktop .phabricator-side-menu-home .phabricator-nav-content, +.device-tablet .phabricator-side-menu-home .phabricator-nav-content { margin-left: 240px; } + +.device-phone .phabricator-side-menu-home .phabricator-nav-content { + display: none; +} + +.device-phone .phabricator-side-menu-home .phabricator-nav-column-background, +.device-phone .phabricator-side-menu-home .phabricator-nav-local { + width: 100%; +} + diff --git a/webroot/rsrc/css/application/base/main-menu-view.css b/webroot/rsrc/css/application/base/main-menu-view.css index 89b9d93ced..9c61a77061 100644 --- a/webroot/rsrc/css/application/base/main-menu-view.css +++ b/webroot/rsrc/css/application/base/main-menu-view.css @@ -60,8 +60,12 @@ top: 9px; } -.device .phabricator-main-menu-logo { - display: none; +.device-phone .phabricator-main-menu-logo { + margin-left: -45px; +} + +.device .phabricator-main-menu-logo:hover { + background-color: transparent; } /* - Expand/Collapse Button ---------------------------------------------------- @@ -71,38 +75,23 @@ */ -.phabricator-main-menu-expand-button { - position: absolute; - top: 7px; - display: block; - width: 40px; - height: 28px; -} - .phabricator-menu-button-icon { - position: absolute; width: 24px; - height: 20px; - top: 5px; - left: 8px; + height: 24px; + float: left; + margin: 10px 10px 0 5px; } -.phabricator-expand-core-menu { - left: 5px; -} - -.phabricator-expand-application-menu { - right: 5px; +.phabricator-expand-application-menu, +.phabricator-expand-search-menu { + float: right; } +.device-desktop .phabricator-main-menu-search-button, .device-desktop .phabricator-main-menu-expand-button { display: none; } -.device .phabricator-main-menu-expand-button { - display: block; -} - /* - Search -------------------------------------------------------------------- @@ -196,7 +185,6 @@ top: 3px; } - .phabricator-main-menu-search-target div.jx-typeahead-results { border-radius: 4px; box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.35); @@ -247,10 +235,6 @@ a:hover .phabricator-main-search-typeahead-result .result-type { */ -.device .phabricator-main-menu-alerts { - margin-left: 60px; -} - .phabricator-main-menu-alerts { display: inline-block; border-radius: 15px; @@ -335,22 +319,20 @@ a:hover .phabricator-main-search-typeahead-result .result-type { */ -.phabricator-core-menu-icon { - position: absolute; - display: block; - width: 28px; - height: 28px; -} - .phabricator-core-menu-profile-image { background-size: 28px 28px; } -.device .phabricator-core-menu { +.device .phabricator-search-menu { display: none; } -.device .phabricator-core-menu-expanded .phabricator-core-menu { +.device-desktop .phabricator-search-menu { + float: right; + margin-right: 110px; +} + +.device .phabricator-search-menu-expanded .phabricator-search-menu { display: block; padding-top: 44px; } @@ -361,23 +343,23 @@ a:hover .phabricator-main-search-typeahead-result .result-type { line-height: 28px; } -.device .phabricator-core-menu - .phabricator-menu-item-type-link .phabricator-menu-item-name { - margin-left: 40px; +.device .phabricator-menu-item-type-link + .phabricator-core-menu-icon + .phabricator-menu-item-name { + margin-left: 36px; } -.device-desktop .phabricator-core-menu { +.device-desktop .phabricator-application-menu { position: absolute; right: 0; top: 0; vertical-align: top; } -.device-desktop .phabricator-core-menu .phabricator-menu-item-name { +.device-desktop .phabricator-application-menu .phabricator-menu-item-name { display: none; } -.device-desktop .phabricator-core-menu .phabricator-menu-item-view { +.device-desktop .phabricator-application-menu .phabricator-menu-item-view { display: block; float: left; position: relative; @@ -385,7 +367,7 @@ a:hover .phabricator-main-search-typeahead-result .result-type { height: 44px; } -.device-desktop .phabricator-core-menu .phabricator-core-item-device { +.device-desktop .phabricator-application-menu .phabricator-core-item-device { display: none; } @@ -398,14 +380,13 @@ a:hover .phabricator-main-search-typeahead-result .result-type { left: 6px; } -.device-desktop .phabricator-core-menu .phabricator-core-menu-item-profile { - border-width: 0 1px; - border-style: solid; - border-color: #44494d; - margin: 0 8px; +.phabricator-core-menu-icon { + position: absolute; + display: block; + width: 28px; + height: 28px; } - /* - Application Menu ---------------------------------------------------------- Styles unique to the application menu (right button on mobile). @@ -417,11 +398,11 @@ a:hover .phabricator-main-search-typeahead-result .result-type { padding-top: 44px; } -.phabricator-application-menu { +.device .phabricator-application-menu, +.device-desktop .phabricator-dark-menu .phabricator-menu-item-type-label { display: none; } -.phabricator-application-menu .phabricator-menu-item-type-link - .phabricator-menu-item-name { +.phabricator-application-menu .phabricator-menu-item-name { padding-left: 12px; } diff --git a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css b/webroot/rsrc/css/application/base/phabricator-application-launch-view.css index 154aeceef4..d5911401f8 100644 --- a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css +++ b/webroot/rsrc/css/application/base/phabricator-application-launch-view.css @@ -29,37 +29,41 @@ div.phabricator-application-launch-container { height: 66px; overflow: hidden; position: relative; - + border: 1px solid #000; text-decoration: none; - - border: 1px solid #080909; - } a.application-tile-full { - width: 240px; + width: 100%; height: 52px; + border-bottom: 1px solid #404040; + border-left: none; + border-right: none; +} + +.device-phone div.phabricator-application-launch-container { + display: none; } a.application-tile-full.application-tile-create { - width: 210px; + width: 88%; height: 52px; border-right: none; } .application-tile-full + .phabricator-application-launch-create { - display: block; float: right; - width: 28px; - border-top: 1px solid #080909; - border-bottom: 1px solid #080909; - border-left: 1px solid #080909; + width: 12%; height: 52px; position: relative; + border-top: 1px solid #000; + border-bottom: 1px solid #404040; + display: inline-block; + text-align: center; } a.phabricator-application-launch-create:hover { - background-image: url('/rsrc/image/texture/dark-menu-hover.png'); + background-image: url(/res/a214a732/rsrc/image/texture/dark-menu-hover.png); color: #fff; text-decoration: none; } @@ -70,7 +74,7 @@ a.phabricator-application-launch-container:hover { /* The hover effect looks awful on phones/tablets when scrolling. */ .device-desktop a.phabricator-application-launch-container:hover { - background-image: url('/rsrc/image/texture/dark-menu-hover.png'); + background-image: url(/res/a214a732/rsrc/image/texture/dark-menu-hover.png); color: #fff; } @@ -84,10 +88,8 @@ a.phabricator-application-launch-container:hover { } .phabricator-application-create-icon { - display: block; - position: absolute; - right: 7px; - top: 20px; + display: inline-block; + margin: 20px auto; width: 14px; height: 14px; } diff --git a/webroot/rsrc/css/sprite-menu.css b/webroot/rsrc/css/sprite-menu.css index 830dc7bb08..91583f8307 100644 --- a/webroot/rsrc/css/sprite-menu.css +++ b/webroot/rsrc/css/sprite-menu.css @@ -13,7 +13,7 @@ only screen and (min-device-pixel-ratio: 1.5), only screen and (-webkit-min-device-pixel-ratio: 1.5) { .sprite-menu { background-image: url(/rsrc/image/sprite-menu-X2.png); - background-size: 140px 117px; + background-size: 140px 121px; } } @@ -31,27 +31,27 @@ only screen and (-webkit-min-device-pixel-ratio: 1.5) { } .phabricator-crumb-divider { - background-position: 0px -85px; + background-position: 0px -89px; } -.menu-icon-eye { +.menu-icon-search { background-position: 0px -38px; } -.menu-icon-eye-blue { +.menu-icon-search-blue { background-position: -25px -38px; } .menu-icon-app { - background-position: -10px -85px; + background-position: -10px -89px; } .menu-icon-app-blue { - background-position: -35px -85px; + background-position: -35px -89px; } .phabricator-main-menu-logo-image { - background-position: 0px -59px; + background-position: 0px -63px; } .alert-notifications .phabricator-main-menu-message-icon { diff --git a/webroot/rsrc/image/sprite-menu-X2.png b/webroot/rsrc/image/sprite-menu-X2.png index 6761345d2c081b82609d75e36e872f8062e8a1e8..097be135a6207fda68729fceac85976b69212b5f 100644 GIT binary patch literal 7309 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 NU}9jVUvU{8`9GBpW&i*H literal 7043 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 diff --git a/webroot/rsrc/image/sprite-menu.png b/webroot/rsrc/image/sprite-menu.png index cc3f1a90d98366ba0c7eaa821dbf98eeaa795129..54df80ce5d690bf405198f059423d95122d6a52b 100644 GIT binary patch literal 3313 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 a_@JBV7t4d+51)Kxn2bS|cIZzV- literal 3100 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 Z^sewv-TmRCd@%KM+5Y8VS#=go_#XoT*N6ZB