Jhernandez has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/327722 )
Change subject: Remove jshint/jscs, add eslint and stylelint ...................................................................... Remove jshint/jscs, add eslint and stylelint ...with the wikimedia presets. For automatically fixing most of the JS lint problems run grunt eslint:fix Some rules of stylelint were disabled given they cause problems with existing popups code (like no id selectors for example). Change-Id: I2153047c3ddbea50572dd329989088bb20787515 --- A .eslintrc.json D .jscsrc D .jshintignore D .jshintrc A .stylelintrc M Gruntfile.js M package.json M resources/ext.popups.desktop/ext.popups.animation.less M resources/ext.popups/actions.js M resources/ext.popups/boot.js M resources/ext.popups/changeListeners/syncUserSettings.js M resources/ext.popups/gateway.js M resources/ext.popups/reducers/index.js M resources/ext.popups/renderer.js M resources/ext.popups/settingsDialog.js M resources/ext.popups/styles/ext.popups.core.less M resources/ext.popups/styles/ext.popups.settings.less 17 files changed, 125 insertions(+), 167 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Popups refs/changes/22/327722/1 diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..da8a6ee --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "extends": "wikimedia", + "env": { + "browser": true, + "jquery": true, + "qunit": true + }, + "globals": { + "mediaWiki": false, + "OO": false, + "moment": false, + "Redux": false, + "ReduxThunk": false + }, + "rules": { + "dot-notation": [ "error", { "allowKeywords": true } ], + "no-use-before-define": 0 + } +} diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index 7c4ced2..0000000 --- a/.jscsrc +++ /dev/null @@ -1,25 +0,0 @@ -{ - "preset": "wikimedia", - - "requireObjectKeysOnNewLine": true, - "requireSpacesInsideBrackets": null, - "disallowImplicitTypeConversion": ["numeric", "boolean", "binary", "string"], - "excludeFiles": [ - "vendor/**", - "node_modules/**" - ], - "disallowDanglingUnderscores": { - "allExcept": ["__REDUX_DEVTOOLS_EXTENSION_COMPOSE__"] - }, - "jsDoc": { - "checkParamExistence": true, - "checkParamNames": true, - "checkRedundantParams": true, - "enforceExistence": true, - "checkReturnTypes": true, - "checkRedundantReturns": true, - "requireReturnTypes": true, - "checkTypes": "capitalizedNativeCase", - "@fixme": "https://github.com/jscs-dev/jscs-jsdoc/pull/138" - } -} diff --git a/.jshintignore b/.jshintignore deleted file mode 100644 index bb5aadf..0000000 --- a/.jshintignore +++ /dev/null @@ -1,3 +0,0 @@ -// Ignore legacy code (for now) -resources/ext.popups.* -node_modules diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 34d665f..0000000 --- a/.jshintrc +++ /dev/null @@ -1,24 +0,0 @@ -{ - "globals": { - "console": true, - "jQuery": true, - "mediaWiki": true, - "module": false, - "moment": true, // FIXME: Remove this once moment is removed from codebase - "require": false, - "OO": true, - "QUnit": true, - "Redux": true, - "ReduxThunk": true - }, - - "browser": true, - "curly": true, - "eqeqeq": true, - "forin": false, - "onevar": true, - "supernew": true, - "trailing": true, - "undef" : true, - "unused": true -} diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000..7d5901f --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,8 @@ +{ + "extends": "stylelint-config-wikimedia", + "rules": { + "selector-no-id": null, + "length-zero-no-unit": null, + "no-descending-specificity": null + } +} diff --git a/Gruntfile.js b/Gruntfile.js index 7c18615..b4b9393 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,13 +1,12 @@ -// jscs:disable jsDoc -/*jshint node:true */ +/* eslint-evn node */ + module.exports = function ( grunt ) { var QUNIT_URL_BASE = 'http://localhost:8080/wiki/Special:JavaScriptTest/qunit/plain'; grunt.loadNpmTasks( 'grunt-banana-checker' ); - grunt.loadNpmTasks( 'grunt-contrib-jshint' ); grunt.loadNpmTasks( 'grunt-contrib-qunit' ); grunt.loadNpmTasks( 'grunt-contrib-watch' ); - grunt.loadNpmTasks( 'grunt-jscs' ); + grunt.loadNpmTasks( 'grunt-eslint' ); grunt.loadNpmTasks( 'grunt-jsonlint' ); grunt.loadNpmTasks( 'grunt-stylelint' ); @@ -15,53 +14,27 @@ banana: { all: 'i18n/' }, - jscs: { - options: { - config: '.jscsrc' - }, - main: '<%= jshint.all %>', - test: { + eslint: { + fix: { options: { - config: 'tests/.jscsrc.js' + fix: true }, - files: { - src: [ - 'tests/qunit/**/*.js', - '!tests/qunit/ext.popups.core.test.js' - ] - } - } - }, - jshint: { - options: { - jshintrc: true + src: [ + '<%= eslint.all %>' + ] }, all: [ - '*.js', - '**/*.js', - '!node_modules/**', - '!resources/ext.popups.lib/**', - // FIXME: Remove ignores for legacy code upon removal/refactor - '!resources/ext.popups.core/**', - '!resources/ext.popups.desktop/**', - '!resources/ext.popups.images/**', - '!resources/ext.popups.renderer.desktopRenderer/**', - '!resources/ext.popups.schemaPopups/**', - '!resources/ext.popups.schemaPopups.utils/**', - '!resources/ext.popups.targets.desktopTarget/**', - // End legacy code - '!tests/qunit/**' - ], - test: { - files: { - src: 'tests/qunit/**/*.js' - } - } + 'resources/ext.popups/*.js', + 'resources/ext.popups/**/*.js', + '!docs/**', + '!node_modules/**' + ] }, jsonlint: { all: [ '*.json', '**/*.json', + '!docs/**', '!node_modules/**' ] }, @@ -83,7 +56,7 @@ syntax: 'less' }, all: [ - 'resources/**/*.less' + 'resources/ext.popups/**/*.less' ] }, watch: { @@ -92,7 +65,7 @@ debounceDelay: 1000 }, lint: { - files: [ 'resources/**/*.js', 'tests/qunit/**/*.js' ], + files: [ 'resources/ext.popups/**/*.less', 'resources/**/*.js', 'tests/qunit/**/*.js' ], tasks: [ 'lint' ] }, scripts: { @@ -108,7 +81,7 @@ } } ); - grunt.registerTask( 'lint', [ 'jshint', 'jscs', 'jsonlint', 'banana' ] ); + grunt.registerTask( 'lint', [ 'eslint:all', 'stylelint', 'jsonlint', 'banana' ] ); grunt.registerTask( 'test', [ 'qunit' ] ); - grunt.registerTask( 'default', [ 'test', 'lint' ] ); + grunt.registerTask( 'default', [ 'lint', 'test' ] ); }; diff --git a/package.json b/package.json index 341572d..bb5e6f1 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,15 @@ "doc": "jsduck" }, "devDependencies": { - "grunt": "0.4.5", - "grunt-banana-checker": "0.4.0", - "grunt-cli": "0.1.13", - "grunt-contrib-jshint": "0.11.3", + "eslint-config-wikimedia": "0.3.0", + "grunt": "1.0.1", + "grunt-banana-checker": "0.5.0", + "grunt-cli": "^1.2.0", "grunt-contrib-qunit": "^1.2.0", "grunt-contrib-watch": "^1.0.0", - "grunt-jscs": "2.1.0", - "grunt-jsonlint": "1.0.7", - "grunt-stylelint": "^0.6.0" + "grunt-eslint": "19.0.0", + "grunt-jsonlint": "1.1.0", + "grunt-stylelint": "^0.6.0", + "stylelint-config-wikimedia": "0.3.0" } } diff --git a/resources/ext.popups.desktop/ext.popups.animation.less b/resources/ext.popups.desktop/ext.popups.animation.less index 9f6a9c8..3a7273e 100644 --- a/resources/ext.popups.desktop/ext.popups.animation.less +++ b/resources/ext.popups.desktop/ext.popups.animation.less @@ -1,11 +1,11 @@ @import "mediawiki.mixins.animation"; -.mwe-popups-translate(@x, @y) { - -webkit-transform: translate(@x, @y); - -moz-transform: translate(@x, @y); - -ms-transform: translate(@x, @y); - -o-transform: translate(@x, @y); - transform: translate(@x, @y); +.mwe-popups-translate( @x, @y ) { + -webkit-transform: translate( @x, @y ); + -moz-transform: translate( @x, @y ); + -ms-transform: translate( @x, @y ); + -o-transform: translate( @x, @y ); + transform: translate( @x, @y ); } /* FIXME: Use Phuedx's approach to make this cleaner @@ -77,63 +77,63 @@ .mwe-popups-fade-in-up-frames() { 0% { opacity: 0; - .mwe-popups-translate(0, 20px); + .mwe-popups-translate( 0, 20px ); } 100% { opacity: 1; - .mwe-popups-translate(0, 0); + .mwe-popups-translate( 0, 0 ); } } .mwe-popups-fade-in-down-frames() { 0% { opacity: 0; - .mwe-popups-translate(0, -20px); + .mwe-popups-translate( 0, -20px ); } 100% { opacity: 1; - .mwe-popups-translate(0, 0); + .mwe-popups-translate( 0, 0 ); } } .mwe-popups-fade-out-down-frames() { 0% { opacity: 1; - .mwe-popups-translate(0, 0); + .mwe-popups-translate( 0, 0 ); } 100% { opacity: 0; - .mwe-popups-translate(0, 20px); + .mwe-popups-translate( 0, 20px ); } } .mwe-popups-fade-out-up-frames() { 0% { opacity: 1; - .mwe-popups-translate(0, 0); + .mwe-popups-translate( 0, 0 ); } 100% { opacity: 0; - .mwe-popups-translate(0, -20px); + .mwe-popups-translate( 0, -20px ); } } .mwe-popups-fade-in-up { - .animation(mwe-popups-fade-in-up, 0.2s, ease, forwards); + .animation( mwe-popups-fade-in-up, 0.2s, ease, forwards ); } .mwe-popups-fade-in-down { - .animation(mwe-popups-fade-in-down, 0.2s, ease, forwards); + .animation( mwe-popups-fade-in-down, 0.2s, ease, forwards ); } .mwe-popups-fade-out-down { - .animation(mwe-popups-fade-out-down, 0.2s, ease, forwards); + .animation( mwe-popups-fade-out-down, 0.2s, ease, forwards ); } .mwe-popups-fade-out-up { - .animation(mwe-popups-fade-out-up, 0.2s, ease, forwards); + .animation( mwe-popups-fade-out-up, 0.2s, ease, forwards ); } diff --git a/resources/ext.popups/actions.js b/resources/ext.popups/actions.js index 98dd922..ce0ca71 100644 --- a/resources/ext.popups/actions.js +++ b/resources/ext.popups/actions.js @@ -58,6 +58,7 @@ * @param {Function} generateToken * @param {mw.Map} config The config of the MediaWiki client-side application, * i.e. `mw.config` + * @returns {Object} */ actions.boot = function ( isUserInCondition, @@ -273,6 +274,7 @@ * See doc/adr/0003-keep-enabled-state-only-in-preview-reducer.md for more * details. * + * @param {Boolean} enabled if previews are enabled or not * @return {Redux.Thunk} */ actions.saveSettings = function ( enabled ) { diff --git a/resources/ext.popups/boot.js b/resources/ext.popups/boot.js index 89ea2f9..00304ca 100644 --- a/resources/ext.popups/boot.js +++ b/resources/ext.popups/boot.js @@ -97,6 +97,7 @@ // If debug mode is enabled, then enable Redux DevTools. if ( mw.config.get( 'debug' ) === true ) { + // eslint-disable-next-line no-underscore-dangle compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; } diff --git a/resources/ext.popups/changeListeners/syncUserSettings.js b/resources/ext.popups/changeListeners/syncUserSettings.js index 6393f87..173f36f 100644 --- a/resources/ext.popups/changeListeners/syncUserSettings.js +++ b/resources/ext.popups/changeListeners/syncUserSettings.js @@ -13,6 +13,7 @@ * a preview is shown, then their preview count will be incremented (see * `mw.popups.reducers.eventLogging`, and is persisted to local storage. * + * @param {ext.popups.UserSettings} userSettings * @return {ext.popups.ChangeListener} */ mw.popups.changeListeners.syncUserSettings = function ( userSettings ) { @@ -40,7 +41,7 @@ * @return {*} */ function get( state, reducer, prop ) { - return state[reducer] && state[reducer][prop]; + return state[ reducer ] && state[ reducer ][ prop ]; } /** diff --git a/resources/ext.popups/gateway.js b/resources/ext.popups/gateway.js index a0e3ff0..3c5eac2 100644 --- a/resources/ext.popups/gateway.js +++ b/resources/ext.popups/gateway.js @@ -46,11 +46,11 @@ maxage: CACHE_LIFETIME, uselang: 'content' }, - { - headers: { - 'X-Analytics': 'preview=1' - } - } ) + { + headers: { + 'X-Analytics': 'preview=1' + } + } ) .then( function ( data ) { // If the response is empty, i.e. data.query.pages is empty or isn't // set, then reject rather than resolve. @@ -59,7 +59,7 @@ data.query.pages && data.query.pages.length ) { - return data.query.pages[0]; + return data.query.pages[ 0 ]; } return $.Deferred().reject(); @@ -73,7 +73,7 @@ * additional data requested above). * * @param {Object} page - * @result {Object} + * @returns {Object} */ function processPage( page ) { var lastModified, @@ -88,7 +88,7 @@ }; if ( page.revisions && page.revisions.length ) { - lastModified = new Date( page.revisions[0].timestamp ); + lastModified = new Date( page.revisions[ 0 ].timestamp ); result.lastModified = lastModified; result.isRecent = new Date() - lastModified < ONE_DAY; @@ -98,7 +98,7 @@ result.thumbnail = page.thumbnail; result.thumbnail.url = result.thumbnail.source; - delete( result.thumbnail.source ); + delete ( result.thumbnail.source ); } return result; @@ -160,7 +160,7 @@ for ( i; i < extract.length; i++ ) { ch = extract.charAt( i ); - if ( ch === ')' && level === 0 ) { + if ( ch === ')' && level === 0 ) { return extract; } if ( ch === '(' ) { diff --git a/resources/ext.popups/reducers/index.js b/resources/ext.popups/reducers/index.js index 82f814e..6694dfe 100644 --- a/resources/ext.popups/reducers/index.js +++ b/resources/ext.popups/reducers/index.js @@ -28,13 +28,13 @@ for ( key in state ) { if ( state.hasOwnProperty( key ) && !updates.hasOwnProperty( key ) ) { - result[key] = state[key]; + result[ key ] = state[ key ]; } } for ( key in updates ) { if ( updates.hasOwnProperty( key ) ) { - result[key] = updates[key]; + result[ key ] = updates[ key ]; } } diff --git a/resources/ext.popups/renderer.js b/resources/ext.popups/renderer.js index c4f2493..04eb6ac 100644 --- a/resources/ext.popups/renderer.js +++ b/resources/ext.popups/renderer.js @@ -277,7 +277,7 @@ /** * Extracted from `mw.popups.render.closePopup`. * - * @preview {ext.popups.Preview} preview + * @param {ext.popups.Preview} preview * @return {jQuery.Promise} A promise that resolves when the preview has faded * out */ diff --git a/resources/ext.popups/settingsDialog.js b/resources/ext.popups/settingsDialog.js index ed81c51..4dce26e 100644 --- a/resources/ext.popups/settingsDialog.js +++ b/resources/ext.popups/settingsDialog.js @@ -3,6 +3,7 @@ /** * Creates a render function that will create the settings dialog and return * a set of methods to operate on it + * @returns {Function} render function */ mw.popups.createSettingsDialogRenderer = function () { @@ -21,6 +22,8 @@ /** * Renders the relevant form and labels in the settings dialog + * @param {Object} boundActions + * @returns {Object} object with methods to affect the rendered UI */ return function ( boundActions ) { @@ -78,6 +81,7 @@ /** * Toggle the help dialog on or off + * @param {Boolean} visible if you want to show or hide the help dialog */ toggleHelp: function ( visible ) { toggleHelp( $dialog, visible ); @@ -159,6 +163,7 @@ * Get the selected value on the radio button * * @param {jQuery.Object} $el the element to extract the setting from + * @return {String} Which should be (simple|advanced|off) */ function getSelectedSetting( $el ) { return $el.find( @@ -190,8 +195,8 @@ * @returns {Boolean} if navpops was found to be enabled */ function isNavPopupsEnabled() { - /*global pg: false*/ + /* global pg: false*/ return typeof pg !== 'undefined' && pg.fn.disablePopups !== undefined; } -} )( mediaWiki, jQuery ); +}( mediaWiki, jQuery ) ); diff --git a/resources/ext.popups/styles/ext.popups.core.less b/resources/ext.popups/styles/ext.popups.core.less index 46ccdec..2c9872f 100644 --- a/resources/ext.popups/styles/ext.popups.core.less +++ b/resources/ext.popups/styles/ext.popups.core.less @@ -1,5 +1,5 @@ -@import "mediawiki.mixins.less"; -@import "mediawiki.ui/variables"; +@import 'mediawiki.mixins.less'; +@import 'mediawiki.ui/variables'; /* Code adapted from Yair Rand's NavPopupsRestyled.js * https://en.wikipedia.org/wiki/User:Yair_rand/NavPopupsRestyled.js @@ -10,7 +10,7 @@ top: -1000px; } -.mwe-popups-border-triangle-top(@size, @left, @color, @extra) { +.mwe-popups-border-triangle-top( @size, @left, @color, @extra ) { content: ''; position: absolute; border: ( @size + @extra ) solid transparent; @@ -21,7 +21,7 @@ left: @left; } -.mwe-popups-border-triangle-bottom(@size, @left, @color, @extra) { +.mwe-popups-border-triangle-bottom( @size, @left, @color, @extra ) { content: ''; position: absolute; border: ( @size + @extra ) solid transparent; @@ -57,7 +57,7 @@ .mwe-popups-settings-icon { // N.B. filenames are relative to the LESS file. - .background-image-svg( "../images/cog.svg", "../images/cog.png" ); + .background-image-svg( '../images/cog.svg', '../images/cog.png' ); } .mwe-popups-sade-face-icon { @@ -67,7 +67,7 @@ margin: 16px 16px 0; background-position: center center; background-repeat: no-repeat; - .background-image-svg( "../images/sad-face.svg", "../images/sad-face.png" ); + .background-image-svg( '../images/sad-face.svg', '../images/sad-face.png' ); } .mwe-popups { @@ -77,8 +77,8 @@ // FIXME: The .box-shadow mixin provided by mediawiki.mixins doesn't support // multiple values. - -webkit-box-shadow: 0 30px 90px -20px rgba(0,0,0,0.3), 0px 0px 1px rgba(0,0,0,0.5); - box-shadow: 0 30px 90px -20px rgba(0,0,0,0.3), 0px 0px 1px rgba(0,0,0,0.5); + -webkit-box-shadow: 0 30px 90px -20px rgba( 0, 0, 0, 0.3 ), 0px 0px 1px rgba( 0, 0, 0, 0.5 ); + box-shadow: 0 30px 90px -20px rgba( 0, 0, 0, 0.3 ), 0px 0px 1px rgba( 0, 0, 0, 0.5 ); padding: 0; display: none; font-size: 14px; @@ -124,17 +124,17 @@ } &:after { - content: " "; + content: ' '; position: absolute; right: 0; bottom: 0; width: 25%; height: 24px; background-color: transparent; - background-image: -webkit-linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%); - background-image: -moz-linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%); - background-image: -o-linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%); - background-image: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%); + background-image: -webkit-linear-gradient( to right, rgba( 255, 255, 255, 0 ), rgba( 255, 255, 255, 1 ) 50% ); + background-image: -moz-linear-gradient( to right, rgba( 255, 255, 255, 0 ), rgba( 255, 255, 255, 1 ) 50% ); + background-image: -o-linear-gradient( to right, rgba( 255, 255, 255, 0 ), rgba( 255, 255, 255, 1 ) 50% ); + background-image: linear-gradient( to right, rgba( 255, 255, 255, 0 ), rgba( 255, 255, 255, 1 ) 50% ); } } @@ -194,11 +194,11 @@ /* Triangles/Pokeys */ &.mwe-popups-no-image-tri { &:after { - .mwe-popups-border-triangle-top( 7px, 7px, #fff, 4px); + .mwe-popups-border-triangle-top( 7px, 7px, #fff, 4px ); } &:before { - .mwe-popups-border-triangle-top( 8px, 10px, #bbb, 0px); + .mwe-popups-border-triangle-top( 8px, 10px, #bbb, 0px ); } } @@ -221,22 +221,22 @@ &.mwe-popups-image-tri { &:before { z-index: 111; - .mwe-popups-border-triangle-top(9px, 9px, #bbb, 0px); + .mwe-popups-border-triangle-top( 9px, 9px, #bbb, 0px ); } &:after { - .mwe-popups-border-triangle-top(8px, 6px, #fff, 4px); + .mwe-popups-border-triangle-top( 8px, 6px, #fff, 4px ); z-index: 112; } &.flipped_x { &:before { z-index: 111; - .mwe-popups-border-triangle-top(9px, 273px, #bbb, 0px); + .mwe-popups-border-triangle-top( 9px, 273px, #bbb, 0px ); } &:after { - .mwe-popups-border-triangle-top(8px, 269px, #fff, 4px); + .mwe-popups-border-triangle-top( 8px, 269px, #fff, 4px ); z-index: 112; } } @@ -260,7 +260,7 @@ &:before { z-index: 111; - .mwe-popups-border-triangle-top(9px, 420px, #bbb, 0px); + .mwe-popups-border-triangle-top( 9px, 420px, #bbb, 0px ); } > div > a > svg { @@ -277,11 +277,11 @@ &.flipped_x_y { &:before { z-index: 111; - .mwe-popups-border-triangle-bottom(9px, 272px, #bbb, 0px); + .mwe-popups-border-triangle-bottom( 9px, 272px, #bbb, 0px ); } &:after { - .mwe-popups-border-triangle-bottom(8px, 269px, #fff, 4px); + .mwe-popups-border-triangle-bottom( 8px, 269px, #fff, 4px ); z-index: 112; } @@ -290,12 +290,12 @@ &:after { z-index: 112; - .mwe-popups-border-triangle-bottom(8px, 417px, #fff, 4px); + .mwe-popups-border-triangle-bottom( 8px, 417px, #fff, 4px ); } &:before { z-index: 111; - .mwe-popups-border-triangle-bottom(9px, 420px, #bbb, 0px); + .mwe-popups-border-triangle-bottom( 9px, 420px, #bbb, 0px ); } > div > a > svg { diff --git a/resources/ext.popups/styles/ext.popups.settings.less b/resources/ext.popups/styles/ext.popups.settings.less index a3bca1f..5c00927 100644 --- a/resources/ext.popups/styles/ext.popups.settings.less +++ b/resources/ext.popups/styles/ext.popups.settings.less @@ -1,4 +1,4 @@ -@import "mediawiki.mixins.less"; +@import 'mediawiki.mixins.less'; @dialog-margin: 50px; @@ -8,7 +8,7 @@ background: #fff; width: 450px; border: 1px solid #ccc; - box-shadow: 0px 1px 1px rgba(0,0,0,0.1); + box-shadow: 0px 1px 1px rgba( 0, 0, 0, 0.1 ); border-radius: 2px; header { @@ -101,14 +101,14 @@ background: #eee; height: 65px; width: 450px; - .background-image-svg( "../images/footer-ltr.svg", "../images/footer-ltr.png" ); + .background-image-svg( '../images/footer-ltr.svg', '../images/footer-ltr.png' ); background-position: center; background-repeat: no-repeat; } } .rtl #mwe-popups-settings-help div.mwe-popups-settings-help-image { - .background-image-svg( "../images/footer-rtl.svg", "../images/footer-rtl.png" ); + .background-image-svg( '../images/footer-rtl.svg', '../images/footer-rtl.png' ); } .mwe-popups-overlay { -- To view, visit https://gerrit.wikimedia.org/r/327722 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2153047c3ddbea50572dd329989088bb20787515 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Popups Gerrit-Branch: mpga Gerrit-Owner: Jhernandez <jhernan...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits