* Updated cssjanus from v1.1.2 to 1.1.3.
* Updated psr/log from v1.0.0 to v1.0.2.
* Update Moment.js from v2.8.4 to v2.15.0.
+* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.13.
==== New external libraries ====
"ext-xml": "*",
"liuggio/statsd-php-client": "1.0.18",
"mediawiki/at-ease": "1.1.0",
- "oojs/oojs-ui": "0.19.4",
- "oyejorge/less.php": "1.7.0.10",
+ "oojs/oojs-ui": "0.19.5",
+ "oyejorge/less.php": "1.7.0.13",
"php": ">=5.5.9",
"psr/log": "1.0.2",
"wikimedia/assert": "0.2.2",
"apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
"apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page <kbd>Main Page</kbd>.",
"apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
- "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
+ "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de noms.",
"apihelp-query+links-param-limit": "Combien de liens renvoyer.",
"apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
"apihelp-query+links-param-dir": "La direction dans laquelle lister.",
"apihelp-query+links-example-simple": "Obtenir les liens de la page <kbd>Main Page</kbd>",
"apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans <kbd>Main Page</kbd>.",
- "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Accueil</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
+ "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Main Page</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
"apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
"apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :",
"apihelp-query+linkshere-paramvalue-prop-pageid": "ID de chaque page.",
"apihelp-query+linkshere-paramvalue-prop-title": "Titre de chaque page.",
"apihelp-query+linkshere-paramvalue-prop-redirect": "Indique si la page est une redirection.",
- "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+ "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de noms.",
"apihelp-query+linkshere-param-limit": "Combien de résultats renvoyer.",
"apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
"apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à [[Main Page]]",
"apihelp-query+logevents-description": "Obtenir des événements des journaux.",
"apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :",
"apihelp-query+logevents-paramvalue-prop-ids": "Ajoute l’ID de l’événement.",
- "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement.",
- "apihelp-query+logevents-paramvalue-prop-type": "Ajoute le type de l’événement.",
+ "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement enregistré.",
+ "apihelp-query+logevents-paramvalue-prop-type": "Ajoute le type de l’événement enregistré.",
"apihelp-query+logevents-paramvalue-prop-user": "Ajoute l’utilisateur responsable de l’événement.",
"apihelp-query+logevents-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de l’événement.",
"apihelp-query+logevents-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’événement.",
"apihelp-query+logevents-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de l’événement.",
"apihelp-query+logevents-paramvalue-prop-details": "Liste les détails supplémentaires sur l’événement.",
"apihelp-query+logevents-paramvalue-prop-tags": "Liste les balises de l’événement.",
- "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
- "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase <var>$1type</var>. La présence d'une valeur avec un astérisque dans la liste, comme <var>$1type</var>, indique qu'une chaîne arbitraire peut être passée dans dans la requête à la place de l'astérisque.",
+ "apihelp-query+logevents-param-type": "Filtrer les entrées du journal sur ce seul type.",
+ "apihelp-query+logevents-param-action": "Filtrer les actions du journal sur cette seule action. Écrase <var>$1type</var>. Dans le liste des valeurs possibles, les valeurs suivies d'un astérisque, comme <kbd>action/*</kbd>, peuvent avoir différentes chaînes à la place du slash.",
"apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
"apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
"apihelp-query+logevents-param-user": "Restreindre aux entrées générées par l’utilisateur spécifié.",
"apihelp-query+logevents-param-title": "Restreindre aux entrées associées à une page donnée.",
- "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de nom spécifié.",
+ "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de noms spécifié.",
"apihelp-query+logevents-param-prefix": "Restreindre aux entrées commençant par ce préfixe.",
"apihelp-query+logevents-param-tag": "Lister seulement les entrées ayant cette balise.",
"apihelp-query+logevents-param-limit": "Combien d'entrées renvoyer au total.",
"apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.",
"apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).",
"apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через <var>$1inlanguagecode</var>).",
+ "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Виводить список кодів мов, для яких увімкнено [[mw:LanguageConverter|LanguageConverter]], а також варіанти, підтримувані кожною з цих мов.",
"apihelp-query+siteinfo-paramvalue-prop-skins": "Видає список усіх доступних тем оформлення (опціонально локалізовані з використанням <var>$1inlanguagecode</var>, в іншому разі — мовою вмісту).",
"apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Видає список теґів розширення парсеру.",
"apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Видає список гуків парсерних функцій.",
"apierror-invalidexpiry": "Недійсний час завершення «$1».",
"apierror-invalid-file-key": "Недійсний ключ файлу.",
"apierror-invalidlang": "Недійсний код мови для параметра <var>$1</var>.",
- "apierror-invalidoldimage": "Параметр «oldimage» має недійсний формат.",
+ "apierror-invalidoldimage": "Параметр <var>oldimage</var> має недійсний формат.",
"apierror-invalidparammix-cannotusewith": "Параметр <kbd>$1</kbd> не можна використовувати з <kbd>$2</kbd>.",
"apierror-invalidparammix-mustusewith": "Параметр <kbd>$1</kbd> можна використовувати тільки з <kbd>$2</kbd>.",
"apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> не можна поєднувати з параметрами <var>oldid</var>, <var>pageid</var> чи <var>page</var>. Будь ласка, використовуйте <var>title</var> і <var>text</var>.",
"apierror-invalidparammix": "{{PLURAL:$2|Ці параметри}} $1 не можна використовувати водночас.",
- "apierror-invalidsection": "Параметр «section» має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
+ "apierror-invalidsection": "Параметр <var>section</var> має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
"apierror-invalidsha1base36hash": "Поданий хеш SHA1Base36 недійсний.",
"apierror-invalidsha1hash": "Поданий хеш SHA1 недійсний.",
"apierror-invalidtitle": "Погана назва «$1».",
"apiwarn-redirectsandrevids": "Вирішення перенаправлень не може використовуватись разом з параметром <var>revids</var>. Усі перенаправлення, на які вказує <var>revids</var>, не було вирішено.",
"apiwarn-tokennotallowed": "Дія «$1» недозволена для поточного користувача.",
"apiwarn-tokens-origin": "Токени не можна отримати, поки не застосована політика одного походження.",
- "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>: ліміт становить $2.",
+ "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>. Ліміт становить $2.",
"apiwarn-truncatedresult": "Цей результат було скорочено, оскільки інакше він перевищив би ліміт у $1 байтів.",
"apiwarn-unclearnowtimestamp": "Вказування «$2» для параметра мітки часу <var>$1</var> є застарілим. Якщо з якоїсь причини Вам треба чітко вказати поточний час без вираховування його з боку клієнта, використайте <kbd>now</kbd>.",
"apiwarn-unrecognizedvalues": "{{PLURAL:$3|Нерозпізнане|Нерозпізнані}} значення для параметра <var>$1</var>: $2.",
: IP::sanitizeRange( "$ip/16" );
# Bail out if a request already came from this range...
- $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
+ $key = wfMemcKey( static::class, 'attempt', $this->mType, $this->mKey, $ip );
if ( $cache->get( $key ) ) {
return; // possibly the same user
}
* @return string
*/
protected function cacheMissKey() {
- return wfMemcKey( get_class( $this ), 'misses', $this->mType, $this->mKey );
+ return wfMemcKey( static::class, 'misses', $this->mType, $this->mKey );
}
}
}
}
- wfDebugLog( 'caches', get_class( $this ) . ": using store $storeClass" );
+ wfDebugLog( 'caches', static::class . ": using store $storeClass" );
if ( !empty( $conf['storeDirectory'] ) ) {
$storeConf['directory'] = $conf['storeDirectory'];
}
$cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
$cacheKey = $cache->makeKey(
'first-letters',
- get_class( $this ),
+ static::class,
$this->locale,
$this->digitTransformLanguage->getCode(),
self::getICUVersion(),
*/
public function getContext() {
if ( $this->context === null ) {
- $class = get_class( $this );
+ $class = static::class;
wfDebug( __METHOD__ . " ($class): called and \$context is null. " .
"Using RequestContext::getMain() for sanity\n" );
$this->context = RequestContext::getMain();
"</p>\n";
} else {
$logId = WebRequest::getRequestId();
- $type = get_class( $this );
+ $type = static::class;
return "<div class=\"errorbox\">" .
'[' . $logId . '] ' .
gmdate( 'Y-m-d H:i:s' ) . ": " .
if ( $this->useOutputPage() ) {
$wgOut->prepareErrorPage( $this->getPageTitle() );
- $hookResult = $this->runHooks( get_class( $this ) );
+ $hookResult = $this->runHooks( static::class );
if ( $hookResult ) {
$wgOut->addHTML( $hookResult );
} else {
'<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
"</head><body>\n";
- $hookResult = $this->runHooks( get_class( $this ) . 'Raw' );
+ $hookResult = $this->runHooks( static::class . 'Raw' );
if ( $hookResult ) {
echo $hookResult;
} else {
if ( defined( 'MW_API' ) ) {
// Unhandled API exception, we can't be sure that format printer is alive
- self::header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
+ self::header( 'MediaWiki-API-Error: internal_api_error_' . static::class );
wfHttpError( 500, 'Internal Server Error', $this->getText() );
} elseif ( self::isCommandLine() ) {
$message = $this->getText();
$cache = ObjectCache::getMainWANInstance();
return $cache->getWithSetCallback(
- $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) ),
+ $this->getLocalCacheKey( static::class, $target, md5( $url ) ),
$cacheTTL,
function ( $curValue, &$ttl ) use ( $url, $cache ) {
$html = self::httpGet( $url, 'default', [], $mtime );
* @throws MWException
*/
function enumFiles( $callback ) {
- throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
+ throw new MWException( 'enumFiles is not supported by ' . static::class );
}
/**
* @throws MWException
*/
protected function assertWritableRepo() {
- throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+ throw new MWException( static::class . ': write operations are not supported.' );
}
}
}
protected function assertWritableRepo() {
- throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+ throw new MWException( static::class . ': write operations are not supported.' );
}
/**
}
protected function assertWritableRepo() {
- throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+ throw new MWException( static::class . ': write operations are not supported.' );
}
public function getInfo() {
}
protected function assertWritableRepo() {
- throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+ throw new MWException( static::class . ': write operations are not supported.' );
}
}
* @throws MWException
*/
function readOnlyError() {
- throw new MWException( get_class( $this ) . ': write operations are not supported' );
+ throw new MWException( static::class . ': write operations are not supported' );
}
/**
* @param int $flags
*/
function loadFromDB( $flags = 0 ) {
- $fname = get_class( $this ) . '::' . __FUNCTION__;
+ $fname = static::class . '::' . __FUNCTION__;
# Unconditionally set loaded=true, we don't want the accessors constantly rechecking
$this->dataLoaded = true;
* This covers fields that are sometimes not cached.
*/
protected function loadExtraFromDB() {
- $fname = get_class( $this ) . '::' . __FUNCTION__;
+ $fname = static::class . '::' . __FUNCTION__;
# Unconditionally set loaded=true, we don't want the accessors constantly rechecking
$this->extraDataLoaded = true;
*/
public function nextHistoryLine() {
# Polymorphic function name to distinguish foreign and local fetches
- $fname = get_class( $this ) . '::' . __FUNCTION__;
+ $fname = static::class . '::' . __FUNCTION__;
$dbr = $this->repo->getReplicaDB();
public function getTableRow( $value ) {
list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
$inputHtml = $this->getInputHTML( $value );
- $fieldType = get_class( $this );
+ $fieldType = static::class;
$helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
$cellAttributes = [];
$rowAttributes = [];
public function getDiv( $value ) {
list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
$inputHtml = $this->getInputHTML( $value );
- $fieldType = get_class( $this );
+ $fieldType = static::class;
$helptext = $this->getHelpTextHtmlDiv( $this->getHelpText() );
$cellAttributes = [];
$label = $this->getLabelHtml( $cellAttributes );
$infusable = false;
}
- $fieldType = get_class( $this );
+ $fieldType = static::class;
$help = $this->getHelpText();
$errors = $this->getErrorsRaw( $value );
foreach ( $errors as &$error ) {
public function getTableRow( $value ) {
list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
$inputHtml = $this->getInputHTML( $value );
- $fieldType = get_class( $this );
+ $fieldType = static::class;
$helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
$cellAttributes = [ 'colspan' => 2 ];
protected $uniqueId;
public function __construct( $params ) {
- $this->uniqueId = get_class( $this ) . ++self::$counter . 'x';
+ $this->uniqueId = static::class . ++self::$counter . 'x';
parent::__construct( $params );
if ( empty( $this->mParams['fields'] ) || !is_array( $this->mParams['fields'] ) ) {
public function __construct( $params ) {
parent::__construct( $params );
+ // If the disabled-options parameter is not provided, use an empty array
+ if ( isset( $this->mParams['disabled-options'] ) === false ) {
+ $this->mParams['disabled-options'] = [];
+ }
+
// For backwards compatibility, also handle the old way with 'cssclass' => 'mw-chosen'
if ( isset( $params['dropdown'] ) || strpos( $this->mClass, 'mw-chosen' ) !== false ) {
$this->mClass .= ' mw-htmlform-dropdown';
'id' => "{$this->mID}-$info",
'value' => $info,
];
+ if ( in_array( $info, $this->mParams['disabled-options'], true ) ) {
+ $thisAttribs['disabled'] = 'disabled';
+ }
$checked = in_array( $info, $value, true );
$checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
}
}
+ /**
+ * Get options and make them into arrays suitable for OOUI.
+ * @return array Options for inclusion in a select or whatever.
+ */
+ public function getOptionsOOUI() {
+ $options = parent::getOptionsOOUI();
+ foreach ( $options as &$option ) {
+ $option['disabled'] = in_array( $option['data'], $this->mParams['disabled-options'], true );
+ }
+ return $options;
+ }
+
/**
* Get the OOUI version of this field.
*
* @return string
*/
public function getName() {
- return str_replace( 'WebInstaller', '', get_class( $this ) );
+ return str_replace( 'WebInstaller', '', static::class );
}
/**
$this->type = $type;
$this->params = $params;
- $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . get_class( $this ) );
+ $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . static::class );
$this->opts = $opts;
}
// Do a consistency check to see if the backends are consistent...
$syncStatus = $this->consistencyCheck( $relevantPaths );
if ( !$syncStatus->isOK() ) {
- wfDebugLog( 'FileOperation', get_class( $this ) .
+ wfDebugLog( 'FileOperation', static::class .
" failed sync check: " . FormatJson::encode( $relevantPaths ) );
// Try to resync the clone backends to the master on the spot...
if ( $this->autoResync === false
}
if ( !$status->isOK() ) {
- wfDebugLog( 'FileOperation', get_class( $this ) .
+ wfDebugLog( 'FileOperation', static::class .
" failed to resync: " . FormatJson::encode( $paths ) );
}
$status->merge( $this->doConcatenate( $params ) );
$sec = microtime( true ) - $start_time;
if ( !$status->isOK() ) {
- $this->logger->error( get_class( $this ) . "-{$this->name}" .
+ $this->logger->error( static::class . "-{$this->name}" .
" failed to concatenate " . count( $params['srcs'] ) . " file(s) [$sec sec]" );
}
}
$subStatus->success[$i] = false;
++$subStatus->failCount;
}
- $this->logger->error( get_class( $this ) . "-{$this->name} " .
+ $this->logger->error( static::class . "-{$this->name} " .
" stat failure; aborted operations: " . FormatJson::encode( $ops ) );
}
$params = $this->params;
$params['failedAction'] = $action;
try {
- $this->logger->error( get_class( $this ) .
+ $this->logger->error( static::class .
" failed (batch #{$this->batchId}): " . FormatJson::encode( $params ) );
} catch ( Exception $e ) {
// bad config? debug log error?
protected function debug( $text ) {
if ( $this->debugMode ) {
$this->logger->debug( "{class} debug: $text", [
- 'class' => get_class( $this ),
+ 'class' => static::class,
] );
}
}
*/
public function __clone() {
$this->connLogger->warning(
- "Cloning " . get_class( $this ) . " is not recomended; forking connection:\n" .
+ "Cloning " . static::class . " is not recomended; forking connection:\n" .
( new RuntimeException() )->getTraceAsString()
);
*/
private function getDB() {
if ( !$this->db ) {
- throw new RuntimeException( get_class( $this ) . ' needs a DB handle for iteration.' );
+ throw new RuntimeException( static::class . ' needs a DB handle for iteration.' );
}
return $this->db;
* @return string The name of the service behind this VRS object.
*/
public function getName() {
- return isset( $this->params['name'] ) ? $this->params['name'] :
- get_class( $this );
+ return isset( $this->params['name'] ) ? $this->params['name'] : static::class;
}
/**
*/
public function rotate( $file, $params ) {
return new MediaTransformError( 'thumbnail_error', 0, 0,
- get_class( $this ) . ' rotation not implemented' );
+ static::class . ' rotation not implemented' );
}
/**
*/
public function doQuery() {
# Use the child class name for profiling
- $fname = __METHOD__ . ' (' . get_class( $this ) . ')';
+ $fname = __METHOD__ . ' (' . static::class . ')';
$section = Profiler::instance()->scopedProfileIn( $fname );
// @todo This should probably compare to DIR_DESCENDING and DIR_ASCENDING constants
* @return string
*/
function getSqlComment() {
- return get_class( $this );
+ return static::class;
}
/**
*/
public function getDefinitionSummary( ResourceLoaderContext $context ) {
return [
- '_class' => get_class( $this ),
+ '_class' => static::class,
'_cacheEpoch' => $this->getConfig()->get( 'CacheEpoch' ),
];
}
* @return string
*/
public function __toString() {
- return get_class( $this );
+ return static::class;
}
/**
*/
protected function describeMessage() {
return wfMessage(
- 'sessionprovider-' . str_replace( '\\', '-', strtolower( get_class( $this ) ) )
+ 'sessionprovider-' . str_replace( '\\', '-', strtolower( static::class ) )
);
}
global $wgStylePath, $wgStyleVersion;
if ( $this->stylename === null ) {
- $class = get_class( $this );
+ $class = static::class;
throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" );
}
$tpl->set( 'charset', 'UTF-8' );
$tpl->setRef( 'wgScript', $wgScript );
$tpl->setRef( 'skinname', $this->skinname );
- $tpl->set( 'skinclass', get_class( $this ) );
+ $tpl->set( 'skinclass', static::class );
$tpl->setRef( 'skin', $this );
$tpl->setRef( 'stylename', $this->stylename );
$tpl->set( 'printable', $out->isPrintable() );
return 0;
}
- $fname = get_class( $this ) . '::recache';
+ $fname = static::class . '::recache';
$dbw = wfGetDB( DB_MASTER );
if ( !$dbw ) {
return false;
* @since 1.18
*/
public function reallyDoQuery( $limit, $offset = false ) {
- $fname = get_class( $this ) . "::reallyDoQuery";
+ $fname = static::class . '::reallyDoQuery';
$dbr = $this->getRecacheDB();
$query = $this->getQueryInfo();
$order = $this->getOrderFields();
public function getCachedTimestamp() {
if ( is_null( $this->cachedTimestamp ) ) {
$dbr = wfGetDB( DB_REPLICA );
- $fname = get_class( $this ) . '::getCachedTimestamp';
+ $fname = static::class . '::getCachedTimestamp';
$this->cachedTimestamp = $dbr->selectField( 'querycache_info', 'qci_timestamp',
[ 'qci_type' => $this->getName() ], $fname );
}
return $redirect;
} else {
- $class = get_class( $this );
+ $class = static::class;
throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
}
}
* @return bool Whether the HTML is valid
*/
public function validate( $text, &$errorStr ) {
- throw new \MWException( get_class( $this ) . " does not support validate()" );
+ throw new \MWException( static::class . ' does not support validate()' );
}
/**
function __construct() {
$this->mConverter = new FakeConverter( $this );
// Set the code to the name of the descendant
- if ( get_class( $this ) == 'Language' ) {
+ if ( static::class === 'Language' ) {
$this->mCode = 'en';
} else {
- $this->mCode = str_replace( '_', '-', strtolower( substr( get_class( $this ), 8 ) ) );
+ $this->mCode = str_replace( '_', '-', strtolower( substr( static::class, 8 ) ) );
}
self::getLocalisationCache();
}
* @throws MWException
*/
function loadDefaultTables() {
- $name = get_class( $this );
-
- throw new MWException( "Must implement loadDefaultTables() method in class $name" );
+ $class = static::class;
+ throw new MWException( "Must implement loadDefaultTables() method in class $class" );
}
/**
"rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
"rcfilters-highlightbutton-title": "التعليم على النتائج",
"rcfilters-highlightmenu-title": "اختر لونًا",
+ "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
"rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
"rcfilters-filtergroup-registration": "تسجيل المستخدم",
"rcfilters-filter-registered-label": "مسجل",
"rcfilters-invalid-filter": "Filtru inválidu",
"rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
"rcfilters-filterlist-title": "Filtros",
+ "rcfilters-filterlist-feedbacklink": "Comentar sobro los nuevos filtros (beta)",
"rcfilters-highlightbutton-title": "Resaltar resultaos",
"rcfilters-highlightmenu-title": "Seleiciona un color",
"rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
"rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
"rcfilters-highlightbutton-title": "Вылучыць вынікі",
"rcfilters-highlightmenu-title": "Абярыце колер",
+ "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
"rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
"rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
"rcfilters-filter-registered-label": "Зарэгістраваныя",
"editcomment": "Резюмето на редакцията беше: <em>$1</em>.",
"revertpage": "Премахване на [[Special:Contributions/$2|редакции на $2]] ([[User talk:$2|беседа]]); възвръщане към последната версия на [[User:$1|$1]]",
"revertpage-nouser": "Премахнати редакции на (скрито потребителско име) и връщане към последната версия на [[User:$1|$1]]",
- "rollback-success": "Отменени редакции на $1; възвръщане към последната версия на $2.",
+ "rollback-success": "Отменени редакции на {{GENDER:$3|$1}};\nвъзвръщане към последната версия на {{GENDER:$4|$2}}.",
"sessionfailure-title": "Прекъсната сесия",
"sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
"changecontentmodel-title-label": "Заглавие на страницата",
"api-error-emptypage": "Създаването на нови, празени страници, не е разрешено.",
"api-error-publishfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
"api-error-stashfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
- "api-error-unknown-warning": "Непознато предупреждение: „$1“",
+ "api-error-unknown-warning": "Непознато предупреждение: „$1“.",
"api-error-unknownerror": "Неизвестна грешка: „$1“.",
"duration-seconds": "$1 {{PLURAL:$1|секунда|секунди}}",
"duration-minutes": "$1 {{PLURAL:$1|минута|минути}}",
"passwordremindertext": "কেউ একজন ($1 আইপি ঠিকানাটি থেকে সম্ভবত আপনি) অনুরোধ করেছেন যেন আমরা আপনাকে {{SITENAME}} ($4) এর জন্য একটি নতুন পাসওয়ার্ড পাঠাই।\n\"$2\" নামে অ্যাকাউন্ট খোলা হয়েছে এবং এর পাসওয়ার্ড \"$3\"। আপনি যদি এটাই চেয়ে থাকেন, তাহলে আপনাকে এখন অ্যাকাউন্টে প্রবেশ করতে হবে ও নতুন একটি পাসওয়ার্ড পছন্দ করতে হবে।\n{{PLURAL:$5|এক দিন|$5 দিন}} পরে আপনার এই অস্থায়ী পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়ে যাবে।\n\nযদি আপনি ছাড়া অন্য কেউ এই অনুরোধ করে থাকে, কিংবা যদি আপনার পুরনো পাসওয়ার্ড মনে পড়ে গিয়ে থাকে ও সেটি আর বদলাবার ইচ্ছা না থাকে, তাহলে এই বার্তাটি উপেক্ষা করতে পারেন এবং পুরনো পাসওয়ার্ডটিই ব্যবহার করে যেতে পারেন।",
"noemail": "\"$1\" ব্যবহারকারীর জন্য কোন ই-মেইল ঠিকানা সংরক্ষিত নেই।",
"noemailcreate": "আপনাকে অবশ্যই একটি সঠিক ইমেইল ঠিকানা দিতে হবে",
- "passwordsent": "একটি নতুন পাসওয়ার্ড \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়াকরে তা পাওয়ার পর আবার লগ-ইন করুন।",
+ "passwordsent": "একটি নতুন পাসওয়ার্ড \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়া করে তা পাওয়ার পর আবার প্রবেশ করুন।",
"blocked-mailpassword": "আপনার আইপি ঠিকানাটি থেকে সম্পাদনা করতে বাধা আছে। অপব্যবহার রোধ করার জন্য, এই আইপি ঠিকানা থেকে পাসওয়ার্ড পুনরুদ্ধার করার অনুমতি দেয়া হয়নি।",
"eauthentsent": "মনোনীত ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ ই-মেইল পাঠানো হয়েছে।\nঐ অ্যাকাউন্টটে অন্য কোন ই-মেইল পাঠানোর আগে আপনাকে ই-মেইলের নির্দেশগুলি অনুসরণ করতে হবে, যাতে অ্যাকাউন্টটি যে আসলেই আপনার, তা নিশ্চিত হয়।",
"throttled-mailpassword": "বিগত {{PLURAL:$1|ঘণ্টার|$1 ঘণ্টার}} মধ্যে ইতিমধ্যেই একবার পাসওয়ার্ড বদলের তথ্য পাঠানো হয়েছে। অপব্যবহার রোধে প্রতি {{PLURAL:$1|ঘণ্টায়|$1 ঘণ্টায়}} কেবল একবার পাসওয়ার্ড বদলের তথ্য পাঠানো যাবে।",
"uploadbtn": "ফাইল আপলোড করুন",
"reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
"upload-tryagain": "পরিবর্তিত ফাইল বর্ণনা জমা দিন",
- "uploadnologin": "à¦\86পনি লà¦\97-à¦\87ন à¦\95রà§\87ননি।",
+ "uploadnologin": "à¦\86পনি পà§\8dরবà§\87শ à¦\95রà§\87ননি",
"uploadnologintext": "ফাইল আপলোড করতে হলে আপনাকে অবশ্যই $1 করতে হবে।",
"upload_directory_missing": "আপলোড ডাইরেক্টরি ($1) পাওয়া যাচ্ছে না এবং ওয়েব সার্ভার কর্তৃক তৈরি করা যাচ্ছে না।",
"upload_directory_read_only": "আপলোড ডিরেক্টরিটি ($1) ওয়েবসার্ভার কর্তৃক লিখনযোগ্য নয়।",
"viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
"protectedpage": "Zaštićena stranica",
"jumpto": "Idi na:",
- "jumptonavigation": "navigacija",
- "jumptosearch": "traži",
+ "jumptonavigation": "navigaciju",
+ "jumptosearch": "pretragu",
"view-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.\n\n$1",
"generic-pool-error": "Nažalost, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da vidi ovaj resurs.\nMolimo pričekajte trenutak prije nego što ponovo pokušate da mu pristupite.",
"pool-timeout": "Zaustavi čekanje na zaključavanje",
"rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
"rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
"rcfilters-highlightmenu-title": "Eine Farbe auswählen",
+ "rcfilters-highlightmenu-help": "Eine Farbe auswählen, um diese Eigenschaft hervorzuheben.",
"rcfilters-filterlist-noresults": "Keine Filter gefunden",
"rcfilters-filtergroup-registration": "Benutzerregistrierung",
"rcfilters-filter-registered-label": "Angemeldet",
"editcomment": "Redaktsiooni resümee oli: <em>$1</em>.",
"revertpage": "Tühistati kasutaja [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]]) tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
"revertpage-nouser": "Tühistati peidetud kasutaja muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
- "rollback-success": "Tühistati muudatused, mille tegi $1;\npöörduti tagasi viimasele muudatusele, mille tegi $2.",
+ "rollback-success": "Tühistati muudatused, mille tegi {{GENDER:$3|$1}};\npöörduti tagasi viimasele muudatusele, mille tegi {{GENDER:$4|$2}}.",
"rollback-success-notify": "Tühistatud kasutaja $1 tehtud muudatused;\npöördutud tagasi kasutaja $2 viimase redaktsiooni juurde. [$3 Näita muudatusi]",
"sessionfailure-title": "Seansiviga",
"sessionfailure": "Sinu sisselogimisseansiga näib probleem olevat.\nSee toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.\nMine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.",
"htmlform-date-placeholder": "AAAA-KK-PP",
"htmlform-time-placeholder": "TT:MM:SS",
"htmlform-datetime-placeholder": "AAAA-KK-PP TT:MM:SS",
+ "htmlform-date-invalid": "Väärtus, mille ette andsid, pole äratuntav kuupäev. Proovi kasutada vormingut AAAA-KK-PP.",
+ "htmlform-time-invalid": "Väärtus, mille ette andsid, pole äratuntav kellaaeg. Proovi kasutada vormingut TT:MM:SS.",
+ "htmlform-datetime-invalid": "Väärtus, mille ette andsid, pole äratuntav kuupäev ja kellaaeg. Proovi kasutada vormingut AAAA-KK-PP TT:MM:SS.",
+ "htmlform-date-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kuupäeva $1.",
+ "htmlform-date-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kuupäeva $1.",
+ "htmlform-time-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kellaaega $1.",
+ "htmlform-time-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kellaaega $1.",
+ "htmlform-datetime-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kuupäeva ja kellaaega $1.",
+ "htmlform-datetime-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kuupäeva ja kellaaega $1.",
"htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
"htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
"htmlform-title-not-exists": "Lehekülge $1 pole olemas.",
"logentry-tag-update-logentry": "$1 {{GENDER:$2|uuendas}} leheküljel \"$3\" logisissekande $5 märgiseid ({{PLURAL:$7|lisatud}} $6; {{PLURAL:$9|eemaldatud}} $8)",
"rightsnone": "(puudub)",
"revdelete-summary": "resümee",
+ "rightslogentry-temporary-group": "$1 (ajutine, tähtaeg $2)",
"feedback-adding": "Tagasiside lisamine leheküljele...",
"feedback-back": "Tagasi",
"feedback-bugcheck": "Hästi! Kontrolli vaid, ega tegu pole juba [$1 teada oleva veaga].",
"rcfilters-filterlist-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
"rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
"rcfilters-highlightmenu-title": "Choisir une couleur",
+ "rcfilters-highlightmenu-help": "Sélectionner une couleur pour mettre en évidence cette propriété",
"rcfilters-filterlist-noresults": "Aucun filtre trouvé",
"rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
"rcfilters-filter-registered-label": "Connectés",
"rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
"rcfilters-highlightbutton-title": "הבלטת התוצאות",
"rcfilters-highlightmenu-title": "בחירת צבע",
+ "rcfilters-highlightmenu-help": "בחירת צבע להדגשת מאפיין זה",
"rcfilters-filterlist-noresults": "לא נמצאו מסננים",
"rcfilters-filtergroup-registration": "רישום העורכים",
"rcfilters-filter-registered-label": "רשומים",
"rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
"rcfilters-filterlist-title": "Filtri",
"rcfilters-highlightmenu-title": "Seleziona un colore",
+ "rcfilters-highlightmenu-help": "Seleziona un colore per evidenziare questa proprietà",
"rcfilters-filterlist-noresults": "Nessun filtro trovato",
"rcfilters-filtergroup-registration": "Registrazione utente",
"rcfilters-filter-registered-label": "Registrato",
"rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
"rcfilters-highlightbutton-title": "Выделить результаты",
"rcfilters-highlightmenu-title": "Выберите цвет",
+ "rcfilters-highlightmenu-help": "Выберите цвет, чтобы подсветить это свойство",
"rcfilters-filterlist-noresults": "Фильтры не найдены",
"rcfilters-filtergroup-registration": "Регистрация участников",
"rcfilters-filter-registered-label": "Зарегистрированные",
"rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
"rcfilters-highlightbutton-title": "Označi rezultate",
"rcfilters-highlightmenu-title": "Izberite barvo",
+ "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
"rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
"rcfilters-filtergroup-registration": "Registracija uporabnika",
"rcfilters-filter-registered-label": "Registriran",
"selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"{{int:savearticle}}\" ще раз, перенаправлення буде створено.",
"missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.",
"missingcommentheader": "<strong>Нагадування</strong>: Ви не вказали тему для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, Ви збережете редагування без заголовка.",
- "summary-preview": "Ð\9eпиÑ\81 бÑ\83де:",
- "subject-preview": "Тема бÑ\83де:",
+ "summary-preview": "Ð\9fопеÑ\80еднÑ\96й пеÑ\80еглÑ\8fд опиÑ\81Ñ\83 Ñ\80едагÑ\83ваннÑ\8f:",
+ "subject-preview": "Ð\9fопеÑ\80еднÑ\96й пеÑ\80еглÑ\8fд Ñ\82еми:",
"previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
"blockedtitle": "Користувача заблоковано",
"blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
"rcfilters-invalid-filter": "Недійсний фільтр",
"rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
"rcfilters-filterlist-title": "Фільтри",
+ "rcfilters-filterlist-feedbacklink": "Надайте відгук про нові (бета) фільтри",
+ "rcfilters-highlightbutton-title": "Виділити результати",
+ "rcfilters-highlightmenu-title": "Вибрати колір",
+ "rcfilters-highlightmenu-help": "Вибрати колір, щоб виділити цю властивість",
"rcfilters-filterlist-noresults": "Фільтри не знайдено",
"rcfilters-filtergroup-registration": "Реєстрація користувача",
"rcfilters-filter-registered-label": "Зареєстровані",
"editcomment": "Пояснення редагування було: «<em>$1</em>.».",
"revertpage": "Відкинуто редагування [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]]) до зробленого [[User:$1|$1]]",
"revertpage-nouser": "Відкинуто редагування прихованого користувача до останньої версії, зробленої {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Відкинуті редагування користувача $1; повернення до версії користувача $2.",
+ "rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
"rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]",
"sessionfailure-title": "Помилка сеансу",
"sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nця дія була скасована з метою попередити «захоплення сеансу».\nБудь ласка, натисніть кнопку «Назад» і перезавантажте сторінку, з якої ви прийшли.",
"rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
"rcfilters-highlightbutton-title": "高亮结果",
"rcfilters-highlightmenu-title": "选择颜色",
+ "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
"rcfilters-filterlist-noresults": "找不到过滤器",
"rcfilters-filtergroup-registration": "用户注册",
"rcfilters-filter-registered-label": "已注册",
'mediawiki.rcfilters.filters.dm',
'oojs-ui.styles.icons-moderation',
'oojs-ui.styles.icons-editing-core',
+ 'oojs-ui.styles.icons-editing-styling',
'oojs-ui.styles.icons-interactions',
],
],
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:40Z
+ * Date: 2017-03-07T22:57:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-element-hidden {
display: none !important;
- /* stylelint-disable-line declaration-no-important */
}
.oo-ui-buttonElement {
display: inline-block;
.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
display: block;
position: absolute;
- /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
background-repeat: no-repeat;
}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+ content: '';
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-color: transparent;
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+ left: 0;
+ /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
+ border-top: 0;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+ left: 0;
+ /* `bottom` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+ border-bottom: 0;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+ top: 0;
+ /* `left` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+ border-left: 0;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+ top: 0;
+ /* `right` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+ border-right: 0;
+}
.oo-ui-popupWidget-head {
-webkit-touch-callout: none;
-webkit-user-select: none;
border-radius: 0.25em;
box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
}
-.oo-ui-popupWidget-anchored {
+.oo-ui-popupWidget-anchored-top {
margin-top: 6px;
}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
top: -6px;
}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
- content: '';
- position: absolute;
- width: 0;
- height: 0;
- border-style: solid;
- border-color: transparent;
- border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
bottom: -7px;
left: -6px;
border-bottom-color: #aaa;
border-width: 7px;
}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
bottom: -7px;
left: -5px;
border-bottom-color: #fff;
border-width: 6px;
}
+.oo-ui-popupWidget-anchored-bottom {
+ margin-bottom: 6px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+ bottom: -6px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
+ top: -7px;
+ left: -6px;
+ border-top-color: #aaa;
+ border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+ top: -7px;
+ left: -5px;
+ border-top-color: #fff;
+ border-width: 6px;
+}
+.oo-ui-popupWidget-anchored-start {
+ margin-left: 6px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+ left: -6px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before {
+ right: -7px;
+ top: -6px;
+ border-right-color: #aaa;
+ border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+ right: -7px;
+ top: -5px;
+ border-right-color: #fff;
+ border-width: 6px;
+}
+.oo-ui-popupWidget-anchored-end {
+ margin-right: 6px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+ right: -6px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before {
+ left: -7px;
+ top: -6px;
+ border-left-color: #aaa;
+ border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+ left: -7px;
+ top: -5px;
+ border-left-color: #fff;
+ border-width: 6px;
+}
.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
.oo-ui-popupButtonWidget .oo-ui-popupWidget {
cursor: auto;
}
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
margin-left: 0.9375em;
}
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
margin-left: 1.2375em;
}
.oo-ui-inputWidget {
-webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
-moz-transition: border-color 250ms ease, box-shadow 250ms ease;
transition: border-color 250ms ease, box-shadow 250ms ease;
- /* stylelint-disable indentation */
- /* stylelint-enable indentation */
}
.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-element-hidden {
display: none !important;
- /* stylelint-disable-line declaration-no-important */
}
.oo-ui-buttonElement {
display: inline-block;
.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
display: block;
position: absolute;
- /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
background-repeat: no-repeat;
}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+ content: '';
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-color: transparent;
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+ left: 0;
+ /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
+ border-top: 0;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+ left: 0;
+ /* `bottom` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+ border-bottom: 0;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+ top: 0;
+ /* `left` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+ border-left: 0;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+ top: 0;
+ /* `right` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+ border-right: 0;
+}
.oo-ui-popupWidget-head {
-webkit-touch-callout: none;
-webkit-user-select: none;
border-radius: 2px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
}
-.oo-ui-popupWidget-anchored {
+.oo-ui-popupWidget-anchored-top {
margin-top: 9px;
}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
top: -9px;
}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
- content: '';
- position: absolute;
- width: 0;
- height: 0;
- border-style: solid;
- border-color: transparent;
- border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
bottom: -10px;
left: -9px;
border-bottom-color: #a2a9b1;
border-width: 10px;
}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
bottom: -10px;
left: -8px;
border-bottom-color: #fff;
border-width: 9px;
}
+.oo-ui-popupWidget-anchored-bottom {
+ margin-bottom: 9px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+ bottom: -9px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
+ top: -10px;
+ left: -9px;
+ border-top-color: #a2a9b1;
+ border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+ top: -10px;
+ left: -8px;
+ border-top-color: #fff;
+ border-width: 9px;
+}
+.oo-ui-popupWidget-anchored-start {
+ margin-left: 9px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+ left: -9px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before {
+ right: -10px;
+ top: -9px;
+ border-right-color: #a2a9b1;
+ border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+ right: -10px;
+ top: -8px;
+ border-right-color: #fff;
+ border-width: 9px;
+}
+.oo-ui-popupWidget-anchored-end {
+ margin-right: 9px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+ right: -9px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before {
+ left: -10px;
+ top: -9px;
+ border-left-color: #a2a9b1;
+ border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+ left: -10px;
+ top: -8px;
+ border-left-color: #fff;
+ border-width: 9px;
+}
.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-webkit-transition: width 100ms, height 100ms, left 100ms;
-moz-transition: width 100ms, height 100ms, left 100ms;
.oo-ui-popupButtonWidget .oo-ui-popupWidget {
cursor: auto;
}
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
margin-left: 0.9375em;
}
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
margin-left: 1.5em;
}
.oo-ui-inputWidget {
-webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
- /* stylelint-disable indentation */
- /* stylelint-enable indentation */
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:40Z
+ * Date: 2017-03-07T22:57:01Z
*/
( function ( OO ) {
* 'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge
* 'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge
* 'center': Horizontally align the center with $floatableContainer's center
+ * @cfg {boolean} [hideWhenOutOfView=true] Whether to hide the floatable element if the container
+ * is out of view
*/
OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
// Configuration initialization
this.setFloatableElement( config.$floatable || this.$element );
this.setVerticalPosition( config.verticalPosition || 'below' );
this.setHorizontalPosition( config.horizontalPosition || 'start' );
+ this.hideWhenOutOfView = config.hideWhenOutOfView === undefined ? true : !!config.hideWhenOutOfView;
};
/* Methods */
if ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {
throw new Error( 'Invalid value for vertical position: ' + position );
}
- this.verticalPosition = position;
- if ( this.$floatable ) {
- this.position();
+ if ( this.verticalPosition !== position ) {
+ this.verticalPosition = position;
+ if ( this.$floatable ) {
+ this.position();
+ }
}
};
if ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {
throw new Error( 'Invalid value for horizontal position: ' + position );
}
- this.horizontalPosition = position;
- if ( this.$floatable ) {
- this.position();
+ if ( this.horizontalPosition !== position ) {
+ this.horizontalPosition = position;
+ if ( this.$floatable ) {
+ this.position();
+ }
}
};
* @chainable
*/
OO.ui.mixin.FloatableElement.prototype.position = function () {
- var containerPos, direction, $offsetParent, isBody, scrollableX, scrollableY,
- horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
- newPos = { top: '', left: '', bottom: '', right: '' };
-
if ( !this.positioning ) {
return this;
}
- if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
+ if ( this.hideWhenOutOfView && !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
this.$floatable.addClass( 'oo-ui-element-hidden' );
- return;
+ return this;
} else {
this.$floatable.removeClass( 'oo-ui-element-hidden' );
}
if ( !this.needsCustomPosition ) {
- return;
+ return this;
}
- direction = this.$floatableContainer.css( 'direction' );
- $offsetParent = this.$floatable.offsetParent();
+ this.$floatable.css( this.computePosition() );
+
+ // We updated the position, so re-evaluate the clipping state.
+ // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
+ // will not notice the need to update itself.)
+ // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
+ // it not listen to the right events in the right places?
+ if ( this.clip ) {
+ this.clip();
+ }
+
+ return this;
+};
+
+/**
+ * Compute how #$floatable should be positioned based on the position of #$floatableContainer
+ * and the positioning settings. This is a helper for #position that shouldn't be called directly,
+ * but may be overridden by subclasses if they want to change or add to the positioning logic.
+ *
+ * @return {Object} New position to apply with .css(). Keys are 'top', 'left', 'bottom' and 'right'.
+ */
+OO.ui.mixin.FloatableElement.prototype.computePosition = function () {
+ var isBody, scrollableX, scrollableY, containerPos,
+ horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
+ newPos = { top: '', left: '', bottom: '', right: '' },
+ direction = this.$floatableContainer.css( 'direction' ),
+ $offsetParent = this.$floatable.offsetParent();
+
if ( $offsetParent.is( 'html' ) ) {
// The innerHeight/Width and clientHeight/Width calculations don't work well on the
// <html> element, but they do work on the <body>
}
}
- this.$floatable.css( newPos );
-
- // We updated the position, so re-evaluate the clipping state.
- // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
- // will not notice the need to update itself.)
- // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
- // it not listen to the right events in the right places?
- if ( this.clip ) {
- this.clip();
- }
-
- return this;
+ return newPos;
};
/**
* @cfg {number} [width=320] Width of popup in pixels
* @cfg {number} [height] Height of popup in pixels. Omit to use the automatic height.
* @cfg {boolean} [anchor=true] Show anchor pointing to origin of popup
- * @cfg {string} [align='center'] Alignment of the popup: `center`, `force-left`, `force-right`, `backwards` or `forwards`.
- * If the popup is forced-left the popup body is leaning towards the left. For force-right alignment, the body of the
- * popup is leaning towards the right of the screen.
- * Using 'backwards' is a logical direction which will result in the popup leaning towards the beginning of the sentence
- * in the given language, which means it will flip to the correct positioning in right-to-left languages.
- * Using 'forward' will also result in a logical alignment where the body of the popup leans towards the end of the
- * sentence in the given language.
+ * @cfg {string} [position='below'] Where to position the popup relative to $floatableContainer
+ * 'above': Put popup above $floatableContainer; anchor points down to the start edge of $floatableContainer
+ * 'below': Put popup below $floatableContainer; anchor points up to the start edge of $floatableContainer
+ * 'before': Put popup to the left (LTR) / right (RTL) of $floatableContainer; anchor points
+ * endwards (right/left) to the vertical center of $floatableContainer
+ * 'after': Put popup to the right (LTR) / left (RTL) of $floatableContainer; anchor points
+ * startwards (left/right) to the vertical center of $floatableContainer
+ * @cfg {string} [align='center'] How to align the popup to $floatableContainer
+ * 'forwards': If position is above/below, move the popup as far endwards (right in LTR, left in RTL)
+ * as possible while still keeping the anchor within the popup;
+ * if position is before/after, move the popup as far downwards as possible.
+ * 'backwards': If position is above/below, move the popup as far startwards (left in LTR, right in RTL)
+ * as possible while still keeping the anchor within the popup;
+ * if position in before/after, move the popup as far upwards as possible.
+ * 'center': Horizontally (if position is above/below) or vertically (before/after) align the center
+ * of the popup with the center of $floatableContainer.
+ * 'force-left': Alias for 'forwards' in LTR and 'backwards' in RTL
+ * 'force-right': Alias for 'backwards' in RTL and 'forwards' in LTR
* @cfg {jQuery} [$container] Constrain the popup to the boundaries of the specified container.
* See the [OOjs UI docs on MediaWiki][3] for an example.
* [3]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups#containerExample
this.autoClose = !!config.autoClose;
this.$autoCloseIgnore = config.$autoCloseIgnore;
this.transitionTimeout = null;
- this.anchor = null;
+ this.anchored = false;
this.width = config.width !== undefined ? config.width : 320;
this.height = config.height !== undefined ? config.height : null;
- this.setAlignment( config.align );
this.onMouseDownHandler = this.onMouseDown.bind( this );
this.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this );
// Initialization
this.toggleAnchor( config.anchor === undefined || config.anchor );
+ this.setAlignment( config.align || 'center' );
+ this.setPosition( config.position || 'below' );
this.$body.addClass( 'oo-ui-popupWidget-body' );
this.$anchor.addClass( 'oo-ui-popupWidget-anchor' );
this.$popup
this.anchored = show;
}
};
+/**
+ * Change which edge the anchor appears on.
+ *
+ * @param {string} edge 'top', 'bottom', 'start' or 'end'
+ */
+OO.ui.PopupWidget.prototype.setAnchorEdge = function ( edge ) {
+ if ( [ 'top', 'bottom', 'start', 'end' ].indexOf( edge ) === -1 ) {
+ throw new Error( 'Invalid value for edge: ' + edge );
+ }
+ if ( this.anchorEdge !== null ) {
+ this.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
+ }
+ this.anchorEdge = edge;
+ this.$element.addClass( 'oo-ui-popupWidget-anchored-' + edge );
+};
/**
* Check if the anchor is visible.
* @return {boolean} Anchor is visible
*/
OO.ui.PopupWidget.prototype.hasAnchor = function () {
- return this.anchor;
+ return this.anchored;
};
/**
OO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );
this.warnedUnattached = true;
}
+ if ( show && !this.$floatableContainer && this.isElementAttached() ) {
+ // Fall back to the parent node if the floatableContainer is not set
+ this.setFloatableContainer( this.$element.parent() );
+ }
// Parent method
OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
* @chainable
*/
OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
- var popupOffset, originOffset, containerLeft, containerWidth, containerRight,
- popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth, direction,
- dirFactor, align,
+ var widget = this;
+
+ // Prevent transition from being interrupted
+ clearTimeout( this.transitionTimeout );
+ if ( transition ) {
+ // Enable transition
+ this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+ }
+
+ this.position();
+
+ if ( transition ) {
+ // Prevent transitioning after transition is complete
+ this.transitionTimeout = setTimeout( function () {
+ widget.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+ }, 200 );
+ } else {
+ // Prevent transitioning immediately
+ this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+ }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupWidget.prototype.computePosition = function () {
+ var direction, align, vertical, start, end, near, far, sizeProp, popupSize, anchorSize, anchorPos,
+ anchorOffset, anchorMargin, parentPosition, positionProp, positionAdjustment, floatablePos,
+ offsetParentPos, containerPos,
+ popupPos = {},
+ anchorCss = { left: '', right: '', top: '', bottom: '' },
alignMap = {
ltr: {
'force-left': 'backwards',
'force-right': 'backwards'
}
},
- widget = this;
+ anchorEdgeMap = {
+ above: 'bottom',
+ below: 'top',
+ before: 'end',
+ after: 'start'
+ },
+ hPosMap = {
+ forwards: 'start',
+ center: 'center',
+ backwards: 'before'
+ },
+ vPosMap = {
+ forwards: 'top',
+ center: 'center',
+ backwards: 'bottom'
+ };
if ( !this.$container ) {
// Lazy-initialize $container if not specified in constructor
this.$container = $( this.getClosestScrollableElementContainer() );
}
direction = this.$container.css( 'direction' );
- dirFactor = direction === 'rtl' ? -1 : 1;
- align = alignMap[ direction ][ this.align ] || this.align;
- // Set height and width before measuring things, since it might cause our measurements
- // to change (e.g. due to scrollbars appearing or disappearing)
+ // Set height and width before we do anything else, since it might cause our measurements
+ // to change (e.g. due to scrollbars appearing or disappearing), and it also affects centering
this.$popup.css( {
width: this.width,
height: this.height !== null ? this.height : 'auto'
} );
- // Compute initial popupOffset based on alignment
- popupOffset = this.width * ( { backwards: -1, center: -0.5, forwards: 0 } )[ align ];
-
- // Figure out if this will cause the popup to go beyond the edge of the container
- originOffset = this.$element.offset().left;
- containerLeft = this.$container.offset().left;
- containerWidth = this.$container.innerWidth();
- containerRight = containerLeft + containerWidth;
- popupLeft = dirFactor * popupOffset - this.containerPadding;
- popupRight = dirFactor * popupOffset + this.containerPadding + this.width + this.containerPadding;
- overlapLeft = ( originOffset + popupLeft ) - containerLeft;
- overlapRight = containerRight - ( originOffset + popupRight );
-
- // Adjust offset to make the popup not go beyond the edge, if needed
- if ( overlapRight < 0 ) {
- popupOffset += dirFactor * overlapRight;
- } else if ( overlapLeft < 0 ) {
- popupOffset -= dirFactor * overlapLeft;
- }
+ align = alignMap[ direction ][ this.align ] || this.align;
+ // If the popup is positioned before or after, then the anchor positioning is vertical, otherwise horizontal
+ vertical = this.popupPosition === 'before' || this.popupPosition === 'after';
+ start = vertical ? 'top' : ( direction === 'rtl' ? 'right' : 'left' );
+ end = vertical ? 'bottom' : ( direction === 'rtl' ? 'left' : 'right' );
+ near = vertical ? 'top' : 'left';
+ far = vertical ? 'bottom' : 'right';
+ sizeProp = vertical ? 'Height' : 'Width';
+ popupSize = vertical ? ( this.height || this.$popup.height() ) : this.width;
+
+ this.setAnchorEdge( anchorEdgeMap[ this.popupPosition ] );
+ this.horizontalPosition = vertical ? this.popupPosition : hPosMap[ align ];
+ this.verticalPosition = vertical ? vPosMap[ align ] : this.popupPosition;
- // Adjust offset to avoid anchor being rendered too close to the edge
- // $anchor.width() doesn't work with the pure CSS anchor (returns 0)
- // TODO: Find a measurement that works for CSS anchors and image anchors
- anchorWidth = this.$anchor[ 0 ].scrollWidth * 2;
- if ( popupOffset + this.width < anchorWidth ) {
- popupOffset = anchorWidth - this.width;
- } else if ( -popupOffset < anchorWidth ) {
- popupOffset = -anchorWidth;
+ // Parent method
+ parentPosition = OO.ui.mixin.FloatableElement.prototype.computePosition.call( this );
+ // Find out which property FloatableElement used for positioning, and adjust that value
+ positionProp = vertical ?
+ ( parentPosition.top !== '' ? 'top' : 'bottom' ) :
+ ( parentPosition.left !== '' ? 'left' : 'right' );
+
+ // Figure out where the near and far edges of the popup and $floatableContainer are
+ floatablePos = this.$floatableContainer.offset();
+ floatablePos[ far ] = floatablePos[ near ] + this.$floatableContainer[ 'outer' + sizeProp ]();
+ // Measure where the offsetParent is and compute our position based on that and parentPosition
+ offsetParentPos = this.$element.offsetParent().offset();
+
+ if ( positionProp === near ) {
+ popupPos[ near ] = offsetParentPos[ near ] + parentPosition[ near ];
+ popupPos[ far ] = popupPos[ near ] + popupSize;
+ } else {
+ popupPos[ far ] = offsetParentPos[ near ] +
+ this.$element.offsetParent()[ 'inner' + sizeProp ]() - parentPosition[ far ];
+ popupPos[ near ] = popupPos[ far ] - popupSize;
+ }
+
+ // Position the anchor (which is positioned relative to the popup) to point to $floatableContainer
+ // For popups above/below, we point to the start edge; for popups before/after, we point to the center
+ anchorPos = vertical ? ( floatablePos[ start ] + floatablePos[ end ] ) / 2 : floatablePos[ start ];
+ anchorOffset = ( start === far ? -1 : 1 ) * ( anchorPos - popupPos[ start ] );
+
+ // If the anchor is less than 2*anchorSize from either edge, move the popup to make more space
+ // this.$anchor.width()/height() returns 0 because of the CSS trickery we use, so use scrollWidth/Height
+ anchorSize = this.$anchor[ 0 ][ 'scroll' + sizeProp ];
+ anchorMargin = parseFloat( this.$anchor.css( 'margin-' + start ) );
+ if ( anchorOffset + anchorMargin < 2 * anchorSize ) {
+ // Not enough space for the anchor on the start side; pull the popup startwards
+ positionAdjustment = ( positionProp === start ? -1 : 1 ) *
+ ( 2 * anchorSize - ( anchorOffset + anchorMargin ) );
+ } else if ( anchorOffset + anchorMargin > popupSize - 2 * anchorSize ) {
+ // Not enough space for the anchor on the end side; pull the popup endwards
+ positionAdjustment = ( positionProp === end ? -1 : 1 ) *
+ ( anchorOffset + anchorMargin - ( popupSize - 2 * anchorSize ) );
+ } else {
+ positionAdjustment = 0;
}
- // Prevent transition from being interrupted
- clearTimeout( this.transitionTimeout );
- if ( transition ) {
- // Enable transition
- this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+ // Check if the popup will go beyond the edge of this.$container
+ containerPos = this.$container.offset();
+ containerPos[ far ] = containerPos[ near ] + this.$container[ 'inner' + sizeProp ]();
+ // Take into account how much the popup will move because of the adjustments we're going to make
+ popupPos[ near ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
+ popupPos[ far ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
+ if ( containerPos[ near ] + this.containerPadding > popupPos[ near ] ) {
+ // Popup goes beyond the near (left/top) edge, move it to the right/bottom
+ positionAdjustment += ( positionProp === near ? 1 : -1 ) *
+ ( containerPos[ near ] + this.containerPadding - popupPos[ near ] );
+ } else if ( containerPos[ far ] - this.containerPadding < popupPos[ far ] ) {
+ // Popup goes beyond the far (right/bottom) edge, move it to the left/top
+ positionAdjustment += ( positionProp === far ? 1 : -1 ) *
+ ( popupPos[ far ] - ( containerPos[ far ] - this.containerPadding ) );
}
- // Position body relative to anchor
- this.$popup.css( direction === 'rtl' ? 'margin-right' : 'margin-left', popupOffset );
-
- if ( transition ) {
- // Prevent transitioning after transition is complete
- this.transitionTimeout = setTimeout( function () {
- widget.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
- }, 200 );
- } else {
- // Prevent transitioning immediately
- this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
- }
+ // Adjust anchorOffset for positionAdjustment
+ anchorOffset += ( positionProp === start ? -1 : 1 ) * positionAdjustment;
- // Reevaluate clipping state since we've relocated and resized the popup
- this.clip();
+ // Position the anchor
+ anchorCss[ start ] = anchorOffset;
+ this.$anchor.css( anchorCss );
+ // Move the popup if needed
+ parentPosition[ positionProp ] += positionAdjustment;
- return this;
+ return parentPosition;
};
/**
} else {
this.align = 'center';
}
+ this.position();
};
/**
* Get popup alignment
*
- * @return {string} align Alignment of the popup, `center`, `force-left`, `force-right`,
+ * @return {string} Alignment of the popup, `center`, `force-left`, `force-right`,
* `backwards` or `forwards`.
*/
OO.ui.PopupWidget.prototype.getAlignment = function () {
return this.align;
};
+/**
+ * Change the positioning of the popup.
+ *
+ * @param {string} position 'above', 'below', 'before' or 'after'
+ */
+OO.ui.PopupWidget.prototype.setPosition = function ( position ) {
+ if ( [ 'above', 'below', 'before', 'after' ].indexOf( position ) === -1 ) {
+ position = 'below';
+ }
+ this.popupPosition = position;
+ this.position();
+};
+
+/**
+ * Get popup positioning.
+ *
+ * @return {string} 'above', 'below', 'before' or 'after'
+ */
+OO.ui.PopupWidget.prototype.getPosition = function () {
+ return this.popupPosition;
+};
+
/**
* PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.
* A popup is a container for content. It is overlaid and positioned absolutely. By default, each
// Properties
this.popup = new OO.ui.PopupWidget( $.extend(
- { autoClose: true },
+ {
+ autoClose: true,
+ $floatableContainer: this.$element
+ },
config.popup,
- { $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore ) }
+ {
+ $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore )
+ }
) );
};
OO.ui.PopupButtonWidget.parent.call( this, config );
// Mixin constructors
- OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
- popup: {
- $floatableContainer: this.$element
- }
- } ) );
+ OO.ui.mixin.PopupElement.call( this, config );
// Properties
this.$overlay = config.$overlay || this.$element;
* @protected
*/
OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
- var i, item, visible,
+ var i, item, visible, section, sectionEmpty,
anyVisible = false,
len = this.items.length,
showAll = !this.isVisible(),
filter = showAll ? null : this.getItemMatcher( this.$input.val() );
+ // Hide non-matching options, and also hide section headers if all options
+ // in their section are hidden.
for ( i = 0; i < len; i++ ) {
item = this.items[ i ];
- if ( item instanceof OO.ui.OptionWidget ) {
+ if ( item instanceof OO.ui.MenuSectionOptionWidget ) {
+ if ( section ) {
+ // If the previous section was empty, hide its header
+ section.toggle( showAll || !sectionEmpty );
+ }
+ section = item;
+ sectionEmpty = true;
+ } else if ( item instanceof OO.ui.OptionWidget ) {
visible = showAll || filter( item );
anyVisible = anyVisible || visible;
+ sectionEmpty = sectionEmpty && !visible;
item.toggle( visible );
}
}
+ // Process the final section
+ if ( section ) {
+ section.toggle( showAll || !sectionEmpty );
+ }
this.$element.toggleClass( 'oo-ui-menuSelectWidget-invisible', !anyVisible );
* specifies minimum number of rows to display.
* @cfg {boolean} [autosize=false] Automatically resize the text input to fit its content.
* Use the #maxRows config to specify a maximum number of displayed rows.
- * @cfg {boolean} [maxRows] Maximum number of rows to display when #autosize is set to true.
+ * @cfg {number} [maxRows] Maximum number of rows to display when #autosize is set to true.
* Defaults to the maximum of `10` and `2 * rows`, or `10` if `rows` isn't provided.
* @cfg {string} [labelPosition='after'] The position of the inline label relative to that of
* the value or placeholder text: `'before'` or `'after'`
* - by choosing a value from the menu. The value of the chosen option will then appear in the text
* input field.
*
+ * After the user chooses an option, its `data` will be used as a new value for the widget.
+ * A `label` also can be specified for each option: if given, it will be shown instead of the
+ * `data` in the dropdown menu.
+ *
* This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
*
* For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
* @example
* // Example: A ComboBoxInputWidget.
* var comboBox = new OO.ui.ComboBoxInputWidget( {
- * label: 'ComboBoxInputWidget',
* value: 'Option 1',
- * menu: {
- * items: [
- * new OO.ui.MenuOptionWidget( {
- * data: 'Option 1',
- * label: 'Option One'
- * } ),
- * new OO.ui.MenuOptionWidget( {
- * data: 'Option 2',
- * label: 'Option Two'
- * } ),
- * new OO.ui.MenuOptionWidget( {
- * data: 'Option 3',
- * label: 'Option Three'
- * } ),
- * new OO.ui.MenuOptionWidget( {
- * data: 'Option 4',
- * label: 'Option Four'
- * } ),
- * new OO.ui.MenuOptionWidget( {
- * data: 'Option 5',
- * label: 'Option Five'
- * } )
- * ]
- * }
+ * options: [
+ * { data: 'Option 1' },
+ * { data: 'Option 2' },
+ * { data: 'Option 3' }
+ * ]
+ * } );
+ * $( 'body' ).append( comboBox.$element );
+ *
+ * @example
+ * // Example: A ComboBoxInputWidget with additional option labels.
+ * var comboBox = new OO.ui.ComboBoxInputWidget( {
+ * value: 'Option 1',
+ * options: [
+ * {
+ * data: 'Option 1',
+ * label: 'Option One'
+ * },
+ * {
+ * data: 'Option 2',
+ * label: 'Option Two'
+ * },
+ * {
+ * data: 'Option 3',
+ * label: 'Option Three'
+ * }
+ * ]
* } );
* $( 'body' ).append( comboBox.$element );
*
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:40Z
+ * Date: 2017-03-07T22:57:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
z-index: 4;
}
-.oo-ui-popupTool .oo-ui-popupWidget {
- /* @noflip */
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
margin-left: 1.25em;
}
.oo-ui-toolGroupTool > .oo-ui-popupToolGroup {
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-tool.oo-ui-widget-enabled {
-webkit-transition: background-color 100ms;
-moz-transition: background-color 100ms;
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
z-index: 4;
}
-.oo-ui-popupTool .oo-ui-popupWidget {
- /* @noflip */
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
+.oo-ui-popupTool .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
margin-left: 1.25em;
}
.oo-ui-toolGroupTool > .oo-ui-toolGroup {
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:40Z
+ * Date: 2017-03-07T22:57:01Z
*/
( function ( OO ) {
OO.ui.mixin.PopupElement.call( this, config );
// Initialization
+ this.popup.setPosition( toolGroup.getToolbar().position === 'bottom' ? 'above' : 'below' );
this.$element
.addClass( 'oo-ui-popupTool' )
.append( this.popup.$element );
for ( i = 0, len = this.collapsibleTools.length; i < len; i++ ) {
this.collapsibleTools[ i ].toggle( this.expanded );
}
+
+ // Re-evaluate clipping, because our height has changed
+ this.clip();
};
/**
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
cursor: move;
left: 0;
right: 0;
bottom: 0;
- /* stylelint-disable declaration-no-important */
- /* stylelint-enable declaration-no-important */
}
.oo-ui-menuLayout-menu,
.oo-ui-menuLayout-content {
.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
opacity: 0.5;
}
-.oo-ui-outlineOptionWidget-level-0 {
- padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
- left: 1em;
+.oo-ui-outlineOptionWidget-level-0.oo-ui-iconElement {
+ padding-left: 2.5em;
}
.oo-ui-outlineOptionWidget-level-1 {
- padding-left: 5em;
+ padding-left: 2.5em;
+}
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement {
+ padding-left: 4.5em;
}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement .oo-ui-iconElement-icon {
left: 2.5em;
}
.oo-ui-outlineOptionWidget-level-2 {
- padding-left: 6.5em;
+ padding-left: 5em;
+}
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement {
+ padding-left: 7em;
}
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
- left: 4em;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement .oo-ui-iconElement-icon {
+ left: 5em;
}
.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
background-color: #a7dcff;
background-color: transparent;
color: #000;
vertical-align: middle;
- /* stylelint-disable indentation */
- /* stylelint-enable indentation */
}
.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
color: #72777d;
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
cursor: move;
left: 0;
right: 0;
bottom: 0;
- /* stylelint-disable declaration-no-important */
- /* stylelint-enable declaration-no-important */
}
.oo-ui-menuLayout-menu,
.oo-ui-menuLayout-content {
.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
display: none;
}
+.oo-ui-outlineSelectWidget {
+ height: 100%;
+}
+.oo-ui-outlineSelectWidget:focus {
+ box-shadow: inset 0 0 0 2px #36c;
+}
.oo-ui-outlineOptionWidget {
-webkit-touch-callout: none;
-webkit-user-select: none;
.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
opacity: 0.5;
}
-.oo-ui-outlineOptionWidget-level-0 {
- padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
- left: 1em;
+.oo-ui-outlineOptionWidget-level-0.oo-ui-iconElement {
+ padding-left: 2.571em;
}
.oo-ui-outlineOptionWidget-level-1 {
- padding-left: 5em;
+ padding-left: 2.571em;
+}
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement {
+ padding-left: 4.429em;
}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
- left: 2.5em;
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement .oo-ui-iconElement-icon {
+ left: 2.571em;
}
.oo-ui-outlineOptionWidget-level-2 {
- padding-left: 6.5em;
+ padding-left: 5.142em;
+}
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement {
+ padding-left: 6.857em;
}
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
- left: 4em;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement .oo-ui-iconElement-icon {
+ left: 4.429em;
}
.oo-ui-outlineControlsWidget {
height: 3em;
background-color: transparent;
color: #000;
vertical-align: middle;
- /* stylelint-disable indentation */
- /* stylelint-enable indentation */
}
.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
color: #72777d;
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:40Z
+ * Date: 2017-03-07T22:57:01Z
*/
( function ( OO ) {
align: 'forwards',
anchor: false
} );
- OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
- popup: {
- $floatableContainer: this.$element
- }
- } ) );
+ OO.ui.mixin.PopupElement.call( this, config );
$tabFocus = $( '<span>' );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: $tabFocus } ) );
} else {
if ( height !== this.height ) {
this.height = height;
this.menu.position();
+ if ( this.popup ) {
+ this.popup.updateDimensions();
+ }
this.emit( 'resize' );
}
};
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
}
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:44Z
+ * Date: 2017-03-07T22:57:06Z
*/
-/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
-/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-window {
background: transparent;
}
/*!
- * OOjs UI v0.19.4
+ * OOjs UI v0.19.5
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-28T23:19:40Z
+ * Date: 2017-03-07T22:57:01Z
*/
( function ( OO ) {
"ltr": "images/icons/articleRedirect-ltr.svg",
"rtl": "images/icons/articleRedirect-rtl.svg"
} },
+ "journal": { "file": {
+ "ltr": "images/icons/journal-ltr.svg",
+ "rtl": "images/icons/journal-rtl.svg"
+ } },
"upload": { "file": {
"ltr": "images/icons/upload-ltr.svg",
"rtl": "images/icons/upload-rtl.svg"
"os": "images/icons/bold-cyrl-be.svg"
}
} },
+ "highlight": { "file": {
+ "ltr": "images/icons/highlight-ltr.svg",
+ "rtl": "images/icons/highlight-rtl.svg"
+ } },
"italic": { "file": {
"default": "images/icons/italic-a.svg",
"lang": {
}
},
"images": {
- "beta": { "file": "images/icons/beta.svg" },
- "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
+ "add": { "file": "images/icons/add.svg" },
+ "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+ "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
"bookmark": { "file": {
"ltr": "images/icons/bookmark-ltr.svg",
"rtl": "images/icons/bookmark-rtl.svg"
"ltr": "images/icons/printer-ltr.svg",
"rtl": "images/icons/printer-rtl.svg"
} },
- "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+ "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+ "subtract": { "file": "images/icons/subtract.svg" },
"sun": { "file": {
"ltr": "images/icons/sun-ltr.svg",
"rtl": "images/icons/sun-rtl.svg"
"blockUndo": { "file": {
"ltr": "images/icons/unBlock-ltr.svg",
"rtl": "images/icons/unBlock-rtl.svg"
- } },
+ }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
"unBlock": { "file": {
"ltr": "images/icons/unBlock-ltr.svg",
"rtl": "images/icons/unBlock-rtl.svg"
"flagUndo": { "file": {
"ltr": "images/icons/unFlag-ltr.svg",
"rtl": "images/icons/unFlag-rtl.svg"
- } },
+ }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
"unFlag": { "file": {
"ltr": "images/icons/unFlag-ltr.svg",
"rtl": "images/icons/unFlag-rtl.svg"
"trashUndo": { "file": {
"ltr": "images/icons/unTrash-ltr.svg",
"rtl": "images/icons/unTrash-rtl.svg"
- } },
+ }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
"ongoingConversation": {
"file": {
"ltr": "images/icons/ongoingConversation-ltr.svg",
"prefix": "oo-ui-icon",
"intro": "@import '../../../../src/styles/common';",
"images": {
- "add": { "file": "images/icons/add.svg" },
+ "add": { "file": "images/icons/add.svg", "deprecated": "Moved since v0.19.5, use from the 'interactive' pack instead." },
"advanced": { "file": "images/icons/advanced.svg" },
"alert": { "file": "images/icons/alert.svg" },
"cancel": { "file": "images/icons/cancel.svg" },
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
+ <g id="add">
+ <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
+ </g>
+</g></svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="close">
- <path id="cross" d="M17.717 7.697l-1.414-1.414L12 10.586 7.697 6.283 6.283 7.697 10.586 12l-4.303 4.303 1.414 1.414L12 13.414l4.303 4.303 1.414-1.414L13.414 12z"/>
- </g>
+ <path d="M17.717 7.697l-1.414-1.414L12 10.586 7.697 6.283 6.283 7.697 10.586 12l-4.303 4.303 1.414 1.414L12 13.414l4.303 4.303 1.414-1.414L13.414 12z"/>
</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+ <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+ <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
+ <path d="M18 13H6v-2h12"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M18 13H6v-2h12"/>
+</svg>
"os": "images/icons/bold-cyrl-be.svg"
}
} },
+ "highlight": { "file": {
+ "ltr": "images/icons/highlight-ltr.svg",
+ "rtl": "images/icons/highlight-rtl.svg"
+ } },
"italic": { "file": {
"default": "images/icons/italic-a.svg",
"lang": {
}
},
"images": {
- "beta": { "file": "images/icons/beta.svg" },
- "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
+ "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
+ "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+ "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
"bookmark": { "file": {
"ltr": "images/icons/bookmark-ltr.svg",
"rtl": "images/icons/bookmark-rtl.svg"
"ltr": "images/icons/printer-ltr.svg",
"rtl": "images/icons/printer-rtl.svg"
} },
- "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+ "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+ "subtract": { "file": "images/icons/subtract.svg" },
"sun": { "file": {
"ltr": "images/icons/sun-ltr.svg",
"rtl": "images/icons/sun-rtl.svg"
"blockUndo": { "file": {
"ltr": "images/icons/unBlock-ltr.svg",
"rtl": "images/icons/unBlock-rtl.svg"
- } },
+ }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
"unBlock": { "file": {
"ltr": "images/icons/unBlock-ltr.svg",
"rtl": "images/icons/unBlock-rtl.svg"
"flagUndo": { "file": {
"ltr": "images/icons/unFlag-ltr.svg",
"rtl": "images/icons/unFlag-rtl.svg"
- } },
+ }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
"lock": { "file": {
"ltr": "images/icons/lock-ltr.svg",
"rtl": "images/icons/lock-rtl.svg"
"trashUndo": { "file": {
"ltr": "images/icons/unTrash-ltr.svg",
"rtl": "images/icons/unTrash-rtl.svg"
- } },
+ }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
"ongoingConversation": {
"file": {
"ltr": "images/icons/ongoingConversation-ltr.svg",
}
},
"images": {
- "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
+ "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Moved since v0.19.5, use from the 'interactive' pack instead." },
"advanced": { "file": "images/icons/advanced.svg" },
"alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
"cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
"check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
"circle": { "file": "images/icons/circle.svg", "variants": [ "constructive", "progressive" ] },
- "close": { "file": {
- "ltr": "images/icons/close-ltr.svg",
- "rtl": "images/icons/close-rtl.svg"
- } },
+ "close": { "file": "images/icons/close.svg" },
"code": { "file": "images/icons/code.svg" },
"collapse": { "file": "images/icons/collapse.svg" },
"comment": { "file": "images/icons/comment.svg" },
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+ <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</g></svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
- <g id="close">
- <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
- </g>
-</g></svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
- <g id="close">
- <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
- </g>
-</g></svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="close">
- <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
- </g>
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+ <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</g></svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
- <g id="close">
- <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
- </g>
-</g></svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
- <g id="close">
- <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
- </g>
-</g></svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="close">
- <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
- </g>
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#fff">
+ <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#36c">
+ <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+ <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#fff">
+ <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#36c">
+ <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+ <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
- <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+ <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
</g></svg>
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
- <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+ <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
</g></svg>
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+ <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
</svg>
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
- <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+ <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
</g></svg>
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
- <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+ <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
</g></svg>
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+ <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+ <path d="M18 13H6v-2h12"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+ <path d="M18 13H6v-2h12"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M18 13H6v-2h12"/>
+</svg>
}
/* Expand URLs for printing */
-.mw-body a.external.text:after,
-.mw-body a.external.autonumber:after {
+.mw-body-content a.external.text:after,
+.mw-body-content a.external.autonumber:after {
content: ' (' attr( href ) ')';
word-break: break-all;
word-wrap: break-word;
}
/* Expand protocol-relative URLs for printing */
-.mw-body a.external.text[href^='//']:after,
-.mw-body a.external.autonumber[href^='//']:after {
+.mw-body-content a.external.text[href^='//']:after,
+.mw-body-content a.external.autonumber[href^='//']:after {
content: ' (https:' attr( href ) ')';
}
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
- <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
- <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
-</svg>
*/
mw.rcfilters.Controller.prototype.resetToDefaults = function () {
this.filtersModel.setFiltersToDefaults();
+ this.filtersModel.clearAllHighlightColors();
// Check all filter interactions
this.filtersModel.reassessFilterInteractions();
@import 'mw.rcfilters.mixins';
.mw-rcfilters-ui-filterItemHighlightButton {
- .oo-ui-iconElement-icon.oo-ui-icon-highlight {
- /* @embed */
- background-image: url( ../images/marker-ltr.svg );
- }
-
.oo-ui-buttonWidget.oo-ui-popupButtonWidget .oo-ui-buttonElement-button > &-circle {
display: inline-block;
vertical-align: middle;
popup: {
padded: false,
align: 'center',
+ position: 'above',
$content: $popupContent
.append( descLabelWidget.$element ),
$floatableContainer: this.$element,
mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseEnter = function () {
if ( this.model.getDescription() ) {
if ( !this.positioned ) {
- // Recalculate position to be center of the capsule item
- this.popup.$element.css( 'margin-left', ( this.$element.width() / 2 ) );
+ // Recalculate anchor position to be center of the capsule item
+ this.popup.$anchor.css( 'margin-left', ( this.$element.width() / 2 ) );
this.positioned = true;
}
this.groups = {};
this.selected = null;
- this.highlightButton = new OO.ui.ButtonWidget( {
+ this.highlightButton = new OO.ui.ToggleButtonWidget( {
+ icon: 'highlight',
label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
classes: [ 'mw-rcfilters-ui-filtersListWidget-hightlightButton' ]
} );
this.highlightButton.connect( this, { click: 'onHighlightButtonClick' } );
this.model.connect( this, {
initialize: 'onModelInitialize',
- highlightChange: 'onHighlightChange'
+ highlightChange: 'onModelHighlightChange'
} );
// Initialize
);
};
- mw.rcfilters.ui.FiltersListWidget.prototype.onHighlightChange = function ( highlightEnabled ) {
+ /**
+ * Respond to model highlight change event
+ *
+ * @param {boolean} highlightEnabled Highlight is enabled
+ */
+ mw.rcfilters.ui.FiltersListWidget.prototype.onModelHighlightChange = function ( highlightEnabled ) {
this.highlightButton.setActive( highlightEnabled );
};
* compatibility ( browsers able to understand gradient syntax support also SVG ).
* http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-.mw-body a.external,
+.mw-body-content a.external,
.link-https {
background: url( images/external-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href^='mailto:'],
+.mw-body-content a.external[href^='mailto:'],
.link-mailto {
background: url( images/mail.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href^='ftp://'],
+.mw-body-content a.external[href^='ftp://'],
.link-ftp {
background: url( images/ftp-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href^='irc://'],
-.mw-body a.external[href^='ircs://'],
+.mw-body-content a.external[href^='irc://'],
+.mw-body-content a.external[href^='ircs://'],
.link-irc {
background: url( images/chat-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href$='.ogg'],
-.mw-body a.external[href$='.OGG'],
-.mw-body a.external[href$='.mid'],
-.mw-body a.external[href$='.MID'],
-.mw-body a.external[href$='.midi'],
-.mw-body a.external[href$='.MIDI'],
-.mw-body a.external[href$='.mp3'],
-.mw-body a.external[href$='.MP3'],
-.mw-body a.external[href$='.wav'],
-.mw-body a.external[href$='.WAV'],
-.mw-body a.external[href$='.wma'],
-.mw-body a.external[href$='.WMA'],
+.mw-body-content a.external[href$='.ogg'],
+.mw-body-content a.external[href$='.OGG'],
+.mw-body-content a.external[href$='.mid'],
+.mw-body-content a.external[href$='.MID'],
+.mw-body-content a.external[href$='.midi'],
+.mw-body-content a.external[href$='.MIDI'],
+.mw-body-content a.external[href$='.mp3'],
+.mw-body-content a.external[href$='.MP3'],
+.mw-body-content a.external[href$='.wav'],
+.mw-body-content a.external[href$='.WAV'],
+.mw-body-content a.external[href$='.wma'],
+.mw-body-content a.external[href$='.WMA'],
.link-audio {
background: url( images/audio-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href$='.ogm'],
-.mw-body a.external[href$='.OGM'],
-.mw-body a.external[href$='.avi'],
-.mw-body a.external[href$='.AVI'],
-.mw-body a.external[href$='.mpeg'],
-.mw-body a.external[href$='.MPEG'],
-.mw-body a.external[href$='.mpg'],
-.mw-body a.external[href$='.MPG'],
+.mw-body-content a.external[href$='.ogm'],
+.mw-body-content a.external[href$='.OGM'],
+.mw-body-content a.external[href$='.avi'],
+.mw-body-content a.external[href$='.AVI'],
+.mw-body-content a.external[href$='.mpeg'],
+.mw-body-content a.external[href$='.MPEG'],
+.mw-body-content a.external[href$='.mpg'],
+.mw-body-content a.external[href$='.MPG'],
.link-video {
background: url( images/video.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href$='.pdf'],
-.mw-body a.external[href$='.PDF'],
-.mw-body a.external[href*='.pdf#'],
-.mw-body a.external[href*='.PDF#'],
-.mw-body a.external[href*='.pdf?'],
-.mw-body a.external[href*='.PDF?'],
+.mw-body-content a.external[href$='.pdf'],
+.mw-body-content a.external[href$='.PDF'],
+.mw-body-content a.external[href*='.pdf#'],
+.mw-body-content a.external[href*='.PDF#'],
+.mw-body-content a.external[href*='.pdf?'],
+.mw-body-content a.external[href*='.PDF?'],
.link-document {
background: url( images/document-ltr.png ) center right no-repeat;
/* @embed */
}
/* Interwiki styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
+.mw-body-content a.extiw,
+.mw-body-content a.extiw:active {
color: #36b;
}
/* External link color */
-.mw-body a.external {
+.mw-body-content a.external {
color: #36b;
}
}
/* Interwiki Styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
+.mw-body-content a.extiw,
+.mw-body-content a.extiw:active {
color: #36b;
}
-.mw-body a.extiw:visited {
+.mw-body-content a.extiw:visited {
color: #636;
}
-.mw-body a.extiw:active {
+.mw-body-content a.extiw:active {
color: #b63;
}
/* External links */
-.mw-body a.external {
+.mw-body-content a.external {
color: #36b;
}
-.mw-body a.external:visited {
+.mw-body-content a.external:visited {
color: #636; /* T5112 */
}
-.mw-body a.external:active {
+.mw-body-content a.external:active {
color: #b63;
}
-.mw-body a.external.free {
+.mw-body-content a.external.free {
word-wrap: break-word;
}
* @return string Absolute name of the temporary file
*/
protected function getNewTempFile() {
- $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
+ $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . static::class . '_' );
$this->tmpFiles[] = $fileName;
return $fileName;
if ( isset( $compatibility[$func] ) ) {
return call_user_func_array( [ $this, $compatibility[$func] ], $args );
} else {
- throw new MWException( "Called non-existent $func method on "
- . get_class( $this ) );
+ throw new MWException( "Called non-existent $func method on " . static::class );
}
}
}
public function testApiTestGroup() {
- $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) );
+ $groups = PHPUnit_Util_Test::getGroups( static::class );
$constraint = PHPUnit_Framework_Assert::logicalOr(
$this->contains( 'medium' ),
$this->contains( 'large' )