mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-09 16:32:39 +01:00
Rename "beta" to "prototype" and document support policy
Summary: Fixes T6084. Changes: - Rename `phabricator.show-beta-applications` to `phabricator.show-prototypes`, to reinforce that these include early-development applications. - Migrate the config setting. - Add an explicit "no support" banner to the config page. - Rename "Beta" to "Prototype" in the UI. - Use "bomb" icon instead of "half star" icon. - Document prototype applications in more detail. - Explicitly document that we do not support these applications. Test Plan: - Ran migration. - Resolved "obsolete config" issue. - Viewed config setting. - Browsed prototypes in Applications app. - Viewed documentation. Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley, hach-que Maniphest Tasks: T6084 Differential Revision: https://secure.phabricator.com/D10493
This commit is contained in:
parent
444ced16d9
commit
298604c9d3
29 changed files with 185 additions and 83 deletions
|
@ -630,9 +630,6 @@ return array(
|
|||
// be enabled in production.
|
||||
'phabricator.developer-mode' => false,
|
||||
|
||||
// Should Phabricator show beta applications on the homepage
|
||||
'phabricator.show-beta-applications' => false,
|
||||
|
||||
// Contains a list of uninstalled applications
|
||||
'phabricator.uninstalled-applications' => array(),
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*/
|
||||
return array(
|
||||
'names' => array(
|
||||
'core.pkg.css' => 'f4235a32',
|
||||
'core.pkg.css' => '3317a3ad',
|
||||
'core.pkg.js' => 'cbdbd552',
|
||||
'darkconsole.pkg.js' => 'df001cab',
|
||||
'differential.pkg.css' => '36884139',
|
||||
|
@ -38,7 +38,7 @@ return array(
|
|||
'rsrc/css/application/auth/auth.css' => '1e655982',
|
||||
'rsrc/css/application/base/main-menu-view.css' => 'aceca0e9',
|
||||
'rsrc/css/application/base/notification-menu.css' => '6aa0a74b',
|
||||
'rsrc/css/application/base/phabricator-application-launch-view.css' => '8b7e271d',
|
||||
'rsrc/css/application/base/phabricator-application-launch-view.css' => '5d71008f',
|
||||
'rsrc/css/application/base/standard-page-view.css' => 'dd860661',
|
||||
'rsrc/css/application/chatlog/chatlog.css' => '852140ff',
|
||||
'rsrc/css/application/config/config-options.css' => '7fedf08b',
|
||||
|
@ -705,7 +705,7 @@ return array(
|
|||
'path-typeahead' => 'f7fc67ec',
|
||||
'people-profile-css' => '5402f7a5',
|
||||
'phabricator-action-list-view-css' => '9ee9910a',
|
||||
'phabricator-application-launch-view-css' => '8b7e271d',
|
||||
'phabricator-application-launch-view-css' => '5d71008f',
|
||||
'phabricator-busy' => '6453c869',
|
||||
'phabricator-chatlog-css' => '852140ff',
|
||||
'phabricator-content-source-view-css' => '4b8b05d4',
|
||||
|
|
24
resources/sql/autopatches/20140914.betaproto.php
Normal file
24
resources/sql/autopatches/20140914.betaproto.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
$old_key = 'phabricator.show-beta-applications';
|
||||
$new_key = 'phabricator.show-prototypes';
|
||||
|
||||
echo "Migrating '{$old_key}' to '{$new_key}'...\n";
|
||||
|
||||
if (PhabricatorEnv::getEnvConfig($new_key)) {
|
||||
echo "Skipping migration, new data is already set.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$old = PhabricatorEnv::getEnvConfigIfExists($old_key);
|
||||
if (!$old) {
|
||||
echo "Skipping migration, old data does not exist.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
PhabricatorConfigEntry::loadConfigEntry($new_key)
|
||||
->setIsDeleted(0)
|
||||
->setValue($old)
|
||||
->save();
|
||||
|
||||
echo "Done.\n";
|
|
@ -53,8 +53,8 @@ abstract class PhabricatorApplication implements PhabricatorPolicyInterface {
|
|||
return true;
|
||||
}
|
||||
|
||||
$beta = PhabricatorEnv::getEnvConfig('phabricator.show-beta-applications');
|
||||
if (!$beta && $this->isBeta()) {
|
||||
$prototypes = PhabricatorEnv::getEnvConfig('phabricator.show-prototypes');
|
||||
if (!$prototypes && $this->isPrototype()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ abstract class PhabricatorApplication implements PhabricatorPolicyInterface {
|
|||
}
|
||||
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ final class PhabricatorCalendarApplication extends PhabricatorApplication {
|
|||
return "\xE2\x8C\xA8";
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ final class PhabricatorChatLogApplication extends PhabricatorApplication {
|
|||
return 'chatlog';
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -190,6 +190,10 @@ final class PhabricatorSetupCheckExtraConfig extends PhabricatorSetupCheck {
|
|||
'differential.show-host-field' => $differential_field_reason,
|
||||
'differential.show-test-plan-field' => $differential_field_reason,
|
||||
'differential.field-selector' => $differential_field_reason,
|
||||
'phabricator.show-beta-applications' => pht(
|
||||
'This option has been renamed to `phabricator.show-prototypes` '.
|
||||
'to emphasize the unfinished nature of many prototype applications. '.
|
||||
'Your existing setting has been migrated.'),
|
||||
);
|
||||
|
||||
return $ancient_config;
|
||||
|
|
|
@ -24,6 +24,10 @@ final class PhabricatorCoreConfigOptions
|
|||
|
||||
$path = getenv('PATH');
|
||||
|
||||
$proto_doc_href = PhabricatorEnv::getDoclink(
|
||||
'User Guide: Prototype Applications');
|
||||
$proto_doc_name = pht('User Guide: Prototype Applications');
|
||||
|
||||
return array(
|
||||
$this->newOption('phabricator.base-uri', 'string', null)
|
||||
->setLocked(true)
|
||||
|
@ -86,25 +90,33 @@ final class PhabricatorCoreConfigOptions
|
|||
'Phabricator instances are running on both domains, this will '.
|
||||
'create a collision preventing you from logging in.'))
|
||||
->addExample('dev', pht('Prefix cookie with "dev"')),
|
||||
$this->newOption('phabricator.show-beta-applications', 'bool', false)
|
||||
$this->newOption('phabricator.show-prototypes', 'bool', false)
|
||||
->setBoolOptions(
|
||||
array(
|
||||
pht('Install Beta Applications'),
|
||||
pht('Uninstall Beta Applications')
|
||||
pht('Enable Prototypes'),
|
||||
pht('Disable Prototypes')
|
||||
))
|
||||
->setSummary(
|
||||
pht(
|
||||
'Install applications which are still under development.'))
|
||||
->setDescription(
|
||||
pht(
|
||||
"Phabricator includes 'Beta' applications which are in an early ".
|
||||
"stage of development. They range from very rough prototypes to ".
|
||||
"relatively complete (but unpolished) applications.\n\n".
|
||||
"By default, Beta applications are not installed. You can enable ".
|
||||
"this option to install them if you're interested in previewing ".
|
||||
"upcoming features.\n\n".
|
||||
"After enabling Beta applications, you can selectively uninstall ".
|
||||
"them (like normal applications).")),
|
||||
"IMPORTANT: The upstream does not provide support for prototype ".
|
||||
"applications.".
|
||||
"\n\n".
|
||||
"Phabricator includes prototype applications which are in an ".
|
||||
"**early stage of development**. By default, prototype ".
|
||||
"applications are not installed, because are often not yet ".
|
||||
"developed enough to be generally usable. You can enable ".
|
||||
"this option to install them if you're developing Phabricator ".
|
||||
"or are interested in previewing upcoming features.".
|
||||
"\n\n".
|
||||
"To learn more about prototypes, see [[ %s | %s ]].".
|
||||
"\n\n".
|
||||
"After enabling prototypes, you can selectively uninstall them ".
|
||||
"(like normal applications).",
|
||||
$proto_doc_href,
|
||||
$proto_doc_name)),
|
||||
$this->newOption('phabricator.serious-business', 'bool', false)
|
||||
->setBoolOptions(
|
||||
array(
|
||||
|
|
|
@ -47,8 +47,7 @@ final class DiffusionRepositoryNewController extends DiffusionController {
|
|||
array(
|
||||
pht(
|
||||
'Create a new, empty repository which Phabricator will host. '.
|
||||
'For instructions on configuring repository hosting, see %s. '.
|
||||
'This feature is new and in beta!',
|
||||
'For instructions on configuring repository hosting, see %s.',
|
||||
$doc_link),
|
||||
))
|
||||
->addButton(
|
||||
|
|
|
@ -30,7 +30,7 @@ final class PhabricatorDrydockApplication extends PhabricatorApplication {
|
|||
return self::GROUP_UTILITIES;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ final class PhabricatorFactApplication extends PhabricatorApplication {
|
|||
return self::GROUP_UTILITIES;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ final class PhabricatorFundApplication extends PhabricatorApplication {
|
|||
return self::GROUP_UTILITIES;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ final class PhabricatorHarbormasterApplication extends PhabricatorApplication {
|
|||
);
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -77,10 +77,22 @@ final class PhabricatorApplicationDetailViewController
|
|||
phutil_tag('em', array(), $application->getFlavorText()));
|
||||
}
|
||||
|
||||
if ($application->isBeta()) {
|
||||
if ($application->isPrototype()) {
|
||||
$proto_href = PhabricatorEnv::getDoclink(
|
||||
'User Guide: Prototype Applications');
|
||||
$learn_more = phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $proto_href,
|
||||
'target' => '_blank',
|
||||
),
|
||||
pht('Learn More'));
|
||||
|
||||
$properties->addProperty(
|
||||
pht('Release'),
|
||||
pht('Beta'));
|
||||
pht('Prototype'),
|
||||
pht(
|
||||
'This application is a prototype. %s',
|
||||
$learn_more));
|
||||
}
|
||||
|
||||
$overview = $application->getOverview();
|
||||
|
@ -160,9 +172,9 @@ final class PhabricatorApplicationDetailViewController
|
|||
->setHref(
|
||||
$this->getApplicationURI(get_class($selected).'/install/'));
|
||||
|
||||
$beta_enabled = PhabricatorEnv::getEnvConfig(
|
||||
'phabricator.show-beta-applications');
|
||||
if ($selected->isBeta() && !$beta_enabled) {
|
||||
$prototypes_enabled = PhabricatorEnv::getEnvConfig(
|
||||
'phabricator.show-prototypes');
|
||||
if ($selected->isPrototype() && !$prototypes_enabled) {
|
||||
$action->setDisabled(true);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,21 +27,21 @@ final class PhabricatorApplicationUninstallController
|
|||
|
||||
$view_uri = $this->getApplicationURI('view/'.$this->application);
|
||||
|
||||
$beta_enabled = PhabricatorEnv::getEnvConfig(
|
||||
'phabricator.show-beta-applications');
|
||||
$prototypes_enabled = PhabricatorEnv::getEnvConfig(
|
||||
'phabricator.show-prototypes');
|
||||
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($user)
|
||||
->addCancelButton($view_uri);
|
||||
|
||||
if ($selected->isBeta() && !$beta_enabled) {
|
||||
if ($selected->isPrototype() && !$prototypes_enabled) {
|
||||
$dialog
|
||||
->setTitle(pht('Beta Applications Not Enabled'))
|
||||
->setTitle(pht('Prototypes Not Enabled'))
|
||||
->appendChild(
|
||||
pht(
|
||||
'To manage beta applications, enable them by setting %s in your '.
|
||||
'To manage prototypes, enable them by setting %s in your '.
|
||||
'Phabricator configuration.',
|
||||
phutil_tag('tt', array(), 'phabricator.show-beta-applications')));
|
||||
phutil_tag('tt', array(), 'phabricator.show-prototypes')));
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@ final class PhabricatorAppSearchEngine
|
|||
'installed',
|
||||
$this->readBoolFromRequest($request, 'installed'));
|
||||
$saved->setParameter(
|
||||
'beta',
|
||||
$this->readBoolFromRequest($request, 'beta'));
|
||||
'prototypes',
|
||||
$this->readBoolFromRequest($request, 'prototypes'));
|
||||
$saved->setParameter(
|
||||
'firstParty',
|
||||
$this->readBoolFromRequest($request, 'firstParty'));
|
||||
|
@ -51,9 +51,16 @@ final class PhabricatorAppSearchEngine
|
|||
$query->withInstalled($installed);
|
||||
}
|
||||
|
||||
$beta = $saved->getParameter('beta');
|
||||
if ($beta !== null) {
|
||||
$query->withBeta($beta);
|
||||
$prototypes = $saved->getParameter('prototypes');
|
||||
|
||||
if ($prototypes === null) {
|
||||
// NOTE: This is the old name of the 'prototypes' option, see T6084.
|
||||
$prototypes = $saved->getParameter('beta');
|
||||
$saved->setParameter('prototypes', $prototypes);
|
||||
}
|
||||
|
||||
if ($prototypes !== null) {
|
||||
$query->withPrototypes($prototypes);
|
||||
}
|
||||
|
||||
$first_party = $saved->getParameter('firstParty');
|
||||
|
@ -92,13 +99,13 @@ final class PhabricatorAppSearchEngine
|
|||
)))
|
||||
->appendChild(
|
||||
id(new AphrontFormSelectControl())
|
||||
->setLabel(pht('Beta'))
|
||||
->setName('beta')
|
||||
->setValue($this->getBoolFromQuery($saved, 'beta'))
|
||||
->setLabel(pht('Prototypes'))
|
||||
->setName('prototypes')
|
||||
->setValue($this->getBoolFromQuery($saved, 'prototypes'))
|
||||
->setOptions(
|
||||
array(
|
||||
'' => pht('Show All Applications'),
|
||||
'true' => pht('Show Beta Applications'),
|
||||
'true' => pht('Show Prototype Applications'),
|
||||
'false' => pht('Show Released Applications'),
|
||||
)))
|
||||
->appendChild(
|
||||
|
@ -229,8 +236,8 @@ final class PhabricatorAppSearchEngine
|
|||
$item->addIcon('fa-times', pht('Uninstalled'));
|
||||
}
|
||||
|
||||
if ($application->isBeta()) {
|
||||
$item->addIcon('fa-star-half-o grey', pht('Beta'));
|
||||
if ($application->isPrototype()) {
|
||||
$item->addIcon('fa-bomb grey', pht('Prototype'));
|
||||
}
|
||||
|
||||
if (!$application->isFirstParty()) {
|
||||
|
|
|
@ -4,7 +4,7 @@ final class PhabricatorApplicationQuery
|
|||
extends PhabricatorCursorPagedPolicyAwareQuery {
|
||||
|
||||
private $installed;
|
||||
private $beta;
|
||||
private $prototypes;
|
||||
private $firstParty;
|
||||
private $nameContains;
|
||||
private $unlisted;
|
||||
|
@ -27,8 +27,8 @@ final class PhabricatorApplicationQuery
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function withBeta($beta) {
|
||||
$this->beta = $beta;
|
||||
public function withPrototypes($prototypes) {
|
||||
$this->prototypes = $prototypes;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
@ -99,9 +99,9 @@ final class PhabricatorApplicationQuery
|
|||
}
|
||||
}
|
||||
|
||||
if ($this->beta !== null) {
|
||||
if ($this->prototypes !== null) {
|
||||
foreach ($apps as $key => $app) {
|
||||
if ($app->isBeta() != $this->beta) {
|
||||
if ($app->isPrototype() != $this->prototypes) {
|
||||
unset($apps[$key]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,16 +43,6 @@ final class PhabricatorApplicationLaunchView extends AphrontTagView {
|
|||
),
|
||||
$application->getName());
|
||||
|
||||
if ($application->isBeta()) {
|
||||
$content[] = javelin_tag(
|
||||
'span',
|
||||
array(
|
||||
'aural' => false,
|
||||
'class' => 'phabricator-application-beta',
|
||||
),
|
||||
"\xCE\xB2");
|
||||
}
|
||||
|
||||
$content[] = phutil_tag(
|
||||
'span',
|
||||
array(
|
||||
|
|
|
@ -14,7 +14,7 @@ final class PhabricatorNuanceApplication extends PhabricatorApplication {
|
|||
return "\xE2\x98\x8E";
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ final class PhabricatorOAuthServerApplication extends PhabricatorApplication {
|
|||
return self::GROUP_ADMIN;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ final class PhabricatorPhameApplication extends PhabricatorApplication {
|
|||
return PhabricatorEnv::getDoclink('Phame User Guide');
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ final class PhabricatorPhluxApplication extends PhabricatorApplication {
|
|||
return self::GROUP_UTILITIES;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ final class PhabricatorPhortuneApplication extends PhabricatorApplication {
|
|||
return self::GROUP_UTILITIES;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ final class PhabricatorPhragmentApplication extends PhabricatorApplication {
|
|||
return self::GROUP_UTILITIES;
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ final class PhabricatorPhrequentApplication extends PhabricatorApplication {
|
|||
return '/phrequent/';
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ final class PhabricatorPonderApplication extends PhabricatorApplication {
|
|||
);
|
||||
}
|
||||
|
||||
public function isBeta() {
|
||||
public function isPrototype() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
65
src/docs/user/userguide/prototypes.diviner
Normal file
65
src/docs/user/userguide/prototypes.diviner
Normal file
|
@ -0,0 +1,65 @@
|
|||
@title User Guide: Prototype Applications
|
||||
@group userguide
|
||||
|
||||
Information about prototypes.
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
Phabricator includes //prototype applications//, which are applications in an
|
||||
early stage of development.
|
||||
|
||||
IMPORTANT: The upstream does not offer support for these applications.
|
||||
|
||||
When we begin working on a new application, we usually implement it as a
|
||||
prototype first. This allows us to get a better sense of how the application
|
||||
might work and integrate with other applications, and what technical and product
|
||||
challenges it might face.
|
||||
|
||||
Prototypes are often not generally usable. They usually aren't documented,
|
||||
don't have safety and correctness checks in place, very rarely have full
|
||||
integrations or APIs, and may be missing major pieces of critical functionality
|
||||
or even not work at all. The parts of an application we prototype first
|
||||
may not be the useful parts.
|
||||
|
||||
Some applications leave the prototype phase quickly, but other applications may
|
||||
not. We build some prototypes just to make sure a specific technical barrier is
|
||||
surmountable, and may not finish the application for a very long time. In other
|
||||
cases, the prototype seems less interesting or useful once it starts working
|
||||
than we might have imagined it would be, or be far more challenging than we
|
||||
thought. We may lower the priority of a project or put it on hold indefinitely
|
||||
if we're less excited about it after we begin building it.
|
||||
|
||||
If you're interested in previewing upcoming applications, you can use the
|
||||
`phabricator.show-prototypes` configuration setting to enable prototypes.
|
||||
|
||||
Feedback on Prototypes
|
||||
======================
|
||||
|
||||
We're usually interested in this sort of feedback on prototypes:
|
||||
|
||||
- {icon check, color=green} **Use Cases**: If we're building something that
|
||||
you think you'd use, we'd love to hear about your use cases for it. This can
|
||||
help us figure out what features to add and how users may think about, use,
|
||||
and integrate the application.
|
||||
- {icon check, color=green} **General Interest**: Is an application something
|
||||
you're looking forward to? Knowing which applications users are interested
|
||||
in can help us set priorities.
|
||||
|
||||
We're usually **not** interested in this sort of feedback on prototypes:
|
||||
|
||||
- {icon times, color=red} **Support Requests**: We do not support these
|
||||
applications. Use them at your own risk, or wait for them to leave the
|
||||
prototype phase.
|
||||
- {icon times, color=red} **Bug Reports**: We know these applications don't
|
||||
work well yet, and usually know about most of the open bugs. Even if we
|
||||
don't, whatever isn't working yet may change completely before the
|
||||
application leaves the prototype phase.
|
||||
- {icon times, color=red} **Contributions / Pull Requests**: These
|
||||
applications are usually in too early a state to accept contributions. Let
|
||||
us know about your use case, but wait for release to send code.
|
||||
|
||||
Overall, using prototypes makes it easier for us to explore and develop
|
||||
application ideas, and to share a preview of what's coming in the future with
|
||||
users, but prototypes are not yet full applications and we do not provide
|
||||
support until applications leave the prototype phase.
|
|
@ -102,7 +102,7 @@ abstract class PhabricatorTestCase extends ArcanistPhutilTestCase {
|
|||
'phabricator.uninstalled-applications',
|
||||
array());
|
||||
$this->env->overrideEnvConfig(
|
||||
'phabricator.show-beta-applications',
|
||||
'phabricator.show-prototypes',
|
||||
true);
|
||||
|
||||
// Reset application settings to defaults, particularly policies.
|
||||
|
|
|
@ -72,14 +72,6 @@ div.phabricator-application-launch-container {
|
|||
display: inline-block;
|
||||
}
|
||||
|
||||
.phabricator-application-beta {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
left: 4px;
|
||||
color: {$bluetext};
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.phabricator-application-launch-attention {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
|
|
Loading…
Reference in a new issue