Merge branch 'master' into phutil_tag
(Just synchronizing master into the tag branch.)
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_blue_2x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_blue_4x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_dark_1x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_dark_2x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_dark_4x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_glow_2x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_glow_4x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_lb_2x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/apps_lb_4x/conpherence.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.0 KiB | 
| @@ -4,762 +4,782 @@ | |||||||
|     "app-application-blue-large"   : { |     "app-application-blue-large"   : { | ||||||
|       "name" : "app-application-blue-large", |       "name" : "app-application-blue-large", | ||||||
|       "rule" : ".app-application-blue-large, .phabricator-crumb-view:hover .app-application-dark-large", |       "rule" : ".app-application-blue-large, .phabricator-crumb-view:hover .app-application-dark-large", | ||||||
|       "hash" : "c8e0319f0c8a3c19bb74391785149424" |       "hash" : "80f42a283979cef89577721ca6d9cdef" | ||||||
|     }, |     }, | ||||||
|     "app-application-dark-large"   : { |     "app-application-dark-large"   : { | ||||||
|       "name" : "app-application-dark-large", |       "name" : "app-application-dark-large", | ||||||
|       "rule" : ".app-application-dark-large", |       "rule" : ".app-application-dark-large", | ||||||
|       "hash" : "a5a904b67bdd26c15b8df07b0b0cee1a" |       "hash" : "8ab1619bcb768cc1b85106b077d29522" | ||||||
|     }, |     }, | ||||||
|     "app-application-glow-large"   : { |     "app-application-glow-large"   : { | ||||||
|       "name" : "app-application-glow-large", |       "name" : "app-application-glow-large", | ||||||
|       "rule" : ".app-application-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-application-light-large", |       "rule" : ".app-application-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-application-light-large", | ||||||
|       "hash" : "04cd8ab1f4785d33d6c9c829dce35cb6" |       "hash" : "26aedaf7940300f18eb0ef59566a0988" | ||||||
|     }, |     }, | ||||||
|     "app-application-light-large"  : { |     "app-application-light-large"  : { | ||||||
|       "name" : "app-application-light-large", |       "name" : "app-application-light-large", | ||||||
|       "rule" : ".app-application-light-large", |       "rule" : ".app-application-light-large", | ||||||
|       "hash" : "8b071cf0efedda7c8c772829d31453ea" |       "hash" : "09d4ef0cb36255291693971754ec55ee" | ||||||
|     }, |     }, | ||||||
|     "app-audit-blue-large"         : { |     "app-audit-blue-large"         : { | ||||||
|       "name" : "app-audit-blue-large", |       "name" : "app-audit-blue-large", | ||||||
|       "rule" : ".app-audit-blue-large, .phabricator-crumb-view:hover .app-audit-dark-large", |       "rule" : ".app-audit-blue-large, .phabricator-crumb-view:hover .app-audit-dark-large", | ||||||
|       "hash" : "cfb6e6c27d6bf4bbf2e07c8d284948d7" |       "hash" : "05941dc7d5ff156c0e899c6345f6833a" | ||||||
|     }, |     }, | ||||||
|     "app-audit-dark-large"         : { |     "app-audit-dark-large"         : { | ||||||
|       "name" : "app-audit-dark-large", |       "name" : "app-audit-dark-large", | ||||||
|       "rule" : ".app-audit-dark-large", |       "rule" : ".app-audit-dark-large", | ||||||
|       "hash" : "0880246fc6aa5d0cec823166af5b388f" |       "hash" : "cbf8e6c5a580bd3b5169f30d3cd0ec6a" | ||||||
|     }, |     }, | ||||||
|     "app-audit-glow-large"         : { |     "app-audit-glow-large"         : { | ||||||
|       "name" : "app-audit-glow-large", |       "name" : "app-audit-glow-large", | ||||||
|       "rule" : ".app-audit-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-audit-light-large", |       "rule" : ".app-audit-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-audit-light-large", | ||||||
|       "hash" : "2f3896e45a05d55c3a95440dbeac9187" |       "hash" : "5ab43e357c123c05a9db85a964b20252" | ||||||
|     }, |     }, | ||||||
|     "app-audit-light-large"        : { |     "app-audit-light-large"        : { | ||||||
|       "name" : "app-audit-light-large", |       "name" : "app-audit-light-large", | ||||||
|       "rule" : ".app-audit-light-large", |       "rule" : ".app-audit-light-large", | ||||||
|       "hash" : "8dd753f716233d2f6edf553df4fde942" |       "hash" : "aa853bebb7a315b994f1527247e3b362" | ||||||
|     }, |     }, | ||||||
|     "app-calendar-blue-large"      : { |     "app-calendar-blue-large"      : { | ||||||
|       "name" : "app-calendar-blue-large", |       "name" : "app-calendar-blue-large", | ||||||
|       "rule" : ".app-calendar-blue-large, .phabricator-crumb-view:hover .app-calendar-dark-large", |       "rule" : ".app-calendar-blue-large, .phabricator-crumb-view:hover .app-calendar-dark-large", | ||||||
|       "hash" : "a05add9fa18df8a98cf2735cf27ec6e1" |       "hash" : "9e530feec2926878ee7eaa8a04a8607b" | ||||||
|     }, |     }, | ||||||
|     "app-calendar-dark-large"      : { |     "app-calendar-dark-large"      : { | ||||||
|       "name" : "app-calendar-dark-large", |       "name" : "app-calendar-dark-large", | ||||||
|       "rule" : ".app-calendar-dark-large", |       "rule" : ".app-calendar-dark-large", | ||||||
|       "hash" : "5c98faf324152ec55bad6ac76f77ec00" |       "hash" : "65de91c173d169bbf407c9e7cefa9715" | ||||||
|     }, |     }, | ||||||
|     "app-calendar-glow-large"      : { |     "app-calendar-glow-large"      : { | ||||||
|       "name" : "app-calendar-glow-large", |       "name" : "app-calendar-glow-large", | ||||||
|       "rule" : ".app-calendar-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-calendar-light-large", |       "rule" : ".app-calendar-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-calendar-light-large", | ||||||
|       "hash" : "d1a7c623c5b3d902a389fc2ea8941858" |       "hash" : "1dc738045b09476feebe5e705a61b7a9" | ||||||
|     }, |     }, | ||||||
|     "app-calendar-light-large"     : { |     "app-calendar-light-large"     : { | ||||||
|       "name" : "app-calendar-light-large", |       "name" : "app-calendar-light-large", | ||||||
|       "rule" : ".app-calendar-light-large", |       "rule" : ".app-calendar-light-large", | ||||||
|       "hash" : "466b97737778eff91ebd9afabac6e5a6" |       "hash" : "043dab56a011f84f5affc2c7c13e3a39" | ||||||
|     }, |     }, | ||||||
|     "app-conduit-blue-large"       : { |     "app-conduit-blue-large"       : { | ||||||
|       "name" : "app-conduit-blue-large", |       "name" : "app-conduit-blue-large", | ||||||
|       "rule" : ".app-conduit-blue-large, .phabricator-crumb-view:hover .app-conduit-dark-large", |       "rule" : ".app-conduit-blue-large, .phabricator-crumb-view:hover .app-conduit-dark-large", | ||||||
|       "hash" : "ed8208ab196da7da6160edbdb0be118a" |       "hash" : "4ab937882a119bacc0206029cbd7919d" | ||||||
|     }, |     }, | ||||||
|     "app-conduit-dark-large"       : { |     "app-conduit-dark-large"       : { | ||||||
|       "name" : "app-conduit-dark-large", |       "name" : "app-conduit-dark-large", | ||||||
|       "rule" : ".app-conduit-dark-large", |       "rule" : ".app-conduit-dark-large", | ||||||
|       "hash" : "bad7559ed9928596c0241d8490e67422" |       "hash" : "34de5192c69af7a9cf3941f7b5cb088e" | ||||||
|     }, |     }, | ||||||
|     "app-conduit-glow-large"       : { |     "app-conduit-glow-large"       : { | ||||||
|       "name" : "app-conduit-glow-large", |       "name" : "app-conduit-glow-large", | ||||||
|       "rule" : ".app-conduit-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-conduit-light-large", |       "rule" : ".app-conduit-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-conduit-light-large", | ||||||
|       "hash" : "072c3ca188a60e9ee08c6eb36b8628c9" |       "hash" : "b89b969a7fba76d39c768ac8de19c964" | ||||||
|     }, |     }, | ||||||
|     "app-conduit-light-large"      : { |     "app-conduit-light-large"      : { | ||||||
|       "name" : "app-conduit-light-large", |       "name" : "app-conduit-light-large", | ||||||
|       "rule" : ".app-conduit-light-large", |       "rule" : ".app-conduit-light-large", | ||||||
|       "hash" : "92047e758fac063dfb0608863ee66b7e" |       "hash" : "a2fd3cfe6e4e46d589e0e99f52e7f6f0" | ||||||
|  |     }, | ||||||
|  |     "app-conpherence-blue-large"   : { | ||||||
|  |       "name" : "app-conpherence-blue-large", | ||||||
|  |       "rule" : ".app-conpherence-blue-large, .phabricator-crumb-view:hover .app-conpherence-dark-large", | ||||||
|  |       "hash" : "efcf3788ac60484d5920b37c1560e565" | ||||||
|  |     }, | ||||||
|  |     "app-conpherence-dark-large"   : { | ||||||
|  |       "name" : "app-conpherence-dark-large", | ||||||
|  |       "rule" : ".app-conpherence-dark-large", | ||||||
|  |       "hash" : "2722117e3da8c2dbc478d957fb21ca53" | ||||||
|  |     }, | ||||||
|  |     "app-conpherence-glow-large"   : { | ||||||
|  |       "name" : "app-conpherence-glow-large", | ||||||
|  |       "rule" : ".app-conpherence-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-conpherence-light-large", | ||||||
|  |       "hash" : "efa3c29ad40680fca2d62e0b180e709f" | ||||||
|  |     }, | ||||||
|  |     "app-conpherence-light-large"  : { | ||||||
|  |       "name" : "app-conpherence-light-large", | ||||||
|  |       "rule" : ".app-conpherence-light-large", | ||||||
|  |       "hash" : "a79e5f0094caf9f012f3e9d7a10f2bac" | ||||||
|     }, |     }, | ||||||
|     "app-countdown-blue-large"     : { |     "app-countdown-blue-large"     : { | ||||||
|       "name" : "app-countdown-blue-large", |       "name" : "app-countdown-blue-large", | ||||||
|       "rule" : ".app-countdown-blue-large, .phabricator-crumb-view:hover .app-countdown-dark-large", |       "rule" : ".app-countdown-blue-large, .phabricator-crumb-view:hover .app-countdown-dark-large", | ||||||
|       "hash" : "d44b7acae6b6b052ac869f0176b66b89" |       "hash" : "a4079b8e55924b7590011b35ba9bfdb0" | ||||||
|     }, |     }, | ||||||
|     "app-countdown-dark-large"     : { |     "app-countdown-dark-large"     : { | ||||||
|       "name" : "app-countdown-dark-large", |       "name" : "app-countdown-dark-large", | ||||||
|       "rule" : ".app-countdown-dark-large", |       "rule" : ".app-countdown-dark-large", | ||||||
|       "hash" : "dc7df8202a5fa7baf17fd446a9b5c4c5" |       "hash" : "25547923eb9927ed0c30804fafd471d3" | ||||||
|     }, |     }, | ||||||
|     "app-countdown-glow-large"     : { |     "app-countdown-glow-large"     : { | ||||||
|       "name" : "app-countdown-glow-large", |       "name" : "app-countdown-glow-large", | ||||||
|       "rule" : ".app-countdown-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-countdown-light-large", |       "rule" : ".app-countdown-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-countdown-light-large", | ||||||
|       "hash" : "3b972002d629a49a4eca9049a9b2c6ae" |       "hash" : "472fcd5cf9f292b0d2f9f275541fed18" | ||||||
|     }, |     }, | ||||||
|     "app-countdown-light-large"    : { |     "app-countdown-light-large"    : { | ||||||
|       "name" : "app-countdown-light-large", |       "name" : "app-countdown-light-large", | ||||||
|       "rule" : ".app-countdown-light-large", |       "rule" : ".app-countdown-light-large", | ||||||
|       "hash" : "8f3814f70c1cb0475dd4678cc8937d91" |       "hash" : "24bac143e049862bed161d819990cee0" | ||||||
|     }, |     }, | ||||||
|     "app-daemon-blue-large"        : { |     "app-daemon-blue-large"        : { | ||||||
|       "name" : "app-daemon-blue-large", |       "name" : "app-daemon-blue-large", | ||||||
|       "rule" : ".app-daemon-blue-large, .phabricator-crumb-view:hover .app-daemon-dark-large", |       "rule" : ".app-daemon-blue-large, .phabricator-crumb-view:hover .app-daemon-dark-large", | ||||||
|       "hash" : "c922a7e7ec9467ca48b2a2573904b7ce" |       "hash" : "beb6586864ef67a7bd7a9a159b8c2a56" | ||||||
|     }, |     }, | ||||||
|     "app-daemon-dark-large"        : { |     "app-daemon-dark-large"        : { | ||||||
|       "name" : "app-daemon-dark-large", |       "name" : "app-daemon-dark-large", | ||||||
|       "rule" : ".app-daemon-dark-large", |       "rule" : ".app-daemon-dark-large", | ||||||
|       "hash" : "b2e566baac0c579563bd5bd700deb41b" |       "hash" : "cf2e12b2967d155c437862bbb9ce2d86" | ||||||
|     }, |     }, | ||||||
|     "app-daemon-glow-large"        : { |     "app-daemon-glow-large"        : { | ||||||
|       "name" : "app-daemon-glow-large", |       "name" : "app-daemon-glow-large", | ||||||
|       "rule" : ".app-daemon-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-daemon-light-large", |       "rule" : ".app-daemon-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-daemon-light-large", | ||||||
|       "hash" : "1c8e2776b9b984b804f6dca073f101eb" |       "hash" : "1728089df503ec805b42e262b196b616" | ||||||
|     }, |     }, | ||||||
|     "app-daemon-light-large"       : { |     "app-daemon-light-large"       : { | ||||||
|       "name" : "app-daemon-light-large", |       "name" : "app-daemon-light-large", | ||||||
|       "rule" : ".app-daemon-light-large", |       "rule" : ".app-daemon-light-large", | ||||||
|       "hash" : "9c778b43f9f7380fc9bd862c097bbaa8" |       "hash" : "44328612154fbf1a2f0f6ff28cd23521" | ||||||
|     }, |     }, | ||||||
|     "app-differential-blue-large"  : { |     "app-differential-blue-large"  : { | ||||||
|       "name" : "app-differential-blue-large", |       "name" : "app-differential-blue-large", | ||||||
|       "rule" : ".app-differential-blue-large, .phabricator-crumb-view:hover .app-differential-dark-large", |       "rule" : ".app-differential-blue-large, .phabricator-crumb-view:hover .app-differential-dark-large", | ||||||
|       "hash" : "59049df6a30c816ea68d3025da79a091" |       "hash" : "9491284c8cbf77df0795bdf9cd16651e" | ||||||
|     }, |     }, | ||||||
|     "app-differential-dark-large"  : { |     "app-differential-dark-large"  : { | ||||||
|       "name" : "app-differential-dark-large", |       "name" : "app-differential-dark-large", | ||||||
|       "rule" : ".app-differential-dark-large", |       "rule" : ".app-differential-dark-large", | ||||||
|       "hash" : "fd1e0f1fa97b00c7409ebfdc56cf4865" |       "hash" : "a4b2ac4d4f697896e3abe9e58501fea5" | ||||||
|     }, |     }, | ||||||
|     "app-differential-glow-large"  : { |     "app-differential-glow-large"  : { | ||||||
|       "name" : "app-differential-glow-large", |       "name" : "app-differential-glow-large", | ||||||
|       "rule" : ".app-differential-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-differential-light-large", |       "rule" : ".app-differential-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-differential-light-large", | ||||||
|       "hash" : "3997a58a26389e8ede8022fd05cf8b43" |       "hash" : "d7e777585cc826becb64042f8bb31fc5" | ||||||
|     }, |     }, | ||||||
|     "app-differential-light-large" : { |     "app-differential-light-large" : { | ||||||
|       "name" : "app-differential-light-large", |       "name" : "app-differential-light-large", | ||||||
|       "rule" : ".app-differential-light-large", |       "rule" : ".app-differential-light-large", | ||||||
|       "hash" : "b5c750e09f57a787e89f32820f791c4a" |       "hash" : "a763d63d22cac8226d8bd5656221a91b" | ||||||
|     }, |     }, | ||||||
|     "app-diffusion-blue-large"     : { |     "app-diffusion-blue-large"     : { | ||||||
|       "name" : "app-diffusion-blue-large", |       "name" : "app-diffusion-blue-large", | ||||||
|       "rule" : ".app-diffusion-blue-large, .phabricator-crumb-view:hover .app-diffusion-dark-large", |       "rule" : ".app-diffusion-blue-large, .phabricator-crumb-view:hover .app-diffusion-dark-large", | ||||||
|       "hash" : "b982cfacfde43d3267082bca236bc72c" |       "hash" : "35e35c07ca1a151c810bb38a90496a2d" | ||||||
|     }, |     }, | ||||||
|     "app-diffusion-dark-large"     : { |     "app-diffusion-dark-large"     : { | ||||||
|       "name" : "app-diffusion-dark-large", |       "name" : "app-diffusion-dark-large", | ||||||
|       "rule" : ".app-diffusion-dark-large", |       "rule" : ".app-diffusion-dark-large", | ||||||
|       "hash" : "2eb71cde4af83347efdee542f4cadd8e" |       "hash" : "5b3752babd557f2c9bbc0120bd9a0747" | ||||||
|     }, |     }, | ||||||
|     "app-diffusion-glow-large"     : { |     "app-diffusion-glow-large"     : { | ||||||
|       "name" : "app-diffusion-glow-large", |       "name" : "app-diffusion-glow-large", | ||||||
|       "rule" : ".app-diffusion-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diffusion-light-large", |       "rule" : ".app-diffusion-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diffusion-light-large", | ||||||
|       "hash" : "55873c2e30e693e7bde0f4a90045064d" |       "hash" : "a5a682fffa03d4cdae9a86b8c79d1a81" | ||||||
|     }, |     }, | ||||||
|     "app-diffusion-light-large"    : { |     "app-diffusion-light-large"    : { | ||||||
|       "name" : "app-diffusion-light-large", |       "name" : "app-diffusion-light-large", | ||||||
|       "rule" : ".app-diffusion-light-large", |       "rule" : ".app-diffusion-light-large", | ||||||
|       "hash" : "6eeb6f6df3ecd1ee923081b2d82f0505" |       "hash" : "1f04606fe4f0650982327bf09bf5adc0" | ||||||
|     }, |     }, | ||||||
|     "app-diviner-blue-large"       : { |     "app-diviner-blue-large"       : { | ||||||
|       "name" : "app-diviner-blue-large", |       "name" : "app-diviner-blue-large", | ||||||
|       "rule" : ".app-diviner-blue-large, .phabricator-crumb-view:hover .app-diviner-dark-large", |       "rule" : ".app-diviner-blue-large, .phabricator-crumb-view:hover .app-diviner-dark-large", | ||||||
|       "hash" : "bda64f504c0c2c34125758bd01c80e05" |       "hash" : "97f1242c914315cf773c27bbec964335" | ||||||
|     }, |     }, | ||||||
|     "app-diviner-dark-large"       : { |     "app-diviner-dark-large"       : { | ||||||
|       "name" : "app-diviner-dark-large", |       "name" : "app-diviner-dark-large", | ||||||
|       "rule" : ".app-diviner-dark-large", |       "rule" : ".app-diviner-dark-large", | ||||||
|       "hash" : "786a865464564d66d458557c909a77ea" |       "hash" : "c4f0550826f60fcd48d6ebcd340184b4" | ||||||
|     }, |     }, | ||||||
|     "app-diviner-glow-large"       : { |     "app-diviner-glow-large"       : { | ||||||
|       "name" : "app-diviner-glow-large", |       "name" : "app-diviner-glow-large", | ||||||
|       "rule" : ".app-diviner-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diviner-light-large", |       "rule" : ".app-diviner-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diviner-light-large", | ||||||
|       "hash" : "d173b3a659a2a4b5af5890ba70e827d1" |       "hash" : "7f7f0e1886036d894a5b22b72872ad06" | ||||||
|     }, |     }, | ||||||
|     "app-diviner-light-large"      : { |     "app-diviner-light-large"      : { | ||||||
|       "name" : "app-diviner-light-large", |       "name" : "app-diviner-light-large", | ||||||
|       "rule" : ".app-diviner-light-large", |       "rule" : ".app-diviner-light-large", | ||||||
|       "hash" : "c515bc52cb560adebce1e84bb5d917ce" |       "hash" : "b13413ada716fa7d3449c38b11decd5d" | ||||||
|     }, |     }, | ||||||
|     "app-drydock-blue-large"       : { |     "app-drydock-blue-large"       : { | ||||||
|       "name" : "app-drydock-blue-large", |       "name" : "app-drydock-blue-large", | ||||||
|       "rule" : ".app-drydock-blue-large, .phabricator-crumb-view:hover .app-drydock-dark-large", |       "rule" : ".app-drydock-blue-large, .phabricator-crumb-view:hover .app-drydock-dark-large", | ||||||
|       "hash" : "ba82e330a78dd60df033560e083601cf" |       "hash" : "a63aaba405583e356f00af6bc1dedfad" | ||||||
|     }, |     }, | ||||||
|     "app-drydock-dark-large"       : { |     "app-drydock-dark-large"       : { | ||||||
|       "name" : "app-drydock-dark-large", |       "name" : "app-drydock-dark-large", | ||||||
|       "rule" : ".app-drydock-dark-large", |       "rule" : ".app-drydock-dark-large", | ||||||
|       "hash" : "7a41b9668c77b85b8acf048d9e61c50a" |       "hash" : "a97be15640a38db803cc03215968e856" | ||||||
|     }, |     }, | ||||||
|     "app-drydock-glow-large"       : { |     "app-drydock-glow-large"       : { | ||||||
|       "name" : "app-drydock-glow-large", |       "name" : "app-drydock-glow-large", | ||||||
|       "rule" : ".app-drydock-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-drydock-light-large", |       "rule" : ".app-drydock-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-drydock-light-large", | ||||||
|       "hash" : "f5866c62ecbc94ecacd1563d2780677d" |       "hash" : "d7beac10376044ffda0adbe6ed01e645" | ||||||
|     }, |     }, | ||||||
|     "app-drydock-light-large"      : { |     "app-drydock-light-large"      : { | ||||||
|       "name" : "app-drydock-light-large", |       "name" : "app-drydock-light-large", | ||||||
|       "rule" : ".app-drydock-light-large", |       "rule" : ".app-drydock-light-large", | ||||||
|       "hash" : "2c1ce32d5d5291e7d3d3d6e9323a2a65" |       "hash" : "712c8fa45f964e0c4cbb69321fd1fded" | ||||||
|     }, |     }, | ||||||
|     "app-fact-blue-large"          : { |     "app-fact-blue-large"          : { | ||||||
|       "name" : "app-fact-blue-large", |       "name" : "app-fact-blue-large", | ||||||
|       "rule" : ".app-fact-blue-large, .phabricator-crumb-view:hover .app-fact-dark-large", |       "rule" : ".app-fact-blue-large, .phabricator-crumb-view:hover .app-fact-dark-large", | ||||||
|       "hash" : "1e2b911cb36b0d44384487e348892ccc" |       "hash" : "4b07b51e2178f12533c04c55d522d9e5" | ||||||
|     }, |     }, | ||||||
|     "app-fact-dark-large"          : { |     "app-fact-dark-large"          : { | ||||||
|       "name" : "app-fact-dark-large", |       "name" : "app-fact-dark-large", | ||||||
|       "rule" : ".app-fact-dark-large", |       "rule" : ".app-fact-dark-large", | ||||||
|       "hash" : "5fb4a988baad433e9900f1a814b89caa" |       "hash" : "6040fe830d8f0868cdb38ee2b8ee16ac" | ||||||
|     }, |     }, | ||||||
|     "app-fact-glow-large"          : { |     "app-fact-glow-large"          : { | ||||||
|       "name" : "app-fact-glow-large", |       "name" : "app-fact-glow-large", | ||||||
|       "rule" : ".app-fact-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-fact-light-large", |       "rule" : ".app-fact-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-fact-light-large", | ||||||
|       "hash" : "5bd7e5f2adfa0935ae97270139ec4912" |       "hash" : "691ab101af38d4f06421ca0b22e463d9" | ||||||
|     }, |     }, | ||||||
|     "app-fact-light-large"         : { |     "app-fact-light-large"         : { | ||||||
|       "name" : "app-fact-light-large", |       "name" : "app-fact-light-large", | ||||||
|       "rule" : ".app-fact-light-large", |       "rule" : ".app-fact-light-large", | ||||||
|       "hash" : "3bc45d399dad8ec8d55873714c42c1d7" |       "hash" : "8253f813361ba065866ee6e6e2077320" | ||||||
|     }, |     }, | ||||||
|     "app-feed-blue-large"          : { |     "app-feed-blue-large"          : { | ||||||
|       "name" : "app-feed-blue-large", |       "name" : "app-feed-blue-large", | ||||||
|       "rule" : ".app-feed-blue-large, .phabricator-crumb-view:hover .app-feed-dark-large", |       "rule" : ".app-feed-blue-large, .phabricator-crumb-view:hover .app-feed-dark-large", | ||||||
|       "hash" : "3bcdec795b38002644a8009c927a0acc" |       "hash" : "462246f99422c86301b7d4faa67d9488" | ||||||
|     }, |     }, | ||||||
|     "app-feed-dark-large"          : { |     "app-feed-dark-large"          : { | ||||||
|       "name" : "app-feed-dark-large", |       "name" : "app-feed-dark-large", | ||||||
|       "rule" : ".app-feed-dark-large", |       "rule" : ".app-feed-dark-large", | ||||||
|       "hash" : "e83834eccc699399b604069b95465cff" |       "hash" : "0eecff752dc5dde55e7feaa52b7ee7d0" | ||||||
|     }, |     }, | ||||||
|     "app-feed-glow-large"          : { |     "app-feed-glow-large"          : { | ||||||
|       "name" : "app-feed-glow-large", |       "name" : "app-feed-glow-large", | ||||||
|       "rule" : ".app-feed-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-feed-light-large", |       "rule" : ".app-feed-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-feed-light-large", | ||||||
|       "hash" : "ca2fb9a2cd437b465f5d912a4d26f3e5" |       "hash" : "45fe559a997e540933c184ae570a6ddc" | ||||||
|     }, |     }, | ||||||
|     "app-feed-light-large"         : { |     "app-feed-light-large"         : { | ||||||
|       "name" : "app-feed-light-large", |       "name" : "app-feed-light-large", | ||||||
|       "rule" : ".app-feed-light-large", |       "rule" : ".app-feed-light-large", | ||||||
|       "hash" : "e3a8add13539550ddaab62f84b30dd66" |       "hash" : "2ec6e12956fe1e1b746261bb3d0a0d36" | ||||||
|     }, |     }, | ||||||
|     "app-files-blue-large"         : { |     "app-files-blue-large"         : { | ||||||
|       "name" : "app-files-blue-large", |       "name" : "app-files-blue-large", | ||||||
|       "rule" : ".app-files-blue-large, .phabricator-crumb-view:hover .app-files-dark-large", |       "rule" : ".app-files-blue-large, .phabricator-crumb-view:hover .app-files-dark-large", | ||||||
|       "hash" : "4505af3a9261a1ee4e00bf1d046286dd" |       "hash" : "f9217c49be154a830303285ae64790c8" | ||||||
|     }, |     }, | ||||||
|     "app-files-dark-large"         : { |     "app-files-dark-large"         : { | ||||||
|       "name" : "app-files-dark-large", |       "name" : "app-files-dark-large", | ||||||
|       "rule" : ".app-files-dark-large", |       "rule" : ".app-files-dark-large", | ||||||
|       "hash" : "1d229c79f3b8301ca1ee38ccd9c7c142" |       "hash" : "78fb66b9edc99c3694325548582f0506" | ||||||
|     }, |     }, | ||||||
|     "app-files-glow-large"         : { |     "app-files-glow-large"         : { | ||||||
|       "name" : "app-files-glow-large", |       "name" : "app-files-glow-large", | ||||||
|       "rule" : ".app-files-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-files-light-large", |       "rule" : ".app-files-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-files-light-large", | ||||||
|       "hash" : "4bd7617617d0af975282bdd9a399d0ab" |       "hash" : "cabf071ace59043fc877f1e962109c83" | ||||||
|     }, |     }, | ||||||
|     "app-files-light-large"        : { |     "app-files-light-large"        : { | ||||||
|       "name" : "app-files-light-large", |       "name" : "app-files-light-large", | ||||||
|       "rule" : ".app-files-light-large", |       "rule" : ".app-files-light-large", | ||||||
|       "hash" : "0d8bf609759312d89e2a4b148f0701d8" |       "hash" : "ee5503d0684ea20be40023a29589d322" | ||||||
|     }, |     }, | ||||||
|     "app-flags-blue-large"         : { |     "app-flags-blue-large"         : { | ||||||
|       "name" : "app-flags-blue-large", |       "name" : "app-flags-blue-large", | ||||||
|       "rule" : ".app-flags-blue-large, .phabricator-crumb-view:hover .app-flags-dark-large", |       "rule" : ".app-flags-blue-large, .phabricator-crumb-view:hover .app-flags-dark-large", | ||||||
|       "hash" : "a6f52b520f88e4ef60b7a76fb3c2c597" |       "hash" : "8bbdefdaba30bf6a020f8515ee33d452" | ||||||
|     }, |     }, | ||||||
|     "app-flags-dark-large"         : { |     "app-flags-dark-large"         : { | ||||||
|       "name" : "app-flags-dark-large", |       "name" : "app-flags-dark-large", | ||||||
|       "rule" : ".app-flags-dark-large", |       "rule" : ".app-flags-dark-large", | ||||||
|       "hash" : "51307234bb3c309b3ea69381e0b72b16" |       "hash" : "c6824e1362ec59ccf9ad8f451da466c1" | ||||||
|     }, |     }, | ||||||
|     "app-flags-glow-large"         : { |     "app-flags-glow-large"         : { | ||||||
|       "name" : "app-flags-glow-large", |       "name" : "app-flags-glow-large", | ||||||
|       "rule" : ".app-flags-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-flags-light-large", |       "rule" : ".app-flags-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-flags-light-large", | ||||||
|       "hash" : "75c1c107f4e750ef27bf50b4b51b0e00" |       "hash" : "e728b1018c62d24efa5d416d138cb671" | ||||||
|     }, |     }, | ||||||
|     "app-flags-light-large"        : { |     "app-flags-light-large"        : { | ||||||
|       "name" : "app-flags-light-large", |       "name" : "app-flags-light-large", | ||||||
|       "rule" : ".app-flags-light-large", |       "rule" : ".app-flags-light-large", | ||||||
|       "hash" : "8c198ba5bcd146595870bab777d4992e" |       "hash" : "4a40dc3e18011a8283840e5dfbe14dc9" | ||||||
|     }, |     }, | ||||||
|     "app-help-blue-large"          : { |     "app-help-blue-large"          : { | ||||||
|       "name" : "app-help-blue-large", |       "name" : "app-help-blue-large", | ||||||
|       "rule" : ".app-help-blue-large, .phabricator-crumb-view:hover .app-help-dark-large", |       "rule" : ".app-help-blue-large, .phabricator-crumb-view:hover .app-help-dark-large", | ||||||
|       "hash" : "a74c4f436b2e70c0e06f4224953d064a" |       "hash" : "703f8c674cdd22f1314ffe8977acf35b" | ||||||
|     }, |     }, | ||||||
|     "app-help-dark-large"          : { |     "app-help-dark-large"          : { | ||||||
|       "name" : "app-help-dark-large", |       "name" : "app-help-dark-large", | ||||||
|       "rule" : ".app-help-dark-large", |       "rule" : ".app-help-dark-large", | ||||||
|       "hash" : "3cbd366c4b5758e45ef07507c70f68c0" |       "hash" : "601aaf7047f9db41baf7e3393b0d7aeb" | ||||||
|     }, |     }, | ||||||
|     "app-help-glow-large"          : { |     "app-help-glow-large"          : { | ||||||
|       "name" : "app-help-glow-large", |       "name" : "app-help-glow-large", | ||||||
|       "rule" : ".app-help-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-help-light-large", |       "rule" : ".app-help-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-help-light-large", | ||||||
|       "hash" : "c795358a116961342b206821a1b8038b" |       "hash" : "1a2928f28cbfdcc31f411e7d2dc26447" | ||||||
|     }, |     }, | ||||||
|     "app-help-light-large"         : { |     "app-help-light-large"         : { | ||||||
|       "name" : "app-help-light-large", |       "name" : "app-help-light-large", | ||||||
|       "rule" : ".app-help-light-large", |       "rule" : ".app-help-light-large", | ||||||
|       "hash" : "722eceffe63605b00a5b957b5f40db98" |       "hash" : "c17b8e6228f844777177c5070e17dd91" | ||||||
|     }, |     }, | ||||||
|     "app-herald-blue-large"        : { |     "app-herald-blue-large"        : { | ||||||
|       "name" : "app-herald-blue-large", |       "name" : "app-herald-blue-large", | ||||||
|       "rule" : ".app-herald-blue-large, .phabricator-crumb-view:hover .app-herald-dark-large", |       "rule" : ".app-herald-blue-large, .phabricator-crumb-view:hover .app-herald-dark-large", | ||||||
|       "hash" : "9edfe47e8f1f2c4f1071f4d8b6ed346d" |       "hash" : "4bf9b4b872e7207d66c6e80dcad47b0e" | ||||||
|     }, |     }, | ||||||
|     "app-herald-dark-large"        : { |     "app-herald-dark-large"        : { | ||||||
|       "name" : "app-herald-dark-large", |       "name" : "app-herald-dark-large", | ||||||
|       "rule" : ".app-herald-dark-large", |       "rule" : ".app-herald-dark-large", | ||||||
|       "hash" : "4b7a3ab5e0b6a04224ccb6e520e73d6e" |       "hash" : "e19fd614bf5f904603517df957165b22" | ||||||
|     }, |     }, | ||||||
|     "app-herald-glow-large"        : { |     "app-herald-glow-large"        : { | ||||||
|       "name" : "app-herald-glow-large", |       "name" : "app-herald-glow-large", | ||||||
|       "rule" : ".app-herald-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-herald-light-large", |       "rule" : ".app-herald-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-herald-light-large", | ||||||
|       "hash" : "22beef0629ee517ba1a2b822ed440d0c" |       "hash" : "13ef725e4f2da68211cf9ab17740c723" | ||||||
|     }, |     }, | ||||||
|     "app-herald-light-large"       : { |     "app-herald-light-large"       : { | ||||||
|       "name" : "app-herald-light-large", |       "name" : "app-herald-light-large", | ||||||
|       "rule" : ".app-herald-light-large", |       "rule" : ".app-herald-light-large", | ||||||
|       "hash" : "65bbeb68fd051b77f4871aafe2994f56" |       "hash" : "81af2b9899db0b5c877d96016ddfa1a1" | ||||||
|     }, |     }, | ||||||
|     "app-home-blue-large"          : { |     "app-home-blue-large"          : { | ||||||
|       "name" : "app-home-blue-large", |       "name" : "app-home-blue-large", | ||||||
|       "rule" : ".app-home-blue-large, .phabricator-crumb-view:hover .app-home-dark-large", |       "rule" : ".app-home-blue-large, .phabricator-crumb-view:hover .app-home-dark-large", | ||||||
|       "hash" : "7df64082c33dcc3d2263772c0393be70" |       "hash" : "7011cb276b9d7d1f042d2f0393a74312" | ||||||
|     }, |     }, | ||||||
|     "app-home-dark-large"          : { |     "app-home-dark-large"          : { | ||||||
|       "name" : "app-home-dark-large", |       "name" : "app-home-dark-large", | ||||||
|       "rule" : ".app-home-dark-large", |       "rule" : ".app-home-dark-large", | ||||||
|       "hash" : "79acb839094adcb3ad94567c054801eb" |       "hash" : "6b7f677ad630593900132f6271c41cb4" | ||||||
|     }, |     }, | ||||||
|     "app-home-glow-large"          : { |     "app-home-glow-large"          : { | ||||||
|       "name" : "app-home-glow-large", |       "name" : "app-home-glow-large", | ||||||
|       "rule" : ".app-home-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-home-light-large", |       "rule" : ".app-home-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-home-light-large", | ||||||
|       "hash" : "5af620ae48ba98ee4ee594c32ba761cb" |       "hash" : "8b61be58e6a4f0e9e73434c40844260b" | ||||||
|     }, |     }, | ||||||
|     "app-home-light-large"         : { |     "app-home-light-large"         : { | ||||||
|       "name" : "app-home-light-large", |       "name" : "app-home-light-large", | ||||||
|       "rule" : ".app-home-light-large", |       "rule" : ".app-home-light-large", | ||||||
|       "hash" : "181a71639319f3beda59809963384250" |       "hash" : "f0740b16cd3746a1234070f1785c03eb" | ||||||
|     }, |     }, | ||||||
|     "app-logo-blue-large"          : { |     "app-logo-blue-large"          : { | ||||||
|       "name" : "app-logo-blue-large", |       "name" : "app-logo-blue-large", | ||||||
|       "rule" : ".app-logo-blue-large, .phabricator-crumb-view:hover .app-logo-dark-large", |       "rule" : ".app-logo-blue-large, .phabricator-crumb-view:hover .app-logo-dark-large", | ||||||
|       "hash" : "025f46665b079f5899ec53be09165d09" |       "hash" : "64a8124698f9441f50230f3a63364dd7" | ||||||
|     }, |     }, | ||||||
|     "app-logo-dark-large"          : { |     "app-logo-dark-large"          : { | ||||||
|       "name" : "app-logo-dark-large", |       "name" : "app-logo-dark-large", | ||||||
|       "rule" : ".app-logo-dark-large", |       "rule" : ".app-logo-dark-large", | ||||||
|       "hash" : "20524d2868b7b57423aa8dc27b284cac" |       "hash" : "8023a60fcba24c3f200214152a62a2c3" | ||||||
|     }, |     }, | ||||||
|     "app-logo-glow-large"          : { |     "app-logo-glow-large"          : { | ||||||
|       "name" : "app-logo-glow-large", |       "name" : "app-logo-glow-large", | ||||||
|       "rule" : ".app-logo-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-logo-light-large", |       "rule" : ".app-logo-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-logo-light-large", | ||||||
|       "hash" : "3969545781a17ec856bacec4ed110506" |       "hash" : "c742c782b92cc5fecdc1a9747568ad70" | ||||||
|     }, |     }, | ||||||
|     "app-logo-light-large"         : { |     "app-logo-light-large"         : { | ||||||
|       "name" : "app-logo-light-large", |       "name" : "app-logo-light-large", | ||||||
|       "rule" : ".app-logo-light-large", |       "rule" : ".app-logo-light-large", | ||||||
|       "hash" : "bd1b66ffad9ee26019738fc00a7eb343" |       "hash" : "52fc06fb90f7ec1c29498069b1a059b2" | ||||||
|     }, |     }, | ||||||
|     "app-macro-blue-large"         : { |     "app-macro-blue-large"         : { | ||||||
|       "name" : "app-macro-blue-large", |       "name" : "app-macro-blue-large", | ||||||
|       "rule" : ".app-macro-blue-large, .phabricator-crumb-view:hover .app-macro-dark-large", |       "rule" : ".app-macro-blue-large, .phabricator-crumb-view:hover .app-macro-dark-large", | ||||||
|       "hash" : "a6116a196718bf6cd5337b4c49de710e" |       "hash" : "50c14fec9a7f913c8aa4a2793bf2867c" | ||||||
|     }, |     }, | ||||||
|     "app-macro-dark-large"         : { |     "app-macro-dark-large"         : { | ||||||
|       "name" : "app-macro-dark-large", |       "name" : "app-macro-dark-large", | ||||||
|       "rule" : ".app-macro-dark-large", |       "rule" : ".app-macro-dark-large", | ||||||
|       "hash" : "583a495f319fb63f99400b0197832dce" |       "hash" : "890cde6b9407d00c6394d446974674ff" | ||||||
|     }, |     }, | ||||||
|     "app-macro-glow-large"         : { |     "app-macro-glow-large"         : { | ||||||
|       "name" : "app-macro-glow-large", |       "name" : "app-macro-glow-large", | ||||||
|       "rule" : ".app-macro-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-macro-light-large", |       "rule" : ".app-macro-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-macro-light-large", | ||||||
|       "hash" : "16d2c3aeabb43a51bb5742c67c4b92a1" |       "hash" : "a3aaa9ebca64e5659e8c3c4eebdedd7a" | ||||||
|     }, |     }, | ||||||
|     "app-macro-light-large"        : { |     "app-macro-light-large"        : { | ||||||
|       "name" : "app-macro-light-large", |       "name" : "app-macro-light-large", | ||||||
|       "rule" : ".app-macro-light-large", |       "rule" : ".app-macro-light-large", | ||||||
|       "hash" : "b073066348826c93f57ba76f746e5c7e" |       "hash" : "7dcba4f0560b9e197849f5540b7ec66d" | ||||||
|     }, |     }, | ||||||
|     "app-mail-blue-large"          : { |     "app-mail-blue-large"          : { | ||||||
|       "name" : "app-mail-blue-large", |       "name" : "app-mail-blue-large", | ||||||
|       "rule" : ".app-mail-blue-large, .phabricator-crumb-view:hover .app-mail-dark-large", |       "rule" : ".app-mail-blue-large, .phabricator-crumb-view:hover .app-mail-dark-large", | ||||||
|       "hash" : "192f85bd7a5be296de7acff9bbc9bd1d" |       "hash" : "a0a94c194794bb435ea3152ecb2cd42d" | ||||||
|     }, |     }, | ||||||
|     "app-mail-dark-large"          : { |     "app-mail-dark-large"          : { | ||||||
|       "name" : "app-mail-dark-large", |       "name" : "app-mail-dark-large", | ||||||
|       "rule" : ".app-mail-dark-large", |       "rule" : ".app-mail-dark-large", | ||||||
|       "hash" : "4709516a74216e0ba886a30180ad93d4" |       "hash" : "1a1437047fd24b9bb2643435185b6f13" | ||||||
|     }, |     }, | ||||||
|     "app-mail-glow-large"          : { |     "app-mail-glow-large"          : { | ||||||
|       "name" : "app-mail-glow-large", |       "name" : "app-mail-glow-large", | ||||||
|       "rule" : ".app-mail-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-mail-light-large", |       "rule" : ".app-mail-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-mail-light-large", | ||||||
|       "hash" : "1f0d2be98c3771791db7a9ad20784872" |       "hash" : "141548cae4bf8265be9452e583be3504" | ||||||
|     }, |     }, | ||||||
|     "app-mail-light-large"         : { |     "app-mail-light-large"         : { | ||||||
|       "name" : "app-mail-light-large", |       "name" : "app-mail-light-large", | ||||||
|       "rule" : ".app-mail-light-large", |       "rule" : ".app-mail-light-large", | ||||||
|       "hash" : "740ea3d3104365ab7bad981b13d23693" |       "hash" : "27aec2b8d5bd1fb7eba00ffbaacf1930" | ||||||
|     }, |     }, | ||||||
|     "app-maniphest-blue-large"     : { |     "app-maniphest-blue-large"     : { | ||||||
|       "name" : "app-maniphest-blue-large", |       "name" : "app-maniphest-blue-large", | ||||||
|       "rule" : ".app-maniphest-blue-large, .phabricator-crumb-view:hover .app-maniphest-dark-large", |       "rule" : ".app-maniphest-blue-large, .phabricator-crumb-view:hover .app-maniphest-dark-large", | ||||||
|       "hash" : "d667667cc5216ff510cb58c359ffc2a4" |       "hash" : "619ff6fea2c90a8d70b000ed0ece6e4b" | ||||||
|     }, |     }, | ||||||
|     "app-maniphest-dark-large"     : { |     "app-maniphest-dark-large"     : { | ||||||
|       "name" : "app-maniphest-dark-large", |       "name" : "app-maniphest-dark-large", | ||||||
|       "rule" : ".app-maniphest-dark-large", |       "rule" : ".app-maniphest-dark-large", | ||||||
|       "hash" : "acadb7737b24ecc23e892cdaab7c1fe2" |       "hash" : "7a204fc2f4779eff27847bf799652140" | ||||||
|     }, |     }, | ||||||
|     "app-maniphest-glow-large"     : { |     "app-maniphest-glow-large"     : { | ||||||
|       "name" : "app-maniphest-glow-large", |       "name" : "app-maniphest-glow-large", | ||||||
|       "rule" : ".app-maniphest-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-maniphest-light-large", |       "rule" : ".app-maniphest-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-maniphest-light-large", | ||||||
|       "hash" : "8dccd7ba95ddffc4e071e42b69773f5c" |       "hash" : "2b67eff9fb01bdf0972749532301e038" | ||||||
|     }, |     }, | ||||||
|     "app-maniphest-light-large"    : { |     "app-maniphest-light-large"    : { | ||||||
|       "name" : "app-maniphest-light-large", |       "name" : "app-maniphest-light-large", | ||||||
|       "rule" : ".app-maniphest-light-large", |       "rule" : ".app-maniphest-light-large", | ||||||
|       "hash" : "0d2c71a1279686c3884c267d98bc36ba" |       "hash" : "90ea395741410840b1b4a974f802b06c" | ||||||
|     }, |     }, | ||||||
|     "app-metamta-blue-large"       : { |     "app-metamta-blue-large"       : { | ||||||
|       "name" : "app-metamta-blue-large", |       "name" : "app-metamta-blue-large", | ||||||
|       "rule" : ".app-metamta-blue-large, .phabricator-crumb-view:hover .app-metamta-dark-large", |       "rule" : ".app-metamta-blue-large, .phabricator-crumb-view:hover .app-metamta-dark-large", | ||||||
|       "hash" : "1757d281dcdbdf221ca2b2e90993dba8" |       "hash" : "48af88efc2887cc985f09d5202922df0" | ||||||
|     }, |     }, | ||||||
|     "app-metamta-dark-large"       : { |     "app-metamta-dark-large"       : { | ||||||
|       "name" : "app-metamta-dark-large", |       "name" : "app-metamta-dark-large", | ||||||
|       "rule" : ".app-metamta-dark-large", |       "rule" : ".app-metamta-dark-large", | ||||||
|       "hash" : "c5f3a7468d98ebb977bfb0cc81abd5ee" |       "hash" : "bf18a2c7ef31e72dc9ce6695035baf60" | ||||||
|     }, |     }, | ||||||
|     "app-metamta-glow-large"       : { |     "app-metamta-glow-large"       : { | ||||||
|       "name" : "app-metamta-glow-large", |       "name" : "app-metamta-glow-large", | ||||||
|       "rule" : ".app-metamta-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-metamta-light-large", |       "rule" : ".app-metamta-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-metamta-light-large", | ||||||
|       "hash" : "5f7b115d45e5d3a5a5a730173366f2e4" |       "hash" : "74c00295bf0d394e6427593665a271f1" | ||||||
|     }, |     }, | ||||||
|     "app-metamta-light-large"      : { |     "app-metamta-light-large"      : { | ||||||
|       "name" : "app-metamta-light-large", |       "name" : "app-metamta-light-large", | ||||||
|       "rule" : ".app-metamta-light-large", |       "rule" : ".app-metamta-light-large", | ||||||
|       "hash" : "13ce4ca0f223cda37e3af39da8c6e564" |       "hash" : "720cc7f66ab36770998aa4fe9ad22785" | ||||||
|     }, |     }, | ||||||
|     "app-owners-blue-large"        : { |     "app-owners-blue-large"        : { | ||||||
|       "name" : "app-owners-blue-large", |       "name" : "app-owners-blue-large", | ||||||
|       "rule" : ".app-owners-blue-large, .phabricator-crumb-view:hover .app-owners-dark-large", |       "rule" : ".app-owners-blue-large, .phabricator-crumb-view:hover .app-owners-dark-large", | ||||||
|       "hash" : "585c128af418f94b8fbf18206605ec84" |       "hash" : "ee909b2d51a3c52b38c0cca3da8d861d" | ||||||
|     }, |     }, | ||||||
|     "app-owners-dark-large"        : { |     "app-owners-dark-large"        : { | ||||||
|       "name" : "app-owners-dark-large", |       "name" : "app-owners-dark-large", | ||||||
|       "rule" : ".app-owners-dark-large", |       "rule" : ".app-owners-dark-large", | ||||||
|       "hash" : "b09a80f307491acbe56fb16e01956173" |       "hash" : "05a6fcc603b5ee346d25b1fb25e7e695" | ||||||
|     }, |     }, | ||||||
|     "app-owners-glow-large"        : { |     "app-owners-glow-large"        : { | ||||||
|       "name" : "app-owners-glow-large", |       "name" : "app-owners-glow-large", | ||||||
|       "rule" : ".app-owners-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-owners-light-large", |       "rule" : ".app-owners-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-owners-light-large", | ||||||
|       "hash" : "a63816e6979ec6c222a086b5d72a0b86" |       "hash" : "4bcba14ffcdf7ac3c1968ebcc34f7e37" | ||||||
|     }, |     }, | ||||||
|     "app-owners-light-large"       : { |     "app-owners-light-large"       : { | ||||||
|       "name" : "app-owners-light-large", |       "name" : "app-owners-light-large", | ||||||
|       "rule" : ".app-owners-light-large", |       "rule" : ".app-owners-light-large", | ||||||
|       "hash" : "6b06493f46a91584e746e5034be15366" |       "hash" : "2d6b3f02f210c73242d91bdb9ef8456c" | ||||||
|     }, |     }, | ||||||
|     "app-paste-blue-large"         : { |     "app-paste-blue-large"         : { | ||||||
|       "name" : "app-paste-blue-large", |       "name" : "app-paste-blue-large", | ||||||
|       "rule" : ".app-paste-blue-large, .phabricator-crumb-view:hover .app-paste-dark-large", |       "rule" : ".app-paste-blue-large, .phabricator-crumb-view:hover .app-paste-dark-large", | ||||||
|       "hash" : "4a14c100c5b78282712dd2cc619d72b4" |       "hash" : "2ce99237cc2f064f0aa48fb1d147c781" | ||||||
|     }, |     }, | ||||||
|     "app-paste-dark-large"         : { |     "app-paste-dark-large"         : { | ||||||
|       "name" : "app-paste-dark-large", |       "name" : "app-paste-dark-large", | ||||||
|       "rule" : ".app-paste-dark-large", |       "rule" : ".app-paste-dark-large", | ||||||
|       "hash" : "03d3dded4964e60771c8a45549e13973" |       "hash" : "f566e3e0c8e6a17b7c2fc4168b079ede" | ||||||
|     }, |     }, | ||||||
|     "app-paste-glow-large"         : { |     "app-paste-glow-large"         : { | ||||||
|       "name" : "app-paste-glow-large", |       "name" : "app-paste-glow-large", | ||||||
|       "rule" : ".app-paste-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-paste-light-large", |       "rule" : ".app-paste-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-paste-light-large", | ||||||
|       "hash" : "507192b6a41abdc1a886a144cc315326" |       "hash" : "34333bbb31fb3909461cc064ea2f72e9" | ||||||
|     }, |     }, | ||||||
|     "app-paste-light-large"        : { |     "app-paste-light-large"        : { | ||||||
|       "name" : "app-paste-light-large", |       "name" : "app-paste-light-large", | ||||||
|       "rule" : ".app-paste-light-large", |       "rule" : ".app-paste-light-large", | ||||||
|       "hash" : "66f1f8fe7acafaab5f608598589aaa5c" |       "hash" : "e77a206e1cbaf1417b4a0b9f3d67380a" | ||||||
|     }, |     }, | ||||||
|     "app-people-blue-large"        : { |     "app-people-blue-large"        : { | ||||||
|       "name" : "app-people-blue-large", |       "name" : "app-people-blue-large", | ||||||
|       "rule" : ".app-people-blue-large, .phabricator-crumb-view:hover .app-people-dark-large", |       "rule" : ".app-people-blue-large, .phabricator-crumb-view:hover .app-people-dark-large", | ||||||
|       "hash" : "ed242e94b2b5698fd90261ca63aef8a6" |       "hash" : "37fcac5bc4ad63c37d68da2c77717301" | ||||||
|     }, |     }, | ||||||
|     "app-people-dark-large"        : { |     "app-people-dark-large"        : { | ||||||
|       "name" : "app-people-dark-large", |       "name" : "app-people-dark-large", | ||||||
|       "rule" : ".app-people-dark-large", |       "rule" : ".app-people-dark-large", | ||||||
|       "hash" : "b1748b3a5afacd4f8afcd5ea37352dc7" |       "hash" : "01fb27eba95c01d1aadde04ea4513caa" | ||||||
|     }, |     }, | ||||||
|     "app-people-glow-large"        : { |     "app-people-glow-large"        : { | ||||||
|       "name" : "app-people-glow-large", |       "name" : "app-people-glow-large", | ||||||
|       "rule" : ".app-people-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-people-light-large", |       "rule" : ".app-people-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-people-light-large", | ||||||
|       "hash" : "ed1b2d2d27ae8fd07d0e5e1d4002625e" |       "hash" : "6d859c1505f5877b86faf34385bbcd59" | ||||||
|     }, |     }, | ||||||
|     "app-people-light-large"       : { |     "app-people-light-large"       : { | ||||||
|       "name" : "app-people-light-large", |       "name" : "app-people-light-large", | ||||||
|       "rule" : ".app-people-light-large", |       "rule" : ".app-people-light-large", | ||||||
|       "hash" : "f6efcbdbcee02f9f37f92774b4b0e4cf" |       "hash" : "d1d80fddc9e6295494d12b72b4700dc5" | ||||||
|     }, |     }, | ||||||
|     "app-phame-blue-large"         : { |     "app-phame-blue-large"         : { | ||||||
|       "name" : "app-phame-blue-large", |       "name" : "app-phame-blue-large", | ||||||
|       "rule" : ".app-phame-blue-large, .phabricator-crumb-view:hover .app-phame-dark-large", |       "rule" : ".app-phame-blue-large, .phabricator-crumb-view:hover .app-phame-dark-large", | ||||||
|       "hash" : "d448b392b7bc927b9b5522d525fa8c49" |       "hash" : "f72bd35227e9ba2157852377e2d87ec4" | ||||||
|     }, |     }, | ||||||
|     "app-phame-dark-large"         : { |     "app-phame-dark-large"         : { | ||||||
|       "name" : "app-phame-dark-large", |       "name" : "app-phame-dark-large", | ||||||
|       "rule" : ".app-phame-dark-large", |       "rule" : ".app-phame-dark-large", | ||||||
|       "hash" : "a7cf2f8ec22cdb675a3bc792c7c1edf6" |       "hash" : "7bfe54cf7d885985fb7e06ad0abaf4e9" | ||||||
|     }, |     }, | ||||||
|     "app-phame-glow-large"         : { |     "app-phame-glow-large"         : { | ||||||
|       "name" : "app-phame-glow-large", |       "name" : "app-phame-glow-large", | ||||||
|       "rule" : ".app-phame-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phame-light-large", |       "rule" : ".app-phame-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phame-light-large", | ||||||
|       "hash" : "4587c25ff8a94fd48a1a0ca2e9fd9f42" |       "hash" : "60013586092f2c5eb5ed1f58c7f02a74" | ||||||
|     }, |     }, | ||||||
|     "app-phame-light-large"        : { |     "app-phame-light-large"        : { | ||||||
|       "name" : "app-phame-light-large", |       "name" : "app-phame-light-large", | ||||||
|       "rule" : ".app-phame-light-large", |       "rule" : ".app-phame-light-large", | ||||||
|       "hash" : "265471ec8d3c7ddeb3c269384d22243d" |       "hash" : "5266f8774d0470adc65f610c9175a251" | ||||||
|     }, |     }, | ||||||
|     "app-phid-blue-large"          : { |     "app-phid-blue-large"          : { | ||||||
|       "name" : "app-phid-blue-large", |       "name" : "app-phid-blue-large", | ||||||
|       "rule" : ".app-phid-blue-large, .phabricator-crumb-view:hover .app-phid-dark-large", |       "rule" : ".app-phid-blue-large, .phabricator-crumb-view:hover .app-phid-dark-large", | ||||||
|       "hash" : "b94bc233e1bcf520c65351b71794c228" |       "hash" : "d726ca94608547ff3974a1d49e6b1012" | ||||||
|     }, |     }, | ||||||
|     "app-phid-dark-large"          : { |     "app-phid-dark-large"          : { | ||||||
|       "name" : "app-phid-dark-large", |       "name" : "app-phid-dark-large", | ||||||
|       "rule" : ".app-phid-dark-large", |       "rule" : ".app-phid-dark-large", | ||||||
|       "hash" : "f4dfdcc8e1fde50cfcb7e07376696964" |       "hash" : "04af0c932bea8b7c36f6dc954994ea11" | ||||||
|     }, |     }, | ||||||
|     "app-phid-glow-large"          : { |     "app-phid-glow-large"          : { | ||||||
|       "name" : "app-phid-glow-large", |       "name" : "app-phid-glow-large", | ||||||
|       "rule" : ".app-phid-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phid-light-large", |       "rule" : ".app-phid-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phid-light-large", | ||||||
|       "hash" : "10ec316b409b385e19800048fcb1a79e" |       "hash" : "b1e8a6e4ac9ad64d34fbc7560d507e5b" | ||||||
|     }, |     }, | ||||||
|     "app-phid-light-large"         : { |     "app-phid-light-large"         : { | ||||||
|       "name" : "app-phid-light-large", |       "name" : "app-phid-light-large", | ||||||
|       "rule" : ".app-phid-light-large", |       "rule" : ".app-phid-light-large", | ||||||
|       "hash" : "0087c573b07d8badaeadcb8ad560ae9b" |       "hash" : "0ba23a08c29e8064fdddee9112c638e3" | ||||||
|     }, |     }, | ||||||
|     "app-pholio-blue-large"        : { |     "app-pholio-blue-large"        : { | ||||||
|       "name" : "app-pholio-blue-large", |       "name" : "app-pholio-blue-large", | ||||||
|       "rule" : ".app-pholio-blue-large, .phabricator-crumb-view:hover .app-pholio-dark-large", |       "rule" : ".app-pholio-blue-large, .phabricator-crumb-view:hover .app-pholio-dark-large", | ||||||
|       "hash" : "5b8e3f47a49a0dee84c1b7c228884f0c" |       "hash" : "08bfdf63411a09e6be88d99128c1e9f8" | ||||||
|     }, |     }, | ||||||
|     "app-pholio-dark-large"        : { |     "app-pholio-dark-large"        : { | ||||||
|       "name" : "app-pholio-dark-large", |       "name" : "app-pholio-dark-large", | ||||||
|       "rule" : ".app-pholio-dark-large", |       "rule" : ".app-pholio-dark-large", | ||||||
|       "hash" : "4a73276e5bcd9cfbb08435ed36051dff" |       "hash" : "2a8bfa3870726691766fe3f6cb73df38" | ||||||
|     }, |     }, | ||||||
|     "app-pholio-glow-large"        : { |     "app-pholio-glow-large"        : { | ||||||
|       "name" : "app-pholio-glow-large", |       "name" : "app-pholio-glow-large", | ||||||
|       "rule" : ".app-pholio-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-pholio-light-large", |       "rule" : ".app-pholio-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-pholio-light-large", | ||||||
|       "hash" : "aca383c3c4fcec4742a11702e3427221" |       "hash" : "499b68a80e78ab5f6ebe5ba7470fbb4a" | ||||||
|     }, |     }, | ||||||
|     "app-pholio-light-large"       : { |     "app-pholio-light-large"       : { | ||||||
|       "name" : "app-pholio-light-large", |       "name" : "app-pholio-light-large", | ||||||
|       "rule" : ".app-pholio-light-large", |       "rule" : ".app-pholio-light-large", | ||||||
|       "hash" : "1a3ace478c2b0f9b444005112e17c695" |       "hash" : "9a4d4223e6e1d7a77c4545504ea0908c" | ||||||
|     }, |     }, | ||||||
|     "app-phpast-blue-large"        : { |     "app-phpast-blue-large"        : { | ||||||
|       "name" : "app-phpast-blue-large", |       "name" : "app-phpast-blue-large", | ||||||
|       "rule" : ".app-phpast-blue-large, .phabricator-crumb-view:hover .app-phpast-dark-large", |       "rule" : ".app-phpast-blue-large, .phabricator-crumb-view:hover .app-phpast-dark-large", | ||||||
|       "hash" : "22ba8a058d6b920a909c5f6731f301a0" |       "hash" : "a9f4f0a62e5841b2ed669dc02694419d" | ||||||
|     }, |     }, | ||||||
|     "app-phpast-dark-large"        : { |     "app-phpast-dark-large"        : { | ||||||
|       "name" : "app-phpast-dark-large", |       "name" : "app-phpast-dark-large", | ||||||
|       "rule" : ".app-phpast-dark-large", |       "rule" : ".app-phpast-dark-large", | ||||||
|       "hash" : "bdbfd96cb50a8b7450daf82576fcfe95" |       "hash" : "1dbc83cc09d722253b634f3308608627" | ||||||
|     }, |     }, | ||||||
|     "app-phpast-glow-large"        : { |     "app-phpast-glow-large"        : { | ||||||
|       "name" : "app-phpast-glow-large", |       "name" : "app-phpast-glow-large", | ||||||
|       "rule" : ".app-phpast-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phpast-light-large", |       "rule" : ".app-phpast-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phpast-light-large", | ||||||
|       "hash" : "ce7433350eeaee95ecf358905ad38029" |       "hash" : "e98e4cdc93e51b0d7c1df25c01c75fac" | ||||||
|     }, |     }, | ||||||
|     "app-phpast-light-large"       : { |     "app-phpast-light-large"       : { | ||||||
|       "name" : "app-phpast-light-large", |       "name" : "app-phpast-light-large", | ||||||
|       "rule" : ".app-phpast-light-large", |       "rule" : ".app-phpast-light-large", | ||||||
|       "hash" : "5ebd26eb5e0bc0229db5696020dd9b4a" |       "hash" : "c63fb0fe3cc326f1a19e4e59c42a73f7" | ||||||
|     }, |     }, | ||||||
|     "app-phriction-blue-large"     : { |     "app-phriction-blue-large"     : { | ||||||
|       "name" : "app-phriction-blue-large", |       "name" : "app-phriction-blue-large", | ||||||
|       "rule" : ".app-phriction-blue-large, .phabricator-crumb-view:hover .app-phriction-dark-large", |       "rule" : ".app-phriction-blue-large, .phabricator-crumb-view:hover .app-phriction-dark-large", | ||||||
|       "hash" : "0134e9d694ce72a6d9c554e639a6ed50" |       "hash" : "55bbded073e078117369f42e05b5b5c4" | ||||||
|     }, |     }, | ||||||
|     "app-phriction-dark-large"     : { |     "app-phriction-dark-large"     : { | ||||||
|       "name" : "app-phriction-dark-large", |       "name" : "app-phriction-dark-large", | ||||||
|       "rule" : ".app-phriction-dark-large", |       "rule" : ".app-phriction-dark-large", | ||||||
|       "hash" : "e4f3121261bc96e00bb6b94b467582f4" |       "hash" : "944c3a520a484580895b287eaaa103b1" | ||||||
|     }, |     }, | ||||||
|     "app-phriction-glow-large"     : { |     "app-phriction-glow-large"     : { | ||||||
|       "name" : "app-phriction-glow-large", |       "name" : "app-phriction-glow-large", | ||||||
|       "rule" : ".app-phriction-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phriction-light-large", |       "rule" : ".app-phriction-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phriction-light-large", | ||||||
|       "hash" : "27612f55aaa40c4178a3a5a46d225947" |       "hash" : "84639b5ccba94daf1850a9449131a078" | ||||||
|     }, |     }, | ||||||
|     "app-phriction-light-large"    : { |     "app-phriction-light-large"    : { | ||||||
|       "name" : "app-phriction-light-large", |       "name" : "app-phriction-light-large", | ||||||
|       "rule" : ".app-phriction-light-large", |       "rule" : ".app-phriction-light-large", | ||||||
|       "hash" : "a56dcfca00861938d337cc2f217b33f6" |       "hash" : "2ca79fdfd141b0fe00ff8b2e13df73bf" | ||||||
|     }, |     }, | ||||||
|     "app-ponder-blue-large"        : { |     "app-ponder-blue-large"        : { | ||||||
|       "name" : "app-ponder-blue-large", |       "name" : "app-ponder-blue-large", | ||||||
|       "rule" : ".app-ponder-blue-large, .phabricator-crumb-view:hover .app-ponder-dark-large", |       "rule" : ".app-ponder-blue-large, .phabricator-crumb-view:hover .app-ponder-dark-large", | ||||||
|       "hash" : "1bfc2f6150bd67cc25cbe1fbc9283f9c" |       "hash" : "8018fe4ebc1e9af91a8a737e0505aa5d" | ||||||
|     }, |     }, | ||||||
|     "app-ponder-dark-large"        : { |     "app-ponder-dark-large"        : { | ||||||
|       "name" : "app-ponder-dark-large", |       "name" : "app-ponder-dark-large", | ||||||
|       "rule" : ".app-ponder-dark-large", |       "rule" : ".app-ponder-dark-large", | ||||||
|       "hash" : "6efc0b3a74d2cc9eb5de96205613b640" |       "hash" : "1da67495789c69621f91800939ea9684" | ||||||
|     }, |     }, | ||||||
|     "app-ponder-glow-large"        : { |     "app-ponder-glow-large"        : { | ||||||
|       "name" : "app-ponder-glow-large", |       "name" : "app-ponder-glow-large", | ||||||
|       "rule" : ".app-ponder-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-ponder-light-large", |       "rule" : ".app-ponder-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-ponder-light-large", | ||||||
|       "hash" : "9c2a2506e53e6a902976d504dfe94b46" |       "hash" : "f73a1b5a6b688c6d3feba14193357147" | ||||||
|     }, |     }, | ||||||
|     "app-ponder-light-large"       : { |     "app-ponder-light-large"       : { | ||||||
|       "name" : "app-ponder-light-large", |       "name" : "app-ponder-light-large", | ||||||
|       "rule" : ".app-ponder-light-large", |       "rule" : ".app-ponder-light-large", | ||||||
|       "hash" : "595895068b10c68b0e05234570a6a268" |       "hash" : "eb8b13c3bc35f36b14f33ef1158b71ab" | ||||||
|     }, |     }, | ||||||
|     "app-power-blue-large"         : { |     "app-power-blue-large"         : { | ||||||
|       "name" : "app-power-blue-large", |       "name" : "app-power-blue-large", | ||||||
|       "rule" : ".app-power-blue-large, .phabricator-crumb-view:hover .app-power-dark-large", |       "rule" : ".app-power-blue-large, .phabricator-crumb-view:hover .app-power-dark-large", | ||||||
|       "hash" : "c3e03022f162f986f784b2a43c8784c7" |       "hash" : "743499c84546b7b35139eec60bf74c34" | ||||||
|     }, |     }, | ||||||
|     "app-power-dark-large"         : { |     "app-power-dark-large"         : { | ||||||
|       "name" : "app-power-dark-large", |       "name" : "app-power-dark-large", | ||||||
|       "rule" : ".app-power-dark-large", |       "rule" : ".app-power-dark-large", | ||||||
|       "hash" : "52d04564ca2cc7f3a96809e827162f3e" |       "hash" : "1a3520a2ec255f5b7f1779ea66153ade" | ||||||
|     }, |     }, | ||||||
|     "app-power-glow-large"         : { |     "app-power-glow-large"         : { | ||||||
|       "name" : "app-power-glow-large", |       "name" : "app-power-glow-large", | ||||||
|       "rule" : ".app-power-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-power-light-large", |       "rule" : ".app-power-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-power-light-large", | ||||||
|       "hash" : "3f7719f0299abef8ba900e79fb6b5015" |       "hash" : "3951e012561a0d5d5d2b00711b13fa9c" | ||||||
|     }, |     }, | ||||||
|     "app-power-light-large"        : { |     "app-power-light-large"        : { | ||||||
|       "name" : "app-power-light-large", |       "name" : "app-power-light-large", | ||||||
|       "rule" : ".app-power-light-large", |       "rule" : ".app-power-light-large", | ||||||
|       "hash" : "ffe9f181e6103eab9fc688ab84b07ad1" |       "hash" : "52d04bd829dfe7477a9dc2ef916990ab" | ||||||
|     }, |     }, | ||||||
|     "app-projects-blue-large"      : { |     "app-projects-blue-large"      : { | ||||||
|       "name" : "app-projects-blue-large", |       "name" : "app-projects-blue-large", | ||||||
|       "rule" : ".app-projects-blue-large, .phabricator-crumb-view:hover .app-projects-dark-large", |       "rule" : ".app-projects-blue-large, .phabricator-crumb-view:hover .app-projects-dark-large", | ||||||
|       "hash" : "494ca64479f68588823e00609496414a" |       "hash" : "278113829ca3543b9377030555e04edc" | ||||||
|     }, |     }, | ||||||
|     "app-projects-dark-large"      : { |     "app-projects-dark-large"      : { | ||||||
|       "name" : "app-projects-dark-large", |       "name" : "app-projects-dark-large", | ||||||
|       "rule" : ".app-projects-dark-large", |       "rule" : ".app-projects-dark-large", | ||||||
|       "hash" : "fa85ad644a2e289cb6bea2a67ab534f8" |       "hash" : "b6f043db039d4960397f76904a84e9fc" | ||||||
|     }, |     }, | ||||||
|     "app-projects-glow-large"      : { |     "app-projects-glow-large"      : { | ||||||
|       "name" : "app-projects-glow-large", |       "name" : "app-projects-glow-large", | ||||||
|       "rule" : ".app-projects-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-projects-light-large", |       "rule" : ".app-projects-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-projects-light-large", | ||||||
|       "hash" : "b28bf212416595b3ba4bfb528dfaf791" |       "hash" : "3d1bf3efdbd9ccdbb73fc3a11d5d1265" | ||||||
|     }, |     }, | ||||||
|     "app-projects-light-large"     : { |     "app-projects-light-large"     : { | ||||||
|       "name" : "app-projects-light-large", |       "name" : "app-projects-light-large", | ||||||
|       "rule" : ".app-projects-light-large", |       "rule" : ".app-projects-light-large", | ||||||
|       "hash" : "228db63ac0e80b3cef46903a003a44df" |       "hash" : "88c73c7cb50ce7cf9cd8d33ec20c8245" | ||||||
|     }, |     }, | ||||||
|     "app-repositories-blue-large"  : { |     "app-repositories-blue-large"  : { | ||||||
|       "name" : "app-repositories-blue-large", |       "name" : "app-repositories-blue-large", | ||||||
|       "rule" : ".app-repositories-blue-large, .phabricator-crumb-view:hover .app-repositories-dark-large", |       "rule" : ".app-repositories-blue-large, .phabricator-crumb-view:hover .app-repositories-dark-large", | ||||||
|       "hash" : "a83dd2186f9d92949f19a97f8f777a9c" |       "hash" : "0642bf1118210cef9105cc463ec3d36f" | ||||||
|     }, |     }, | ||||||
|     "app-repositories-dark-large"  : { |     "app-repositories-dark-large"  : { | ||||||
|       "name" : "app-repositories-dark-large", |       "name" : "app-repositories-dark-large", | ||||||
|       "rule" : ".app-repositories-dark-large", |       "rule" : ".app-repositories-dark-large", | ||||||
|       "hash" : "30ead88c9f018797a8d5ef2f4e4221fe" |       "hash" : "c92eb4e857d74f1ef206ba5b184ad88c" | ||||||
|     }, |     }, | ||||||
|     "app-repositories-glow-large"  : { |     "app-repositories-glow-large"  : { | ||||||
|       "name" : "app-repositories-glow-large", |       "name" : "app-repositories-glow-large", | ||||||
|       "rule" : ".app-repositories-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-repositories-light-large", |       "rule" : ".app-repositories-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-repositories-light-large", | ||||||
|       "hash" : "44b04cbf1652211fbc2046c7773b4cf2" |       "hash" : "7fe40fbb4150dfbc6133c79578fc1494" | ||||||
|     }, |     }, | ||||||
|     "app-repositories-light-large" : { |     "app-repositories-light-large" : { | ||||||
|       "name" : "app-repositories-light-large", |       "name" : "app-repositories-light-large", | ||||||
|       "rule" : ".app-repositories-light-large", |       "rule" : ".app-repositories-light-large", | ||||||
|       "hash" : "bcba180d121f9269787509ba7cdd3e48" |       "hash" : "446a7eab7b7fc07329bc21a77c438033" | ||||||
|     }, |     }, | ||||||
|     "app-settings-blue-large"      : { |     "app-settings-blue-large"      : { | ||||||
|       "name" : "app-settings-blue-large", |       "name" : "app-settings-blue-large", | ||||||
|       "rule" : ".app-settings-blue-large, .phabricator-crumb-view:hover .app-settings-dark-large", |       "rule" : ".app-settings-blue-large, .phabricator-crumb-view:hover .app-settings-dark-large", | ||||||
|       "hash" : "c615df792c7e81b35cfbb78ece39e796" |       "hash" : "4d22a7f016509777bb5b55f39198d9d7" | ||||||
|     }, |     }, | ||||||
|     "app-settings-dark-large"      : { |     "app-settings-dark-large"      : { | ||||||
|       "name" : "app-settings-dark-large", |       "name" : "app-settings-dark-large", | ||||||
|       "rule" : ".app-settings-dark-large", |       "rule" : ".app-settings-dark-large", | ||||||
|       "hash" : "6c174857e23a9d169d0cb4079aa14637" |       "hash" : "55e0869a51f70cacdd72f2baad4b28ce" | ||||||
|     }, |     }, | ||||||
|     "app-settings-glow-large"      : { |     "app-settings-glow-large"      : { | ||||||
|       "name" : "app-settings-glow-large", |       "name" : "app-settings-glow-large", | ||||||
|       "rule" : ".app-settings-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-settings-light-large", |       "rule" : ".app-settings-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-settings-light-large", | ||||||
|       "hash" : "4d8c68dc709d99141a19aad5bc483971" |       "hash" : "314ab0f607baa65ff6a684b1ddd4861d" | ||||||
|     }, |     }, | ||||||
|     "app-settings-light-large"     : { |     "app-settings-light-large"     : { | ||||||
|       "name" : "app-settings-light-large", |       "name" : "app-settings-light-large", | ||||||
|       "rule" : ".app-settings-light-large", |       "rule" : ".app-settings-light-large", | ||||||
|       "hash" : "e901b672f2a51ef286369bfea70a7e8d" |       "hash" : "41da4708f38fae918af46505e566bd6a" | ||||||
|     }, |     }, | ||||||
|     "app-setup-blue-large"         : { |     "app-setup-blue-large"         : { | ||||||
|       "name" : "app-setup-blue-large", |       "name" : "app-setup-blue-large", | ||||||
|       "rule" : ".app-setup-blue-large, .phabricator-crumb-view:hover .app-setup-dark-large", |       "rule" : ".app-setup-blue-large, .phabricator-crumb-view:hover .app-setup-dark-large", | ||||||
|       "hash" : "a2f8f470c3cd928e8c1a6959ff745789" |       "hash" : "74d2ba681cdad54b31d53f7c174f5826" | ||||||
|     }, |     }, | ||||||
|     "app-setup-dark-large"         : { |     "app-setup-dark-large"         : { | ||||||
|       "name" : "app-setup-dark-large", |       "name" : "app-setup-dark-large", | ||||||
|       "rule" : ".app-setup-dark-large", |       "rule" : ".app-setup-dark-large", | ||||||
|       "hash" : "3183fafc1dc05b851ba902ace2dfa34d" |       "hash" : "89a94fe1ce36351d3ea81f1776fb061a" | ||||||
|     }, |     }, | ||||||
|     "app-setup-glow-large"         : { |     "app-setup-glow-large"         : { | ||||||
|       "name" : "app-setup-glow-large", |       "name" : "app-setup-glow-large", | ||||||
|       "rule" : ".app-setup-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-setup-light-large", |       "rule" : ".app-setup-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-setup-light-large", | ||||||
|       "hash" : "d91b7e5480cb4296871b9f1c4c634256" |       "hash" : "53942c73b14210f5bf0bfad68bcb4431" | ||||||
|     }, |     }, | ||||||
|     "app-setup-light-large"        : { |     "app-setup-light-large"        : { | ||||||
|       "name" : "app-setup-light-large", |       "name" : "app-setup-light-large", | ||||||
|       "rule" : ".app-setup-light-large", |       "rule" : ".app-setup-light-large", | ||||||
|       "hash" : "419829d244a85f97d67fb45c6febd4e5" |       "hash" : "890dd2d7cb1e51992b202dd462d56ba6" | ||||||
|     }, |     }, | ||||||
|     "app-slowvote-blue-large"      : { |     "app-slowvote-blue-large"      : { | ||||||
|       "name" : "app-slowvote-blue-large", |       "name" : "app-slowvote-blue-large", | ||||||
|       "rule" : ".app-slowvote-blue-large, .phabricator-crumb-view:hover .app-slowvote-dark-large", |       "rule" : ".app-slowvote-blue-large, .phabricator-crumb-view:hover .app-slowvote-dark-large", | ||||||
|       "hash" : "941028e7abbe491e2911fb24c4a8edca" |       "hash" : "12299956375e7f382217ebf8c1cb8203" | ||||||
|     }, |     }, | ||||||
|     "app-slowvote-dark-large"      : { |     "app-slowvote-dark-large"      : { | ||||||
|       "name" : "app-slowvote-dark-large", |       "name" : "app-slowvote-dark-large", | ||||||
|       "rule" : ".app-slowvote-dark-large", |       "rule" : ".app-slowvote-dark-large", | ||||||
|       "hash" : "6197df3550b652011bc1a8da00005059" |       "hash" : "ce57e4a318e4e8d556f713b459e6d798" | ||||||
|     }, |     }, | ||||||
|     "app-slowvote-glow-large"      : { |     "app-slowvote-glow-large"      : { | ||||||
|       "name" : "app-slowvote-glow-large", |       "name" : "app-slowvote-glow-large", | ||||||
|       "rule" : ".app-slowvote-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-slowvote-light-large", |       "rule" : ".app-slowvote-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-slowvote-light-large", | ||||||
|       "hash" : "43783af8df4f99e94f0989ca149264f2" |       "hash" : "dcd5be64ded69e0fdfee5364367c9b55" | ||||||
|     }, |     }, | ||||||
|     "app-slowvote-light-large"     : { |     "app-slowvote-light-large"     : { | ||||||
|       "name" : "app-slowvote-light-large", |       "name" : "app-slowvote-light-large", | ||||||
|       "rule" : ".app-slowvote-light-large", |       "rule" : ".app-slowvote-light-large", | ||||||
|       "hash" : "23eb39153b5ac9b5bd91c8b800023d93" |       "hash" : "7ac2515f26b194a9fafaa6a27997be2a" | ||||||
|     }, |     }, | ||||||
|     "app-uiexamples-blue-large"    : { |     "app-uiexamples-blue-large"    : { | ||||||
|       "name" : "app-uiexamples-blue-large", |       "name" : "app-uiexamples-blue-large", | ||||||
|       "rule" : ".app-uiexamples-blue-large, .phabricator-crumb-view:hover .app-uiexamples-dark-large", |       "rule" : ".app-uiexamples-blue-large, .phabricator-crumb-view:hover .app-uiexamples-dark-large", | ||||||
|       "hash" : "eabac7f7b83c47618a5f72b6f30b6410" |       "hash" : "7add7df6b621c4af5322160bc1cd31b2" | ||||||
|     }, |     }, | ||||||
|     "app-uiexamples-dark-large"    : { |     "app-uiexamples-dark-large"    : { | ||||||
|       "name" : "app-uiexamples-dark-large", |       "name" : "app-uiexamples-dark-large", | ||||||
|       "rule" : ".app-uiexamples-dark-large", |       "rule" : ".app-uiexamples-dark-large", | ||||||
|       "hash" : "31c9fb99289cc73aae73f3acad66b449" |       "hash" : "d8563a5f06692a313a2eff11235d5d0d" | ||||||
|     }, |     }, | ||||||
|     "app-uiexamples-glow-large"    : { |     "app-uiexamples-glow-large"    : { | ||||||
|       "name" : "app-uiexamples-glow-large", |       "name" : "app-uiexamples-glow-large", | ||||||
|       "rule" : ".app-uiexamples-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-uiexamples-light-large", |       "rule" : ".app-uiexamples-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-uiexamples-light-large", | ||||||
|       "hash" : "069e59208dad509a6c3d74d102f08ae8" |       "hash" : "0532cdd91b6de17ab194bd29cacfc24f" | ||||||
|     }, |     }, | ||||||
|     "app-uiexamples-light-large"   : { |     "app-uiexamples-light-large"   : { | ||||||
|       "name" : "app-uiexamples-light-large", |       "name" : "app-uiexamples-light-large", | ||||||
|       "rule" : ".app-uiexamples-light-large", |       "rule" : ".app-uiexamples-light-large", | ||||||
|       "hash" : "b384102bcee1b312b2e06abc5f4b27de" |       "hash" : "ee40dd0e3168f8e7fb520665a1d50f95" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "scales"  : [ |   "scales"  : [ | ||||||
|   | |||||||
| @@ -4,192 +4,197 @@ | |||||||
|     "app-application-dark"  : { |     "app-application-dark"  : { | ||||||
|       "name" : "app-application-dark", |       "name" : "app-application-dark", | ||||||
|       "rule" : ".app-application-dark", |       "rule" : ".app-application-dark", | ||||||
|       "hash" : "89f861c28e97878311885623cff3d314" |       "hash" : "60e228106718bf6f3ee5024400d31f24" | ||||||
|     }, |     }, | ||||||
|     "app-audit-dark"        : { |     "app-audit-dark"        : { | ||||||
|       "name" : "app-audit-dark", |       "name" : "app-audit-dark", | ||||||
|       "rule" : ".app-audit-dark", |       "rule" : ".app-audit-dark", | ||||||
|       "hash" : "2c141bc445c4fe62986cd6cff0c29b36" |       "hash" : "38339b9cc4e39cbbbea36dcf039873bb" | ||||||
|     }, |     }, | ||||||
|     "app-calendar-dark"     : { |     "app-calendar-dark"     : { | ||||||
|       "name" : "app-calendar-dark", |       "name" : "app-calendar-dark", | ||||||
|       "rule" : ".app-calendar-dark", |       "rule" : ".app-calendar-dark", | ||||||
|       "hash" : "04c61a081986f0d38cf27fc4e18bce40" |       "hash" : "756d60566639ad1424444436a95c6a3f" | ||||||
|     }, |     }, | ||||||
|     "app-conduit-dark"      : { |     "app-conduit-dark"      : { | ||||||
|       "name" : "app-conduit-dark", |       "name" : "app-conduit-dark", | ||||||
|       "rule" : ".app-conduit-dark", |       "rule" : ".app-conduit-dark", | ||||||
|       "hash" : "7b410e96c87e7818fb93bdfa2ed9368f" |       "hash" : "01fba8ca32f1cfefb3516b45c9d28b40" | ||||||
|  |     }, | ||||||
|  |     "app-conpherence-dark"  : { | ||||||
|  |       "name" : "app-conpherence-dark", | ||||||
|  |       "rule" : ".app-conpherence-dark", | ||||||
|  |       "hash" : "dbb6fdd5f082a604b4ef10b7eeedbfa2" | ||||||
|     }, |     }, | ||||||
|     "app-countdown-dark"    : { |     "app-countdown-dark"    : { | ||||||
|       "name" : "app-countdown-dark", |       "name" : "app-countdown-dark", | ||||||
|       "rule" : ".app-countdown-dark", |       "rule" : ".app-countdown-dark", | ||||||
|       "hash" : "8891502317896beea6a5f9ec87eb5e2e" |       "hash" : "625f2589ee491aead58aaa5b965a7451" | ||||||
|     }, |     }, | ||||||
|     "app-daemon-dark"       : { |     "app-daemon-dark"       : { | ||||||
|       "name" : "app-daemon-dark", |       "name" : "app-daemon-dark", | ||||||
|       "rule" : ".app-daemon-dark", |       "rule" : ".app-daemon-dark", | ||||||
|       "hash" : "23a9a2927b368e2328dd70f95c5b1a07" |       "hash" : "4472be3242150f06ea5bf7b45333c4c5" | ||||||
|     }, |     }, | ||||||
|     "app-differential-dark" : { |     "app-differential-dark" : { | ||||||
|       "name" : "app-differential-dark", |       "name" : "app-differential-dark", | ||||||
|       "rule" : ".app-differential-dark", |       "rule" : ".app-differential-dark", | ||||||
|       "hash" : "bb7032f3c17901f242f9bbbcdc9a721c" |       "hash" : "508401fe36d9636bdcbdcbcae253c152" | ||||||
|     }, |     }, | ||||||
|     "app-diffusion-dark"    : { |     "app-diffusion-dark"    : { | ||||||
|       "name" : "app-diffusion-dark", |       "name" : "app-diffusion-dark", | ||||||
|       "rule" : ".app-diffusion-dark", |       "rule" : ".app-diffusion-dark", | ||||||
|       "hash" : "46ab6648a6ae04e4fd1a28a9afcc4996" |       "hash" : "0a6f8c85079c4a325430197adb05967c" | ||||||
|     }, |     }, | ||||||
|     "app-diviner-dark"      : { |     "app-diviner-dark"      : { | ||||||
|       "name" : "app-diviner-dark", |       "name" : "app-diviner-dark", | ||||||
|       "rule" : ".app-diviner-dark", |       "rule" : ".app-diviner-dark", | ||||||
|       "hash" : "e21a74e866a6fc22a991b8df6efc3ca7" |       "hash" : "08872eb1c6bb51b9727290f6fa802633" | ||||||
|     }, |     }, | ||||||
|     "app-drydock-dark"      : { |     "app-drydock-dark"      : { | ||||||
|       "name" : "app-drydock-dark", |       "name" : "app-drydock-dark", | ||||||
|       "rule" : ".app-drydock-dark", |       "rule" : ".app-drydock-dark", | ||||||
|       "hash" : "ed44013d98257a23306bad9c6b24760d" |       "hash" : "d50309da57021c676774f9bdc68c5fe7" | ||||||
|     }, |     }, | ||||||
|     "app-fact-dark"         : { |     "app-fact-dark"         : { | ||||||
|       "name" : "app-fact-dark", |       "name" : "app-fact-dark", | ||||||
|       "rule" : ".app-fact-dark", |       "rule" : ".app-fact-dark", | ||||||
|       "hash" : "f373f38e784289b866ab914471c342ec" |       "hash" : "0c1be568e1ac05fca814718600190369" | ||||||
|     }, |     }, | ||||||
|     "app-feed-dark"         : { |     "app-feed-dark"         : { | ||||||
|       "name" : "app-feed-dark", |       "name" : "app-feed-dark", | ||||||
|       "rule" : ".app-feed-dark", |       "rule" : ".app-feed-dark", | ||||||
|       "hash" : "c4f1765e70615c6ee4cae6e8135fb969" |       "hash" : "830232709eedbe6ce7cdbcebf182c86c" | ||||||
|     }, |     }, | ||||||
|     "app-files-dark"        : { |     "app-files-dark"        : { | ||||||
|       "name" : "app-files-dark", |       "name" : "app-files-dark", | ||||||
|       "rule" : ".app-files-dark", |       "rule" : ".app-files-dark", | ||||||
|       "hash" : "7faf45efa5b9b97e571bc66636ca1a15" |       "hash" : "00f5ab7ea3e9367e378cf9f395400ed4" | ||||||
|     }, |     }, | ||||||
|     "app-flags-dark"        : { |     "app-flags-dark"        : { | ||||||
|       "name" : "app-flags-dark", |       "name" : "app-flags-dark", | ||||||
|       "rule" : ".app-flags-dark", |       "rule" : ".app-flags-dark", | ||||||
|       "hash" : "10298f695592714e27f72ef746ffd8a9" |       "hash" : "6382f373f7b0e70522d80ce06ef62813" | ||||||
|     }, |     }, | ||||||
|     "app-help-dark"         : { |     "app-help-dark"         : { | ||||||
|       "name" : "app-help-dark", |       "name" : "app-help-dark", | ||||||
|       "rule" : ".app-help-dark", |       "rule" : ".app-help-dark", | ||||||
|       "hash" : "5cf715cc566b98c87958793eebea5f35" |       "hash" : "2299a14e27d76fdf66209ef0042cc84f" | ||||||
|     }, |     }, | ||||||
|     "app-herald-dark"       : { |     "app-herald-dark"       : { | ||||||
|       "name" : "app-herald-dark", |       "name" : "app-herald-dark", | ||||||
|       "rule" : ".app-herald-dark", |       "rule" : ".app-herald-dark", | ||||||
|       "hash" : "e3bc39a3dd1d66a0abf4594c608a3846" |       "hash" : "b2193b62df3bd4cf5c8de514a07fb6c3" | ||||||
|     }, |     }, | ||||||
|     "app-home-dark"         : { |     "app-home-dark"         : { | ||||||
|       "name" : "app-home-dark", |       "name" : "app-home-dark", | ||||||
|       "rule" : ".app-home-dark", |       "rule" : ".app-home-dark", | ||||||
|       "hash" : "7e01fbdfa526919a2d90d2c29a6c9fa0" |       "hash" : "88f020497fcbcf43729aa817695b174f" | ||||||
|     }, |     }, | ||||||
|     "app-logo-dark"         : { |     "app-logo-dark"         : { | ||||||
|       "name" : "app-logo-dark", |       "name" : "app-logo-dark", | ||||||
|       "rule" : ".app-logo-dark", |       "rule" : ".app-logo-dark", | ||||||
|       "hash" : "39701e1282fd120e77b09ed9fcddc686" |       "hash" : "02e71ae2421f1949f2ef075c27e052c9" | ||||||
|     }, |     }, | ||||||
|     "app-macro-dark"        : { |     "app-macro-dark"        : { | ||||||
|       "name" : "app-macro-dark", |       "name" : "app-macro-dark", | ||||||
|       "rule" : ".app-macro-dark", |       "rule" : ".app-macro-dark", | ||||||
|       "hash" : "ef89457bcee666ad265de1659b9b8a62" |       "hash" : "8e0e72847a8f70eb3f8e60e7fb681c06" | ||||||
|     }, |     }, | ||||||
|     "app-mail-dark"         : { |     "app-mail-dark"         : { | ||||||
|       "name" : "app-mail-dark", |       "name" : "app-mail-dark", | ||||||
|       "rule" : ".app-mail-dark", |       "rule" : ".app-mail-dark", | ||||||
|       "hash" : "4d05a5cd4360052183e91f61967a6c57" |       "hash" : "a2a792fddc44be4ae0f1a601380c8449" | ||||||
|     }, |     }, | ||||||
|     "app-maniphest-dark"    : { |     "app-maniphest-dark"    : { | ||||||
|       "name" : "app-maniphest-dark", |       "name" : "app-maniphest-dark", | ||||||
|       "rule" : ".app-maniphest-dark", |       "rule" : ".app-maniphest-dark", | ||||||
|       "hash" : "320da127d7f887e09965a0416d5e44d3" |       "hash" : "ea94fc7dbb2267adc33513f78916fe90" | ||||||
|     }, |     }, | ||||||
|     "app-metamta-dark"      : { |     "app-metamta-dark"      : { | ||||||
|       "name" : "app-metamta-dark", |       "name" : "app-metamta-dark", | ||||||
|       "rule" : ".app-metamta-dark", |       "rule" : ".app-metamta-dark", | ||||||
|       "hash" : "51f100c2a7a80149404dbc8b27f595a9" |       "hash" : "8abbb6e74d1697f950a01dcd6c8077be" | ||||||
|     }, |     }, | ||||||
|     "app-owners-dark"       : { |     "app-owners-dark"       : { | ||||||
|       "name" : "app-owners-dark", |       "name" : "app-owners-dark", | ||||||
|       "rule" : ".app-owners-dark", |       "rule" : ".app-owners-dark", | ||||||
|       "hash" : "33c064dd3b7fc3f9eb934d0cf84f3af5" |       "hash" : "23b948cc1d32a0968785fbfca749dcdf" | ||||||
|     }, |     }, | ||||||
|     "app-paste-dark"        : { |     "app-paste-dark"        : { | ||||||
|       "name" : "app-paste-dark", |       "name" : "app-paste-dark", | ||||||
|       "rule" : ".app-paste-dark", |       "rule" : ".app-paste-dark", | ||||||
|       "hash" : "9482649caa8e5a46d277271092517b12" |       "hash" : "9e0c1d1fe03aebcb55a4d19be051e255" | ||||||
|     }, |     }, | ||||||
|     "app-people-dark"       : { |     "app-people-dark"       : { | ||||||
|       "name" : "app-people-dark", |       "name" : "app-people-dark", | ||||||
|       "rule" : ".app-people-dark", |       "rule" : ".app-people-dark", | ||||||
|       "hash" : "67245eafa79367e4e07289549cf34deb" |       "hash" : "0b3995fcd043b506a408de6e25ad5292" | ||||||
|     }, |     }, | ||||||
|     "app-phame-dark"        : { |     "app-phame-dark"        : { | ||||||
|       "name" : "app-phame-dark", |       "name" : "app-phame-dark", | ||||||
|       "rule" : ".app-phame-dark", |       "rule" : ".app-phame-dark", | ||||||
|       "hash" : "029d7d48523cc43b0404bf40ccf56f8b" |       "hash" : "24ff4d322bce13f1c156ce5361a03a07" | ||||||
|     }, |     }, | ||||||
|     "app-phid-dark"         : { |     "app-phid-dark"         : { | ||||||
|       "name" : "app-phid-dark", |       "name" : "app-phid-dark", | ||||||
|       "rule" : ".app-phid-dark", |       "rule" : ".app-phid-dark", | ||||||
|       "hash" : "2099c2987fe3929ce1d9dec470c7699d" |       "hash" : "5a0ac05bbf36a7aeb36753d093c3c9f8" | ||||||
|     }, |     }, | ||||||
|     "app-pholio-dark"       : { |     "app-pholio-dark"       : { | ||||||
|       "name" : "app-pholio-dark", |       "name" : "app-pholio-dark", | ||||||
|       "rule" : ".app-pholio-dark", |       "rule" : ".app-pholio-dark", | ||||||
|       "hash" : "aab47c79d2e03fdcaffb6f41dc1e0f06" |       "hash" : "7d3befd1c12dd464a5f5edbef4574a5c" | ||||||
|     }, |     }, | ||||||
|     "app-phpast-dark"       : { |     "app-phpast-dark"       : { | ||||||
|       "name" : "app-phpast-dark", |       "name" : "app-phpast-dark", | ||||||
|       "rule" : ".app-phpast-dark", |       "rule" : ".app-phpast-dark", | ||||||
|       "hash" : "e6db72b398f57d03a400c9c18bd3c412" |       "hash" : "de1ad812c7a177c844fcff626b1abebf" | ||||||
|     }, |     }, | ||||||
|     "app-phriction-dark"    : { |     "app-phriction-dark"    : { | ||||||
|       "name" : "app-phriction-dark", |       "name" : "app-phriction-dark", | ||||||
|       "rule" : ".app-phriction-dark", |       "rule" : ".app-phriction-dark", | ||||||
|       "hash" : "8064272206874a324d20d956c8fb10da" |       "hash" : "8596da3f375087db6a163c98f0c968ae" | ||||||
|     }, |     }, | ||||||
|     "app-ponder-dark"       : { |     "app-ponder-dark"       : { | ||||||
|       "name" : "app-ponder-dark", |       "name" : "app-ponder-dark", | ||||||
|       "rule" : ".app-ponder-dark", |       "rule" : ".app-ponder-dark", | ||||||
|       "hash" : "abdb353635bed5cfd48a176b4340022f" |       "hash" : "232577eb875f383f45cb9dbd9a4e3976" | ||||||
|     }, |     }, | ||||||
|     "app-power-dark"        : { |     "app-power-dark"        : { | ||||||
|       "name" : "app-power-dark", |       "name" : "app-power-dark", | ||||||
|       "rule" : ".app-power-dark", |       "rule" : ".app-power-dark", | ||||||
|       "hash" : "d3e943d1267206963d8f9419629c5581" |       "hash" : "e3708b1b4bfdfc614d9cf630943e5bef" | ||||||
|     }, |     }, | ||||||
|     "app-projects-dark"     : { |     "app-projects-dark"     : { | ||||||
|       "name" : "app-projects-dark", |       "name" : "app-projects-dark", | ||||||
|       "rule" : ".app-projects-dark", |       "rule" : ".app-projects-dark", | ||||||
|       "hash" : "6bd7c598e2f2cf0b77918a7b0fa8bd19" |       "hash" : "5e799f1e95ecfd33cb67b6e4ac992043" | ||||||
|     }, |     }, | ||||||
|     "app-repositories-dark" : { |     "app-repositories-dark" : { | ||||||
|       "name" : "app-repositories-dark", |       "name" : "app-repositories-dark", | ||||||
|       "rule" : ".app-repositories-dark", |       "rule" : ".app-repositories-dark", | ||||||
|       "hash" : "db2823a16dae198145f53e8021170740" |       "hash" : "736066962e96df88eacc04d734613a0e" | ||||||
|     }, |     }, | ||||||
|     "app-settings-dark"     : { |     "app-settings-dark"     : { | ||||||
|       "name" : "app-settings-dark", |       "name" : "app-settings-dark", | ||||||
|       "rule" : ".app-settings-dark", |       "rule" : ".app-settings-dark", | ||||||
|       "hash" : "1c84d22b769730d9e8b6fcd3414de72c" |       "hash" : "2fadcf918fb084bd3452712f700ae1a0" | ||||||
|     }, |     }, | ||||||
|     "app-setup-dark"        : { |     "app-setup-dark"        : { | ||||||
|       "name" : "app-setup-dark", |       "name" : "app-setup-dark", | ||||||
|       "rule" : ".app-setup-dark", |       "rule" : ".app-setup-dark", | ||||||
|       "hash" : "27db76695d99be0c25368dc9e0932b17" |       "hash" : "061b80f3555ade1c36934474b61fe76b" | ||||||
|     }, |     }, | ||||||
|     "app-slowvote-dark"     : { |     "app-slowvote-dark"     : { | ||||||
|       "name" : "app-slowvote-dark", |       "name" : "app-slowvote-dark", | ||||||
|       "rule" : ".app-slowvote-dark", |       "rule" : ".app-slowvote-dark", | ||||||
|       "hash" : "0d5861fab4562ad21242e34f9a29a33e" |       "hash" : "e51cc1e6887f2deaff02d9c60aae36e0" | ||||||
|     }, |     }, | ||||||
|     "app-uiexamples-dark"   : { |     "app-uiexamples-dark"   : { | ||||||
|       "name" : "app-uiexamples-dark", |       "name" : "app-uiexamples-dark", | ||||||
|       "rule" : ".app-uiexamples-dark", |       "rule" : ".app-uiexamples-dark", | ||||||
|       "hash" : "6416a3d9d9007673ee558433b80692a1" |       "hash" : "dd919fd2c10e7d1e0915f523ac3922ce" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "scales"  : [ |   "scales"  : [ | ||||||
|   | |||||||
| @@ -4,67 +4,67 @@ | |||||||
|     "gradient-black-dark"      : { |     "gradient-black-dark"      : { | ||||||
|       "name" : "gradient-black-dark", |       "name" : "gradient-black-dark", | ||||||
|       "rule" : ".gradient-black-dark, button.black, a.black, a.black:visited", |       "rule" : ".gradient-black-dark, button.black, a.black, a.black:visited", | ||||||
|       "hash" : "b9faf8505427bb14a8c51324e13e2f81" |       "hash" : "17425d8c9c53672ab2edbd236e6efd7a" | ||||||
|     }, |     }, | ||||||
|     "gradient-black-light"     : { |     "gradient-black-light"     : { | ||||||
|       "name" : "gradient-black-light", |       "name" : "gradient-black-light", | ||||||
|       "rule" : ".gradient-black-light, button.black:active, a.black:active", |       "rule" : ".gradient-black-light, button.black:active, a.black:active", | ||||||
|       "hash" : "812c3375d00ccc93c36c6df2eb565df4" |       "hash" : "c4fb2231553d2894fd2c97beaa8bfe39" | ||||||
|     }, |     }, | ||||||
|     "gradient-blue-dark"       : { |     "gradient-blue-dark"       : { | ||||||
|       "name" : "gradient-blue-dark", |       "name" : "gradient-blue-dark", | ||||||
|       "rule" : ".gradient-blue-dark, button, a.button, a.button:visited, input.inputsubmit", |       "rule" : ".gradient-blue-dark, button, a.button, a.button:visited, input.inputsubmit", | ||||||
|       "hash" : "adc2d0f7397374936384014c5d78550d" |       "hash" : "f467612edcdbf984672287c6086492c4" | ||||||
|     }, |     }, | ||||||
|     "gradient-blue-light"      : { |     "gradient-blue-light"      : { | ||||||
|       "name" : "gradient-blue-light", |       "name" : "gradient-blue-light", | ||||||
|       "rule" : ".gradient-blue-light, button:active, a.button:active", |       "rule" : ".gradient-blue-light, button:active, a.button:active", | ||||||
|       "hash" : "91b841067a63e543a4dcd9d41e0a2e5c" |       "hash" : "471d47c102def6db46b345310aac5a03" | ||||||
|     }, |     }, | ||||||
|     "gradient-breadcrumbs"     : { |     "gradient-breadcrumbs"     : { | ||||||
|       "name" : "gradient-breadcrumbs", |       "name" : "gradient-breadcrumbs", | ||||||
|       "rule" : ".gradient-breadcrumbs", |       "rule" : ".gradient-breadcrumbs", | ||||||
|       "hash" : "688ab77f50cfbc17ec30d798efb1b39e" |       "hash" : "3d0f8634df5bc29eaf2a5a01bae79cf1" | ||||||
|     }, |     }, | ||||||
|     "gradient-dark-menu-label" : { |     "gradient-dark-menu-label" : { | ||||||
|       "name" : "gradient-dark-menu-label", |       "name" : "gradient-dark-menu-label", | ||||||
|       "rule" : ".gradient-dark-menu-label, .phabricator-dark-menu .phabricator-menu-item-type-label", |       "rule" : ".gradient-dark-menu-label, .phabricator-dark-menu .phabricator-menu-item-type-label", | ||||||
|       "hash" : "89a908596142d38fbe61a706694cd321" |       "hash" : "e0d4a455142f9c4745d36ad8b7dd3f78" | ||||||
|     }, |     }, | ||||||
|     "gradient-green-dark"      : { |     "gradient-green-dark"      : { | ||||||
|       "name" : "gradient-green-dark", |       "name" : "gradient-green-dark", | ||||||
|       "rule" : ".gradient-green-dark, button.green, a.green, a.green:visited", |       "rule" : ".gradient-green-dark, button.green, a.green, a.green:visited", | ||||||
|       "hash" : "0d19ab593772b6b406c0db309b3a14fb" |       "hash" : "a6719fe55b2b0e527ed32985691eab34" | ||||||
|     }, |     }, | ||||||
|     "gradient-green-light"     : { |     "gradient-green-light"     : { | ||||||
|       "name" : "gradient-green-light", |       "name" : "gradient-green-light", | ||||||
|       "rule" : ".gradient-green-light, button.green:active, a.green:active", |       "rule" : ".gradient-green-light, button.green:active, a.green:active", | ||||||
|       "hash" : "71c67916327ec7fc65149ab72c3a2924" |       "hash" : "124969cc7805bbd754005bc702e24c54" | ||||||
|     }, |     }, | ||||||
|     "gradient-grey-dark"       : { |     "gradient-grey-dark"       : { | ||||||
|       "name" : "gradient-grey-dark", |       "name" : "gradient-grey-dark", | ||||||
|       "rule" : ".gradient-grey-dark, button.grey, input.inputaux, a.grey, a.grey:visited, a.button.disabled, button[disabled], button.disabled", |       "rule" : ".gradient-grey-dark, button.grey, input.inputaux, a.grey, a.grey:visited, a.button.disabled, button[disabled], button.disabled", | ||||||
|       "hash" : "32651902d28d37dca01cf067072c39c0" |       "hash" : "fac28a773098fc62bf571e12b843f71a" | ||||||
|     }, |     }, | ||||||
|     "gradient-grey-light"      : { |     "gradient-grey-light"      : { | ||||||
|       "name" : "gradient-grey-light", |       "name" : "gradient-grey-light", | ||||||
|       "rule" : ".gradient-grey-light, button.grey:active, a.grey:active, button.grey_active, a.dropdown-open", |       "rule" : ".gradient-grey-light, button.grey:active, a.grey:active, button.grey_active, a.dropdown-open", | ||||||
|       "hash" : "c3c9ee1ed6f800a4ac86910b94687877" |       "hash" : "83c6128f59fc2e426c912c2f73f5b92b" | ||||||
|     }, |     }, | ||||||
|     "gradient-menu-hover"      : { |     "gradient-menu-hover"      : { | ||||||
|       "name" : "gradient-menu-hover", |       "name" : "gradient-menu-hover", | ||||||
|       "rule" : ".gradient-menu-hover, .device-desktop .phabricator-side-menu a.phabricator-menu-item-type-link:hover, .phabricator-filetree a.phabricator-filetree-item:hover", |       "rule" : ".gradient-menu-hover, .device-desktop .phabricator-side-menu a.phabricator-menu-item-type-link:hover, .phabricator-filetree a.phabricator-filetree-item:hover", | ||||||
|       "hash" : "856380207ac8c5cb6770d44dceb245a8" |       "hash" : "e6e064156d66952180e99b00996ffc38" | ||||||
|     }, |     }, | ||||||
|     "gradient-menu-label"      : { |     "gradient-menu-label"      : { | ||||||
|       "name" : "gradient-menu-label", |       "name" : "gradient-menu-label", | ||||||
|       "rule" : ".gradient-menu-label, .phabricator-side-menu .phabricator-menu-item-type-label", |       "rule" : ".gradient-menu-label, .phabricator-side-menu .phabricator-menu-item-type-label", | ||||||
|       "hash" : "8ad8352b077ae02820ebbbae26dc669b" |       "hash" : "04b9943f5b06c8cb21fe6b96714e6662" | ||||||
|     }, |     }, | ||||||
|     "gradient-menu-selected"   : { |     "gradient-menu-selected"   : { | ||||||
|       "name" : "gradient-menu-selected", |       "name" : "gradient-menu-selected", | ||||||
|       "rule" : ".gradient-menu-selected, .phabricator-side-menu .phabricator-menu-item-selected, .device-desktop .phabricator-side-menu a.phabricator-menu-item-selected:hover, .phabricator-nav-local a.phabricator-active-nav-focus", |       "rule" : ".gradient-menu-selected, .phabricator-side-menu .phabricator-menu-item-selected, .device-desktop .phabricator-side-menu a.phabricator-menu-item-selected:hover, .phabricator-nav-local a.phabricator-active-nav-focus", | ||||||
|       "hash" : "815bafb94e11c23e1a419ea85dcae113" |       "hash" : "9b4b039fba177b90bc26f0e6eece339d" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "scales"  : [ |   "scales"  : [ | ||||||
|   | |||||||
| @@ -4,47 +4,52 @@ | |||||||
|     "app"              : { |     "app"              : { | ||||||
|       "name" : "app", |       "name" : "app", | ||||||
|       "rule" : ".menu-icon-app", |       "rule" : ".menu-icon-app", | ||||||
|       "hash" : "a389f99d9c00f688e625da71579ee90a" |       "hash" : "fc525b5b3e3ecaeda3baccc18ace5a0a" | ||||||
|     }, |     }, | ||||||
|     "arrow-right"      : { |     "arrow-right"      : { | ||||||
|       "name" : "arrow-right", |       "name" : "arrow-right", | ||||||
|       "rule" : ".phabricator-crumb-divider", |       "rule" : ".phabricator-crumb-divider", | ||||||
|       "hash" : "a994209450dc73a80841cdd66bb59925" |       "hash" : "50180da0aed206c9db2bc1547c1a158c" | ||||||
|     }, |     }, | ||||||
|     "bubble"           : { |     "conf-hover"       : { | ||||||
|       "name" : "bubble", |       "name" : "conf-hover", | ||||||
|       "rule" : ".phabricator-main-menu-alert-bubble.alert-unread", |       "rule" : ".alert-notifications:hover .phabricator-main-menu-message-icon", | ||||||
|       "hash" : "1145ac8a137a2a22517c1945fe22c517" |       "hash" : "febc4135b2821ae2d3f0b06aa295ca0d" | ||||||
|  |     }, | ||||||
|  |     "conf-off"         : { | ||||||
|  |       "name" : "conf-off", | ||||||
|  |       "rule" : ".alert-notifications .phabricator-main-menu-message-icon", | ||||||
|  |       "hash" : "dc1b05cb611eaef76a09e8cff698c99d" | ||||||
|  |     }, | ||||||
|  |     "conf-unseen"      : { | ||||||
|  |       "name" : "conf-unseen", | ||||||
|  |       "rule" : ".alert-notifications.message-unread .phabricator-main-menu-message-icon", | ||||||
|  |       "hash" : "1f7d54b2b9781099f867b100ebdd6c6a" | ||||||
|     }, |     }, | ||||||
|     "eye"              : { |     "eye"              : { | ||||||
|       "name" : "eye", |       "name" : "eye", | ||||||
|       "rule" : ".menu-icon-eye", |       "rule" : ".menu-icon-eye", | ||||||
|       "hash" : "d598b1acb1933a86eaed3dea3347f7b0" |       "hash" : "553eb617c19b74b428558e606ff9b066" | ||||||
|     }, |     }, | ||||||
|     "logo"             : { |     "logo"             : { | ||||||
|       "name" : "logo", |       "name" : "logo", | ||||||
|       "rule" : ".phabricator-main-menu-logo-image", |       "rule" : ".phabricator-main-menu-logo-image", | ||||||
|       "hash" : "c6c7ab165dce13a51ef329928c7c4aba" |       "hash" : "6eadea2c3dd2ada989eba22b6769b3eb" | ||||||
|     }, |  | ||||||
|     "round_bubble"     : { |  | ||||||
|       "name" : "round_bubble", |  | ||||||
|       "rule" : ".phabricator-main-menu-alert-bubble", |  | ||||||
|       "hash" : "9be91cc0128997992e9001baf32c8ab8" |  | ||||||
|     }, |     }, | ||||||
|     "seen_have_unread" : { |     "seen_have_unread" : { | ||||||
|       "name" : "seen_have_unread", |       "name" : "seen_have_unread", | ||||||
|       "rule" : ".alert-notifications:hover .phabricator-main-menu-alert-icon", |       "rule" : ".alert-notifications:hover .phabricator-main-menu-alert-icon", | ||||||
|       "hash" : "a8a7f07caa726d7e61ef3d41f959d94d" |       "hash" : "03a02951857811c722732dcfff9d458e" | ||||||
|     }, |     }, | ||||||
|     "seen_read_all"    : { |     "seen_read_all"    : { | ||||||
|       "name" : "seen_read_all", |       "name" : "seen_read_all", | ||||||
|       "rule" : ".alert-notifications .phabricator-main-menu-alert-icon", |       "rule" : ".alert-notifications .phabricator-main-menu-alert-icon", | ||||||
|       "hash" : "4fdd4807d0c41bd4179dd43150c7fc44" |       "hash" : "f166fc60ed7a7a8ec2f41ab1af2cb3ec" | ||||||
|     }, |     }, | ||||||
|     "unseen_any"       : { |     "unseen_any"       : { | ||||||
|       "name" : "unseen_any", |       "name" : "unseen_any", | ||||||
|       "rule" : ".alert-notifications.alert-unread .phabricator-main-menu-alert-icon", |       "rule" : ".alert-notifications.alert-unread .phabricator-main-menu-alert-icon", | ||||||
|       "hash" : "50d946952c73028b34e0c3378ca36b17" |       "hash" : "a8643b150166a076e81a42e5893a899f" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "scales"  : [ |   "scales"  : [ | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/menu_1x/conf-hover.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/menu_1x/conf-off.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/menu_1x/conf-unseen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/menu_2x/conf-hover.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/menu_2x/conf-off.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/menu_2x/conf-unseen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										3
									
								
								resources/sql/patches/20130127.altheraldtranscript.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | |||||||
|  | ALTER TABLE `{$NAMESPACE}_herald`.`herald_transcript` | ||||||
|  |   DROP `psth`; | ||||||
|  |  | ||||||
| @@ -7,6 +7,13 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| celerity_register_resource_map(array( | celerity_register_resource_map(array( | ||||||
|  |   '/rsrc/image/actions/edit.png' => | ||||||
|  |   array( | ||||||
|  |     'hash' => 'ae90914d120ac3838ddc633b480343f3', | ||||||
|  |     'uri' => '/res/ae90914d/rsrc/image/actions/edit.png', | ||||||
|  |     'disk' => '/rsrc/image/actions/edit.png', | ||||||
|  |     'type' => 'png', | ||||||
|  |   ), | ||||||
|   '/rsrc/image/avatar.png' => |   '/rsrc/image/avatar.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => '1c5f255071537f05406adee86717ff27', |     'hash' => '1c5f255071537f05406adee86717ff27', | ||||||
| @@ -436,22 +443,22 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   '/rsrc/image/sprite-apps-X2.png' => |   '/rsrc/image/sprite-apps-X2.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => '984f8159dfc5bae465aa48a6ee5f00fe', |     'hash' => '361e64ded74eee1094127c7878c2c385', | ||||||
|     'uri' => '/res/984f8159/rsrc/image/sprite-apps-X2.png', |     'uri' => '/res/361e64de/rsrc/image/sprite-apps-X2.png', | ||||||
|     'disk' => '/rsrc/image/sprite-apps-X2.png', |     'disk' => '/rsrc/image/sprite-apps-X2.png', | ||||||
|     'type' => 'png', |     'type' => 'png', | ||||||
|   ), |   ), | ||||||
|   '/rsrc/image/sprite-apps-large-X2.png' => |   '/rsrc/image/sprite-apps-large-X2.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => 'b215a44c77664577d8edf0d2ac9a8cfd', |     'hash' => '73507e04b4bd4d1e8e7544f7c424fc0f', | ||||||
|     'uri' => '/res/b215a44c/rsrc/image/sprite-apps-large-X2.png', |     'uri' => '/res/73507e04/rsrc/image/sprite-apps-large-X2.png', | ||||||
|     'disk' => '/rsrc/image/sprite-apps-large-X2.png', |     'disk' => '/rsrc/image/sprite-apps-large-X2.png', | ||||||
|     'type' => 'png', |     'type' => 'png', | ||||||
|   ), |   ), | ||||||
|   '/rsrc/image/sprite-apps-large.png' => |   '/rsrc/image/sprite-apps-large.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => 'f60b55b3d4a2b87169444d88a9f629c6', |     'hash' => '6a5aade6134954171f2f1f8507270632', | ||||||
|     'uri' => '/res/f60b55b3/rsrc/image/sprite-apps-large.png', |     'uri' => '/res/6a5aade6/rsrc/image/sprite-apps-large.png', | ||||||
|     'disk' => '/rsrc/image/sprite-apps-large.png', |     'disk' => '/rsrc/image/sprite-apps-large.png', | ||||||
|     'type' => 'png', |     'type' => 'png', | ||||||
|   ), |   ), | ||||||
| @@ -464,8 +471,8 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   '/rsrc/image/sprite-apps.png' => |   '/rsrc/image/sprite-apps.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => '7a13551ec085fff5438c621ca5213d8e', |     'hash' => '5e76c53e9f61755e5d3e7befa9d73ae5', | ||||||
|     'uri' => '/res/7a13551e/rsrc/image/sprite-apps.png', |     'uri' => '/res/5e76c53e/rsrc/image/sprite-apps.png', | ||||||
|     'disk' => '/rsrc/image/sprite-apps.png', |     'disk' => '/rsrc/image/sprite-apps.png', | ||||||
|     'type' => 'png', |     'type' => 'png', | ||||||
|   ), |   ), | ||||||
| @@ -492,15 +499,15 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   '/rsrc/image/sprite-menu-X2.png' => |   '/rsrc/image/sprite-menu-X2.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => '11017d94e949aa169361b966716e8729', |     'hash' => 'ad544a9287ca73b9e0d3f549834701ee', | ||||||
|     'uri' => '/res/11017d94/rsrc/image/sprite-menu-X2.png', |     'uri' => '/res/ad544a92/rsrc/image/sprite-menu-X2.png', | ||||||
|     'disk' => '/rsrc/image/sprite-menu-X2.png', |     'disk' => '/rsrc/image/sprite-menu-X2.png', | ||||||
|     'type' => 'png', |     'type' => 'png', | ||||||
|   ), |   ), | ||||||
|   '/rsrc/image/sprite-menu.png' => |   '/rsrc/image/sprite-menu.png' => | ||||||
|   array( |   array( | ||||||
|     'hash' => 'ba0f7d61f49ea50e9c3ff93b160e14c5', |     'hash' => '8a6822c29bfa6f33db1c1b8b02b5c6d3', | ||||||
|     'uri' => '/res/ba0f7d61/rsrc/image/sprite-menu.png', |     'uri' => '/res/8a6822c2/rsrc/image/sprite-menu.png', | ||||||
|     'disk' => '/rsrc/image/sprite-menu.png', |     'disk' => '/rsrc/image/sprite-menu.png', | ||||||
|     'type' => 'png', |     'type' => 'png', | ||||||
|   ), |   ), | ||||||
| @@ -609,7 +616,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'aphront-error-view-css' => |   'aphront-error-view-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/048ed376/rsrc/css/aphront/error-view.css', |     'uri' => '/res/5f43a7c5/rsrc/css/aphront/error-view.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -718,7 +725,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'config-options-css' => |   'config-options-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/6f7f64e8/rsrc/css/application/config/config-options.css', |     'uri' => '/res/e6c21f2f/rsrc/css/application/config/config-options.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -727,7 +734,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'conpherence-header-pane-css' => |   'conpherence-header-pane-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/e50e02c8/rsrc/css/application/conpherence/header-pane.css', |     'uri' => '/res/4b8aebd2/rsrc/css/application/conpherence/header-pane.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -736,7 +743,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'conpherence-menu-css' => |   'conpherence-menu-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/02b20456/rsrc/css/application/conpherence/menu.css', |     'uri' => '/res/0dc6b412/rsrc/css/application/conpherence/menu.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -745,7 +752,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'conpherence-message-pane-css' => |   'conpherence-message-pane-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/799dc191/rsrc/css/application/conpherence/message-pane.css', |     'uri' => '/res/88b1927c/rsrc/css/application/conpherence/message-pane.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -763,7 +770,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'conpherence-widget-pane-css' => |   'conpherence-widget-pane-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/7af40cac/rsrc/css/application/conpherence/widget-pane.css', |     'uri' => '/res/b3e6a558/rsrc/css/application/conpherence/widget-pane.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -1023,13 +1030,14 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'javelin-behavior-aphront-drag-and-drop' => |   'javelin-behavior-aphront-drag-and-drop' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/84a67d72/rsrc/js/application/core/behavior-drag-and-drop.js', |     'uri' => '/res/3d809b40/rsrc/js/application/core/behavior-drag-and-drop.js', | ||||||
|     'type' => 'js', |     'type' => 'js', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
|       0 => 'javelin-behavior', |       0 => 'javelin-behavior', | ||||||
|       1 => 'javelin-dom', |       1 => 'javelin-dom', | ||||||
|       2 => 'phabricator-drag-and-drop-file-upload', |       2 => 'phabricator-file-upload', | ||||||
|  |       3 => 'phabricator-drag-and-drop-file-upload', | ||||||
|     ), |     ), | ||||||
|     'disk' => '/rsrc/js/application/core/behavior-drag-and-drop.js', |     'disk' => '/rsrc/js/application/core/behavior-drag-and-drop.js', | ||||||
|   ), |   ), | ||||||
| @@ -2705,7 +2713,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'phabricator-main-menu-view' => |   'phabricator-main-menu-view' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/a38edb46/rsrc/css/application/base/main-menu-view.css', |     'uri' => '/res/38ec42d4/rsrc/css/application/base/main-menu-view.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -2766,7 +2774,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'phabricator-object-item-list-view-css' => |   'phabricator-object-item-list-view-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/1f9c7ebb/rsrc/css/layout/phabricator-object-item-list-view.css', |     'uri' => '/res/2fb97c5c/rsrc/css/layout/phabricator-object-item-list-view.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -2920,7 +2928,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'phabricator-source-code-view-css' => |   'phabricator-source-code-view-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/87935c75/rsrc/css/layout/phabricator-source-code-view.css', |     'uri' => '/res/9373e769/rsrc/css/layout/phabricator-source-code-view.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -3256,7 +3264,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'sprite-apps-css' => |   'sprite-apps-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/2d8a940e/rsrc/css/sprite-apps.css', |     'uri' => '/res/8de495b4/rsrc/css/sprite-apps.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -3265,7 +3273,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'sprite-apps-large-css' => |   'sprite-apps-large-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/6b528e03/rsrc/css/sprite-apps-large.css', |     'uri' => '/res/174143b7/rsrc/css/sprite-apps-large.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -3301,7 +3309,7 @@ celerity_register_resource_map(array( | |||||||
|   ), |   ), | ||||||
|   'sprite-menu-css' => |   'sprite-menu-css' => | ||||||
|   array( |   array( | ||||||
|     'uri' => '/res/3d9f75af/rsrc/css/sprite-menu.css', |     'uri' => '/res/8e6624b0/rsrc/css/sprite-menu.css', | ||||||
|     'type' => 'css', |     'type' => 'css', | ||||||
|     'requires' => |     'requires' => | ||||||
|     array( |     array( | ||||||
| @@ -3338,7 +3346,7 @@ celerity_register_resource_map(array( | |||||||
| ), array( | ), array( | ||||||
|   'packages' => |   'packages' => | ||||||
|   array( |   array( | ||||||
|     '8fd19266' => |     '023adc14' => | ||||||
|     array( |     array( | ||||||
|       'name' => 'core.pkg.css', |       'name' => 'core.pkg.css', | ||||||
|       'symbols' => |       'symbols' => | ||||||
| @@ -3382,7 +3390,7 @@ celerity_register_resource_map(array( | |||||||
|         36 => 'phabricator-object-item-list-view-css', |         36 => 'phabricator-object-item-list-view-css', | ||||||
|         37 => 'global-drag-and-drop-css', |         37 => 'global-drag-and-drop-css', | ||||||
|       ), |       ), | ||||||
|       'uri' => '/res/pkg/8fd19266/core.pkg.css', |       'uri' => '/res/pkg/023adc14/core.pkg.css', | ||||||
|       'type' => 'css', |       'type' => 'css', | ||||||
|     ), |     ), | ||||||
|     '66dca903' => |     '66dca903' => | ||||||
| @@ -3462,7 +3470,7 @@ celerity_register_resource_map(array( | |||||||
|       'uri' => '/res/pkg/ec01d039/differential.pkg.css', |       'uri' => '/res/pkg/ec01d039/differential.pkg.css', | ||||||
|       'type' => 'css', |       'type' => 'css', | ||||||
|     ), |     ), | ||||||
|     'ac53d36a' => |     '310cd201' => | ||||||
|     array( |     array( | ||||||
|       'name' => 'differential.pkg.js', |       'name' => 'differential.pkg.js', | ||||||
|       'symbols' => |       'symbols' => | ||||||
| @@ -3487,7 +3495,7 @@ celerity_register_resource_map(array( | |||||||
|         17 => 'javelin-behavior-differential-toggle-files', |         17 => 'javelin-behavior-differential-toggle-files', | ||||||
|         18 => 'javelin-behavior-differential-user-select', |         18 => 'javelin-behavior-differential-user-select', | ||||||
|       ), |       ), | ||||||
|       'uri' => '/res/pkg/ac53d36a/differential.pkg.js', |       'uri' => '/res/pkg/310cd201/differential.pkg.js', | ||||||
|       'type' => 'js', |       'type' => 'js', | ||||||
|     ), |     ), | ||||||
|     'c8ce2d88' => |     'c8ce2d88' => | ||||||
| @@ -3572,22 +3580,22 @@ celerity_register_resource_map(array( | |||||||
|   'reverse' => |   'reverse' => | ||||||
|   array( |   array( | ||||||
|     'aphront-attached-file-view-css' => 'e30a3fa8', |     'aphront-attached-file-view-css' => 'e30a3fa8', | ||||||
|     'aphront-crumbs-view-css' => '8fd19266', |     'aphront-crumbs-view-css' => '023adc14', | ||||||
|     'aphront-dialog-view-css' => '8fd19266', |     'aphront-dialog-view-css' => '023adc14', | ||||||
|     'aphront-error-view-css' => '8fd19266', |     'aphront-error-view-css' => '023adc14', | ||||||
|     'aphront-form-view-css' => '8fd19266', |     'aphront-form-view-css' => '023adc14', | ||||||
|     'aphront-headsup-action-list-view-css' => 'ec01d039', |     'aphront-headsup-action-list-view-css' => 'ec01d039', | ||||||
|     'aphront-headsup-view-css' => '8fd19266', |     'aphront-headsup-view-css' => '023adc14', | ||||||
|     'aphront-list-filter-view-css' => '8fd19266', |     'aphront-list-filter-view-css' => '023adc14', | ||||||
|     'aphront-pager-view-css' => '8fd19266', |     'aphront-pager-view-css' => '023adc14', | ||||||
|     'aphront-panel-view-css' => '8fd19266', |     'aphront-panel-view-css' => '023adc14', | ||||||
|     'aphront-table-view-css' => '8fd19266', |     'aphront-table-view-css' => '023adc14', | ||||||
|     'aphront-tokenizer-control-css' => '8fd19266', |     'aphront-tokenizer-control-css' => '023adc14', | ||||||
|     'aphront-tooltip-css' => '8fd19266', |     'aphront-tooltip-css' => '023adc14', | ||||||
|     'aphront-typeahead-control-css' => '8fd19266', |     'aphront-typeahead-control-css' => '023adc14', | ||||||
|     'differential-changeset-view-css' => 'ec01d039', |     'differential-changeset-view-css' => 'ec01d039', | ||||||
|     'differential-core-view-css' => 'ec01d039', |     'differential-core-view-css' => 'ec01d039', | ||||||
|     'differential-inline-comment-editor' => 'ac53d36a', |     'differential-inline-comment-editor' => '310cd201', | ||||||
|     'differential-local-commits-view-css' => 'ec01d039', |     'differential-local-commits-view-css' => 'ec01d039', | ||||||
|     'differential-results-table-css' => 'ec01d039', |     'differential-results-table-css' => 'ec01d039', | ||||||
|     'differential-revision-add-comment-css' => 'ec01d039', |     'differential-revision-add-comment-css' => 'ec01d039', | ||||||
| @@ -3598,32 +3606,32 @@ celerity_register_resource_map(array( | |||||||
|     'differential-table-of-contents-css' => 'ec01d039', |     'differential-table-of-contents-css' => 'ec01d039', | ||||||
|     'diffusion-commit-view-css' => 'c8ce2d88', |     'diffusion-commit-view-css' => 'c8ce2d88', | ||||||
|     'diffusion-icons-css' => 'c8ce2d88', |     'diffusion-icons-css' => 'c8ce2d88', | ||||||
|     'global-drag-and-drop-css' => '8fd19266', |     'global-drag-and-drop-css' => '023adc14', | ||||||
|     'inline-comment-summary-css' => 'ec01d039', |     'inline-comment-summary-css' => 'ec01d039', | ||||||
|     'javelin-aphlict' => '66dca903', |     'javelin-aphlict' => '66dca903', | ||||||
|     'javelin-behavior' => 'fbeded59', |     'javelin-behavior' => 'fbeded59', | ||||||
|     'javelin-behavior-aphlict-dropdown' => '66dca903', |     'javelin-behavior-aphlict-dropdown' => '66dca903', | ||||||
|     'javelin-behavior-aphlict-listen' => '66dca903', |     'javelin-behavior-aphlict-listen' => '66dca903', | ||||||
|     'javelin-behavior-aphront-basic-tokenizer' => '66dca903', |     'javelin-behavior-aphront-basic-tokenizer' => '66dca903', | ||||||
|     'javelin-behavior-aphront-drag-and-drop' => 'ac53d36a', |     'javelin-behavior-aphront-drag-and-drop' => '310cd201', | ||||||
|     'javelin-behavior-aphront-drag-and-drop-textarea' => 'ac53d36a', |     'javelin-behavior-aphront-drag-and-drop-textarea' => '310cd201', | ||||||
|     'javelin-behavior-aphront-form-disable-on-submit' => '66dca903', |     'javelin-behavior-aphront-form-disable-on-submit' => '66dca903', | ||||||
|     'javelin-behavior-audit-preview' => 'f96657b8', |     'javelin-behavior-audit-preview' => 'f96657b8', | ||||||
|     'javelin-behavior-dark-console' => '8edbada5', |     'javelin-behavior-dark-console' => '8edbada5', | ||||||
|     'javelin-behavior-dark-console-ajax' => '8edbada5', |     'javelin-behavior-dark-console-ajax' => '8edbada5', | ||||||
|     'javelin-behavior-device' => '66dca903', |     'javelin-behavior-device' => '66dca903', | ||||||
|     'javelin-behavior-differential-accept-with-errors' => 'ac53d36a', |     'javelin-behavior-differential-accept-with-errors' => '310cd201', | ||||||
|     'javelin-behavior-differential-add-reviewers-and-ccs' => 'ac53d36a', |     'javelin-behavior-differential-add-reviewers-and-ccs' => '310cd201', | ||||||
|     'javelin-behavior-differential-comment-jump' => 'ac53d36a', |     'javelin-behavior-differential-comment-jump' => '310cd201', | ||||||
|     'javelin-behavior-differential-diff-radios' => 'ac53d36a', |     'javelin-behavior-differential-diff-radios' => '310cd201', | ||||||
|     'javelin-behavior-differential-dropdown-menus' => 'ac53d36a', |     'javelin-behavior-differential-dropdown-menus' => '310cd201', | ||||||
|     'javelin-behavior-differential-edit-inline-comments' => 'ac53d36a', |     'javelin-behavior-differential-edit-inline-comments' => '310cd201', | ||||||
|     'javelin-behavior-differential-feedback-preview' => 'ac53d36a', |     'javelin-behavior-differential-feedback-preview' => '310cd201', | ||||||
|     'javelin-behavior-differential-keyboard-navigation' => 'ac53d36a', |     'javelin-behavior-differential-keyboard-navigation' => '310cd201', | ||||||
|     'javelin-behavior-differential-populate' => 'ac53d36a', |     'javelin-behavior-differential-populate' => '310cd201', | ||||||
|     'javelin-behavior-differential-show-more' => 'ac53d36a', |     'javelin-behavior-differential-show-more' => '310cd201', | ||||||
|     'javelin-behavior-differential-toggle-files' => 'ac53d36a', |     'javelin-behavior-differential-toggle-files' => '310cd201', | ||||||
|     'javelin-behavior-differential-user-select' => 'ac53d36a', |     'javelin-behavior-differential-user-select' => '310cd201', | ||||||
|     'javelin-behavior-diffusion-commit-graph' => 'f96657b8', |     'javelin-behavior-diffusion-commit-graph' => 'f96657b8', | ||||||
|     'javelin-behavior-diffusion-pull-lastmodified' => 'f96657b8', |     'javelin-behavior-diffusion-pull-lastmodified' => 'f96657b8', | ||||||
|     'javelin-behavior-error-log' => '8edbada5', |     'javelin-behavior-error-log' => '8edbada5', | ||||||
| @@ -3640,14 +3648,14 @@ celerity_register_resource_map(array( | |||||||
|     'javelin-behavior-phabricator-home-reveal-tiles' => '66dca903', |     'javelin-behavior-phabricator-home-reveal-tiles' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-keyboard-shortcuts' => '66dca903', |     'javelin-behavior-phabricator-keyboard-shortcuts' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-nav' => '66dca903', |     'javelin-behavior-phabricator-nav' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-object-selector' => 'ac53d36a', |     'javelin-behavior-phabricator-object-selector' => '310cd201', | ||||||
|     'javelin-behavior-phabricator-oncopy' => '66dca903', |     'javelin-behavior-phabricator-oncopy' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-remarkup-assist' => '66dca903', |     'javelin-behavior-phabricator-remarkup-assist' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-search-typeahead' => '66dca903', |     'javelin-behavior-phabricator-search-typeahead' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-tooltips' => '66dca903', |     'javelin-behavior-phabricator-tooltips' => '66dca903', | ||||||
|     'javelin-behavior-phabricator-watch-anchor' => '66dca903', |     'javelin-behavior-phabricator-watch-anchor' => '66dca903', | ||||||
|     'javelin-behavior-refresh-csrf' => '66dca903', |     'javelin-behavior-refresh-csrf' => '66dca903', | ||||||
|     'javelin-behavior-repository-crossreference' => 'ac53d36a', |     'javelin-behavior-repository-crossreference' => '310cd201', | ||||||
|     'javelin-behavior-toggle-class' => '66dca903', |     'javelin-behavior-toggle-class' => '66dca903', | ||||||
|     'javelin-behavior-workflow' => '66dca903', |     'javelin-behavior-workflow' => '66dca903', | ||||||
|     'javelin-dom' => 'fbeded59', |     'javelin-dom' => 'fbeded59', | ||||||
| @@ -3668,48 +3676,48 @@ celerity_register_resource_map(array( | |||||||
|     'javelin-util' => 'fbeded59', |     'javelin-util' => 'fbeded59', | ||||||
|     'javelin-vector' => 'fbeded59', |     'javelin-vector' => 'fbeded59', | ||||||
|     'javelin-workflow' => 'fbeded59', |     'javelin-workflow' => 'fbeded59', | ||||||
|     'lightbox-attachment-css' => '8fd19266', |     'lightbox-attachment-css' => '023adc14', | ||||||
|     'maniphest-task-summary-css' => 'e30a3fa8', |     'maniphest-task-summary-css' => 'e30a3fa8', | ||||||
|     'maniphest-transaction-detail-css' => 'e30a3fa8', |     'maniphest-transaction-detail-css' => 'e30a3fa8', | ||||||
|     'phabricator-busy' => '66dca903', |     'phabricator-busy' => '66dca903', | ||||||
|     'phabricator-content-source-view-css' => 'ec01d039', |     'phabricator-content-source-view-css' => 'ec01d039', | ||||||
|     'phabricator-core-buttons-css' => '8fd19266', |     'phabricator-core-buttons-css' => '023adc14', | ||||||
|     'phabricator-core-css' => '8fd19266', |     'phabricator-core-css' => '023adc14', | ||||||
|     'phabricator-crumbs-view-css' => '8fd19266', |     'phabricator-crumbs-view-css' => '023adc14', | ||||||
|     'phabricator-directory-css' => '8fd19266', |     'phabricator-directory-css' => '023adc14', | ||||||
|     'phabricator-drag-and-drop-file-upload' => 'ac53d36a', |     'phabricator-drag-and-drop-file-upload' => '310cd201', | ||||||
|     'phabricator-dropdown-menu' => '66dca903', |     'phabricator-dropdown-menu' => '66dca903', | ||||||
|     'phabricator-file-upload' => '66dca903', |     'phabricator-file-upload' => '66dca903', | ||||||
|     'phabricator-filetree-view-css' => '8fd19266', |     'phabricator-filetree-view-css' => '023adc14', | ||||||
|     'phabricator-flag-css' => '8fd19266', |     'phabricator-flag-css' => '023adc14', | ||||||
|     'phabricator-form-view-css' => '8fd19266', |     'phabricator-form-view-css' => '023adc14', | ||||||
|     'phabricator-header-view-css' => '8fd19266', |     'phabricator-header-view-css' => '023adc14', | ||||||
|     'phabricator-jump-nav' => '8fd19266', |     'phabricator-jump-nav' => '023adc14', | ||||||
|     'phabricator-keyboard-shortcut' => '66dca903', |     'phabricator-keyboard-shortcut' => '66dca903', | ||||||
|     'phabricator-keyboard-shortcut-manager' => '66dca903', |     'phabricator-keyboard-shortcut-manager' => '66dca903', | ||||||
|     'phabricator-main-menu-view' => '8fd19266', |     'phabricator-main-menu-view' => '023adc14', | ||||||
|     'phabricator-menu-item' => '66dca903', |     'phabricator-menu-item' => '66dca903', | ||||||
|     'phabricator-nav-view-css' => '8fd19266', |     'phabricator-nav-view-css' => '023adc14', | ||||||
|     'phabricator-notification' => '66dca903', |     'phabricator-notification' => '66dca903', | ||||||
|     'phabricator-notification-css' => '8fd19266', |     'phabricator-notification-css' => '023adc14', | ||||||
|     'phabricator-notification-menu-css' => '8fd19266', |     'phabricator-notification-menu-css' => '023adc14', | ||||||
|     'phabricator-object-item-list-view-css' => '8fd19266', |     'phabricator-object-item-list-view-css' => '023adc14', | ||||||
|     'phabricator-object-selector-css' => 'ec01d039', |     'phabricator-object-selector-css' => 'ec01d039', | ||||||
|     'phabricator-paste-file-upload' => '66dca903', |     'phabricator-paste-file-upload' => '66dca903', | ||||||
|     'phabricator-prefab' => '66dca903', |     'phabricator-prefab' => '66dca903', | ||||||
|     'phabricator-project-tag-css' => 'e30a3fa8', |     'phabricator-project-tag-css' => 'e30a3fa8', | ||||||
|     'phabricator-remarkup-css' => '8fd19266', |     'phabricator-remarkup-css' => '023adc14', | ||||||
|     'phabricator-shaped-request' => 'ac53d36a', |     'phabricator-shaped-request' => '310cd201', | ||||||
|     'phabricator-side-menu-view-css' => '8fd19266', |     'phabricator-side-menu-view-css' => '023adc14', | ||||||
|     'phabricator-standard-page-view' => '8fd19266', |     'phabricator-standard-page-view' => '023adc14', | ||||||
|     'phabricator-textareautils' => '66dca903', |     'phabricator-textareautils' => '66dca903', | ||||||
|     'phabricator-tooltip' => '66dca903', |     'phabricator-tooltip' => '66dca903', | ||||||
|     'phabricator-transaction-view-css' => '8fd19266', |     'phabricator-transaction-view-css' => '023adc14', | ||||||
|     'phabricator-zindex-css' => '8fd19266', |     'phabricator-zindex-css' => '023adc14', | ||||||
|     'sprite-apps-large-css' => '8fd19266', |     'sprite-apps-large-css' => '023adc14', | ||||||
|     'sprite-gradient-css' => '8fd19266', |     'sprite-gradient-css' => '023adc14', | ||||||
|     'sprite-icon-css' => '8fd19266', |     'sprite-icon-css' => '023adc14', | ||||||
|     'sprite-menu-css' => '8fd19266', |     'sprite-menu-css' => '023adc14', | ||||||
|     'syntax-highlighting-css' => '8fd19266', |     'syntax-highlighting-css' => '023adc14', | ||||||
|   ), |   ), | ||||||
| )); | )); | ||||||
|   | |||||||
| @@ -195,6 +195,7 @@ phutil_register_library_map(array( | |||||||
|     'ConduitCallTestCase' => 'applications/conduit/call/__tests__/ConduitCallTestCase.php', |     'ConduitCallTestCase' => 'applications/conduit/call/__tests__/ConduitCallTestCase.php', | ||||||
|     'ConduitException' => 'applications/conduit/protocol/ConduitException.php', |     'ConduitException' => 'applications/conduit/protocol/ConduitException.php', | ||||||
|     'ConduitSSHWorkflow' => 'applications/conduit/ssh/ConduitSSHWorkflow.php', |     'ConduitSSHWorkflow' => 'applications/conduit/ssh/ConduitSSHWorkflow.php', | ||||||
|  |     'ConpherenceConfigOptions' => 'applications/conpherence/config/ConpherenceConfigOptions.php', | ||||||
|     'ConpherenceConstants' => 'applications/conpherence/constants/ConpherenceConstants.php', |     'ConpherenceConstants' => 'applications/conpherence/constants/ConpherenceConstants.php', | ||||||
|     'ConpherenceController' => 'applications/conpherence/controller/ConpherenceController.php', |     'ConpherenceController' => 'applications/conpherence/controller/ConpherenceController.php', | ||||||
|     'ConpherenceDAO' => 'applications/conpherence/storage/ConpherenceDAO.php', |     'ConpherenceDAO' => 'applications/conpherence/storage/ConpherenceDAO.php', | ||||||
| @@ -205,6 +206,7 @@ phutil_register_library_map(array( | |||||||
|     'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php', |     'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php', | ||||||
|     'ConpherenceParticipantQuery' => 'applications/conpherence/query/ConpherenceParticipantQuery.php', |     'ConpherenceParticipantQuery' => 'applications/conpherence/query/ConpherenceParticipantQuery.php', | ||||||
|     'ConpherenceParticipationStatus' => 'applications/conpherence/constants/ConpherenceParticipationStatus.php', |     'ConpherenceParticipationStatus' => 'applications/conpherence/constants/ConpherenceParticipationStatus.php', | ||||||
|  |     'ConpherenceReplyHandler' => 'applications/conpherence/mail/ConpherenceReplyHandler.php', | ||||||
|     'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php', |     'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php', | ||||||
|     'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', |     'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', | ||||||
|     'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php', |     'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php', | ||||||
| @@ -1666,6 +1668,7 @@ phutil_register_library_map(array( | |||||||
|     'ConduitCallTestCase' => 'PhabricatorTestCase', |     'ConduitCallTestCase' => 'PhabricatorTestCase', | ||||||
|     'ConduitException' => 'Exception', |     'ConduitException' => 'Exception', | ||||||
|     'ConduitSSHWorkflow' => 'PhabricatorSSHWorkflow', |     'ConduitSSHWorkflow' => 'PhabricatorSSHWorkflow', | ||||||
|  |     'ConpherenceConfigOptions' => 'PhabricatorApplicationConfigOptions', | ||||||
|     'ConpherenceController' => 'PhabricatorController', |     'ConpherenceController' => 'PhabricatorController', | ||||||
|     'ConpherenceDAO' => 'PhabricatorLiskDAO', |     'ConpherenceDAO' => 'PhabricatorLiskDAO', | ||||||
|     'ConpherenceEditor' => 'PhabricatorApplicationTransactionEditor', |     'ConpherenceEditor' => 'PhabricatorApplicationTransactionEditor', | ||||||
| @@ -1675,6 +1678,7 @@ phutil_register_library_map(array( | |||||||
|     'ConpherenceParticipant' => 'ConpherenceDAO', |     'ConpherenceParticipant' => 'ConpherenceDAO', | ||||||
|     'ConpherenceParticipantQuery' => 'PhabricatorOffsetPagedQuery', |     'ConpherenceParticipantQuery' => 'PhabricatorOffsetPagedQuery', | ||||||
|     'ConpherenceParticipationStatus' => 'ConpherenceConstants', |     'ConpherenceParticipationStatus' => 'ConpherenceConstants', | ||||||
|  |     'ConpherenceReplyHandler' => 'PhabricatorMailReplyHandler', | ||||||
|     'ConpherenceThread' => |     'ConpherenceThread' => | ||||||
|     array( |     array( | ||||||
|       0 => 'ConpherenceDAO', |       0 => 'ConpherenceDAO', | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ abstract class PhabricatorAuthController extends PhabricatorController { | |||||||
|   public function buildStandardPageResponse($view, array $data) { |   public function buildStandardPageResponse($view, array $data) { | ||||||
|     $page = $this->buildStandardPageView(); |     $page = $this->buildStandardPageView(); | ||||||
|  |  | ||||||
|     $page->setApplicationName('Login'); |     $page->setApplicationName(pht('Login')); | ||||||
|     $page->setBaseURI('/login/'); |     $page->setBaseURI('/login/'); | ||||||
|     $page->setTitle(idx($data, 'title')); |     $page->setTitle(idx($data, 'title')); | ||||||
|     $page->appendChild($view); |     $page->appendChild($view); | ||||||
|   | |||||||
| @@ -15,13 +15,14 @@ final class PhabricatorDisabledUserController | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     $failure_view = new AphrontRequestFailureView(); |     $failure_view = new AphrontRequestFailureView(); | ||||||
|     $failure_view->setHeader('Account Disabled'); |     $failure_view->setHeader(pht('Account Disabled')); | ||||||
|     $failure_view->appendChild('<p>Your account has been disabled.</p>'); |     $failure_view->appendChild( | ||||||
|  |       '<p>'.pht('Your account has been disabled.').'</p>'); | ||||||
|  |  | ||||||
|     return $this->buildStandardPageResponse( |     return $this->buildStandardPageResponse( | ||||||
|       $failure_view, |       $failure_view, | ||||||
|       array( |       array( | ||||||
|         'title' => 'Account Disabled', |         'title' => pht('Account Disabled'), | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,18 +22,18 @@ final class PhabricatorEmailLoginController | |||||||
|  |  | ||||||
|     if ($request->isFormPost()) { |     if ($request->isFormPost()) { | ||||||
|       $e_email = null; |       $e_email = null; | ||||||
|       $e_captcha = 'Again'; |       $e_captcha = pht('Again'); | ||||||
|  |  | ||||||
|       $captcha_ok = AphrontFormRecaptchaControl::processCaptcha($request); |       $captcha_ok = AphrontFormRecaptchaControl::processCaptcha($request); | ||||||
|       if (!$captcha_ok) { |       if (!$captcha_ok) { | ||||||
|         $errors[] = "Captcha response is incorrect, try again."; |         $errors[] = pht("Captcha response is incorrect, try again."); | ||||||
|         $e_captcha = 'Invalid'; |         $e_captcha = pht('Invalid'); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       $email = $request->getStr('email'); |       $email = $request->getStr('email'); | ||||||
|       if (!strlen($email)) { |       if (!strlen($email)) { | ||||||
|        $errors[] = "You must provide an email address."; |        $errors[] = pht("You must provide an email address."); | ||||||
|        $e_email = 'Required'; |        $e_email = pht('Required'); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       if (!$errors) { |       if (!$errors) { | ||||||
| @@ -53,8 +53,9 @@ final class PhabricatorEmailLoginController | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!$target_user) { |         if (!$target_user) { | ||||||
|           $errors[] = "There is no account associated with that email address."; |           $errors[] = | ||||||
|           $e_email = "Invalid"; |             pht("There is no account associated with that email address."); | ||||||
|  |           $e_email = pht("Invalid"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!$errors) { |         if (!$errors) { | ||||||
| @@ -96,13 +97,15 @@ EOBODY; | |||||||
|           $mail->saveAndSend(); |           $mail->saveAndSend(); | ||||||
|  |  | ||||||
|           $view = new AphrontRequestFailureView(); |           $view = new AphrontRequestFailureView(); | ||||||
|           $view->setHeader('Check Your Email'); |           $view->setHeader(pht('Check Your Email')); | ||||||
|           $view->appendChild( |           $view->appendChild( | ||||||
|             '<p>An email has been sent with a link you can use to login.</p>'); |             '<p>'.pht( | ||||||
|  |               'An email has been sent with a link you can use to login.' | ||||||
|  |             ).'</p>'); | ||||||
|           return $this->buildStandardPageResponse( |           return $this->buildStandardPageResponse( | ||||||
|             $view, |             $view, | ||||||
|             array( |             array( | ||||||
|               'title' => 'Email Sent', |               'title' => pht('Email Sent'), | ||||||
|             )); |             )); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -115,38 +118,41 @@ EOBODY; | |||||||
|       ->setUser($request->getUser()) |       ->setUser($request->getUser()) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|           ->setLabel('Email') |           ->setLabel(pht('Email')) | ||||||
|           ->setName('email') |           ->setName('email') | ||||||
|           ->setValue($request->getStr('email')) |           ->setValue($request->getStr('email')) | ||||||
|           ->setError($e_email)) |           ->setError($e_email)) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormRecaptchaControl()) |         id(new AphrontFormRecaptchaControl()) | ||||||
|           ->setLabel('Captcha') |           ->setLabel(pht('Captcha')) | ||||||
|           ->setError($e_captcha)) |           ->setError($e_captcha)) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormSubmitControl()) |         id(new AphrontFormSubmitControl()) | ||||||
|           ->setValue('Send Email')); |           ->setValue(pht('Send Email'))); | ||||||
|  |  | ||||||
|     $error_view = null; |     $error_view = null; | ||||||
|     if ($errors) { |     if ($errors) { | ||||||
|       $error_view = new AphrontErrorView(); |       $error_view = new AphrontErrorView(); | ||||||
|       $error_view->setTitle('Login Error'); |       $error_view->setTitle(pht('Login Error')); | ||||||
|       $error_view->setErrors($errors); |       $error_view->setErrors($errors); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     $panel = new AphrontPanelView(); |     $panel = new AphrontPanelView(); | ||||||
|     $panel->setWidth(AphrontPanelView::WIDTH_FORM); |     $panel->setWidth(AphrontPanelView::WIDTH_FORM); | ||||||
|     $panel->appendChild('<h1>Forgot Password / Email Login</h1>'); |     $panel->appendChild(' | ||||||
|  |       <h1>'.pht('Forgot Password / Email Login').'</h1>'); | ||||||
|     $panel->appendChild($email_auth); |     $panel->appendChild($email_auth); | ||||||
|  |     $panel->setNoBackground(); | ||||||
|  |  | ||||||
|     return $this->buildStandardPageResponse( |     return $this->buildApplicationPage( | ||||||
|       array( |       array( | ||||||
|         $error_view, |         $error_view, | ||||||
|         $panel, |         $panel, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         'title' => 'Create New Account', |         'title' => pht('Forgot Password'), | ||||||
|  |         'device' => true, | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -49,21 +49,23 @@ final class PhabricatorEmailTokenController | |||||||
|         !$target_user->validateEmailToken($target_email, $token)) { |         !$target_user->validateEmailToken($target_email, $token)) { | ||||||
|  |  | ||||||
|       $view = new AphrontRequestFailureView(); |       $view = new AphrontRequestFailureView(); | ||||||
|       $view->setHeader('Unable to Login'); |       $view->setHeader(pht('Unable to Login')); | ||||||
|       $view->appendChild( |       $view->appendChild( | ||||||
|         '<p>The authentication information in the link you clicked is '. |         '<p>'.pht('The authentication information in the link you clicked is '. | ||||||
|         'invalid or out of date. Make sure you are copy-and-pasting the '. |         'invalid or out of date. Make sure you are copy-and-pasting the '. | ||||||
|         'entire link into your browser. You can try again, or request '. |         'entire link into your browser. You can try again, or request '. | ||||||
|         'a new email.</p>'); |         'a new email.').'</p>'); | ||||||
|       $view->appendChild( |       $view->appendChild( | ||||||
|         '<div class="aphront-failure-continue">'. |         '<div class="aphront-failure-continue">'. | ||||||
|           '<a class="button" href="/login/email/">Send Another Email</a>'. |           '<a class="button" href="/login/email/">'. | ||||||
|  |             pht('Send Another Email'). | ||||||
|  |           '</a>'. | ||||||
|         '</div>'); |         '</div>'); | ||||||
|  |  | ||||||
|       return $this->buildStandardPageResponse( |       return $this->buildStandardPageResponse( | ||||||
|         $view, |         $view, | ||||||
|         array( |         array( | ||||||
|           'title' => 'Login Failure', |           'title' => pht('Login Failure'), | ||||||
|         )); |         )); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,11 +42,12 @@ final class PhabricatorLDAPLoginController extends PhabricatorAuthController { | |||||||
|                 $existing_ldap) { |                 $existing_ldap) { | ||||||
|               $dialog = new AphrontDialogView(); |               $dialog = new AphrontDialogView(); | ||||||
|               $dialog->setUser($current_user); |               $dialog->setUser($current_user); | ||||||
|               $dialog->setTitle('Already Linked to Another Account'); |               $dialog->setTitle(pht('Already Linked to Another Account')); | ||||||
|               $dialog->appendChild( |               $dialog->appendChild( | ||||||
|                 '<p>The LDAP account you just authorized is already linked to '. |                 '<p>'.pht('The LDAP account you just authorized is already '. | ||||||
|                 'another Phabricator account. Before you can link it to a '. |                 'linked toanother Phabricator account. Before you can link it '. | ||||||
|                 'different LDAP account, you must unlink the old account.</p>' |                 'to a different LDAP account, you must unlink the old '. | ||||||
|  |                 'account.').'</p>' | ||||||
|               ); |               ); | ||||||
|               $dialog->addCancelButton('/settings/panel/ldap/'); |               $dialog->addCancelButton('/settings/panel/ldap/'); | ||||||
|  |  | ||||||
| @@ -60,12 +61,14 @@ final class PhabricatorLDAPLoginController extends PhabricatorAuthController { | |||||||
|           if (!$request->isDialogFormPost()) { |           if (!$request->isDialogFormPost()) { | ||||||
|             $dialog = new AphrontDialogView(); |             $dialog = new AphrontDialogView(); | ||||||
|             $dialog->setUser($current_user); |             $dialog->setUser($current_user); | ||||||
|             $dialog->setTitle('Link LDAP Account'); |             $dialog->setTitle(pht('Link LDAP Account')); | ||||||
|             $dialog->appendChild( |             $dialog->appendChild( | ||||||
|               '<p>Link your LDAP account to your Phabricator account?</p>'); |               '<p>'. | ||||||
|  |                 pht('Link your LDAP account to your Phabricator account?'). | ||||||
|  |               '</p>'); | ||||||
|             $dialog->addHiddenInput('username', $request->getStr('username')); |             $dialog->addHiddenInput('username', $request->getStr('username')); | ||||||
|             $dialog->addHiddenInput('password', $request->getStr('password')); |             $dialog->addHiddenInput('password', $request->getStr('password')); | ||||||
|             $dialog->addSubmitButton('Link Accounts'); |             $dialog->addSubmitButton(pht('Link Accounts')); | ||||||
|             $dialog->addCancelButton('/settings/panel/ldap/'); |             $dialog->addCancelButton('/settings/panel/ldap/'); | ||||||
|  |  | ||||||
|             return id(new AphrontDialogResponse())->setDialog($dialog); |             return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
| @@ -116,27 +119,27 @@ final class PhabricatorLDAPLoginController extends PhabricatorAuthController { | |||||||
|       ->setAction('/ldap/login/') |       ->setAction('/ldap/login/') | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|         ->setLabel('LDAP username') |         ->setLabel(pht('LDAP username')) | ||||||
|         ->setName('username') |         ->setName('username') | ||||||
|         ->setValue($ldap_username)) |         ->setValue($ldap_username)) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormPasswordControl()) |         id(new AphrontFormPasswordControl()) | ||||||
|         ->setLabel('Password') |         ->setLabel(pht('Password')) | ||||||
|         ->setName('password')); |         ->setName('password')); | ||||||
|  |  | ||||||
|     $ldap_form |     $ldap_form | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormSubmitControl()) |         id(new AphrontFormSubmitControl()) | ||||||
|         ->setValue('Login')); |         ->setValue(pht('Login'))); | ||||||
|  |  | ||||||
|     $panel = new AphrontPanelView(); |     $panel = new AphrontPanelView(); | ||||||
|     $panel->setWidth(AphrontPanelView::WIDTH_FORM); |     $panel->setWidth(AphrontPanelView::WIDTH_FORM); | ||||||
|     $panel->appendChild('<h1>LDAP login</h1>'); |     $panel->appendChild('<h1>'.pht('LDAP login').'</h1>'); | ||||||
|     $panel->appendChild($ldap_form); |     $panel->appendChild($ldap_form); | ||||||
|  |  | ||||||
|     if (isset($errors) && count($errors) > 0) { |     if (isset($errors) && count($errors) > 0) { | ||||||
|       $error_view = new AphrontErrorView(); |       $error_view = new AphrontErrorView(); | ||||||
|       $error_view->setTitle('Login Failed'); |       $error_view->setTitle(pht('Login Failed')); | ||||||
|       $error_view->setErrors($errors); |       $error_view->setErrors($errors); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -146,7 +149,7 @@ final class PhabricatorLDAPLoginController extends PhabricatorAuthController { | |||||||
|         $panel, |         $panel, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         'title' => 'Login', |         'title' => pht('Login'), | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -63,10 +63,10 @@ extends PhabricatorAuthController { | |||||||
|       $user->setUsername($request->getStr('username')); |       $user->setUsername($request->getStr('username')); | ||||||
|       $username = $user->getUsername(); |       $username = $user->getUsername(); | ||||||
|       if (!strlen($user->getUsername())) { |       if (!strlen($user->getUsername())) { | ||||||
|         $e_username = 'Required'; |         $e_username = pht('Required'); | ||||||
|         $errors[] = 'Username is required.'; |         $errors[] = pht('Username is required.'); | ||||||
|       } else if (!PhabricatorUser::validateUsername($username)) { |       } else if (!PhabricatorUser::validateUsername($username)) { | ||||||
|         $e_username = 'Invalid'; |         $e_username = pht('Invalid'); | ||||||
|         $errors[] = PhabricatorUser::describeValidUsername(); |         $errors[] = PhabricatorUser::describeValidUsername(); | ||||||
|       } else { |       } else { | ||||||
|         $e_username = null; |         $e_username = null; | ||||||
| @@ -75,8 +75,8 @@ extends PhabricatorAuthController { | |||||||
|       if (!$new_email) { |       if (!$new_email) { | ||||||
|         $new_email = trim($request->getStr('email')); |         $new_email = trim($request->getStr('email')); | ||||||
|         if (!$new_email) { |         if (!$new_email) { | ||||||
|           $e_email = 'Required'; |           $e_email = pht('Required'); | ||||||
|           $errors[] = 'Email is required.'; |           $errors[] = pht('Email is required.'); | ||||||
|         } else { |         } else { | ||||||
|           $e_email = null; |           $e_email = null; | ||||||
|         } |         } | ||||||
| @@ -84,7 +84,7 @@ extends PhabricatorAuthController { | |||||||
|  |  | ||||||
|       if ($new_email) { |       if ($new_email) { | ||||||
|         if (!PhabricatorUserEmail::isAllowedAddress($new_email)) { |         if (!PhabricatorUserEmail::isAllowedAddress($new_email)) { | ||||||
|           $e_email = 'Invalid'; |           $e_email = pht('Invalid'); | ||||||
|           $errors[] = PhabricatorUserEmail::describeAllowedAddresses(); |           $errors[] = PhabricatorUserEmail::describeAllowedAddresses(); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -92,8 +92,8 @@ extends PhabricatorAuthController { | |||||||
|       if (!strlen($user->getRealName())) { |       if (!strlen($user->getRealName())) { | ||||||
|         $user->setRealName($request->getStr('realname')); |         $user->setRealName($request->getStr('realname')); | ||||||
|         if (!strlen($user->getRealName())) { |         if (!strlen($user->getRealName())) { | ||||||
|           $e_realname = 'Required'; |           $e_realname = pht('Required'); | ||||||
|           $errors[] = 'Real name is required.'; |           $errors[] = pht('Real name is required.'); | ||||||
|         } else { |         } else { | ||||||
|           $e_realname = null; |           $e_realname = null; | ||||||
|         } |         } | ||||||
| @@ -137,11 +137,11 @@ extends PhabricatorAuthController { | |||||||
|             $new_email); |             $new_email); | ||||||
|  |  | ||||||
|           if ($same_username) { |           if ($same_username) { | ||||||
|             $e_username = 'Duplicate'; |             $e_username = pht('Duplicate'); | ||||||
|             $errors[] = 'That username or email is not unique.'; |             $errors[] = pht('That username or email is not unique.'); | ||||||
|           } else if ($same_email) { |           } else if ($same_email) { | ||||||
|             $e_email = 'Duplicate'; |             $e_email = pht('Duplicate'); | ||||||
|             $errors[] = 'That email is not unique.'; |             $errors[] = pht('That email is not unique.'); | ||||||
|           } else { |           } else { | ||||||
|             throw $exception; |             throw $exception; | ||||||
|           } |           } | ||||||
| @@ -153,7 +153,7 @@ extends PhabricatorAuthController { | |||||||
|     $error_view = null; |     $error_view = null; | ||||||
|     if ($errors) { |     if ($errors) { | ||||||
|       $error_view = new AphrontErrorView(); |       $error_view = new AphrontErrorView(); | ||||||
|       $error_view->setTitle('Registration Failed'); |       $error_view->setTitle(pht('Registration Failed')); | ||||||
|       $error_view->setErrors($errors); |       $error_view->setErrors($errors); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -169,20 +169,20 @@ extends PhabricatorAuthController { | |||||||
|       ->setAction($action_path) |       ->setAction($action_path) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|         ->setLabel('Username') |         ->setLabel(pht('Username')) | ||||||
|         ->setName('username') |         ->setName('username') | ||||||
|         ->setValue($user->getUsername()) |         ->setValue($user->getUsername()) | ||||||
|         ->setError($e_username)); |         ->setError($e_username)); | ||||||
|  |  | ||||||
|     $form->appendChild( |     $form->appendChild( | ||||||
|       id(new AphrontFormPasswordControl()) |       id(new AphrontFormPasswordControl()) | ||||||
|         ->setLabel('Password') |         ->setLabel(pht('Password')) | ||||||
|         ->setName('password')); |         ->setName('password')); | ||||||
|  |  | ||||||
|     if ($show_email_input) { |     if ($show_email_input) { | ||||||
|       $form->appendChild( |       $form->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|         ->setLabel('Email') |         ->setLabel(pht('Email')) | ||||||
|         ->setName('email') |         ->setName('email') | ||||||
|         ->setValue($request->getStr('email')) |         ->setValue($request->getStr('email')) | ||||||
|         ->setError($e_email)); |         ->setError($e_email)); | ||||||
| @@ -191,7 +191,7 @@ extends PhabricatorAuthController { | |||||||
|     if ($provider->retrieveUserRealName() === null) { |     if ($provider->retrieveUserRealName() === null) { | ||||||
|       $form->appendChild( |       $form->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|         ->setLabel('Real Name') |         ->setLabel(pht('Real Name')) | ||||||
|         ->setName('realname') |         ->setName('realname') | ||||||
|         ->setValue($request->getStr('realname')) |         ->setValue($request->getStr('realname')) | ||||||
|         ->setError($e_realname)); |         ->setError($e_realname)); | ||||||
| @@ -200,10 +200,10 @@ extends PhabricatorAuthController { | |||||||
|     $form |     $form | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormSubmitControl()) |         id(new AphrontFormSubmitControl()) | ||||||
|         ->setValue('Create Account')); |         ->setValue(pht('Create Account'))); | ||||||
|  |  | ||||||
|     $panel = new AphrontPanelView(); |     $panel = new AphrontPanelView(); | ||||||
|     $panel->setHeader('Create New Account'); |     $panel->setHeader(pht('Create New Account')); | ||||||
|     $panel->setWidth(AphrontPanelView::WIDTH_FORM); |     $panel->setWidth(AphrontPanelView::WIDTH_FORM); | ||||||
|     $panel->appendChild($form); |     $panel->appendChild($form); | ||||||
|  |  | ||||||
| @@ -213,7 +213,7 @@ extends PhabricatorAuthController { | |||||||
|         $panel, |         $panel, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         'title' => 'Create New Account', |         'title' => pht('Create New Account'), | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,11 +17,11 @@ final class PhabricatorLDAPUnlinkController extends PhabricatorAuthController { | |||||||
|     if (!$request->isDialogFormPost()) { |     if (!$request->isDialogFormPost()) { | ||||||
|       $dialog = new AphrontDialogView(); |       $dialog = new AphrontDialogView(); | ||||||
|       $dialog->setUser($user); |       $dialog->setUser($user); | ||||||
|       $dialog->setTitle('Really unlink account?'); |       $dialog->setTitle(pht('Really unlink account?')); | ||||||
|       $dialog->appendChild( |       $dialog->appendChild( | ||||||
|         '<p><strong>You will not be able to login</strong> using this account '. |         '<p>'.pht('You will not be able to login using this account '. | ||||||
|         'once you unlink it. Continue?</p>'); |         'once you unlink it. Continue?').'</p>'); | ||||||
|       $dialog->addSubmitButton('Unlink Account'); |       $dialog->addSubmitButton(pht('Unlink Account')); | ||||||
|       $dialog->addCancelButton('/settings/panel/ldap/'); |       $dialog->addCancelButton('/settings/panel/ldap/'); | ||||||
|  |  | ||||||
|       return id(new AphrontDialogResponse())->setDialog($dialog); |       return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
|   | |||||||
| @@ -28,10 +28,10 @@ final class PhabricatorLoginController | |||||||
|  |  | ||||||
|       $dialog = new AphrontDialogView(); |       $dialog = new AphrontDialogView(); | ||||||
|       $dialog->setUser($user); |       $dialog->setUser($user); | ||||||
|       $dialog->setTitle('Login Required'); |       $dialog->setTitle(pht('Login Required')); | ||||||
|       $dialog->appendChild('<p>You must login to continue.</p>'); |       $dialog->appendChild('<p>'.pht('You must login to continue.').'</p>'); | ||||||
|       $dialog->addSubmitButton('Login'); |       $dialog->addSubmitButton(pht('Login')); | ||||||
|       $dialog->addCancelButton('/', 'Cancel'); |       $dialog->addCancelButton('/', pht('Cancel')); | ||||||
|  |  | ||||||
|       return id(new AphrontDialogResponse())->setDialog($dialog); |       return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
|     } |     } | ||||||
| @@ -62,10 +62,10 @@ final class PhabricatorLoginController | |||||||
|       $request->clearCookie('phsid'); |       $request->clearCookie('phsid'); | ||||||
|  |  | ||||||
|       $error_view = new AphrontErrorView(); |       $error_view = new AphrontErrorView(); | ||||||
|       $error_view->setTitle('Invalid Session'); |       $error_view->setTitle(pht('Invalid Session')); | ||||||
|       $error_view->setErrors(array( |       $error_view->setErrors(array( | ||||||
|         "Your login session is invalid. Try logging in again. If that ". |         pht("Your login session is invalid. Try logging in again. If that ". | ||||||
|         "doesn't work, clear your browser cookies." |         "doesn't work, clear your browser cookies.") | ||||||
|       )); |       )); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -100,12 +100,12 @@ final class PhabricatorLoginController | |||||||
|             $require_captcha = true; |             $require_captcha = true; | ||||||
|             if (!AphrontFormRecaptchaControl::processCaptcha($request)) { |             if (!AphrontFormRecaptchaControl::processCaptcha($request)) { | ||||||
|               if (AphrontFormRecaptchaControl::hasCaptchaResponse($request)) { |               if (AphrontFormRecaptchaControl::hasCaptchaResponse($request)) { | ||||||
|                 $e_captcha = 'Invalid'; |                 $e_captcha = pht('Invalid'); | ||||||
|                 $errors[] = 'CAPTCHA was not entered correctly.'; |                 $errors[] = pht('CAPTCHA was not entered correctly.'); | ||||||
|               } else { |               } else { | ||||||
|                 $e_captcha = 'Required'; |                 $e_captcha = pht('Required'); | ||||||
|                 $errors[] = 'Too many login failures recently. You must '. |                 $errors[] = pht('Too many login failures recently. You must '. | ||||||
|                             'submit a CAPTCHA with your login request.'; |                             'submit a CAPTCHA with your login request.'); | ||||||
|               } |               } | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
| @@ -128,7 +128,7 @@ final class PhabricatorLoginController | |||||||
|           $envelope = new PhutilOpaqueEnvelope($request->getStr('password')); |           $envelope = new PhutilOpaqueEnvelope($request->getStr('password')); | ||||||
|  |  | ||||||
|           if (!$user || !$user->comparePassword($envelope)) { |           if (!$user || !$user->comparePassword($envelope)) { | ||||||
|             $errors[] = 'Bad username/password.'; |             $errors[] = pht('Bad username/password.'); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -160,7 +160,7 @@ final class PhabricatorLoginController | |||||||
|  |  | ||||||
|       if ($errors) { |       if ($errors) { | ||||||
|         $error_view = new AphrontErrorView(); |         $error_view = new AphrontErrorView(); | ||||||
|         $error_view->setTitle('Login Failed'); |         $error_view->setTitle(pht('Login Failed')); | ||||||
|         $error_view->setErrors($errors); |         $error_view->setErrors($errors); | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -170,16 +170,16 @@ final class PhabricatorLoginController | |||||||
|         ->setAction('/login/') |         ->setAction('/login/') | ||||||
|         ->appendChild( |         ->appendChild( | ||||||
|           id(new AphrontFormTextControl()) |           id(new AphrontFormTextControl()) | ||||||
|             ->setLabel('Username/Email') |             ->setLabel(pht('Username/Email')) | ||||||
|             ->setName('username_or_email') |             ->setName('username_or_email') | ||||||
|             ->setValue($username_or_email)) |             ->setValue($username_or_email)) | ||||||
|         ->appendChild( |         ->appendChild( | ||||||
|           id(new AphrontFormPasswordControl()) |           id(new AphrontFormPasswordControl()) | ||||||
|             ->setLabel('Password') |             ->setLabel(pht('Password')) | ||||||
|             ->setName('password') |             ->setName('password') | ||||||
|             ->setCaption( |             ->setCaption( | ||||||
|               '<a href="/login/email/">'. |               '<a href="/login/email/">'. | ||||||
|                 'Forgot your password? / Email Login</a>')); |                 pht('Forgot your password? / Email Login').'</a>')); | ||||||
|  |  | ||||||
|       if ($require_captcha) { |       if ($require_captcha) { | ||||||
|         $form->appendChild( |         $form->appendChild( | ||||||
| @@ -190,7 +190,7 @@ final class PhabricatorLoginController | |||||||
|       $form |       $form | ||||||
|         ->appendChild( |         ->appendChild( | ||||||
|           id(new AphrontFormSubmitControl()) |           id(new AphrontFormSubmitControl()) | ||||||
|             ->setValue('Login')); |             ->setValue(pht('Login'))); | ||||||
|  |  | ||||||
|  |  | ||||||
|   //    $panel->setCreateButton('Register New Account', '/login/register/'); |   //    $panel->setCreateButton('Register New Account', '/login/register/'); | ||||||
| @@ -206,18 +206,18 @@ final class PhabricatorLoginController | |||||||
|         ->setAction('/ldap/login/') |         ->setAction('/ldap/login/') | ||||||
|         ->appendChild( |         ->appendChild( | ||||||
|           id(new AphrontFormTextControl()) |           id(new AphrontFormTextControl()) | ||||||
|           ->setLabel('LDAP username') |           ->setLabel(pht('LDAP username')) | ||||||
|           ->setName('username') |           ->setName('username') | ||||||
|           ->setValue($username_or_email)) |           ->setValue($username_or_email)) | ||||||
|         ->appendChild( |         ->appendChild( | ||||||
|           id(new AphrontFormPasswordControl()) |           id(new AphrontFormPasswordControl()) | ||||||
|           ->setLabel('Password') |           ->setLabel(pht('Password')) | ||||||
|           ->setName('password')); |           ->setName('password')); | ||||||
|  |  | ||||||
|       $ldap_form |       $ldap_form | ||||||
|         ->appendChild( |         ->appendChild( | ||||||
|           id(new AphrontFormSubmitControl()) |           id(new AphrontFormSubmitControl()) | ||||||
|           ->setValue('Login')); |           ->setValue(pht('Login'))); | ||||||
|  |  | ||||||
|       $forms['LDAP Login'] = $ldap_form; |       $forms['LDAP Login'] = $ldap_form; | ||||||
|     } |     } | ||||||
| @@ -243,18 +243,23 @@ final class PhabricatorLoginController | |||||||
|       // CSRF for logged-out users is vaugely tricky. |       // CSRF for logged-out users is vaugely tricky. | ||||||
|  |  | ||||||
|       if ($provider->isProviderRegistrationEnabled()) { |       if ($provider->isProviderRegistrationEnabled()) { | ||||||
|         $title = "Login or Register with {$provider_name}"; |         $title = pht("Login or Register with %s", | ||||||
|         $body = 'Login or register for Phabricator using your '. |           phutil_escape_html($provider_name)); | ||||||
|                 phutil_escape_html($provider_name).' account.'; |         $body = pht('Login or register for Phabricator using your %s account.', | ||||||
|         $button = "Login or Register with {$provider_name}"; |           phutil_escape_html($provider_name)); | ||||||
|  |         $button = pht("Login or Register with %s", | ||||||
|  |           phutil_escape_html($provider_name)); | ||||||
|       } else { |       } else { | ||||||
|         $title = "Login with {$provider_name}"; |         $title = pht("Login with %s", | ||||||
|         $body = 'Login to your existing Phabricator account using your '. |           phutil_escape_html($provider_name)); | ||||||
|                 phutil_escape_html($provider_name).' account.<br /><br />'. |         $body = pht('Login to your existing Phabricator account using your '. | ||||||
|                 '<strong>You can not use '. |                 '%s account.', phutil_escape_html($provider_name)). | ||||||
|                 phutil_escape_html($provider_name).' to register a new '. |                 '<br /><br />'. | ||||||
|                 'account.</strong>'; |                 '<strong>'. | ||||||
|         $button = "Login with {$provider_name}"; |                   pht('You can not use %s to register a new account.', | ||||||
|  |                   phutil_escape_html($provider_name)). | ||||||
|  |                 '</strong>'; | ||||||
|  |         $button = pht("Log in with %s", phutil_escape_html($provider_name)); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       $auth_form = new AphrontFormView(); |       $auth_form = new AphrontFormView(); | ||||||
| @@ -298,7 +303,7 @@ final class PhabricatorLoginController | |||||||
|         $panel, |         $panel, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         'title' => 'Login', |         'title' => pht('Login'), | ||||||
|         'device' => true |         'device' => true | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -48,19 +48,19 @@ final class PhabricatorLoginValidateController | |||||||
|       $list = '<ul>'.implode("\n", $list).'</ul>'; |       $list = '<ul>'.implode("\n", $list).'</ul>'; | ||||||
|  |  | ||||||
|       $view = new AphrontRequestFailureView(); |       $view = new AphrontRequestFailureView(); | ||||||
|       $view->setHeader('Login Failed'); |       $view->setHeader(pht('Login Failed')); | ||||||
|       $view->appendChild( |       $view->appendChild( | ||||||
|         '<p>Login failed:</p>'. |         '<p>'.pht('Login failed:').'</p>'. | ||||||
|         $list. |         $list. | ||||||
|         '<p><strong>Clear your cookies</strong> and try again.</p>'); |         '<p>'.pht('<strong>Clear your cookies</strong> and try again.').'</p>'); | ||||||
|       $view->appendChild( |       $view->appendChild( | ||||||
|         '<div class="aphront-failure-continue">'. |         '<div class="aphront-failure-continue">'. | ||||||
|           '<a class="button" href="/login/">Try Again</a>'. |           '<a class="button" href="/login/">'.pht('Try Again').'</a>'. | ||||||
|         '</div>'); |         '</div>'); | ||||||
|       return $this->buildStandardPageResponse( |       return $this->buildStandardPageResponse( | ||||||
|         $view, |         $view, | ||||||
|         array( |         array( | ||||||
|           'title' => 'Login Failed', |           'title' => pht('Login Failed'), | ||||||
|         )); |         )); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,9 +45,9 @@ final class PhabricatorLogoutController | |||||||
|     if ($user->getPHID()) { |     if ($user->getPHID()) { | ||||||
|       $dialog = id(new AphrontDialogView()) |       $dialog = id(new AphrontDialogView()) | ||||||
|         ->setUser($user) |         ->setUser($user) | ||||||
|         ->setTitle('Log out of Phabricator?') |         ->setTitle(pht('Log out of Phabricator?')) | ||||||
|         ->appendChild('<p>Are you sure you want to log out?</p>') |         ->appendChild('<p>'.pht('Are you sure you want to log out?').'</p>') | ||||||
|         ->addSubmitButton('Log Out') |         ->addSubmitButton(pht('Logout')) | ||||||
|         ->addCancelButton('/'); |         ->addCancelButton('/'); | ||||||
|  |  | ||||||
|       return id(new AphrontDialogResponse())->setDialog($dialog); |       return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
|   | |||||||
| @@ -30,21 +30,25 @@ final class PhabricatorMustVerifyEmailController | |||||||
|       $email->sendVerificationEmail($user); |       $email->sendVerificationEmail($user); | ||||||
|       $sent = new AphrontErrorView(); |       $sent = new AphrontErrorView(); | ||||||
|       $sent->setSeverity(AphrontErrorView::SEVERITY_NOTICE); |       $sent->setSeverity(AphrontErrorView::SEVERITY_NOTICE); | ||||||
|       $sent->setTitle('Email Sent'); |       $sent->setTitle(pht('Email Sent')); | ||||||
|       $sent->appendChild( |       $sent->appendChild('<p>'. | ||||||
|         '<p>Another verification email was sent to <strong>'. |         pht('Another verification email was sent to <strong>%s</strong>.', | ||||||
|         phutil_escape_html($email_address).'</strong>.</p>'); |         phutil_escape_html($email_address)).'</p>'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $error_view = new AphrontRequestFailureView(); |     $error_view = new AphrontRequestFailureView(); | ||||||
|     $error_view->setHeader('Check Your Email'); |     $error_view->setHeader(pht('Check Your Email')); | ||||||
|     $error_view->appendChild( |     $error_view->appendChild( | ||||||
|       '<p>You must verify your email address to login. You should have a new '. |       '<p>'. | ||||||
|  |       pht('You must verify your email address to login. You should have a new '. | ||||||
|       'email message from Phabricator with verification instructions in your '. |       'email message from Phabricator with verification instructions in your '. | ||||||
|       'inbox (<strong>'.phutil_escape_html($email_address).'</strong>).</p>'); |       'inbox (<strong>%s</strong>).', phutil_escape_html($email_address)). | ||||||
|  |       '</p>'); | ||||||
|     $error_view->appendChild( |     $error_view->appendChild( | ||||||
|       '<p>If you did not receive an email, you can click the button below '. |       '<p>'. | ||||||
|       'to try sending another one.</p>'); |       pht('If you did not receive an email, you can click the button below '. | ||||||
|  |       'to try sending another one.'). | ||||||
|  |       '</p>'); | ||||||
|     $error_view->appendChild( |     $error_view->appendChild( | ||||||
|       '<div class="aphront-failure-continue">'. |       '<div class="aphront-failure-continue">'. | ||||||
|         phabricator_render_form( |         phabricator_render_form( | ||||||
| @@ -57,17 +61,18 @@ final class PhabricatorMustVerifyEmailController | |||||||
|             'button', |             'button', | ||||||
|             array( |             array( | ||||||
|             ), |             ), | ||||||
|             'Send Another Email')). |             pht('Send Another Email'))). | ||||||
|       '</div>'); |       '</div>'); | ||||||
|  |  | ||||||
|  |  | ||||||
|     return $this->buildStandardPageResponse( |     return $this->buildApplicationPage( | ||||||
|       array( |       array( | ||||||
|         $sent, |         $sent, | ||||||
|         $error_view, |         $error_view, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         'title' => 'Must Verify Email', |         'title' => pht('Must Verify Email'), | ||||||
|  |         'device' => true | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -68,15 +68,15 @@ final class PhabricatorOAuthLoginController | |||||||
|         if ($oauth_info->getUserID() != $current_user->getID()) { |         if ($oauth_info->getUserID() != $current_user->getID()) { | ||||||
|           $dialog = new AphrontDialogView(); |           $dialog = new AphrontDialogView(); | ||||||
|           $dialog->setUser($current_user); |           $dialog->setUser($current_user); | ||||||
|           $dialog->setTitle('Already Linked to Another Account'); |           $dialog->setTitle(pht('Already Linked to Another Account')); | ||||||
|           $dialog->appendChild( |           $dialog->appendChild('<p>'. | ||||||
|             hsprintf( |             pht( | ||||||
|               '<p>The %s account you just authorized is already linked to '. |               'The %s account you just authorized is already linked to '. | ||||||
|               'another Phabricator account. Before you can associate your %s '. |               'another Phabricator account. Before you can associate your %s '. | ||||||
|               'account with this Phabriactor account, you must unlink it from '. |               'account with this Phabriactor account, you must unlink it from '. | ||||||
|               'the Phabricator account it is currently linked to.</p>', |               'the Phabricator account it is currently linked to.</p>', | ||||||
|               $provider_name, |               phutil_escape_html($provider_name), | ||||||
|               $provider_name)); |               phutil_escape_html($provider_name))).'</p>'; | ||||||
|           $dialog->addCancelButton($provider->getSettingsPanelURI()); |           $dialog->addCancelButton($provider->getSettingsPanelURI()); | ||||||
|  |  | ||||||
|           return id(new AphrontDialogResponse())->setDialog($dialog); |           return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
| @@ -95,14 +95,15 @@ final class PhabricatorOAuthLoginController | |||||||
|       if ($existing_oauth) { |       if ($existing_oauth) { | ||||||
|         $dialog = new AphrontDialogView(); |         $dialog = new AphrontDialogView(); | ||||||
|         $dialog->setUser($current_user); |         $dialog->setUser($current_user); | ||||||
|         $dialog->setTitle('Already Linked to an Account From This Provider'); |         $dialog->setTitle( | ||||||
|         $dialog->appendChild( |           pht('Already Linked to an Account From This Provider')); | ||||||
|           hsprintf( |         $dialog->appendChild('<p>'. | ||||||
|             '<p>The account you are logged in with is already linked to a %s '. |           pht( | ||||||
|  |             'The account you are logged in with is already linked to a %s '. | ||||||
|             'account. Before you can link it to a different %s account, you '. |             'account. Before you can link it to a different %s account, you '. | ||||||
|             'must unlink the old account.</p>', |             'must unlink the old account.</p>', | ||||||
|             $provider_name, |             phutil_escape_html($provider_name), | ||||||
|             $provider_name)); |             phutil_escape_html($provider_name))).'</p>'; | ||||||
|         $dialog->addCancelButton($provider->getSettingsPanelURI()); |         $dialog->addCancelButton($provider->getSettingsPanelURI()); | ||||||
|         return id(new AphrontDialogResponse())->setDialog($dialog); |         return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
|       } |       } | ||||||
| @@ -110,11 +111,11 @@ final class PhabricatorOAuthLoginController | |||||||
|       if (!$request->isDialogFormPost()) { |       if (!$request->isDialogFormPost()) { | ||||||
|         $dialog = new AphrontDialogView(); |         $dialog = new AphrontDialogView(); | ||||||
|         $dialog->setUser($current_user); |         $dialog->setUser($current_user); | ||||||
|         $dialog->setTitle('Link '.$provider_name.' Account'); |         $dialog->setTitle(pht('Link %s Account', $provider_name)); | ||||||
|         $dialog->appendChild( |         $dialog->appendChild( | ||||||
|           hsprintf( |           pht( | ||||||
|             '<p>Link your %s account to your Phabricator account?</p>', |             '<p>Link your %s account to your Phabricator account?</p>', | ||||||
|             $provider_name)); |             phutil_escape_html($provider_name))); | ||||||
|         $dialog->addHiddenInput('confirm_token', $provider->getAccessToken()); |         $dialog->addHiddenInput('confirm_token', $provider->getAccessToken()); | ||||||
|         $dialog->addHiddenInput('expires', $oauth_info->getTokenExpires()); |         $dialog->addHiddenInput('expires', $oauth_info->getTokenExpires()); | ||||||
|         $dialog->addHiddenInput('state', $this->oauthState); |         $dialog->addHiddenInput('state', $this->oauthState); | ||||||
| @@ -168,14 +169,14 @@ final class PhabricatorOAuthLoginController | |||||||
|       if ($known_email) { |       if ($known_email) { | ||||||
|         $dialog = new AphrontDialogView(); |         $dialog = new AphrontDialogView(); | ||||||
|         $dialog->setUser($current_user); |         $dialog->setUser($current_user); | ||||||
|         $dialog->setTitle('Already Linked to Another Account'); |         $dialog->setTitle(pht('Already Linked to Another Account')); | ||||||
|         $dialog->appendChild( |         $dialog->appendChild('<p>'. | ||||||
|           hsprintf( |           pht( | ||||||
|             '<p>The %s account you just authorized has an email address which '. |             'The %s account you just authorized has an email address which '. | ||||||
|             'is already in use by another Phabricator account. To link the '. |             'is already in use by another Phabricator account. To link the '. | ||||||
|             'accounts, log in to your Phabricator account and then go to '. |             'accounts, log in to your Phabricator account and then go to '. | ||||||
|             'Settings.</p>', |             'Settings.', | ||||||
|             $provider_name)); |             phutil_escape_html($provider_name))).'</p>'; | ||||||
|  |  | ||||||
|         $user = id(new PhabricatorUser()) |         $user = id(new PhabricatorUser()) | ||||||
|           ->loadOneWhere('phid = %s', $known_email->getUserPHID()); |           ->loadOneWhere('phid = %s', $known_email->getUserPHID()); | ||||||
| @@ -189,9 +190,9 @@ final class PhabricatorOAuthLoginController | |||||||
|               ->getProviderName(); |               ->getProviderName(); | ||||||
|           } |           } | ||||||
|           $dialog->appendChild( |           $dialog->appendChild( | ||||||
|             hsprintf( |             pht( | ||||||
|               '<p>The account is associated with: %s.</p>', |               '<p>The account is associated with: %s.</p>', | ||||||
|               implode(', ', $providers))); |               implode(', ', phutil_escape_html($providers)))); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         $dialog->addCancelButton('/login/'); |         $dialog->addCancelButton('/login/'); | ||||||
| @@ -203,14 +204,14 @@ final class PhabricatorOAuthLoginController | |||||||
|     if (!$provider->isProviderRegistrationEnabled()) { |     if (!$provider->isProviderRegistrationEnabled()) { | ||||||
|       $dialog = new AphrontDialogView(); |       $dialog = new AphrontDialogView(); | ||||||
|       $dialog->setUser($current_user); |       $dialog->setUser($current_user); | ||||||
|       $dialog->setTitle('No Account Registration With '.$provider_name); |       $dialog->setTitle(pht('No Account Registration with %s', $provider_name)); | ||||||
|       $dialog->appendChild( |       $dialog->appendChild('<p>'. | ||||||
|         hsprintf( |         pht( | ||||||
|           '<p>You can not register a new account using %s; you can only use '. |           'You can not register a new account using %s; you can only use '. | ||||||
|           'your %s account to log into an existing Phabricator account which '. |           'your %s account to log into an existing Phabricator account which '. | ||||||
|           'you have registered through other means.</p>', |           'you have registered through other means.', | ||||||
|           $provider_name, |           phutil_escape_html($provider_name), | ||||||
|           $provider_name)); |           phutil_escape_html($provider_name))).'</p>'; | ||||||
|       $dialog->addCancelButton('/login/'); |       $dialog->addCancelButton('/login/'); | ||||||
|  |  | ||||||
|       return id(new AphrontDialogResponse())->setDialog($dialog); |       return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
| @@ -242,7 +243,7 @@ final class PhabricatorOAuthLoginController | |||||||
|     return $this->buildStandardPageResponse( |     return $this->buildStandardPageResponse( | ||||||
|       $view, |       $view, | ||||||
|       array( |       array( | ||||||
|         'title' => $provider_name.' Auth Failed', |         'title' => pht('Auth Failed'), | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ final class PhabricatorOAuthUnlinkController extends PhabricatorAuthController { | |||||||
|  |  | ||||||
|     if ($provider->isProviderLinkPermanent()) { |     if ($provider->isProviderLinkPermanent()) { | ||||||
|       throw new Exception( |       throw new Exception( | ||||||
|         "You may not unlink accounts from this OAuth provider."); |         pht("You may not unlink accounts from this OAuth provider.")); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $provider_key = $provider->getProviderKey(); |     $provider_key = $provider->getProviderKey(); | ||||||
| @@ -33,11 +33,11 @@ final class PhabricatorOAuthUnlinkController extends PhabricatorAuthController { | |||||||
|     if (!$request->isDialogFormPost()) { |     if (!$request->isDialogFormPost()) { | ||||||
|       $dialog = new AphrontDialogView(); |       $dialog = new AphrontDialogView(); | ||||||
|       $dialog->setUser($user); |       $dialog->setUser($user); | ||||||
|       $dialog->setTitle('Really unlink account?'); |       $dialog->setTitle(pht('Really unlink account?')); | ||||||
|       $dialog->appendChild( |       $dialog->appendChild( | ||||||
|         '<p><strong>You will not be able to login</strong> using this account '. |         '<p>'.pht('You will not be able to login using this account '. | ||||||
|         'once you unlink it. Continue?</p>'); |         'once you unlink it. Continue?').'</p>'); | ||||||
|       $dialog->addSubmitButton('Unlink Account'); |       $dialog->addSubmitButton(pht('Unlink Account')); | ||||||
|       $dialog->addCancelButton($provider->getSettingsPanelURI()); |       $dialog->addCancelButton($provider->getSettingsPanelURI()); | ||||||
|  |  | ||||||
|       return id(new AphrontDialogResponse())->setDialog($dialog); |       return id(new AphrontDialogResponse())->setDialog($dialog); | ||||||
|   | |||||||
| @@ -45,10 +45,10 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|       $user->setUsername($request->getStr('username')); |       $user->setUsername($request->getStr('username')); | ||||||
|       $username = $user->getUsername(); |       $username = $user->getUsername(); | ||||||
|       if (!strlen($user->getUsername())) { |       if (!strlen($user->getUsername())) { | ||||||
|         $e_username = 'Required'; |         $e_username = pht('Required'); | ||||||
|         $errors[] = 'Username is required.'; |         $errors[] = pht('Username is required.'); | ||||||
|       } else if (!PhabricatorUser::validateUsername($username)) { |       } else if (!PhabricatorUser::validateUsername($username)) { | ||||||
|         $e_username = 'Invalid'; |         $e_username = pht('Invalid'); | ||||||
|         $errors[] = PhabricatorUser::describeValidUsername(); |         $errors[] = PhabricatorUser::describeValidUsername(); | ||||||
|       } else { |       } else { | ||||||
|         $e_username = null; |         $e_username = null; | ||||||
| @@ -57,8 +57,8 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|       if (!$new_email) { |       if (!$new_email) { | ||||||
|         $new_email = trim($request->getStr('email')); |         $new_email = trim($request->getStr('email')); | ||||||
|         if (!$new_email) { |         if (!$new_email) { | ||||||
|           $e_email = 'Required'; |           $e_email = pht('Required'); | ||||||
|           $errors[] = 'Email is required.'; |           $errors[] = pht('Email is required.'); | ||||||
|         } else { |         } else { | ||||||
|           $e_email = null; |           $e_email = null; | ||||||
|         } |         } | ||||||
| @@ -67,7 +67,7 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|       if ($new_email) { |       if ($new_email) { | ||||||
|         $email_ok = PhabricatorUserEmail::isAllowedAddress($new_email); |         $email_ok = PhabricatorUserEmail::isAllowedAddress($new_email); | ||||||
|         if (!$email_ok) { |         if (!$email_ok) { | ||||||
|           $e_email = 'Invalid'; |           $e_email = pht('Invalid'); | ||||||
|           $errors[] = PhabricatorUserEmail::describeAllowedAddresses(); |           $errors[] = PhabricatorUserEmail::describeAllowedAddresses(); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -75,8 +75,8 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|       if (!strlen($user->getRealName())) { |       if (!strlen($user->getRealName())) { | ||||||
|         $user->setRealName($request->getStr('realname')); |         $user->setRealName($request->getStr('realname')); | ||||||
|         if (!strlen($user->getRealName())) { |         if (!strlen($user->getRealName())) { | ||||||
|           $e_realname = 'Required'; |           $e_realname = pht('Required'); | ||||||
|           $errors[] = 'Real name is required.'; |           $errors[] = pht('Real name is required.'); | ||||||
|         } else { |         } else { | ||||||
|           $e_realname = null; |           $e_realname = null; | ||||||
|         } |         } | ||||||
| @@ -142,11 +142,11 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|             $new_email); |             $new_email); | ||||||
|  |  | ||||||
|           if ($same_username) { |           if ($same_username) { | ||||||
|             $e_username = 'Duplicate'; |             $e_username = pht('Duplicate'); | ||||||
|             $errors[] = 'That username or email is not unique.'; |             $errors[] = pht('That username or email is not unique.'); | ||||||
|           } else if ($same_email) { |           } else if ($same_email) { | ||||||
|             $e_email = 'Duplicate'; |             $e_email = pht('Duplicate'); | ||||||
|             $errors[] = 'That email is not unique.'; |             $errors[] = pht('That email is not unique.'); | ||||||
|           } else { |           } else { | ||||||
|             throw $exception; |             throw $exception; | ||||||
|           } |           } | ||||||
| @@ -157,7 +157,7 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|     $error_view = null; |     $error_view = null; | ||||||
|     if ($errors) { |     if ($errors) { | ||||||
|       $error_view = new AphrontErrorView(); |       $error_view = new AphrontErrorView(); | ||||||
|       $error_view->setTitle('Registration Failed'); |       $error_view->setTitle(pht('Registration Failed')); | ||||||
|       $error_view->setErrors($errors); |       $error_view->setErrors($errors); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -176,7 +176,7 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|       ->setAction($action_path) |       ->setAction($action_path) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|           ->setLabel('Username') |           ->setLabel(pht('Username')) | ||||||
|           ->setName('username') |           ->setName('username') | ||||||
|           ->setValue($user->getUsername()) |           ->setValue($user->getUsername()) | ||||||
|           ->setError($e_username)); |           ->setError($e_username)); | ||||||
| @@ -184,7 +184,7 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|     if ($show_email_input) { |     if ($show_email_input) { | ||||||
|       $form->appendChild( |       $form->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|           ->setLabel('Email') |           ->setLabel(pht('Email')) | ||||||
|           ->setName('email') |           ->setName('email') | ||||||
|           ->setValue($request->getStr('email')) |           ->setValue($request->getStr('email')) | ||||||
|           ->setCaption(PhabricatorUserEmail::describeAllowedAddresses()) |           ->setCaption(PhabricatorUserEmail::describeAllowedAddresses()) | ||||||
| @@ -194,7 +194,7 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|     if ($provider->retrieveUserRealName() === null) { |     if ($provider->retrieveUserRealName() === null) { | ||||||
|       $form->appendChild( |       $form->appendChild( | ||||||
|         id(new AphrontFormTextControl()) |         id(new AphrontFormTextControl()) | ||||||
|           ->setLabel('Real Name') |           ->setLabel(pht('Real Name')) | ||||||
|           ->setName('realname') |           ->setName('realname') | ||||||
|           ->setValue($request->getStr('realname')) |           ->setValue($request->getStr('realname')) | ||||||
|           ->setError($e_realname)); |           ->setError($e_realname)); | ||||||
| @@ -203,20 +203,22 @@ final class PhabricatorOAuthDefaultRegistrationController | |||||||
|     $form |     $form | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormSubmitControl()) |         id(new AphrontFormSubmitControl()) | ||||||
|           ->setValue('Create Account')); |           ->setValue(pht('Create Account'))); | ||||||
|  |  | ||||||
|     $panel = new AphrontPanelView(); |     $panel = new AphrontPanelView(); | ||||||
|     $panel->setHeader('Create New Account'); |     $panel->setHeader(pht('Create New Account')); | ||||||
|     $panel->setWidth(AphrontPanelView::WIDTH_FORM); |     $panel->setWidth(AphrontPanelView::WIDTH_FORM); | ||||||
|     $panel->appendChild($form); |     $panel->appendChild($form); | ||||||
|  |     $panel->setNoBackground(); | ||||||
|  |  | ||||||
|     return $this->buildStandardPageResponse( |     return $this->buildApplicationPage( | ||||||
|       array( |       array( | ||||||
|         $error_view, |         $error_view, | ||||||
|         $panel, |         $panel, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         'title' => 'Create New Account', |         'title' => pht('Create New Account'), | ||||||
|  |         'device' => true | ||||||
|       )); |       )); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ final class PhabricatorOAuthFailureView extends AphrontView { | |||||||
|     $diagnose = null; |     $diagnose = null; | ||||||
|  |  | ||||||
|     $view = new AphrontRequestFailureView(); |     $view = new AphrontRequestFailureView(); | ||||||
|     $view->setHeader($provider_name.' Auth Failed'); |     $view->setHeader(pht('%s Auth Failed', $provider_name)); | ||||||
|     if ($this->request) { |     if ($this->request) { | ||||||
|       $view->appendChild( |       $view->appendChild( | ||||||
|         hsprintf( |         hsprintf( | ||||||
| @@ -79,7 +79,7 @@ final class PhabricatorOAuthFailureView extends AphrontView { | |||||||
|     $view->appendChild( |     $view->appendChild( | ||||||
|       '<div class="aphront-failure-continue">'. |       '<div class="aphront-failure-continue">'. | ||||||
|         $diagnose. |         $diagnose. | ||||||
|         '<a href="/login/" class="button">Continue</a>'. |         '<a href="/login/" class="button">'.pht('Continue').'</a>'. | ||||||
|       '</div>'); |       '</div>'); | ||||||
|  |  | ||||||
|     return $view->render(); |     return $view->render(); | ||||||
|   | |||||||
| @@ -84,7 +84,6 @@ final class PhabricatorConfigAllController | |||||||
|     $nav->appendChild($panel); |     $nav->appendChild($panel); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     return $this->buildApplicationPage( |     return $this->buildApplicationPage( | ||||||
|       $nav, |       $nav, | ||||||
|       array( |       array( | ||||||
|   | |||||||
| @@ -72,6 +72,7 @@ final class PhabricatorConfigGroupController | |||||||
|     $engine->process(); |     $engine->process(); | ||||||
|  |  | ||||||
|     $list = new PhabricatorObjectItemListView(); |     $list = new PhabricatorObjectItemListView(); | ||||||
|  |     $list->setStackable(); | ||||||
|     foreach ($options as $option) { |     foreach ($options as $option) { | ||||||
|       $summary = $engine->getOutput($option, 'summary'); |       $summary = $engine->getOutput($option, 'summary'); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ final class PhabricatorConfigIssueListController | |||||||
|   private function buildIssueList(array $issues) { |   private function buildIssueList(array $issues) { | ||||||
|     assert_instances_of($issues, 'PhabricatorSetupIssue'); |     assert_instances_of($issues, 'PhabricatorSetupIssue'); | ||||||
|     $list = new PhabricatorObjectItemListView(); |     $list = new PhabricatorObjectItemListView(); | ||||||
|  |     $list->setStackable(); | ||||||
|  |  | ||||||
|     foreach ($issues as $issue) { |     foreach ($issues as $issue) { | ||||||
|       $href = $this->getApplicationURI('/issue/'.$issue->getIssueKey().'/'); |       $href = $this->getApplicationURI('/issue/'.$issue->getIssueKey().'/'); | ||||||
|   | |||||||
| @@ -46,6 +46,7 @@ final class PhabricatorConfigListController | |||||||
|     assert_instances_of($groups, 'PhabricatorApplicationConfigOptions'); |     assert_instances_of($groups, 'PhabricatorApplicationConfigOptions'); | ||||||
|  |  | ||||||
|     $list = new PhabricatorObjectItemListView(); |     $list = new PhabricatorObjectItemListView(); | ||||||
|  |     $list->setStackable(); | ||||||
|     $groups = msort($groups, 'getName'); |     $groups = msort($groups, 'getName'); | ||||||
|     foreach ($groups as $group) { |     foreach ($groups as $group) { | ||||||
|       $item = id(new PhabricatorObjectItemView()) |       $item = id(new PhabricatorObjectItemView()) | ||||||
|   | |||||||
| @@ -235,6 +235,13 @@ EODOC | |||||||
|           pht( |           pht( | ||||||
|             'Controls whether Phabricator sends email "From" users.')) |             'Controls whether Phabricator sends email "From" users.')) | ||||||
|         ->setDescription($send_as_user_desc), |         ->setDescription($send_as_user_desc), | ||||||
|  |       $this->newOption( | ||||||
|  |         'metamta.reply-handler-domain', | ||||||
|  |         'string', | ||||||
|  |         'phabricator.example.com') | ||||||
|  |         ->setDescription(pht( | ||||||
|  |           'Domain used for reply email addresses. Some applications can '. | ||||||
|  |           'configure this domain.')), | ||||||
|       $this->newOption('metamta.reply.show-hints', 'bool', true) |       $this->newOption('metamta.reply.show-hints', 'bool', true) | ||||||
|         ->setBoolOptions( |         ->setBoolOptions( | ||||||
|           array( |           array( | ||||||
|   | |||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | final class ConpherenceConfigOptions | ||||||
|  |   extends PhabricatorApplicationConfigOptions { | ||||||
|  |  | ||||||
|  |   public function getName() { | ||||||
|  |     return pht('Copherence'); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getDescription() { | ||||||
|  |     return pht('Configure Conpherence messaging.'); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getOptions() { | ||||||
|  |     return array( | ||||||
|  |       $this->newOption( | ||||||
|  |         'metamta.conpherence.subject-prefix', | ||||||
|  |         'string', | ||||||
|  |         '[Conpherence]') | ||||||
|  |         ->setDescription(pht('Subject prefix for Conpherence mail.')), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -65,9 +65,8 @@ abstract class ConpherenceController extends PhabricatorController { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     $unread_status = ConpherenceParticipationStatus::BEHIND; |     $unread_status = ConpherenceParticipationStatus::BEHIND; | ||||||
|     $unread_participant_query = id(new ConpherenceParticipantQuery()) |     $unread = id(new ConpherenceParticipantQuery()) | ||||||
|       ->withParticipantPHIDs(array($user->getPHID())); |       ->withParticipantPHIDs(array($user->getPHID())) | ||||||
|     $unread = $unread_participant_query |  | ||||||
|       ->withParticipationStatus($unread_status) |       ->withParticipationStatus($unread_status) | ||||||
|       ->execute(); |       ->execute(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,11 +41,7 @@ final class ConpherenceListController extends | |||||||
|       } |       } | ||||||
|       $this->setSelectedConpherencePHID($conpherence->getPHID()); |       $this->setSelectedConpherencePHID($conpherence->getPHID()); | ||||||
|  |  | ||||||
|       $read_status =  ConpherenceParticipationStatus::UP_TO_DATE; |  | ||||||
|       $participant = $conpherence->getParticipant($user->getPHID()); |       $participant = $conpherence->getParticipant($user->getPHID()); | ||||||
|       $write_guard = AphrontWriteGuard::beginScopedUnguardedWrites(); |  | ||||||
|       $participant->markUpToDate(); |  | ||||||
|       unset($write_guard); |  | ||||||
|       $current_selection_epoch = $participant->getDateTouched(); |       $current_selection_epoch = $participant->getDateTouched(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -60,6 +60,11 @@ final class ConpherenceNewController extends ConpherenceController { | |||||||
|         $xactions[] = id(new ConpherenceTransaction()) |         $xactions[] = id(new ConpherenceTransaction()) | ||||||
|           ->setTransactionType(ConpherenceTransactionType::TYPE_PARTICIPANTS) |           ->setTransactionType(ConpherenceTransactionType::TYPE_PARTICIPANTS) | ||||||
|           ->setNewValue(array('+' => $participants)); |           ->setNewValue(array('+' => $participants)); | ||||||
|  |         if ($files) { | ||||||
|  |           $xactions[] = id(new ConpherenceTransaction()) | ||||||
|  |             ->setTransactionType(ConpherenceTransactionType::TYPE_FILES) | ||||||
|  |             ->setNewValue(array('+' => mpull($files, 'getPHID'))); | ||||||
|  |         } | ||||||
|         $xactions[] = id(new ConpherenceTransaction()) |         $xactions[] = id(new ConpherenceTransaction()) | ||||||
|           ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) |           ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) | ||||||
|           ->attachComment( |           ->attachComment( | ||||||
| @@ -67,11 +72,6 @@ final class ConpherenceNewController extends ConpherenceController { | |||||||
|             ->setContent($message) |             ->setContent($message) | ||||||
|             ->setConpherencePHID($conpherence->getPHID()) |             ->setConpherencePHID($conpherence->getPHID()) | ||||||
|           ); |           ); | ||||||
|         if ($files) { |  | ||||||
|           $xactions[] = id(new ConpherenceTransaction()) |  | ||||||
|             ->setTransactionType(ConpherenceTransactionType::TYPE_FILES) |  | ||||||
|             ->setNewValue(array('+' => mpull($files, 'getPHID'))); |  | ||||||
|         } |  | ||||||
|         $content_source = PhabricatorContentSource::newForSource( |         $content_source = PhabricatorContentSource::newForSource( | ||||||
|           PhabricatorContentSource::SOURCE_WEB, |           PhabricatorContentSource::SOURCE_WEB, | ||||||
|           array( |           array( | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ final class ConpherenceUpdateController extends | |||||||
|  |  | ||||||
|     $updated = false; |     $updated = false; | ||||||
|     $error_view = null; |     $error_view = null; | ||||||
|     $e_image = null; |     $e_file = array(); | ||||||
|     $errors = array(); |     $errors = array(); | ||||||
|     if ($request->isFormPost()) { |     if ($request->isFormPost()) { | ||||||
|       $content_source = PhabricatorContentSource::newForSource( |       $content_source = PhabricatorContentSource::newForSource( | ||||||
| @@ -43,41 +43,21 @@ final class ConpherenceUpdateController extends | |||||||
|         array( |         array( | ||||||
|           'ip' => $request->getRemoteAddr() |           'ip' => $request->getRemoteAddr() | ||||||
|         )); |         )); | ||||||
|  |       $editor = id(new ConpherenceEditor()) | ||||||
|  |         ->setContentSource($content_source) | ||||||
|  |         ->setActor($user); | ||||||
|  |  | ||||||
|       $action = $request->getStr('action'); |       $action = $request->getStr('action'); | ||||||
|       switch ($action) { |       switch ($action) { | ||||||
|         case 'message': |         case 'message': | ||||||
|           $message = $request->getStr('text'); |           $message = $request->getStr('text'); | ||||||
|           $files = array(); |           $xactions = $editor->generateTransactionsFromText( | ||||||
|           $file_phids = |             $conpherence, | ||||||
|             PhabricatorMarkupEngine::extractFilePHIDsFromEmbeddedFiles( |             $message | ||||||
|               array($message) |  | ||||||
|             ); |  | ||||||
|           if ($file_phids) { |  | ||||||
|             $files = id(new PhabricatorFileQuery()) |  | ||||||
|               ->setViewer($user) |  | ||||||
|               ->withPHIDs($file_phids) |  | ||||||
|               ->execute(); |  | ||||||
|           } |  | ||||||
|           $xactions = array(); |  | ||||||
|           if ($files) { |  | ||||||
|             $xactions[] = id(new ConpherenceTransaction()) |  | ||||||
|               ->setTransactionType(ConpherenceTransactionType::TYPE_FILES) |  | ||||||
|               ->setNewValue(array('+' => mpull($files, 'getPHID'))); |  | ||||||
|           } |  | ||||||
|           $xactions[] = id(new ConpherenceTransaction()) |  | ||||||
|             ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) |  | ||||||
|             ->attachComment( |  | ||||||
|               id(new ConpherenceTransactionComment()) |  | ||||||
|               ->setContent($message) |  | ||||||
|               ->setConpherencePHID($conpherence->getPHID()) |  | ||||||
|           ); |           ); | ||||||
|           $time = time(); |           $time = time(); | ||||||
|           $conpherence->openTransaction(); |           $conpherence->openTransaction(); | ||||||
|           $xactions = id(new ConpherenceEditor()) |           $xactions = $editor->applyTransactions($conpherence, $xactions); | ||||||
|             ->setContentSource($content_source) |  | ||||||
|             ->setActor($user) |  | ||||||
|             ->applyTransactions($conpherence, $xactions); |  | ||||||
|           $last_xaction = end($xactions); |           $last_xaction = end($xactions); | ||||||
|           $xaction_phid = $last_xaction->getPHID(); |           $xaction_phid = $last_xaction->getPHID(); | ||||||
|           $behind = ConpherenceParticipationStatus::BEHIND; |           $behind = ConpherenceParticipationStatus::BEHIND; | ||||||
| @@ -100,20 +80,14 @@ final class ConpherenceUpdateController extends | |||||||
|           break; |           break; | ||||||
|         case 'metadata': |         case 'metadata': | ||||||
|           $xactions = array(); |           $xactions = array(); | ||||||
|           $default_image = $request->getExists('default_image'); |           $images = $request->getArr('image'); | ||||||
|           if ($default_image) { |           if ($images) { | ||||||
|             $image_phid = null; |             // just take the first one | ||||||
|             $xactions[] = id(new ConpherenceTransaction()) |             $file_phid = reset($images); | ||||||
|               ->setTransactionType(ConpherenceTransactionType::TYPE_PICTURE) |             $file = id(new PhabricatorFileQuery()) | ||||||
|               ->setNewValue($image_phid); |               ->setViewer($user) | ||||||
|           } else if (!empty($_FILES['image'])) { |               ->withPHIDs(array($file_phid)) | ||||||
|             $err = idx($_FILES['image'], 'error'); |               ->executeOne(); | ||||||
|             if ($err != UPLOAD_ERR_NO_FILE) { |  | ||||||
|               $file = PhabricatorFile::newFromPHPUpload( |  | ||||||
|                 $_FILES['image'], |  | ||||||
|                 array( |  | ||||||
|                   'authorPHID' => $user->getPHID(), |  | ||||||
|                 )); |  | ||||||
|             $okay = $file->isTransformableImage(); |             $okay = $file->isTransformableImage(); | ||||||
|             if ($okay) { |             if ($okay) { | ||||||
|               $xformer = new PhabricatorImageTransformer(); |               $xformer = new PhabricatorImageTransformer(); | ||||||
| @@ -126,13 +100,12 @@ final class ConpherenceUpdateController extends | |||||||
|                 ->setTransactionType(ConpherenceTransactionType::TYPE_PICTURE) |                 ->setTransactionType(ConpherenceTransactionType::TYPE_PICTURE) | ||||||
|                 ->setNewValue($image_phid); |                 ->setNewValue($image_phid); | ||||||
|             } else { |             } else { | ||||||
|                 $e_image = pht('Not Supported'); |               $e_file[] = $file; | ||||||
|               $errors[] = |               $errors[] = | ||||||
|                 pht('This server only supports these image formats: %s.', |                 pht('This server only supports these image formats: %s.', | ||||||
|                   implode(', ', $supported_formats)); |                   implode(', ', $supported_formats)); | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|           } |  | ||||||
|           $title = $request->getStr('title'); |           $title = $request->getStr('title'); | ||||||
|           if ($title != $conpherence->getTitle()) { |           if ($title != $conpherence->getTitle()) { | ||||||
|             $xactions[] = id(new ConpherenceTransaction()) |             $xactions[] = id(new ConpherenceTransaction()) | ||||||
| @@ -142,9 +115,7 @@ final class ConpherenceUpdateController extends | |||||||
|  |  | ||||||
|           if ($xactions) { |           if ($xactions) { | ||||||
|             $conpherence->openTransaction(); |             $conpherence->openTransaction(); | ||||||
|             $xactions = id(new ConpherenceEditor()) |             $xactions = $editor | ||||||
|               ->setContentSource($content_source) |  | ||||||
|               ->setActor($user) |  | ||||||
|               ->setContinueOnNoEffect(true) |               ->setContinueOnNoEffect(true) | ||||||
|               ->applyTransactions($conpherence, $xactions); |               ->applyTransactions($conpherence, $xactions); | ||||||
|             $updated = $conpherence->saveTransaction(); |             $updated = $conpherence->saveTransaction(); | ||||||
| @@ -169,6 +140,7 @@ final class ConpherenceUpdateController extends | |||||||
|     if ($errors) { |     if ($errors) { | ||||||
|       $error_view = id(new AphrontErrorView()) |       $error_view = id(new AphrontErrorView()) | ||||||
|         ->setTitle(pht('Errors editing conpherence.')) |         ->setTitle(pht('Errors editing conpherence.')) | ||||||
|  |         ->setInsideDialogue(true) | ||||||
|         ->setErrors($errors); |         ->setErrors($errors); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -190,29 +162,26 @@ final class ConpherenceUpdateController extends | |||||||
|         ) |         ) | ||||||
|       ) |       ) | ||||||
|       ->appendChild( |       ->appendChild( | ||||||
|         id(new AphrontFormImageControl()) |         id(new AphrontFormDragAndDropUploadControl()) | ||||||
|         ->setLabel(pht('Change Image')) |         ->setLabel(pht('Change Image')) | ||||||
|         ->setName('image') |         ->setName('image') | ||||||
|  |         ->setValue($e_file) | ||||||
|         ->setCaption('Supported formats: '.implode(', ', $supported_formats)) |         ->setCaption('Supported formats: '.implode(', ', $supported_formats)) | ||||||
|         ->setError($e_image) |  | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|     // TODO -- fix javelin so we can upload files from a workflow |  | ||||||
|     require_celerity_resource('conpherence-update-css'); |     require_celerity_resource('conpherence-update-css'); | ||||||
|     return $this->buildStandardPageResponse( |     return id(new AphrontDialogResponse()) | ||||||
|       array( |       ->setDialog( | ||||||
|         $error_view, |  | ||||||
|         id(new AphrontDialogView()) |         id(new AphrontDialogView()) | ||||||
|         ->setUser($user) |         ->setUser($user) | ||||||
|         ->setTitle(pht('Update Conpherence')) |         ->setTitle(pht('Update Conpherence')) | ||||||
|         ->setWidth(AphrontDialogView::WIDTH_FORM) |         ->setWidth(AphrontDialogView::WIDTH_FORM) | ||||||
|         ->setSubmitURI($this->getApplicationURI('update/'.$conpherence_id.'/')) |         ->setSubmitURI($this->getApplicationURI('update/'.$conpherence_id.'/')) | ||||||
|         ->addHiddenInput('action', 'metadata') |         ->addHiddenInput('action', 'metadata') | ||||||
|  |         ->appendChild($error_view) | ||||||
|         ->appendChild($form) |         ->appendChild($form) | ||||||
|         ->addSubmitButton() |         ->addSubmitButton() | ||||||
|         ->addCancelButton($this->getApplicationURI($conpherence->getID().'/')), |         ->addCancelButton($this->getApplicationURI($conpherence->getID().'/')) | ||||||
|       ), |  | ||||||
|       array() |  | ||||||
|       ); |       ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -49,8 +49,10 @@ final class ConpherenceViewController extends | |||||||
|     $this->setConpherence($conpherence); |     $this->setConpherence($conpherence); | ||||||
|  |  | ||||||
|     $participant = $conpherence->getParticipant($user->getPHID()); |     $participant = $conpherence->getParticipant($user->getPHID()); | ||||||
|  |     $transactions = $conpherence->getTransactions(); | ||||||
|  |     $latest_transaction = end($transactions); | ||||||
|     $write_guard = AphrontWriteGuard::beginScopedUnguardedWrites(); |     $write_guard = AphrontWriteGuard::beginScopedUnguardedWrites(); | ||||||
|     $participant->markUpToDate(); |     $participant->markUpToDate($latest_transaction); | ||||||
|     unset($write_guard); |     unset($write_guard); | ||||||
|  |  | ||||||
|     $header = $this->renderHeaderPaneContent(); |     $header = $this->renderHeaderPaneContent(); | ||||||
| @@ -69,13 +71,14 @@ final class ConpherenceViewController extends | |||||||
|     $edit_href = $this->getApplicationURI('update/'.$conpherence->getID().'/'); |     $edit_href = $this->getApplicationURI('update/'.$conpherence->getID().'/'); | ||||||
|  |  | ||||||
|     $header = |     $header = | ||||||
|     phutil_render_tag( |     javelin_render_tag( | ||||||
|       'a', |       'a', | ||||||
|       array( |       array( | ||||||
|         'class' => 'edit', |         'class' => 'edit', | ||||||
|         'href' => $edit_href, |         'href' => $edit_href, | ||||||
|  |         'sigil' => 'workflow', | ||||||
|       ), |       ), | ||||||
|       pht('edit...') |       '' | ||||||
|     ). |     ). | ||||||
|     phutil_render_tag( |     phutil_render_tag( | ||||||
|       'div', |       'div', | ||||||
| @@ -112,6 +115,9 @@ final class ConpherenceViewController extends | |||||||
|  |  | ||||||
|     $transactions = $conpherence->getTransactions(); |     $transactions = $conpherence->getTransactions(); | ||||||
|     foreach ($transactions as $transaction) { |     foreach ($transactions as $transaction) { | ||||||
|  |       if ($transaction->shouldHide()) { | ||||||
|  |         continue; | ||||||
|  |       } | ||||||
|       $rendered_transactions[] = id(new ConpherenceTransactionView()) |       $rendered_transactions[] = id(new ConpherenceTransactionView()) | ||||||
|         ->setUser($user) |         ->setUser($user) | ||||||
|         ->setConpherenceTransaction($transaction) |         ->setConpherenceTransaction($transaction) | ||||||
|   | |||||||
| @@ -5,6 +5,42 @@ | |||||||
|  */ |  */ | ||||||
| final class ConpherenceEditor extends PhabricatorApplicationTransactionEditor { | final class ConpherenceEditor extends PhabricatorApplicationTransactionEditor { | ||||||
|  |  | ||||||
|  |   public function generateTransactionsFromText( | ||||||
|  |     ConpherenceThread $conpherence, | ||||||
|  |     $text) { | ||||||
|  |  | ||||||
|  |     $files = array(); | ||||||
|  |     $file_phids = | ||||||
|  |       PhabricatorMarkupEngine::extractFilePHIDsFromEmbeddedFiles( | ||||||
|  |         array($text) | ||||||
|  |       ); | ||||||
|  |     // Since these are extracted from text, we might be re-including the | ||||||
|  |     // same file -- e.g. a mock under discussion. Filter files we | ||||||
|  |     // already have. | ||||||
|  |     $existing_file_phids = $conpherence->getFilePHIDs(); | ||||||
|  |     $file_phids = array_diff($file_phids, $existing_file_phids); | ||||||
|  |     if ($file_phids) { | ||||||
|  |       $files = id(new PhabricatorFileQuery()) | ||||||
|  |         ->setViewer($this->getActor()) | ||||||
|  |         ->withPHIDs($file_phids) | ||||||
|  |         ->execute(); | ||||||
|  |     } | ||||||
|  |     $xactions = array(); | ||||||
|  |     if ($files) { | ||||||
|  |       $xactions[] = id(new ConpherenceTransaction()) | ||||||
|  |         ->setTransactionType(ConpherenceTransactionType::TYPE_FILES) | ||||||
|  |         ->setNewValue(array('+' => mpull($files, 'getPHID'))); | ||||||
|  |     } | ||||||
|  |     $xactions[] = id(new ConpherenceTransaction()) | ||||||
|  |       ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) | ||||||
|  |       ->attachComment( | ||||||
|  |         id(new ConpherenceTransactionComment()) | ||||||
|  |         ->setContent($text) | ||||||
|  |         ->setConpherencePHID($conpherence->getPHID()) | ||||||
|  |       ); | ||||||
|  |     return $xactions; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public function getTransactionTypes() { |   public function getTransactionTypes() { | ||||||
|     $types = parent::getTransactionTypes(); |     $types = parent::getTransactionTypes(); | ||||||
|  |  | ||||||
| @@ -120,33 +156,40 @@ final class ConpherenceEditor extends PhabricatorApplicationTransactionEditor { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   protected function supportsMail() { |   protected function supportsMail() { | ||||||
|     return false; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* TODO |  | ||||||
|  |  | ||||||
|   protected function buildReplyHandler(PhabricatorLiskDAO $object) { |   protected function buildReplyHandler(PhabricatorLiskDAO $object) { | ||||||
|     return id(new ConpherenceReplyHandler()) |     return id(new ConpherenceReplyHandler()) | ||||||
|  |       ->setActor($this->getActor()) | ||||||
|       ->setMailReceiver($object); |       ->setMailReceiver($object); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   protected function buildMailTemplate(PhabricatorLiskDAO $object) { |   protected function buildMailTemplate(PhabricatorLiskDAO $object) { | ||||||
|     $id = $object->getID(); |     $id = $object->getID(); | ||||||
|     $title = $object->getTitle(); |     $title = $object->getTitle(); | ||||||
|  |     if (!$title) { | ||||||
|  |       $title = pht( | ||||||
|  |         '%s sent you a message.', | ||||||
|  |         $this->getActor()->getUserName() | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|     $phid = $object->getPHID(); |     $phid = $object->getPHID(); | ||||||
|     $original_name = $object->getOriginalName(); |  | ||||||
|  |  | ||||||
|     return id(new PhabricatorMetaMTAMail()) |     return id(new PhabricatorMetaMTAMail()) | ||||||
|       ->setSubject("C{$id}: {$title}") |       ->setSubject("E{$id}: {$title}") | ||||||
|       ->addHeader('Thread-Topic', "C{$id}: {$phid}"); |       ->addHeader('Thread-Topic', "E{$id}: {$phid}"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   protected function getMailTo(PhabricatorLiskDAO $object) { |   protected function getMailTo(PhabricatorLiskDAO $object) { | ||||||
|     $participants = $object->getParticipants(); |     $participants = $object->getParticipants(); | ||||||
|     $participants[$this->requireActor()->getPHID()] = true; |  | ||||||
|     return array_keys($participants); |     return array_keys($participants); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   protected function getMailCC(PhabricatorLiskDAO $object) { | ||||||
|  |     return array(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   protected function buildMailBody( |   protected function buildMailBody( | ||||||
|     PhabricatorLiskDAO $object, |     PhabricatorLiskDAO $object, | ||||||
|     array $xactions) { |     array $xactions) { | ||||||
| @@ -162,7 +205,6 @@ final class ConpherenceEditor extends PhabricatorApplicationTransactionEditor { | |||||||
|   protected function getMailSubjectPrefix() { |   protected function getMailSubjectPrefix() { | ||||||
|     return PhabricatorEnv::getEnvConfig('metamta.conpherence.subject-prefix'); |     return PhabricatorEnv::getEnvConfig('metamta.conpherence.subject-prefix'); | ||||||
|   } |   } | ||||||
|    */ |  | ||||||
|  |  | ||||||
|   protected function supportsFeed() { |   protected function supportsFeed() { | ||||||
|     return false; |     return false; | ||||||
|   | |||||||
| @@ -0,0 +1,80 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @group conpherence | ||||||
|  |  */ | ||||||
|  | final class ConpherenceReplyHandler extends PhabricatorMailReplyHandler { | ||||||
|  |  | ||||||
|  |   public function validateMailReceiver($mail_receiver) { | ||||||
|  |     if (!($mail_receiver instanceof ConpherenceThread)) { | ||||||
|  |       throw new Exception("Mail receiver is not a ConpherenceThread!"); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getPrivateReplyHandlerEmailAddress( | ||||||
|  |     PhabricatorObjectHandle $handle) { | ||||||
|  |     return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'E'); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getPublicReplyHandlerEmailAddress() { | ||||||
|  |     return $this->getDefaultPublicReplyHandlerEmailAddress('E'); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getReplyHandlerInstructions() { | ||||||
|  |     if ($this->supportsReplies()) { | ||||||
|  |       return pht('Reply to comment and attach files.'); | ||||||
|  |     } else { | ||||||
|  |       return null; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { | ||||||
|  |     $conpherence = $this->getMailReceiver(); | ||||||
|  |     $user = $this->getActor(); | ||||||
|  |     if (!$conpherence->getPHID()) { | ||||||
|  |       $conpherence | ||||||
|  |         ->attachParticipants(array()) | ||||||
|  |         ->attachFilePHIDs(array()); | ||||||
|  |     } else { | ||||||
|  |       $edge_type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_FILE; | ||||||
|  |       $file_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( | ||||||
|  |         $conpherence->getPHID(), | ||||||
|  |         $edge_type | ||||||
|  |       ); | ||||||
|  |       $conpherence->attachFilePHIDs($file_phids); | ||||||
|  |       $participants = id(new ConpherenceParticipant()) | ||||||
|  |         ->loadAllWhere('conpherencePHID = %s', $conpherence->getPHID()); | ||||||
|  |       $participants = mpull($participants, null, 'getParticipantPHID'); | ||||||
|  |       $conpherence->attachParticipants($participants); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $content_source = PhabricatorContentSource::newForSource( | ||||||
|  |       PhabricatorContentSource::SOURCE_EMAIL, | ||||||
|  |       array( | ||||||
|  |         'id' => $mail->getID(), | ||||||
|  |       )); | ||||||
|  |  | ||||||
|  |     $editor = id(new ConpherenceEditor()) | ||||||
|  |       ->setActor($user) | ||||||
|  |       ->setContentSource($content_source) | ||||||
|  |       ->setParentMessageID($mail->getMessageID()); | ||||||
|  |  | ||||||
|  |     $body = $mail->getCleanTextBody(); | ||||||
|  |     $body = trim($body); | ||||||
|  |     $file_phids = $mail->getAttachments(); | ||||||
|  |     $body = $this->enhanceBodyWithAttachments( | ||||||
|  |       $body, | ||||||
|  |       $file_phids, | ||||||
|  |       '{F%d}' | ||||||
|  |     ); | ||||||
|  |     $xactions = $editor->generateTransactionsFromText( | ||||||
|  |       $conpherence, | ||||||
|  |       $body | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     $editor->applyTransactions($conpherence, $xactions); | ||||||
|  |  | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -11,9 +11,10 @@ final class ConpherenceParticipant extends ConpherenceDAO { | |||||||
|   protected $behindTransactionPHID; |   protected $behindTransactionPHID; | ||||||
|   protected $dateTouched; |   protected $dateTouched; | ||||||
|  |  | ||||||
|   public function markUpToDate() { |   public function markUpToDate(ConpherenceTransaction $xaction) { | ||||||
|     if (!$this->isUpToDate()) { |     if (!$this->isUpToDate()) { | ||||||
|       $this->setParticipationStatus(ConpherenceParticipationStatus::UP_TO_DATE); |       $this->setParticipationStatus(ConpherenceParticipationStatus::UP_TO_DATE); | ||||||
|  |       $this->setBehindTransactionPHID($xaction->getPHID()); | ||||||
|       $this->save(); |       $this->save(); | ||||||
|     } |     } | ||||||
|     return $this; |     return $this; | ||||||
|   | |||||||
| @@ -189,15 +189,18 @@ final class ConpherenceThread extends ConpherenceDAO | |||||||
|           } |           } | ||||||
|           // fallthrough intentionally here |           // fallthrough intentionally here | ||||||
|         case ConpherenceTransactionType::TYPE_FILES: |         case ConpherenceTransactionType::TYPE_FILES: | ||||||
|         default: |           if ($behind_transaction_phid) { | ||||||
|           if ($behind_transaction_phid && |  | ||||||
|             $transaction->getPHID() != $behind_transaction_phid) { |  | ||||||
|             $unread_count++; |             $unread_count++; | ||||||
|  |             if ($transaction->getPHID() == $behind_transaction_phid) { | ||||||
|  |               break 2; | ||||||
|  |             } | ||||||
|           } |           } | ||||||
|           if ($unread_count > $max_count) { |           if ($unread_count > $max_count) { | ||||||
|             break 2; |             break 2; | ||||||
|           } |           } | ||||||
|           break; |           break; | ||||||
|  |         default: | ||||||
|  |           continue 2; | ||||||
|       } |       } | ||||||
|       if ($snippet && !$behind_transaction_phid) { |       if ($snippet && !$behind_transaction_phid) { | ||||||
|         break; |         break; | ||||||
|   | |||||||
| @@ -29,8 +29,9 @@ final class ConpherenceTransaction extends PhabricatorApplicationTransaction { | |||||||
|         return ($old === null); |         return ($old === null); | ||||||
|       case ConpherenceTransactionType::TYPE_TITLE: |       case ConpherenceTransactionType::TYPE_TITLE: | ||||||
|       case ConpherenceTransactionType::TYPE_PICTURE: |       case ConpherenceTransactionType::TYPE_PICTURE: | ||||||
|       case ConpherenceTransactionType::TYPE_FILES: |  | ||||||
|         return false; |         return false; | ||||||
|  |       case ConpherenceTransactionType::TYPE_FILES: | ||||||
|  |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return parent::shouldHide(); |     return parent::shouldHide(); | ||||||
|   | |||||||
| @@ -109,7 +109,7 @@ final class DifferentialCommentEditor extends PhabricatorEditor { | |||||||
|     $revision->loadRelationships(); |     $revision->loadRelationships(); | ||||||
|     $reviewer_phids = $revision->getReviewers(); |     $reviewer_phids = $revision->getReviewers(); | ||||||
|     if ($reviewer_phids) { |     if ($reviewer_phids) { | ||||||
|       $reviewer_phids = array_combine($reviewer_phids, $reviewer_phids); |       $reviewer_phids = array_fuse($reviewer_phids); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $metadata = array(); |     $metadata = array(); | ||||||
|   | |||||||
| @@ -36,9 +36,9 @@ final class PhabricatorMacroListController | |||||||
|     if ($has_search) { |     if ($has_search) { | ||||||
|       $macros = queryfx_all( |       $macros = queryfx_all( | ||||||
|         $conn, |         $conn, | ||||||
|         'SELECT m.* |         'SELECT m.* FROM  %Q WHERE %Q', | ||||||
|           FROM '.implode(' JOIN ', $join).' |         implode(' JOIN ', $join), | ||||||
|           WHERE '.implode(' AND ', $where)); |         implode(' AND ', $where)); | ||||||
|       $macros = $macro_table->loadAllFromArray($macros); |       $macros = $macro_table->loadAllFromArray($macros); | ||||||
|       $nodata = pht('There are no macros matching the filter.'); |       $nodata = pht('There are no macros matching the filter.'); | ||||||
|     } else { |     } else { | ||||||
| @@ -65,7 +65,7 @@ final class PhabricatorMacroListController | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if ($authors) { |     if ($authors) { | ||||||
|       $author_phids = array_combine($authors, $authors); |       $author_phids = array_fuse($authors); | ||||||
|     } else { |     } else { | ||||||
|       $author_phids = array(); |       $author_phids = array(); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -28,6 +28,12 @@ final class PhabricatorMetaMTAReceiveController | |||||||
|         array( |         array( | ||||||
|           'text' => $request->getStr('body'), |           'text' => $request->getStr('body'), | ||||||
|         )); |         )); | ||||||
|  |  | ||||||
|  |       // Make up some unique value, since this column isn't nullable. | ||||||
|  |       $received->setMessageIDHash( | ||||||
|  |         PhabricatorHash::digestForIndex( | ||||||
|  |           Filesystem::readRandomBytes(12))); | ||||||
|  |  | ||||||
|       $received->save(); |       $received->save(); | ||||||
|  |  | ||||||
|       $received->processReceivedMail(); |       $received->processReceivedMail(); | ||||||
|   | |||||||
| @@ -39,6 +39,8 @@ final class PhabricatorMetaMTASendGridReceiveController | |||||||
|       'text' => $request->getStr('text'), |       'text' => $request->getStr('text'), | ||||||
|       'html' => $request->getStr('from'), |       'html' => $request->getStr('from'), | ||||||
|     )); |     )); | ||||||
|  |     $received->setMessageIDHash( | ||||||
|  |       PhabricatorHash::digestForIndex($received->getMessageID())); | ||||||
|  |  | ||||||
|     $file_phids = array(); |     $file_phids = array(); | ||||||
|     foreach ($_FILES as $file_raw) { |     foreach ($_FILES as $file_raw) { | ||||||
|   | |||||||
| @@ -37,7 +37,11 @@ abstract class PhabricatorMailReplyHandler { | |||||||
|   abstract public function validateMailReceiver($mail_receiver); |   abstract public function validateMailReceiver($mail_receiver); | ||||||
|   abstract public function getPrivateReplyHandlerEmailAddress( |   abstract public function getPrivateReplyHandlerEmailAddress( | ||||||
|     PhabricatorObjectHandle $handle); |     PhabricatorObjectHandle $handle); | ||||||
|   abstract public function getReplyHandlerDomain(); |   public function getReplyHandlerDomain() { | ||||||
|  |     return PhabricatorEnv::getEnvConfig( | ||||||
|  |       'metamta.reply-handler-domain' | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|   abstract public function getReplyHandlerInstructions(); |   abstract public function getReplyHandlerInstructions(); | ||||||
|   abstract protected function receiveEmail( |   abstract protected function receiveEmail( | ||||||
|     PhabricatorMetaMTAReceivedMail $mail); |     PhabricatorMetaMTAReceivedMail $mail); | ||||||
| @@ -291,8 +295,10 @@ EOBODY; | |||||||
|     return $this->getSingleReplyHandlerPrefix($address); |     return $this->getSingleReplyHandlerPrefix($address); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   final protected function enhanceBodyWithAttachments($body, |   final protected function enhanceBodyWithAttachments( | ||||||
|                                                       array $attachments) { |     $body, | ||||||
|  |     array $attachments, | ||||||
|  |     $format = '- {F%d, layout=link}') { | ||||||
|     if (!$attachments) { |     if (!$attachments) { | ||||||
|       return $body; |       return $body; | ||||||
|     } |     } | ||||||
| @@ -306,7 +312,7 @@ EOBODY; | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     foreach ($files as $file) { |     foreach ($files as $file) { | ||||||
|       $file_str = sprintf('- {F%d, layout=link}', $file->getID()); |       $file_str = sprintf($format, $file->getID()); | ||||||
|       $body .= $file_str."\n"; |       $body .= $file_str."\n"; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -804,7 +804,7 @@ final class PhabricatorMetaMTAMail extends PhabricatorMetaMTADAO { | |||||||
|       return array(); |       return array(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $phids = array_combine($phids, $phids); |     $phids = array_fuse($phids); | ||||||
|  |  | ||||||
|  |  | ||||||
|     // Exclude PHIDs explicitly marked for exclusion. We use this to prevent |     // Exclude PHIDs explicitly marked for exclusion. We use this to prevent | ||||||
|   | |||||||
| @@ -93,7 +93,7 @@ final class PhabricatorMetaMTAReceivedMail extends PhabricatorMetaMTADAO { | |||||||
|     $prefixPattern = ($single_handle_prefix) |     $prefixPattern = ($single_handle_prefix) | ||||||
|       ? preg_quote($single_handle_prefix, '/') . '\+' |       ? preg_quote($single_handle_prefix, '/') . '\+' | ||||||
|       : ''; |       : ''; | ||||||
|     $pattern = "/^{$prefixPattern}((?:D|T|C)\d+)\+([\w]+)\+([a-f0-9]{16})@/U"; |     $pattern = "/^{$prefixPattern}((?:D|T|C|E)\d+)\+([\w]+)\+([a-f0-9]{16})@/U"; | ||||||
|  |  | ||||||
|     $phabricator_address = null; |     $phabricator_address = null; | ||||||
|     $receiver_name       = null; |     $receiver_name       = null; | ||||||
| @@ -276,10 +276,7 @@ final class PhabricatorMetaMTAReceivedMail extends PhabricatorMetaMTADAO { | |||||||
|  |  | ||||||
|     $expect_hash = self::computeMailHash($receiver->getMailKey(), $check_phid); |     $expect_hash = self::computeMailHash($receiver->getMailKey(), $check_phid); | ||||||
|  |  | ||||||
|     // See note at computeOldMailHash(). |     if ($expect_hash != $hash) { | ||||||
|     $old_hash = self::computeOldMailHash($receiver->getMailKey(), $check_phid); |  | ||||||
|  |  | ||||||
|     if ($expect_hash != $hash && $old_hash != $hash) { |  | ||||||
|       return $this->setMessage("Invalid mail hash!")->save(); |       return $this->setMessage("Invalid mail hash!")->save(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -292,6 +289,9 @@ final class PhabricatorMetaMTAReceivedMail extends PhabricatorMetaMTADAO { | |||||||
|     } else if ($receiver instanceof PhabricatorRepositoryCommit) { |     } else if ($receiver instanceof PhabricatorRepositoryCommit) { | ||||||
|       $handler = PhabricatorAuditCommentEditor::newReplyHandlerForCommit( |       $handler = PhabricatorAuditCommentEditor::newReplyHandlerForCommit( | ||||||
|         $receiver); |         $receiver); | ||||||
|  |     } else if ($receiver instanceof ConpherenceThread) { | ||||||
|  |       $handler = id(new ConpherenceReplyHandler()) | ||||||
|  |         ->setMailReceiver($receiver); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $handler->setActor($user); |     $handler->setActor($user); | ||||||
| @@ -334,6 +334,9 @@ final class PhabricatorMetaMTAReceivedMail extends PhabricatorMetaMTADAO { | |||||||
|       case 'C': |       case 'C': | ||||||
|         $class_obj = new PhabricatorRepositoryCommit(); |         $class_obj = new PhabricatorRepositoryCommit(); | ||||||
|         break; |         break; | ||||||
|  |       case 'E': | ||||||
|  |         $class_obj = new ConpherenceThread(); | ||||||
|  |         break; | ||||||
|       default: |       default: | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
| @@ -348,20 +351,6 @@ final class PhabricatorMetaMTAReceivedMail extends PhabricatorMetaMTADAO { | |||||||
|     return substr($hash, 0, 16); |     return substr($hash, 0, 16); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public static function computeOldMailHash($mail_key, $phid) { |  | ||||||
|  |  | ||||||
|     // TODO: Remove this method entirely in a couple of months. We've moved from |  | ||||||
|     // plain sha1 to sha1+hmac to make the codebase more auditable for good uses |  | ||||||
|     // of hash functions, but still accept the old hashes on email replies to |  | ||||||
|     // avoid breaking things. Once we've been sending only hmac hashes for a |  | ||||||
|     // while, remove this and start rejecting old hashes. See T547. |  | ||||||
|  |  | ||||||
|     $global_mail_key = PhabricatorEnv::getEnvConfig('phabricator.mail-key'); |  | ||||||
|  |  | ||||||
|     $hash = sha1($mail_key.$global_mail_key.$phid); |  | ||||||
|     return substr($hash, 0, 16); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Strip an email address down to the actual user@domain.tld part if |    * Strip an email address down to the actual user@domain.tld part if | ||||||
|    * necessary, since sometimes it will have formatting like |    * necessary, since sometimes it will have formatting like | ||||||
|   | |||||||
| @@ -388,7 +388,7 @@ final class PhabricatorObjectHandleData { | |||||||
|             if (empty($entries[$phid])) { |             if (empty($entries[$phid])) { | ||||||
|               $handle->setName('Unknown Config Entry'); |               $handle->setName('Unknown Config Entry'); | ||||||
|             } else { |             } else { | ||||||
|               $entry = $entry[$phid]; |               $entry = $entries[$phid]; | ||||||
|               $handle->setName($entry->getKey()); |               $handle->setName($entry->getKey()); | ||||||
|               $handle->setURI('/config/edit/'.$entry->getKey()); |               $handle->setURI('/config/edit/'.$entry->getKey()); | ||||||
|               $handle->setFullName($entry->getKey()); |               $handle->setFullName($entry->getKey()); | ||||||
|   | |||||||
| @@ -16,7 +16,8 @@ final class PholioMockListController extends PholioController { | |||||||
|     $user = $request->getUser(); |     $user = $request->getUser(); | ||||||
|  |  | ||||||
|     $query = id(new PholioMockQuery()) |     $query = id(new PholioMockQuery()) | ||||||
|       ->setViewer($user); |       ->setViewer($user) | ||||||
|  |       ->needCoverFiles(true); | ||||||
|  |  | ||||||
|     $nav = $this->buildSideNav(); |     $nav = $this->buildSideNav(); | ||||||
|     $filter = $nav->selectFilter('view/'.$this->view, 'view/all'); |     $filter = $nav->selectFilter('view/'.$this->view, 'view/all'); | ||||||
| @@ -38,7 +39,8 @@ final class PholioMockListController extends PholioController { | |||||||
|       $board->addItem( |       $board->addItem( | ||||||
|         id(new PhabricatorPinboardItemView()) |         id(new PhabricatorPinboardItemView()) | ||||||
|           ->setHeader($mock->getName()) |           ->setHeader($mock->getName()) | ||||||
|           ->setURI('/M'.$mock->getID())); |           ->setURI('/M'.$mock->getID()) | ||||||
|  |           ->setImageURI($mock->getCoverFile()->getThumb160x120URI())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $header = id(new PhabricatorHeaderView()) |     $header = id(new PhabricatorHeaderView()) | ||||||
|   | |||||||
| @@ -18,6 +18,8 @@ final class PholioMockViewController extends PholioController { | |||||||
|     $mock = id(new PholioMockQuery()) |     $mock = id(new PholioMockQuery()) | ||||||
|       ->setViewer($user) |       ->setViewer($user) | ||||||
|       ->withIDs(array($this->id)) |       ->withIDs(array($this->id)) | ||||||
|  |       ->needImages(true) | ||||||
|  |       ->needCoverFiles(true) | ||||||
|       ->executeOne(); |       ->executeOne(); | ||||||
|  |  | ||||||
|     if (!$mock) { |     if (!$mock) { | ||||||
|   | |||||||
| @@ -10,6 +10,9 @@ final class PholioMockQuery | |||||||
|   private $phids; |   private $phids; | ||||||
|   private $authorPHIDs; |   private $authorPHIDs; | ||||||
|  |  | ||||||
|  |   private $needCoverFiles; | ||||||
|  |   private $needImages; | ||||||
|  |  | ||||||
|   public function withIDs(array $ids) { |   public function withIDs(array $ids) { | ||||||
|     $this->ids = $ids; |     $this->ids = $ids; | ||||||
|     return $this; |     return $this; | ||||||
| @@ -37,7 +40,17 @@ final class PholioMockQuery | |||||||
|       $this->buildOrderClause($conn_r), |       $this->buildOrderClause($conn_r), | ||||||
|       $this->buildLimitClause($conn_r)); |       $this->buildLimitClause($conn_r)); | ||||||
|  |  | ||||||
|     return $table->loadAllFromArray($data); |     $mocks = $table->loadAllFromArray($data); | ||||||
|  |  | ||||||
|  |     if ($mocks && $this->needImages) { | ||||||
|  |       $this->loadImages($mocks); | ||||||
|  |     } | ||||||
|  |     if ($mocks && $this->needCoverFiles) { | ||||||
|  |       $this->loadCoverFiles($mocks); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     return $mocks; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private function buildWhereClause(AphrontDatabaseConnection $conn_r) { |   private function buildWhereClause(AphrontDatabaseConnection $conn_r) { | ||||||
| @@ -69,4 +82,49 @@ final class PholioMockQuery | |||||||
|     return $this->formatWhereClause($where); |     return $this->formatWhereClause($where); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public function needCoverFiles($need_cover_files) { | ||||||
|  |     $this->needCoverFiles = $need_cover_files; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function needImages($need_images) { | ||||||
|  |     $this->needImages = $need_images; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function loadImages(array $mocks) { | ||||||
|  |     assert_instances_of($mocks, 'PholioMock'); | ||||||
|  |  | ||||||
|  |     $mock_ids = mpull($mocks, 'getID'); | ||||||
|  |     $all_images = id(new PholioImage())->loadAllWhere( | ||||||
|  |       'mockID IN (%Ld)', | ||||||
|  |       $mock_ids); | ||||||
|  |  | ||||||
|  |     $file_phids = mpull($all_images, 'getFilePHID'); | ||||||
|  |     $all_files = mpull(id(new PhabricatorFile())->loadAllWhere( | ||||||
|  |       'phid IN (%Ls)', | ||||||
|  |       $file_phids), null, 'getPHID'); | ||||||
|  |  | ||||||
|  |     foreach ($all_images as $image) { | ||||||
|  |       $image->attachFile($all_files[$image->getFilePHID()]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $image_groups = mgroup($all_images, 'getMockID'); | ||||||
|  |  | ||||||
|  |     foreach ($mocks as $mock) { | ||||||
|  |       $mock->attachImages($image_groups[$mock->getID()]); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function loadCoverFiles(array $mocks) { | ||||||
|  |     assert_instances_of($mocks, 'PholioMock'); | ||||||
|  |     $cover_file_phids = mpull($mocks, 'getCoverPHID'); | ||||||
|  |     $cover_files = mpull(id(new PhabricatorFile())->loadAllWhere( | ||||||
|  |       'phid IN (%Ls)', | ||||||
|  |       $cover_file_phids), null, 'getPHID'); | ||||||
|  |  | ||||||
|  |     foreach ($mocks as $mock) { | ||||||
|  |       $mock->attachCoverFile($cover_files[$mock->getCoverPHID()]); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ final class PholioImage extends PholioDAO | |||||||
|   protected $description = ''; |   protected $description = ''; | ||||||
|   protected $sequence; |   protected $sequence; | ||||||
|  |  | ||||||
|  |   private $file; | ||||||
|  |  | ||||||
| /* -(  PhabricatorMarkupInterface  )----------------------------------------- */ | /* -(  PhabricatorMarkupInterface  )----------------------------------------- */ | ||||||
|  |  | ||||||
| @@ -39,4 +40,16 @@ final class PholioImage extends PholioDAO | |||||||
|     return (bool)$this->getID(); |     return (bool)$this->getID(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public function attachFile(PhabricatorFile $file) { | ||||||
|  |     $this->file = $file; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getFile() { | ||||||
|  |     if ($this->file === null) { | ||||||
|  |       throw new Exception("Call attachFile() before getFile()!"); | ||||||
|  |     } | ||||||
|  |     return $this->file; | ||||||
|  |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,6 +20,9 @@ final class PholioMock extends PholioDAO | |||||||
|   protected $coverPHID; |   protected $coverPHID; | ||||||
|   protected $mailKey; |   protected $mailKey; | ||||||
|  |  | ||||||
|  |   private $images; | ||||||
|  |   private $coverFile; | ||||||
|  |  | ||||||
|   public function getConfiguration() { |   public function getConfiguration() { | ||||||
|     return array( |     return array( | ||||||
|       self::CONFIG_AUX_PHID => true, |       self::CONFIG_AUX_PHID => true, | ||||||
| @@ -37,6 +40,31 @@ final class PholioMock extends PholioDAO | |||||||
|     return parent::save(); |     return parent::save(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public function attachImages(array $images) { | ||||||
|  |     assert_instances_of($images, 'PholioImage'); | ||||||
|  |     $this->images = $images; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getImages() { | ||||||
|  |     if ($this->images === null) { | ||||||
|  |       throw new Exception("Call attachImages() before getImages()!"); | ||||||
|  |     } | ||||||
|  |     return $this->images; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function attachCoverFile(PhabricatorFile $file) { | ||||||
|  |     $this->coverFile = $file; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public function getCoverFile() { | ||||||
|  |     if ($this->coverFile === null) { | ||||||
|  |       throw new Exception("Call attachCoverFile() before getCoverFile()!"); | ||||||
|  |     } | ||||||
|  |     return $this->coverFile; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -(  PhabricatorSubscribableInterface Implementation  )-------------------- */ | /* -(  PhabricatorSubscribableInterface Implementation  )-------------------- */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,13 +13,7 @@ final class PholioMockImagesView extends AphrontView { | |||||||
|       throw new Exception("Call setMock() before render()!"); |       throw new Exception("Call setMock() before render()!"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $image = id(new PholioImage())->loadOneWhere( |     $file = head($this->mock->getImages())->getFile(); | ||||||
|       "mockid=%d", |  | ||||||
|       $this->mock->getID()); |  | ||||||
|  |  | ||||||
|     $file = id(new PhabricatorFile())->loadOneWhere( |  | ||||||
|       "phid=%s", |  | ||||||
|       $image->getFilePHID()); |  | ||||||
|  |  | ||||||
|     $image_tag = phutil_tag( |     $image_tag = phutil_tag( | ||||||
|       'img', |       'img', | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ final class PhortuneMonthYearExpiryControl extends AphrontFormControl { | |||||||
|  |  | ||||||
|     $current_year = $this->getCurrentYear(); |     $current_year = $this->getCurrentYear(); | ||||||
|     $years = range($current_year, $current_year + 20); |     $years = range($current_year, $current_year + 20); | ||||||
|     $years = array_combine($years, $years); |     $years = array_fuse($years); | ||||||
|  |  | ||||||
|     if ($this->getMonthInputValue()) { |     if ($this->getMonthInputValue()) { | ||||||
|       $selected_month = $this->getMonthInputValue(); |       $selected_month = $this->getMonthInputValue(); | ||||||
|   | |||||||
| @@ -215,15 +215,26 @@ final class PhrictionDocumentController | |||||||
|  |  | ||||||
|     $slug = PhabricatorSlug::normalize($this->slug); |     $slug = PhabricatorSlug::normalize($this->slug); | ||||||
|  |  | ||||||
|     return id(new PhabricatorActionListView()) |     $action_view = id(new PhabricatorActionListView()) | ||||||
|       ->setUser($user) |       ->setUser($user) | ||||||
|       ->setObject($document) |       ->setObject($document) | ||||||
|       ->addAction( |       ->addAction( | ||||||
|         id(new PhabricatorActionView()) |         id(new PhabricatorActionView()) | ||||||
|           ->setName(pht('Edit Document')) |           ->setName(pht('Edit Document')) | ||||||
|           ->setIcon('edit') |           ->setIcon('edit') | ||||||
|           ->setHref('/phriction/edit/'.$document->getID().'/')) |           ->setHref('/phriction/edit/'.$document->getID().'/')); | ||||||
|       ->addAction( |  | ||||||
|  |     if ($document->getStatus() == PhrictionDocumentStatus::STATUS_EXISTS) { | ||||||
|  |       $action_view->addAction( | ||||||
|  |         id(new PhabricatorActionView()) | ||||||
|  |           ->setName(pht('Delete Document')) | ||||||
|  |           ->setIcon('delete') | ||||||
|  |           ->setHref('/phriction/delete/'.$document->getID().'/') | ||||||
|  |           ->setWorkflow(true)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return | ||||||
|  |       $action_view->addAction( | ||||||
|         id(new PhabricatorActionView()) |         id(new PhabricatorActionView()) | ||||||
|         ->setName(pht('View History')) |         ->setName(pht('View History')) | ||||||
|         ->setIcon('history') |         ->setIcon('history') | ||||||
|   | |||||||
| @@ -154,19 +154,9 @@ final class PhrictionEditController | |||||||
|         ->setErrors($errors); |         ->setErrors($errors); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     $delete_button = null; |  | ||||||
|     if ($document->getID()) { |     if ($document->getID()) { | ||||||
|       $panel_header = 'Edit Phriction Document'; |       $panel_header = 'Edit Phriction Document'; | ||||||
|       $submit_button = 'Save Changes'; |       $submit_button = 'Save Changes'; | ||||||
|       if ($document->getStatus() != PhrictionDocumentStatus::STATUS_DELETED) { |  | ||||||
|         $delete_button = phutil_tag( |  | ||||||
|           'a', |  | ||||||
|           array( |  | ||||||
|             'href' => '/phriction/delete/'.$document->getID().'/', |  | ||||||
|             'class' => 'grey button', |  | ||||||
|           ), |  | ||||||
|           'Delete Document'); |  | ||||||
|       } |  | ||||||
|     } else { |     } else { | ||||||
|       $panel_header = 'Create New Phriction Document'; |       $panel_header = 'Create New Phriction Document'; | ||||||
|       $submit_button = 'Create Document'; |       $submit_button = 'Create Document'; | ||||||
| @@ -240,10 +230,6 @@ final class PhrictionEditController | |||||||
|       ->setHeader($panel_header) |       ->setHeader($panel_header) | ||||||
|       ->appendChild($form); |       ->appendChild($form); | ||||||
|  |  | ||||||
|     if ($delete_button) { |  | ||||||
|       $panel->addButton($delete_button); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     $preview_panel = |     $preview_panel = | ||||||
|       '<div class="aphront-panel-preview aphront-panel-preview-wide"> |       '<div class="aphront-panel-preview aphront-panel-preview-wide"> | ||||||
|         <div class="phriction-document-preview-header"> |         <div class="phriction-document-preview-header"> | ||||||
|   | |||||||
| @@ -62,7 +62,7 @@ final class PhabricatorSettingsPanelAccount | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     $timezone_ids = DateTimeZone::listIdentifiers(); |     $timezone_ids = DateTimeZone::listIdentifiers(); | ||||||
|     $timezone_id_map = array_combine($timezone_ids, $timezone_ids); |     $timezone_id_map = array_fuse($timezone_ids); | ||||||
|  |  | ||||||
|     $form = new AphrontFormView(); |     $form = new AphrontFormView(); | ||||||
|     $form |     $form | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ abstract class PhabricatorApplicationTransactionEditor | |||||||
|   private $isNewObject; |   private $isNewObject; | ||||||
|   private $mentionedPHIDs; |   private $mentionedPHIDs; | ||||||
|   private $continueOnNoEffect; |   private $continueOnNoEffect; | ||||||
|  |   private $parentMessageID; | ||||||
|  |  | ||||||
|   private $isPreview; |   private $isPreview; | ||||||
|  |  | ||||||
| @@ -40,6 +41,18 @@ abstract class PhabricatorApplicationTransactionEditor | |||||||
|     return $this->continueOnNoEffect; |     return $this->continueOnNoEffect; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Not strictly necessary, but reply handlers ideally set this value to | ||||||
|  |    * make email threading work better. | ||||||
|  |    */ | ||||||
|  |   public function setParentMessageID($parent_message_id) { | ||||||
|  |     $this->parentMessageID = $parent_message_id; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |   public function getParentMessageID() { | ||||||
|  |     return $this->parentMessageID; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   protected function getIsNewObject() { |   protected function getIsNewObject() { | ||||||
|     return $this->isNewObject; |     return $this->isNewObject; | ||||||
|   } |   } | ||||||
| @@ -509,7 +522,7 @@ abstract class PhabricatorApplicationTransactionEditor | |||||||
|   protected function getPHIDTransactionNewValue( |   protected function getPHIDTransactionNewValue( | ||||||
|     PhabricatorApplicationTransaction $xaction) { |     PhabricatorApplicationTransaction $xaction) { | ||||||
|  |  | ||||||
|     $old = array_combine($xaction->getOldValue(), $xaction->getOldValue()); |     $old = array_fuse($xaction->getOldValue()); | ||||||
|  |  | ||||||
|     $new = $xaction->getNewValue(); |     $new = $xaction->getNewValue(); | ||||||
|     $new_add = idx($new, '+', array()); |     $new_add = idx($new, '+', array()); | ||||||
| @@ -518,7 +531,7 @@ abstract class PhabricatorApplicationTransactionEditor | |||||||
|     unset($new['-']); |     unset($new['-']); | ||||||
|     $new_set = idx($new, '=', null); |     $new_set = idx($new, '=', null); | ||||||
|     if ($new_set !== null) { |     if ($new_set !== null) { | ||||||
|       $new_set = array_combine($new_set, $new_set); |       $new_set = array_fuse($new_set); | ||||||
|     } |     } | ||||||
|     unset($new['=']); |     unset($new['=']); | ||||||
|  |  | ||||||
| @@ -669,8 +682,9 @@ abstract class PhabricatorApplicationTransactionEditor | |||||||
|       ->setIsBulk(true) |       ->setIsBulk(true) | ||||||
|       ->setBody($body->render()); |       ->setBody($body->render()); | ||||||
|  |  | ||||||
|     // TODO |     if ($this->getParentMessageID()) { | ||||||
|     //  ->setParentMessageID(...) |       $template->setParentMessageID($this->getParentMessageID()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     $mails = $this |     $mails = $this | ||||||
|       ->buildReplyHandler($object) |       ->buildReplyHandler($object) | ||||||
|   | |||||||
| @@ -151,7 +151,7 @@ such as PHID columns. Otherwise, use `COLLATE utf8_general_ci`. | |||||||
|  - Name all indexes so it is possible to delete them later. |  - Name all indexes so it is possible to delete them later. | ||||||
| # Edit `src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php` and | # Edit `src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php` and | ||||||
| add your patch to @{method@phabricator:PhabricatorBuiltinPatchList::getPatches}. | add your patch to @{method@phabricator:PhabricatorBuiltinPatchList::getPatches}. | ||||||
| # Run `bin/storage/upgrade`. | # Run `bin/storage upgrade`. | ||||||
|  |  | ||||||
| It is also possible to create more complex patches in PHP for data migration | It is also possible to create more complex patches in PHP for data migration | ||||||
| (due to schema changes or otherwise.) However, the schema changes themselves | (due to schema changes or otherwise.) However, the schema changes themselves | ||||||
|   | |||||||
| @@ -91,19 +91,21 @@ involved but may be easier in some deployment environments. Note that this needs | |||||||
| to be set in your webserver environment, and also in your shell whenever you | to be set in your webserver environment, and also in your shell whenever you | ||||||
| run a script: | run a script: | ||||||
|  |  | ||||||
|   # Shell | ``` | ||||||
|   export PHABRICATOR_ENV=custom/exampleconfig | # Shell | ||||||
|  | export PHABRICATOR_ENV=custom/exampleconfig | ||||||
|  |  | ||||||
|   # Apache | # Apache | ||||||
|   SetEnv PHABRICATOR_ENV custom/exampleconfig | SetEnv PHABRICATOR_ENV custom/exampleconfig | ||||||
|  |  | ||||||
|   # nginx | # nginx | ||||||
|   fastcgi_param PHABRICATOR_ENV "custom/exampleconfig"; | fastcgi_param PHABRICATOR_ENV "custom/exampleconfig"; | ||||||
|  |  | ||||||
|   # lighttpd | # lighttpd | ||||||
|   setenv.add-environment = ( | setenv.add-environment = ( | ||||||
|    "PHABRICATOR_ENV" => "custom/exampleconfig", |    "PHABRICATOR_ENV" => "custom/exampleconfig", | ||||||
|   ) | ) | ||||||
|  | ``` | ||||||
|  |  | ||||||
| After creating and selecting a configuration file, restart your webserver. Any | After creating and selecting a configuration file, restart your webserver. Any | ||||||
| configuration you set should take effect immediately, and your file should be | configuration you set should take effect immediately, and your file should be | ||||||
|   | |||||||
| @@ -87,16 +87,6 @@ final class CeleritySpriteGenerator { | |||||||
|     $sprites = array(); |     $sprites = array(); | ||||||
|  |  | ||||||
|     $sources = array( |     $sources = array( | ||||||
|       'round_bubble' => array( |  | ||||||
|         'x' => 26, |  | ||||||
|         'y' => 26, |  | ||||||
|         'css' => '.phabricator-main-menu-alert-bubble' |  | ||||||
|       ), |  | ||||||
|       'bubble' => array( |  | ||||||
|         'x' => 46, |  | ||||||
|         'y' => 26, |  | ||||||
|         'css' => '.phabricator-main-menu-alert-bubble.alert-unread' |  | ||||||
|       ), |  | ||||||
|       'seen_read_all' => array( |       'seen_read_all' => array( | ||||||
|         'x' => 14, |         'x' => 14, | ||||||
|         'y' => 14, |         'y' => 14, | ||||||
| @@ -135,6 +125,25 @@ final class CeleritySpriteGenerator { | |||||||
|         'y' => 25, |         'y' => 25, | ||||||
|         'css' => '.phabricator-main-menu-logo-image', |         'css' => '.phabricator-main-menu-logo-image', | ||||||
|       ), |       ), | ||||||
|  |       'conf-off' => array( | ||||||
|  |         'x' => 14, | ||||||
|  |         'y' => 14, | ||||||
|  |         'css' => | ||||||
|  |           '.alert-notifications .phabricator-main-menu-message-icon', | ||||||
|  |       ), | ||||||
|  |       'conf-hover' => array( | ||||||
|  |         'x' => 14, | ||||||
|  |         'y' => 14, | ||||||
|  |         'css' => | ||||||
|  |           '.alert-notifications:hover .phabricator-main-menu-message-icon', | ||||||
|  |       ), | ||||||
|  |       'conf-unseen' => array( | ||||||
|  |         'x' => 14, | ||||||
|  |         'y' => 14, | ||||||
|  |         'css' => | ||||||
|  |           '.alert-notifications.message-unread '. | ||||||
|  |           '.phabricator-main-menu-message-icon', | ||||||
|  |       ), | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     $scales = array( |     $scales = array( | ||||||
| @@ -183,7 +192,7 @@ final class CeleritySpriteGenerator { | |||||||
|     // Reorder the sprites so less-specific rules generate earlier in the sheet. |     // Reorder the sprites so less-specific rules generate earlier in the sheet. | ||||||
|     // Otherwise we end up with blue "a.black" buttons because the blue rules |     // Otherwise we end up with blue "a.black" buttons because the blue rules | ||||||
|     // have the same specificity but appear later. |     // have the same specificity but appear later. | ||||||
|     $gradients = array_combine($gradients, $gradients); |     $gradients = array_fuse($gradients); | ||||||
|     $gradients = array_select_keys( |     $gradients = array_select_keys( | ||||||
|       $gradients, |       $gradients, | ||||||
|       array( |       array( | ||||||
|   | |||||||
| @@ -102,7 +102,7 @@ abstract class PhabricatorWorker { | |||||||
|   final public static function waitForTasks(array $task_ids) { |   final public static function waitForTasks(array $task_ids) { | ||||||
|     $task_table = new PhabricatorWorkerActiveTask(); |     $task_table = new PhabricatorWorkerActiveTask(); | ||||||
|  |  | ||||||
|     $waiting = array_combine($task_ids, $task_ids); |     $waiting = array_fuse($task_ids); | ||||||
|     while ($waiting) { |     while ($waiting) { | ||||||
|       $conn_w = $task_table->establishConnection('w'); |       $conn_w = $task_table->establishConnection('w'); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -55,10 +55,20 @@ final class PhabricatorRemarkupRuleEmbedFile | |||||||
|       case 'full': |       case 'full': | ||||||
|         $attrs['src'] = $file->getBestURI(); |         $attrs['src'] = $file->getBestURI(); | ||||||
|         $options['image_class'] = null; |         $options['image_class'] = null; | ||||||
|  |         $file_data = $file->getMetadata(); | ||||||
|  |         $height = idx($file_data, PhabricatorFile::METADATA_IMAGE_HEIGHT); | ||||||
|  |         if ($height) { | ||||||
|  |           $attrs['height'] = $height; | ||||||
|  |         } | ||||||
|  |         $width = idx($file_data, PhabricatorFile::METADATA_IMAGE_WIDTH); | ||||||
|  |         if ($width) { | ||||||
|  |           $attrs['width'] = $width; | ||||||
|  |         } | ||||||
|         break; |         break; | ||||||
|       case 'thumb': |       case 'thumb': | ||||||
|       default: |       default: | ||||||
|         $attrs['src'] = $file->getPreview220URI(); |         $attrs['src'] = $file->getPreview220URI(); | ||||||
|  |         $attrs['width'] = '220'; | ||||||
|         $options['image_class'] = 'phabricator-remarkup-embed-image'; |         $options['image_class'] = 'phabricator-remarkup-embed-image'; | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -29,10 +29,20 @@ final class PhabricatorRemarkupRuleImageMacro | |||||||
|       $phid = $this->images[$matches[1]]; |       $phid = $this->images[$matches[1]]; | ||||||
|  |  | ||||||
|       $file = id(new PhabricatorFile())->loadOneWhere('phid = %s', $phid); |       $file = id(new PhabricatorFile())->loadOneWhere('phid = %s', $phid); | ||||||
|  |       $style = null; | ||||||
|  |       $src_uri = null; | ||||||
|       if ($file) { |       if ($file) { | ||||||
|         $src_uri = $file->getBestURI(); |         $src_uri = $file->getBestURI(); | ||||||
|       } else { |         $file_data = $file->getMetadata(); | ||||||
|         $src_uri = null; |         $height = idx($file_data,PhabricatorFile::METADATA_IMAGE_HEIGHT); | ||||||
|  |         $width = idx($file_data, PhabricatorFile::METADATA_IMAGE_WIDTH); | ||||||
|  |         if ($height && $width) { | ||||||
|  |           $style = sprintf( | ||||||
|  |             'height: %dpx; width: %dpx;', | ||||||
|  |             $height, | ||||||
|  |             $width | ||||||
|  |           ); | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       $img = phutil_tag( |       $img = phutil_tag( | ||||||
| @@ -41,6 +51,7 @@ final class PhabricatorRemarkupRuleImageMacro | |||||||
|           'src'   => $src_uri, |           'src'   => $src_uri, | ||||||
|           'alt'   => $matches[1], |           'alt'   => $matches[1], | ||||||
|           'title' => $matches[1], |           'title' => $matches[1], | ||||||
|  |           'style' => $style, | ||||||
|         )); |         )); | ||||||
|       return $this->getEngine()->storeText($img); |       return $this->getEngine()->storeText($img); | ||||||
|     } else { |     } else { | ||||||
|   | |||||||
| @@ -1093,6 +1093,10 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList { | |||||||
|         'type'    => 'sql', |         'type'    => 'sql', | ||||||
|         'name'    => $this->getPatchPath('20130111.conpherence.sql'), |         'name'    => $this->getPatchPath('20130111.conpherence.sql'), | ||||||
|       ), |       ), | ||||||
|  |       '20130127.altheraldtranscript.sql' => array( | ||||||
|  |         'type'    => 'sql', | ||||||
|  |         'name'    => $this->getPatchPath('20130127.altheraldtranscript.sql'), | ||||||
|  |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,6 +11,15 @@ final class AphrontErrorView extends AphrontView { | |||||||
|   private $errors; |   private $errors; | ||||||
|   private $severity; |   private $severity; | ||||||
|   private $id; |   private $id; | ||||||
|  |   private $insideDialogue; | ||||||
|  |  | ||||||
|  |   public function setInsideDialogue($inside_dialogue) { | ||||||
|  |     $this->insideDialogue = $inside_dialogue; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |   public function getInsideDialogue() { | ||||||
|  |     return $this->insideDialogue; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public function setTitle($title) { |   public function setTitle($title) { | ||||||
|     $this->title = $title; |     $this->title = $title; | ||||||
| @@ -32,6 +41,15 @@ final class AphrontErrorView extends AphrontView { | |||||||
|     return $this; |     return $this; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   private function getBaseClass() { | ||||||
|  |     if ($this->getInsideDialogue()) { | ||||||
|  |       $class = 'aphront-error-view-dialogue'; | ||||||
|  |     } else { | ||||||
|  |       $class = 'aphront-error-view'; | ||||||
|  |     } | ||||||
|  |     return $class; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   final public function render() { |   final public function render() { | ||||||
|  |  | ||||||
|     require_celerity_resource('aphront-error-view-css'); |     require_celerity_resource('aphront-error-view-css'); | ||||||
| @@ -69,15 +87,16 @@ final class AphrontErrorView extends AphrontView { | |||||||
|  |  | ||||||
|     $this->severity = nonempty($this->severity, self::SEVERITY_ERROR); |     $this->severity = nonempty($this->severity, self::SEVERITY_ERROR); | ||||||
|  |  | ||||||
|     $more_classes = array(); |     $classes = array(); | ||||||
|     $more_classes[] = 'aphront-error-severity-'.$this->severity; |     $classes[] = $this->getBaseClass(); | ||||||
|     $more_classes = implode(' ', $more_classes); |     $classes[] = 'aphront-error-severity-'.$this->severity; | ||||||
|  |     $classes = implode(' ', $classes); | ||||||
|  |  | ||||||
|     return phutil_render_tag( |     return phutil_render_tag( | ||||||
|       'div', |       'div', | ||||||
|       array( |       array( | ||||||
|         'id' => $this->id, |         'id' => $this->id, | ||||||
|         'class' => 'aphront-error-view '.$more_classes, |         'class' => $classes, | ||||||
|       ), |       ), | ||||||
|       array( |       array( | ||||||
|         $title, |         $title, | ||||||
|   | |||||||
| @@ -181,7 +181,7 @@ final class AphrontFormDateControl extends AphrontFormControl { | |||||||
|     $max_year = $this->getMaxYear(); |     $max_year = $this->getMaxYear(); | ||||||
|  |  | ||||||
|     $days = range(1, 31); |     $days = range(1, 31); | ||||||
|     $days = array_combine($days, $days); |     $days = array_fuse($days); | ||||||
|  |  | ||||||
|     $months = array( |     $months = array( | ||||||
|       1 => 'Jan', |       1 => 'Jan', | ||||||
| @@ -199,7 +199,7 @@ final class AphrontFormDateControl extends AphrontFormControl { | |||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     $years = range($this->getMinYear(), $this->getMaxYear()); |     $years = range($this->getMinYear(), $this->getMaxYear()); | ||||||
|     $years = array_combine($years, $years); |     $years = array_fuse($years); | ||||||
|  |  | ||||||
|     $days_sel = AphrontFormSelectControl::renderSelectTag( |     $days_sel = AphrontFormSelectControl::renderSelectTag( | ||||||
|       $this->getDayInputValue(), |       $this->getDayInputValue(), | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ final class PhabricatorObjectItemListView extends AphrontView { | |||||||
|   private $header; |   private $header; | ||||||
|   private $items; |   private $items; | ||||||
|   private $pager; |   private $pager; | ||||||
|  |   private $stackable; | ||||||
|   private $noDataString; |   private $noDataString; | ||||||
|  |  | ||||||
|   public function setHeader($header) { |   public function setHeader($header) { | ||||||
| @@ -27,9 +28,15 @@ final class PhabricatorObjectItemListView extends AphrontView { | |||||||
|     return $this; |     return $this; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public function setStackable() { | ||||||
|  |     $this->stackable = true; | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public function render() { |   public function render() { | ||||||
|     require_celerity_resource('phabricator-object-item-list-view-css'); |     require_celerity_resource('phabricator-object-item-list-view-css'); | ||||||
|  |  | ||||||
|  |     $classes = array(); | ||||||
|     $header = null; |     $header = null; | ||||||
|     if (strlen($this->header)) { |     if (strlen($this->header)) { | ||||||
|       $header = phutil_tag( |       $header = phutil_tag( | ||||||
| @@ -55,10 +62,15 @@ final class PhabricatorObjectItemListView extends AphrontView { | |||||||
|       $pager = $this->renderSingleView($this->pager); |       $pager = $this->renderSingleView($this->pager); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     $classes[] = 'phabricator-object-item-list-view'; | ||||||
|  |     if ($this->stackable) { | ||||||
|  |       $classes[] = 'phabricator-object-list-stackable'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return phutil_render_tag( |     return phutil_render_tag( | ||||||
|       'div', |       'ul', | ||||||
|       array( |       array( | ||||||
|         'class' => 'phabricator-object-item-list-view', |         'class' => implode(' ', $classes), | ||||||
|       ), |       ), | ||||||
|       $header.$items.$pager); |       $header.$items.$pager); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -166,7 +166,7 @@ final class PhabricatorObjectItemView extends AphrontView { | |||||||
|       $header.$attrs.$this->renderChildren()); |       $header.$attrs.$this->renderChildren()); | ||||||
|  |  | ||||||
|     return phutil_tag( |     return phutil_tag( | ||||||
|       'div', |       'li', | ||||||
|       array( |       array( | ||||||
|         'class' => implode(' ', $classes), |         'class' => implode(' ', $classes), | ||||||
|       ), |       ), | ||||||
|   | |||||||
| @@ -292,6 +292,59 @@ final class PhabricatorMainMenuView extends AphrontView { | |||||||
|     require_celerity_resource('phabricator-notification-menu-css'); |     require_celerity_resource('phabricator-notification-menu-css'); | ||||||
|     require_celerity_resource('sprite-menu-css'); |     require_celerity_resource('sprite-menu-css'); | ||||||
|  |  | ||||||
|  |     $container_classes = array( | ||||||
|  |       'sprite-menu', | ||||||
|  |       'alert-notifications', | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     $conpherence = id(new PhabricatorApplicationConpherence())->isBeta(); | ||||||
|  |     $allow_beta = | ||||||
|  |       PhabricatorEnv::getEnvConfig('phabricator.show-beta-applications'); | ||||||
|  |     $message_tag = ''; | ||||||
|  |  | ||||||
|  |     if (!$conpherence || $allow_beta) { | ||||||
|  |       $message_id = celerity_generate_unique_node_id(); | ||||||
|  |       $message_count_id = celerity_generate_unique_node_id(); | ||||||
|  |  | ||||||
|  |       $unread_status = ConpherenceParticipationStatus::BEHIND; | ||||||
|  |       $unread = id(new ConpherenceParticipantQuery()) | ||||||
|  |         ->withParticipantPHIDs(array($user->getPHID())) | ||||||
|  |         ->withParticipationStatus($unread_status) | ||||||
|  |         ->execute(); | ||||||
|  |       $message_count_number = count($unread); | ||||||
|  |       if ($message_count_number > 999) { | ||||||
|  |         $message_count_number = "\xE2\x88\x9E"; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       $message_count_tag = phutil_render_tag( | ||||||
|  |         'span', | ||||||
|  |         array( | ||||||
|  |           'id'    => $message_count_id, | ||||||
|  |           'class' => 'phabricator-main-menu-message-count' | ||||||
|  |         ), | ||||||
|  |         phutil_escape_html($message_count_number)); | ||||||
|  |  | ||||||
|  |       $message_icon_tag = phutil_render_tag( | ||||||
|  |         'span', | ||||||
|  |         array( | ||||||
|  |           'class' => 'sprite-menu phabricator-main-menu-message-icon', | ||||||
|  |         ), | ||||||
|  |         ''); | ||||||
|  |  | ||||||
|  |       if ($message_count_number) { | ||||||
|  |         $container_classes[] = 'message-unread'; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       $message_tag = phutil_render_tag( | ||||||
|  |         'a', | ||||||
|  |         array( | ||||||
|  |           'href'  => '/conpherence/', | ||||||
|  |           'class' => implode(' ', $container_classes), | ||||||
|  |           'id'    => $message_id, | ||||||
|  |         ), | ||||||
|  |         $message_icon_tag.$message_count_tag); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     $count_id = celerity_generate_unique_node_id(); |     $count_id = celerity_generate_unique_node_id(); | ||||||
|     $dropdown_id = celerity_generate_unique_node_id(); |     $dropdown_id = celerity_generate_unique_node_id(); | ||||||
|     $bubble_id = celerity_generate_unique_node_id(); |     $bubble_id = celerity_generate_unique_node_id(); | ||||||
| @@ -318,11 +371,6 @@ final class PhabricatorMainMenuView extends AphrontView { | |||||||
|       ), |       ), | ||||||
|       ''); |       ''); | ||||||
|  |  | ||||||
|     $container_classes = array( |  | ||||||
|       'phabricator-main-menu-alert-bubble', |  | ||||||
|       'sprite-menu', |  | ||||||
|       'alert-notifications', |  | ||||||
|     ); |  | ||||||
|     if ($count_number) { |     if ($count_number) { | ||||||
|       $container_classes[] = 'alert-unread'; |       $container_classes[] = 'alert-unread'; | ||||||
|     } |     } | ||||||
| @@ -354,7 +402,8 @@ final class PhabricatorMainMenuView extends AphrontView { | |||||||
|       ), |       ), | ||||||
|       ''); |       ''); | ||||||
|  |  | ||||||
|     return array($bubble_tag, $notification_dropdown); |     return array( | ||||||
|  |       $bubble_tag.$message_tag, $notification_dropdown); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private function renderMenuIcon($name) { |   private function renderMenuIcon($name) { | ||||||
|   | |||||||
| @@ -2,12 +2,19 @@ | |||||||
|  * @provides aphront-error-view-css |  * @provides aphront-error-view-css | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| .aphront-error-view { | .aphront-error-view, | ||||||
|   margin: 20px; | .aphront-error-view-dialogue { | ||||||
|   border-style: solid; |   border-style: solid; | ||||||
|   border-width: 1px; |   border-width: 1px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .aphront-error-view { | ||||||
|  |   margin: 20px; | ||||||
|  | } | ||||||
|  | .aphront-error-view-dialogue { | ||||||
|  |   margin: 0px 0px 16px 0px; | ||||||
|  | } | ||||||
|  |  | ||||||
| .device-phone .aphront-error-view { | .device-phone .aphront-error-view { | ||||||
|   margin: 10px; |   margin: 10px; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -41,8 +41,6 @@ | |||||||
|  |  | ||||||
| .phabricator-main-menu-logo { | .phabricator-main-menu-logo { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   position: relative; |  | ||||||
|   height: 44px; |  | ||||||
|   width: 139px; |   width: 139px; | ||||||
|   margin-right: 6px; |   margin-right: 6px; | ||||||
|   padding-right: 6px; |   padding-right: 6px; | ||||||
| @@ -248,59 +246,45 @@ a:hover .phabricator-main-search-typeahead-result .result-type { | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| .device-desktop .phabricator-main-menu-alerts { |  | ||||||
|   display: inline-block; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .device .phabricator-main-menu-alerts { | .device .phabricator-main-menu-alerts { | ||||||
|   position: absolute; |   margin-left: 60px; | ||||||
|   left: 60px; |  | ||||||
|   right: 60px; |  | ||||||
|   top: 10px; |  | ||||||
|   height: 34px; |  | ||||||
|   text-align: center; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-bubble { | .phabricator-main-menu-alerts { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   position: relative; |   border-radius: 15px; | ||||||
|   width: 26px; |   background: rgba(0,0,0,.2); | ||||||
|   height: 26px; |   height: 20px; | ||||||
|   margin-bottom: 9px; |   padding: 3px 10px; | ||||||
|  |   margin-top: 9px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-bubble.alert-unread { | .phabricator-main-menu-alert-icon, | ||||||
|   width: 46px; | .phabricator-main-menu-message-icon { | ||||||
| } |  | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-icon { |  | ||||||
|   position: absolute; |  | ||||||
|   width: 14px; |   width: 14px; | ||||||
|   height: 14px; |   height: 14px; | ||||||
|   top: 5px; |   display: block; | ||||||
|   left: 6px; |   float: left; | ||||||
|  |   margin: 2px 0 0 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-count { | .alert-notifications .phabricator-main-menu-message-icon { | ||||||
|   position: absolute; |   margin: 3px 0 0 8px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .phabricator-main-menu-alert-count, | ||||||
|  | .phabricator-main-menu-message-count { | ||||||
|   font-weight: bold; |   font-weight: bold; | ||||||
|   line-height: 22px; |   line-height: 20px; | ||||||
|   top: 1px; |  | ||||||
|   right: 8px; |  | ||||||
|   left: 20px; |  | ||||||
|   color: #ffffff; |   color: #ffffff; | ||||||
|   text-align: center; |   text-align: center; | ||||||
|   display: none; |   display: none; | ||||||
|  |   float: left; | ||||||
|  |   margin-left: 3px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-item { | .alert-unread .phabricator-main-menu-alert-count, | ||||||
|   width: 26px; | .message-unread .phabricator-main-menu-message-count  { | ||||||
|   height: 26px; |  | ||||||
|   margin: 9px; |  | ||||||
|   display: block; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .alert-unread .phabricator-main-menu-alert-count { |  | ||||||
|   display: block; |   display: block; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -38,10 +38,10 @@ | |||||||
| } | } | ||||||
|  |  | ||||||
| .config-options-current-value { | .config-options-current-value { | ||||||
|   padding: 0 6px 2px; |   padding: 0 10px 8px; | ||||||
|   white-space: pre-wrap; |   white-space: pre-wrap; | ||||||
| } | } | ||||||
|  |  | ||||||
| .config-options-current-value span { | .config-options-current-value span { | ||||||
|   color: #666666; |   color: #777; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,21 +2,29 @@ | |||||||
|  * @provides conpherence-header-pane-css |  * @provides conpherence-header-pane-css | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #conpherence-main-pane { | ||||||
|  |   position: relative; | ||||||
|  | } | ||||||
|  |  | ||||||
| .conpherence-header-pane { | .conpherence-header-pane { | ||||||
|   border-bottom: 1px solid #ccc; |   border-bottom: 1px solid #ccc; | ||||||
|   background: #fff; |   background: #fff; | ||||||
|   height: 50px; |   height: 80px; | ||||||
|   width: 100%; |   width: 100%; | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-header-pane .edit { | .conpherence-header-pane .edit { | ||||||
|   position: relative; |  | ||||||
|   float: right; |   float: right; | ||||||
|   margin: 16px 16px 0px 0px; |   margin: 16px 16px 0px 0px; | ||||||
|  |   height: 50px; | ||||||
|  |   width: 50px; | ||||||
|  |   background-image: url('/rsrc/image/actions/edit.png'); | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-header-pane .header-image { | .conpherence-header-pane .header-image { | ||||||
|   position: absolute; |   position: absolute; | ||||||
|  |   top: 15px; | ||||||
|  |   left: 15px; | ||||||
|   height: 50px; |   height: 50px; | ||||||
|   width: 50px; |   width: 50px; | ||||||
| } | } | ||||||
| @@ -24,16 +32,17 @@ | |||||||
| .conpherence-header-pane .title { | .conpherence-header-pane .title { | ||||||
|   position: relative; |   position: relative; | ||||||
|   font-size: 16px; |   font-size: 16px; | ||||||
|   left: 62px; |   font-weight: bold; | ||||||
|   top: 6px; |   left: 77px; | ||||||
|  |   top: 21px; | ||||||
|   max-width: 80%; |   max-width: 80%; | ||||||
|   overflow-x: auto; |   overflow-x: auto; | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-header-pane .subtitle { | .conpherence-header-pane .subtitle { | ||||||
|   position: relative; |   position: relative; | ||||||
|   left: 62px; |   left: 77px; | ||||||
|   top: 6px; |   top: 21px; | ||||||
|   color: #bfbfbf; |   color: #bfbfbf; | ||||||
|   max-width: 80%; |   max-width: 80%; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,9 +3,12 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| .no-conpherences-menu-item { | .no-conpherences-menu-item { | ||||||
|   color: #ffffff; |   color: #a1a5a9; | ||||||
|   border-top: solid 1px #3B3D3E; |   border-top: solid 1px #3B3D3E; | ||||||
|   padding: 20px 0px 20px 66px; |   padding: 20px 0; | ||||||
|  |   margin: 0px auto; | ||||||
|  |   width: 320px; | ||||||
|  |   text-align: center; | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-menu .phabricator-nav-column-background, | .conpherence-menu .phabricator-nav-column-background, | ||||||
|   | |||||||
| @@ -15,15 +15,16 @@ | |||||||
|   position: fixed; |   position: fixed; | ||||||
|   left: 320px; |   left: 320px; | ||||||
|   right: 321px; |   right: 321px; | ||||||
|   top: 94px; |   top: 124px; | ||||||
|   bottom: 225px; |   bottom: 142px; | ||||||
|   overflow-y: auto; |   overflow-y: auto; | ||||||
|  |   box-shadow: inset 1px 5px 5px rgba(0,0,0,0.1); | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-message-pane .phabricator-form-view { | .conpherence-message-pane .phabricator-form-view { | ||||||
|   border-width: 0; |   border-width: 0; | ||||||
|   background: none; |   background: none; | ||||||
|   height: 224px; |   height: 143px; | ||||||
|   padding: 0; |   padding: 0; | ||||||
|   position: fixed; |   position: fixed; | ||||||
|   bottom: 0; |   bottom: 0; | ||||||
| @@ -46,8 +47,7 @@ | |||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-message-pane .phabricator-transaction-view { | .conpherence-message-pane .phabricator-transaction-view { | ||||||
|   margin: 1em 1.25em 1em 1.25em; |   margin: 10px 0 10px 15px; | ||||||
|   display: block; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-message-pane .phabricator-transaction-detail { | .conpherence-message-pane .phabricator-transaction-detail { | ||||||
| @@ -67,8 +67,7 @@ | |||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-message-pane .conpherence-edited .phabricator-transaction-content { | .conpherence-message-pane .conpherence-edited .phabricator-transaction-content { | ||||||
|   font-size: 12px; |   padding: 0 1em 0 1em; | ||||||
|   padding: 0em 1em 0em 1em; |  | ||||||
|   margin-top: -4px; |   margin-top: -4px; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -82,14 +81,19 @@ | |||||||
| .conpherence-message-pane .remarkup-assist-bar { | .conpherence-message-pane .remarkup-assist-bar { | ||||||
|   border-width: 1px 0 0; |   border-width: 1px 0 0; | ||||||
|   border-color: #CCC; |   border-color: #CCC; | ||||||
|  |   border-bottom: transparent; | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-message-pane .remarkup-assist-textarea { | .conpherence-message-pane .remarkup-assist-textarea { | ||||||
|   border-width: 1px 0 1px 0; |   border-width: 0 0 1px 0; | ||||||
|   border-color: #CCC; |   border-color: #e7e7e7; | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-message-pane .remarkup-assist-textarea:focus { | .conpherence-message-pane .remarkup-assist-textarea:focus { | ||||||
|   outline: none; |   outline: none; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .conpherence-message-pane .aphront-form-input textarea { | ||||||
|  |   padding: 6px; | ||||||
|  |   height: 6em; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -5,12 +5,13 @@ | |||||||
| .conpherence-widget-pane { | .conpherence-widget-pane { | ||||||
|   position: fixed; |   position: fixed; | ||||||
|   right: 0px; |   right: 0px; | ||||||
|   top: 94px; |   top: 125px; | ||||||
|   width: 320px; |   width: 320px; | ||||||
|   height: 100%; |   height: 100%; | ||||||
|   border-width: 0 0 0 1px; |   border-width: 0 0 0 1px; | ||||||
|   border-color: #CCC; |   border-color: #CCC; | ||||||
|   border-style: solid; |   border-style: solid; | ||||||
|  |   background: url('/rsrc/image/texture/dust_background.jpg'); | ||||||
| } | } | ||||||
|  |  | ||||||
| .conpherence-widget-pane .aphront-form-input { | .conpherence-widget-pane .aphront-form-input { | ||||||
|   | |||||||
| @@ -7,6 +7,10 @@ | |||||||
|   background: #f4f5f6; |   background: #f4f5f6; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .phabricator-object-item-list-view.phabricator-object-list-stackable .phabricator-object-item { | ||||||
|  |   margin: -1px 0 0 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| .device-desktop .phabricator-object-item-list-view { | .device-desktop .phabricator-object-item-list-view { | ||||||
|   padding: 20px; |   padding: 20px; | ||||||
| } | } | ||||||
| @@ -14,22 +18,27 @@ | |||||||
| .phabricator-object-item { | .phabricator-object-item { | ||||||
|   background: #ffffff; |   background: #ffffff; | ||||||
|   border-style: solid; |   border-style: solid; | ||||||
|   border-color: #d7d7d7 #e4e3e4 #bcbcbd #d7d7d7; |   border-color: #c0c5d1; | ||||||
|   border-width: 1px 1px 1px 3px; |   border-width: 1px 1px 1px 3px; | ||||||
|   margin: 3px 0; |   margin: 5px 0; | ||||||
|  |  | ||||||
|   overflow: hidden; |   overflow: hidden; | ||||||
|   box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.10); |   box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.10); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .phabricator-object-list-stackable .phabricator-object-item { | ||||||
|  |   border-width: 1px; | ||||||
|  | } | ||||||
|  |  | ||||||
| .device-desktop .phabricator-object-item { | .device-desktop .phabricator-object-item { | ||||||
|   margin: 0 0 5px 0; |   margin: 0 0 5px 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-object-item-name { | .phabricator-object-item-name { | ||||||
|   display: block; |   display: block; | ||||||
|   padding: 4px 8px 4px; |   padding: 8px 10px 2px; | ||||||
|   font-weight: bold; |   font-weight: bold; | ||||||
|  |   font-size: 14px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-object-item-content { | .phabricator-object-item-content { | ||||||
| @@ -43,13 +52,13 @@ | |||||||
| */ | */ | ||||||
|  |  | ||||||
| .phabricator-object-item-attributes { | .phabricator-object-item-attributes { | ||||||
|   padding: 0px 8px 4px; |   padding: 0px 10px 8px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-object-item-attribute { | .phabricator-object-item-attribute { | ||||||
|   display: inline; |   display: inline; | ||||||
|   color: #555555; |   color: #777; | ||||||
|   font-size: 11px; |   font-size: 13px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-object-item-attribute-spacer { | .phabricator-object-item-attribute-spacer { | ||||||
| @@ -66,7 +75,7 @@ | |||||||
|  |  | ||||||
| .phabricator-object-item-icons { | .phabricator-object-item-icons { | ||||||
|   float: right; |   float: right; | ||||||
|   padding: 2px 4px 0; |   padding: 10px 10px 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* NOTE: The main content is an "overflow: hidden" div which we give a right | /* NOTE: The main content is an "overflow: hidden" div which we give a right | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ | |||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-source-code-summary { | .phabricator-source-code-summary { | ||||||
|   margin-bottom: 4px; |   padding-bottom: 8px; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* If a Paste has enormously long lines, truncate them in the summary on the | /* If a Paste has enormously long lines, truncate them in the summary on the | ||||||
|   | |||||||
| @@ -82,546 +82,562 @@ only screen and (-webkit-min-device-pixel-ratio: 1.5) { | |||||||
|   background-position: -87px -29px; |   background-position: -87px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-countdown-light-large { | .app-conpherence-light-large { | ||||||
|   background-position: -116px -29px; |   background-position: -116px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-countdown-dark-large { | .app-conpherence-dark-large { | ||||||
|   background-position: -145px -29px; |   background-position: -145px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-countdown-blue-large, .phabricator-crumb-view:hover .app-countdown-dark-large { | .app-conpherence-blue-large, .phabricator-crumb-view:hover .app-conpherence-dark-large { | ||||||
|   background-position: -174px -29px; |   background-position: -174px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-countdown-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-countdown-light-large { | .app-conpherence-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-conpherence-light-large { | ||||||
|   background-position: -203px -29px; |   background-position: -203px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-daemon-light-large { | .app-countdown-light-large { | ||||||
|   background-position: -232px -29px; |   background-position: -232px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-daemon-dark-large { | .app-countdown-dark-large { | ||||||
|   background-position: -261px -29px; |   background-position: -261px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-daemon-blue-large, .phabricator-crumb-view:hover .app-daemon-dark-large { | .app-countdown-blue-large, .phabricator-crumb-view:hover .app-countdown-dark-large { | ||||||
|   background-position: -290px -29px; |   background-position: -290px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-daemon-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-daemon-light-large { | .app-countdown-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-countdown-light-large { | ||||||
|   background-position: -319px -29px; |   background-position: -319px -29px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-differential-light-large { | .app-daemon-light-large { | ||||||
|   background-position: 0px -58px; |   background-position: 0px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-differential-dark-large { | .app-daemon-dark-large { | ||||||
|   background-position: -29px -58px; |   background-position: -29px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-differential-blue-large, .phabricator-crumb-view:hover .app-differential-dark-large { | .app-daemon-blue-large, .phabricator-crumb-view:hover .app-daemon-dark-large { | ||||||
|   background-position: -58px -58px; |   background-position: -58px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-differential-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-differential-light-large { | .app-daemon-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-daemon-light-large { | ||||||
|   background-position: -87px -58px; |   background-position: -87px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diffusion-light-large { | .app-differential-light-large { | ||||||
|   background-position: -116px -58px; |   background-position: -116px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diffusion-dark-large { | .app-differential-dark-large { | ||||||
|   background-position: -145px -58px; |   background-position: -145px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diffusion-blue-large, .phabricator-crumb-view:hover .app-diffusion-dark-large { | .app-differential-blue-large, .phabricator-crumb-view:hover .app-differential-dark-large { | ||||||
|   background-position: -174px -58px; |   background-position: -174px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diffusion-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diffusion-light-large { | .app-differential-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-differential-light-large { | ||||||
|   background-position: -203px -58px; |   background-position: -203px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diviner-light-large { | .app-diffusion-light-large { | ||||||
|   background-position: -232px -58px; |   background-position: -232px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diviner-dark-large { | .app-diffusion-dark-large { | ||||||
|   background-position: -261px -58px; |   background-position: -261px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diviner-blue-large, .phabricator-crumb-view:hover .app-diviner-dark-large { | .app-diffusion-blue-large, .phabricator-crumb-view:hover .app-diffusion-dark-large { | ||||||
|   background-position: -290px -58px; |   background-position: -290px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diviner-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diviner-light-large { | .app-diffusion-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diffusion-light-large { | ||||||
|   background-position: -319px -58px; |   background-position: -319px -58px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-drydock-light-large { | .app-diviner-light-large { | ||||||
|   background-position: 0px -87px; |   background-position: 0px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-drydock-dark-large { | .app-diviner-dark-large { | ||||||
|   background-position: -29px -87px; |   background-position: -29px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-drydock-blue-large, .phabricator-crumb-view:hover .app-drydock-dark-large { | .app-diviner-blue-large, .phabricator-crumb-view:hover .app-diviner-dark-large { | ||||||
|   background-position: -58px -87px; |   background-position: -58px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-drydock-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-drydock-light-large { | .app-diviner-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diviner-light-large { | ||||||
|   background-position: -87px -87px; |   background-position: -87px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-fact-light-large { | .app-drydock-light-large { | ||||||
|   background-position: -116px -87px; |   background-position: -116px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-fact-dark-large { | .app-drydock-dark-large { | ||||||
|   background-position: -145px -87px; |   background-position: -145px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-fact-blue-large, .phabricator-crumb-view:hover .app-fact-dark-large { | .app-drydock-blue-large, .phabricator-crumb-view:hover .app-drydock-dark-large { | ||||||
|   background-position: -174px -87px; |   background-position: -174px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-fact-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-fact-light-large { | .app-drydock-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-drydock-light-large { | ||||||
|   background-position: -203px -87px; |   background-position: -203px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-feed-light-large { | .app-fact-light-large { | ||||||
|   background-position: -232px -87px; |   background-position: -232px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-feed-dark-large { | .app-fact-dark-large { | ||||||
|   background-position: -261px -87px; |   background-position: -261px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-feed-blue-large, .phabricator-crumb-view:hover .app-feed-dark-large { | .app-fact-blue-large, .phabricator-crumb-view:hover .app-fact-dark-large { | ||||||
|   background-position: -290px -87px; |   background-position: -290px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-feed-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-feed-light-large { | .app-fact-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-fact-light-large { | ||||||
|   background-position: -319px -87px; |   background-position: -319px -87px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-files-light-large { | .app-feed-light-large { | ||||||
|   background-position: 0px -116px; |   background-position: 0px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-files-dark-large { | .app-feed-dark-large { | ||||||
|   background-position: -29px -116px; |   background-position: -29px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-files-blue-large, .phabricator-crumb-view:hover .app-files-dark-large { | .app-feed-blue-large, .phabricator-crumb-view:hover .app-feed-dark-large { | ||||||
|   background-position: -58px -116px; |   background-position: -58px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-files-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-files-light-large { | .app-feed-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-feed-light-large { | ||||||
|   background-position: -87px -116px; |   background-position: -87px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-flags-light-large { | .app-files-light-large { | ||||||
|   background-position: -116px -116px; |   background-position: -116px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-flags-dark-large { | .app-files-dark-large { | ||||||
|   background-position: -145px -116px; |   background-position: -145px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-flags-blue-large, .phabricator-crumb-view:hover .app-flags-dark-large { | .app-files-blue-large, .phabricator-crumb-view:hover .app-files-dark-large { | ||||||
|   background-position: -174px -116px; |   background-position: -174px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-flags-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-flags-light-large { | .app-files-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-files-light-large { | ||||||
|   background-position: -203px -116px; |   background-position: -203px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-help-light-large { | .app-flags-light-large { | ||||||
|   background-position: -232px -116px; |   background-position: -232px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-help-dark-large { | .app-flags-dark-large { | ||||||
|   background-position: -261px -116px; |   background-position: -261px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-help-blue-large, .phabricator-crumb-view:hover .app-help-dark-large { | .app-flags-blue-large, .phabricator-crumb-view:hover .app-flags-dark-large { | ||||||
|   background-position: -290px -116px; |   background-position: -290px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-help-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-help-light-large { | .app-flags-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-flags-light-large { | ||||||
|   background-position: -319px -116px; |   background-position: -319px -116px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-herald-light-large { | .app-help-light-large { | ||||||
|   background-position: 0px -145px; |   background-position: 0px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-herald-dark-large { | .app-help-dark-large { | ||||||
|   background-position: -29px -145px; |   background-position: -29px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-herald-blue-large, .phabricator-crumb-view:hover .app-herald-dark-large { | .app-help-blue-large, .phabricator-crumb-view:hover .app-help-dark-large { | ||||||
|   background-position: -58px -145px; |   background-position: -58px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-herald-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-herald-light-large { | .app-help-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-help-light-large { | ||||||
|   background-position: -87px -145px; |   background-position: -87px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-home-light-large { | .app-herald-light-large { | ||||||
|   background-position: -116px -145px; |   background-position: -116px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-home-dark-large { | .app-herald-dark-large { | ||||||
|   background-position: -145px -145px; |   background-position: -145px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-home-blue-large, .phabricator-crumb-view:hover .app-home-dark-large { | .app-herald-blue-large, .phabricator-crumb-view:hover .app-herald-dark-large { | ||||||
|   background-position: -174px -145px; |   background-position: -174px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-home-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-home-light-large { | .app-herald-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-herald-light-large { | ||||||
|   background-position: -203px -145px; |   background-position: -203px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-logo-light-large { | .app-home-light-large { | ||||||
|   background-position: -232px -145px; |   background-position: -232px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-logo-dark-large { | .app-home-dark-large { | ||||||
|   background-position: -261px -145px; |   background-position: -261px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-logo-blue-large, .phabricator-crumb-view:hover .app-logo-dark-large { | .app-home-blue-large, .phabricator-crumb-view:hover .app-home-dark-large { | ||||||
|   background-position: -290px -145px; |   background-position: -290px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-logo-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-logo-light-large { | .app-home-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-home-light-large { | ||||||
|   background-position: -319px -145px; |   background-position: -319px -145px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-macro-light-large { | .app-logo-light-large { | ||||||
|   background-position: 0px -174px; |   background-position: 0px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-macro-dark-large { | .app-logo-dark-large { | ||||||
|   background-position: -29px -174px; |   background-position: -29px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-macro-blue-large, .phabricator-crumb-view:hover .app-macro-dark-large { | .app-logo-blue-large, .phabricator-crumb-view:hover .app-logo-dark-large { | ||||||
|   background-position: -58px -174px; |   background-position: -58px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-macro-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-macro-light-large { | .app-logo-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-logo-light-large { | ||||||
|   background-position: -87px -174px; |   background-position: -87px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-mail-light-large { | .app-macro-light-large { | ||||||
|   background-position: -116px -174px; |   background-position: -116px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-mail-dark-large { | .app-macro-dark-large { | ||||||
|   background-position: -145px -174px; |   background-position: -145px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-mail-blue-large, .phabricator-crumb-view:hover .app-mail-dark-large { | .app-macro-blue-large, .phabricator-crumb-view:hover .app-macro-dark-large { | ||||||
|   background-position: -174px -174px; |   background-position: -174px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-mail-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-mail-light-large { | .app-macro-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-macro-light-large { | ||||||
|   background-position: -203px -174px; |   background-position: -203px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-maniphest-light-large { | .app-mail-light-large { | ||||||
|   background-position: -232px -174px; |   background-position: -232px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-maniphest-dark-large { | .app-mail-dark-large { | ||||||
|   background-position: -261px -174px; |   background-position: -261px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-maniphest-blue-large, .phabricator-crumb-view:hover .app-maniphest-dark-large { | .app-mail-blue-large, .phabricator-crumb-view:hover .app-mail-dark-large { | ||||||
|   background-position: -290px -174px; |   background-position: -290px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-maniphest-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-maniphest-light-large { | .app-mail-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-mail-light-large { | ||||||
|   background-position: -319px -174px; |   background-position: -319px -174px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-metamta-light-large { | .app-maniphest-light-large { | ||||||
|   background-position: 0px -203px; |   background-position: 0px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-metamta-dark-large { | .app-maniphest-dark-large { | ||||||
|   background-position: -29px -203px; |   background-position: -29px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-metamta-blue-large, .phabricator-crumb-view:hover .app-metamta-dark-large { | .app-maniphest-blue-large, .phabricator-crumb-view:hover .app-maniphest-dark-large { | ||||||
|   background-position: -58px -203px; |   background-position: -58px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-metamta-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-metamta-light-large { | .app-maniphest-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-maniphest-light-large { | ||||||
|   background-position: -87px -203px; |   background-position: -87px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-owners-light-large { | .app-metamta-light-large { | ||||||
|   background-position: -116px -203px; |   background-position: -116px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-owners-dark-large { | .app-metamta-dark-large { | ||||||
|   background-position: -145px -203px; |   background-position: -145px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-owners-blue-large, .phabricator-crumb-view:hover .app-owners-dark-large { | .app-metamta-blue-large, .phabricator-crumb-view:hover .app-metamta-dark-large { | ||||||
|   background-position: -174px -203px; |   background-position: -174px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-owners-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-owners-light-large { | .app-metamta-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-metamta-light-large { | ||||||
|   background-position: -203px -203px; |   background-position: -203px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-paste-light-large { | .app-owners-light-large { | ||||||
|   background-position: -232px -203px; |   background-position: -232px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-paste-dark-large { | .app-owners-dark-large { | ||||||
|   background-position: -261px -203px; |   background-position: -261px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-paste-blue-large, .phabricator-crumb-view:hover .app-paste-dark-large { | .app-owners-blue-large, .phabricator-crumb-view:hover .app-owners-dark-large { | ||||||
|   background-position: -290px -203px; |   background-position: -290px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-paste-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-paste-light-large { | .app-owners-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-owners-light-large { | ||||||
|   background-position: -319px -203px; |   background-position: -319px -203px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-people-light-large { | .app-paste-light-large { | ||||||
|   background-position: 0px -232px; |   background-position: 0px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-people-dark-large { | .app-paste-dark-large { | ||||||
|   background-position: -29px -232px; |   background-position: -29px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-people-blue-large, .phabricator-crumb-view:hover .app-people-dark-large { | .app-paste-blue-large, .phabricator-crumb-view:hover .app-paste-dark-large { | ||||||
|   background-position: -58px -232px; |   background-position: -58px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-people-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-people-light-large { | .app-paste-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-paste-light-large { | ||||||
|   background-position: -87px -232px; |   background-position: -87px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phame-light-large { | .app-people-light-large { | ||||||
|   background-position: -116px -232px; |   background-position: -116px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phame-dark-large { | .app-people-dark-large { | ||||||
|   background-position: -145px -232px; |   background-position: -145px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phame-blue-large, .phabricator-crumb-view:hover .app-phame-dark-large { | .app-people-blue-large, .phabricator-crumb-view:hover .app-people-dark-large { | ||||||
|   background-position: -174px -232px; |   background-position: -174px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phame-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phame-light-large { | .app-people-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-people-light-large { | ||||||
|   background-position: -203px -232px; |   background-position: -203px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phid-light-large { | .app-phame-light-large { | ||||||
|   background-position: -232px -232px; |   background-position: -232px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phid-dark-large { | .app-phame-dark-large { | ||||||
|   background-position: -261px -232px; |   background-position: -261px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phid-blue-large, .phabricator-crumb-view:hover .app-phid-dark-large { | .app-phame-blue-large, .phabricator-crumb-view:hover .app-phame-dark-large { | ||||||
|   background-position: -290px -232px; |   background-position: -290px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phid-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phid-light-large { | .app-phame-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phame-light-large { | ||||||
|   background-position: -319px -232px; |   background-position: -319px -232px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-pholio-light-large { | .app-phid-light-large { | ||||||
|   background-position: 0px -261px; |   background-position: 0px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-pholio-dark-large { | .app-phid-dark-large { | ||||||
|   background-position: -29px -261px; |   background-position: -29px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-pholio-blue-large, .phabricator-crumb-view:hover .app-pholio-dark-large { | .app-phid-blue-large, .phabricator-crumb-view:hover .app-phid-dark-large { | ||||||
|   background-position: -58px -261px; |   background-position: -58px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-pholio-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-pholio-light-large { | .app-phid-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phid-light-large { | ||||||
|   background-position: -87px -261px; |   background-position: -87px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phpast-light-large { | .app-pholio-light-large { | ||||||
|   background-position: -116px -261px; |   background-position: -116px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phpast-dark-large { | .app-pholio-dark-large { | ||||||
|   background-position: -145px -261px; |   background-position: -145px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phpast-blue-large, .phabricator-crumb-view:hover .app-phpast-dark-large { | .app-pholio-blue-large, .phabricator-crumb-view:hover .app-pholio-dark-large { | ||||||
|   background-position: -174px -261px; |   background-position: -174px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phpast-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phpast-light-large { | .app-pholio-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-pholio-light-large { | ||||||
|   background-position: -203px -261px; |   background-position: -203px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phriction-light-large { | .app-phpast-light-large { | ||||||
|   background-position: -232px -261px; |   background-position: -232px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phriction-dark-large { | .app-phpast-dark-large { | ||||||
|   background-position: -261px -261px; |   background-position: -261px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phriction-blue-large, .phabricator-crumb-view:hover .app-phriction-dark-large { | .app-phpast-blue-large, .phabricator-crumb-view:hover .app-phpast-dark-large { | ||||||
|   background-position: -290px -261px; |   background-position: -290px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phriction-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phriction-light-large { | .app-phpast-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phpast-light-large { | ||||||
|   background-position: -319px -261px; |   background-position: -319px -261px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-ponder-light-large { | .app-phriction-light-large { | ||||||
|   background-position: 0px -290px; |   background-position: 0px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-ponder-dark-large { | .app-phriction-dark-large { | ||||||
|   background-position: -29px -290px; |   background-position: -29px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-ponder-blue-large, .phabricator-crumb-view:hover .app-ponder-dark-large { | .app-phriction-blue-large, .phabricator-crumb-view:hover .app-phriction-dark-large { | ||||||
|   background-position: -58px -290px; |   background-position: -58px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-ponder-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-ponder-light-large { | .app-phriction-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phriction-light-large { | ||||||
|   background-position: -87px -290px; |   background-position: -87px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-power-light-large { | .app-ponder-light-large { | ||||||
|   background-position: -116px -290px; |   background-position: -116px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-power-dark-large { | .app-ponder-dark-large { | ||||||
|   background-position: -145px -290px; |   background-position: -145px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-power-blue-large, .phabricator-crumb-view:hover .app-power-dark-large { | .app-ponder-blue-large, .phabricator-crumb-view:hover .app-ponder-dark-large { | ||||||
|   background-position: -174px -290px; |   background-position: -174px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-power-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-power-light-large { | .app-ponder-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-ponder-light-large { | ||||||
|   background-position: -203px -290px; |   background-position: -203px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-projects-light-large { | .app-power-light-large { | ||||||
|   background-position: -232px -290px; |   background-position: -232px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-projects-dark-large { | .app-power-dark-large { | ||||||
|   background-position: -261px -290px; |   background-position: -261px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-projects-blue-large, .phabricator-crumb-view:hover .app-projects-dark-large { | .app-power-blue-large, .phabricator-crumb-view:hover .app-power-dark-large { | ||||||
|   background-position: -290px -290px; |   background-position: -290px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-projects-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-projects-light-large { | .app-power-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-power-light-large { | ||||||
|   background-position: -319px -290px; |   background-position: -319px -290px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-repositories-light-large { | .app-projects-light-large { | ||||||
|   background-position: 0px -319px; |   background-position: 0px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-repositories-dark-large { | .app-projects-dark-large { | ||||||
|   background-position: -29px -319px; |   background-position: -29px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-repositories-blue-large, .phabricator-crumb-view:hover .app-repositories-dark-large { | .app-projects-blue-large, .phabricator-crumb-view:hover .app-projects-dark-large { | ||||||
|   background-position: -58px -319px; |   background-position: -58px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-repositories-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-repositories-light-large { | .app-projects-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-projects-light-large { | ||||||
|   background-position: -87px -319px; |   background-position: -87px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-settings-light-large { | .app-repositories-light-large { | ||||||
|   background-position: -116px -319px; |   background-position: -116px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-settings-dark-large { | .app-repositories-dark-large { | ||||||
|   background-position: -145px -319px; |   background-position: -145px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-settings-blue-large, .phabricator-crumb-view:hover .app-settings-dark-large { | .app-repositories-blue-large, .phabricator-crumb-view:hover .app-repositories-dark-large { | ||||||
|   background-position: -174px -319px; |   background-position: -174px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-settings-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-settings-light-large { | .app-repositories-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-repositories-light-large { | ||||||
|   background-position: -203px -319px; |   background-position: -203px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-setup-light-large { | .app-settings-light-large { | ||||||
|   background-position: -232px -319px; |   background-position: -232px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-setup-dark-large { | .app-settings-dark-large { | ||||||
|   background-position: -261px -319px; |   background-position: -261px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-setup-blue-large, .phabricator-crumb-view:hover .app-setup-dark-large { | .app-settings-blue-large, .phabricator-crumb-view:hover .app-settings-dark-large { | ||||||
|   background-position: -290px -319px; |   background-position: -290px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-setup-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-setup-light-large { | .app-settings-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-settings-light-large { | ||||||
|   background-position: -319px -319px; |   background-position: -319px -319px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-slowvote-light-large { | .app-setup-light-large { | ||||||
|   background-position: 0px -348px; |   background-position: 0px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-slowvote-dark-large { | .app-setup-dark-large { | ||||||
|   background-position: -29px -348px; |   background-position: -29px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-slowvote-blue-large, .phabricator-crumb-view:hover .app-slowvote-dark-large { | .app-setup-blue-large, .phabricator-crumb-view:hover .app-setup-dark-large { | ||||||
|   background-position: -58px -348px; |   background-position: -58px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-slowvote-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-slowvote-light-large { | .app-setup-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-setup-light-large { | ||||||
|   background-position: -87px -348px; |   background-position: -87px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-uiexamples-light-large { | .app-slowvote-light-large { | ||||||
|   background-position: -116px -348px; |   background-position: -116px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-uiexamples-dark-large { | .app-slowvote-dark-large { | ||||||
|   background-position: -145px -348px; |   background-position: -145px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-uiexamples-blue-large, .phabricator-crumb-view:hover .app-uiexamples-dark-large { | .app-slowvote-blue-large, .phabricator-crumb-view:hover .app-slowvote-dark-large { | ||||||
|   background-position: -174px -348px; |   background-position: -174px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-uiexamples-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-uiexamples-light-large { | .app-slowvote-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-slowvote-light-large { | ||||||
|   background-position: -203px -348px; |   background-position: -203px -348px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .app-uiexamples-light-large { | ||||||
|  |   background-position: -232px -348px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .app-uiexamples-dark-large { | ||||||
|  |   background-position: -261px -348px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .app-uiexamples-blue-large, .phabricator-crumb-view:hover .app-uiexamples-dark-large { | ||||||
|  |   background-position: -290px -348px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .app-uiexamples-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-uiexamples-light-large { | ||||||
|  |   background-position: -319px -348px; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -34,138 +34,142 @@ only screen and (-webkit-min-device-pixel-ratio: 1.5) { | |||||||
|   background-position: -45px 0px; |   background-position: -45px 0px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-countdown-dark { | .app-conpherence-dark { | ||||||
|   background-position: -60px 0px; |   background-position: -60px 0px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-daemon-dark { | .app-countdown-dark { | ||||||
|   background-position: -75px 0px; |   background-position: -75px 0px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-differential-dark { | .app-daemon-dark { | ||||||
|   background-position: 0px -15px; |   background-position: 0px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diffusion-dark { | .app-differential-dark { | ||||||
|   background-position: -15px -15px; |   background-position: -15px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-diviner-dark { | .app-diffusion-dark { | ||||||
|   background-position: -30px -15px; |   background-position: -30px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-drydock-dark { | .app-diviner-dark { | ||||||
|   background-position: -45px -15px; |   background-position: -45px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-fact-dark { | .app-drydock-dark { | ||||||
|   background-position: -60px -15px; |   background-position: -60px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-feed-dark { | .app-fact-dark { | ||||||
|   background-position: -75px -15px; |   background-position: -75px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-files-dark { | .app-feed-dark { | ||||||
|   background-position: 0px -30px; |   background-position: 0px -30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-flags-dark { | .app-files-dark { | ||||||
|   background-position: -15px -30px; |   background-position: -15px -30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-help-dark { | .app-flags-dark { | ||||||
|   background-position: -30px -30px; |   background-position: -30px -30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-herald-dark { | .app-help-dark { | ||||||
|   background-position: -45px -30px; |   background-position: -45px -30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-home-dark { | .app-herald-dark { | ||||||
|   background-position: -60px -30px; |   background-position: -60px -30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-logo-dark { | .app-home-dark { | ||||||
|   background-position: -75px -30px; |   background-position: -75px -30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-macro-dark { | .app-logo-dark { | ||||||
|   background-position: 0px -45px; |   background-position: 0px -45px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-mail-dark { | .app-macro-dark { | ||||||
|   background-position: -15px -45px; |   background-position: -15px -45px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-maniphest-dark { | .app-mail-dark { | ||||||
|   background-position: -30px -45px; |   background-position: -30px -45px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-metamta-dark { | .app-maniphest-dark { | ||||||
|   background-position: -45px -45px; |   background-position: -45px -45px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-owners-dark { | .app-metamta-dark { | ||||||
|   background-position: -60px -45px; |   background-position: -60px -45px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-paste-dark { | .app-owners-dark { | ||||||
|   background-position: -75px -45px; |   background-position: -75px -45px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-people-dark { | .app-paste-dark { | ||||||
|   background-position: 0px -60px; |   background-position: 0px -60px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phame-dark { | .app-people-dark { | ||||||
|   background-position: -15px -60px; |   background-position: -15px -60px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phid-dark { | .app-phame-dark { | ||||||
|   background-position: -30px -60px; |   background-position: -30px -60px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-pholio-dark { | .app-phid-dark { | ||||||
|   background-position: -45px -60px; |   background-position: -45px -60px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phpast-dark { | .app-pholio-dark { | ||||||
|   background-position: -60px -60px; |   background-position: -60px -60px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-phriction-dark { | .app-phpast-dark { | ||||||
|   background-position: -75px -60px; |   background-position: -75px -60px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-ponder-dark { | .app-phriction-dark { | ||||||
|   background-position: 0px -75px; |   background-position: 0px -75px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-power-dark { | .app-ponder-dark { | ||||||
|   background-position: -15px -75px; |   background-position: -15px -75px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-projects-dark { | .app-power-dark { | ||||||
|   background-position: -30px -75px; |   background-position: -30px -75px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-repositories-dark { | .app-projects-dark { | ||||||
|   background-position: -45px -75px; |   background-position: -45px -75px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-settings-dark { | .app-repositories-dark { | ||||||
|   background-position: -60px -75px; |   background-position: -60px -75px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-setup-dark { | .app-settings-dark { | ||||||
|   background-position: -75px -75px; |   background-position: -75px -75px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-slowvote-dark { | .app-setup-dark { | ||||||
|   background-position: 0px -90px; |   background-position: 0px -90px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-uiexamples-dark { | .app-slowvote-dark { | ||||||
|   background-position: -15px -90px; |   background-position: -15px -90px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .app-uiexamples-dark { | ||||||
|  |   background-position: -30px -90px; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -13,19 +13,11 @@ only screen and (min-device-pixel-ratio: 1.5), | |||||||
| only screen and (-webkit-min-device-pixel-ratio: 1.5) { | only screen and (-webkit-min-device-pixel-ratio: 1.5) { | ||||||
|   .sprite-menu { |   .sprite-menu { | ||||||
|     background-image: url(/rsrc/image/sprite-menu-X2.png); |     background-image: url(/rsrc/image/sprite-menu-X2.png); | ||||||
|     background-size: 140px 127px; |     background-size: 140px 88px; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-bubble { |  | ||||||
|   background-position: 0px -68px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .phabricator-main-menu-alert-bubble.alert-unread { |  | ||||||
|   background-position: 0px -41px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .alert-notifications .phabricator-main-menu-alert-icon { | .alert-notifications .phabricator-main-menu-alert-icon { | ||||||
|   background-position: 0px 0px; |   background-position: 0px 0px; | ||||||
| } | } | ||||||
| @@ -35,21 +27,33 @@ only screen and (-webkit-min-device-pixel-ratio: 1.5) { | |||||||
| } | } | ||||||
|  |  | ||||||
| .alert-notifications.alert-unread .phabricator-main-menu-alert-icon { | .alert-notifications.alert-unread .phabricator-main-menu-alert-icon { | ||||||
|   background-position: -27px -68px; |   background-position: -30px 0px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-crumb-divider { | .phabricator-crumb-divider { | ||||||
|   background-position: 0px -95px; |   background-position: 0px -56px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .menu-icon-eye { | .menu-icon-eye { | ||||||
|   background-position: -47px -41px; |   background-position: -10px -56px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .menu-icon-app { | .menu-icon-app { | ||||||
|   background-position: -42px -68px; |   background-position: -35px -56px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .phabricator-main-menu-logo-image { | .phabricator-main-menu-logo-image { | ||||||
|  |   background-position: 0px -30px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .alert-notifications .phabricator-main-menu-message-icon { | ||||||
|   background-position: 0px -15px; |   background-position: 0px -15px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .alert-notifications:hover .phabricator-main-menu-message-icon { | ||||||
|  |   background-position: -15px -15px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .alert-notifications.message-unread .phabricator-main-menu-message-icon { | ||||||
|  |   background-position: -30px -15px; | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								webroot/rsrc/image/actions/edit.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 410 B | 
| Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB | 
| Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 222 KiB | 
 epriestley
					epriestley