Tokens v1
Summary: Features! - Giving tokens. - Taking tokens back. - Not giving tokens. Test Plan: See screenshots. Reviewers: chad, vrana Reviewed By: chad CC: aran, btrahan Maniphest Tasks: T2541 Differential Revision: https://secure.phabricator.com/D4964
							
								
								
									
										11
									
								
								externals/javelinjs/src/lib/Workflow.js
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -88,14 +88,19 @@ JX.install('Workflow', { | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       var t = event.getTarget(); | ||||
|       // Get the button (which is sometimes actually another tag, like an <a />) | ||||
|       // which triggered the event. In particular, this makes sure we get the | ||||
|       // right node if there is a <button> with an <img /> inside it or | ||||
|       // or something similar. | ||||
|       var t = event.getNode('jx-workflow-button') || | ||||
|               event.getNode('tag:button'); | ||||
|       if (t.name == '__cancel__' || t.name == '__close__') { | ||||
|         JX.Workflow._pop(); | ||||
|       } else { | ||||
|  | ||||
|         var form = event.getNode('jx-dialog'); | ||||
|         var data = JX.DOM.convertFormToListOfPairs(form); | ||||
|         data.push([t.name, true]); | ||||
|  | ||||
|         data.push([t.name, t.value || true]); | ||||
|  | ||||
|         var active = JX.Workflow._getActiveWorkflow(); | ||||
|         var e = active.invoke('submit', {form: form, data: data}); | ||||
|   | ||||
| @@ -4,782 +4,782 @@ | ||||
|     "app-application-blue-large"   : { | ||||
|       "name" : "app-application-blue-large", | ||||
|       "rule" : ".app-application-blue-large, .phabricator-crumb-view:hover .app-application-dark-large", | ||||
|       "hash" : "80f42a283979cef89577721ca6d9cdef" | ||||
|       "hash" : "c8e0319f0c8a3c19bb74391785149424" | ||||
|     }, | ||||
|     "app-application-dark-large"   : { | ||||
|       "name" : "app-application-dark-large", | ||||
|       "rule" : ".app-application-dark-large", | ||||
|       "hash" : "8ab1619bcb768cc1b85106b077d29522" | ||||
|       "hash" : "a5a904b67bdd26c15b8df07b0b0cee1a" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "26aedaf7940300f18eb0ef59566a0988" | ||||
|       "hash" : "04cd8ab1f4785d33d6c9c829dce35cb6" | ||||
|     }, | ||||
|     "app-application-light-large"  : { | ||||
|       "name" : "app-application-light-large", | ||||
|       "rule" : ".app-application-light-large", | ||||
|       "hash" : "09d4ef0cb36255291693971754ec55ee" | ||||
|       "hash" : "8b071cf0efedda7c8c772829d31453ea" | ||||
|     }, | ||||
|     "app-audit-blue-large"         : { | ||||
|       "name" : "app-audit-blue-large", | ||||
|       "rule" : ".app-audit-blue-large, .phabricator-crumb-view:hover .app-audit-dark-large", | ||||
|       "hash" : "05941dc7d5ff156c0e899c6345f6833a" | ||||
|       "hash" : "cfb6e6c27d6bf4bbf2e07c8d284948d7" | ||||
|     }, | ||||
|     "app-audit-dark-large"         : { | ||||
|       "name" : "app-audit-dark-large", | ||||
|       "rule" : ".app-audit-dark-large", | ||||
|       "hash" : "cbf8e6c5a580bd3b5169f30d3cd0ec6a" | ||||
|       "hash" : "0880246fc6aa5d0cec823166af5b388f" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "5ab43e357c123c05a9db85a964b20252" | ||||
|       "hash" : "2f3896e45a05d55c3a95440dbeac9187" | ||||
|     }, | ||||
|     "app-audit-light-large"        : { | ||||
|       "name" : "app-audit-light-large", | ||||
|       "rule" : ".app-audit-light-large", | ||||
|       "hash" : "aa853bebb7a315b994f1527247e3b362" | ||||
|       "hash" : "8dd753f716233d2f6edf553df4fde942" | ||||
|     }, | ||||
|     "app-calendar-blue-large"      : { | ||||
|       "name" : "app-calendar-blue-large", | ||||
|       "rule" : ".app-calendar-blue-large, .phabricator-crumb-view:hover .app-calendar-dark-large", | ||||
|       "hash" : "9e530feec2926878ee7eaa8a04a8607b" | ||||
|       "hash" : "a05add9fa18df8a98cf2735cf27ec6e1" | ||||
|     }, | ||||
|     "app-calendar-dark-large"      : { | ||||
|       "name" : "app-calendar-dark-large", | ||||
|       "rule" : ".app-calendar-dark-large", | ||||
|       "hash" : "65de91c173d169bbf407c9e7cefa9715" | ||||
|       "hash" : "5c98faf324152ec55bad6ac76f77ec00" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "1dc738045b09476feebe5e705a61b7a9" | ||||
|       "hash" : "d1a7c623c5b3d902a389fc2ea8941858" | ||||
|     }, | ||||
|     "app-calendar-light-large"     : { | ||||
|       "name" : "app-calendar-light-large", | ||||
|       "rule" : ".app-calendar-light-large", | ||||
|       "hash" : "043dab56a011f84f5affc2c7c13e3a39" | ||||
|       "hash" : "466b97737778eff91ebd9afabac6e5a6" | ||||
|     }, | ||||
|     "app-conduit-blue-large"       : { | ||||
|       "name" : "app-conduit-blue-large", | ||||
|       "rule" : ".app-conduit-blue-large, .phabricator-crumb-view:hover .app-conduit-dark-large", | ||||
|       "hash" : "4ab937882a119bacc0206029cbd7919d" | ||||
|       "hash" : "ed8208ab196da7da6160edbdb0be118a" | ||||
|     }, | ||||
|     "app-conduit-dark-large"       : { | ||||
|       "name" : "app-conduit-dark-large", | ||||
|       "rule" : ".app-conduit-dark-large", | ||||
|       "hash" : "34de5192c69af7a9cf3941f7b5cb088e" | ||||
|       "hash" : "bad7559ed9928596c0241d8490e67422" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "b89b969a7fba76d39c768ac8de19c964" | ||||
|       "hash" : "072c3ca188a60e9ee08c6eb36b8628c9" | ||||
|     }, | ||||
|     "app-conduit-light-large"      : { | ||||
|       "name" : "app-conduit-light-large", | ||||
|       "rule" : ".app-conduit-light-large", | ||||
|       "hash" : "a2fd3cfe6e4e46d589e0e99f52e7f6f0" | ||||
|       "hash" : "92047e758fac063dfb0608863ee66b7e" | ||||
|     }, | ||||
|     "app-conpherence-blue-large"   : { | ||||
|       "name" : "app-conpherence-blue-large", | ||||
|       "rule" : ".app-conpherence-blue-large, .phabricator-crumb-view:hover .app-conpherence-dark-large", | ||||
|       "hash" : "efcf3788ac60484d5920b37c1560e565" | ||||
|       "hash" : "6b84241639e4755b450085f7eeb30cb1" | ||||
|     }, | ||||
|     "app-conpherence-dark-large"   : { | ||||
|       "name" : "app-conpherence-dark-large", | ||||
|       "rule" : ".app-conpherence-dark-large", | ||||
|       "hash" : "2722117e3da8c2dbc478d957fb21ca53" | ||||
|       "hash" : "d9ced45f6ce7ffec0a0edb17c5e63834" | ||||
|     }, | ||||
|     "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" | ||||
|       "hash" : "aa5d889f5d46f3b7cefc766ae5c7b904" | ||||
|     }, | ||||
|     "app-conpherence-light-large"  : { | ||||
|       "name" : "app-conpherence-light-large", | ||||
|       "rule" : ".app-conpherence-light-large", | ||||
|       "hash" : "a79e5f0094caf9f012f3e9d7a10f2bac" | ||||
|       "hash" : "d85a049c1742fec1f95a8ebb6ca5c944" | ||||
|     }, | ||||
|     "app-countdown-blue-large"     : { | ||||
|       "name" : "app-countdown-blue-large", | ||||
|       "rule" : ".app-countdown-blue-large, .phabricator-crumb-view:hover .app-countdown-dark-large", | ||||
|       "hash" : "a4079b8e55924b7590011b35ba9bfdb0" | ||||
|       "hash" : "d44b7acae6b6b052ac869f0176b66b89" | ||||
|     }, | ||||
|     "app-countdown-dark-large"     : { | ||||
|       "name" : "app-countdown-dark-large", | ||||
|       "rule" : ".app-countdown-dark-large", | ||||
|       "hash" : "25547923eb9927ed0c30804fafd471d3" | ||||
|       "hash" : "dc7df8202a5fa7baf17fd446a9b5c4c5" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "472fcd5cf9f292b0d2f9f275541fed18" | ||||
|       "hash" : "3b972002d629a49a4eca9049a9b2c6ae" | ||||
|     }, | ||||
|     "app-countdown-light-large"    : { | ||||
|       "name" : "app-countdown-light-large", | ||||
|       "rule" : ".app-countdown-light-large", | ||||
|       "hash" : "24bac143e049862bed161d819990cee0" | ||||
|       "hash" : "8f3814f70c1cb0475dd4678cc8937d91" | ||||
|     }, | ||||
|     "app-daemon-blue-large"        : { | ||||
|       "name" : "app-daemon-blue-large", | ||||
|       "rule" : ".app-daemon-blue-large, .phabricator-crumb-view:hover .app-daemon-dark-large", | ||||
|       "hash" : "beb6586864ef67a7bd7a9a159b8c2a56" | ||||
|       "hash" : "c922a7e7ec9467ca48b2a2573904b7ce" | ||||
|     }, | ||||
|     "app-daemon-dark-large"        : { | ||||
|       "name" : "app-daemon-dark-large", | ||||
|       "rule" : ".app-daemon-dark-large", | ||||
|       "hash" : "cf2e12b2967d155c437862bbb9ce2d86" | ||||
|       "hash" : "b2e566baac0c579563bd5bd700deb41b" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "1728089df503ec805b42e262b196b616" | ||||
|       "hash" : "1c8e2776b9b984b804f6dca073f101eb" | ||||
|     }, | ||||
|     "app-daemon-light-large"       : { | ||||
|       "name" : "app-daemon-light-large", | ||||
|       "rule" : ".app-daemon-light-large", | ||||
|       "hash" : "44328612154fbf1a2f0f6ff28cd23521" | ||||
|       "hash" : "9c778b43f9f7380fc9bd862c097bbaa8" | ||||
|     }, | ||||
|     "app-differential-blue-large"  : { | ||||
|       "name" : "app-differential-blue-large", | ||||
|       "rule" : ".app-differential-blue-large, .phabricator-crumb-view:hover .app-differential-dark-large", | ||||
|       "hash" : "9491284c8cbf77df0795bdf9cd16651e" | ||||
|       "hash" : "59049df6a30c816ea68d3025da79a091" | ||||
|     }, | ||||
|     "app-differential-dark-large"  : { | ||||
|       "name" : "app-differential-dark-large", | ||||
|       "rule" : ".app-differential-dark-large", | ||||
|       "hash" : "a4b2ac4d4f697896e3abe9e58501fea5" | ||||
|       "hash" : "fd1e0f1fa97b00c7409ebfdc56cf4865" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "d7e777585cc826becb64042f8bb31fc5" | ||||
|       "hash" : "3997a58a26389e8ede8022fd05cf8b43" | ||||
|     }, | ||||
|     "app-differential-light-large" : { | ||||
|       "name" : "app-differential-light-large", | ||||
|       "rule" : ".app-differential-light-large", | ||||
|       "hash" : "a763d63d22cac8226d8bd5656221a91b" | ||||
|       "hash" : "b5c750e09f57a787e89f32820f791c4a" | ||||
|     }, | ||||
|     "app-diffusion-blue-large"     : { | ||||
|       "name" : "app-diffusion-blue-large", | ||||
|       "rule" : ".app-diffusion-blue-large, .phabricator-crumb-view:hover .app-diffusion-dark-large", | ||||
|       "hash" : "35e35c07ca1a151c810bb38a90496a2d" | ||||
|       "hash" : "b982cfacfde43d3267082bca236bc72c" | ||||
|     }, | ||||
|     "app-diffusion-dark-large"     : { | ||||
|       "name" : "app-diffusion-dark-large", | ||||
|       "rule" : ".app-diffusion-dark-large", | ||||
|       "hash" : "5b3752babd557f2c9bbc0120bd9a0747" | ||||
|       "hash" : "2eb71cde4af83347efdee542f4cadd8e" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "a5a682fffa03d4cdae9a86b8c79d1a81" | ||||
|       "hash" : "55873c2e30e693e7bde0f4a90045064d" | ||||
|     }, | ||||
|     "app-diffusion-light-large"    : { | ||||
|       "name" : "app-diffusion-light-large", | ||||
|       "rule" : ".app-diffusion-light-large", | ||||
|       "hash" : "1f04606fe4f0650982327bf09bf5adc0" | ||||
|       "hash" : "6eeb6f6df3ecd1ee923081b2d82f0505" | ||||
|     }, | ||||
|     "app-diviner-blue-large"       : { | ||||
|       "name" : "app-diviner-blue-large", | ||||
|       "rule" : ".app-diviner-blue-large, .phabricator-crumb-view:hover .app-diviner-dark-large", | ||||
|       "hash" : "97f1242c914315cf773c27bbec964335" | ||||
|       "hash" : "bda64f504c0c2c34125758bd01c80e05" | ||||
|     }, | ||||
|     "app-diviner-dark-large"       : { | ||||
|       "name" : "app-diviner-dark-large", | ||||
|       "rule" : ".app-diviner-dark-large", | ||||
|       "hash" : "c4f0550826f60fcd48d6ebcd340184b4" | ||||
|       "hash" : "786a865464564d66d458557c909a77ea" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "7f7f0e1886036d894a5b22b72872ad06" | ||||
|       "hash" : "d173b3a659a2a4b5af5890ba70e827d1" | ||||
|     }, | ||||
|     "app-diviner-light-large"      : { | ||||
|       "name" : "app-diviner-light-large", | ||||
|       "rule" : ".app-diviner-light-large", | ||||
|       "hash" : "b13413ada716fa7d3449c38b11decd5d" | ||||
|       "hash" : "c515bc52cb560adebce1e84bb5d917ce" | ||||
|     }, | ||||
|     "app-drydock-blue-large"       : { | ||||
|       "name" : "app-drydock-blue-large", | ||||
|       "rule" : ".app-drydock-blue-large, .phabricator-crumb-view:hover .app-drydock-dark-large", | ||||
|       "hash" : "a63aaba405583e356f00af6bc1dedfad" | ||||
|       "hash" : "ba82e330a78dd60df033560e083601cf" | ||||
|     }, | ||||
|     "app-drydock-dark-large"       : { | ||||
|       "name" : "app-drydock-dark-large", | ||||
|       "rule" : ".app-drydock-dark-large", | ||||
|       "hash" : "a97be15640a38db803cc03215968e856" | ||||
|       "hash" : "7a41b9668c77b85b8acf048d9e61c50a" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "d7beac10376044ffda0adbe6ed01e645" | ||||
|       "hash" : "f5866c62ecbc94ecacd1563d2780677d" | ||||
|     }, | ||||
|     "app-drydock-light-large"      : { | ||||
|       "name" : "app-drydock-light-large", | ||||
|       "rule" : ".app-drydock-light-large", | ||||
|       "hash" : "712c8fa45f964e0c4cbb69321fd1fded" | ||||
|       "hash" : "2c1ce32d5d5291e7d3d3d6e9323a2a65" | ||||
|     }, | ||||
|     "app-fact-blue-large"          : { | ||||
|       "name" : "app-fact-blue-large", | ||||
|       "rule" : ".app-fact-blue-large, .phabricator-crumb-view:hover .app-fact-dark-large", | ||||
|       "hash" : "4b07b51e2178f12533c04c55d522d9e5" | ||||
|       "hash" : "1e2b911cb36b0d44384487e348892ccc" | ||||
|     }, | ||||
|     "app-fact-dark-large"          : { | ||||
|       "name" : "app-fact-dark-large", | ||||
|       "rule" : ".app-fact-dark-large", | ||||
|       "hash" : "6040fe830d8f0868cdb38ee2b8ee16ac" | ||||
|       "hash" : "5fb4a988baad433e9900f1a814b89caa" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "691ab101af38d4f06421ca0b22e463d9" | ||||
|       "hash" : "5bd7e5f2adfa0935ae97270139ec4912" | ||||
|     }, | ||||
|     "app-fact-light-large"         : { | ||||
|       "name" : "app-fact-light-large", | ||||
|       "rule" : ".app-fact-light-large", | ||||
|       "hash" : "8253f813361ba065866ee6e6e2077320" | ||||
|       "hash" : "3bc45d399dad8ec8d55873714c42c1d7" | ||||
|     }, | ||||
|     "app-feed-blue-large"          : { | ||||
|       "name" : "app-feed-blue-large", | ||||
|       "rule" : ".app-feed-blue-large, .phabricator-crumb-view:hover .app-feed-dark-large", | ||||
|       "hash" : "462246f99422c86301b7d4faa67d9488" | ||||
|       "hash" : "3bcdec795b38002644a8009c927a0acc" | ||||
|     }, | ||||
|     "app-feed-dark-large"          : { | ||||
|       "name" : "app-feed-dark-large", | ||||
|       "rule" : ".app-feed-dark-large", | ||||
|       "hash" : "0eecff752dc5dde55e7feaa52b7ee7d0" | ||||
|       "hash" : "e83834eccc699399b604069b95465cff" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "45fe559a997e540933c184ae570a6ddc" | ||||
|       "hash" : "ca2fb9a2cd437b465f5d912a4d26f3e5" | ||||
|     }, | ||||
|     "app-feed-light-large"         : { | ||||
|       "name" : "app-feed-light-large", | ||||
|       "rule" : ".app-feed-light-large", | ||||
|       "hash" : "2ec6e12956fe1e1b746261bb3d0a0d36" | ||||
|       "hash" : "e3a8add13539550ddaab62f84b30dd66" | ||||
|     }, | ||||
|     "app-files-blue-large"         : { | ||||
|       "name" : "app-files-blue-large", | ||||
|       "rule" : ".app-files-blue-large, .phabricator-crumb-view:hover .app-files-dark-large", | ||||
|       "hash" : "f9217c49be154a830303285ae64790c8" | ||||
|       "hash" : "4505af3a9261a1ee4e00bf1d046286dd" | ||||
|     }, | ||||
|     "app-files-dark-large"         : { | ||||
|       "name" : "app-files-dark-large", | ||||
|       "rule" : ".app-files-dark-large", | ||||
|       "hash" : "78fb66b9edc99c3694325548582f0506" | ||||
|       "hash" : "1d229c79f3b8301ca1ee38ccd9c7c142" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "cabf071ace59043fc877f1e962109c83" | ||||
|       "hash" : "4bd7617617d0af975282bdd9a399d0ab" | ||||
|     }, | ||||
|     "app-files-light-large"        : { | ||||
|       "name" : "app-files-light-large", | ||||
|       "rule" : ".app-files-light-large", | ||||
|       "hash" : "ee5503d0684ea20be40023a29589d322" | ||||
|       "hash" : "0d8bf609759312d89e2a4b148f0701d8" | ||||
|     }, | ||||
|     "app-flags-blue-large"         : { | ||||
|       "name" : "app-flags-blue-large", | ||||
|       "rule" : ".app-flags-blue-large, .phabricator-crumb-view:hover .app-flags-dark-large", | ||||
|       "hash" : "8bbdefdaba30bf6a020f8515ee33d452" | ||||
|       "hash" : "a6f52b520f88e4ef60b7a76fb3c2c597" | ||||
|     }, | ||||
|     "app-flags-dark-large"         : { | ||||
|       "name" : "app-flags-dark-large", | ||||
|       "rule" : ".app-flags-dark-large", | ||||
|       "hash" : "c6824e1362ec59ccf9ad8f451da466c1" | ||||
|       "hash" : "51307234bb3c309b3ea69381e0b72b16" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "e728b1018c62d24efa5d416d138cb671" | ||||
|       "hash" : "75c1c107f4e750ef27bf50b4b51b0e00" | ||||
|     }, | ||||
|     "app-flags-light-large"        : { | ||||
|       "name" : "app-flags-light-large", | ||||
|       "rule" : ".app-flags-light-large", | ||||
|       "hash" : "4a40dc3e18011a8283840e5dfbe14dc9" | ||||
|       "hash" : "8c198ba5bcd146595870bab777d4992e" | ||||
|     }, | ||||
|     "app-help-blue-large"          : { | ||||
|       "name" : "app-help-blue-large", | ||||
|       "rule" : ".app-help-blue-large, .phabricator-crumb-view:hover .app-help-dark-large", | ||||
|       "hash" : "703f8c674cdd22f1314ffe8977acf35b" | ||||
|       "hash" : "a74c4f436b2e70c0e06f4224953d064a" | ||||
|     }, | ||||
|     "app-help-dark-large"          : { | ||||
|       "name" : "app-help-dark-large", | ||||
|       "rule" : ".app-help-dark-large", | ||||
|       "hash" : "601aaf7047f9db41baf7e3393b0d7aeb" | ||||
|       "hash" : "3cbd366c4b5758e45ef07507c70f68c0" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "1a2928f28cbfdcc31f411e7d2dc26447" | ||||
|       "hash" : "c795358a116961342b206821a1b8038b" | ||||
|     }, | ||||
|     "app-help-light-large"         : { | ||||
|       "name" : "app-help-light-large", | ||||
|       "rule" : ".app-help-light-large", | ||||
|       "hash" : "c17b8e6228f844777177c5070e17dd91" | ||||
|       "hash" : "722eceffe63605b00a5b957b5f40db98" | ||||
|     }, | ||||
|     "app-herald-blue-large"        : { | ||||
|       "name" : "app-herald-blue-large", | ||||
|       "rule" : ".app-herald-blue-large, .phabricator-crumb-view:hover .app-herald-dark-large", | ||||
|       "hash" : "4bf9b4b872e7207d66c6e80dcad47b0e" | ||||
|       "hash" : "9edfe47e8f1f2c4f1071f4d8b6ed346d" | ||||
|     }, | ||||
|     "app-herald-dark-large"        : { | ||||
|       "name" : "app-herald-dark-large", | ||||
|       "rule" : ".app-herald-dark-large", | ||||
|       "hash" : "e19fd614bf5f904603517df957165b22" | ||||
|       "hash" : "4b7a3ab5e0b6a04224ccb6e520e73d6e" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "13ef725e4f2da68211cf9ab17740c723" | ||||
|       "hash" : "22beef0629ee517ba1a2b822ed440d0c" | ||||
|     }, | ||||
|     "app-herald-light-large"       : { | ||||
|       "name" : "app-herald-light-large", | ||||
|       "rule" : ".app-herald-light-large", | ||||
|       "hash" : "81af2b9899db0b5c877d96016ddfa1a1" | ||||
|       "hash" : "65bbeb68fd051b77f4871aafe2994f56" | ||||
|     }, | ||||
|     "app-home-blue-large"          : { | ||||
|       "name" : "app-home-blue-large", | ||||
|       "rule" : ".app-home-blue-large, .phabricator-crumb-view:hover .app-home-dark-large", | ||||
|       "hash" : "7011cb276b9d7d1f042d2f0393a74312" | ||||
|       "hash" : "7df64082c33dcc3d2263772c0393be70" | ||||
|     }, | ||||
|     "app-home-dark-large"          : { | ||||
|       "name" : "app-home-dark-large", | ||||
|       "rule" : ".app-home-dark-large", | ||||
|       "hash" : "6b7f677ad630593900132f6271c41cb4" | ||||
|       "hash" : "79acb839094adcb3ad94567c054801eb" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "8b61be58e6a4f0e9e73434c40844260b" | ||||
|       "hash" : "5af620ae48ba98ee4ee594c32ba761cb" | ||||
|     }, | ||||
|     "app-home-light-large"         : { | ||||
|       "name" : "app-home-light-large", | ||||
|       "rule" : ".app-home-light-large", | ||||
|       "hash" : "f0740b16cd3746a1234070f1785c03eb" | ||||
|       "hash" : "181a71639319f3beda59809963384250" | ||||
|     }, | ||||
|     "app-logo-blue-large"          : { | ||||
|       "name" : "app-logo-blue-large", | ||||
|       "rule" : ".app-logo-blue-large, .phabricator-crumb-view:hover .app-logo-dark-large", | ||||
|       "hash" : "64a8124698f9441f50230f3a63364dd7" | ||||
|       "hash" : "025f46665b079f5899ec53be09165d09" | ||||
|     }, | ||||
|     "app-logo-dark-large"          : { | ||||
|       "name" : "app-logo-dark-large", | ||||
|       "rule" : ".app-logo-dark-large", | ||||
|       "hash" : "8023a60fcba24c3f200214152a62a2c3" | ||||
|       "hash" : "20524d2868b7b57423aa8dc27b284cac" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "c742c782b92cc5fecdc1a9747568ad70" | ||||
|       "hash" : "3969545781a17ec856bacec4ed110506" | ||||
|     }, | ||||
|     "app-logo-light-large"         : { | ||||
|       "name" : "app-logo-light-large", | ||||
|       "rule" : ".app-logo-light-large", | ||||
|       "hash" : "52fc06fb90f7ec1c29498069b1a059b2" | ||||
|       "hash" : "bd1b66ffad9ee26019738fc00a7eb343" | ||||
|     }, | ||||
|     "app-macro-blue-large"         : { | ||||
|       "name" : "app-macro-blue-large", | ||||
|       "rule" : ".app-macro-blue-large, .phabricator-crumb-view:hover .app-macro-dark-large", | ||||
|       "hash" : "50c14fec9a7f913c8aa4a2793bf2867c" | ||||
|       "hash" : "a6116a196718bf6cd5337b4c49de710e" | ||||
|     }, | ||||
|     "app-macro-dark-large"         : { | ||||
|       "name" : "app-macro-dark-large", | ||||
|       "rule" : ".app-macro-dark-large", | ||||
|       "hash" : "890cde6b9407d00c6394d446974674ff" | ||||
|       "hash" : "583a495f319fb63f99400b0197832dce" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "a3aaa9ebca64e5659e8c3c4eebdedd7a" | ||||
|       "hash" : "16d2c3aeabb43a51bb5742c67c4b92a1" | ||||
|     }, | ||||
|     "app-macro-light-large"        : { | ||||
|       "name" : "app-macro-light-large", | ||||
|       "rule" : ".app-macro-light-large", | ||||
|       "hash" : "7dcba4f0560b9e197849f5540b7ec66d" | ||||
|       "hash" : "b073066348826c93f57ba76f746e5c7e" | ||||
|     }, | ||||
|     "app-mail-blue-large"          : { | ||||
|       "name" : "app-mail-blue-large", | ||||
|       "rule" : ".app-mail-blue-large, .phabricator-crumb-view:hover .app-mail-dark-large", | ||||
|       "hash" : "a0a94c194794bb435ea3152ecb2cd42d" | ||||
|       "hash" : "192f85bd7a5be296de7acff9bbc9bd1d" | ||||
|     }, | ||||
|     "app-mail-dark-large"          : { | ||||
|       "name" : "app-mail-dark-large", | ||||
|       "rule" : ".app-mail-dark-large", | ||||
|       "hash" : "1a1437047fd24b9bb2643435185b6f13" | ||||
|       "hash" : "4709516a74216e0ba886a30180ad93d4" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "141548cae4bf8265be9452e583be3504" | ||||
|       "hash" : "1f0d2be98c3771791db7a9ad20784872" | ||||
|     }, | ||||
|     "app-mail-light-large"         : { | ||||
|       "name" : "app-mail-light-large", | ||||
|       "rule" : ".app-mail-light-large", | ||||
|       "hash" : "27aec2b8d5bd1fb7eba00ffbaacf1930" | ||||
|       "hash" : "740ea3d3104365ab7bad981b13d23693" | ||||
|     }, | ||||
|     "app-maniphest-blue-large"     : { | ||||
|       "name" : "app-maniphest-blue-large", | ||||
|       "rule" : ".app-maniphest-blue-large, .phabricator-crumb-view:hover .app-maniphest-dark-large", | ||||
|       "hash" : "619ff6fea2c90a8d70b000ed0ece6e4b" | ||||
|       "hash" : "d667667cc5216ff510cb58c359ffc2a4" | ||||
|     }, | ||||
|     "app-maniphest-dark-large"     : { | ||||
|       "name" : "app-maniphest-dark-large", | ||||
|       "rule" : ".app-maniphest-dark-large", | ||||
|       "hash" : "7a204fc2f4779eff27847bf799652140" | ||||
|       "hash" : "acadb7737b24ecc23e892cdaab7c1fe2" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "2b67eff9fb01bdf0972749532301e038" | ||||
|       "hash" : "8dccd7ba95ddffc4e071e42b69773f5c" | ||||
|     }, | ||||
|     "app-maniphest-light-large"    : { | ||||
|       "name" : "app-maniphest-light-large", | ||||
|       "rule" : ".app-maniphest-light-large", | ||||
|       "hash" : "90ea395741410840b1b4a974f802b06c" | ||||
|       "hash" : "0d2c71a1279686c3884c267d98bc36ba" | ||||
|     }, | ||||
|     "app-metamta-blue-large"       : { | ||||
|       "name" : "app-metamta-blue-large", | ||||
|       "rule" : ".app-metamta-blue-large, .phabricator-crumb-view:hover .app-metamta-dark-large", | ||||
|       "hash" : "48af88efc2887cc985f09d5202922df0" | ||||
|       "hash" : "1757d281dcdbdf221ca2b2e90993dba8" | ||||
|     }, | ||||
|     "app-metamta-dark-large"       : { | ||||
|       "name" : "app-metamta-dark-large", | ||||
|       "rule" : ".app-metamta-dark-large", | ||||
|       "hash" : "bf18a2c7ef31e72dc9ce6695035baf60" | ||||
|       "hash" : "c5f3a7468d98ebb977bfb0cc81abd5ee" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "74c00295bf0d394e6427593665a271f1" | ||||
|       "hash" : "5f7b115d45e5d3a5a5a730173366f2e4" | ||||
|     }, | ||||
|     "app-metamta-light-large"      : { | ||||
|       "name" : "app-metamta-light-large", | ||||
|       "rule" : ".app-metamta-light-large", | ||||
|       "hash" : "720cc7f66ab36770998aa4fe9ad22785" | ||||
|       "hash" : "13ce4ca0f223cda37e3af39da8c6e564" | ||||
|     }, | ||||
|     "app-owners-blue-large"        : { | ||||
|       "name" : "app-owners-blue-large", | ||||
|       "rule" : ".app-owners-blue-large, .phabricator-crumb-view:hover .app-owners-dark-large", | ||||
|       "hash" : "ee909b2d51a3c52b38c0cca3da8d861d" | ||||
|       "hash" : "585c128af418f94b8fbf18206605ec84" | ||||
|     }, | ||||
|     "app-owners-dark-large"        : { | ||||
|       "name" : "app-owners-dark-large", | ||||
|       "rule" : ".app-owners-dark-large", | ||||
|       "hash" : "05a6fcc603b5ee346d25b1fb25e7e695" | ||||
|       "hash" : "b09a80f307491acbe56fb16e01956173" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "4bcba14ffcdf7ac3c1968ebcc34f7e37" | ||||
|       "hash" : "a63816e6979ec6c222a086b5d72a0b86" | ||||
|     }, | ||||
|     "app-owners-light-large"       : { | ||||
|       "name" : "app-owners-light-large", | ||||
|       "rule" : ".app-owners-light-large", | ||||
|       "hash" : "2d6b3f02f210c73242d91bdb9ef8456c" | ||||
|       "hash" : "6b06493f46a91584e746e5034be15366" | ||||
|     }, | ||||
|     "app-paste-blue-large"         : { | ||||
|       "name" : "app-paste-blue-large", | ||||
|       "rule" : ".app-paste-blue-large, .phabricator-crumb-view:hover .app-paste-dark-large", | ||||
|       "hash" : "2ce99237cc2f064f0aa48fb1d147c781" | ||||
|       "hash" : "4a14c100c5b78282712dd2cc619d72b4" | ||||
|     }, | ||||
|     "app-paste-dark-large"         : { | ||||
|       "name" : "app-paste-dark-large", | ||||
|       "rule" : ".app-paste-dark-large", | ||||
|       "hash" : "f566e3e0c8e6a17b7c2fc4168b079ede" | ||||
|       "hash" : "03d3dded4964e60771c8a45549e13973" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "34333bbb31fb3909461cc064ea2f72e9" | ||||
|       "hash" : "507192b6a41abdc1a886a144cc315326" | ||||
|     }, | ||||
|     "app-paste-light-large"        : { | ||||
|       "name" : "app-paste-light-large", | ||||
|       "rule" : ".app-paste-light-large", | ||||
|       "hash" : "e77a206e1cbaf1417b4a0b9f3d67380a" | ||||
|       "hash" : "66f1f8fe7acafaab5f608598589aaa5c" | ||||
|     }, | ||||
|     "app-people-blue-large"        : { | ||||
|       "name" : "app-people-blue-large", | ||||
|       "rule" : ".app-people-blue-large, .phabricator-crumb-view:hover .app-people-dark-large", | ||||
|       "hash" : "37fcac5bc4ad63c37d68da2c77717301" | ||||
|       "hash" : "ed242e94b2b5698fd90261ca63aef8a6" | ||||
|     }, | ||||
|     "app-people-dark-large"        : { | ||||
|       "name" : "app-people-dark-large", | ||||
|       "rule" : ".app-people-dark-large", | ||||
|       "hash" : "01fb27eba95c01d1aadde04ea4513caa" | ||||
|       "hash" : "b1748b3a5afacd4f8afcd5ea37352dc7" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "6d859c1505f5877b86faf34385bbcd59" | ||||
|       "hash" : "ed1b2d2d27ae8fd07d0e5e1d4002625e" | ||||
|     }, | ||||
|     "app-people-light-large"       : { | ||||
|       "name" : "app-people-light-large", | ||||
|       "rule" : ".app-people-light-large", | ||||
|       "hash" : "d1d80fddc9e6295494d12b72b4700dc5" | ||||
|       "hash" : "f6efcbdbcee02f9f37f92774b4b0e4cf" | ||||
|     }, | ||||
|     "app-phame-blue-large"         : { | ||||
|       "name" : "app-phame-blue-large", | ||||
|       "rule" : ".app-phame-blue-large, .phabricator-crumb-view:hover .app-phame-dark-large", | ||||
|       "hash" : "f72bd35227e9ba2157852377e2d87ec4" | ||||
|       "hash" : "d448b392b7bc927b9b5522d525fa8c49" | ||||
|     }, | ||||
|     "app-phame-dark-large"         : { | ||||
|       "name" : "app-phame-dark-large", | ||||
|       "rule" : ".app-phame-dark-large", | ||||
|       "hash" : "7bfe54cf7d885985fb7e06ad0abaf4e9" | ||||
|       "hash" : "a7cf2f8ec22cdb675a3bc792c7c1edf6" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "60013586092f2c5eb5ed1f58c7f02a74" | ||||
|       "hash" : "4587c25ff8a94fd48a1a0ca2e9fd9f42" | ||||
|     }, | ||||
|     "app-phame-light-large"        : { | ||||
|       "name" : "app-phame-light-large", | ||||
|       "rule" : ".app-phame-light-large", | ||||
|       "hash" : "5266f8774d0470adc65f610c9175a251" | ||||
|       "hash" : "265471ec8d3c7ddeb3c269384d22243d" | ||||
|     }, | ||||
|     "app-phid-blue-large"          : { | ||||
|       "name" : "app-phid-blue-large", | ||||
|       "rule" : ".app-phid-blue-large, .phabricator-crumb-view:hover .app-phid-dark-large", | ||||
|       "hash" : "d726ca94608547ff3974a1d49e6b1012" | ||||
|       "hash" : "b94bc233e1bcf520c65351b71794c228" | ||||
|     }, | ||||
|     "app-phid-dark-large"          : { | ||||
|       "name" : "app-phid-dark-large", | ||||
|       "rule" : ".app-phid-dark-large", | ||||
|       "hash" : "04af0c932bea8b7c36f6dc954994ea11" | ||||
|       "hash" : "f4dfdcc8e1fde50cfcb7e07376696964" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "b1e8a6e4ac9ad64d34fbc7560d507e5b" | ||||
|       "hash" : "10ec316b409b385e19800048fcb1a79e" | ||||
|     }, | ||||
|     "app-phid-light-large"         : { | ||||
|       "name" : "app-phid-light-large", | ||||
|       "rule" : ".app-phid-light-large", | ||||
|       "hash" : "0ba23a08c29e8064fdddee9112c638e3" | ||||
|       "hash" : "0087c573b07d8badaeadcb8ad560ae9b" | ||||
|     }, | ||||
|     "app-pholio-blue-large"        : { | ||||
|       "name" : "app-pholio-blue-large", | ||||
|       "rule" : ".app-pholio-blue-large, .phabricator-crumb-view:hover .app-pholio-dark-large", | ||||
|       "hash" : "08bfdf63411a09e6be88d99128c1e9f8" | ||||
|       "hash" : "5b8e3f47a49a0dee84c1b7c228884f0c" | ||||
|     }, | ||||
|     "app-pholio-dark-large"        : { | ||||
|       "name" : "app-pholio-dark-large", | ||||
|       "rule" : ".app-pholio-dark-large", | ||||
|       "hash" : "2a8bfa3870726691766fe3f6cb73df38" | ||||
|       "hash" : "4a73276e5bcd9cfbb08435ed36051dff" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "499b68a80e78ab5f6ebe5ba7470fbb4a" | ||||
|       "hash" : "aca383c3c4fcec4742a11702e3427221" | ||||
|     }, | ||||
|     "app-pholio-light-large"       : { | ||||
|       "name" : "app-pholio-light-large", | ||||
|       "rule" : ".app-pholio-light-large", | ||||
|       "hash" : "9a4d4223e6e1d7a77c4545504ea0908c" | ||||
|       "hash" : "1a3ace478c2b0f9b444005112e17c695" | ||||
|     }, | ||||
|     "app-phpast-blue-large"        : { | ||||
|       "name" : "app-phpast-blue-large", | ||||
|       "rule" : ".app-phpast-blue-large, .phabricator-crumb-view:hover .app-phpast-dark-large", | ||||
|       "hash" : "a9f4f0a62e5841b2ed669dc02694419d" | ||||
|       "hash" : "22ba8a058d6b920a909c5f6731f301a0" | ||||
|     }, | ||||
|     "app-phpast-dark-large"        : { | ||||
|       "name" : "app-phpast-dark-large", | ||||
|       "rule" : ".app-phpast-dark-large", | ||||
|       "hash" : "1dbc83cc09d722253b634f3308608627" | ||||
|       "hash" : "bdbfd96cb50a8b7450daf82576fcfe95" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "e98e4cdc93e51b0d7c1df25c01c75fac" | ||||
|       "hash" : "ce7433350eeaee95ecf358905ad38029" | ||||
|     }, | ||||
|     "app-phpast-light-large"       : { | ||||
|       "name" : "app-phpast-light-large", | ||||
|       "rule" : ".app-phpast-light-large", | ||||
|       "hash" : "c63fb0fe3cc326f1a19e4e59c42a73f7" | ||||
|       "hash" : "5ebd26eb5e0bc0229db5696020dd9b4a" | ||||
|     }, | ||||
|     "app-phriction-blue-large"     : { | ||||
|       "name" : "app-phriction-blue-large", | ||||
|       "rule" : ".app-phriction-blue-large, .phabricator-crumb-view:hover .app-phriction-dark-large", | ||||
|       "hash" : "55bbded073e078117369f42e05b5b5c4" | ||||
|       "hash" : "0134e9d694ce72a6d9c554e639a6ed50" | ||||
|     }, | ||||
|     "app-phriction-dark-large"     : { | ||||
|       "name" : "app-phriction-dark-large", | ||||
|       "rule" : ".app-phriction-dark-large", | ||||
|       "hash" : "944c3a520a484580895b287eaaa103b1" | ||||
|       "hash" : "e4f3121261bc96e00bb6b94b467582f4" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "84639b5ccba94daf1850a9449131a078" | ||||
|       "hash" : "27612f55aaa40c4178a3a5a46d225947" | ||||
|     }, | ||||
|     "app-phriction-light-large"    : { | ||||
|       "name" : "app-phriction-light-large", | ||||
|       "rule" : ".app-phriction-light-large", | ||||
|       "hash" : "2ca79fdfd141b0fe00ff8b2e13df73bf" | ||||
|       "hash" : "a56dcfca00861938d337cc2f217b33f6" | ||||
|     }, | ||||
|     "app-ponder-blue-large"        : { | ||||
|       "name" : "app-ponder-blue-large", | ||||
|       "rule" : ".app-ponder-blue-large, .phabricator-crumb-view:hover .app-ponder-dark-large", | ||||
|       "hash" : "8018fe4ebc1e9af91a8a737e0505aa5d" | ||||
|       "hash" : "1bfc2f6150bd67cc25cbe1fbc9283f9c" | ||||
|     }, | ||||
|     "app-ponder-dark-large"        : { | ||||
|       "name" : "app-ponder-dark-large", | ||||
|       "rule" : ".app-ponder-dark-large", | ||||
|       "hash" : "1da67495789c69621f91800939ea9684" | ||||
|       "hash" : "6efc0b3a74d2cc9eb5de96205613b640" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "f73a1b5a6b688c6d3feba14193357147" | ||||
|       "hash" : "9c2a2506e53e6a902976d504dfe94b46" | ||||
|     }, | ||||
|     "app-ponder-light-large"       : { | ||||
|       "name" : "app-ponder-light-large", | ||||
|       "rule" : ".app-ponder-light-large", | ||||
|       "hash" : "eb8b13c3bc35f36b14f33ef1158b71ab" | ||||
|       "hash" : "595895068b10c68b0e05234570a6a268" | ||||
|     }, | ||||
|     "app-power-blue-large"         : { | ||||
|       "name" : "app-power-blue-large", | ||||
|       "rule" : ".app-power-blue-large, .phabricator-crumb-view:hover .app-power-dark-large", | ||||
|       "hash" : "743499c84546b7b35139eec60bf74c34" | ||||
|       "hash" : "c3e03022f162f986f784b2a43c8784c7" | ||||
|     }, | ||||
|     "app-power-dark-large"         : { | ||||
|       "name" : "app-power-dark-large", | ||||
|       "rule" : ".app-power-dark-large", | ||||
|       "hash" : "1a3520a2ec255f5b7f1779ea66153ade" | ||||
|       "hash" : "52d04564ca2cc7f3a96809e827162f3e" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "3951e012561a0d5d5d2b00711b13fa9c" | ||||
|       "hash" : "3f7719f0299abef8ba900e79fb6b5015" | ||||
|     }, | ||||
|     "app-power-light-large"        : { | ||||
|       "name" : "app-power-light-large", | ||||
|       "rule" : ".app-power-light-large", | ||||
|       "hash" : "52d04bd829dfe7477a9dc2ef916990ab" | ||||
|       "hash" : "ffe9f181e6103eab9fc688ab84b07ad1" | ||||
|     }, | ||||
|     "app-projects-blue-large"      : { | ||||
|       "name" : "app-projects-blue-large", | ||||
|       "rule" : ".app-projects-blue-large, .phabricator-crumb-view:hover .app-projects-dark-large", | ||||
|       "hash" : "278113829ca3543b9377030555e04edc" | ||||
|       "hash" : "494ca64479f68588823e00609496414a" | ||||
|     }, | ||||
|     "app-projects-dark-large"      : { | ||||
|       "name" : "app-projects-dark-large", | ||||
|       "rule" : ".app-projects-dark-large", | ||||
|       "hash" : "b6f043db039d4960397f76904a84e9fc" | ||||
|       "hash" : "fa85ad644a2e289cb6bea2a67ab534f8" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "3d1bf3efdbd9ccdbb73fc3a11d5d1265" | ||||
|       "hash" : "b28bf212416595b3ba4bfb528dfaf791" | ||||
|     }, | ||||
|     "app-projects-light-large"     : { | ||||
|       "name" : "app-projects-light-large", | ||||
|       "rule" : ".app-projects-light-large", | ||||
|       "hash" : "88c73c7cb50ce7cf9cd8d33ec20c8245" | ||||
|       "hash" : "228db63ac0e80b3cef46903a003a44df" | ||||
|     }, | ||||
|     "app-repositories-blue-large"  : { | ||||
|       "name" : "app-repositories-blue-large", | ||||
|       "rule" : ".app-repositories-blue-large, .phabricator-crumb-view:hover .app-repositories-dark-large", | ||||
|       "hash" : "0642bf1118210cef9105cc463ec3d36f" | ||||
|       "hash" : "a83dd2186f9d92949f19a97f8f777a9c" | ||||
|     }, | ||||
|     "app-repositories-dark-large"  : { | ||||
|       "name" : "app-repositories-dark-large", | ||||
|       "rule" : ".app-repositories-dark-large", | ||||
|       "hash" : "c92eb4e857d74f1ef206ba5b184ad88c" | ||||
|       "hash" : "30ead88c9f018797a8d5ef2f4e4221fe" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "7fe40fbb4150dfbc6133c79578fc1494" | ||||
|       "hash" : "44b04cbf1652211fbc2046c7773b4cf2" | ||||
|     }, | ||||
|     "app-repositories-light-large" : { | ||||
|       "name" : "app-repositories-light-large", | ||||
|       "rule" : ".app-repositories-light-large", | ||||
|       "hash" : "446a7eab7b7fc07329bc21a77c438033" | ||||
|       "hash" : "bcba180d121f9269787509ba7cdd3e48" | ||||
|     }, | ||||
|     "app-settings-blue-large"      : { | ||||
|       "name" : "app-settings-blue-large", | ||||
|       "rule" : ".app-settings-blue-large, .phabricator-crumb-view:hover .app-settings-dark-large", | ||||
|       "hash" : "4d22a7f016509777bb5b55f39198d9d7" | ||||
|       "hash" : "c615df792c7e81b35cfbb78ece39e796" | ||||
|     }, | ||||
|     "app-settings-dark-large"      : { | ||||
|       "name" : "app-settings-dark-large", | ||||
|       "rule" : ".app-settings-dark-large", | ||||
|       "hash" : "55e0869a51f70cacdd72f2baad4b28ce" | ||||
|       "hash" : "6c174857e23a9d169d0cb4079aa14637" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "314ab0f607baa65ff6a684b1ddd4861d" | ||||
|       "hash" : "4d8c68dc709d99141a19aad5bc483971" | ||||
|     }, | ||||
|     "app-settings-light-large"     : { | ||||
|       "name" : "app-settings-light-large", | ||||
|       "rule" : ".app-settings-light-large", | ||||
|       "hash" : "41da4708f38fae918af46505e566bd6a" | ||||
|       "hash" : "e901b672f2a51ef286369bfea70a7e8d" | ||||
|     }, | ||||
|     "app-setup-blue-large"         : { | ||||
|       "name" : "app-setup-blue-large", | ||||
|       "rule" : ".app-setup-blue-large, .phabricator-crumb-view:hover .app-setup-dark-large", | ||||
|       "hash" : "74d2ba681cdad54b31d53f7c174f5826" | ||||
|       "hash" : "a2f8f470c3cd928e8c1a6959ff745789" | ||||
|     }, | ||||
|     "app-setup-dark-large"         : { | ||||
|       "name" : "app-setup-dark-large", | ||||
|       "rule" : ".app-setup-dark-large", | ||||
|       "hash" : "89a94fe1ce36351d3ea81f1776fb061a" | ||||
|       "hash" : "3183fafc1dc05b851ba902ace2dfa34d" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "53942c73b14210f5bf0bfad68bcb4431" | ||||
|       "hash" : "d91b7e5480cb4296871b9f1c4c634256" | ||||
|     }, | ||||
|     "app-setup-light-large"        : { | ||||
|       "name" : "app-setup-light-large", | ||||
|       "rule" : ".app-setup-light-large", | ||||
|       "hash" : "890dd2d7cb1e51992b202dd462d56ba6" | ||||
|       "hash" : "419829d244a85f97d67fb45c6febd4e5" | ||||
|     }, | ||||
|     "app-slowvote-blue-large"      : { | ||||
|       "name" : "app-slowvote-blue-large", | ||||
|       "rule" : ".app-slowvote-blue-large, .phabricator-crumb-view:hover .app-slowvote-dark-large", | ||||
|       "hash" : "12299956375e7f382217ebf8c1cb8203" | ||||
|       "hash" : "941028e7abbe491e2911fb24c4a8edca" | ||||
|     }, | ||||
|     "app-slowvote-dark-large"      : { | ||||
|       "name" : "app-slowvote-dark-large", | ||||
|       "rule" : ".app-slowvote-dark-large", | ||||
|       "hash" : "ce57e4a318e4e8d556f713b459e6d798" | ||||
|       "hash" : "6197df3550b652011bc1a8da00005059" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "dcd5be64ded69e0fdfee5364367c9b55" | ||||
|       "hash" : "43783af8df4f99e94f0989ca149264f2" | ||||
|     }, | ||||
|     "app-slowvote-light-large"     : { | ||||
|       "name" : "app-slowvote-light-large", | ||||
|       "rule" : ".app-slowvote-light-large", | ||||
|       "hash" : "7ac2515f26b194a9fafaa6a27997be2a" | ||||
|       "hash" : "23eb39153b5ac9b5bd91c8b800023d93" | ||||
|     }, | ||||
|     "app-uiexamples-blue-large"    : { | ||||
|       "name" : "app-uiexamples-blue-large", | ||||
|       "rule" : ".app-uiexamples-blue-large, .phabricator-crumb-view:hover .app-uiexamples-dark-large", | ||||
|       "hash" : "7add7df6b621c4af5322160bc1cd31b2" | ||||
|       "hash" : "eabac7f7b83c47618a5f72b6f30b6410" | ||||
|     }, | ||||
|     "app-uiexamples-dark-large"    : { | ||||
|       "name" : "app-uiexamples-dark-large", | ||||
|       "rule" : ".app-uiexamples-dark-large", | ||||
|       "hash" : "d8563a5f06692a313a2eff11235d5d0d" | ||||
|       "hash" : "31c9fb99289cc73aae73f3acad66b449" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "0532cdd91b6de17ab194bd29cacfc24f" | ||||
|       "hash" : "069e59208dad509a6c3d74d102f08ae8" | ||||
|     }, | ||||
|     "app-uiexamples-light-large"   : { | ||||
|       "name" : "app-uiexamples-light-large", | ||||
|       "rule" : ".app-uiexamples-light-large", | ||||
|       "hash" : "ee40dd0e3168f8e7fb520665a1d50f95" | ||||
|       "hash" : "b384102bcee1b312b2e06abc5f4b27de" | ||||
|     } | ||||
|   }, | ||||
|   "scales"  : [ | ||||
|   | ||||
| @@ -4,197 +4,197 @@ | ||||
|     "app-application-dark"  : { | ||||
|       "name" : "app-application-dark", | ||||
|       "rule" : ".app-application-dark", | ||||
|       "hash" : "60e228106718bf6f3ee5024400d31f24" | ||||
|       "hash" : "89f861c28e97878311885623cff3d314" | ||||
|     }, | ||||
|     "app-audit-dark"        : { | ||||
|       "name" : "app-audit-dark", | ||||
|       "rule" : ".app-audit-dark", | ||||
|       "hash" : "38339b9cc4e39cbbbea36dcf039873bb" | ||||
|       "hash" : "2c141bc445c4fe62986cd6cff0c29b36" | ||||
|     }, | ||||
|     "app-calendar-dark"     : { | ||||
|       "name" : "app-calendar-dark", | ||||
|       "rule" : ".app-calendar-dark", | ||||
|       "hash" : "756d60566639ad1424444436a95c6a3f" | ||||
|       "hash" : "04c61a081986f0d38cf27fc4e18bce40" | ||||
|     }, | ||||
|     "app-conduit-dark"      : { | ||||
|       "name" : "app-conduit-dark", | ||||
|       "rule" : ".app-conduit-dark", | ||||
|       "hash" : "01fba8ca32f1cfefb3516b45c9d28b40" | ||||
|       "hash" : "7b410e96c87e7818fb93bdfa2ed9368f" | ||||
|     }, | ||||
|     "app-conpherence-dark"  : { | ||||
|       "name" : "app-conpherence-dark", | ||||
|       "rule" : ".app-conpherence-dark", | ||||
|       "hash" : "dbb6fdd5f082a604b4ef10b7eeedbfa2" | ||||
|       "hash" : "6d65bc8da41c3a59822b31f68b9b883c" | ||||
|     }, | ||||
|     "app-countdown-dark"    : { | ||||
|       "name" : "app-countdown-dark", | ||||
|       "rule" : ".app-countdown-dark", | ||||
|       "hash" : "625f2589ee491aead58aaa5b965a7451" | ||||
|       "hash" : "8891502317896beea6a5f9ec87eb5e2e" | ||||
|     }, | ||||
|     "app-daemon-dark"       : { | ||||
|       "name" : "app-daemon-dark", | ||||
|       "rule" : ".app-daemon-dark", | ||||
|       "hash" : "4472be3242150f06ea5bf7b45333c4c5" | ||||
|       "hash" : "23a9a2927b368e2328dd70f95c5b1a07" | ||||
|     }, | ||||
|     "app-differential-dark" : { | ||||
|       "name" : "app-differential-dark", | ||||
|       "rule" : ".app-differential-dark", | ||||
|       "hash" : "508401fe36d9636bdcbdcbcae253c152" | ||||
|       "hash" : "bb7032f3c17901f242f9bbbcdc9a721c" | ||||
|     }, | ||||
|     "app-diffusion-dark"    : { | ||||
|       "name" : "app-diffusion-dark", | ||||
|       "rule" : ".app-diffusion-dark", | ||||
|       "hash" : "0a6f8c85079c4a325430197adb05967c" | ||||
|       "hash" : "46ab6648a6ae04e4fd1a28a9afcc4996" | ||||
|     }, | ||||
|     "app-diviner-dark"      : { | ||||
|       "name" : "app-diviner-dark", | ||||
|       "rule" : ".app-diviner-dark", | ||||
|       "hash" : "08872eb1c6bb51b9727290f6fa802633" | ||||
|       "hash" : "e21a74e866a6fc22a991b8df6efc3ca7" | ||||
|     }, | ||||
|     "app-drydock-dark"      : { | ||||
|       "name" : "app-drydock-dark", | ||||
|       "rule" : ".app-drydock-dark", | ||||
|       "hash" : "d50309da57021c676774f9bdc68c5fe7" | ||||
|       "hash" : "ed44013d98257a23306bad9c6b24760d" | ||||
|     }, | ||||
|     "app-fact-dark"         : { | ||||
|       "name" : "app-fact-dark", | ||||
|       "rule" : ".app-fact-dark", | ||||
|       "hash" : "0c1be568e1ac05fca814718600190369" | ||||
|       "hash" : "f373f38e784289b866ab914471c342ec" | ||||
|     }, | ||||
|     "app-feed-dark"         : { | ||||
|       "name" : "app-feed-dark", | ||||
|       "rule" : ".app-feed-dark", | ||||
|       "hash" : "830232709eedbe6ce7cdbcebf182c86c" | ||||
|       "hash" : "c4f1765e70615c6ee4cae6e8135fb969" | ||||
|     }, | ||||
|     "app-files-dark"        : { | ||||
|       "name" : "app-files-dark", | ||||
|       "rule" : ".app-files-dark", | ||||
|       "hash" : "00f5ab7ea3e9367e378cf9f395400ed4" | ||||
|       "hash" : "7faf45efa5b9b97e571bc66636ca1a15" | ||||
|     }, | ||||
|     "app-flags-dark"        : { | ||||
|       "name" : "app-flags-dark", | ||||
|       "rule" : ".app-flags-dark", | ||||
|       "hash" : "6382f373f7b0e70522d80ce06ef62813" | ||||
|       "hash" : "10298f695592714e27f72ef746ffd8a9" | ||||
|     }, | ||||
|     "app-help-dark"         : { | ||||
|       "name" : "app-help-dark", | ||||
|       "rule" : ".app-help-dark", | ||||
|       "hash" : "2299a14e27d76fdf66209ef0042cc84f" | ||||
|       "hash" : "5cf715cc566b98c87958793eebea5f35" | ||||
|     }, | ||||
|     "app-herald-dark"       : { | ||||
|       "name" : "app-herald-dark", | ||||
|       "rule" : ".app-herald-dark", | ||||
|       "hash" : "b2193b62df3bd4cf5c8de514a07fb6c3" | ||||
|       "hash" : "e3bc39a3dd1d66a0abf4594c608a3846" | ||||
|     }, | ||||
|     "app-home-dark"         : { | ||||
|       "name" : "app-home-dark", | ||||
|       "rule" : ".app-home-dark", | ||||
|       "hash" : "88f020497fcbcf43729aa817695b174f" | ||||
|       "hash" : "7e01fbdfa526919a2d90d2c29a6c9fa0" | ||||
|     }, | ||||
|     "app-logo-dark"         : { | ||||
|       "name" : "app-logo-dark", | ||||
|       "rule" : ".app-logo-dark", | ||||
|       "hash" : "02e71ae2421f1949f2ef075c27e052c9" | ||||
|       "hash" : "39701e1282fd120e77b09ed9fcddc686" | ||||
|     }, | ||||
|     "app-macro-dark"        : { | ||||
|       "name" : "app-macro-dark", | ||||
|       "rule" : ".app-macro-dark", | ||||
|       "hash" : "8e0e72847a8f70eb3f8e60e7fb681c06" | ||||
|       "hash" : "ef89457bcee666ad265de1659b9b8a62" | ||||
|     }, | ||||
|     "app-mail-dark"         : { | ||||
|       "name" : "app-mail-dark", | ||||
|       "rule" : ".app-mail-dark", | ||||
|       "hash" : "a2a792fddc44be4ae0f1a601380c8449" | ||||
|       "hash" : "4d05a5cd4360052183e91f61967a6c57" | ||||
|     }, | ||||
|     "app-maniphest-dark"    : { | ||||
|       "name" : "app-maniphest-dark", | ||||
|       "rule" : ".app-maniphest-dark", | ||||
|       "hash" : "ea94fc7dbb2267adc33513f78916fe90" | ||||
|       "hash" : "320da127d7f887e09965a0416d5e44d3" | ||||
|     }, | ||||
|     "app-metamta-dark"      : { | ||||
|       "name" : "app-metamta-dark", | ||||
|       "rule" : ".app-metamta-dark", | ||||
|       "hash" : "8abbb6e74d1697f950a01dcd6c8077be" | ||||
|       "hash" : "51f100c2a7a80149404dbc8b27f595a9" | ||||
|     }, | ||||
|     "app-owners-dark"       : { | ||||
|       "name" : "app-owners-dark", | ||||
|       "rule" : ".app-owners-dark", | ||||
|       "hash" : "23b948cc1d32a0968785fbfca749dcdf" | ||||
|       "hash" : "33c064dd3b7fc3f9eb934d0cf84f3af5" | ||||
|     }, | ||||
|     "app-paste-dark"        : { | ||||
|       "name" : "app-paste-dark", | ||||
|       "rule" : ".app-paste-dark", | ||||
|       "hash" : "9e0c1d1fe03aebcb55a4d19be051e255" | ||||
|       "hash" : "9482649caa8e5a46d277271092517b12" | ||||
|     }, | ||||
|     "app-people-dark"       : { | ||||
|       "name" : "app-people-dark", | ||||
|       "rule" : ".app-people-dark", | ||||
|       "hash" : "0b3995fcd043b506a408de6e25ad5292" | ||||
|       "hash" : "67245eafa79367e4e07289549cf34deb" | ||||
|     }, | ||||
|     "app-phame-dark"        : { | ||||
|       "name" : "app-phame-dark", | ||||
|       "rule" : ".app-phame-dark", | ||||
|       "hash" : "24ff4d322bce13f1c156ce5361a03a07" | ||||
|       "hash" : "029d7d48523cc43b0404bf40ccf56f8b" | ||||
|     }, | ||||
|     "app-phid-dark"         : { | ||||
|       "name" : "app-phid-dark", | ||||
|       "rule" : ".app-phid-dark", | ||||
|       "hash" : "5a0ac05bbf36a7aeb36753d093c3c9f8" | ||||
|       "hash" : "2099c2987fe3929ce1d9dec470c7699d" | ||||
|     }, | ||||
|     "app-pholio-dark"       : { | ||||
|       "name" : "app-pholio-dark", | ||||
|       "rule" : ".app-pholio-dark", | ||||
|       "hash" : "7d3befd1c12dd464a5f5edbef4574a5c" | ||||
|       "hash" : "aab47c79d2e03fdcaffb6f41dc1e0f06" | ||||
|     }, | ||||
|     "app-phpast-dark"       : { | ||||
|       "name" : "app-phpast-dark", | ||||
|       "rule" : ".app-phpast-dark", | ||||
|       "hash" : "de1ad812c7a177c844fcff626b1abebf" | ||||
|       "hash" : "e6db72b398f57d03a400c9c18bd3c412" | ||||
|     }, | ||||
|     "app-phriction-dark"    : { | ||||
|       "name" : "app-phriction-dark", | ||||
|       "rule" : ".app-phriction-dark", | ||||
|       "hash" : "8596da3f375087db6a163c98f0c968ae" | ||||
|       "hash" : "8064272206874a324d20d956c8fb10da" | ||||
|     }, | ||||
|     "app-ponder-dark"       : { | ||||
|       "name" : "app-ponder-dark", | ||||
|       "rule" : ".app-ponder-dark", | ||||
|       "hash" : "232577eb875f383f45cb9dbd9a4e3976" | ||||
|       "hash" : "abdb353635bed5cfd48a176b4340022f" | ||||
|     }, | ||||
|     "app-power-dark"        : { | ||||
|       "name" : "app-power-dark", | ||||
|       "rule" : ".app-power-dark", | ||||
|       "hash" : "e3708b1b4bfdfc614d9cf630943e5bef" | ||||
|       "hash" : "d3e943d1267206963d8f9419629c5581" | ||||
|     }, | ||||
|     "app-projects-dark"     : { | ||||
|       "name" : "app-projects-dark", | ||||
|       "rule" : ".app-projects-dark", | ||||
|       "hash" : "5e799f1e95ecfd33cb67b6e4ac992043" | ||||
|       "hash" : "6bd7c598e2f2cf0b77918a7b0fa8bd19" | ||||
|     }, | ||||
|     "app-repositories-dark" : { | ||||
|       "name" : "app-repositories-dark", | ||||
|       "rule" : ".app-repositories-dark", | ||||
|       "hash" : "736066962e96df88eacc04d734613a0e" | ||||
|       "hash" : "db2823a16dae198145f53e8021170740" | ||||
|     }, | ||||
|     "app-settings-dark"     : { | ||||
|       "name" : "app-settings-dark", | ||||
|       "rule" : ".app-settings-dark", | ||||
|       "hash" : "2fadcf918fb084bd3452712f700ae1a0" | ||||
|       "hash" : "1c84d22b769730d9e8b6fcd3414de72c" | ||||
|     }, | ||||
|     "app-setup-dark"        : { | ||||
|       "name" : "app-setup-dark", | ||||
|       "rule" : ".app-setup-dark", | ||||
|       "hash" : "061b80f3555ade1c36934474b61fe76b" | ||||
|       "hash" : "27db76695d99be0c25368dc9e0932b17" | ||||
|     }, | ||||
|     "app-slowvote-dark"     : { | ||||
|       "name" : "app-slowvote-dark", | ||||
|       "rule" : ".app-slowvote-dark", | ||||
|       "hash" : "e51cc1e6887f2deaff02d9c60aae36e0" | ||||
|       "hash" : "0d5861fab4562ad21242e34f9a29a33e" | ||||
|     }, | ||||
|     "app-uiexamples-dark"   : { | ||||
|       "name" : "app-uiexamples-dark", | ||||
|       "rule" : ".app-uiexamples-dark", | ||||
|       "hash" : "dd919fd2c10e7d1e0915f523ac3922ce" | ||||
|       "hash" : "6416a3d9d9007673ee558433b80692a1" | ||||
|     } | ||||
|   }, | ||||
|   "scales"  : [ | ||||
|   | ||||
| @@ -4,72 +4,72 @@ | ||||
|     "conpher_calendar_off"     : { | ||||
|       "name" : "conpher_calendar_off", | ||||
|       "rule" : ".conpher_calendar_off", | ||||
|       "hash" : "a8228ab90fd90f4c2500d9285179bf26" | ||||
|       "hash" : "9ead08702b8028d28aedfa1a0dfbe43a" | ||||
|     }, | ||||
|     "conpher_calendar_on"      : { | ||||
|       "name" : "conpher_calendar_on", | ||||
|       "rule" : ".conpher_calendar_on, .device-desktop .conpher_calendar_off:hover ", | ||||
|       "hash" : "931243bc3c414782ddb2d1d9607908ba" | ||||
|       "hash" : "f00d0854260ab1bc1a9b4f7f21a64f56" | ||||
|     }, | ||||
|     "conpher_conversation_off" : { | ||||
|       "name" : "conpher_conversation_off", | ||||
|       "rule" : ".conpher_conversation_off", | ||||
|       "hash" : "931abb0377898297a9a603a6d280b977" | ||||
|       "hash" : "97f9e8131c741dbba8091a92776036dd" | ||||
|     }, | ||||
|     "conpher_conversation_on"  : { | ||||
|       "name" : "conpher_conversation_on", | ||||
|       "rule" : ".conpher_conversation_on, .device-desktop .conpher_conversation_off:hover ", | ||||
|       "hash" : "0b8a39dc5019dac1975b7be2ca0ccbfa" | ||||
|       "hash" : "01d5bae305a37debbc44f4131f0863dc" | ||||
|     }, | ||||
|     "conpher_files_off"        : { | ||||
|       "name" : "conpher_files_off", | ||||
|       "rule" : ".conpher_files_off", | ||||
|       "hash" : "de1aee01b9b47b354e6ac280ae68bae1" | ||||
|       "hash" : "b6a89827978cf06618d4ba572953049a" | ||||
|     }, | ||||
|     "conpher_files_on"         : { | ||||
|       "name" : "conpher_files_on", | ||||
|       "rule" : ".conpher_files_on, .device-desktop .conpher_files_off:hover ", | ||||
|       "hash" : "9ccbbd5e86fd4ec87a11aee0c9ec8c60" | ||||
|       "hash" : "05f38d8b45077a8a9b5bd21ecc15f958" | ||||
|     }, | ||||
|     "conpher_list_off"         : { | ||||
|       "name" : "conpher_list_off", | ||||
|       "rule" : ".conpher_list_off", | ||||
|       "hash" : "2611311d0c2aec04416433be74d3a30e" | ||||
|       "hash" : "6f9b685a553e58aa67668494a88f864c" | ||||
|     }, | ||||
|     "conpher_list_on"          : { | ||||
|       "name" : "conpher_list_on", | ||||
|       "rule" : ".conpher_list_on, .device-desktop .conpher_list_off:hover ", | ||||
|       "hash" : "cee6de0301c84b0d195282642642afa0" | ||||
|       "hash" : "7d495ee16be1162affd3a480ee4b86d4" | ||||
|     }, | ||||
|     "conpher_more_off"         : { | ||||
|       "name" : "conpher_more_off", | ||||
|       "rule" : ".conpher_more_off", | ||||
|       "hash" : "3b7099bdde20a13864b48552b11e92c3" | ||||
|       "hash" : "c65da03207be1e69ceaa09f15a95d8f4" | ||||
|     }, | ||||
|     "conpher_more_on"          : { | ||||
|       "name" : "conpher_more_on", | ||||
|       "rule" : ".conpher_more_on, .device-desktop .conpher_more_off:hover ", | ||||
|       "hash" : "b146f0cff9c2e5f0b57f7ebcfe0704d3" | ||||
|       "hash" : "70464cdbd30a77cad597c593ca40ab1f" | ||||
|     }, | ||||
|     "conpher_people_off"       : { | ||||
|       "name" : "conpher_people_off", | ||||
|       "rule" : ".conpher_people_off", | ||||
|       "hash" : "641a6a21aa32a12416e85caf8a22e340" | ||||
|       "hash" : "a40f1f129d2e3c33134a4103161c0792" | ||||
|     }, | ||||
|     "conpher_people_on"        : { | ||||
|       "name" : "conpher_people_on", | ||||
|       "rule" : ".conpher_people_on, .device-desktop .conpher_people_off:hover ", | ||||
|       "hash" : "f13745fd7036564eefb1c0ebc3502a92" | ||||
|       "hash" : "fd99a5b329ebe0144acc8fe669f0d936" | ||||
|     }, | ||||
|     "conpher_settings_off"     : { | ||||
|       "name" : "conpher_settings_off", | ||||
|       "rule" : ".conpher_settings_off", | ||||
|       "hash" : "aa9ab000d9e33e3c50c2fe70367f30b4" | ||||
|       "hash" : "e4b389edbeb7825e4304faf7d20f7469" | ||||
|     }, | ||||
|     "conpher_settings_on"      : { | ||||
|       "name" : "conpher_settings_on", | ||||
|       "rule" : ".conpher_settings_on, .device-desktop .conpher_settings_off:hover ", | ||||
|       "hash" : "a5fe22965997f9559800ca7db5ea32c8" | ||||
|       "hash" : "8ad76234fffb3f4cc59238ec3b4a6999" | ||||
|     } | ||||
|   }, | ||||
|   "scales"  : [ | ||||
|   | ||||
| @@ -4,67 +4,67 @@ | ||||
|     "gradient-black-dark"      : { | ||||
|       "name" : "gradient-black-dark", | ||||
|       "rule" : ".gradient-black-dark, button.black, a.black, a.black:visited", | ||||
|       "hash" : "17425d8c9c53672ab2edbd236e6efd7a" | ||||
|       "hash" : "b9faf8505427bb14a8c51324e13e2f81" | ||||
|     }, | ||||
|     "gradient-black-light"     : { | ||||
|       "name" : "gradient-black-light", | ||||
|       "rule" : ".gradient-black-light, button.black:active, a.black:active", | ||||
|       "hash" : "c4fb2231553d2894fd2c97beaa8bfe39" | ||||
|       "hash" : "812c3375d00ccc93c36c6df2eb565df4" | ||||
|     }, | ||||
|     "gradient-blue-dark"       : { | ||||
|       "name" : "gradient-blue-dark", | ||||
|       "rule" : ".gradient-blue-dark, button, a.button, a.button:visited, input.inputsubmit", | ||||
|       "hash" : "f467612edcdbf984672287c6086492c4" | ||||
|       "hash" : "adc2d0f7397374936384014c5d78550d" | ||||
|     }, | ||||
|     "gradient-blue-light"      : { | ||||
|       "name" : "gradient-blue-light", | ||||
|       "rule" : ".gradient-blue-light, button:active, a.button:active", | ||||
|       "hash" : "471d47c102def6db46b345310aac5a03" | ||||
|       "hash" : "91b841067a63e543a4dcd9d41e0a2e5c" | ||||
|     }, | ||||
|     "gradient-breadcrumbs"     : { | ||||
|       "name" : "gradient-breadcrumbs", | ||||
|       "rule" : ".gradient-breadcrumbs", | ||||
|       "hash" : "3d0f8634df5bc29eaf2a5a01bae79cf1" | ||||
|       "hash" : "688ab77f50cfbc17ec30d798efb1b39e" | ||||
|     }, | ||||
|     "gradient-dark-menu-label" : { | ||||
|       "name" : "gradient-dark-menu-label", | ||||
|       "rule" : ".gradient-dark-menu-label, .phabricator-dark-menu .phabricator-menu-item-type-label", | ||||
|       "hash" : "e0d4a455142f9c4745d36ad8b7dd3f78" | ||||
|       "hash" : "89a908596142d38fbe61a706694cd321" | ||||
|     }, | ||||
|     "gradient-green-dark"      : { | ||||
|       "name" : "gradient-green-dark", | ||||
|       "rule" : ".gradient-green-dark, button.green, a.green, a.green:visited", | ||||
|       "hash" : "a6719fe55b2b0e527ed32985691eab34" | ||||
|       "hash" : "0d19ab593772b6b406c0db309b3a14fb" | ||||
|     }, | ||||
|     "gradient-green-light"     : { | ||||
|       "name" : "gradient-green-light", | ||||
|       "rule" : ".gradient-green-light, button.green:active, a.green:active", | ||||
|       "hash" : "124969cc7805bbd754005bc702e24c54" | ||||
|       "hash" : "71c67916327ec7fc65149ab72c3a2924" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "fac28a773098fc62bf571e12b843f71a" | ||||
|       "hash" : "32651902d28d37dca01cf067072c39c0" | ||||
|     }, | ||||
|     "gradient-grey-light"      : { | ||||
|       "name" : "gradient-grey-light", | ||||
|       "rule" : ".gradient-grey-light, button.grey:active, a.grey:active, button.grey_active, a.dropdown-open", | ||||
|       "hash" : "83c6128f59fc2e426c912c2f73f5b92b" | ||||
|       "hash" : "c3c9ee1ed6f800a4ac86910b94687877" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "e6e064156d66952180e99b00996ffc38" | ||||
|       "hash" : "856380207ac8c5cb6770d44dceb245a8" | ||||
|     }, | ||||
|     "gradient-menu-label"      : { | ||||
|       "name" : "gradient-menu-label", | ||||
|       "rule" : ".gradient-menu-label, .phabricator-side-menu .phabricator-menu-item-type-label", | ||||
|       "hash" : "04b9943f5b06c8cb21fe6b96714e6662" | ||||
|       "hash" : "8ad8352b077ae02820ebbbae26dc669b" | ||||
|     }, | ||||
|     "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", | ||||
|       "hash" : "9b4b039fba177b90bc26f0e6eece339d" | ||||
|       "hash" : "815bafb94e11c23e1a419ea85dcae113" | ||||
|     } | ||||
|   }, | ||||
|   "scales"  : [ | ||||
|   | ||||
| @@ -4,52 +4,52 @@ | ||||
|     "app"              : { | ||||
|       "name" : "app", | ||||
|       "rule" : ".menu-icon-app", | ||||
|       "hash" : "fc525b5b3e3ecaeda3baccc18ace5a0a" | ||||
|       "hash" : "a389f99d9c00f688e625da71579ee90a" | ||||
|     }, | ||||
|     "arrow-right"      : { | ||||
|       "name" : "arrow-right", | ||||
|       "rule" : ".phabricator-crumb-divider", | ||||
|       "hash" : "50180da0aed206c9db2bc1547c1a158c" | ||||
|       "hash" : "a994209450dc73a80841cdd66bb59925" | ||||
|     }, | ||||
|     "conf-hover"       : { | ||||
|       "name" : "conf-hover", | ||||
|       "rule" : ".alert-notifications:hover .phabricator-main-menu-message-icon", | ||||
|       "hash" : "febc4135b2821ae2d3f0b06aa295ca0d" | ||||
|       "hash" : "93d734a7e87293c4fcb24f7096ed79f9" | ||||
|     }, | ||||
|     "conf-off"         : { | ||||
|       "name" : "conf-off", | ||||
|       "rule" : ".alert-notifications .phabricator-main-menu-message-icon", | ||||
|       "hash" : "dc1b05cb611eaef76a09e8cff698c99d" | ||||
|       "hash" : "967b7aeaccc0ed5ffe9193f7c6c6f94d" | ||||
|     }, | ||||
|     "conf-unseen"      : { | ||||
|       "name" : "conf-unseen", | ||||
|       "rule" : ".alert-notifications.message-unread .phabricator-main-menu-message-icon", | ||||
|       "hash" : "1f7d54b2b9781099f867b100ebdd6c6a" | ||||
|       "hash" : "034860de0f2e4ed924384a019077a094" | ||||
|     }, | ||||
|     "eye"              : { | ||||
|       "name" : "eye", | ||||
|       "rule" : ".menu-icon-eye", | ||||
|       "hash" : "553eb617c19b74b428558e606ff9b066" | ||||
|       "hash" : "d598b1acb1933a86eaed3dea3347f7b0" | ||||
|     }, | ||||
|     "logo"             : { | ||||
|       "name" : "logo", | ||||
|       "rule" : ".phabricator-main-menu-logo-image", | ||||
|       "hash" : "6eadea2c3dd2ada989eba22b6769b3eb" | ||||
|       "hash" : "c6c7ab165dce13a51ef329928c7c4aba" | ||||
|     }, | ||||
|     "seen_have_unread" : { | ||||
|       "name" : "seen_have_unread", | ||||
|       "rule" : ".alert-notifications:hover .phabricator-main-menu-alert-icon", | ||||
|       "hash" : "03a02951857811c722732dcfff9d458e" | ||||
|       "hash" : "a8a7f07caa726d7e61ef3d41f959d94d" | ||||
|     }, | ||||
|     "seen_read_all"    : { | ||||
|       "name" : "seen_read_all", | ||||
|       "rule" : ".alert-notifications .phabricator-main-menu-alert-icon", | ||||
|       "hash" : "f166fc60ed7a7a8ec2f41ab1af2cb3ec" | ||||
|       "hash" : "4fdd4807d0c41bd4179dd43150c7fc44" | ||||
|     }, | ||||
|     "unseen_any"       : { | ||||
|       "name" : "unseen_any", | ||||
|       "rule" : ".alert-notifications.alert-unread .phabricator-main-menu-alert-icon", | ||||
|       "hash" : "a8643b150166a076e81a42e5893a899f" | ||||
|       "hash" : "50d946952c73028b34e0c3378ca36b17" | ||||
|     } | ||||
|   }, | ||||
|   "scales"  : [ | ||||
|   | ||||
							
								
								
									
										90
									
								
								resources/sprite/manifest/tokens.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,90 @@ | ||||
| { | ||||
|   "version" : 1, | ||||
|   "sprites" : { | ||||
|     "token-coin-1"  : { | ||||
|       "name" : "token-coin-1", | ||||
|       "rule" : ".token-coin-1", | ||||
|       "hash" : "124174168031b47dfd98273d2d6f369a" | ||||
|     }, | ||||
|     "token-coin-2"  : { | ||||
|       "name" : "token-coin-2", | ||||
|       "rule" : ".token-coin-2", | ||||
|       "hash" : "a4811c8387caec31e4a313b32abe7026" | ||||
|     }, | ||||
|     "token-coin-3"  : { | ||||
|       "name" : "token-coin-3", | ||||
|       "rule" : ".token-coin-3", | ||||
|       "hash" : "0ecd0e9e5cce27e059a68ceb80e57e3b" | ||||
|     }, | ||||
|     "token-coin-4"  : { | ||||
|       "name" : "token-coin-4", | ||||
|       "rule" : ".token-coin-4", | ||||
|       "hash" : "d88e727312274f4bd534ee5314fba833" | ||||
|     }, | ||||
|     "token-heart-1" : { | ||||
|       "name" : "token-heart-1", | ||||
|       "rule" : ".token-heart-1", | ||||
|       "hash" : "433df7ae11d6651a1f5d6f1c94a85c98" | ||||
|     }, | ||||
|     "token-heart-2" : { | ||||
|       "name" : "token-heart-2", | ||||
|       "rule" : ".token-heart-2", | ||||
|       "hash" : "d582a288d9da8685f61a392aa2e288e5" | ||||
|     }, | ||||
|     "token-like-1"  : { | ||||
|       "name" : "token-like-1", | ||||
|       "rule" : ".token-like-1", | ||||
|       "hash" : "1b1fd7b15d0ee5eb95371f7ff673025b" | ||||
|     }, | ||||
|     "token-like-2"  : { | ||||
|       "name" : "token-like-2", | ||||
|       "rule" : ".token-like-2", | ||||
|       "hash" : "2ea96cf3f0f43c9efda61a3430a49d90" | ||||
|     }, | ||||
|     "token-medal-1" : { | ||||
|       "name" : "token-medal-1", | ||||
|       "rule" : ".token-medal-1", | ||||
|       "hash" : "081e1d0e2092b8035e6d1ba1181d000e" | ||||
|     }, | ||||
|     "token-medal-2" : { | ||||
|       "name" : "token-medal-2", | ||||
|       "rule" : ".token-medal-2", | ||||
|       "hash" : "958e386989d555a9a8b86bf16ce89cb6" | ||||
|     }, | ||||
|     "token-medal-3" : { | ||||
|       "name" : "token-medal-3", | ||||
|       "rule" : ".token-medal-3", | ||||
|       "hash" : "da3459e708a19b4ee8bc1464fb2b4423" | ||||
|     }, | ||||
|     "token-medal-4" : { | ||||
|       "name" : "token-medal-4", | ||||
|       "rule" : ".token-medal-4", | ||||
|       "hash" : "84ac1a2000629dd0399f8083c4fa882b" | ||||
|     }, | ||||
|     "token-misc-1"  : { | ||||
|       "name" : "token-misc-1", | ||||
|       "rule" : ".token-misc-1", | ||||
|       "hash" : "fc021cdb987939a90c101691c9270736" | ||||
|     }, | ||||
|     "token-misc-2"  : { | ||||
|       "name" : "token-misc-2", | ||||
|       "rule" : ".token-misc-2", | ||||
|       "hash" : "cdb68aa37c891238c083dab250ea40b7" | ||||
|     }, | ||||
|     "token-misc-3"  : { | ||||
|       "name" : "token-misc-3", | ||||
|       "rule" : ".token-misc-3", | ||||
|       "hash" : "0596b11b19dcdf20e7fb2a38e9f6c704" | ||||
|     }, | ||||
|     "token-misc-4"  : { | ||||
|       "name" : "token-misc-4", | ||||
|       "rule" : ".token-misc-4", | ||||
|       "hash" : "45f756d650ee729d3593b5afb3351611" | ||||
|     } | ||||
|   }, | ||||
|   "scales"  : [ | ||||
|     1 | ||||
|   ], | ||||
|   "header"  : "\/**\n * @provides sprite-tokens-css\n * @generated\n *\/\n\n.sprite-tokens {\n  background-image: url(\/rsrc\/image\/sprite-tokens.png);\n  background-repeat: no-repeat;\n}\n\n\n", | ||||
|   "type"    : "standard" | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/coin-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 638 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/coin-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 629 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/coin-3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 632 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/coin-4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 791 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/heart-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 742 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/heart-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/like-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 659 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/like-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 719 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/medal-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 657 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/medal-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 657 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/medal-3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 653 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/medal-4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/misc-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 683 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/misc-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 716 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/misc-3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 692 B | 
							
								
								
									
										
											BIN
										
									
								
								resources/sprite/tokens_1x/misc-4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 826 B | 
							
								
								
									
										18
									
								
								resources/sql/patches/20130214.token.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | ||||
| CREATE TABLE {$NAMESPACE}_token.token_given ( | ||||
|   id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, | ||||
|   objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, | ||||
|   authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, | ||||
|   tokenPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, | ||||
|   dateCreated INT UNSIGNED NOT NULL, | ||||
|   dateModified INT UNSIGNED NOT NULL, | ||||
|   UNIQUE KEY `key_all` (objectPHID, authorPHID), | ||||
|   KEY `key_author` (authorPHID), | ||||
|   KEY `key_token` (tokenPHID) | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||||
|  | ||||
| CREATE TABLE {$NAMESPACE}_token.token_count ( | ||||
|   id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, | ||||
|   objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, | ||||
|   tokenCount INT NOT NULL, | ||||
|   UNIQUE KEY `key_objectPHID` (objectPHID) | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||||
| @@ -32,6 +32,7 @@ $sheets = array( | ||||
|   'apps' => $generator->buildAppsSheet(), | ||||
|   'conph' => $generator->buildConpherenceSheet(), | ||||
|   'apps-large' => $generator->buildAppsLargeSheet(), | ||||
|   'tokens' => $generator->buildTokenSheet(), | ||||
| // TODO: @chad: should we actually remove this? | ||||
| //  'apps-xlarge' => $generator->buildAppsXLargeSheet(), | ||||
|   'gradient' => $generator->buildGradientSheet(), | ||||
|   | ||||
| @@ -532,6 +532,13 @@ celerity_register_resource_map(array( | ||||
|     'disk' => '/rsrc/image/sprite-menu.png', | ||||
|     'type' => 'png', | ||||
|   ), | ||||
|   '/rsrc/image/sprite-tokens.png' => | ||||
|   array( | ||||
|     'hash' => '67c46fd75c885b76ecbfe46e71a476cc', | ||||
|     'uri' => '/res/67c46fd7/rsrc/image/sprite-tokens.png', | ||||
|     'disk' => '/rsrc/image/sprite-tokens.png', | ||||
|     'type' => 'png', | ||||
|   ), | ||||
|   '/rsrc/image/texture/dark-menu-hover.png' => | ||||
|   array( | ||||
|     'hash' => 'a214a732644be34872e895b338b5d639', | ||||
| @@ -2861,7 +2868,7 @@ celerity_register_resource_map(array( | ||||
|   ), | ||||
|   'phabricator-pinboard-view-css' => | ||||
|   array( | ||||
|     'uri' => '/res/fdb2470f/rsrc/css/layout/phabricator-pinboard-view.css', | ||||
|     'uri' => '/res/b954ccbf/rsrc/css/layout/phabricator-pinboard-view.css', | ||||
|     'type' => 'css', | ||||
|     'requires' => | ||||
|     array( | ||||
| @@ -3336,7 +3343,7 @@ celerity_register_resource_map(array( | ||||
|   ), | ||||
|   'sprite-conpher-css' => | ||||
|   array( | ||||
|     'uri' => '/res/89821322/rsrc/css/sprite-conph.css', | ||||
|     'uri' => '/res/f640f0c5/rsrc/css/sprite-conph.css', | ||||
|     'type' => 'css', | ||||
|     'requires' => | ||||
|     array( | ||||
| @@ -3370,6 +3377,15 @@ celerity_register_resource_map(array( | ||||
|     ), | ||||
|     'disk' => '/rsrc/css/sprite-menu.css', | ||||
|   ), | ||||
|   'sprite-tokens-css' => | ||||
|   array( | ||||
|     'uri' => '/res/9ae0de5b/rsrc/css/sprite-tokens.css', | ||||
|     'type' => 'css', | ||||
|     'requires' => | ||||
|     array( | ||||
|     ), | ||||
|     'disk' => '/rsrc/css/sprite-tokens.css', | ||||
|   ), | ||||
|   'stripe-core' => | ||||
|   array( | ||||
|     'uri' => '/res/3b0f0ad4/rsrc/js/stripe/stripe_core.js', | ||||
| @@ -3397,6 +3413,15 @@ celerity_register_resource_map(array( | ||||
|     ), | ||||
|     'disk' => '/rsrc/css/core/syntax.css', | ||||
|   ), | ||||
|   'tokens-css' => | ||||
|   array( | ||||
|     'uri' => '/res/c1f6113c/rsrc/css/application/tokens/tokens.css', | ||||
|     'type' => 'css', | ||||
|     'requires' => | ||||
|     array( | ||||
|     ), | ||||
|     'disk' => '/rsrc/css/application/tokens/tokens.css', | ||||
|   ), | ||||
| ), array( | ||||
|   'packages' => | ||||
|   array( | ||||
|   | ||||
| @@ -182,6 +182,10 @@ phutil_register_library_map(array( | ||||
|     'ConduitAPI_repository_create_Method' => 'applications/repository/conduit/ConduitAPI_repository_create_Method.php', | ||||
|     'ConduitAPI_repository_query_Method' => 'applications/repository/conduit/ConduitAPI_repository_query_Method.php', | ||||
|     'ConduitAPI_slowvote_info_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_info_Method.php', | ||||
|     'ConduitAPI_token_Method' => 'applications/tokens/conduit/ConduitAPI_token_Method.php', | ||||
|     'ConduitAPI_token_give_Method' => 'applications/tokens/conduit/ConduitAPI_token_give_Method.php', | ||||
|     'ConduitAPI_token_given_Method' => 'applications/tokens/conduit/ConduitAPI_token_given_Method.php', | ||||
|     'ConduitAPI_token_query_Method' => 'applications/tokens/conduit/ConduitAPI_token_query_Method.php', | ||||
|     'ConduitAPI_user_Method' => 'applications/people/conduit/ConduitAPI_user_Method.php', | ||||
|     'ConduitAPI_user_addstatus_Method' => 'applications/people/conduit/ConduitAPI_user_addstatus_Method.php', | ||||
|     'ConduitAPI_user_disable_Method' => 'applications/people/conduit/ConduitAPI_user_disable_Method.php', | ||||
| @@ -664,6 +668,7 @@ phutil_register_library_map(array( | ||||
|     'PhabricatorApplicationSlowvote' => 'applications/slowvote/application/PhabricatorApplicationSlowvote.php', | ||||
|     'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php', | ||||
|     'PhabricatorApplicationSubscriptions' => 'applications/subscriptions/application/PhabricatorApplicationSubscriptions.php', | ||||
|     'PhabricatorApplicationTokens' => 'applications/tokens/application/PhabricatorApplicationTokens.php', | ||||
|     'PhabricatorApplicationTransaction' => 'applications/transactions/storage/PhabricatorApplicationTransaction.php', | ||||
|     'PhabricatorApplicationTransactionComment' => 'applications/transactions/storage/PhabricatorApplicationTransactionComment.php', | ||||
|     'PhabricatorApplicationTransactionCommentEditController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php', | ||||
| @@ -1323,6 +1328,18 @@ phutil_register_library_map(array( | ||||
|     'PhabricatorTimelineIterator' => 'infrastructure/daemon/timeline/cursor/PhabricatorTimelineIterator.php', | ||||
|     'PhabricatorTimelineView' => 'view/layout/PhabricatorTimelineView.php', | ||||
|     'PhabricatorTimer' => 'applications/countdown/storage/PhabricatorTimer.php', | ||||
|     'PhabricatorToken' => 'applications/tokens/storage/PhabricatorToken.php', | ||||
|     'PhabricatorTokenController' => 'applications/tokens/controller/PhabricatorTokenController.php', | ||||
|     'PhabricatorTokenCount' => 'applications/tokens/storage/PhabricatorTokenCount.php', | ||||
|     'PhabricatorTokenDAO' => 'applications/tokens/storage/PhabricatorTokenDAO.php', | ||||
|     'PhabricatorTokenGiveController' => 'applications/tokens/controller/PhabricatorTokenGiveController.php', | ||||
|     'PhabricatorTokenGiven' => 'applications/tokens/storage/PhabricatorTokenGiven.php', | ||||
|     'PhabricatorTokenGivenController' => 'applications/tokens/controller/PhabricatorTokenGivenController.php', | ||||
|     'PhabricatorTokenGivenEditor' => 'applications/tokens/editor/PhabricatorTokenGivenEditor.php', | ||||
|     'PhabricatorTokenGivenQuery' => 'applications/tokens/query/PhabricatorTokenGivenQuery.php', | ||||
|     'PhabricatorTokenQuery' => 'applications/tokens/query/PhabricatorTokenQuery.php', | ||||
|     'PhabricatorTokenReceiverInterface' => 'applications/tokens/interface/PhabricatorTokenReceiverInterface.php', | ||||
|     'PhabricatorTokenUIEventListener' => 'applications/tokens/event/PhabricatorTokenUIEventListener.php', | ||||
|     'PhabricatorTransactionView' => 'view/layout/PhabricatorTransactionView.php', | ||||
|     'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php', | ||||
|     'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php', | ||||
| @@ -1683,6 +1700,10 @@ phutil_register_library_map(array( | ||||
|     'ConduitAPI_repository_create_Method' => 'ConduitAPI_repository_Method', | ||||
|     'ConduitAPI_repository_query_Method' => 'ConduitAPI_repository_Method', | ||||
|     'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod', | ||||
|     'ConduitAPI_token_Method' => 'ConduitAPIMethod', | ||||
|     'ConduitAPI_token_give_Method' => 'ConduitAPI_token_Method', | ||||
|     'ConduitAPI_token_given_Method' => 'ConduitAPI_token_Method', | ||||
|     'ConduitAPI_token_query_Method' => 'ConduitAPI_token_Method', | ||||
|     'ConduitAPI_user_Method' => 'ConduitAPIMethod', | ||||
|     'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method', | ||||
|     'ConduitAPI_user_disable_Method' => 'ConduitAPI_user_Method', | ||||
| @@ -1817,7 +1838,12 @@ phutil_register_library_map(array( | ||||
|     'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification', | ||||
|     'DifferentialReviewerStatsTestCase' => 'PhabricatorTestCase', | ||||
|     'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification', | ||||
|     'DifferentialRevision' => 'DifferentialDAO', | ||||
|     'DifferentialRevision' => | ||||
|     array( | ||||
|       0 => 'DifferentialDAO', | ||||
|       1 => 'PhabricatorTokenReceiverInterface', | ||||
|       2 => 'PhabricatorPolicyInterface', | ||||
|     ), | ||||
|     'DifferentialRevisionCommentListView' => 'AphrontView', | ||||
|     'DifferentialRevisionCommentView' => 'AphrontView', | ||||
|     'DifferentialRevisionDetailView' => 'AphrontView', | ||||
| @@ -2112,6 +2138,7 @@ phutil_register_library_map(array( | ||||
|     'PhabricatorApplicationSlowvote' => 'PhabricatorApplication', | ||||
|     'PhabricatorApplicationStatusView' => 'AphrontView', | ||||
|     'PhabricatorApplicationSubscriptions' => 'PhabricatorApplication', | ||||
|     'PhabricatorApplicationTokens' => 'PhabricatorApplication', | ||||
|     'PhabricatorApplicationTransaction' => | ||||
|     array( | ||||
|       0 => 'PhabricatorLiskDAO', | ||||
| @@ -2741,6 +2768,25 @@ phutil_register_library_map(array( | ||||
|     'PhabricatorTimelineIterator' => 'Iterator', | ||||
|     'PhabricatorTimelineView' => 'AphrontView', | ||||
|     'PhabricatorTimer' => 'PhabricatorCountdownDAO', | ||||
|     'PhabricatorToken' => | ||||
|     array( | ||||
|       0 => 'PhabricatorTokenDAO', | ||||
|       1 => 'PhabricatorPolicyInterface', | ||||
|     ), | ||||
|     'PhabricatorTokenController' => 'PhabricatorController', | ||||
|     'PhabricatorTokenCount' => 'PhabricatorTokenDAO', | ||||
|     'PhabricatorTokenDAO' => 'PhabricatorLiskDAO', | ||||
|     'PhabricatorTokenGiveController' => 'PhabricatorTokenController', | ||||
|     'PhabricatorTokenGiven' => | ||||
|     array( | ||||
|       0 => 'PhabricatorTokenDAO', | ||||
|       1 => 'PhabricatorPolicyInterface', | ||||
|     ), | ||||
|     'PhabricatorTokenGivenController' => 'PhabricatorTokenController', | ||||
|     'PhabricatorTokenGivenEditor' => 'PhabricatorEditor', | ||||
|     'PhabricatorTokenGivenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', | ||||
|     'PhabricatorTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', | ||||
|     'PhabricatorTokenUIEventListener' => 'PhutilEventListener', | ||||
|     'PhabricatorTransactionView' => 'AphrontView', | ||||
|     'PhabricatorTransformedFile' => 'PhabricatorFileDAO', | ||||
|     'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions', | ||||
| @@ -2853,6 +2899,7 @@ phutil_register_library_map(array( | ||||
|       1 => 'PhabricatorMarkupInterface', | ||||
|       2 => 'PhabricatorPolicyInterface', | ||||
|       3 => 'PhabricatorSubscribableInterface', | ||||
|       4 => 'PhabricatorTokenReceiverInterface', | ||||
|     ), | ||||
|     'PholioMockCommentController' => 'PholioController', | ||||
|     'PholioMockEditController' => 'PholioController', | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| <?php | ||||
|  | ||||
| final class DifferentialRevision extends DifferentialDAO { | ||||
| final class DifferentialRevision extends DifferentialDAO | ||||
|   implements PhabricatorTokenReceiverInterface, PhabricatorPolicyInterface { | ||||
|  | ||||
|   protected $title; | ||||
|   protected $originalTitle; | ||||
| @@ -311,4 +312,19 @@ final class DifferentialRevision extends DifferentialDAO { | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getCapabilities() { | ||||
|     return array( | ||||
|       PhabricatorPolicyCapability::CAN_VIEW, | ||||
|       PhabricatorPolicyCapability::CAN_EDIT, | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function getPolicy($capability) { | ||||
|     return PhabricatorPolicies::POLICY_USER; | ||||
|   } | ||||
|  | ||||
|   public function hasAutomaticCapability($capability, PhabricatorUser $user) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -58,7 +58,10 @@ final class DifferentialRevisionDetailView extends AphrontView { | ||||
|       $actions->addAction($obj); | ||||
|     } | ||||
|  | ||||
|     $properties = new PhabricatorPropertyListView(); | ||||
|     $properties = id(new PhabricatorPropertyListView()) | ||||
|       ->setUser($user) | ||||
|       ->setObject($revision); | ||||
|  | ||||
|     $status = $revision->getStatus(); | ||||
|     $local_vcs = $this->getDiff()->getSourceControlSystem(); | ||||
|  | ||||
|   | ||||
| @@ -424,7 +424,9 @@ final class ManiphestTaskDetailController extends ManiphestController { | ||||
|  | ||||
|     $viewer = $this->getRequest()->getUser(); | ||||
|  | ||||
|     $view = new PhabricatorPropertyListView(); | ||||
|     $view = id(new PhabricatorPropertyListView()) | ||||
|       ->setUser($viewer) | ||||
|       ->setObject($task); | ||||
|  | ||||
|     $view->addProperty( | ||||
|       pht('Assigned To'), | ||||
| @@ -511,6 +513,8 @@ final class ManiphestTaskDetailController extends ManiphestController { | ||||
|         $file_view->render()); | ||||
|     } | ||||
|  | ||||
|     $view->invokeWillRenderEvent(); | ||||
|  | ||||
|     if (strlen($task->getDescription())) { | ||||
|       $view->addSectionHeader(pht('Description')); | ||||
|       $view->addTextContent( | ||||
|   | ||||
| @@ -4,7 +4,10 @@ | ||||
|  * @group maniphest | ||||
|  */ | ||||
| final class ManiphestTask extends ManiphestDAO | ||||
|   implements PhabricatorMarkupInterface { | ||||
|   implements | ||||
|     PhabricatorMarkupInterface, | ||||
|     PhabricatorPolicyInterface, | ||||
|     PhabricatorTokenReceiverInterface { | ||||
|  | ||||
|   const MARKUP_FIELD_DESCRIPTION = 'markup:desc'; | ||||
|  | ||||
| @@ -261,4 +264,23 @@ final class ManiphestTask extends ManiphestDAO | ||||
|     return (bool)$this->getID(); | ||||
|   } | ||||
|  | ||||
|  | ||||
| /* -(  Policy Interface  )--------------------------------------------------- */ | ||||
|  | ||||
|  | ||||
|   public function getCapabilities() { | ||||
|     return array( | ||||
|       PhabricatorPolicyCapability::CAN_VIEW, | ||||
|       PhabricatorPolicyCapability::CAN_EDIT, | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function getPolicy($capability) { | ||||
|     return PhabricatorPolicies::POLICY_USER; | ||||
|   } | ||||
|  | ||||
|   public function hasAutomaticCapability($capability, PhabricatorUser $user) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -122,7 +122,9 @@ final class PholioMockViewController extends PholioController { | ||||
|  | ||||
|     $user = $this->getRequest()->getUser(); | ||||
|  | ||||
|     $properties = new PhabricatorPropertyListView(); | ||||
|     $properties = id(new PhabricatorPropertyListView()) | ||||
|       ->setUser($user) | ||||
|       ->setObject($mock); | ||||
|  | ||||
|     $properties->addProperty( | ||||
|       pht('Author'), | ||||
| @@ -154,6 +156,8 @@ final class PholioMockViewController extends PholioController { | ||||
|       pht('Subscribers'), | ||||
|       $sub_view); | ||||
|  | ||||
|     $properties->invokeWillRenderEvent(); | ||||
|  | ||||
|     $properties->addTextContent( | ||||
|       $engine->getOutput($mock, PholioMock::MARKUP_FIELD_DESCRIPTION)); | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,8 @@ final class PholioMock extends PholioDAO | ||||
|   implements | ||||
|     PhabricatorMarkupInterface, | ||||
|     PhabricatorPolicyInterface, | ||||
|     PhabricatorSubscribableInterface { | ||||
|     PhabricatorSubscribableInterface, | ||||
|     PhabricatorTokenReceiverInterface { | ||||
|  | ||||
|   const MARKUP_FIELD_DESCRIPTION  = 'markup:description'; | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,45 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorApplicationTokens extends PhabricatorApplication { | ||||
|  | ||||
|   public function getName() { | ||||
|     return pht('Tokens'); | ||||
|   } | ||||
|  | ||||
|   public function isBeta() { | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   public function getBaseURI() { | ||||
|     return '/token/'; | ||||
|   } | ||||
|  | ||||
|   public function getTitleGlyph() { | ||||
|     return "\xE2\x99\xA6"; | ||||
|   } | ||||
|  | ||||
|   public function getShortDescription() { | ||||
|     return pht('Acquire Trinkets'); | ||||
|   } | ||||
|  | ||||
|   public function getApplicationGroup() { | ||||
|     return self::GROUP_UTILITIES; | ||||
|   } | ||||
|  | ||||
|   public function getRoutes() { | ||||
|     return array( | ||||
|       '/token/' => array( | ||||
|         '' => 'PhabricatorTokenGivenController', | ||||
|         'given/' => 'PhabricatorTokenGivenController', | ||||
|         'give/(?<phid>[^/]+)/' => 'PhabricatorTokenGiveController', | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function getEventListeners() { | ||||
|     return array( | ||||
|       new PhabricatorTokenUIEventListener(), | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										41
									
								
								src/applications/tokens/conduit/ConduitAPI_token_Method.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
|  | ||||
| abstract class ConduitAPI_token_Method extends ConduitAPIMethod { | ||||
|  | ||||
|   public function getMethodStatus() { | ||||
|     return self::METHOD_STATUS_UNSTABLE; | ||||
|   } | ||||
|  | ||||
|   public function buildTokenDicts(array $tokens) { | ||||
|     assert_instances_of($tokens, 'PhabricatorToken'); | ||||
|  | ||||
|     $list = array(); | ||||
|     foreach ($tokens as $token) { | ||||
|       $list[] = array( | ||||
|         'id' => $token->getID(), | ||||
|         'name' => $token->getName(), | ||||
|         'phid' => $token->getPHID(), | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     return $list; | ||||
|   } | ||||
|  | ||||
|   public function buildTokenGivenDicts(array $tokens_given) { | ||||
|     assert_instances_of($tokens_given, 'PhabricatorTokenGiven'); | ||||
|  | ||||
|     $list = array(); | ||||
|     foreach ($tokens_given as $given) { | ||||
|       $list[] = array( | ||||
|         'authorPHID'  => $given->getAuthorPHID(), | ||||
|         'objectPHID'  => $given->getObjectPHID(), | ||||
|         'tokenPHID'   => $given->getTokenPHID(), | ||||
|         'dateCreated' => $given->getDateCreated(), | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     return $list; | ||||
|   } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,37 @@ | ||||
| <?php | ||||
|  | ||||
| final class ConduitAPI_token_give_Method extends ConduitAPI_token_Method { | ||||
|  | ||||
|   public function getMethodDescription() { | ||||
|     return pht('Give or change a token.'); | ||||
|   } | ||||
|  | ||||
|   public function defineParamTypes() { | ||||
|     return array( | ||||
|       'tokenPHID'   => 'phid|null', | ||||
|       'objectPHID'  => 'phid', | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function defineErrorTypes() { | ||||
|     return array(); | ||||
|   } | ||||
|  | ||||
|   public function defineReturnType() { | ||||
|     return 'void'; | ||||
|   } | ||||
|  | ||||
|   public function execute(ConduitAPIRequest $request) { | ||||
|     $editor = id(new PhabricatorTokenGivenEditor()) | ||||
|       ->setActor($request->getUser()); | ||||
|  | ||||
|     if ($request->getValue('tokenPHID')) { | ||||
|       $editor->addToken( | ||||
|         $request->getValue('objectPHID'), | ||||
|         $request->getValue('tokenPHID')); | ||||
|     } else { | ||||
|       $editor->deleteToken($request->getValue('objectPHID')); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| <?php | ||||
|  | ||||
| final class ConduitAPI_token_given_Method extends ConduitAPI_token_Method { | ||||
|  | ||||
|   public function getMethodDescription() { | ||||
|     return pht('Query tokens given to objects.'); | ||||
|   } | ||||
|  | ||||
|   public function defineParamTypes() { | ||||
|     return array( | ||||
|       'authorPHIDs' => 'list<phid>', | ||||
|       'objectPHIDs' => 'list<phid>', | ||||
|       'tokenPHIDs'  => 'list<phid>', | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function defineErrorTypes() { | ||||
|     return array(); | ||||
|   } | ||||
|  | ||||
|   public function defineReturnType() { | ||||
|     return 'list<dict>'; | ||||
|   } | ||||
|  | ||||
|   public function execute(ConduitAPIRequest $request) { | ||||
|     $query = id(new PhabricatorTokenGivenQuery()) | ||||
|       ->setViewer($request->getUser()); | ||||
|  | ||||
|     $author_phids = $request->getValue('authorPHIDs'); | ||||
|     if ($author_phids) { | ||||
|       $query->withAuthorPHIDs($author_phids); | ||||
|     } | ||||
|  | ||||
|     $object_phids = $request->getValue('objectPHIDs'); | ||||
|     if ($object_phids) { | ||||
|       $query->withObjectPHIDs($object_phids); | ||||
|     } | ||||
|  | ||||
|     $token_phids = $request->getValue('tokenPHIDs'); | ||||
|     if ($token_phids) { | ||||
|       $query->withTokenPHIDs($token_phids); | ||||
|     } | ||||
|  | ||||
|     $given = $query->execute(); | ||||
|  | ||||
|     return $this->buildTokenGivenDicts($given); | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,30 @@ | ||||
| <?php | ||||
|  | ||||
| final class ConduitAPI_token_query_Method extends ConduitAPI_token_Method { | ||||
|  | ||||
|   public function getMethodDescription() { | ||||
|     return pht('Query tokens.'); | ||||
|   } | ||||
|  | ||||
|   public function defineParamTypes() { | ||||
|     return array(); | ||||
|   } | ||||
|  | ||||
|   public function defineReturnType() { | ||||
|     return 'list<dict>'; | ||||
|   } | ||||
|  | ||||
|   public function defineErrorTypes() { | ||||
|     return array(); | ||||
|   } | ||||
|  | ||||
|   public function execute(ConduitAPIRequest $request) { | ||||
|     $query = id(new PhabricatorTokenQuery()) | ||||
|       ->setViewer($request->getUser()); | ||||
|  | ||||
|     $tokens = $query->execute(); | ||||
|  | ||||
|     return $this->buildTokenDicts($tokens); | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,16 @@ | ||||
| <?php | ||||
|  | ||||
| abstract class PhabricatorTokenController extends PhabricatorController { | ||||
|  | ||||
|  | ||||
|   protected function buildSideNav() { | ||||
|     $nav = new AphrontSideNavFilterView(); | ||||
|     $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); | ||||
|  | ||||
|     $nav->addFilter('given/', pht('Tokens Given')); | ||||
|  | ||||
|     return $nav; | ||||
|   } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,116 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenGiveController extends PhabricatorTokenController { | ||||
|  | ||||
|   private $phid; | ||||
|  | ||||
|   public function willProcessRequest(array $data) { | ||||
|     $this->phid = $data['phid']; | ||||
|   } | ||||
|  | ||||
|   public function processRequest() { | ||||
|     $request = $this->getRequest(); | ||||
|     $user = $request->getUser(); | ||||
|  | ||||
|     $handle = PhabricatorObjectHandleData::loadOneHandle($this->phid, $user); | ||||
|     if (!$handle->isComplete()) { | ||||
|       return new Aphront404Response(); | ||||
|     } | ||||
|  | ||||
|     $current = id(new PhabricatorTokenGivenQuery()) | ||||
|       ->setViewer($user) | ||||
|       ->withAuthorPHIDs(array($user->getPHID())) | ||||
|       ->withObjectPHIDs(array($handle->getPHID())) | ||||
|       ->execute(); | ||||
|  | ||||
|     if ($current) { | ||||
|       $is_give = false; | ||||
|       $title = pht('Rescind Token'); | ||||
|     } else { | ||||
|       $is_give = true; | ||||
|       $title = pht('Give Token'); | ||||
|     } | ||||
|  | ||||
|     $done_uri = $handle->getURI(); | ||||
|     if ($request->isDialogFormPost()) { | ||||
|       if ($is_give) { | ||||
|         $token_phid = $request->getStr('tokenPHID'); | ||||
|         $editor = id(new PhabricatorTokenGivenEditor()) | ||||
|           ->setActor($user) | ||||
|           ->addToken($handle->getPHID(), $token_phid); | ||||
|       } else { | ||||
|         $editor = id(new PhabricatorTokenGivenEditor()) | ||||
|           ->setActor($user) | ||||
|           ->deleteToken($handle->getPHID()); | ||||
|       } | ||||
|  | ||||
|       return id(new AphrontReloadResponse())->setURI($done_uri); | ||||
|     } | ||||
|  | ||||
|     if ($is_give) { | ||||
|       $dialog = $this->buildGiveTokenDialog(); | ||||
|     } else { | ||||
|       $dialog = $this->buildRescindTokenDialog(head($current)); | ||||
|     } | ||||
|  | ||||
|     $dialog->setUser($user); | ||||
|     $dialog->addCancelButton($done_uri); | ||||
|  | ||||
|     return id(new AphrontDialogResponse())->setDialog($dialog); | ||||
|   } | ||||
|  | ||||
|   private function buildGiveTokenDialog() { | ||||
|     $user = $this->getRequest()->getUser(); | ||||
|  | ||||
|     $tokens = id(new PhabricatorTokenQuery()) | ||||
|       ->setViewer($user) | ||||
|       ->execute(); | ||||
|  | ||||
|     $buttons = array(); | ||||
|     $ii = 0; | ||||
|     foreach ($tokens as $token) { | ||||
|       $buttons[] = javelin_tag( | ||||
|         'button', | ||||
|         array( | ||||
|           'class' => 'token-button', | ||||
|           'name' => 'tokenPHID', | ||||
|           'value' => $token->getPHID(), | ||||
|           'type' => 'submit', | ||||
|           'sigil' => 'has-tooltip', | ||||
|           'meta' => array( | ||||
|             'tip' => $token->getName(), | ||||
|           ) | ||||
|         ), | ||||
|         $token->renderIcon()); | ||||
|       if ((++$ii % 4) == 0) { | ||||
|         $buttons[] = phutil_tag('br'); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     $buttons = phutil_tag( | ||||
|       'div', | ||||
|       array( | ||||
|         'class' => 'token-grid', | ||||
|       ), | ||||
|       $buttons); | ||||
|  | ||||
|     $dialog = new AphrontDialogView(); | ||||
|     $dialog->setTitle(pht('Give Token')); | ||||
|     $dialog->appendChild($buttons); | ||||
|  | ||||
|     return $dialog; | ||||
|   } | ||||
|  | ||||
|   private function buildRescindTokenDialog(PhabricatorTokenGiven $token_given) { | ||||
|     $dialog = new AphrontDialogView(); | ||||
|     $dialog->setTitle(pht('Rescind Token')); | ||||
|  | ||||
|     $dialog->appendChild( | ||||
|       pht('Really rescind this lovely token?')); | ||||
|  | ||||
|     $dialog->addSubmitButton(pht('Rescind Token')); | ||||
|  | ||||
|     return $dialog; | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,79 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenGivenController extends PhabricatorTokenController { | ||||
|  | ||||
|   public function processRequest() { | ||||
|     $request = $this->getRequest(); | ||||
|     $user = $request->getUser(); | ||||
|  | ||||
|     $pager = id(new AphrontCursorPagerView()) | ||||
|       ->setURI(new PhutilURI($this->getApplicationURI('/given/'))); | ||||
|  | ||||
|     $tokens_given = id(new PhabricatorTokenGivenQuery()) | ||||
|       ->setViewer($user) | ||||
|       ->setLimit(100) | ||||
|       ->executeWithCursorPager($pager); | ||||
|  | ||||
|     $handles = array(); | ||||
|     if ($tokens_given) { | ||||
|       $object_phids = mpull($tokens_given, 'getObjectPHID'); | ||||
|       $user_phids = mpull($tokens_given, 'getAuthorPHID'); | ||||
|       $handle_phids = array_merge($object_phids, $user_phids); | ||||
|       $handles = id(new PhabricatorObjectHandleData($handle_phids)) | ||||
|         ->setViewer($user) | ||||
|         ->loadHandles(); | ||||
|     } | ||||
|  | ||||
|     $tokens = array(); | ||||
|     if ($tokens_given) { | ||||
|       $token_phids = mpull($tokens_given, 'getTokenPHID'); | ||||
|       $tokens = id(new PhabricatorTokenQuery()) | ||||
|         ->setViewer($user) | ||||
|         ->withPHIDs($token_phids) | ||||
|         ->execute(); | ||||
|       $tokens = mpull($tokens, null, 'getPHID'); | ||||
|     } | ||||
|  | ||||
|     $list = new PhabricatorObjectItemListView(); | ||||
|     foreach ($tokens_given as $token_given) { | ||||
|       $handle = $handles[$token_given->getObjectPHID()]; | ||||
|       $token = idx($tokens, $token_given->getTokenPHID()); | ||||
|  | ||||
|       $item = id(new PhabricatorObjectItemView()); | ||||
|       $item->setHeader($handle->getFullName()); | ||||
|       $item->setHref($handle->getURI()); | ||||
|  | ||||
|       $item->addAttribute($token->renderIcon()); | ||||
|  | ||||
|       $item->addAttribute( | ||||
|         pht( | ||||
|           'Given by %s on %s', | ||||
|           $handles[$token_given->getAuthorPHID()]->renderLink(), | ||||
|           phabricator_date($token_given->getDateCreated(), $user))); | ||||
|  | ||||
|       $list->addItem($item); | ||||
|     } | ||||
|  | ||||
|     $title = pht('Tokens Given'); | ||||
|  | ||||
|     $nav = $this->buildSideNav(); | ||||
|     $nav->setCrumbs( | ||||
|       $this->buildApplicationCrumbs() | ||||
|         ->addCrumb( | ||||
|           id(new PhabricatorCrumbView()) | ||||
|             ->setName($title))); | ||||
|     $nav->selectFilter('given/'); | ||||
|  | ||||
|     $nav->appendChild($list); | ||||
|     $nav->appendChild($pager); | ||||
|  | ||||
|     return $this->buildApplicationPage( | ||||
|       $nav, | ||||
|       array( | ||||
|         'title' => $title, | ||||
|         'device' => true, | ||||
|       )); | ||||
|   } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,91 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenGivenEditor | ||||
|   extends PhabricatorEditor { | ||||
|  | ||||
|   public function addToken($object_phid, $token_phid) { | ||||
|     $token = $this->validateToken($token_phid); | ||||
|     $handle = $this->validateObject($object_phid); | ||||
|  | ||||
|     $actor = $this->requireActor(); | ||||
|  | ||||
|     $token_given = id(new PhabricatorTokenGiven()) | ||||
|       ->setAuthorPHID($actor->getPHID()) | ||||
|       ->setObjectPHID($handle->getPHID()) | ||||
|       ->setTokenPHID($token->getPHID()); | ||||
|  | ||||
|     $token_given->openTransaction(); | ||||
|  | ||||
|       $this->executeDeleteToken($handle); | ||||
|  | ||||
|       $token_given->save(); | ||||
|  | ||||
|       queryfx( | ||||
|         $token_given->establishConnection('w'), | ||||
|         'INSERT INTO %T (objectPHID, tokenCount) VALUES (%s, 1) | ||||
|           ON DUPLICATE KEY UPDATE tokenCount = tokenCount + 1', | ||||
|         id(new PhabricatorTokenCount())->getTableName(), | ||||
|         $handle->getPHID()); | ||||
|  | ||||
|     $token_given->saveTransaction(); | ||||
|  | ||||
|     return $token_given; | ||||
|   } | ||||
|  | ||||
|   public function deleteToken($object_phid) { | ||||
|     $handle = $this->validateObject($object_phid); | ||||
|  | ||||
|     return $this->executeDeleteToken($handle); | ||||
|   } | ||||
|  | ||||
|   private function executeDeleteToken(PhabricatorObjectHandle $handle) { | ||||
|     $actor = $this->requireActor(); | ||||
|  | ||||
|     $token_given = id(new PhabricatorTokenGiven())->loadOneWhere( | ||||
|       'authorPHID = %s AND objectPHID = %s', | ||||
|       $actor->getPHID(), | ||||
|       $handle->getPHID()); | ||||
|     if (!$token_given) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     $token_given->openTransaction(); | ||||
|  | ||||
|       $token_given->delete(); | ||||
|  | ||||
|       queryfx( | ||||
|         $token_given->establishConnection('w'), | ||||
|         'INSERT INTO %T (objectPHID, tokenCount) VALUES (%s, 0) | ||||
|           ON DUPLICATE KEY UPDATE tokenCount = tokenCount - 1', | ||||
|         id(new PhabricatorTokenCount())->getTableName(), | ||||
|         $handle->getPHID()); | ||||
|  | ||||
|     $token_given->saveTransaction(); | ||||
|   } | ||||
|  | ||||
|   private function validateToken($token_phid) { | ||||
|     $tokens = id(new PhabricatorTokenQuery()) | ||||
|       ->setViewer($this->requireActor()) | ||||
|       ->withPHIDs(array($token_phid)) | ||||
|       ->execute(); | ||||
|  | ||||
|     if (empty($tokens)) { | ||||
|       throw new Exception("No such token!"); | ||||
|     } | ||||
|  | ||||
|     return head($tokens); | ||||
|   } | ||||
|  | ||||
|   private function validateObject($object_phid) { | ||||
|     $handle = PhabricatorObjectHandleData::loadOneHandle( | ||||
|       $object_phid, | ||||
|       $this->requireActor()); | ||||
|  | ||||
|     if (!$handle->isComplete()) { | ||||
|       throw new Exception("No such object!"); | ||||
|     } | ||||
|  | ||||
|     return $handle; | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,121 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenUIEventListener | ||||
|   extends PhutilEventListener { | ||||
|  | ||||
|   public function register() { | ||||
|     $this->listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); | ||||
|     $this->listen(PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES); | ||||
|   } | ||||
|  | ||||
|   public function handleEvent(PhutilEvent $event) { | ||||
|     switch ($event->getType()) { | ||||
|       case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: | ||||
|         $this->handleActionEvent($event); | ||||
|         break; | ||||
|       case PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES: | ||||
|         $this->handlePropertyEvent($event); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private function handleActionEvent($event) { | ||||
|     $user = $event->getUser(); | ||||
|     $object = $event->getValue('object'); | ||||
|  | ||||
|     if (!$object || !$object->getPHID()) { | ||||
|       // No object, or the object has no PHID yet.. | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     if (!($object instanceof PhabricatorTokenReceiverInterface)) { | ||||
|       // This object isn't a token receiver. | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     $current = id(new PhabricatorTokenGivenQuery()) | ||||
|       ->setViewer($user) | ||||
|       ->withAuthorPHIDs(array($user->getPHID())) | ||||
|       ->withObjectPHIDs(array($object->getPHID())) | ||||
|       ->execute(); | ||||
|  | ||||
|     if (!$current) { | ||||
|       $token_action = id(new PhabricatorActionView()) | ||||
|         ->setUser($user) | ||||
|         ->setWorkflow(true) | ||||
|         ->setHref('/token/give/'.$object->getPHID().'/') | ||||
|         ->setName(pht('Give Token')) | ||||
|         ->setIcon('like'); | ||||
|     } else { | ||||
|       $token_action = id(new PhabricatorActionView()) | ||||
|         ->setUser($user) | ||||
|         ->setWorkflow(true) | ||||
|         ->setHref('/token/give/'.$object->getPHID().'/') | ||||
|         ->setName(pht('Rescind Token')) | ||||
|         ->setIcon('dislike'); | ||||
|     } | ||||
|  | ||||
|     $actions = $event->getValue('actions'); | ||||
|     $actions[] = $token_action; | ||||
|     $event->setValue('actions', $actions); | ||||
|   } | ||||
|  | ||||
|   private function handlePropertyEvent($event) { | ||||
|     $user = $event->getUser(); | ||||
|     $object = $event->getValue('object'); | ||||
|  | ||||
|     if (!$object || !$object->getPHID()) { | ||||
|       // No object, or the object has no PHID yet.. | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     if (!($object instanceof PhabricatorTokenReceiverInterface)) { | ||||
|       // This object isn't a token receiver. | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     $limit = 1; | ||||
|  | ||||
|     $tokens_given = id(new PhabricatorTokenGivenQuery()) | ||||
|       ->setViewer($user) | ||||
|       ->withObjectPHIDs(array($object->getPHID())) | ||||
|       ->execute(); | ||||
|  | ||||
|     if (!$tokens_given) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     $tokens = id(new PhabricatorTokenQuery()) | ||||
|       ->setViewer($user) | ||||
|       ->withPHIDs(mpull($tokens_given, 'getTokenPHID')) | ||||
|       ->execute(); | ||||
|     $tokens = mpull($tokens, null, 'getPHID'); | ||||
|  | ||||
|     $author_phids = mpull($tokens_given, 'getAuthorPHID'); | ||||
|     $handles = id(new PhabricatorObjectHandleData($author_phids)) | ||||
|       ->loadHandles(); | ||||
|  | ||||
|     $list = array(); | ||||
|     foreach ($tokens_given as $token_given) { | ||||
|       if (!idx($tokens, $token_given->getTokenPHID())) { | ||||
|         continue; | ||||
|       } | ||||
|  | ||||
|       $token = $tokens[$token_given->getTokenPHID()]; | ||||
|  | ||||
|       $list[] = javelin_tag( | ||||
|         'span', | ||||
|         array( | ||||
|           'sigil' => 'has-tooltip', | ||||
|           'meta' => array( | ||||
|             'tip' => $handles[$token_given->getAuthorPHID()]->getName(), | ||||
|           ), | ||||
|         ), | ||||
|         $token->renderIcon()); | ||||
|     } | ||||
|  | ||||
|     $view = $event->getValue('view'); | ||||
|     $view->addProperty(pht('Tokens'), $list); | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,5 @@ | ||||
| <?php | ||||
|  | ||||
| interface PhabricatorTokenReceiverInterface { | ||||
|  | ||||
| } | ||||
							
								
								
									
										89
									
								
								src/applications/tokens/query/PhabricatorTokenGivenQuery.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,89 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenGivenQuery | ||||
|   extends PhabricatorCursorPagedPolicyAwareQuery { | ||||
|  | ||||
|   private $authorPHIDs; | ||||
|   private $objectPHIDs; | ||||
|   private $tokenPHIDs; | ||||
|  | ||||
|   public function withTokenPHIDs(array $token_phids) { | ||||
|     $this->tokenPHIDs = $token_phids; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function withObjectPHIDs(array $object_phids) { | ||||
|     $this->objectPHIDs = $object_phids; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function withAuthorPHIDs(array $author_phids) { | ||||
|     $this->authorPHIDs = $author_phids; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function loadPage() { | ||||
|     $table = new PhabricatorTokenGiven(); | ||||
|     $conn_r = $table->establishConnection('r'); | ||||
|  | ||||
|     $rows = queryfx_all( | ||||
|       $conn_r, | ||||
|       'SELECT * FROM %T %Q %Q %Q', | ||||
|       $table->getTableName(), | ||||
|       $this->buildWhereClause($conn_r), | ||||
|       $this->buildOrderClause($conn_r), | ||||
|       $this->buildLimitClause($conn_r)); | ||||
|  | ||||
|     return $table->loadAllFromArray($rows); | ||||
|   } | ||||
|  | ||||
|   private function buildWhereClause(AphrontDatabaseConnection $conn_r) { | ||||
|     $where = array(); | ||||
|  | ||||
|     if ($this->authorPHIDs) { | ||||
|       $where[] = qsprintf( | ||||
|         $conn_r, | ||||
|         'authorPHID IN (%Ls)', | ||||
|         $this->authorPHIDs); | ||||
|     } | ||||
|  | ||||
|     if ($this->objectPHIDs) { | ||||
|       $where[] = qsprintf( | ||||
|         $conn_r, | ||||
|         'objectPHID IN (%Ls)', | ||||
|         $this->objectPHIDs); | ||||
|     } | ||||
|  | ||||
|     if ($this->tokenPHIDs) { | ||||
|       $where[] = qsprintf( | ||||
|         $conn_r, | ||||
|         'tokenPHID IN (%Ls)', | ||||
|         $this->tokenPHIDs); | ||||
|     } | ||||
|  | ||||
|     return $this->formatWhereClause($where); | ||||
|   } | ||||
|  | ||||
|   public function willFilterPage(array $results) { | ||||
|     $object_phids = array_filter(mpull($results, 'getObjectPHID')); | ||||
|     if (!$object_phids) { | ||||
|       return array(); | ||||
|     } | ||||
|  | ||||
|     $objects = id(new PhabricatorObjectHandleData($object_phids)) | ||||
|       ->setViewer($this->getViewer()) | ||||
|       ->loadObjects(); | ||||
|  | ||||
|     foreach ($results as $key => $result) { | ||||
|       $phid = $result->getObjectPHID(); | ||||
|       if (empty($objects[$phid])) { | ||||
|         unset($results[$key]); | ||||
|       } else { | ||||
|         $result->attachObject($objects[$phid]); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return $results; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										62
									
								
								src/applications/tokens/query/PhabricatorTokenQuery.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,62 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenQuery | ||||
|   extends PhabricatorCursorPagedPolicyAwareQuery { | ||||
|  | ||||
|   private $phids; | ||||
|  | ||||
|   public function withPHIDs(array $phids) { | ||||
|     $this->phids = $phids; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function loadPage() { | ||||
|     $tokens = $this->getBuiltinTokens(); | ||||
|  | ||||
|     if ($this->phids) { | ||||
|       $map = array_fill_keys($this->phids, true); | ||||
|       foreach ($tokens as $key => $token) { | ||||
|         if (empty($map[$token->getPHID()])) { | ||||
|           unset($tokens[$key]); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return $tokens; | ||||
|   } | ||||
|  | ||||
|   private function getBuiltinTokens() { | ||||
|     $specs = array( | ||||
|       array('like-1', pht('Like')), | ||||
|       array('like-2', pht('Dislike')), | ||||
|       array('heart-1', pht('Love')), | ||||
|       array('heart-2', pht('Heartbreak')), | ||||
|       array('medal-1', pht('Orange Medal')), | ||||
|       array('medal-2', pht('Grey Medal')), | ||||
|       array('medal-3', pht('Yellow Medal')), | ||||
|       array('medal-4', pht('Manufacturing Defect?')), | ||||
|       array('coin-1', pht('Haypence')), | ||||
|       array('coin-2', pht('Piece of Eight')), | ||||
|       array('coin-3', pht('Doubloon')), | ||||
|       array('coin-4', pht('Mountain of Wealth')), | ||||
|       array('misc-1', pht('Pterodactyl')), | ||||
|       array('misc-2', pht('Evil Spooky Haunted Tree')), | ||||
|       array('misc-3', pht('Baby Tequila')), | ||||
|       array('misc-4', pht('The World Burns')), | ||||
|     ); | ||||
|  | ||||
|     $tokens = array(); | ||||
|     foreach ($specs as $id => $spec) { | ||||
|       list($image, $name) = $spec; | ||||
|  | ||||
|       $token = id(new PhabricatorToken()) | ||||
|         ->setID($id) | ||||
|         ->setName($name) | ||||
|         ->setPHID('PHID-TOKN-'.$image); | ||||
|       $tokens[] = $token; | ||||
|     } | ||||
|  | ||||
|     return $tokens; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										46
									
								
								src/applications/tokens/storage/PhabricatorToken.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,46 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorToken extends PhabricatorTokenDAO | ||||
|   implements PhabricatorPolicyInterface { | ||||
|  | ||||
|   protected $phid; | ||||
|   protected $name; | ||||
|   protected $filePHID; | ||||
|  | ||||
|   public function getConfiguration() { | ||||
|     return array( | ||||
|       self::CONFIG_AUX_PHID => true, | ||||
|     ) + parent::getConfiguration(); | ||||
|   } | ||||
|  | ||||
|   public function getCapabilities() { | ||||
|     return array( | ||||
|       PhabricatorPolicyCapability::CAN_VIEW, | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function getPolicy($capability) { | ||||
|     return PhabricatorPolicies::POLICY_USER; | ||||
|   } | ||||
|  | ||||
|   public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   public function renderIcon() { | ||||
|     // TODO: Maybe move to a View class? | ||||
|  | ||||
|     require_celerity_resource('sprite-tokens-css'); | ||||
|     require_celerity_resource('tokens-css'); | ||||
|  | ||||
|     $sprite = substr($this->getPHID(), 10); | ||||
|  | ||||
|     return phutil_tag( | ||||
|       'div', | ||||
|       array( | ||||
|         'class' => 'sprite-tokens token-icon token-'.$sprite, | ||||
|       ), | ||||
|       ''); | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										15
									
								
								src/applications/tokens/storage/PhabricatorTokenCount.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenCount extends PhabricatorTokenDAO { | ||||
|  | ||||
|   protected $objectPHID; | ||||
|   protected $tokenCount; | ||||
|  | ||||
|   public function getConfiguration() { | ||||
|     return array( | ||||
|       self::CONFIG_IDS => self::IDS_MANUAL, | ||||
|       self::CONFIG_TIMESTAMPS => false, | ||||
|     ) + parent::getConfiguration(); | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/applications/tokens/storage/PhabricatorTokenDAO.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| <?php | ||||
|  | ||||
| abstract class PhabricatorTokenDAO extends PhabricatorLiskDAO { | ||||
|  | ||||
|   public function getApplicationName() { | ||||
|     return 'token'; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										54
									
								
								src/applications/tokens/storage/PhabricatorTokenGiven.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,54 @@ | ||||
| <?php | ||||
|  | ||||
| final class PhabricatorTokenGiven extends PhabricatorTokenDAO | ||||
|   implements PhabricatorPolicyInterface { | ||||
|  | ||||
|   protected $authorPHID; | ||||
|   protected $objectPHID; | ||||
|   protected $tokenPHID; | ||||
|  | ||||
|   private $object; | ||||
|  | ||||
|   public function attachObject(PhabricatorTokenReceiverInterface $object) { | ||||
|     $this->object = $object; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getObject() { | ||||
|     if ($this->object === null) { | ||||
|       throw new Exception("Call attachObject() before getObject()!"); | ||||
|     } | ||||
|     return $this->object; | ||||
|   } | ||||
|  | ||||
|   public function getCapabilities() { | ||||
|     return array( | ||||
|       PhabricatorPolicyCapability::CAN_VIEW, | ||||
|       PhabricatorPolicyCapability::CAN_EDIT, | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   public function getPolicy($capability) { | ||||
|     switch ($capability) { | ||||
|       case PhabricatorPolicyCapability::CAN_VIEW: | ||||
|         return $this->getObject()->getPolicy($capability); | ||||
|       default: | ||||
|         return PhabricatorPolicies::POLICY_NOONE; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public function hasAutomaticCapability($capability, PhabricatorUser $user) { | ||||
|     switch ($capability) { | ||||
|       case PhabricatorPolicyCapability::CAN_VIEW: | ||||
|         return $this->getObject()->hasAutomaticCapability( | ||||
|           $capability, | ||||
|           $user); | ||||
|       default: | ||||
|         if ($user->getPHID() == $this->authorPHID) { | ||||
|           return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -176,6 +176,33 @@ final class CeleritySpriteGenerator { | ||||
|     return $sheet; | ||||
|   } | ||||
|  | ||||
|   public function buildTokenSheet() { | ||||
|     $tokens = $this->getDirectoryList('tokens_1x'); | ||||
|  | ||||
|     $template = id(new PhutilSprite()) | ||||
|       ->setSourceSize(16, 16); | ||||
|  | ||||
|     $sprites = array(); | ||||
|     foreach ($tokens as $token) { | ||||
|       $path = $this->getPath('tokens_1x/'.$token.'.png'); | ||||
|  | ||||
|       $sprite = id(clone $template) | ||||
|         ->setName('token-'.$token) | ||||
|         ->setTargetCSS('.token-'.$token) | ||||
|         ->setSourceFile($path, 1); | ||||
|  | ||||
|       $sprites[] = $sprite; | ||||
|     } | ||||
|  | ||||
|     $sheet = $this->buildSheet('tokens', false); | ||||
|     foreach ($sprites as $sprite) { | ||||
|       $sheet->addSprite($sprite); | ||||
|     } | ||||
|  | ||||
|     return $sheet; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   public function buildConpherenceSheet() { | ||||
|     $icons = $this->getDirectoryList('conpher_1x'); | ||||
|     $scales = array( | ||||
| @@ -186,7 +213,7 @@ final class CeleritySpriteGenerator { | ||||
|       ->setSourceSize(32, 32); | ||||
|  | ||||
|     $sprites = array(); | ||||
|       foreach ($icons as $icon) { | ||||
|     foreach ($icons as $icon) { | ||||
|       $color = preg_match('/_on/', $icon) ? 'on' : 'off'; | ||||
|  | ||||
|       $prefix = 'conpher_'; | ||||
|   | ||||
| @@ -29,6 +29,7 @@ final class PhabricatorEventType extends PhutilEventType { | ||||
|   const TYPE_UI_WILLRENDEROBJECTS           = 'ui.willRenderObjects'; | ||||
|   const TYPE_UI_DDIDRENDEROBJECT            = 'ui.didRenderObject'; | ||||
|   const TYPE_UI_DIDRENDEROBJECTS            = 'ui.didRenderObjects'; | ||||
|   const TYPE_UI_WILLRENDERPROPERTIES        = 'ui.willRenderProperties'; | ||||
|  | ||||
|   const TYPE_PEOPLE_DIDRENDERMENU           = 'people.didRenderMenu'; | ||||
| } | ||||
|   | ||||
| @@ -163,6 +163,14 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList { | ||||
|         'type'    => 'db', | ||||
|         'name'    => 'conpherence', | ||||
|       ), | ||||
|       'db.config' => array( | ||||
|         'type'    => 'db', | ||||
|         'name'    => 'config', | ||||
|       ), | ||||
|       'db.token' => array( | ||||
|         'type'    => 'db', | ||||
|         'name'    => 'token', | ||||
|       ), | ||||
|       '0000.legacy.sql' => array( | ||||
|         'type'    => 'sql', | ||||
|         'name'    => $this->getPatchPath('0000.legacy.sql'), | ||||
| @@ -1068,10 +1076,6 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList { | ||||
|         'type'    => 'sql', | ||||
|         'name'    => $this->getPatchPath('20121220.generalcache.sql'), | ||||
|       ), | ||||
|       'db.config' => array( | ||||
|         'type'    => 'db', | ||||
|         'name'    => 'config', | ||||
|       ), | ||||
|       '20121226.config.sql' => array( | ||||
|         'type'    => 'sql', | ||||
|         'name'    => $this->getPatchPath('20121226.config.sql'), | ||||
| @@ -1117,6 +1121,10 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList { | ||||
|         'type'    => 'sql', | ||||
|         'name'    => $this->getPatchPath('20130214.chatlogchannelid.sql'), | ||||
|       ), | ||||
|       '20130214.token.sql' => array( | ||||
|         'type'    => 'sql', | ||||
|         'name'    => $this->getPatchPath('20130214.token.sql'), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -4,11 +4,18 @@ final class PhabricatorPropertyListView extends AphrontView { | ||||
|  | ||||
|   private $parts = array(); | ||||
|   private $hasKeyboardShortcuts; | ||||
|   private $object; | ||||
|   private $invokedWillRenderEvent; | ||||
|  | ||||
|   protected function canAppendChild() { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   public function setObject($object) { | ||||
|     $this->object = $object; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function setHasKeyboardShortcuts($has_keyboard_shortcuts) { | ||||
|     $this->hasKeyboardShortcuts = $has_keyboard_shortcuts; | ||||
|     return $this; | ||||
| @@ -52,7 +59,25 @@ final class PhabricatorPropertyListView extends AphrontView { | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function invokeWillRenderEvent() { | ||||
|     if ($this->object && $this->getUser() && !$this->invokedWillRenderEvent) { | ||||
|       $event = new PhabricatorEvent( | ||||
|         PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES, | ||||
|         array( | ||||
|           'object'  => $this->object, | ||||
|           'view'    => $this, | ||||
|         )); | ||||
|       $event->setUser($this->getUser()); | ||||
|       PhutilEventEngine::dispatchEvent($event); | ||||
|     } | ||||
|     $this->invokedWillRenderEvent = true; | ||||
|   } | ||||
|  | ||||
|  | ||||
|  | ||||
|   public function render() { | ||||
|     $this->invokeWillRenderEvent(); | ||||
|  | ||||
|     require_celerity_resource('phabricator-property-list-view-css'); | ||||
|  | ||||
|     $items = array(); | ||||
|   | ||||
							
								
								
									
										27
									
								
								webroot/rsrc/css/application/tokens/tokens.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,27 @@ | ||||
| /** | ||||
|  * @provides tokens-css | ||||
|  */ | ||||
|  | ||||
| .token-icon { | ||||
|   position: relative; | ||||
|   display: inline-block; | ||||
|   width: 16px; | ||||
|   height: 16px; | ||||
| } | ||||
|  | ||||
| button.token-button { | ||||
|   background: #f6f6f6; | ||||
|   border: 1px solid #333333; | ||||
|   position: relative; | ||||
|   width: 16px; | ||||
|   height: 16px; | ||||
|   padding: 16px; | ||||
|   margin: 8px; | ||||
|   text-shadow: none; | ||||
|   box-shadow: none; | ||||
|   box-sizing: content-box; | ||||
| } | ||||
|  | ||||
| .token-grid { | ||||
|   text-align: center; | ||||
| } | ||||
| @@ -5,6 +5,7 @@ | ||||
| .phabricator-pinboard-view { | ||||
|   padding: 20px; | ||||
|   overflow: hidden; | ||||
|   margin: 1em 0; | ||||
| } | ||||
|  | ||||
| .phabricator-pinboard-item-view { | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  */ | ||||
|  | ||||
| .sprite-conpher { | ||||
|   background-image: url(/rsrc/image/sprite-conph.png); | ||||
|   background-image: url(/rsrc/image/sprite-conpher.png); | ||||
|   background-repeat: no-repeat; | ||||
| } | ||||
|  | ||||
| @@ -12,7 +12,7 @@ | ||||
| only screen and (min-device-pixel-ratio: 1.5), | ||||
| only screen and (-webkit-min-device-pixel-ratio: 1.5) { | ||||
|   .sprite-conpher { | ||||
|     background-image: url(/rsrc/image/sprite-conph-X2.png); | ||||
|     background-image: url(/rsrc/image/sprite-conpher-X2.png); | ||||
|     background-size: 132px 132px; | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										76
									
								
								webroot/rsrc/css/sprite-tokens.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,76 @@ | ||||
| /** | ||||
|  * @provides sprite-tokens-css | ||||
|  * @generated | ||||
|  */ | ||||
|  | ||||
| .sprite-tokens { | ||||
|   background-image: url(/rsrc/image/sprite-tokens.png); | ||||
|   background-repeat: no-repeat; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| .token-coin-1 { | ||||
|   background-position: 0px 0px; | ||||
| } | ||||
|  | ||||
| .token-coin-2 { | ||||
|   background-position: -17px 0px; | ||||
| } | ||||
|  | ||||
| .token-coin-3 { | ||||
|   background-position: -34px 0px; | ||||
| } | ||||
|  | ||||
| .token-coin-4 { | ||||
|   background-position: -51px 0px; | ||||
| } | ||||
|  | ||||
| .token-heart-1 { | ||||
|   background-position: 0px -17px; | ||||
| } | ||||
|  | ||||
| .token-heart-2 { | ||||
|   background-position: -17px -17px; | ||||
| } | ||||
|  | ||||
| .token-like-1 { | ||||
|   background-position: -34px -17px; | ||||
| } | ||||
|  | ||||
| .token-like-2 { | ||||
|   background-position: -51px -17px; | ||||
| } | ||||
|  | ||||
| .token-medal-1 { | ||||
|   background-position: 0px -34px; | ||||
| } | ||||
|  | ||||
| .token-medal-2 { | ||||
|   background-position: -17px -34px; | ||||
| } | ||||
|  | ||||
| .token-medal-3 { | ||||
|   background-position: -34px -34px; | ||||
| } | ||||
|  | ||||
| .token-medal-4 { | ||||
|   background-position: -51px -34px; | ||||
| } | ||||
|  | ||||
| .token-misc-1 { | ||||
|   background-position: 0px -51px; | ||||
| } | ||||
|  | ||||
| .token-misc-2 { | ||||
|   background-position: -17px -51px; | ||||
| } | ||||
|  | ||||
| .token-misc-3 { | ||||
|   background-position: -34px -51px; | ||||
| } | ||||
|  | ||||
| .token-misc-4 { | ||||
|   background-position: -51px -51px; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								webroot/rsrc/image/sprite-tokens.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 7.2 KiB | 
 epriestley
					epriestley