From 46708622dda32ec31e4d4409d0f0f815fa52b3d6 Mon Sep 17 00:00:00 2001 From: "James D. Forrester" Date: Wed, 3 Aug 2016 09:41:35 -0700 Subject: [PATCH] Update OOjs UI to v0.17.7 Release notes: https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/History.md;v0.17.7 Change-Id: I0f36a3485a75ad0346eef9ae98aa47eddb099faf --- composer.json | 2 +- resources/lib/oojs-ui/i18n/cy.json | 17 ++- resources/lib/oojs-ui/i18n/et.json | 2 +- resources/lib/oojs-ui/i18n/ko.json | 4 +- resources/lib/oojs-ui/i18n/sq.json | 7 +- resources/lib/oojs-ui/oojs-ui-apex.js | 4 +- resources/lib/oojs-ui/oojs-ui-core-apex.css | 17 ++- .../lib/oojs-ui/oojs-ui-core-mediawiki.css | 50 +++++-- resources/lib/oojs-ui/oojs-ui-core.js | 45 +++--- resources/lib/oojs-ui/oojs-ui-mediawiki.js | 4 +- .../lib/oojs-ui/oojs-ui-toolbars-apex.css | 4 +- .../oojs-ui/oojs-ui-toolbars-mediawiki.css | 27 +--- resources/lib/oojs-ui/oojs-ui-toolbars.js | 4 +- .../lib/oojs-ui/oojs-ui-widgets-apex.css | 74 +++++----- .../lib/oojs-ui/oojs-ui-widgets-mediawiki.css | 135 ++++++++++-------- resources/lib/oojs-ui/oojs-ui-widgets.js | 31 ++-- .../lib/oojs-ui/oojs-ui-windows-apex.css | 4 +- .../lib/oojs-ui/oojs-ui-windows-mediawiki.css | 8 +- resources/lib/oojs-ui/oojs-ui-windows.js | 4 +- .../lib/oojs-ui/themes/apex/icons-alerts.json | 34 +++++ .../oojs-ui/themes/apex/images/icons/bell.png | Bin 0 -> 235 bytes .../oojs-ui/themes/apex/images/icons/bell.svg | 4 + .../themes/apex/images/icons/bellOn-ltr.png | Bin 0 -> 345 bytes .../themes/apex/images/icons/bellOn-ltr.svg | 4 + .../themes/apex/images/icons/bellOn-rtl.png | Bin 0 -> 367 bytes .../themes/apex/images/icons/bellOn-rtl.svg | 4 + .../oojs-ui/themes/apex/images/icons/eye.png | Bin 0 -> 311 bytes .../oojs-ui/themes/apex/images/icons/eye.svg | 5 + .../themes/apex/images/icons/eyeClosed.png | Bin 0 -> 296 bytes .../themes/apex/images/icons/eyeClosed.svg | 4 + .../themes/apex/images/icons/message-ltr.png | Bin 0 -> 268 bytes .../themes/apex/images/icons/message-ltr.svg | 4 + .../themes/apex/images/icons/message-rtl.png | Bin 0 -> 272 bytes .../themes/apex/images/icons/message-rtl.svg | 4 + .../apex/images/icons/signature-ltr.png | Bin 0 -> 409 bytes .../apex/images/icons/signature-ltr.svg | 4 + .../apex/images/icons/signature-rtl.png | Bin 0 -> 425 bytes .../apex/images/icons/signature-rtl.svg | 4 + .../apex/images/icons/speechBubble-ltr.png | Bin 0 -> 142 bytes .../apex/images/icons/speechBubble-ltr.svg | 4 + .../apex/images/icons/speechBubble-rtl.png | Bin 0 -> 164 bytes .../apex/images/icons/speechBubble-rtl.svg | 4 + .../apex/images/icons/speechBubbleAdd-ltr.png | Bin 0 -> 177 bytes .../apex/images/icons/speechBubbleAdd-ltr.svg | 4 + .../apex/images/icons/speechBubbleAdd-rtl.png | Bin 0 -> 191 bytes .../apex/images/icons/speechBubbleAdd-rtl.svg | 4 + .../apex/images/icons/speechBubbles-ltr.png | Bin 0 -> 163 bytes .../apex/images/icons/speechBubbles-ltr.svg | 4 + .../apex/images/icons/speechBubbles-rtl.png | Bin 0 -> 168 bytes .../apex/images/icons/speechBubbles-rtl.svg | 4 + .../oojs-ui/themes/apex/images/icons/tray.png | Bin 0 -> 342 bytes .../oojs-ui/themes/apex/images/icons/tray.svg | 4 + .../themes/mediawiki/icons-alerts.json | 3 +- .../mediawiki/images/icons/bell-invert.png | Bin 238 -> 237 bytes .../mediawiki/images/icons/bell-invert.svg | 2 +- .../themes/mediawiki/images/icons/bell.png | Bin 237 -> 235 bytes .../themes/mediawiki/images/icons/bell.svg | 2 +- .../images/icons/bellOn-ltr-invert.png | Bin 370 -> 372 bytes .../images/icons/bellOn-ltr-invert.svg | 2 +- .../mediawiki/images/icons/bellOn-ltr.png | Bin 346 -> 345 bytes .../mediawiki/images/icons/bellOn-ltr.svg | 2 +- .../images/icons/bellOn-rtl-invert.png | Bin 379 -> 381 bytes .../images/icons/bellOn-rtl-invert.svg | 2 +- .../mediawiki/images/icons/bellOn-rtl.png | Bin 366 -> 367 bytes .../mediawiki/images/icons/bellOn-rtl.svg | 2 +- .../mediawiki/images/icons/tray-invert.png | Bin 0 -> 359 bytes .../mediawiki/images/icons/tray-invert.svg | 4 + .../themes/mediawiki/images/icons/tray.png | Bin 0 -> 342 bytes .../themes/mediawiki/images/icons/tray.svg | 4 + 69 files changed, 357 insertions(+), 208 deletions(-) create mode 100644 resources/lib/oojs-ui/themes/apex/icons-alerts.json create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/bell.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/bell.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/bellOn-ltr.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/bellOn-ltr.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/bellOn-rtl.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/bellOn-rtl.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/eye.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/eye.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/eyeClosed.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/eyeClosed.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/message-ltr.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/message-ltr.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/message-rtl.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/message-rtl.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/signature-ltr.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/signature-ltr.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/signature-rtl.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/signature-rtl.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubble-ltr.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubble-ltr.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubble-rtl.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubble-rtl.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbleAdd-ltr.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbleAdd-ltr.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbleAdd-rtl.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbleAdd-rtl.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbles-ltr.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbles-ltr.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbles-rtl.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/speechBubbles-rtl.svg create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/tray.png create mode 100644 resources/lib/oojs-ui/themes/apex/images/icons/tray.svg create mode 100644 resources/lib/oojs-ui/themes/mediawiki/images/icons/tray-invert.png create mode 100644 resources/lib/oojs-ui/themes/mediawiki/images/icons/tray-invert.svg create mode 100644 resources/lib/oojs-ui/themes/mediawiki/images/icons/tray.png create mode 100644 resources/lib/oojs-ui/themes/mediawiki/images/icons/tray.svg diff --git a/composer.json b/composer.json index 1bd3d4c5a4..9bd0fa1f07 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "ext-xml": "*", "liuggio/statsd-php-client": "1.0.18", "mediawiki/at-ease": "1.1.0", - "oojs/oojs-ui": "0.17.6", + "oojs/oojs-ui": "0.17.7", "oyejorge/less.php": "1.7.0.10", "php": ">=5.5.9", "psr/log": "1.0.0", diff --git a/resources/lib/oojs-ui/i18n/cy.json b/resources/lib/oojs-ui/i18n/cy.json index b74cd064dc..f3c7e3c4cd 100644 --- a/resources/lib/oojs-ui/i18n/cy.json +++ b/resources/lib/oojs-ui/i18n/cy.json @@ -4,11 +4,24 @@ "Lloffiwr", "Robin Owain", "ОйЛ", - "DChan (WMF)" + "DChan (WMF)", + "Jdforrester" ] }, "ooui-outline-control-move-down": "Symud yr eitem i lawr", "ooui-outline-control-move-up": "Symud yr eitem i fyny", "ooui-outline-control-remove": "Tynnu'r eitem", - "ooui-toolbar-more": "Rhagor" + "ooui-toolbar-more": "Rhagor", + "ooui-toolgroup-expand": "Mwy", + "ooui-toolgroup-collapse": "Llai", + "ooui-dialog-message-accept": "Iawn", + "ooui-dialog-message-reject": "Canslo", + "ooui-dialog-process-error": "Aeth rhywbeth o’i le", + "ooui-dialog-process-dismiss": "Gadael", + "ooui-dialog-process-retry": "Ailgeisio", + "ooui-dialog-process-continue": "Parhau", + "ooui-selectfile-button-select": "Dewis ffeil", + "ooui-selectfile-not-supported": "Nid oes modd dewis ffeil", + "ooui-selectfile-placeholder": "Dim ffeil wedi'i dewis", + "ooui-selectfile-dragdrop-placeholder": "Gollwng ffeil yma" } diff --git a/resources/lib/oojs-ui/i18n/et.json b/resources/lib/oojs-ui/i18n/et.json index 59b7ccd9f6..326baaff1c 100644 --- a/resources/lib/oojs-ui/i18n/et.json +++ b/resources/lib/oojs-ui/i18n/et.json @@ -15,7 +15,7 @@ "ooui-dialog-message-accept": "Sobib", "ooui-dialog-message-reject": "Loobu", "ooui-dialog-process-error": "Midagi läks valesti", - "ooui-dialog-process-dismiss": "Hülga", + "ooui-dialog-process-dismiss": "Sule", "ooui-dialog-process-retry": "Proovi uuesti", "ooui-dialog-process-continue": "Jätka", "ooui-selectfile-button-select": "Vali fail", diff --git a/resources/lib/oojs-ui/i18n/ko.json b/resources/lib/oojs-ui/i18n/ko.json index 38944173b3..0c84bd1fbc 100644 --- a/resources/lib/oojs-ui/i18n/ko.json +++ b/resources/lib/oojs-ui/i18n/ko.json @@ -13,8 +13,8 @@ "Hwangjy9" ] }, - "ooui-outline-control-move-down": "항목을 아래로 옮기기", - "ooui-outline-control-move-up": "항목을 위로 옮기기", + "ooui-outline-control-move-down": "항목을 아래로 이동", + "ooui-outline-control-move-up": "항목을 위로 이동", "ooui-outline-control-remove": "항목 제거", "ooui-toolbar-more": "더 보기", "ooui-toolgroup-expand": "더 보기", diff --git a/resources/lib/oojs-ui/i18n/sq.json b/resources/lib/oojs-ui/i18n/sq.json index 4bf5dac9b0..679f1a6f80 100644 --- a/resources/lib/oojs-ui/i18n/sq.json +++ b/resources/lib/oojs-ui/i18n/sq.json @@ -6,7 +6,8 @@ "Elioqoshi", "GretaDoci", "Gertakapllani", - "Techlik" + "Techlik", + "Liridon" ] }, "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë", @@ -21,6 +22,8 @@ "ooui-dialog-process-dismiss": "Largoje", "ooui-dialog-process-retry": "Provo përsëri", "ooui-dialog-process-continue": "Vazhdo", + "ooui-selectfile-button-select": "Përzgjidhni një skedë", "ooui-selectfile-not-supported": "Skedari i përzgjedhur nuk përkrahet", - "ooui-selectfile-placeholder": "Nuk është zgjedhur asnjë skedar" + "ooui-selectfile-placeholder": "Nuk është zgjedhur asnjë skedar", + "ooui-selectfile-dragdrop-placeholder": "Vendose skedën këtu" } diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js index a34432f35e..6a38d0d9f6 100644 --- a/resources/lib/oojs-ui/oojs-ui-apex.js +++ b/resources/lib/oojs-ui/oojs-ui-apex.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.17.6 + * OOjs UI v0.17.7 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-07-12T20:26:03Z + * Date: 2016-08-03T16:38:22Z */ ( function ( OO ) { diff --git a/resources/lib/oojs-ui/oojs-ui-core-apex.css b/resources/lib/oojs-ui/oojs-ui-core-apex.css index 152d444fb5..72591ccc4a 100644 --- a/resources/lib/oojs-ui/oojs-ui-core-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-core-apex.css @@ -1,15 +1,16 @@ /*! - * OOjs UI v0.17.6 + * OOjs UI v0.17.7 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-07-12T20:26:07Z + * Date: 2016-08-03T16:38:27Z */ .oo-ui-element-hidden { display: none !important; + /* stylelint-disable-line declaration-no-important */ } .oo-ui-buttonElement > .oo-ui-buttonElement-button { cursor: pointer; @@ -797,6 +798,14 @@ overflow: auto; resize: none; } +.oo-ui-textInputWidget [type="number"] { + -moz-appearance: textfield; +} +.oo-ui-textInputWidget [type="number"]::-webkit-outer-spin-button, +.oo-ui-textInputWidget [type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} .oo-ui-textInputWidget [type="search"] { -webkit-appearance: textfield; } @@ -1052,8 +1061,8 @@ .oo-ui-comboBoxInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator { cursor: pointer; } -.oo-ui-comboBoxInputWidget-php input::-webkit-calendar-picker-indicator { - opacity: 0 !important; +.oo-ui-comboBoxInputWidget-php ::-webkit-calendar-picker-indicator { + opacity: 0; position: absolute; right: 0; top: 0; diff --git a/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css index a191804687..23ecccda71 100644 --- a/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css +++ b/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css @@ -1,15 +1,16 @@ /*! - * OOjs UI v0.17.6 + * OOjs UI v0.17.7 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-07-12T20:26:07Z + * Date: 2016-08-03T16:38:27Z */ .oo-ui-element-hidden { display: none !important; + /* stylelint-disable-line declaration-no-important */ } .oo-ui-buttonElement > .oo-ui-buttonElement-button { cursor: pointer; @@ -419,7 +420,7 @@ margin-bottom: 1.25em; } .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label { - padding: 0.25em 0.25em 0.25em 1em; + padding: 0.25em 0.25em 0.25em 0.5em; } .oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label { padding-top: 0.25em; @@ -497,9 +498,8 @@ margin-top: 2em; } .oo-ui-fieldsetLayout > .oo-ui-labelElement-label { - font-size: 1.1em; margin-bottom: 0.5em; - padding: 0.25em 0; + font-size: 1.1em; font-weight: bold; } .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label { @@ -639,7 +639,7 @@ background-color: transparent; } .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label { - padding: 0.25em 0.25em 0.25em 1em; + padding: 0.25em 0.25em 0.25em 0.5em; } .oo-ui-radioOptionWidget .oo-ui-radioInputWidget { margin-right: 0; @@ -858,15 +858,15 @@ background-position: center center; background-origin: border-box; background-size: 0 0; - border: 1px solid #777777; + border: 1px solid #767676; border-radius: 2px; } .oo-ui-checkboxInputWidget [type="checkbox"]:checked + span { background-size: 100% 100%; } .oo-ui-checkboxInputWidget [type="checkbox"]:active + span { - background-color: #cccccc; - border-color: #cccccc; + background-color: #767676; + border-color: #767676; } .oo-ui-checkboxInputWidget [type="checkbox"]:focus + span { border-width: 2px; @@ -985,15 +985,15 @@ background-position: center center; background-origin: border-box; background-size: 0 0; - border: 1px solid #777777; + border: 1px solid #767676; border-radius: 100%; } .oo-ui-radioInputWidget [type="radio"]:checked + span { background-size: 100% 100%; } .oo-ui-radioInputWidget [type="radio"]:active + span { - background-color: #cccccc; - border-color: #cccccc; + background-color: #767676; + border-color: #767676; } .oo-ui-radioInputWidget [type="radio"]:focus + span { border-width: 2px; @@ -1045,6 +1045,14 @@ overflow: auto; resize: none; } +.oo-ui-textInputWidget [type="number"] { + -moz-appearance: textfield; +} +.oo-ui-textInputWidget [type="number"]::-webkit-outer-spin-button, +.oo-ui-textInputWidget [type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} .oo-ui-textInputWidget [type="search"] { -webkit-appearance: textfield; } @@ -1118,6 +1126,10 @@ -moz-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1); transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1); } +.oo-ui-textInputWidget.oo-ui-widget-enabled input:hover, +.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover { + border-color: #aaaaaa; +} .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus, .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus { outline: 0; @@ -1129,6 +1141,10 @@ color: #777777; text-shadow: 0 1px 1px #ffffff; } +.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:hover, +.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:hover { + border-color: #cccccc; +} .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus, .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus { border-color: #cccccc; @@ -1152,6 +1168,10 @@ .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea { border-color: #ff0000; } +.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:hover, +.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:hover { + border-color: #ff0000; +} .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:focus, .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:focus { border-color: #ff0000; @@ -1343,8 +1363,8 @@ .oo-ui-comboBoxInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator { cursor: pointer; } -.oo-ui-comboBoxInputWidget-php input::-webkit-calendar-picker-indicator { - opacity: 0 !important; +.oo-ui-comboBoxInputWidget-php ::-webkit-calendar-picker-indicator { + opacity: 0; position: absolute; right: 0; top: 0; @@ -1394,7 +1414,7 @@ vertical-align: middle; } .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label { - padding: 0.25em 0.25em 0.25em 1em; + padding: 0.25em 0.25em 0.25em 0.5em; } .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget { margin-right: 0; diff --git a/resources/lib/oojs-ui/oojs-ui-core.js b/resources/lib/oojs-ui/oojs-ui-core.js index 2a1427b33f..4d32961d66 100644 --- a/resources/lib/oojs-ui/oojs-ui-core.js +++ b/resources/lib/oojs-ui/oojs-ui-core.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.17.6 + * OOjs UI v0.17.7 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-07-12T20:26:03Z + * Date: 2016-08-03T16:38:22Z */ ( function ( OO ) { @@ -6994,7 +6994,7 @@ OO.ui.CheckboxMultiselectWidget.prototype.getRelativeFocusableItem = function ( * @param {jQuery.Event} e */ OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) { - var $options, checked, + var $options, lastClickedIndex, nowClickedIndex, i, direction, wasSelected, items, $lastClicked = this.$lastClicked, $nowClicked = $( e.target ).closest( '.oo-ui-checkboxMultioptionWidget' ) .not( '.oo-ui-widget-disabled' ); @@ -7002,19 +7002,32 @@ OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) { // Allow selecting multiple options at once by Shift-clicking them if ( $lastClicked && $nowClicked.length && e.shiftKey ) { $options = this.$group.find( '.oo-ui-checkboxMultioptionWidget' ); - checked = $nowClicked.find( 'input' ).prop( 'checked' ); - - $options - .slice( - Math.min( $options.index( $lastClicked ), $options.index( $nowClicked ) ), - Math.max( $options.index( $lastClicked ), $options.index( $nowClicked ) ) + 1 - ) - .find( 'input' ) - .filter( function () { - return !this.disabled; - } ) - .prop( 'checked', checked ) - .trigger( 'change' ); + lastClickedIndex = $options.index( $lastClicked ); + nowClickedIndex = $options.index( $nowClicked ); + // If it's the same item, either the user is being silly, or it's a fake event generated by the + // browser. In either case we don't need custom handling. + if ( nowClickedIndex !== lastClickedIndex ) { + items = this.items; + wasSelected = items[ nowClickedIndex ].isSelected(); + direction = nowClickedIndex > lastClickedIndex ? 1 : -1; + + // This depends on the DOM order of the items and the order of the .items array being the same. + for ( i = lastClickedIndex; i !== nowClickedIndex; i += direction ) { + if ( !items[ i ].isDisabled() ) { + items[ i ].setSelected( !wasSelected ); + } + } + // For the now-clicked element, use immediate timeout to allow the browser to do its own + // handling first, then set our value. The order in which events happen is different for + // clicks on the and on the