Merge "RC filters: update the state of the app on popstate."
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 8 Mar 2017 01:32:35 +0000 (01:32 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 8 Mar 2017 01:32:35 +0000 (01:32 +0000)
152 files changed:
RELEASE-NOTES-1.29
composer.json
includes/api/i18n/fr.json
includes/api/i18n/uk.json
includes/cache/FileCacheBase.php
includes/cache/localisation/LocalisationCache.php
includes/collation/IcuCollation.php
includes/context/ContextSource.php
includes/exception/MWException.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/NullRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/installer/WebInstallerPage.php
includes/jobqueue/JobSpecification.php
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/fileop/FileOp.php
includes/libs/objectcache/BagOStuff.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/virtualrest/VirtualRESTService.php
includes/media/TransformationalImageHandler.php
includes/pager/IndexPager.php
includes/resourceloader/ResourceLoaderModule.php
includes/session/SessionProvider.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/tidy/TidyDriverBase.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/de.json
languages/i18n/et.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/it.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
resources/Resources.php
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-content.json
resources/lib/oojs-ui/themes/apex/icons-editing-styling.json
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/close.svg
resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-editing-styling.json
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg [new file with mode: 0644]
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.rcfilters/images/marker-ltr.svg [deleted file]
resources/src/mediawiki.rcfilters/images/marker-rtl.svg [deleted file]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.skinning/elements.css
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/api/ApiTestCase.php

index 9883474..5bc66fd 100644 (file)
@@ -63,6 +63,7 @@ production.
 * 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 ====
 
index fe68a61..6a09d1a 100644 (file)
@@ -25,8 +25,8 @@
                "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",
index da85e64..cfb1db8 100644 (file)
        "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.",
index e3dba0b..996f26e 100644 (file)
        "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.",
index 6d5f8c3..0a302b6 100644 (file)
@@ -242,7 +242,7 @@ abstract class FileCacheBase {
                                : 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
                        }
@@ -272,6 +272,6 @@ abstract class FileCacheBase {
         * @return string
         */
        protected function cacheMissKey() {
-               return wfMemcKey( get_class( $this ), 'misses', $this->mType, $this->mKey );
+               return wfMemcKey( static::class, 'misses', $this->mType, $this->mKey );
        }
 }
index 90b3de1..cbff113 100644 (file)
@@ -228,7 +228,7 @@ class LocalisationCache {
                        }
                }
 
-               wfDebugLog( 'caches', get_class( $this ) . ": using store $storeClass" );
+               wfDebugLog( 'caches', static::class . ": using store $storeClass" );
                if ( !empty( $conf['storeDirectory'] ) ) {
                        $storeConf['directory'] = $conf['storeDirectory'];
                }
index bf1fe74..e0eb1c1 100644 (file)
@@ -330,7 +330,7 @@ class IcuCollation extends Collation {
                        $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                        $cacheKey = $cache->makeKey(
                                'first-letters',
-                               get_class( $this ),
+                               static::class,
                                $this->locale,
                                $this->digitTransformLanguage->getCode(),
                                self::getICUVersion(),
index 829dd73..ea5278f 100644 (file)
@@ -39,7 +39,7 @@ abstract class ContextSource implements IContextSource {
         */
        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();
index e958c94..4ff8636 100644 (file)
@@ -112,7 +112,7 @@ class MWException extends Exception {
                        "</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' ) . ": " .
@@ -164,7 +164,7 @@ class MWException extends Exception {
                if ( $this->useOutputPage() ) {
                        $wgOut->prepareErrorPage( $this->getPageTitle() );
 
-                       $hookResult = $this->runHooks( get_class( $this ) );
+                       $hookResult = $this->runHooks( static::class );
                        if ( $hookResult ) {
                                $wgOut->addHTML( $hookResult );
                        } else {
@@ -183,7 +183,7 @@ class MWException extends Exception {
                                '<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 {
@@ -203,7 +203,7 @@ class MWException extends Exception {
 
                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();
index ca41718..43f1d21 100644 (file)
@@ -571,7 +571,7 @@ class ForeignAPIRepo extends FileRepo {
 
                $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 );
@@ -593,13 +593,13 @@ class ForeignAPIRepo extends FileRepo {
         * @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.' );
        }
 }
index f49ef88..3e88508 100644 (file)
@@ -138,7 +138,7 @@ class ForeignDBRepo extends LocalRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 
        /**
index a9cd030..f83fd1c 100644 (file)
@@ -100,7 +100,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
        }
 
        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() {
index f2b7395..1c12e02 100644 (file)
@@ -33,6 +33,6 @@ class NullRepo extends FileRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 }
index 3b873ea..f7e85a8 100644 (file)
@@ -1766,7 +1766,7 @@ abstract class File implements IDBAccessObject {
         * @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' );
        }
 
        /**
index a1cb0a2..a633fd2 100644 (file)
@@ -391,7 +391,7 @@ class LocalFile extends File {
         * @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;
@@ -416,7 +416,7 @@ class LocalFile extends File {
         * 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;
@@ -1100,7 +1100,7 @@ class LocalFile extends File {
         */
        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();
 
index 487d6f6..3a3146b 100644 (file)
@@ -475,7 +475,7 @@ abstract class HTMLFormField {
        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 = [];
@@ -533,7 +533,7 @@ abstract class HTMLFormField {
        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 );
@@ -601,7 +601,7 @@ abstract class HTMLFormField {
                        $infusable = false;
                }
 
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $help = $this->getHelpText();
                $errors = $this->getErrorsRaw( $value );
                foreach ( $errors as &$error ) {
index 46172a5..fa18a3c 100644 (file)
@@ -189,7 +189,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
        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 ];
 
index 8fb840a..dd9184b 100644 (file)
@@ -46,7 +46,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
        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'] ) ) {
index 23044bd..2b6e066 100644 (file)
@@ -17,6 +17,11 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        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';
@@ -75,6 +80,9 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                        '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 );
@@ -112,6 +120,18 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
+       /**
+        * 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.
         *
index 7a41ceb..3aad6f8 100644 (file)
@@ -133,7 +133,7 @@ abstract class WebInstallerPage {
         * @return string
         */
        public function getName() {
-               return str_replace( 'WebInstaller', '', get_class( $this ) );
+               return str_replace( 'WebInstaller', '', static::class );
        }
 
        /**
index d636dc6..d844795 100644 (file)
@@ -128,7 +128,7 @@ class JobSpecification implements IJobSpecification {
 
                $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;
        }
 
index 212e84f..53bce33 100644 (file)
@@ -167,7 +167,7 @@ class FileBackendMultiWrite extends FileBackend {
                // 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
@@ -378,7 +378,7 @@ class FileBackendMultiWrite extends FileBackend {
                }
 
                if ( !$status->isOK() ) {
-                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                       wfDebugLog( 'FileOperation', static::class .
                                " failed to resync: " . FormatJson::encode( $paths ) );
                }
 
index 5179477..7cb26c6 100644 (file)
@@ -360,7 +360,7 @@ abstract class FileBackendStore extends FileBackend {
                        $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]" );
                        }
                }
@@ -1123,7 +1123,7 @@ abstract class FileBackendStore extends FileBackend {
                                $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 ) );
                }
 
index fab5a37..79af194 100644 (file)
@@ -461,7 +461,7 @@ abstract class FileOp {
                $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?
index d0b68bc..77c4259 100644 (file)
@@ -679,7 +679,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        protected function debug( $text ) {
                if ( $this->debugMode ) {
                        $this->logger->debug( "{class} debug: $text", [
-                               'class' => get_class( $this ),
+                               'class' => static::class,
                        ] );
                }
        }
index c5afe1e..e807bc8 100644 (file)
@@ -3412,7 +3412,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        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()
                );
 
index a76d66a..d658c96 100644 (file)
@@ -82,7 +82,7 @@ class ResultWrapper implements IResultWrapper {
         */
        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;
index ccb14db..2f16078 100644 (file)
@@ -51,8 +51,7 @@ abstract class VirtualRESTService {
         * @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;
        }
 
        /**
index 60aec45..1ab0f36 100644 (file)
@@ -569,7 +569,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
         */
        public function rotate( $file, $params ) {
                return new MediaTransformError( 'thumbnail_error', 0, 0,
-                       get_class( $this ) . ' rotation not implemented' );
+                       static::class . ' rotation not implemented' );
        }
 
        /**
index dc302a2..4694890 100644 (file)
@@ -197,7 +197,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         */
        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
@@ -348,7 +348,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @return string
         */
        function getSqlComment() {
-               return get_class( $this );
+               return static::class;
        }
 
        /**
index d4dabe7..a2b4b1d 100644 (file)
@@ -843,7 +843,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return [
-                       '_class' => get_class( $this ),
+                       '_class' => static::class,
                        '_cacheEpoch' => $this->getConfig()->get( 'CacheEpoch' ),
                ];
        }
index e8d81cb..3cf69b7 100644 (file)
@@ -455,7 +455,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         * @return string
         */
        public function __toString() {
-               return get_class( $this );
+               return static::class;
        }
 
        /**
@@ -475,7 +475,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         */
        protected function describeMessage() {
                return wfMessage(
-                       'sessionprovider-' . str_replace( '\\', '-', strtolower( get_class( $this ) ) )
+                       'sessionprovider-' . str_replace( '\\', '-', strtolower( static::class ) )
                );
        }
 
index a7740a0..3ef646a 100644 (file)
@@ -1038,7 +1038,7 @@ abstract class Skin extends ContextSource {
                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()" );
                }
 
index 780fac4..61dbf2b 100644 (file)
@@ -344,7 +344,7 @@ class SkinTemplate extends Skin {
                $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() );
index 40f82f5..65e82e8 100644 (file)
@@ -304,7 +304,7 @@ abstract class QueryPage extends SpecialPage {
                        return 0;
                }
 
-               $fname = get_class( $this ) . '::recache';
+               $fname = static::class . '::recache';
                $dbw = wfGetDB( DB_MASTER );
                if ( !$dbw ) {
                        return false;
@@ -389,7 +389,7 @@ abstract class QueryPage extends SpecialPage {
         * @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();
@@ -480,7 +480,7 @@ abstract class QueryPage extends SpecialPage {
        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 );
                }
index ea7d783..b1ddacf 100644 (file)
@@ -52,7 +52,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 
                        return $redirect;
                } else {
-                       $class = get_class( $this );
+                       $class = static::class;
                        throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
                }
        }
index 96ee8c3..d3f9d48 100644 (file)
@@ -27,7 +27,7 @@ abstract class TidyDriverBase {
         * @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()' );
        }
 
        /**
index 2ec2d54..0672315 100644 (file)
@@ -415,10 +415,10 @@ class Language {
        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();
        }
index 6a426e5..7721015 100644 (file)
@@ -845,9 +845,8 @@ class LanguageConverter {
         * @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" );
        }
 
        /**
index 26b5857..03fabf7 100644 (file)
        "rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
        "rcfilters-highlightbutton-title": "التعليم على النتائج",
        "rcfilters-highlightmenu-title": "اختر لونًا",
+       "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
        "rcfilters-filtergroup-registration": "تسجيل المستخدم",
        "rcfilters-filter-registered-label": "مسجل",
index f3b72c6..deff232 100644 (file)
        "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",
index a1cf8ed..502c814 100644 (file)
        "rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
        "rcfilters-highlightbutton-title": "Вылучыць вынікі",
        "rcfilters-highlightmenu-title": "Абярыце колер",
+       "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
        "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
        "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
        "rcfilters-filter-registered-label": "Зарэгістраваныя",
index df6da1a..41076d3 100644 (file)
        "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|минута|минути}}",
index 85b582e..a25c258 100644 (file)
        "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) ওয়েবসার্ভার কর্তৃক লিখনযোগ্য নয়।",
index 3bef8c9..fc83760 100644 (file)
        "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",
index c7131ae..76f0eea 100644 (file)
        "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",
index eb89f59..61c6c6b 100644 (file)
        "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].",
index 4b0fa74..29797b8 100644 (file)
        "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",
index 27db784..6a63089 100644 (file)
        "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
        "rcfilters-highlightbutton-title": "הבלטת התוצאות",
        "rcfilters-highlightmenu-title": "בחירת צבע",
+       "rcfilters-highlightmenu-help": "בחירת צבע להדגשת מאפיין זה",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
        "rcfilters-filtergroup-registration": "רישום העורכים",
        "rcfilters-filter-registered-label": "רשומים",
index dca3547..57fefb1 100644 (file)
        "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",
index 46805f8..ac07205 100644 (file)
        "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
        "rcfilters-highlightbutton-title": "Выделить результаты",
        "rcfilters-highlightmenu-title": "Выберите цвет",
+       "rcfilters-highlightmenu-help": "Выберите цвет, чтобы подсветить это свойство",
        "rcfilters-filterlist-noresults": "Фильтры не найдены",
        "rcfilters-filtergroup-registration": "Регистрация участников",
        "rcfilters-filter-registered-label": "Зарегистрированные",
index 09e34ab..7ddeba7 100644 (file)
        "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",
index 7d515d6..5d5c09f 100644 (file)
        "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Будь ласка, натисніть кнопку «Назад» і перезавантажте сторінку, з якої ви прийшли.",
index 1e61710..b1227d2 100644 (file)
        "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
        "rcfilters-highlightbutton-title": "高亮结果",
        "rcfilters-highlightmenu-title": "选择颜色",
+       "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
        "rcfilters-filterlist-noresults": "找不到过滤器",
        "rcfilters-filtergroup-registration": "用户注册",
        "rcfilters-filter-registered-label": "已注册",
index 5c6b262..0c3d27d 100644 (file)
@@ -1853,6 +1853,7 @@ return [
                        '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',
                ],
        ],
index 541462f..53ce966 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * 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 ) {
 
index 0818782..369cf09 100644 (file)
@@ -1,18 +1,15 @@
 /*!
- * 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;
@@ -667,9 +664,49 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .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;
@@ -696,34 +733,78 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
@@ -750,10 +831,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .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 {
@@ -931,8 +1014,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -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 {
index f468d17..b041ef4 100644 (file)
@@ -1,18 +1,15 @@
 /*!
- * 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;
@@ -826,9 +823,49 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .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;
@@ -855,34 +892,78 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
@@ -909,10 +990,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .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 {
@@ -1343,8 +1426,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -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 {
index 9eb8716..f10bdfa 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * 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 ) {
 
@@ -4079,6 +4079,8 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
  *  '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
@@ -4097,6 +4099,7 @@ OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        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 */
@@ -4141,9 +4144,11 @@ OO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position
        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();
+               }
        }
 };
 
@@ -4156,9 +4161,11 @@ OO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( positi
        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();
+               }
        }
 };
 
@@ -4290,27 +4297,49 @@ OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element
  * @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>
@@ -4408,18 +4437,7 @@ OO.ui.mixin.FloatableElement.prototype.position = function () {
                }
        }
 
-       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;
 };
 
 /**
@@ -4745,13 +4763,24 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * @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
@@ -4794,15 +4823,16 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        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
@@ -4950,6 +4980,21 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
                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.
@@ -4957,7 +5002,7 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
  * @return {boolean} Anchor is visible
  */
 OO.ui.PopupWidget.prototype.hasAnchor = function () {
-       return this.anchor;
+       return this.anchored;
 };
 
 /**
@@ -4981,6 +5026,10 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
                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 );
@@ -5035,9 +5084,37 @@ OO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {
  * @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',
@@ -5048,77 +5125,119 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                                '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;
 };
 
 /**
@@ -5140,18 +5259,41 @@ OO.ui.PopupWidget.prototype.setAlignment = function ( align ) {
        } 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
@@ -5172,9 +5314,14 @@ OO.ui.mixin.PopupElement = function OoUiMixinPopupElement( config ) {
 
        // 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 )
+               }
        ) );
 };
 
@@ -5222,11 +5369,7 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        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;
@@ -6736,20 +6879,34 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
  * @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 );
 
@@ -9125,7 +9282,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  *  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'`
@@ -10081,6 +10238,10 @@ OO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {
  * - 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].
@@ -10088,32 +10249,33 @@ OO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {
  *     @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 );
  *
index b39010c..7b1c099 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * 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 ) {
 
index 4d7f9d7..7604589 100644 (file)
@@ -1,21 +1,19 @@
 /*!
- * 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 {
index 59de29b..ad1746d 100644 (file)
@@ -1,15 +1,13 @@
 /*!
- * 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;
@@ -24,8 +22,8 @@
 .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 {
index 777debf..1574f6c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * 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 ) {
 
@@ -1469,6 +1469,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolGroup, config ) {
        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 );
@@ -2194,6 +2195,9 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
        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();
 };
 
 /**
index a1064bb..4ec3d1c 100644 (file)
@@ -1,15 +1,13 @@
 /*!
- * 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;
@@ -81,8 +79,6 @@
   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;
index 495cbfe..f64a619 100644 (file)
@@ -1,15 +1,13 @@
 /*!
- * 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;
@@ -92,8 +90,6 @@
   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;
index b89262d..d1fbe0d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * 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 ) {
 
@@ -3643,11 +3643,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
                        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 {
@@ -4273,6 +4269,9 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateIfHeightChanged = function () {
        if ( height !== this.height ) {
                this.height = height;
                this.menu.position();
+               if ( this.popup ) {
+                       this.popup.updateDimensions();
+               }
                this.emit( 'resize' );
        }
 };
index b546dd1..4353b43 100644 (file)
@@ -1,15 +1,13 @@
 /*!
- * 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);
 }
index 701c058..823b1a1 100644 (file)
@@ -1,15 +1,13 @@
 /*!
- * 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;
 }
index ad3c226..586efb0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * 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 ) {
 
index 394ec85..0cd901f 100644 (file)
                        "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"
index 5b35e74..718f9ff 100644 (file)
                                "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": {
index d68e70c..ec18f29 100644 (file)
@@ -8,8 +8,9 @@
                }
        },
        "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"
@@ -49,7 +50,8 @@
                        "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"
index 15c0251..c8385e4 100644 (file)
@@ -6,7 +6,7 @@
                "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"
@@ -18,7 +18,7 @@
                "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"
@@ -42,7 +42,7 @@
                "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",
index b5fbbed..f4a2dc9 100644 (file)
@@ -2,7 +2,7 @@
        "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" },
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png
new file mode 100644 (file)
index 0000000..8deeddf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg
new file mode 100644 (file)
index 0000000..a2d49a1
--- /dev/null
@@ -0,0 +1,6 @@
+<?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>
index d058d65..b379e18 100644 (file)
@@ -1,6 +1,4 @@
 <?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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png
new file mode 100644 (file)
index 0000000..73dd6b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png
new file mode 100644 (file)
index 0000000..2ea2983
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png
new file mode 100644 (file)
index 0000000..2af4eb0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg
new file mode 100644 (file)
index 0000000..8a83e41
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png
new file mode 100644 (file)
index 0000000..033ede1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg
new file mode 100644 (file)
index 0000000..2a07a44
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png
new file mode 100644 (file)
index 0000000..4e58b70
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg
new file mode 100644 (file)
index 0000000..9595ac6
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png
new file mode 100644 (file)
index 0000000..bd719cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg
new file mode 100644 (file)
index 0000000..a79f0b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
index c97d770..85e47ee 100644 (file)
                                "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": {
index 3436446..827a72e 100644 (file)
@@ -22,8 +22,9 @@
                }
        },
        "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"
@@ -66,7 +67,8 @@
                        "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"
index 6a47267..b4acff1 100644 (file)
@@ -26,7 +26,7 @@
                "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"
@@ -42,7 +42,7 @@
                "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"
@@ -65,7 +65,7 @@
                "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",
index 4666fd1..60c05f3 100644 (file)
                }
        },
        "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" },
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png
new file mode 100644 (file)
index 0000000..92af7b6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg
new file mode 100644 (file)
index 0000000..8027fff
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png
deleted file mode 100644 (file)
index a35e9d1..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
deleted file mode 100644 (file)
index 6de3e30..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png
deleted file mode 100644 (file)
index 69f0787..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg
deleted file mode 100644 (file)
index 122340e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png
deleted file mode 100644 (file)
index b6a42b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg
deleted file mode 100644 (file)
index c269316..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png
new file mode 100644 (file)
index 0000000..06fcd5d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg
new file mode 100644 (file)
index 0000000..37c960e
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png
deleted file mode 100644 (file)
index 16462a2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
deleted file mode 100644 (file)
index 67dc06c..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png
deleted file mode 100644 (file)
index 2c88596..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg
deleted file mode 100644 (file)
index c6494de..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png
deleted file mode 100644 (file)
index e3e2417..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg
deleted file mode 100644 (file)
index 36e58ec..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png
new file mode 100644 (file)
index 0000000..cdb037a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg
new file mode 100644 (file)
index 0000000..88ffb56
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png
new file mode 100644 (file)
index 0000000..314d7ac
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg
new file mode 100644 (file)
index 0000000..e301dea
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png
new file mode 100644 (file)
index 0000000..14bd7be
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..4cc90b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png
new file mode 100644 (file)
index 0000000..73dd6b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png
new file mode 100644 (file)
index 0000000..024595e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg
new file mode 100644 (file)
index 0000000..46d61c2
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png
new file mode 100644 (file)
index 0000000..039ccbe
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..4f3997a
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png
new file mode 100644 (file)
index 0000000..2ea2983
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
index e7dc90e..bc2e9cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png differ
index e04818f..370d0a3 100644 (file)
@@ -1,4 +1,4 @@
-<?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>
index 444d48b..19f17bd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png differ
index 0232e22..baf8a4a 100644 (file)
@@ -1,4 +1,4 @@
-<?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>
index f30b5ff..2af4eb0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png differ
index c9fa553..8a83e41 100644 (file)
@@ -1,4 +1,4 @@
-<?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>
index deb4f76..60b5f47 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png differ
index 3487511..4660285 100644 (file)
@@ -1,4 +1,4 @@
-<?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>
index e5a4fa1..b16badc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png differ
index f2eb554..17ccb82 100644 (file)
@@ -1,4 +1,4 @@
-<?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>
index 7826fa8..033ede1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png differ
index 84da9fa..2a07a44 100644 (file)
@@ -1,4 +1,4 @@
-<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png
new file mode 100644 (file)
index 0000000..4e58b70
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg
new file mode 100644 (file)
index 0000000..d76eb3c
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png
new file mode 100644 (file)
index 0000000..1732972
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg
new file mode 100644 (file)
index 0000000..24795ac
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png
new file mode 100644 (file)
index 0000000..bd719cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg
new file mode 100644 (file)
index 0000000..a79f0b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?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>
index b047f62..e3e80d8 100644 (file)
@@ -169,16 +169,16 @@ a {
 }
 
 /* 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 ) ')';
 }
 
diff --git a/resources/src/mediawiki.rcfilters/images/marker-ltr.svg b/resources/src/mediawiki.rcfilters/images/marker-ltr.svg
deleted file mode 100644 (file)
index eb42923..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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>
diff --git a/resources/src/mediawiki.rcfilters/images/marker-rtl.svg b/resources/src/mediawiki.rcfilters/images/marker-rtl.svg
deleted file mode 100644 (file)
index 9b1940e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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>
index 4c3d35f..e562057 100644 (file)
@@ -66,6 +66,7 @@
         */
        mw.rcfilters.Controller.prototype.resetToDefaults = function () {
                this.filtersModel.setFiltersToDefaults();
+               this.filtersModel.clearAllHighlightColors();
                // Check all filter interactions
                this.filtersModel.reassessFilterInteractions();
 
index 0f30137..198f599 100644 (file)
@@ -1,11 +1,6 @@
 @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;
index e7e3751..f28523a 100644 (file)
@@ -38,6 +38,7 @@
                        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;
                        }
 
index cefe749..4011e6d 100644 (file)
@@ -29,7 +29,8 @@
                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' ]
                } );
@@ -43,7 +44,7 @@
                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 );
        };
 
index b392259..cd674ef 100644 (file)
@@ -9,7 +9,7 @@
  * 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 */
@@ -19,7 +19,7 @@
        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 */
@@ -27,7 +27,7 @@
        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 */
@@ -35,8 +35,8 @@
        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;
 }
index 46de7b5..d204d5d 100644 (file)
@@ -53,33 +53,33 @@ a.new:visited,
 }
 
 /* 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;
 }
 
index 37f76ff..419ff00 100644 (file)
@@ -439,7 +439,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @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;
@@ -1304,8 +1304,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                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 );
                }
        }
 
index 6b299c9..abef1c9 100644 (file)
@@ -219,7 +219,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
        }
 
        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' )