Update OOUI to v0.30.4

Release notes:
 https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/History.md;v0.30.4

Bug: T92026
Bug: T145674
Bug: T206729
Bug: T213884
Bug: T216780
Bug: T217014
Bug: T217213
Bug: T217381
Bug: T217790
Depends-On: Id50f068908accd022c7847c40795286c32199b4e
Change-Id: Id50f068908accd022c7847c40795286c32199b4a
This commit is contained in:
James D. Forrester 2019-03-07 09:22:27 +00:00
parent 8b26fc816f
commit 6a38e16b88
167 changed files with 1909 additions and 1245 deletions

View file

@ -68,7 +68,7 @@ production.
* Added jakub-onderka/php-console-highlighter 0.3.2 explicitly (dev-only).
==== Changed external libraries ====
* Updated OOUI from v0.29.2 to v0.30.3.
* Updated OOUI from v0.29.2 to v0.30.4.
* Updated OOjs Router from pre-release to v0.2.0.
* Updated moment from v2.19.3 to v2.24.0.
* Updated wikimedia/xmp-reader from 0.6.0 to 0.6.2.

View file

@ -27,7 +27,7 @@
"ext-xml": "*",
"guzzlehttp/guzzle": "6.3.3",
"liuggio/statsd-php-client": "1.0.18",
"oojs/oojs-ui": "0.30.3",
"oojs/oojs-ui": "0.30.4",
"pear/mail": "1.4.1",
"pear/mail_mime": "1.10.2",
"pear/net_smtp": "1.8.1",

View file

@ -133,8 +133,8 @@ oojs-router:
ooui:
type: tar
src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.30.3.tgz
integrity: sha384-lKv5WHjcSDfly2Vd2u9JJErkfo+1yFi/+pfFL0bmOu3hKpcZQmaLvu6gmhkzH5WN
src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.30.4.tgz
integrity: sha384-uacCh/In2B0iX2dVwS3JEBDYWPKQ8xNx+dfP7eSwAj4aPugNhmxufjIOekw7cgJZ
dest:
# Main stuff
package/dist/oojs-ui-core.js{,.map.json}:

View file

@ -1,4 +1,45 @@
# OOUI Release History
## v0.30.4 / 2019-03-06
### Deprecations
* [DEPRECATING CHANGE] SelectWidget: Rename '-depressed' to '-unpressed' (Ed Sanders)
* [DEPRECATING CHANGE] icons: Deprecate 'web' from 'editing-citation' (Volker E.)
### Features
* Implement 'error' flag and 'warning' type messages (Volker E.)
* MenuSelectWidget: Add 'filterMode' (Moriel Schottlender)
### Styles
* Apex theme: Bring icons and layout styles from WikimediaUI theme (Volker E.)
* ButtonElement: Add styling for disabled active framed buttons (Bartosz Dziewoński)
* icons: Snap 'camera' icon's frame to pixel grid (Ed Sanders)
* icons: Add 'articleAdd' to 'content' pack (Volker E.)
* icons: Add 'imageLayout…' icons to 'editing-advanced' pack (Volker E.)
* WikimediaUI theme: De-emphasize `opacity` on TextInputWidget icons (Volker E.)
* WikimediaUI theme: Give user messages more whitespace (Volker E.)
* WikimediaUI theme: Place icons at top of message (Volker E.)
* themes: Fix TagItemWidget's vertical alignment in Safari (Volker E.)
* themes: Fix `padding` of label in DropdownWidget (Volker E.)
* themes: Provide 'emphasized' color for messages (Volker E.)
### Code
* Consistently spell "access key" (Bartosz Dziewoński)
* Follow-up I5991001e257: Add missing function call to normalize query (Ed Sanders)
* Follow-up I5991001e: Do not filter item if query is empty (Moriel Schottlender)
* MenuTagMultiselectWidget: Use 'highlightOnFilter' flag in MenuSelectWidget (Ed Sanders)
* SelectWidget: Rewrite getItemMatcher without regular expressions (Ed Sanders)
* Tag.php: Prevent duplicates in class list (Ed Sanders)
* TextInputWidget: Reduce selector where applicable (Volker E.)
* themes: Unify TextInput selector code (Volker E.)
* build: Consistently indent .eslintrc.json files with tabs (Bartosz Dziewoński)
* build: Enable eslint 'max-len' in code and fix (James D. Forrester)
* build: Remove obsolete stylelint overrides (Volker E.)
* build: Update eslint-config-wikimedia to 0.11.0 (Ed Sanders)
* docs: Unify key names in documentation (Volker E.)
* icons: Manually optimize the SVG code of some icons (Thiemo Kreuz)
* icons: Re-crush with 'svgmin' build task (Volker E.)
* icons: Remove redundant `ry="…"` SVG attribute when identical to `rx="…"` (Thiemo Kreuz)
## v0.30.3 / 2019-02-20
### Styles
* WikimediaUI theme: Align TagItemWidget's close icon correctly (Volker E.)
@ -12,7 +53,7 @@
* ComboBoxInputWidget: Disable controls when widget is set to read-only (Ed Sanders)
* MenuSelectWidget: Documentation fix (Ed Sanders)
* ProgressBarWidget: Fix irregularities in indeterminate styling (Bartosz Dziewoński)
* TagMultiselectWidget: Populate input with item label on backspace (Thalia Chan)
* TagMultiselectWidget: Populate input with item label on Backspace key press (Thalia Chan)
* Update getScrollLeft from upstream (Ed Sanders)
* themes: Replace element by class attribute selector (Volker E.)
* WikimediaUI theme: Remove variables with duplicated values (Volker E.)
@ -1018,7 +1059,7 @@
## v0.22.4 / 2017-08-01
### Features
* CheckboxMultiselectInputWidget: setValue when CheckboxMultiselect changes (Prateek Saxena)
* FieldLayout: Show widget's accesskey in our title (Bartosz Dziewoński)
* FieldLayout: Show widget's access key in our title (Bartosz Dziewoński)
* TextInputWidget: When positioning label, don't clear padding if we will set it again (Bartosz Dziewoński)
* TitledElement: When an AccessKeyedElement, show access key in the title (Bartosz Dziewoński)
@ -1199,7 +1240,7 @@
* Allow more widgets to be focussed programatically (Bartosz Dziewoński)
* Generalize `.getInputId()` for all widgets (Bartosz Dziewoński)
* Use `.focus()` method when possible instead of looking inside widgets (Bartosz Dziewoński)
* TagMultiselectWidget: Fix `Ctrl`+`Backspace` to delete last item (Bartosz Dziewoński)
* TagMultiselectWidget: Fix Control+Backspace keys to delete last item (Bartosz Dziewoński)
* TagMultiselectWidget: Fix order of checks for `allowArbitrary`/`allowDuplicates` (Bartosz Dziewoński)
### Styles
@ -1553,7 +1594,7 @@
## v0.19.1 / 2017-02-07
### Features
* Dialog: Support meta as well as ctrl for modifier on enter key (David Lynch)
* Dialog: Support Meta as well as Control for modifier on Enter key (David Lynch)
### Styles
* FieldLayout: Fix styling for disabled widgets in PHP (Bartosz Dziewoński)
@ -1986,7 +2027,7 @@
* [DEPRECATING CHANGE] CapsuleMultiSelectWidget: Rename to CapsuleMultiselectWidget (Bartosz Dziewoński)
### Features
* SelectWidget/OptionWidget: Implement selecting by accesskey (Bartosz Dziewoński)
* SelectWidget/OptionWidget: Implement selecting by access key (Bartosz Dziewoński)
* TextInputWidget: Stop returning 'multiline' from 'getSaneType' (Prateek Saxena)
### Styles
@ -2170,7 +2211,7 @@
* [DEPRECATING CHANGE] Move some editing icons from core to editing-* (James D. Forrester)
### Features
* Dialog: trigger the primary action with ctrl-enter (David Lynch)
* Dialog: trigger the primary action with Control+Enter (David Lynch)
* TextInputWidget: Allow type="date" (Geoffrey Mon)
### Styles
@ -2268,7 +2309,7 @@
## v0.15.3 / 2016-02-09
### Features
* CapsuleItemWidget: Let user tab through items, edit and delete them (Prateek Saxena)
* CapsuleMultiSelectWidget: Edit instead of remove on backspace (Prateek Saxena)
* CapsuleMultiSelectWidget: Edit instead of remove on Backspace (Prateek Saxena)
* CapsuleWidgets: Edit on click and remove on Ctrl+Backspace (Prateek Saxena)
* CapsuleWidgets: Toggle through capsules and the input with arrow keys (Prateek Saxena)
* DropdownWidget: Open menu on up and down arrow keys (Prateek Saxena)
@ -2376,7 +2417,7 @@
* [DEPRECATING CHANGE] core: Deprecate add/removeCaptureEventListener (Bartosz Dziewoński)
### Features
* Send escape key cancel events through action handler (Alex Monk)
* Send Escape key cancel events through action handler (Alex Monk)
### Styles
* MediaWiki theme: Align variable values & properties to CSS/Less guidelines (Volker E)
@ -3667,7 +3708,7 @@
* FieldLayout: Use `<label>` for this.$body, not this.$element (Bartosz Dziewoński)
* Fix primary button description text (Niklas Laxström)
* GridLayout: Don't round to 1% (Bartosz Dziewoński)
* Kill the escape keydown event after handling a window close (Ed Sanders)
* Kill the Escape keydown event after handling a window close (Ed Sanders)
* RadioInputWidget: Remove documentation lies (Bartosz Dziewoński)
* Temporarily remove position:absolute on body when resizing (Ed Sanders)
* build: Use String#slice instead of discouraged String#substr (Timo Tijhof)

View file

@ -21,7 +21,7 @@
"ooui-dialog-message-accept": "TEMAM",
"ooui-dialog-message-reject": "Bıtexelne",
"ooui-dialog-process-error": "Tayê çi ğelet şi...",
"ooui-dialog-process-dismiss": "Racın",
"ooui-dialog-process-dismiss": "Red ke",
"ooui-dialog-process-retry": "Fına bıcerbın",
"ooui-dialog-process-continue": "Dewam ke",
"ooui-combobox-button-label": "Seba qutiya abiyaye menu",

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:07Z
* Date: 2019-03-07T09:14:18Z
*/
( function ( OO ) {

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-element-hidden {
display: none !important;
@ -252,6 +252,16 @@
border-color: #ccc;
box-shadow: none;
}
.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus {
background-color: #ebebeb;
background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #ddd), color-stop(100%, #fafafa));
background-image: -webkit-linear-gradient(top, #ddd 0, #fafafa 100%);
background-image: -moz-linear-gradient(top, #ddd 0, #fafafa 100%);
background-image: linear-gradient(to bottom, #ddd 0, #fafafa 100%);
box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
}
.oo-ui-clippableElement-clippable {
-webkit-box-sizing: border-box;
@ -446,24 +456,33 @@
}
.oo-ui-fieldLayout-messages {
list-style: none none;
margin: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
max-width: 50em;
margin: 0.25em 0 0 0.25em;
padding: 0;
margin-top: 0.25em;
margin-left: 0.25em;
}
.oo-ui-fieldLayout-messages > [class|='oo-ui-fieldLayout-messages'] {
margin: 0;
color: #000;
display: table;
margin: 0.625em 0 0;
padding: 0;
}
.oo-ui-fieldLayout-messages .oo-ui-iconWidget {
display: none;
.oo-ui-fieldLayout-messages > [class|='oo-ui-fieldLayout-messages']:first-child {
margin-top: 0.3125em;
}
.oo-ui-fieldLayout-messages .oo-ui-fieldLayout-messages-error {
color: #d45353;
}
.oo-ui-fieldLayout-messages .oo-ui-iconWidget.oo-ui-iconElement-icon {
background-position: 0 0;
display: table-cell;
}
.oo-ui-fieldLayout-messages .oo-ui-labelWidget {
padding: 0.1em 0;
line-height: 1.5em;
display: table-cell;
padding-left: 0.5em;
line-height: 1.5;
vertical-align: middle;
}
@ -641,7 +660,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
.oo-ui-optionWidget .oo-ui-labelElement-label {
line-height: 1.5em;
}
.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
.oo-ui-selectWidget-unpressed .oo-ui-optionWidget-selected {
background-color: #a7dcff;
}
.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed,
@ -1097,8 +1116,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
width: 100%;
max-width: 50em;
}
.oo-ui-textInputWidget input,
.oo-ui-textInputWidget textarea {
.oo-ui-textInputWidget .oo-ui-inputWidget-input {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
@ -1129,6 +1147,29 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
.oo-ui-textInputWidget [type='search']::-webkit-search-cancel-button {
display: none;
}
.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
left: 0;
}
.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
right: 0;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
position: absolute;
top: 0;
}
.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
display: block;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-labelElement ::-ms-clear {
display: none;
}
.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
pointer-events: none;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
cursor: text;
@ -1143,31 +1184,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
-ms-user-select: none;
user-select: none;
}
.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
display: block;
}
.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
left: 0;
}
.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
right: 0;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-labelElement ::-ms-clear {
display: none;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
position: absolute;
top: 0;
}
.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
pointer-events: none;
}
.oo-ui-textInputWidget input,
.oo-ui-textInputWidget textarea {
.oo-ui-textInputWidget .oo-ui-inputWidget-input {
background-color: #fff;
color: #000;
border: 1px solid #ccc;
@ -1180,60 +1197,83 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
-moz-transition: border-color 250ms, box-shadow 250ms;
transition: border-color 250ms, box-shadow 250ms;
}
.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
background-color: transparent;
}
.oo-ui-textInputWidget input::-webkit-input-placeholder,
.oo-ui-textInputWidget textarea::-webkit-input-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget input:-ms-input-placeholder,
.oo-ui-textInputWidget textarea:-ms-input-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget input::-moz-placeholder,
.oo-ui-textInputWidget textarea::-moz-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget input:-moz-placeholder,
.oo-ui-textInputWidget textarea:-moz-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget input::placeholder,
.oo-ui-textInputWidget textarea::placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget input {
line-height: 1.172em;
}
.oo-ui-textInputWidget textarea {
line-height: 1.275;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
.oo-ui-textInputWidget .oo-ui-pendingElement-pending {
background-color: transparent;
}
.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
position: absolute;
top: 0;
height: 100%;
margin: 0 0.15625em;
}
.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-inputWidget-input {
padding-left: 2.475em;
}
.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon {
max-height: 2.5em;
margin-left: 0.5em;
}
.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-inputWidget-input {
padding-right: 2.4875em;
}
.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
max-height: 2.5em;
margin-right: 0.775em;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
color: #767676;
top: 1px;
padding: 0.546875em 0.4em 0.625em 0.4em;
line-height: 1.172em;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
margin-right: 2.0875em;
}
.oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
margin-left: 2.075em;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::-webkit-input-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:-ms-input-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::-moz-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:-moz-placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::placeholder {
color: #767676;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:focus {
outline: 0;
border-color: #ace;
box-shadow: 0 0 2px 2px #ace;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input[readonly] {
background-color: #f3f3f3;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input {
background-color: #fdd;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled input,
.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-inputWidget-input {
background-color: #f3f3f3;
color: #ccc;
border-color: #ddd;
background-color: #f3f3f3;
text-shadow: 0 1px 1px #fff;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon,
@ -1244,42 +1284,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
color: #ddd;
text-shadow: 0 1px 1px #fff;
}
.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
position: absolute;
top: 0;
height: 100%;
margin: 0 0.15625em;
}
.oo-ui-textInputWidget.oo-ui-iconElement input,
.oo-ui-textInputWidget.oo-ui-iconElement textarea {
padding-left: 2.475em;
}
.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon {
max-height: 2.5em;
margin-left: 0.5em;
}
.oo-ui-textInputWidget.oo-ui-indicatorElement input,
.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
padding-right: 2.4875em;
}
.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
max-height: 2.5em;
margin-right: 0.775em;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
display: none;
top: 1px;
padding: 0.546875em 0.4em 0.625em 0.4em;
line-height: 1.172em;
color: #767676;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
margin-right: 2.0875em;
}
.oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
margin-left: 2.075em;
}
.oo-ui-menuSelectWidget {
position: absolute;
@ -1395,6 +1399,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
right: 0;
margin: 0 0.775em;
}
.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
margin-left: 3em;
}
.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle {
padding-right: 2.5em;
}
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
background-color: #fff;
}
@ -1414,12 +1424,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
opacity: 0.2;
}
.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
margin-left: 3em;
}
.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
margin-right: 2em;
}
.oo-ui-comboBoxInputWidget {
display: inline-block;

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-element-hidden {
display: none !important;
@ -266,6 +266,9 @@
color: #fff;
border-color: #c8ccd1;
}
.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
background-color: #919fb9;
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
background-color: #f8f9fa;
color: #222;
@ -556,7 +559,7 @@
.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
padding-top: 0;
padding-bottom: 0;
padding-left: 0.42857143em;
padding-left: 0.57142857em;
}
.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
margin-right: 0;
@ -587,19 +590,24 @@
padding: 0.28571429em 0.85714286em;
}
.oo-ui-fieldLayout-messages > [class|='oo-ui-fieldLayout-messages'] {
color: #000;
display: table;
margin: 0.28571429em 0 0;
margin: 0.57142857em 0 0;
padding: 0;
}
.oo-ui-fieldLayout-messages .oo-ui-iconElement.oo-ui-iconElement-icon {
.oo-ui-fieldLayout-messages > [class|='oo-ui-fieldLayout-messages']:first-child {
margin-top: 0.28571429em;
}
.oo-ui-fieldLayout-messages .oo-ui-fieldLayout-messages-error {
color: #d33;
}
.oo-ui-fieldLayout-messages .oo-ui-iconWidget.oo-ui-iconElement-icon {
background-position: 0 0;
display: table-cell;
position: static;
top: auto;
height: 1.42857143em;
}
.oo-ui-fieldLayout-messages .oo-ui-labelWidget {
display: table-cell;
padding-left: 0.42857143em;
padding-left: 0.57142857em;
vertical-align: middle;
}
.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
@ -1442,8 +1450,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
width: 100%;
max-width: 50em;
}
.oo-ui-textInputWidget input,
.oo-ui-textInputWidget textarea {
.oo-ui-textInputWidget .oo-ui-inputWidget-input {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
@ -1474,6 +1481,29 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
.oo-ui-textInputWidget [type='search']::-webkit-search-cancel-button {
display: none;
}
.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
left: 0;
}
.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
right: 0;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
position: absolute;
top: 0;
}
.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
display: block;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-labelElement ::-ms-clear {
display: none;
}
.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
pointer-events: none;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
cursor: text;
@ -1488,40 +1518,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
-ms-user-select: none;
user-select: none;
}
.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
display: block;
}
.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
left: 0;
}
.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
right: 0;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-labelElement ::-ms-clear {
display: none;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
position: absolute;
top: 0;
}
.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
pointer-events: none;
}
.oo-ui-textInputWidget input,
.oo-ui-textInputWidget textarea {
.oo-ui-textInputWidget .oo-ui-inputWidget-input {
-webkit-appearance: none;
margin: 0;
font-size: inherit;
font-family: inherit;
background-color: #fff;
color: #000;
margin: 0;
border: 1px solid #a2a9b1;
border-radius: 2px;
padding: 0.57142857em 0.57142857em;
font-size: inherit;
font-family: inherit;
}
.oo-ui-textInputWidget input {
height: 2.28571429em;
@ -1533,96 +1539,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
.oo-ui-textInputWidget .oo-ui-pendingElement-pending {
background-color: transparent;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
box-shadow: inset 0 0 0 1px transparent;
-webkit-transition: border-color 250ms, box-shadow 250ms;
-moz-transition: border-color 250ms, box-shadow 250ms;
transition: border-color 250ms, box-shadow 250ms;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:-ms-input-placeholder,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-ms-input-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input::-moz-placeholder,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-moz-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:-moz-placeholder,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-moz-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input::placeholder,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
outline: 0;
border-color: #36c;
box-shadow: inset 0 0 0 1px #36c;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
background-color: #f8f9fa;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover input,
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover textarea {
border-color: #72777d;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover textarea:focus {
border-color: #36c;
}
@media screen and (min-width: 0) {
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
outline: 1px solid #36c;
outline-offset: -2px;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:focus {
outline-color: #d33;
}
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
border-color: #d33;
}
.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: #d33;
}
.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: #d33;
box-shadow: inset 0 0 0 1px #d33;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled input,
.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
background-color: #eaecf0;
-webkit-text-fill-color: #72777d;
color: #72777d;
text-shadow: 0 1px 1px #fff;
border-color: #c8ccd1;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-indicatorElement-indicator {
opacity: 0.51;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-labelElement-label {
color: #72777d;
text-shadow: 0 1px 1px #fff;
}
.oo-ui-textInputWidget.oo-ui-iconElement input,
.oo-ui-textInputWidget.oo-ui-iconElement textarea {
.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-inputWidget-input {
padding-left: 2.64285714em;
}
.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon {
@ -1637,8 +1554,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
padding: 0.57142857em 0.85714286em 0.57142857em 0.57142857em;
line-height: 1;
}
.oo-ui-textInputWidget.oo-ui-indicatorElement input,
.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-inputWidget-input {
padding-right: 2em;
}
.oo-ui-textInputWidget.oo-ui-indicatorElement.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
@ -1654,6 +1570,88 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
.oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
padding-left: 2.64285714em;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input {
box-shadow: inset 0 0 0 1px transparent;
-webkit-transition: border-color 250ms, box-shadow 250ms;
-moz-transition: border-color 250ms, box-shadow 250ms;
transition: border-color 250ms, box-shadow 250ms;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::-webkit-input-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:-ms-input-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::-moz-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:-moz-placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::placeholder {
color: #72777d;
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:focus {
outline: 0;
border-color: #36c;
box-shadow: inset 0 0 0 1px #36c;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:focus ~ .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:focus ~ .oo-ui-indicatorElement-indicator {
opacity: 1;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input[readonly] {
background-color: #f8f9fa;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover .oo-ui-inputWidget-input {
border-color: #72777d;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover .oo-ui-inputWidget-input:focus {
border-color: #36c;
}
@media screen and (min-width: 0) {
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea.oo-ui-inputWidget-input:focus {
outline: 1px solid #36c;
outline-offset: -2px;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea.oo-ui-inputWidget-input:focus {
outline-color: #d33;
}
}
.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
opacity: 0.87;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input {
border-color: #d33;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input:hover {
border-color: #d33;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input:focus {
border-color: #d33;
box-shadow: inset 0 0 0 1px #d33;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-inputWidget-input {
background-color: #eaecf0;
-webkit-text-fill-color: #72777d;
color: #72777d;
text-shadow: 0 1px 1px #fff;
border-color: #c8ccd1;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon,
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-indicatorElement-indicator {
opacity: 0.51;
}
.oo-ui-textInputWidget.oo-ui-widget-disabled > .oo-ui-labelElement-label {
color: #72777d;
text-shadow: 0 1px 1px #fff;
}
.oo-ui-menuSelectWidget {
position: absolute;
@ -1775,7 +1773,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
padding-left: 2.64285714em;
}
.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle {
padding-right: 1.71428571em;
padding-right: 2.57142857em;
}
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
background-color: #f8f9fa;

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-checkIcon {
display: none;

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-tool {
-webkit-box-sizing: border-box;

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:07Z
* Date: 2019-03-07T09:14:18Z
*/
( function ( OO ) {
@ -14,17 +14,18 @@
/**
* Toolbars are complex interface components that permit users to easily access a variety
* of {@link OO.ui.Tool tools} (e.g., formatting commands) and actions, which are additional commands that are
* part of the toolbar, but not configured as tools.
* of {@link OO.ui.Tool tools} (e.g., formatting commands) and actions, which are additional
* commands that are part of the toolbar, but not configured as tools.
*
* Individual tools are customized and then registered with a {@link OO.ui.ToolFactory tool factory}, which creates
* the tools on demand. Each tool has a symbolic name (used when registering the tool), a title (e.g., Insert
* image), and an icon.
* Individual tools are customized and then registered with a
* {@link OO.ui.ToolFactory tool factory}, which creates the tools on demand. Each tool has a
* symbolic name (used when registering the tool), a title (e.g., Insert image), and an icon.
*
* Individual tools are organized in {@link OO.ui.ToolGroup toolgroups}, which can be {@link OO.ui.MenuToolGroup menus}
* of tools, {@link OO.ui.ListToolGroup lists} of tools, or a single {@link OO.ui.BarToolGroup bar} of tools.
* The arrangement and order of the toolgroups is customized when the toolbar is set up. Tools can be presented in
* any order, but each can only appear once in the toolbar.
* Individual tools are organized in {@link OO.ui.ToolGroup toolgroups}, which can be
* {@link OO.ui.MenuToolGroup menus} of tools, {@link OO.ui.ListToolGroup lists} of tools, or a
* single {@link OO.ui.BarToolGroup bar} of tools. The arrangement and order of the toolgroups is
* customized when the toolbar is set up. Tools can be presented in any order, but each can only
* appear once in the toolbar.
*
* The toolbar can be synchronized with the state of the external "application", like a text
* editor's editing area, marking tools as active/inactive (e.g. a 'bold' tool would be shown as
@ -289,10 +290,11 @@
* @param {OO.ui.ToolFactory} toolFactory Factory for creating tools
* @param {OO.ui.ToolGroupFactory} toolGroupFactory Factory for creating toolgroups
* @param {Object} [config] Configuration options
* @cfg {boolean} [actions] Add an actions section to the toolbar. Actions are commands that are included
* in the toolbar, but are not configured as tools. By default, actions are displayed on the right side of
* the toolbar.
* @cfg {string} [position='top'] Whether the toolbar is positioned above ('top') or below ('bottom') content.
* @cfg {boolean} [actions] Add an actions section to the toolbar. Actions are commands that are
* included in the toolbar, but are not configured as tools. By default, actions are displayed on
* the right side of the toolbar.
* @cfg {string} [position='top'] Whether the toolbar is positioned above ('top') or below
* ('bottom') content.
* @cfg {jQuery} [$overlay] An overlay for the popup.
* See <https://www.mediawiki.org/wiki/OOUI/Concepts#Overlays>.
*/
@ -327,7 +329,8 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
this.initialized = false;
this.narrowThreshold = null;
this.onWindowResizeHandler = this.onWindowResize.bind( this );
this.$overlay = ( config.$overlay === true ? OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
this.$overlay = ( config.$overlay === true ? OO.ui.getDefaultOverlay() : config.$overlay ) ||
this.$element;
// Events
this.$element
@ -344,7 +347,9 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
.addClass( 'oo-ui-toolbar-bar' )
.append( this.$group, '<div style="clear:both"></div>' );
// Possible classes: oo-ui-toolbar-position-top, oo-ui-toolbar-position-bottom
this.$element.addClass( 'oo-ui-toolbar oo-ui-toolbar-position-' + this.position ).append( this.$bar );
this.$element
.addClass( 'oo-ui-toolbar oo-ui-toolbar-position-' + this.position )
.append( this.$bar );
this.$overlay.append( this.$popups );
};
@ -359,9 +364,9 @@ OO.mixinClass( OO.ui.Toolbar, OO.ui.mixin.GroupElement );
/**
* @event updateState
*
* An 'updateState' event must be emitted on the Toolbar (by calling `toolbar.emit( 'updateState' )`)
* every time the state of the application using the toolbar changes, and an update to the state of
* tools is required.
* An 'updateState' event must be emitted on the Toolbar (by calling
* `toolbar.emit( 'updateState' )`) every time the state of the application using the toolbar
* changes, and an update to the state of tools is required.
*
* @param {...Mixed} data Application-defined parameters
*/
@ -405,7 +410,11 @@ OO.ui.Toolbar.prototype.getToolGroupFactory = function () {
OO.ui.Toolbar.prototype.onPointerDown = function ( e ) {
var $closestWidgetToEvent = $( e.target ).closest( '.oo-ui-widget' ),
$closestWidgetToToolbar = this.$element.closest( '.oo-ui-widget' );
if ( !$closestWidgetToEvent.length || $closestWidgetToEvent[ 0 ] === $closestWidgetToToolbar[ 0 ] ) {
if (
!$closestWidgetToEvent.length ||
$closestWidgetToEvent[ 0 ] ===
$closestWidgetToToolbar[ 0 ]
) {
return false;
}
};
@ -453,9 +462,10 @@ OO.ui.Toolbar.prototype.initialize = function () {
* Set up the toolbar.
*
* The toolbar is set up with a list of toolgroup configurations that specify the type of
* toolgroup ({@link OO.ui.BarToolGroup bar}, {@link OO.ui.MenuToolGroup menu}, or {@link OO.ui.ListToolGroup list})
* to add and which tools to include, exclude, promote, or demote within that toolgroup. Please
* see {@link OO.ui.ToolGroup toolgroups} for more information about including tools in toolgroups.
* toolgroup ({@link OO.ui.BarToolGroup bar}, {@link OO.ui.MenuToolGroup menu}, or
* {@link OO.ui.ListToolGroup list}) to add and which tools to include, exclude, promote, or demote
* within that toolgroup. Please see {@link OO.ui.ToolGroup toolgroups} for more information about
* including tools in toolgroups.
*
* @param {Object.<string,Array>} groups List of toolgroup configurations
* @param {string} [groups.name] Symbolic name for this toolgroup
@ -486,7 +496,8 @@ OO.ui.Toolbar.prototype.setup = function ( groups ) {
}
}
// Check type has been registered
type = this.getToolGroupFactory().lookup( groupConfig.type ) ? groupConfig.type : defaultType;
type = this.getToolGroupFactory().lookup( groupConfig.type ) ?
groupConfig.type : defaultType;
toolGroup = this.getToolGroupFactory().create( type, this, groupConfig );
items.push( toolGroup );
if ( groupConfig.name ) {
@ -495,7 +506,9 @@ OO.ui.Toolbar.prototype.setup = function ( groups ) {
// Groups without name are deprecated
OO.ui.warnDeprecation( 'Toolgroups must have a \'name\' property' );
}
toolGroup.connect( this, { active: 'onToolGroupActive' } );
toolGroup.connect( this, {
active: 'onToolGroupActive'
} );
}
this.addItems( items );
};
@ -547,8 +560,8 @@ OO.ui.Toolbar.prototype.reset = function () {
/**
* Destroy the toolbar.
*
* Destroying the toolbar removes all event handlers and DOM elements that constitute the toolbar. Call
* this method whenever you are done using a toolbar.
* Destroying the toolbar removes all event handlers and DOM elements that constitute the toolbar.
* Call this method whenever you are done using a toolbar.
*/
OO.ui.Toolbar.prototype.destroy = function () {
$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
@ -590,8 +603,9 @@ OO.ui.Toolbar.prototype.releaseTool = function ( tool ) {
* Get accelerator label for tool.
*
* The OOUI library does not contain an accelerator system, but this is the hook for one. To
* use an accelerator system, subclass the toolbar and override this method, which is meant to return a label
* that describes the accelerator keys for the tool passed (by symbolic name) to the method.
* use an accelerator system, subclass the toolbar and override this method, which is meant to
* return a label that describes the accelerator keys for the tool passed (by symbolic name) to
* the method.
*
* @param {string} name Symbolic name of tool
* @return {string|undefined} Tool accelerator label if available
@ -601,10 +615,11 @@ OO.ui.Toolbar.prototype.getToolAccelerator = function () {
};
/**
* Tools, together with {@link OO.ui.ToolGroup toolgroups}, constitute {@link OO.ui.Toolbar toolbars}.
* Each tool is configured with a static name, title, and icon and is customized with the command to carry
* out when the tool is selected. Tools must also be registered with a {@link OO.ui.ToolFactory tool factory},
* which creates the tools on demand.
* Tools, together with {@link OO.ui.ToolGroup toolgroups}, constitute
* {@link OO.ui.Toolbar toolbars}.
* Each tool is configured with a static name, title, and icon and is customized with the command
* to carry out when the tool is selected. Tools must also be registered with a
* {@link OO.ui.ToolFactory tool factory}, which creates the tools on demand.
*
* Every Tool subclass must implement two methods:
*
@ -612,8 +627,9 @@ OO.ui.Toolbar.prototype.getToolAccelerator = function () {
* - {@link #onSelect}
*
* Tools are added to toolgroups ({@link OO.ui.ListToolGroup ListToolGroup},
* {@link OO.ui.BarToolGroup BarToolGroup}, or {@link OO.ui.MenuToolGroup MenuToolGroup}), which determine how
* the tool is displayed in the toolbar. See {@link OO.ui.Toolbar toolbars} for an example.
* {@link OO.ui.BarToolGroup BarToolGroup}, or {@link OO.ui.MenuToolGroup MenuToolGroup}), which
* determine how the tool is displayed in the toolbar. See {@link OO.ui.Toolbar toolbars} for an
* example.
*
* For more information, please see the [OOUI documentation on MediaWiki][1].
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
@ -628,16 +644,19 @@ OO.ui.Toolbar.prototype.getToolAccelerator = function () {
* @constructor
* @param {OO.ui.ToolGroup} toolGroup
* @param {Object} [config] Configuration options
* @cfg {string|Function} [title] Title text or a function that returns text. If this config is omitted, the value of
* the {@link #static-title static title} property is used.
* @cfg {string|Function} [title] Title text or a function that returns text. If this config is
* omitted, the value of the {@link #static-title static title} property is used.
*
* The title is used in different ways depending on the type of toolgroup that contains the tool. The
* title is used as a tooltip if the tool is part of a {@link OO.ui.BarToolGroup bar} toolgroup, or as the label text if the tool is
* part of a {@link OO.ui.ListToolGroup list} or {@link OO.ui.MenuToolGroup menu} toolgroup.
* The title is used in different ways depending on the type of toolgroup that contains the tool.
* The title is used as a tooltip if the tool is part of a {@link OO.ui.BarToolGroup bar}
* toolgroup, or as the label text if the tool is part of a {@link OO.ui.ListToolGroup list} or
* {@link OO.ui.MenuToolGroup menu} toolgroup.
*
* For bar toolgroups, a description of the accelerator key is appended to the title if an accelerator key
* is associated with an action by the same name as the tool and accelerator functionality has been added to the application.
* To add accelerator key functionality, you must subclass OO.ui.Toolbar and override the {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method.
* For bar toolgroups, a description of the accelerator key is appended to the title if an
* accelerator key is associated with an action by the same name as the tool and accelerator
* functionality has been added to the application.
* To add accelerator key functionality, you must subclass OO.ui.Toolbar and override the
* {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method.
*/
OO.ui.Tool = function OoUiTool( toolGroup, config ) {
// Allow passing positional parameters inside the config object
@ -668,10 +687,14 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
// Mixin constructors
OO.ui.mixin.IconElement.call( this, config );
OO.ui.mixin.FlaggedElement.call( this, config );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$link } ) );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, {
$tabIndexed: this.$link
} ) );
// Events
this.toolbar.connect( this, { updateState: 'onUpdateState' } );
this.toolbar.connect( this, {
updateState: 'onUpdateState'
} );
// Initialization
this.$title.addClass( 'oo-ui-tool-title' );
@ -690,7 +713,8 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
this.$element
.data( 'oo-ui-tool', this )
.addClass( 'oo-ui-tool' )
.addClass( 'oo-ui-tool-name-' + this.constructor.static.name.replace( /^([^/]+)\/([^/]+).*$/, '$1-$2' ) )
.addClass( 'oo-ui-tool-name-' +
this.constructor.static.name.replace( /^([^/]+)\/([^/]+).*$/, '$1-$2' ) )
.toggleClass( 'oo-ui-tool-with-label', this.constructor.static.displayBothIconAndLabel )
.append( this.$link );
this.setTitle( config.title || this.constructor.static.title );
@ -714,8 +738,8 @@ OO.ui.Tool.static.tagName = 'span';
/**
* Symbolic name of tool.
*
* The symbolic name is used internally to register the tool with a {@link OO.ui.ToolFactory ToolFactory}. It can
* also be used when adding tools to toolgroups.
* The symbolic name is used internally to register the tool with a
* {@link OO.ui.ToolFactory ToolFactory}. It can also be used when adding tools to toolgroups.
*
* @abstract
* @static
@ -738,7 +762,8 @@ OO.ui.Tool.static.name = '';
OO.ui.Tool.static.group = '';
/**
* Tool title text or a function that returns title text. The value of the static property is overridden if the #title config option is used.
* Tool title text or a function that returns title text. The value of the static property is
* overridden if the #title config option is used.
*
* @abstract
* @static
@ -921,17 +946,19 @@ OO.ui.Tool.prototype.destroy = function () {
};
/**
* ToolGroups are collections of {@link OO.ui.Tool tools} that are used in a {@link OO.ui.Toolbar toolbar}.
* The type of toolgroup ({@link OO.ui.ListToolGroup list}, {@link OO.ui.BarToolGroup bar}, or {@link OO.ui.MenuToolGroup menu})
* to which a tool belongs determines how the tool is arranged and displayed in the toolbar. Toolgroups
* themselves are created on demand with a {@link OO.ui.ToolGroupFactory toolgroup factory}.
* ToolGroups are collections of {@link OO.ui.Tool tools} that are used in a
* {@link OO.ui.Toolbar toolbar}.
* The type of toolgroup ({@link OO.ui.ListToolGroup list}, {@link OO.ui.BarToolGroup bar}, or
* {@link OO.ui.MenuToolGroup menu}) to which a tool belongs determines how the tool is arranged
* and displayed in the toolbar. Toolgroups themselves are created on demand with a
* {@link OO.ui.ToolGroupFactory toolgroup factory}.
*
* Toolgroups can contain individual tools, groups of tools, or all available tools, as specified
* using the `include` config option. See OO.ui.ToolFactory#extract on documentation of the format.
* The options `exclude`, `promote`, and `demote` support the same formats.
*
* See {@link OO.ui.Toolbar toolbars} for a full example. For more information about toolbars in general,
* please see the [OOUI documentation on MediaWiki][1].
* See {@link OO.ui.Toolbar toolbars} for a full example. For more information about toolbars in
* general, please see the [OOUI documentation on MediaWiki][1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -945,7 +972,8 @@ OO.ui.Tool.prototype.destroy = function () {
* @param {Object} [config] Configuration options
* @cfg {Array|string} [include] List of tools to include in the toolgroup, see above.
* @cfg {Array|string} [exclude] List of tools to exclude from the toolgroup, see above.
* @cfg {Array|string} [promote] List of tools to promote to the beginning of the toolgroup, see above.
* @cfg {Array|string} [promote] List of tools to promote to the beginning of the toolgroup,
* see above.
* @cfg {Array|string} [demote] List of tools to demote to the end of the toolgroup, see above.
* This setting is particularly useful when tools have been added to the toolgroup
* en masse (e.g., via the catch-all selector).
@ -988,8 +1016,12 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
mouseover: this.onMouseOverFocus.bind( this ),
mouseout: this.onMouseOutBlur.bind( this )
} );
this.toolbar.getToolFactory().connect( this, { register: 'onToolFactoryRegister' } );
this.aggregate( { disable: 'itemDisable' } );
this.toolbar.getToolFactory().connect( this, {
register: 'onToolFactoryRegister'
} );
this.aggregate( {
disable: 'itemDisable'
} );
this.connect( this, {
itemDisable: 'updateDisabled',
disable: 'onDisable'
@ -1040,7 +1072,8 @@ OO.ui.ToolGroup.static.titleTooltips = false;
* Note: The OOUI library does not include an accelerator system, but does contain
* a hook for one. To use an accelerator system, subclass the {@link OO.ui.Toolbar toolbar} and
* override the {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method, which is
* meant to return a label that describes the accelerator keys for a given tool (e.g., 'Ctrl + M').
* meant to return a label that describes the accelerator keys for a given tool (e.g., Control+M
* key combination).
*
* @static
* @inheritable
@ -1071,7 +1104,8 @@ OO.ui.ToolGroup.static.name = null;
* @inheritdoc
*/
OO.ui.ToolGroup.prototype.isDisabled = function () {
return this.autoDisabled || OO.ui.ToolGroup.parent.prototype.isDisabled.apply( this, arguments );
return this.autoDisabled ||
OO.ui.ToolGroup.parent.prototype.isDisabled.apply( this, arguments );
};
/**
@ -1113,14 +1147,25 @@ OO.ui.ToolGroup.prototype.onDisable = function ( isDisabled ) {
*/
OO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {
if (
!this.isDisabled() &&
( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )
!this.isDisabled() && (
e.which === OO.ui.MouseButtons.LEFT ||
e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.ENTER
)
) {
this.pressed = this.findTargetTool( e );
if ( this.pressed ) {
this.pressed.setActive( true );
this.getElementDocument().addEventListener( 'mouseup', this.onDocumentMouseKeyUpHandler, true );
this.getElementDocument().addEventListener( 'keyup', this.onDocumentMouseKeyUpHandler, true );
this.getElementDocument().addEventListener(
'mouseup',
this.onDocumentMouseKeyUpHandler,
true
);
this.getElementDocument().addEventListener(
'keyup',
this.onDocumentMouseKeyUpHandler,
true
);
return false;
}
}
@ -1133,8 +1178,16 @@ OO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {
* @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
*/
OO.ui.ToolGroup.prototype.onDocumentMouseKeyUp = function ( e ) {
this.getElementDocument().removeEventListener( 'mouseup', this.onDocumentMouseKeyUpHandler, true );
this.getElementDocument().removeEventListener( 'keyup', this.onDocumentMouseKeyUpHandler, true );
this.getElementDocument().removeEventListener(
'mouseup',
this.onDocumentMouseKeyUpHandler,
true
);
this.getElementDocument().removeEventListener(
'keyup',
this.onDocumentMouseKeyUpHandler,
true
);
// onMouseKeyUp may be called a second time, depending on where the mouse is when the button is
// released, but since `this.pressed` will no longer be true, the second call will be ignored.
this.onMouseKeyUp( e );
@ -1156,8 +1209,11 @@ OO.ui.ToolGroup.prototype.onMouseKeyUp = function ( e ) {
var tool = this.findTargetTool( e );
if (
!this.isDisabled() && this.pressed && this.pressed === tool &&
( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )
!this.isDisabled() && this.pressed && this.pressed === tool && (
e.which === OO.ui.MouseButtons.LEFT ||
e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.ENTER
)
) {
this.pressed.onSelect();
this.pressed = null;
@ -1263,8 +1319,9 @@ OO.ui.ToolGroup.prototype.populate = function () {
// Tool is available or is already in this group
( this.toolbar.isToolAvailable( name ) || this.tools[ name ] )
) {
// Hack to prevent infinite recursion via ToolGroupTool. We need to reserve the tool before
// creating it, but we can't call reserveTool() yet because we haven't created the tool.
// Hack to prevent infinite recursion via ToolGroupTool. We need to reserve the tool
// before creating it, but we can't call reserveTool() yet because we haven't created
// the tool.
this.toolbar.tools[ name ] = true;
tool = this.tools[ name ];
if ( !tool ) {
@ -1318,11 +1375,13 @@ OO.ui.ToolGroup.prototype.destroy = function () {
};
/**
* A ToolFactory creates tools on demand. All tools ({@link OO.ui.Tool Tools}, {@link OO.ui.PopupTool PopupTools},
* and {@link OO.ui.ToolGroupTool ToolGroupTools}) must be registered with a tool factory. Tools are
* registered by their symbolic name. See {@link OO.ui.Toolbar toolbars} for an example.
* A ToolFactory creates tools on demand. All tools ({@link OO.ui.Tool Tools},
* {@link OO.ui.PopupTool PopupTools}, and {@link OO.ui.ToolGroupTool ToolGroupTools}) must be
* registered with a tool factory. Tools are registered by their symbolic name. See
* {@link OO.ui.Toolbar toolbars} for an example.
*
* For more information about toolbars in general, please see the [OOUI documentation on MediaWiki][1].
* For more information about toolbars in general, please see the
* [OOUI documentation on MediaWiki][1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -1342,7 +1401,7 @@ OO.inheritClass( OO.ui.ToolFactory, OO.Factory );
/* Methods */
/**
* Get tools from the factory
* Get tools from the factory.
*
* @param {Array|string} [include] Included tools, see #extract for format
* @param {Array|string} [exclude] Excluded tools, see #extract for format
@ -1454,9 +1513,9 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
};
/**
* ToolGroupFactories create {@link OO.ui.ToolGroup toolgroups} on demand. The toolgroup classes must
* specify a symbolic name and be registered with the factory. The following classes are registered by
* default:
* ToolGroupFactories create {@link OO.ui.ToolGroup toolgroups} on demand. The toolgroup classes
* must specify a symbolic name and be registered with the factory. The following classes are
* registered by default:
*
* - {@link OO.ui.BarToolGroup BarToolGroups} (bar)
* - {@link OO.ui.MenuToolGroup MenuToolGroups} (menu)
@ -1464,7 +1523,8 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
*
* See {@link OO.ui.Toolbar toolbars} for an example.
*
* For more information about toolbars in general, please see the [OOUI documentation on MediaWiki][1].
* For more information about toolbars in general, please see the
* [OOUI documentation on MediaWiki][1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -1505,9 +1565,10 @@ OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
};
/**
* Popup tools open a popup window when they are selected from the {@link OO.ui.Toolbar toolbar}. Each popup tool is configured
* with a static name, title, and icon, as well with as any popup configurations. Unlike other tools, popup tools do not require that developers specify
* an #onSelect or #onUpdateState method, as these methods have been implemented already.
* Popup tools open a popup window when they are selected from the {@link OO.ui.Toolbar toolbar}.
* Each popup tool is configured with a static name, title, and icon, as well with as any popup
* configurations. Unlike other tools, popup tools do not require that developers specify an
* #onSelect or #onUpdateState method, as these methods have been implemented already.
*
* // Example of a popup tool. When selected, a popup tool displays
* // a popup window.
@ -1525,8 +1586,9 @@ OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
* HelpTool.static.title = 'Help';
* toolFactory.register( HelpTool );
*
* For an example of a toolbar that contains a popup tool, see {@link OO.ui.Toolbar toolbars}. For more information about
* toolbars in general, please see the [OOUI documentation on MediaWiki][1].
* For an example of a toolbar that contains a popup tool, see {@link OO.ui.Toolbar toolbars}.
* For more information about toolbars in general, please see the
* [OOUI documentation on MediaWiki][1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -1553,7 +1615,9 @@ OO.ui.PopupTool = function OoUiPopupTool( toolGroup, config ) {
OO.ui.mixin.PopupElement.call( this, config );
// Events
this.popup.connect( this, { toggle: 'onPopupToggle' } );
this.popup.connect( this, {
toggle: 'onPopupToggle'
} );
// Initialization
this.popup.setAutoFlip( false );
@ -1607,7 +1671,8 @@ OO.ui.PopupTool.prototype.onPopupToggle = function ( isVisible ) {
* the bar item. Included tools will be displayed in a dropdown {@link OO.ui.ListToolGroup list}
* when the ToolGroupTool is selected.
*
* // Example: ToolGroupTool with two nested tools, 'setting1' and 'setting2', defined elsewhere.
* // Example: ToolGroupTool with two nested tools, 'setting1' and 'setting2',
* // defined elsewhere.
*
* function SettingsTool() {
* SettingsTool.parent.apply( this, arguments );
@ -1715,8 +1780,8 @@ OO.ui.ToolGroupTool.prototype.onUpdateState = function () {
/**
* Build a {@link OO.ui.ToolGroup toolgroup} from the specified configuration.
*
* @param {Object.<string,Array>} group Toolgroup configuration. Please see {@link OO.ui.ToolGroup toolgroup} for
* more information.
* @param {Object.<string,Array>} group Toolgroup configuration. Please see
* {@link OO.ui.ToolGroup toolgroup} for more information.
* @return {OO.ui.ListToolGroup}
*/
OO.ui.ToolGroupTool.prototype.createGroup = function ( group ) {
@ -1732,13 +1797,13 @@ OO.ui.ToolGroupTool.prototype.createGroup = function ( group ) {
/**
* BarToolGroups are one of three types of {@link OO.ui.ToolGroup toolgroups} that are used to
* create {@link OO.ui.Toolbar toolbars} (the other types of groups are {@link OO.ui.MenuToolGroup MenuToolGroup}
* and {@link OO.ui.ListToolGroup ListToolGroup}). The {@link OO.ui.Tool tools} in a BarToolGroup are
* displayed by icon in a single row. The title of the tool is displayed when users move the mouse over
* the tool.
* create {@link OO.ui.Toolbar toolbars} (the other types of groups are
* {@link OO.ui.MenuToolGroup MenuToolGroup} and {@link OO.ui.ListToolGroup ListToolGroup}).
* The {@link OO.ui.Tool tools} in a BarToolGroup are displayed by icon in a single row. The
* title of the tool is displayed when users move the mouse over the tool.
*
* BarToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the toolbar is
* set up.
* BarToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the toolbar
* is set up.
*
* @example
* // Example of a BarToolGroup with two tools
@ -1816,8 +1881,10 @@ OO.ui.ToolGroupTool.prototype.createGroup = function ( group ) {
* // document.
* toolbar.initialize();
*
* For more information about how to add tools to a bar tool group, please see {@link OO.ui.ToolGroup toolgroup}.
* For more information about toolbars in general, please see the [OOUI documentation on MediaWiki][1].
* For more information about how to add tools to a bar tool group, please see
* {@link OO.ui.ToolGroup toolgroup}.
* For more information about toolbars in general, please see the
* [OOUI documentation on MediaWiki][1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -1869,8 +1936,9 @@ OO.ui.BarToolGroup.static.name = 'bar';
/**
* PopupToolGroup is an abstract base class used by both {@link OO.ui.MenuToolGroup MenuToolGroup}
* and {@link OO.ui.ListToolGroup ListToolGroup} to provide a popup (an overlaid menu or list of tools with an
* optional icon and label). This class can be used for other base classes that also use this functionality.
* and {@link OO.ui.ListToolGroup ListToolGroup} to provide a popup (an overlaid menu or list of
* tools with an optional icon and label). This class can be used for other base classes that
* also use this functionality.
*
* @abstract
* @class
@ -1898,7 +1966,8 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
// Configuration initialization
config = $.extend( {
indicator: config.indicator === undefined ? ( toolbar.position === 'bottom' ? 'up' : 'down' ) : config.indicator
indicator: config.indicator === undefined ?
( toolbar.position === 'bottom' ? 'up' : 'down' ) : config.indicator
}, config );
// Parent constructor
@ -1917,14 +1986,18 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
OO.ui.mixin.LabelElement.call( this, config );
OO.ui.mixin.TitledElement.call( this, config );
OO.ui.mixin.FlaggedElement.call( this, config );
OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, {
$clippable: this.$group
} ) );
OO.ui.mixin.FloatableElement.call( this, $.extend( {}, config, {
$floatable: this.$group,
$floatableContainer: this.$handle,
hideWhenOutOfView: false,
verticalPosition: this.toolbar.position === 'bottom' ? 'above' : 'below'
} ) );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, {
$tabIndexed: this.$handle
} ) );
// Events
this.$handle.on( {
@ -2012,8 +2085,11 @@ OO.ui.PopupToolGroup.prototype.onBlur = function () {
OO.ui.PopupToolGroup.prototype.onMouseKeyUp = function ( e ) {
// Only close toolgroup when a tool was actually selected
if (
!this.isDisabled() && this.pressed && this.pressed === this.findTargetTool( e ) &&
( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )
!this.isDisabled() && this.pressed && this.pressed === this.findTargetTool( e ) && (
e.which === OO.ui.MouseButtons.LEFT ||
e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.ENTER
)
) {
this.setActive( false );
}
@ -2028,7 +2104,8 @@ OO.ui.PopupToolGroup.prototype.onMouseKeyDown = function ( e ) {
// Shift-Tab on the first tool in the group jumps to the handle.
// Tab on the last tool in the group jumps to the next group.
if ( !this.isDisabled() && e.which === OO.ui.Keys.TAB ) {
// (We can't use this.items because ListToolGroup inserts the extra fake expand/collapse tool.)
// We can't use this.items because ListToolGroup inserts the extra fake
// expand/collapse tool.
$focused = $( document.activeElement );
$firstFocusable = OO.ui.findFocusable( this.$group );
if ( $focused[ 0 ] === $firstFocusable[ 0 ] && e.shiftKey ) {
@ -2037,7 +2114,8 @@ OO.ui.PopupToolGroup.prototype.onMouseKeyDown = function ( e ) {
}
$lastFocusable = OO.ui.findFocusable( this.$group, true );
if ( $focused[ 0 ] === $lastFocusable[ 0 ] && !e.shiftKey ) {
// Focus this group's handle and let the browser's tab handling happen (no 'return false').
// Focus this group's handle and let the browser's tab handling happen
// (no 'return false').
// This way we don't have to fiddle with other ToolGroups' business, or worry what to do
// if the next group is not a PopupToolGroup or doesn't exist at all.
this.$handle.trigger( 'focus' );
@ -2057,8 +2135,11 @@ OO.ui.PopupToolGroup.prototype.onMouseKeyDown = function ( e ) {
*/
OO.ui.PopupToolGroup.prototype.onHandleMouseKeyUp = function ( e ) {
if (
!this.isDisabled() &&
( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )
!this.isDisabled() && (
e.which === OO.ui.MouseButtons.LEFT ||
e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.ENTER
)
) {
return false;
}
@ -2082,7 +2163,11 @@ OO.ui.PopupToolGroup.prototype.onHandleMouseKeyDown = function ( e ) {
return false;
}
}
if ( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) {
if (
e.which === OO.ui.MouseButtons.LEFT ||
e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.ENTER
) {
this.setActive( !this.active );
return false;
}
@ -2113,8 +2198,16 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
if ( this.active !== value ) {
this.active = value;
if ( value ) {
this.getElementDocument().addEventListener( 'mouseup', this.onPopupDocumentMouseKeyUpHandler, true );
this.getElementDocument().addEventListener( 'keyup', this.onPopupDocumentMouseKeyUpHandler, true );
this.getElementDocument().addEventListener(
'mouseup',
this.onPopupDocumentMouseKeyUpHandler,
true
);
this.getElementDocument().addEventListener(
'keyup',
this.onPopupDocumentMouseKeyUpHandler,
true
);
this.$clippable.css( 'left', '' );
this.$element.addClass( 'oo-ui-popupToolGroup-active' );
@ -2126,13 +2219,16 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
this.setHorizontalPosition( 'start' );
if ( this.isClippedHorizontally() || this.isFloatableOutOfView() ) {
// Anchoring to the left caused the popup to clip, so anchor it to the right instead
// Anchoring to the left caused the popup to clip, so anchor it to the
// right instead.
this.setHorizontalPosition( 'end' );
}
if ( this.isClippedHorizontally() || this.isFloatableOutOfView() ) {
// Anchoring to the right also caused the popup to clip, so just make it fill the container
// Anchoring to the right also caused the popup to clip, so just make it fill the
// container.
containerWidth = this.$clippableScrollableContainer.width();
containerLeft = this.$clippableScrollableContainer[ 0 ] === document.documentElement ?
containerLeft = this.$clippableScrollableContainer[ 0 ] ===
document.documentElement ?
0 :
this.$clippableScrollableContainer.offset().left;
@ -2145,8 +2241,16 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
} );
}
} else {
this.getElementDocument().removeEventListener( 'mouseup', this.onPopupDocumentMouseKeyUpHandler, true );
this.getElementDocument().removeEventListener( 'keyup', this.onPopupDocumentMouseKeyUpHandler, true );
this.getElementDocument().removeEventListener(
'mouseup',
this.onPopupDocumentMouseKeyUpHandler,
true
);
this.getElementDocument().removeEventListener(
'keyup',
this.onPopupDocumentMouseKeyUpHandler,
true
);
this.$element.removeClass( 'oo-ui-popupToolGroup-active' );
this.$group.removeClass( 'oo-ui-popupToolGroup-active-tools' );
this.togglePositioning( false );
@ -2159,18 +2263,20 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
/**
* ListToolGroups are one of three types of {@link OO.ui.ToolGroup toolgroups} that are used to
* create {@link OO.ui.Toolbar toolbars} (the other types of groups are {@link OO.ui.MenuToolGroup MenuToolGroup}
* and {@link OO.ui.BarToolGroup BarToolGroup}). The {@link OO.ui.Tool tools} in a ListToolGroup are displayed
* by label in a dropdown menu. The title of the tool is used as the label text. The menu itself can be configured
* with a label, icon, indicator, header, and title.
* create {@link OO.ui.Toolbar toolbars} (the other types of groups are
* {@link OO.ui.MenuToolGroup MenuToolGroup} and {@link OO.ui.BarToolGroup BarToolGroup}).
* The {@link OO.ui.Tool tools} in a ListToolGroup are displayed by label in a dropdown menu.
* The title of the tool is used as the label text. The menu itself can be configured with a label,
* icon, indicator, header, and title.
*
* ListToolGroups can be configured to be expanded and collapsed. Collapsed lists will have a More option that
* users can select to see the full list of tools. If a collapsed toolgroup is expanded, a Fewer option permits
* users to collapse the list again.
* ListToolGroups can be configured to be expanded and collapsed. Collapsed lists will have a
* More option that users can select to see the full list of tools. If a collapsed toolgroup is
* expanded, a Fewer option permits users to collapse the list again.
*
* ListToolGroups are created by a {@link OO.ui.ToolGroupFactory toolgroup factory} when the toolbar is set up. The factory
* requires the ListToolGroup's symbolic name, 'list', which is specified along with the other configurations. For more
* information about how to add tools to a ListToolGroup, please see {@link OO.ui.ToolGroup toolgroup}.
* ListToolGroups are created by a {@link OO.ui.ToolGroupFactory toolgroup factory} when the
* toolbar is set up. The factory requires the ListToolGroup's symbolic name, 'list', which is
* specified along with the other configurations. For more information about how to add tools to a
* ListToolGroup, please see {@link OO.ui.ToolGroup toolgroup}.
*
* @example
* // Example of a ListToolGroup
@ -2210,7 +2316,8 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
* type: 'list',
* label: 'ListToolGroup',
* icon: 'ellipsis',
* title: 'This is the title, displayed when user moves the mouse over the list toolgroup',
* title: 'This is the title, displayed when user moves the mouse over the list ' +
* 'toolgroup',
* header: 'This is the header',
* include: [ 'settings', 'stuff' ],
* allowCollapse: ['stuff']
@ -2229,7 +2336,8 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
* // Build the toolbar. This must be done after the toolbar has been appended to the document.
* toolbar.initialize();
*
* For more information about toolbars in general, please see the [OOUI documentation on MediaWiki][1].
* For more information about toolbars in general, please see the
* [OOUI documentation on MediaWiki][1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -2239,16 +2347,19 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
* @constructor
* @param {OO.ui.Toolbar} toolbar
* @param {Object} [config] Configuration options
* @cfg {Array} [allowCollapse] Allow the specified tools to be collapsed. By default, collapsible tools
* will only be displayed if users click the More option displayed at the bottom of the list. If
* the list is expanded, a Fewer option permits users to collapse the list again. Any tools that
* are included in the toolgroup, but are not designated as collapsible, will always be displayed.
* @cfg {Array} [allowCollapse] Allow the specified tools to be collapsed. By default, collapsible
* tools will only be displayed if users click the More option displayed at the bottom of the
* list. If the list is expanded, a Fewer option permits users to collapse the list again.
* Any tools that are included in the toolgroup, but are not designated as collapsible, will always
* be displayed.
* To open a collapsible list in its expanded state, set #expanded to 'true'.
* @cfg {Array} [forceExpand] Expand the specified tools. All other tools will be designated as collapsible.
* Unless #expanded is set to true, the collapsible tools will be collapsed when the list is first opened.
* @cfg {boolean} [expanded=false] Expand collapsible tools. This config is only relevant if tools have
* been designated as collapsible. When expanded is set to true, all tools in the group will be displayed
* when the list is first opened. Users can collapse the list with a Fewer option at the bottom.
* @cfg {Array} [forceExpand] Expand the specified tools. All other tools will be designated as
* collapsible. Unless #expanded is set to true, the collapsible tools will be collapsed when the
* list is first opened.
* @cfg {boolean} [expanded=false] Expand collapsible tools. This config is only relevant if tools
* have been designated as collapsible. When expanded is set to true, all tools in the group will
* be displayed when the list is first opened. Users can collapse the list with a Fewer option at
* the bottom.
*/
OO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) {
// Allow passing positional parameters inside the config object
@ -2353,11 +2464,15 @@ OO.ui.ListToolGroup.prototype.getExpandCollapseTool = function () {
OO.ui.ListToolGroup.prototype.onMouseKeyUp = function ( e ) {
// Do not close the popup when the user wants to show more/fewer tools
if (
$( e.target ).closest( '.oo-ui-tool-name-more-fewer' ).length &&
( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )
$( e.target ).closest( '.oo-ui-tool-name-more-fewer' ).length && (
e.which === OO.ui.MouseButtons.LEFT ||
e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.ENTER
)
) {
// HACK: Prevent the popup list from being hidden. Skip the PopupToolGroup implementation (which
// hides the popup list when a tool is selected) and call ToolGroup's implementation directly.
// HACK: Prevent the popup list from being hidden. Skip the PopupToolGroup implementation
// (which hides the popup list when a tool is selected) and call ToolGroup's implementation
// directly.
return OO.ui.ListToolGroup.parent.parent.prototype.onMouseKeyUp.call( this, e );
} else {
return OO.ui.ListToolGroup.parent.prototype.onMouseKeyUp.call( this, e );
@ -2387,14 +2502,15 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
/**
* MenuToolGroups are one of three types of {@link OO.ui.ToolGroup toolgroups} that are used to
* create {@link OO.ui.Toolbar toolbars} (the other types of groups are {@link OO.ui.BarToolGroup BarToolGroup}
* and {@link OO.ui.ListToolGroup ListToolGroup}). MenuToolGroups contain selectable {@link OO.ui.Tool tools},
* which are displayed by label in a dropdown menu. The tool's title is used as the label text, and the
* menu label is updated to reflect which tool or tools are currently selected. If no tools are selected,
* the menu label is empty. The menu can be configured with an indicator, icon, title, and/or header.
* create {@link OO.ui.Toolbar toolbars} (the other types of groups are
* {@link OO.ui.BarToolGroup BarToolGroup} and {@link OO.ui.ListToolGroup ListToolGroup}).
* MenuToolGroups contain selectable {@link OO.ui.Tool tools}, which are displayed by label in a
* dropdown menu. The tool's title is used as the label text, and the menu label is updated to
* reflect which tool or tools are currently selected. If no tools are selected, the menu label
* is empty. The menu can be configured with an indicator, icon, title, and/or header.
*
* MenuToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the toolbar
* is set up.
* MenuToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the
* toolbar is set up.
*
* @example
* // Example of a MenuToolGroup
@ -2403,7 +2519,8 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
* var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );
*
* // We will be placing status text in this element when tools are used
* var $area = $( '<p>' ).text( 'An example of a MenuToolGroup. Select a tool from the dropdown menu.' );
* var $area = $( '<p>' ).text( 'An example of a MenuToolGroup. Select a tool from the '
* + 'dropdown menu.' );
*
* // Define the tools that we're going to place in our toolbar
*
@ -2476,8 +2593,10 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
* toolbar.initialize();
* toolbar.emit( 'updateState' );
*
* For more information about how to add tools to a MenuToolGroup, please see {@link OO.ui.ToolGroup toolgroup}.
* For more information about toolbars in general, please see the [OOUI documentation on MediaWiki] [1].
* For more information about how to add tools to a MenuToolGroup, please see
* {@link OO.ui.ToolGroup toolgroup}.
* For more information about toolbars in general, please see the
* [OOUI documentation on MediaWiki] [1].
*
* [1]: https://www.mediawiki.org/wiki/OOUI/Toolbars
*
@ -2502,7 +2621,9 @@ OO.ui.MenuToolGroup = function OoUiMenuToolGroup( toolbar, config ) {
OO.ui.MenuToolGroup.parent.call( this, toolbar, config );
// Events
this.toolbar.connect( this, { updateState: 'onUpdateState' } );
this.toolbar.connect( this, {
updateState: 'onUpdateState'
} );
// Initialization
this.$element.addClass( 'oo-ui-menuToolGroup' );

File diff suppressed because one or more lines are too long

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
cursor: move;
@ -688,7 +688,7 @@
.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 {
.oo-ui-selectWidget-unpressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
background-color: #a7dcff;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
}
@ -936,17 +936,17 @@
background-image: -moz-linear-gradient(top, #fafafa 0, #ddd 100%);
background-image: linear-gradient(to bottom, #fafafa 0, #ddd 100%);
color: #333;
width: auto;
max-width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
height: 1.7em;
width: auto;
max-width: 100%;
height: 1.71875em;
margin: 0.1em;
border: 1px solid #ccc;
border-radius: 3px;
padding: 0 0.4em;
line-height: 1.7em;
line-height: 1.640625em;
vertical-align: middle;
}
.oo-ui-tagItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
cursor: move;
@ -1018,7 +1018,7 @@
border: 1px solid #a2a9b1;
border-radius: 1.57142857em;
padding: 0 0.57142857em;
line-height: 1.57142857em;
line-height: 1.42857143em;
vertical-align: middle;
}
.oo-ui-tagItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:07Z
* Date: 2019-03-07T09:14:18Z
*/
( function ( OO ) {
@ -23,7 +23,8 @@
*
* @constructor
* @param {Object} [config] Configuration options
* @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element
* @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to
* the whole element
* @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable
* but the draggable state should be called from the DraggableGroupElement, which updates
* the whole group
@ -58,7 +59,8 @@ OO.initClass( OO.ui.mixin.DraggableElement );
* @event dragstart
*
* A dragstart event is emitted when the user clicks and begins dragging an item.
* @param {OO.ui.mixin.DraggableElement} item The item the user has clicked and is dragging with the mouse.
* @param {OO.ui.mixin.DraggableElement} item The item the user has clicked and is dragging with
* the mouse.
*/
/**
@ -105,7 +107,7 @@ OO.ui.mixin.DraggableElement.prototype.toggleDraggable = function ( isDraggable
};
/**
* Check the draggable state of this widget
* Check the draggable state of this widget.
*
* @return {boolean} Widget supports draggable operations
*/
@ -207,7 +209,7 @@ OO.ui.mixin.DraggableElement.prototype.onDragOver = function ( e ) {
/**
* Set item index.
* Store it in the DOM so we can access from the widget drag event
* Store it in the DOM so we can access from the widget drag event.
*
* @private
* @param {number} index Item index
@ -220,7 +222,7 @@ OO.ui.mixin.DraggableElement.prototype.setIndex = function ( index ) {
};
/**
* Get item index
* Get item index.
*
* @private
* @return {number} Item index
@ -477,15 +479,16 @@ OO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {
/**
* Get the item that is currently being dragged.
*
* @return {OO.ui.mixin.DraggableElement|null} The currently dragged item, or `null` if no item is being dragged
* @return {OO.ui.mixin.DraggableElement|null} The currently dragged item, or `null` if no item is
* being dragged
*/
OO.ui.mixin.DraggableGroupElement.prototype.getDragItem = function () {
return this.dragItem;
};
/**
* RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget, such as
* the {@link OO.ui.mixin.LookupElement}.
* RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget,
* such as the {@link OO.ui.mixin.LookupElement}.
*
* @class
* @abstract
@ -505,9 +508,9 @@ OO.initClass( OO.ui.mixin.RequestManager );
/**
* Get request results for the current query.
*
* @return {jQuery.Promise} Promise object which will be passed response data as the first argument of
* the done event. If the request was aborted to make way for a subsequent request, this promise
* may not be rejected, depending on what jQuery feels like doing.
* @return {jQuery.Promise} Promise object which will be passed response data as the first argument
* of the done event. If the request was aborted to make way for a subsequent request, this
* promise may not be rejected, depending on what jQuery feels like doing.
*/
OO.ui.mixin.RequestManager.prototype.getRequestData = function () {
var widget = this,
@ -542,7 +545,8 @@ OO.ui.mixin.RequestManager.prototype.getRequestData = function () {
if ( ourRequest === widget.requestRequest ) {
widget.requestQuery = null;
widget.requestRequest = null;
widget.requestCache[ value ] = widget.getRequestCacheDataFromResponse( response );
widget.requestCache[ value ] =
widget.getRequestCacheDataFromResponse( response );
deferred.resolve( widget.requestCache[ value ] );
}
} )
@ -610,14 +614,15 @@ OO.ui.mixin.RequestManager.prototype.getRequest = null;
OO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;
/**
* LookupElement is a mixin that creates a {@link OO.ui.MenuSelectWidget menu} of suggested values for
* a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on the characters the user types
* into the text input field and, in general, the menu is only displayed when the user types. If a suggested value is chosen
* from the lookup menu, that value becomes the value of the input field.
* LookupElement is a mixin that creates a {@link OO.ui.MenuSelectWidget menu} of suggested
* values for a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on
* the characters the user types into the text input field and, in general, the menu is only
* displayed when the user types. If a suggested value is chosen from the lookup menu, that value
* becomes the value of the input field.
*
* Note that a new menu of suggested items is displayed when a value is chosen from the lookup menu. If this is
* not the desired behavior, disable lookup menus with the #setLookupsDisabled method, then set the value, then
* re-enable lookups.
* Note that a new menu of suggested items is displayed when a value is chosen from the
* lookup menu. If this is not the desired behavior, disable lookup menus with the
* #setLookupsDisabled method, then set the value, then re-enable lookups.
*
* See the [OOUI demos][1] for an example.
*
@ -631,12 +636,16 @@ OO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;
* @param {Object} [config] Configuration options
* @cfg {jQuery} [$overlay] Overlay for the lookup menu; defaults to relative positioning.
* See <https://www.mediawiki.org/wiki/OOUI/Concepts#Overlays>.
* @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered beneath the specified element.
* @cfg {Object} [menu] Configuration options to pass to {@link OO.ui.MenuSelectWidget menu select widget}
* @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the text input is empty.
* @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered
* beneath the specified element.
* @cfg {Object} [menu] Configuration options to pass to
* {@link OO.ui.MenuSelectWidget menu select widget}
* @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the
* text input is empty.
* By default, the lookup menu is not generated and displayed until the user begins to type.
* @cfg {boolean} [highlightFirst=true] Whether the first lookup result should be highlighted (so, that the user can
* take it over into the input with simply pressing return) automatically or not.
* @cfg {boolean} [highlightFirst=true] Whether the first lookup result should be highlighted
* (so, that the user can take it over into the input with simply pressing return) automatically
* or not.
*/
OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
// Configuration initialization
@ -646,7 +655,8 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
OO.ui.mixin.RequestManager.call( this, config );
// Properties
this.$overlay = ( config.$overlay === true ? OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
this.$overlay = ( config.$overlay === true ?
OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
this.lookupMenu = new OO.ui.MenuSelectWidget( $.extend( {
widget: this,
input: this,
@ -665,7 +675,9 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
blur: this.onLookupInputBlur.bind( this ),
mousedown: this.onLookupInputMouseDown.bind( this )
} );
this.connect( this, { change: 'onLookupInputChange' } );
this.connect( this, {
change: 'onLookupInputChange'
} );
this.lookupMenu.connect( this, {
toggle: 'onLookupMenuToggle',
choose: 'onLookupMenuItemChoose'
@ -718,7 +730,7 @@ OO.ui.mixin.LookupElement.prototype.onLookupInputBlur = function () {
*/
OO.ui.mixin.LookupElement.prototype.onLookupInputMouseDown = function () {
// Only open the menu if the input was already focused.
// This way we allow the user to open the menu again after closing it with Esc
// This way we allow the user to open the menu again after closing it with Escape (esc)
// by clicking in the input. Opening (and populating) the menu when initially
// clicking into the input is handled by the focus handler.
if ( this.lookupInputFocused && !this.lookupMenu.isVisible() ) {
@ -748,7 +760,7 @@ OO.ui.mixin.LookupElement.prototype.onLookupMenuToggle = function ( visible ) {
if ( !visible ) {
// When the menu is hidden, abort any active request and clear the menu.
// This has to be done here in addition to closeLookupMenu(), because
// MenuSelectWidget will close itself when the user presses Esc.
// MenuSelectWidget will close itself when the user presses Escape (esc).
this.abortLookupRequest();
this.lookupMenu.clearItems();
}
@ -942,7 +954,7 @@ OO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {
// Note: Calling #setReadOnly this way assumes this is mixed into an OO.ui.TextInputWidget
OO.ui.TextInputWidget.prototype.setReadOnly.call( this, readOnly );
// During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor
// During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor.
if ( this.isReadOnly() && this.lookupMenu ) {
this.closeLookupMenu();
}
@ -1021,8 +1033,8 @@ OO.inheritClass( OO.ui.TabPanelLayout, OO.ui.PanelLayout );
/* Events */
/**
* An 'active' event is emitted when the tab panel becomes active. Tab panels become active when they are
* shown in a index layout that is configured to display only one tab panel at a time.
* An 'active' event is emitted when the tab panel becomes active. Tab panels become active when
* they are shown in a index layout that is configured to display only one tab panel at a time.
*
* @event active
* @param {boolean} active Tab panel is active
@ -1042,9 +1054,9 @@ OO.ui.TabPanelLayout.prototype.getName = function () {
/**
* Check if tab panel is active.
*
* Tab panels become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is configured to
* display only one tab panel at a time. Additional CSS is applied to the tab panel's tab item to reflect the
* active state.
* Tab panels become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is
* configured to display only one tab panel at a time. Additional CSS is applied to the tab panel's
* tab item to reflect the active state.
*
* @return {boolean} Tab panel is active
*/
@ -1056,7 +1068,8 @@ OO.ui.TabPanelLayout.prototype.isActive = function () {
* Get tab item.
*
* The tab item allows users to access the tab panel from the index's tab
* navigation. The tab item itself can be customized (with a label, level, etc.) using the #setupTabItem method.
* navigation. The tab item itself can be customized (with a label, level, etc.) using the
* #setupTabItem method.
*
* @return {OO.ui.TabOptionWidget|null} Tab option widget
*/
@ -1126,13 +1139,14 @@ OO.ui.TabPanelLayout.prototype.setActive = function ( active ) {
};
/**
* PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that users can select and display
* from the booklet's optional {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated directly,
* rather extended to include the required content and functionality.
* PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that
* users can select and display from the booklet's optional
* {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated
* directly, rather extended to include the required content and functionality.
*
* Each page must have a unique symbolic name, which is passed to the constructor. In addition, the page's outline
* item is customized (with a label, outline level, etc.) using the #setupOutlineItem method. See
* {@link OO.ui.BookletLayout BookletLayout} for an example.
* Each page must have a unique symbolic name, which is passed to the constructor. In addition, the
* page's outline item is customized (with a label, outline level, etc.) using the
* #setupOutlineItem method. See {@link OO.ui.BookletLayout BookletLayout} for an example.
*
* @class
* @extends OO.ui.PanelLayout
@ -1191,8 +1205,9 @@ OO.ui.PageLayout.prototype.getName = function () {
/**
* Check if page is active.
*
* Pages become active when they are shown in a {@link OO.ui.BookletLayout booklet layout} that is configured to display
* only one page at a time. Additional CSS is applied to the page's outline item to reflect the active state.
* Pages become active when they are shown in a {@link OO.ui.BookletLayout booklet layout} that is
* configured to display only one page at a time. Additional CSS is applied to the page's outline
* item to reflect the active state.
*
* @return {boolean} Page is active
*/
@ -1204,7 +1219,8 @@ OO.ui.PageLayout.prototype.isActive = function () {
* Get outline item.
*
* The outline item allows users to access the page from the booklet's outline
* navigation. The outline item itself can be customized (with a label, level, etc.) using the #setupOutlineItem method.
* navigation. The outline item itself can be customized (with a label, level, etc.) using the
* #setupOutlineItem method.
*
* @return {OO.ui.OutlineOptionWidget|null} Outline option widget
*/
@ -1216,8 +1232,8 @@ OO.ui.PageLayout.prototype.getOutlineItem = function () {
* Set or unset the outline item.
*
* Specify an {@link OO.ui.OutlineOptionWidget outline option} to set it,
* or `null` to clear the outline item. To customize the outline item itself (e.g., to set a label or outline
* level), use #setupOutlineItem instead of this method.
* or `null` to clear the outline item. To customize the outline item itself (e.g., to set a label
* or outline level), use #setupOutlineItem instead of this method.
*
* @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline option widget, null to clear
* @chainable
@ -1234,9 +1250,9 @@ OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
/**
* Set up the outline item.
*
* Use this method to customize the outline item (e.g., to add a label or outline level). To set or unset
* the outline item itself (with an {@link OO.ui.OutlineOptionWidget outline option} or `null`), use
* the #setOutlineItem method instead.
* Use this method to customize the outline item (e.g., to add a label or outline level). To set or
* unset the outline item itself (with an {@link OO.ui.OutlineOptionWidget outline option} or
* `null`), use the #setOutlineItem method instead.
*
* @param {OO.ui.OutlineOptionWidget} outlineItem Outline option widget to set up
* @chainable
@ -1249,9 +1265,9 @@ OO.ui.PageLayout.prototype.setupOutlineItem = function () {
/**
* Set the page to its 'active' state.
*
* Pages become active when they are shown in a booklet layout that is configured to display only one page at a time. Additional
* CSS is applied to the outline item to reflect the page's active state. Outside of the booklet
* context, setting the active state on a page does nothing.
* Pages become active when they are shown in a booklet layout that is configured to display only
* one page at a time. Additional CSS is applied to the outline item to reflect the page's active
* state. Outside of the booklet context, setting the active state on a page does nothing.
*
* @param {boolean} active Page is active
* @fires active
@ -1267,9 +1283,9 @@ OO.ui.PageLayout.prototype.setActive = function ( active ) {
};
/**
* StackLayouts contain a series of {@link OO.ui.PanelLayout panel layouts}. By default, only one panel is displayed
* at a time, though the stack layout can also be configured to show all contained panels, one after another,
* by setting the #continuous option to 'true'.
* StackLayouts contain a series of {@link OO.ui.PanelLayout panel layouts}. By default, only one
* panel is displayed at a time, though the stack layout can also be configured to show all
* contained panels, one after another, by setting the #continuous option to 'true'.
*
* @example
* // A stack layout with two panels, configured to be displayed continuously
@ -1296,7 +1312,8 @@ OO.ui.PageLayout.prototype.setActive = function ( active ) {
*
* @constructor
* @param {Object} [config] Configuration options
* @cfg {boolean} [continuous=false] Show all panels, one after another. By default, only one panel is displayed at a time.
* @cfg {boolean} [continuous=false] Show all panels, one after another. By default, only one panel
* is displayed at a time.
* @cfg {OO.ui.Layout[]} [items] Panel layouts to add to the stack layout.
*/
OO.ui.StackLayout = function OoUiStackLayout( config ) {
@ -1430,9 +1447,9 @@ OO.ui.StackLayout.prototype.unsetCurrentItem = function () {
/**
* Add panel layouts to the stack layout.
*
* Panels will be added to the end of the stack layout array unless the optional index parameter specifies a different
* insertion point. Adding a panel that is already in the stack will move it to the end of the array or the point specified
* by the index.
* Panels will be added to the end of the stack layout array unless the optional index parameter
* specifies a different insertion point. Adding a panel that is already in the stack will move it
* to the end of the array or the point specified by the index.
*
* @param {OO.ui.Layout[]} items Panels to add
* @param {number} [index] Index of the insertion point
@ -1456,8 +1473,8 @@ OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
/**
* Remove the specified panels from the stack layout.
*
* Removed panels are detached from the DOM, not removed, so that they may be reused. To remove all panels,
* you may wish to use the #clearItems method instead.
* Removed panels are detached from the DOM, not removed, so that they may be reused. To remove all
* panels, you may wish to use the #clearItems method instead.
*
* @param {OO.ui.Layout[]} items Panels to remove
* @chainable
@ -1573,13 +1590,22 @@ OO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem )
};
/**
* MenuLayouts combine a menu and a content {@link OO.ui.PanelLayout panel}. The menu is positioned relative to the content (after, before, top, or bottom)
* and its size is customized with the #menuSize config. The content area will fill all remaining space.
* MenuLayouts combine a menu and a content {@link OO.ui.PanelLayout panel}. The menu is positioned
* relative to the content (after, before, top, or bottom) and its size is customized with the
* #menuSize config. The content area will fill all remaining space.
*
* @example
* var menuLayout,
* menuPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),
* contentPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),
* menuPanel = new OO.ui.PanelLayout( {
* padded: true,
* expanded: true,
* scrollable: true
* } ),
* contentPanel = new OO.ui.PanelLayout( {
* padded: true,
* expanded: true,
* scrollable: true
* } ),
* select = new OO.ui.SelectWidget( {
* items: [
* new OO.ui.OptionWidget( {
@ -1607,12 +1633,16 @@ OO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem )
* position: 'top',
* menuPanel: menuPanel,
* contentPanel: contentPanel
* } )
* } );
* menuLayout.$menu.append(
* menuPanel.$element.append( '<b>Menu panel</b>', select.$element )
* menuPanel.$element.append( '<b>Menu panel</b>', select.$element );
* );
* menuLayout.$content.append(
* contentPanel.$element.append( '<b>Content panel</b>', '<p>Note that the menu is positioned relative to the content panel: top, bottom, after, before.</p>')
* contentPanel.$element.append(
* '<b>Content panel</b>',
* '<p>Note that the menu is positioned relative to the content panel: ' +
* 'top, bottom, after, before.</p>'
* );
* );
* $( document.body ).append( menuLayout.$element );
*
@ -1672,11 +1702,9 @@ OO.ui.MenuLayout = function OoUiMenuLayout( config ) {
this.$content = $( '<div>' );
// Initialization
this.$menu
.addClass( 'oo-ui-menuLayout-menu' );
this.$menu.addClass( 'oo-ui-menuLayout-menu' );
this.$content.addClass( 'oo-ui-menuLayout-content' );
this.$element
.addClass( 'oo-ui-menuLayout' );
this.$element.addClass( 'oo-ui-menuLayout' );
if ( config.expanded ) {
this.$element.addClass( 'oo-ui-menuLayout-expanded' );
} else {
@ -1824,7 +1852,8 @@ OO.ui.MenuLayout.prototype.resetScroll = function () {
*
* function PageOneLayout( name, config ) {
* PageOneLayout.parent.call( this, name, config );
* this.$element.append( '<p>First page</p><p>(This booklet has an outline, displayed on the left)</p>' );
* this.$element.append( '<p>First page</p><p>(This booklet has an outline, displayed on ' +
* 'the left)</p>' );
* }
* OO.inheritClass( PageOneLayout, OO.ui.PageLayout );
* PageOneLayout.prototype.setupOutlineItem = function () {
@ -1856,9 +1885,11 @@ OO.ui.MenuLayout.prototype.resetScroll = function () {
* @constructor
* @param {Object} [config] Configuration options
* @cfg {boolean} [continuous=false] Show all pages, one after another
* @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed. Disabled on mobile.
* @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.
* @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
* @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is
* displayed. Disabled on mobile.
* @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the
* pages of the booklet.
* @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages.
*/
OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
// Configuration initialization
@ -1898,11 +1929,17 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
this.toggleMenu( this.outlined );
// Events
this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
this.stackLayout.connect( this, {
set: 'onStackLayoutSet'
} );
if ( this.outlined ) {
this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
this.outlineSelectWidget.connect( this, {
select: 'onOutlineSelectWidgetSelect'
} );
this.scrolling = false;
this.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );
this.stackLayout.connect( this, {
visibleItemChange: 'onStackLayoutVisibleItemChange'
} );
}
if ( this.autoFocus ) {
// Event 'focus' does not bubble, but 'focusin' does
@ -1931,7 +1968,8 @@ OO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );
/* Events */
/**
* A 'set' event is emitted when a page is {@link #setPage set} to be displayed by the booklet layout.
* A 'set' event is emitted when a page is {@link #setPage set} to be displayed by the
* booklet layout.
* @event set
* @param {OO.ui.PageLayout} page Current page
*/
@ -2110,8 +2148,9 @@ OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
this.outlineVisible = show;
this.toggleMenu( show );
if ( show && this.editable ) {
// HACK: Kill dumb scrollbars when the sidebar stops animating, see T161798. Only necessary when
// outline controls are present, delay matches transition on `.oo-ui-menuLayout-menu`.
// HACK: Kill dumb scrollbars when the sidebar stops animating, see T161798.
// Only necessary when outline controls are present, delay matches transition on
// `.oo-ui-menuLayout-menu`.
setTimeout( function () {
OO.ui.Element.static.reconsiderScrollbars( booklet.outlinePanel.$element[ 0 ] );
}, OO.ui.theme.getDialogTransitionDuration() );
@ -2348,9 +2387,10 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
if ( previousPage ) {
previousPage.setActive( false );
// Blur anything focused if the next page doesn't have anything focusable.
// This is not needed if the next page has something focusable (because once it is focused
// this blur happens automatically). If the layout is non-continuous, this check is
// meaningless because the next page is not visible yet and thus can't hold focus.
// This is not needed if the next page has something focusable (because once it is
// focused this blur happens automatically). If the layout is non-continuous, this
// check is meaningless because the next page is not visible yet and thus can't
// hold focus.
if (
this.autoFocus &&
!OO.ui.isMobile() &&
@ -2367,8 +2407,9 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
page.setActive( true );
this.stackLayout.setItem( page );
if ( !this.stackLayout.continuous && previousPage ) {
// This should not be necessary, since any inputs on the previous page should have been
// blurred when it was hidden, but browsers are not very consistent about this.
// This should not be necessary, since any inputs on the previous page should have
// been blurred when it was hidden, but browsers are not very consistent about
// this.
$focused = previousPage.$element.find( ':focus' );
if ( $focused.length ) {
$focused[ 0 ].blur();
@ -2388,7 +2429,11 @@ OO.ui.BookletLayout.prototype.resetScroll = function () {
// Parent method
OO.ui.BookletLayout.parent.prototype.resetScroll.call( this );
if ( this.outlined && this.stackLayout.continuous && this.outlineSelectWidget.findFirstSelectableItem() ) {
if (
this.outlined &&
this.stackLayout.continuous &&
this.outlineSelectWidget.findFirstSelectableItem()
) {
this.scrolling = true;
this.outlineSelectWidget.selectItem( this.outlineSelectWidget.findFirstSelectableItem() );
this.scrolling = false;
@ -2412,10 +2457,10 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
/**
* IndexLayouts contain {@link OO.ui.TabPanelLayout tab panel layouts} as well as
* {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the tab panels and
* select which one to display. By default, only one tab panel is displayed at a time. When a user
* navigates to a new tab panel, the index layout automatically focuses on the first focusable element,
* unless the default setting is changed.
* {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the tab panels
* and select which one to display. By default, only one tab panel is displayed at a time. When a
* user navigates to a new tab panel, the index layout automatically focuses on the first focusable
* element, unless the default setting is changed.
*
* TODO: This class is similar to BookletLayout, we may want to refactor to reduce duplication
*
@ -2447,7 +2492,8 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
* @constructor
* @param {Object} [config] Configuration options
* @cfg {boolean} [continuous=false] Show all tab panels, one after another
* @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new tab panel is displayed. Disabled on mobile.
* @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new tab panel is
* displayed. Disabled on mobile.
*/
OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
// Configuration initialization
@ -2477,10 +2523,14 @@ OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
this.toggleMenu( true );
// Events
this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
this.tabSelectWidget.connect( this, { select: 'onTabSelectWidgetSelect' } );
this.stackLayout.connect( this, {
set: 'onStackLayoutSet'
} );
this.tabSelectWidget.connect( this, {
select: 'onTabSelectWidgetSelect'
} );
if ( this.autoFocus ) {
// Event 'focus' does not bubble, but 'focusin' does
// Event 'focus' does not bubble, but 'focusin' does.
this.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );
}
@ -2499,7 +2549,9 @@ OO.inheritClass( OO.ui.IndexLayout, OO.ui.MenuLayout );
/* Events */
/**
* A 'set' event is emitted when a tab panel is {@link #setTabPanel set} to be displayed by the index layout.
* A 'set' event is emitted when a tab panel is {@link #setTabPanel set} to be displayed by the
* index layout.
*
* @event set
* @param {OO.ui.TabPanelLayout} tabPanel Current tab panel
*/
@ -2535,7 +2587,8 @@ OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
$target = $( e.target ).closest( '.oo-ui-tabPanelLayout' );
for ( name in this.tabPanels ) {
// Check for tab panel match, exclude current tab panel to find only tab panel changes
if ( this.tabPanels[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentTabPanelName ) {
if ( this.tabPanels[ name ].$element[ 0 ] === $target[ 0 ] &&
name !== this.currentTabPanelName ) {
this.setTabPanel( name );
break;
}
@ -2585,7 +2638,11 @@ OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
return;
}
// Only change the focus if is not already in the current page
if ( !OO.ui.contains( tabPanel.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
if ( !OO.ui.contains(
tabPanel.$element[ 0 ],
this.getElementDocument().activeElement,
true
) ) {
tabPanel.focus();
}
};
@ -2681,7 +2738,7 @@ OO.ui.IndexLayout.prototype.getCurrentTabPanelName = function () {
};
/**
* Add tab panels to the index layout
* Add tab panels to the index layout.
*
* When tab panels are added with the same names as existing tab panels, the existing tab panels
* will be automatically removed before the new tab panels are added.
@ -2815,9 +2872,10 @@ OO.ui.IndexLayout.prototype.setTabPanel = function ( name ) {
if ( previousTabPanel ) {
previousTabPanel.setActive( false );
// Blur anything focused if the next tab panel doesn't have anything focusable.
// This is not needed if the next tab panel has something focusable (because once it is focused
// this blur happens automatically). If the layout is non-continuous, this check is
// meaningless because the next tab panel is not visible yet and thus can't hold focus.
// This is not needed if the next tab panel has something focusable (because once
// it is focused this blur happens automatically). If the layout is non-continuous,
// this check is meaningless because the next tab panel is not visible yet and thus
// can't hold focus.
if (
this.autoFocus &&
!OO.ui.isMobile() &&
@ -2834,8 +2892,9 @@ OO.ui.IndexLayout.prototype.setTabPanel = function ( name ) {
tabPanel.setActive( true );
this.stackLayout.setItem( tabPanel );
if ( !this.stackLayout.continuous && previousTabPanel ) {
// This should not be necessary, since any inputs on the previous tab panel should have been
// blurred when it was hidden, but browsers are not very consistent about this.
// This should not be necessary, since any inputs on the previous tab panel should
// have been blurred when it was hidden, but browsers are not very consistent about
// this.
$focused = previousTabPanel.$element.find( ':focus' );
if ( $focused.length ) {
$focused[ 0 ].blur();
@ -2940,7 +2999,8 @@ OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
/**
* ToggleButtons are buttons that have a state (on or off) that is represented by a
* Boolean value. Like other {@link OO.ui.ButtonWidget buttons}, toggle buttons can be
* configured with {@link OO.ui.mixin.IconElement icons}, {@link OO.ui.mixin.IndicatorElement indicators},
* configured with {@link OO.ui.mixin.IconElement icons},
* {@link OO.ui.mixin.IndicatorElement indicators},
* {@link OO.ui.mixin.TitledElement titles}, {@link OO.ui.mixin.FlaggedElement styling flags},
* and {@link OO.ui.mixin.LabelElement labels}. Please see
* the [OOUI documentation][1] on MediaWiki for more information.
@ -2981,15 +3041,21 @@ OO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {
OO.ui.ToggleButtonWidget.parent.call( this, config );
// Mixin constructors
OO.ui.mixin.ButtonElement.call( this, $.extend( {}, config, { active: this.active } ) );
OO.ui.mixin.ButtonElement.call( this, $.extend( {}, config, {
active: this.active
} ) );
OO.ui.mixin.IconElement.call( this, config );
OO.ui.mixin.IndicatorElement.call( this, config );
OO.ui.mixin.LabelElement.call( this, config );
OO.ui.mixin.FlaggedElement.call( this, config );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, {
$tabIndexed: this.$button
} ) );
// Events
this.connect( this, { click: 'onAction' } );
this.connect( this, {
click: 'onAction'
} );
// Initialization
this.$button.append( this.$icon, this.$label, this.$indicator );
@ -3178,7 +3244,8 @@ OO.ui.ToggleSwitchWidget.prototype.simulateLabelClick = function () {
};
/**
* OutlineControlsWidget is a set of controls for an {@link OO.ui.OutlineSelectWidget outline select widget}.
* OutlineControlsWidget is a set of controls for an
* {@link OO.ui.OutlineSelectWidget outline select widget}.
* Controls include moving items up and down, removing items, and adding different kinds of items.
*
* **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**
@ -3236,9 +3303,15 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
add: 'onOutlineChange',
remove: 'onOutlineChange'
} );
this.upButton.connect( this, { click: [ 'emit', 'move', -1 ] } );
this.downButton.connect( this, { click: [ 'emit', 'move', 1 ] } );
this.removeButton.connect( this, { click: [ 'emit', 'remove' ] } );
this.upButton.connect( this, {
click: [ 'emit', 'move', -1 ]
} );
this.downButton.connect( this, {
click: [ 'emit', 'move', 1 ]
} );
this.removeButton.connect( this, {
click: [ 'emit', 'remove' ]
} );
// Initialization
this.$element.addClass( 'oo-ui-outlineControlsWidget' );
@ -3334,7 +3407,8 @@ OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
* @constructor
* @param {Object} [config] Configuration options
* @cfg {number} [level] Indentation level
* @cfg {boolean} [movable] Allow modification from {@link OO.ui.OutlineControlsWidget outline controls}.
* @cfg {boolean} [movable] Allow modification from
* {@link OO.ui.OutlineControlsWidget outline controls}.
*/
OO.ui.OutlineOptionWidget = function OoUiOutlineOptionWidget( config ) {
// Configuration initialization
@ -3490,8 +3564,10 @@ OO.ui.OutlineOptionWidget.prototype.setLevel = function ( level ) {
};
/**
* OutlineSelectWidget is a structured list that contains {@link OO.ui.OutlineOptionWidget outline options}
* A set of controls can be provided with an {@link OO.ui.OutlineControlsWidget outline controls} widget.
* OutlineSelectWidget is a structured list that contains
* {@link OO.ui.OutlineOptionWidget outline options}
* A set of controls can be provided with an {@link OO.ui.OutlineControlsWidget outline controls}
* widget.
*
* **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**
*
@ -3775,8 +3851,9 @@ OO.ui.TagItemWidget = function OoUiTagItemWidget( config ) {
this.closeButton.setDisabled( this.isDisabled() );
// Events
this.closeButton
.connect( this, { click: 'remove' } );
this.closeButton.connect( this, {
click: 'remove'
} );
this.$element
.on( 'click', this.select.bind( this ) )
.on( 'keydown', this.onKeyDown.bind( this ) )
@ -3934,7 +4011,11 @@ OO.ui.TagItemWidget.prototype.remove = function () {
OO.ui.TagItemWidget.prototype.onKeyDown = function ( e ) {
var movement;
if ( !this.isDisabled() && !this.isFixed() && ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) ) {
if (
!this.isDisabled() &&
!this.isFixed() &&
( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE )
) {
this.remove();
return false;
} else if ( e.keyCode === OO.ui.Keys.ENTER ) {
@ -4004,12 +4085,13 @@ OO.ui.TagItemWidget.prototype.isValid = function () {
};
/**
* A basic tag multiselect widget, similar in concept to {@link OO.ui.ComboBoxInputWidget combo box widget}
* that allows the user to add multiple values that are displayed in a tag area.
* A basic tag multiselect widget, similar in concept to
* {@link OO.ui.ComboBoxInputWidget combo box widget} that allows the user to add multiple values
* that are displayed in a tag area.
*
* This widget is a base widget; see {@link OO.ui.MenuTagMultiselectWidget MenuTagMultiselectWidget} and
* {@link OO.ui.PopupTagMultiselectWidget PopupTagMultiselectWidget} for the implementations that use
* a menu and a popup respectively.
* This widget is a base widget; see {@link OO.ui.MenuTagMultiselectWidget MenuTagMultiselectWidget}
* and {@link OO.ui.PopupTagMultiselectWidget PopupTagMultiselectWidget} for the implementations
* that use a menu and a popup respectively.
*
* @example
* // A TagMultiselectWidget.
@ -4064,8 +4146,7 @@ OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
var inputEvents,
rAF = window.requestAnimationFrame || setTimeout,
widget = this,
$tabFocus = $( '<span>' )
.addClass( 'oo-ui-tagMultiselectWidget-focusTrap' );
$tabFocus = $( '<span>' ).addClass( 'oo-ui-tagMultiselectWidget-focusTrap' );
config = config || {};
@ -4099,8 +4180,7 @@ OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
this.height = null;
this.valid = true;
this.$content = $( '<div>' )
.addClass( 'oo-ui-tagMultiselectWidget-content' );
this.$content = $( '<div>' ).addClass( 'oo-ui-tagMultiselectWidget-content' );
this.$handle = $( '<div>' )
.addClass( 'oo-ui-tagMultiselectWidget-handle' )
.append(
@ -4108,8 +4188,7 @@ OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
this.$icon,
this.$content
.append(
this.$group
.addClass( 'oo-ui-tagMultiselectWidget-group' )
this.$group.addClass( 'oo-ui-tagMultiselectWidget-group' )
)
);
@ -4295,7 +4374,7 @@ OO.ui.TagMultiselectWidget.prototype.onInputKeyDown = function ( e ) {
};
if ( !this.isDisabled() ) {
// 'keypress' event is not triggered for Backspace
// 'keypress' event is not triggered for Backspace key
if ( e.keyCode === OO.ui.Keys.BACKSPACE ) {
return this.doInputBackspace( e, withMetaKey );
} else if ( e.keyCode === OO.ui.Keys.ESCAPE ) {
@ -4346,11 +4425,11 @@ OO.ui.TagMultiselectWidget.prototype.onInputBlur = function () {
};
/**
* Perform an action after the enter key on the input
* Perform an action after the Enter key on the input
*
* @param {jQuery.Event} e Event data
* @param {boolean} [withMetaKey] Whether this key was pressed with
* a meta key like 'ctrl'
* a meta key like Control
* @return {boolean} Whether to prevent defaults
*/
OO.ui.TagMultiselectWidget.prototype.doInputEnter = function () {
@ -4359,11 +4438,11 @@ OO.ui.TagMultiselectWidget.prototype.doInputEnter = function () {
};
/**
* Perform an action responding to the enter key on the input
* Perform an action responding to the Enter key on the input
*
* @param {jQuery.Event} e Event data
* @param {boolean} [withMetaKey] Whether this key was pressed with
* a meta key like 'ctrl'
* a meta key like Control
* @return {boolean} Whether to prevent defaults
*/
OO.ui.TagMultiselectWidget.prototype.doInputBackspace = function ( e, withMetaKey ) {
@ -4392,7 +4471,7 @@ OO.ui.TagMultiselectWidget.prototype.doInputBackspace = function ( e, withMetaKe
};
/**
* Perform an action after the escape key on the input
* Perform an action after the Escape key on the input
*
* @param {jQuery.Event} e Event data
*/
@ -4401,14 +4480,14 @@ OO.ui.TagMultiselectWidget.prototype.doInputEscape = function () {
};
/**
* Perform an action after the arrow key on the input, select the previous
* Perform an action after the Left/Right arrow key on the input, select the previous
* item from the input.
* See #getPreviousItem
*
* @param {jQuery.Event} e Event data
* @param {string} direction Direction of the movement; forwards or backwards
* @param {boolean} [withMetaKey] Whether this key was pressed with
* a meta key like 'ctrl'
* a meta key like Control
*/
OO.ui.TagMultiselectWidget.prototype.doInputArrow = function ( e, direction ) {
if (
@ -4836,8 +4915,8 @@ OO.ui.TagMultiselectWidget.prototype.updateInputSize = function () {
$lastItem.position().left;
}
// Some safety margin for sanity, because I *really* don't feel like finding out where the few
// pixels this is off by are coming from.
// Some safety margin for sanity, because I *really* don't feel like finding out where the
// few pixels this is off by are coming from.
bestWidth -= 13;
if ( contentWidth > bestWidth ) {
// This will result in the input getting shifted to the next line
@ -4906,8 +4985,9 @@ OO.ui.TagMultiselectWidget.prototype.isValid = function () {
};
/**
* PopupTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended
* to use a popup. The popup can be configured to have a default input to insert values into the widget.
* PopupTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget}
* intended to use a popup. The popup can be configured to have a default input to insert values
* into the widget.
*
* @example
* // A PopupTagMultiselectWidget.
@ -4944,9 +5024,12 @@ OO.ui.PopupTagMultiselectWidget = function OoUiPopupTagMultiselectWidget( config
config = config || {};
// Parent constructor
OO.ui.PopupTagMultiselectWidget.parent.call( this, $.extend( { inputPosition: 'none' }, config ) );
OO.ui.PopupTagMultiselectWidget.parent.call( this, $.extend( {
inputPosition: 'none'
}, config ) );
this.$overlay = ( config.$overlay === true ? OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
this.$overlay = ( config.$overlay === true ?
OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
if ( !config.popup ) {
// For the default base implementation, we give a popup
@ -4987,9 +5070,10 @@ OO.ui.PopupTagMultiselectWidget = function OoUiPopupTagMultiselectWidget( config
// Events
this.on( 'resize', this.popup.updateDimensions.bind( this.popup ) );
this.popup.connect( this, { toggle: 'onPopupToggle' } );
this.$tabIndexed
.on( 'focus', this.onFocus.bind( this ) );
this.popup.connect( this, {
toggle: 'onPopupToggle'
} );
this.$tabIndexed.on( 'focus', this.onFocus.bind( this ) );
// Initialize
this.$element
@ -5067,8 +5151,8 @@ OO.ui.PopupTagMultiselectWidget.prototype.addTagByPopupValue = function ( data,
};
/**
* MenuTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended
* to use a menu of selectable options.
* MenuTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget}
* intended to use a menu of selectable options.
*
* @example
* // A basic MenuTagMultiselectWidget.
@ -5100,13 +5184,16 @@ OO.ui.MenuTagMultiselectWidget = function OoUiMenuTagMultiselectWidget( config )
// Parent constructor
OO.ui.MenuTagMultiselectWidget.parent.call( this, config );
this.$overlay = ( config.$overlay === true ? OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
this.clearInputOnChoose = config.clearInputOnChoose === undefined || !!config.clearInputOnChoose;
this.$overlay = ( config.$overlay === true ?
OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
this.clearInputOnChoose = config.clearInputOnChoose === undefined ||
!!config.clearInputOnChoose;
this.menu = this.createMenuWidget( $.extend( {
widget: this,
input: this.hasInput ? this.input : null,
$input: this.hasInput ? this.input.$input : null,
filterFromInput: !!this.hasInput,
highlightOnFilter: true,
$autoCloseIgnore: this.hasInput ?
this.input.$element : $( [] ),
$floatableContainer: this.hasInput && this.inputPosition === 'outline' ?
@ -5122,20 +5209,22 @@ OO.ui.MenuTagMultiselectWidget = function OoUiMenuTagMultiselectWidget( config )
toggle: 'onMenuToggle'
} );
if ( this.hasInput ) {
this.input.connect( this, { change: 'onInputChange' } );
this.input.connect( this, {
change: 'onInputChange'
} );
}
this.connect( this, { resize: 'onResize' } );
this.connect( this, {
resize: 'onResize'
} );
// Initialization
this.$overlay
.append( this.menu.$element );
this.$element
.addClass( 'oo-ui-menuTagMultiselectWidget' );
this.$overlay.append( this.menu.$element );
this.$element.addClass( 'oo-ui-menuTagMultiselectWidget' );
// Remove MenuSelectWidget's generic focus owner ARIA attribute
// TODO: Should this widget have a `role` that is compatible with this attribute?
this.menu.$focusOwner.removeAttr( 'aria-expanded' );
// TagMultiselectWidget already does this, but it doesn't work right because this.menu is not yet
// set up while the parent constructor runs, and #getAllowedValues rejects everything.
// TagMultiselectWidget already does this, but it doesn't work right because this.menu is
// not yet set up while the parent constructor runs, and #getAllowedValues rejects everything.
if ( config.selected ) {
this.setValue( config.selected );
}
@ -5180,7 +5269,6 @@ OO.ui.MenuTagMultiselectWidget.prototype.onInputBlur = function () {
*/
OO.ui.MenuTagMultiselectWidget.prototype.onInputChange = function () {
this.menu.toggle( true );
this.initializeMenuSelection();
};
/**
@ -5205,8 +5293,6 @@ OO.ui.MenuTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) {
if ( !isVisible ) {
this.menu.selectItem( null );
this.menu.highlightItem( null );
} else {
this.initializeMenuSelection();
}
setTimeout( function () {
// Remove MenuSelectWidget's generic focus owner ARIA attribute
@ -5404,9 +5490,10 @@ OO.ui.MenuTagMultiselectWidget.prototype.getAllowedValues = function () {
* @cfg {string} [placeholder] Text to display when no file is selected.
* @cfg {string} [notsupported] Text to display when file support is missing in the browser.
* @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
* @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
* @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be
* true.
* @cfg {number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a
* preview (for performance)
* preview (for performance).
*/
OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
var dragHandler;
@ -5427,7 +5514,9 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
// Mixin constructors
OO.ui.mixin.IconElement.call( this, config );
OO.ui.mixin.IndicatorElement.call( this, config );
OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$info } ) );
OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, {
$pending: this.$info
} ) );
OO.ui.mixin.LabelElement.call( this, config );
OO.ui.mixin.TitledElement.call( this, config );
@ -5912,10 +6001,12 @@ OO.ui.SelectFileWidget.prototype.setDisabled = function ( disabled ) {
};
/**
* SearchWidgets combine a {@link OO.ui.TextInputWidget text input field}, where users can type a search query,
* and a menu of search results, which is displayed beneath the query
* field. Unlike {@link OO.ui.mixin.LookupElement lookup menus}, search result menus are always visible to the user.
* Users can choose an item from the menu or type a query into the text field to search for a matching result item.
* SearchWidgets combine a {@link OO.ui.TextInputWidget text input field},
* where users can type a search query, and a menu of search results,
* which is displayed beneath the query field.
* Unlike {@link OO.ui.mixin.LookupElement lookup menus}, search result menus are always visible
* to the user. Users can choose an item from the menu or type a query into the text field to
* search for a matching result item.
* In general, search widgets are used inside a separate {@link OO.ui.Dialog dialog} window.
*
* Each time the query is changed, the search result menu is cleared and repopulated. Please see

File diff suppressed because one or more lines are too long

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:07Z
* Date: 2019-03-07T09:14:18Z
*/
( function ( OO ) {
@ -36,10 +36,11 @@ OO.ui.WikimediaUITheme.prototype.getElementClasses = function ( element ) {
// Parent method
var variant, isFramed, isActive, isToolOrGroup,
variants = {
warning: false,
invert: false,
progressive: false,
destructive: false
destructive: false,
error: false,
warning: false
},
// Parent method
classes = OO.ui.WikimediaUITheme.parent.prototype.getElementClasses.call( this, element );
@ -54,22 +55,24 @@ OO.ui.WikimediaUITheme.prototype.getElementClasses = function ( element ) {
isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
isActive = element.supports( [ 'isActive' ] ) && element.isActive();
isToolOrGroup =
// Check if the class exists, as classes that are not in the 'core' module may not be loaded
// Check if the class exists, as classes that are not in the 'core' module may
// not be loaded.
( OO.ui.Tool && element instanceof OO.ui.Tool ) ||
( OO.ui.ToolGroup && element instanceof OO.ui.ToolGroup );
if (
// Button with a dark background
// Button with a dark background.
isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ||
// Toolbar with a dark background
// Toolbar with a dark background.
isToolOrGroup && element.hasFlag( 'primary' )
) {
// … use white icon / indicator, regardless of other flags
variants.invert = true;
} else if ( !isFramed && element.isDisabled() ) {
// Frameless disabled button, always use black icon / indicator regardless of other flags
// Frameless disabled button, always use black icon / indicator regardless of
// other flags.
variants.invert = false;
} else if ( !element.isDisabled() ) {
// Any other kind of button, use the right colored icon / indicator if available
// Any other kind of button, use the right colored icon / indicator if available.
variants.progressive = element.hasFlag( 'progressive' ) ||
// Active tools/toolgroups
( isToolOrGroup && isActive ) ||
@ -77,13 +80,18 @@ OO.ui.WikimediaUITheme.prototype.getElementClasses = function ( element ) {
(
(
element instanceof OO.ui.MenuOptionWidget ||
// Check if the class exists, as classes that are not in the 'core' module may not be loaded
( OO.ui.OutlineOptionWidget && element instanceof OO.ui.OutlineOptionWidget )
// Check if the class exists, as classes that are not in the 'core' module
// may not be loaded.
(
OO.ui.OutlineOptionWidget &&
element instanceof OO.ui.OutlineOptionWidget
)
) &&
( element.isPressed() || element.isSelected() )
);
variants.destructive = element.hasFlag( 'destructive' );
variants.error = element.hasFlag( 'error' );
variants.warning = element.hasFlag( 'warning' );
}
}

File diff suppressed because one or more lines are too long

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/wikimediaui/images/textures/pending.gif);

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:15Z
* Date: 2019-03-07T09:14:26Z
*/
.oo-ui-window {

View file

@ -1,12 +1,12 @@
/*!
* OOUI v0.30.3
* OOUI v0.30.4
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 20112019 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
* Date: 2019-02-21T10:57:07Z
* Date: 2019-03-07T09:14:18Z
*/
( function ( OO ) {
@ -85,8 +85,8 @@ OO.ui.ActionWidget.prototype.getAction = function () {
* Get the symbolic name of the mode or modes for which the action is configured to be available.
*
* The current mode is set with the action set's {@link OO.ui.ActionSet#setMode setMode} method.
* Only actions that are configured to be available in the current mode will be visible. All other actions
* are hidden.
* Only actions that are configured to be available in the current mode will be visible.
* All other actions are hidden.
*
* @return {string[]}
*/
@ -96,13 +96,16 @@ OO.ui.ActionWidget.prototype.getModes = function () {
/* eslint-disable no-unused-vars */
/**
* ActionSets manage the behavior of the {@link OO.ui.ActionWidget action widgets} that comprise them.
* ActionSets manage the behavior of the {@link OO.ui.ActionWidget action widgets} that
* comprise them.
* Actions can be made available for specific contexts (modes) and circumstances
* (abilities). Action sets are primarily used with {@link OO.ui.Dialog Dialogs}.
*
* ActionSets contain two types of actions:
*
* - Special: Special actions are the first visible actions with special flags, such as 'safe' and 'primary', the default special flags. Additional special flags can be configured in subclasses with the static #specialFlags property.
* - Special: Special actions are the first visible actions with special flags, such as 'safe' and
* 'primary', the default special flags. Additional special flags can be configured in subclasses
* with the static #specialFlags property.
* - Other: Other actions include all non-special visible actions.
*
* See the [OOUI documentation on MediaWiki][1] for more information.
@ -117,7 +120,10 @@ OO.ui.ActionWidget.prototype.getModes = function () {
* MyProcessDialog.static.name = 'myProcessDialog';
* // An action set that uses modes ('edit' and 'help' mode, in this example).
* MyProcessDialog.static.actions = [
* { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'progressive' ] },
* { action: 'continue', modes: 'edit', label: 'Continue',
* flags: [
* 'primary', 'progressive'
* ] },
* { action: 'help', modes: 'edit', label: 'Help' },
* { modes: 'edit', label: 'Cancel', flags: 'safe' },
* { action: 'back', modes: 'help', label: 'Back', flags: 'safe' }
@ -126,9 +132,13 @@ OO.ui.ActionWidget.prototype.getModes = function () {
* MyProcessDialog.prototype.initialize = function () {
* MyProcessDialog.parent.prototype.initialize.apply( this, arguments );
* this.panel1 = new OO.ui.PanelLayout( { padded: true, expanded: false } );
* this.panel1.$element.append( '<p>This dialog uses an action set (continue, help, cancel, back) configured with modes. This is edit mode. Click \'help\' to see help mode.</p>' );
* this.panel1.$element.append( '<p>This dialog uses an action set (continue, help, ' +
* 'cancel, back) configured with modes. This is edit mode. Click \'help\' to see ' +
* 'help mode.</p>' );
* this.panel2 = new OO.ui.PanelLayout( { padded: true, expanded: false } );
* this.panel2.$element.append( '<p>This is help mode. Only the \'back\' action widget is configured to be visible here. Click \'back\' to return to \'edit\' mode.</p>' );
* this.panel2.$element.append( '<p>This is help mode. Only the \'back\' action widget ' +
* 'is configured to be visible here. Click \'back\' to return to \'edit\' mode.' +
* '</p>' );
* this.stackLayout = new OO.ui.StackLayout( {
* items: [ this.panel1, this.panel2 ]
* } );
@ -249,7 +259,8 @@ OO.ui.ActionSet.static.specialFlags = [ 'safe', 'primary' ];
* @event change
*
* A 'change' event is emitted when actions are {@link #method-add added}, {@link #clear cleared},
* or {@link #method-remove removed} from the action set or when the {@link #setMode mode} is changed.
* or {@link #method-remove removed} from the action set or when the {@link #setMode mode}
* is changed.
*
*/
@ -352,7 +363,8 @@ OO.ui.ActionSet.prototype.get = function ( filters ) {
/**
* Get 'special' actions.
*
* Special actions are the first visible action widgets with special flags, such as 'safe' and 'primary'.
* Special actions are the first visible action widgets with special flags, such as 'safe' and
* 'primary'.
* Special flags can be configured in subclasses by changing the static #specialFlags property.
*
* @return {OO.ui.ActionWidget[]|null} 'Special' action widgets.
@ -601,16 +613,17 @@ OO.ui.ActionSet.prototype.organize = function () {
};
/**
* Errors contain a required message (either a string or jQuery selection) that is used to describe what went wrong
* in a {@link OO.ui.Process process}. The error's #recoverable and #warning configurations are used to customize the
* appearance and functionality of the error interface.
* Errors contain a required message (either a string or jQuery selection) that is used to describe
* what went wrong in a {@link OO.ui.Process process}. The error's #recoverable and #warning
* configurations are used to customize the appearance and functionality of the error interface.
*
* The basic error interface contains a formatted error message as well as two buttons: 'Dismiss' and 'Try again' (i.e., the error
* is 'recoverable' by default). If the error is not recoverable, the 'Try again' button will not be rendered and the widget
* that initiated the failed process will be disabled.
* The basic error interface contains a formatted error message as well as two buttons: 'Dismiss'
* and 'Try again' (i.e., the error is 'recoverable' by default). If the error is not recoverable,
* the 'Try again' button will not be rendered and the widget that initiated the failed process will
* be disabled.
*
* If the error is a warning, the error interface will include a 'Dismiss' and a 'Continue' button, which will try the
* process again.
* If the error is a warning, the error interface will include a 'Dismiss' and a 'Continue' button,
* which will try the process again.
*
* For an example of error interfaces, please see the [OOUI documentation on MediaWiki][1].
*
@ -625,8 +638,8 @@ OO.ui.ActionSet.prototype.organize = function () {
* By default, errors are recoverable, and users can try the process again.
* @cfg {boolean} [warning=false] Error is a warning.
* If the error is a warning, the error interface will include a
* 'Dismiss' and a 'Continue' button. It is the responsibility of the developer to ensure that the warning
* is not triggered a second time if the user chooses to continue.
* 'Dismiss' and a 'Continue' button. It is the responsibility of the developer to ensure that the
* warning is not triggered a second time if the user chooses to continue.
*/
OO.ui.Error = function OoUiError( message, config ) {
// Allow passing positional parameters inside the config object
@ -693,27 +706,28 @@ OO.ui.Error.prototype.getMessageText = function () {
};
/**
* A Process is a list of steps that are called in sequence. The step can be a number, a jQuery promise,
* or a function:
* A Process is a list of steps that are called in sequence. The step can be a number, a
* jQuery promise, or a function:
*
* - **number**: the process will wait for the specified number of milliseconds before proceeding.
* - **promise**: the process will continue to the next step when the promise is successfully resolved
* or stop if the promise is rejected.
* - **function**: the process will execute the function. The process will stop if the function returns
* either a boolean `false` or a promise that is rejected; if the function returns a number, the process
* will wait for that number of milliseconds before proceeding.
* - **promise**: the process will continue to the next step when the promise is successfully
* resolved or stop if the promise is rejected.
* - **function**: the process will execute the function. The process will stop if the function
* returns either a boolean `false` or a promise that is rejected; if the function returns a
* number, the process will wait for that number of milliseconds before proceeding.
*
* If the process fails, an {@link OO.ui.Error error} is generated. Depending on how the error is
* configured, users can dismiss the error and try the process again, or not. If a process is stopped,
* its remaining steps will not be performed.
* configured, users can dismiss the error and try the process again, or not. If a process is
* stopped, its remaining steps will not be performed.
*
* @class
*
* @constructor
* @param {number|jQuery.Promise|Function} step Number of milliseconds to wait before proceeding, promise
* that must be resolved before proceeding, or a function to execute. See #createStep for more information. see #createStep for more information
* @param {Object} [context=null] Execution context of the function. The context is ignored if the step is
* a number or promise.
* @param {number|jQuery.Promise|Function} step Number of milliseconds to wait before proceeding,
* promise that must be resolved before proceeding, or a function to execute. See #createStep for
* more information. See #createStep for more information.
* @param {Object} [context=null] Execution context of the function. The context is ignored if the
* step is a number or promise.
*/
OO.ui.Process = function ( step, context ) {
// Properties
@ -735,8 +749,8 @@ OO.initClass( OO.ui.Process );
* Start the process.
*
* @return {jQuery.Promise} Promise that is resolved when all steps have successfully completed.
* If any of the steps return a promise that is rejected or a boolean false, this promise is rejected
* and any remaining steps are not performed.
* If any of the steps return a promise that is rejected or a boolean false, this promise is
* rejected and any remaining steps are not performed.
*/
OO.ui.Process.prototype.execute = function () {
var i, len, promise;
@ -958,9 +972,10 @@ OO.ui.WindowInstance.prototype.isClosed = function () {
};
/**
* Window managers are used to open and close {@link OO.ui.Window windows} and control their presentation.
* Managed windows are mutually exclusive. If a new window is opened while a current window is opening
* or is opened, the current window will be closed and any ongoing {@link OO.ui.Process process} will be cancelled. Windows
* Window managers are used to open and close {@link OO.ui.Window windows} and control their
* presentation. Managed windows are mutually exclusive. If a new window is opened while a current
* window is opening or is opened, the current window will be closed and any on-going
* {@link OO.ui.Process process} will be cancelled. Windows
* themselves are persistent andrather than being torn down when closedcan be repopulated with the
* pertinent data and reused.
*
@ -971,11 +986,13 @@ OO.ui.WindowInstance.prototype.isClosed = function () {
* {@link OO.ui.Window#open open} method is used, and the window manager begins to open the window.
*
* - an `opening` event is emitted with an `opening` promise
* - the #getSetupDelay method is called and the returned value is used to time a pause in execution before the
* windows {@link OO.ui.Window#method-setup setup} method is called which executes OO.ui.Window#getSetupProcess.
* - the #getSetupDelay method is called and the returned value is used to time a pause in execution
* before the windows {@link OO.ui.Window#method-setup setup} method is called which executes
* OO.ui.Window#getSetupProcess.
* - a `setup` progress notification is emitted from the `opening` promise
* - the #getReadyDelay method is called the returned value is used to time a pause in execution before the
* windows {@link OO.ui.Window#method-ready ready} method is called which executes OO.ui.Window#getReadyProcess.
* - the #getReadyDelay method is called the returned value is used to time a pause in execution
* before the windows {@link OO.ui.Window#method-ready ready} method is called which executes
* OO.ui.Window#getReadyProcess.
* - a `ready` progress notification is emitted from the `opening` promise
* - the `opening` promise is resolved with an `opened` promise
*
@ -986,13 +1003,13 @@ OO.ui.WindowInstance.prototype.isClosed = function () {
* to close the window.
*
* - the `opened` promise is resolved with `closing` promise and a `closing` event is emitted
* - the #getHoldDelay method is called and the returned value is used to time a pause in execution before
* the window's {@link OO.ui.Window#getHoldProcess getHoldProcess} method is called on the
* - the #getHoldDelay method is called and the returned value is used to time a pause in execution
* before the window's {@link OO.ui.Window#getHoldProcess getHoldProcess} method is called on the
* window and its result executed
* - a `hold` progress notification is emitted from the `closing` promise
* - the #getTeardownDelay() method is called and the returned value is used to time a pause in execution before
* the window's {@link OO.ui.Window#getTeardownProcess getTeardownProcess} method is called on the
* window and its result executed
* - the #getTeardownDelay() method is called and the returned value is used to time a pause in
* execution before the window's {@link OO.ui.Window#getTeardownProcess getTeardownProcess} method
* is called on the window and its result executed
* - a `teardown` progress notification is emitted from the `closing` promise
* - the `closing` promise is resolved. The window is now closed
*
@ -1059,9 +1076,10 @@ OO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );
*
* @event opening
* @param {OO.ui.Window} win Window that's being opened
* @param {jQuery.Promise} opened A promise resolved with a value when the window is opened successfully.
* This promise also emits `setup` and `ready` notifications. When this promise is resolved, the first
* argument of the value is an 'closed' promise, the second argument is the opening data.
* @param {jQuery.Promise} opened A promise resolved with a value when the window is opened
* successfully. This promise also emits `setup` and `ready` notifications. When this promise is
* resolved, the first argument of the value is an 'closed' promise, the second argument is the
* opening data.
* @param {Object} data Window opening data
*/
@ -1070,9 +1088,9 @@ OO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );
*
* @event closing
* @param {OO.ui.Window} win Window that's being closed
* @param {jQuery.Promise} closed A promise resolved with a value when the window is closed successfully.
* This promise also emits `hold` and `teardown` notifications. When this promise is resolved, the first
* argument of its value is the closing data.
* @param {jQuery.Promise} closed A promise resolved with a value when the window is closed
* successfully. This promise also emits `hold` and `teardown` notifications. When this promise is
* resolved, the first argument of its value is the closing data.
* @param {Object} data Window closing data
*/
@ -1149,7 +1167,7 @@ OO.ui.WindowManager.prototype.afterWindowResize = function () {
// Restore focus to the original element if it has changed.
// When a layout change is made on resize inputs lose focus
// on Android (Chrome and Firefox). See T162127.
// on Android (Chrome and Firefox), see T162127.
if ( currentFocusedElement !== document.activeElement ) {
currentFocusedElement.focus();
}
@ -1219,7 +1237,8 @@ OO.ui.WindowManager.prototype.getSetupDelay = function () {
};
/**
* Get the number of milliseconds to wait after setup has finished before executing the ready process.
* Get the number of milliseconds to wait after setup has finished before executing the ready
* process.
*
* @param {OO.ui.Window} win Window being opened
* @param {Object} [data] Window opening data
@ -1230,7 +1249,8 @@ OO.ui.WindowManager.prototype.getReadyDelay = function () {
};
/**
* Get the number of milliseconds to wait after closing has begun before executing the 'hold' process.
* Get the number of milliseconds to wait after closing has begun before executing the 'hold'
* process.
*
* @param {OO.ui.Window} win Window being closed
* @param {Object} [data] Window closing data
@ -1255,9 +1275,9 @@ OO.ui.WindowManager.prototype.getTeardownDelay = function () {
/**
* Get a window by its symbolic name.
*
* If the window is not yet instantiated and its symbolic name is recognized by a factory, it will be
* instantiated and added to the window manager automatically. Please see the [OOUI documentation on MediaWiki][3]
* for more information about using factories.
* If the window is not yet instantiated and its symbolic name is recognized by a factory, it will
* be instantiated and added to the window manager automatically. Please see the [OOUI documentation
* on MediaWiki][3] for more information about using factories.
* [3]: https://www.mediawiki.org/wiki/OOUI/Windows/Window_managers
*
* @param {string} name Symbolic name of the window
@ -1307,12 +1327,12 @@ OO.ui.WindowManager.prototype.getCurrentWindow = function () {
*
* @param {OO.ui.Window|string} win Window object or symbolic name of window to open
* @param {Object} [data] Window opening data
* @param {jQuery|null} [data.$returnFocusTo] Element to which the window will return focus when closed.
* Defaults the current activeElement. If set to null, focus isn't changed on close.
* @param {jQuery|null} [data.$returnFocusTo] Element to which the window will return focus when
* closed. Defaults the current activeElement. If set to null, focus isn't changed on close.
* @return {OO.ui.WindowInstance} A lifecycle object representing this particular
* opening of the window. For backwards-compatibility, then object is also a Thenable that is resolved
* when the window is done opening, with nested promise for when closing starts. This behaviour
* is deprecated and is not compatible with jQuery 3. See T163510.
* opening of the window. For backwards-compatibility, then object is also a Thenable that is
* resolved when the window is done opening, with nested promise for when closing starts. This
* behaviour is deprecated and is not compatible with jQuery 3, see T163510.
* @fires opening
*/
OO.ui.WindowManager.prototype.openWindow = function ( win, data, lifecycle, compatOpening ) {
@ -1376,7 +1396,9 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data, lifecycle, comp
manager.toggleGlobalEvents( true );
manager.toggleAriaIsolation( true );
}
manager.$returnFocusTo = data.$returnFocusTo !== undefined ? data.$returnFocusTo : $( document.activeElement );
manager.$returnFocusTo = data.$returnFocusTo !== undefined ?
data.$returnFocusTo :
$( document.activeElement );
manager.currentWindow = win;
manager.lifecycle = lifecycle;
manager.preparingToOpen = null;
@ -1414,8 +1436,8 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data, lifecycle, comp
* @param {OO.ui.Window|string} win Window object or symbolic name of window to close
* @param {Object} [data] Window closing data
* @return {OO.ui.WindowInstance} A lifecycle object representing this particular
* opening of the window. For backwards-compatibility, the object is also a Thenable that is resolved
* when the window is done closing, see T163510.
* opening of the window. For backwards-compatibility, the object is also a Thenable that is
* resolved when the window is done closing, see T163510.
* @fires closing
*/
OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
@ -1516,7 +1538,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
*
* This function can be called in two manners:
*
* 1. `.addWindows( [ windowA, windowB, ... ] )` (where `windowA`, `windowB` are OO.ui.Window objects)
* 1. `.addWindows( [ winA, winB, ... ] )` (where `winA`, `winB` are OO.ui.Window objects)
*
* This syntax registers windows under the symbolic names defined in their `.static.name`
* properties. For example, if `windowA.constructor.static.name` is `'nameA'`, calling
@ -1525,7 +1547,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
*
* This is the recommended way, as it allows for an easier switch to using a window factory.
*
* 2. `.addWindows( { nameA: windowA, nameB: windowB, ... } )`
* 2. `.addWindows( { nameA: winA, nameB: winB, ... } )`
*
* This syntax registers windows under the explicitly given symbolic names. In this example,
* calling `.openWindow( 'nameA' )` afterwards will open the window `windowA`, regardless of what
@ -1583,9 +1605,9 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
/**
* Remove the specified windows from the windows manager.
*
* Windows will be closed before they are removed. If you wish to remove all windows, you may wish to use
* the #clearWindows method instead. If you no longer need the window manager and want to ensure that it no
* longer listens to events, use the #destroy method.
* Windows will be closed before they are removed. If you wish to remove all windows, you may wish
* to use the #clearWindows method instead. If you no longer need the window manager and want to
* ensure that it no longer listens to events, use the #destroy method.
*
* @param {string[]} names Symbolic names of windows to remove
* @return {jQuery.Promise} Promise resolved when window is closed and removed
@ -1616,9 +1638,9 @@ OO.ui.WindowManager.prototype.removeWindows = function ( names ) {
/**
* Remove all windows from the window manager.
*
* Windows will be closed before they are removed. Note that the window manager, though not in use, will still
* listen to events. If the window manager will not be used again, you may wish to use the #destroy method instead.
* To remove just a subset of windows, use the #removeWindows method.
* Windows will be closed before they are removed. Note that the window manager, though not in use,
* will still listen to events. If the window manager will not be used again, you may wish to use
* the #destroy method instead. To remove just a subset of windows, use the #removeWindows method.
*
* @return {jQuery.Promise} Promise resolved when all windows are closed and removed
*/
@ -1747,9 +1769,9 @@ OO.ui.WindowManager.prototype.toggleAriaIsolation = function ( isolate ) {
/**
* Destroy the window manager.
*
* Destroying the window manager ensures that it will no longer listen to events. If you would like to
* continue using the window manager, but wish to remove all windows from it, use the #clearWindows method
* instead.
* Destroying the window manager ensures that it will no longer listen to events. If you would like
* to continue using the window manager, but wish to remove all windows from it, use the
* #clearWindows method instead.
*/
OO.ui.WindowManager.prototype.destroy = function () {
this.toggleGlobalEvents( false );
@ -1761,16 +1783,16 @@ OO.ui.WindowManager.prototype.destroy = function () {
/**
* A window is a container for elements that are in a child frame. They are used with
* a window manager (OO.ui.WindowManager), which is used to open and close the window and control
* its presentation. The size of a window is specified using a symbolic name (e.g., small, medium,
* large), which is interpreted by the window manager. If the requested size is not recognized,
* the window manager will choose a sensible fallback.
* its presentation. The size of a window is specified using a symbolic name (e.g., small,
* medium, large), which is interpreted by the window manager. If the requested size is not
* recognized, the window manager will choose a sensible fallback.
*
* The lifecycle of a window has three primary stages (opening, opened, and closing) in which
* different processes are executed:
*
* **opening**: The opening stage begins when the window manager's {@link OO.ui.WindowManager#openWindow
* openWindow} or the window's {@link #open open} methods are used, and the window manager begins to open
* the window.
* **opening**: The opening stage begins when the window manager's
* {@link OO.ui.WindowManager#openWindow openWindow} or the window's {@link #open open} methods are
* used, and the window manager begins to open the window.
*
* - {@link #getSetupProcess} method is called and its result executed
* - {@link #getReadyProcess} method is called and its result executed
@ -1779,15 +1801,17 @@ OO.ui.WindowManager.prototype.destroy = function () {
*
* **closing**: The closing stage begins when the window manager's
* {@link OO.ui.WindowManager#closeWindow closeWindow}
* or the window's {@link #close} methods are used, and the window manager begins to close the window.
* or the window's {@link #close} methods are used, and the window manager begins to close the
* window.
*
* - {@link #getHoldProcess} method is called and its result executed
* - {@link #getTeardownProcess} method is called and its result executed. The window is now closed
*
* Each of the window's processes (setup, ready, hold, and teardown) can be extended in subclasses
* by overriding the window's #getSetupProcess, #getReadyProcess, #getHoldProcess and #getTeardownProcess
* methods. Note that each {@link OO.ui.Process process} is executed in series, so asynchronous
* processing can complete. Always assume window processes are executed asynchronously.
* by overriding the window's #getSetupProcess, #getReadyProcess, #getHoldProcess and
* #getTeardownProcess methods. Note that each {@link OO.ui.Process process} is executed in series,
* so asynchronous processing can complete. Always assume window processes are executed
* asynchronously.
*
* For more information, please see the [OOUI documentation on MediaWiki] [1].
*
@ -1819,7 +1843,7 @@ OO.ui.Window = function OoUiWindow( config ) {
this.$frame = $( '<div>' );
/**
* Overlay element to use for the `$overlay` configuration option of widgets that support it.
* Things put inside of it are overlaid on top of the window and are not bound to its dimensions.
* Things put inside it are overlaid on top of the window and are not bound to its dimensions.
* See <https://www.mediawiki.org/wiki/OOUI/Concepts#Overlays>.
*
* MyDialog.prototype.initialize = function () {
@ -1828,7 +1852,7 @@ OO.ui.Window = function OoUiWindow( config ) {
* $overlay: this.$overlay,
* label: 'Popup button',
* popup: {
* $content: $( '<p>Popup contents.</p><p>Popup contents.</p><p>Popup contents.</p>' ),
* $content: $( '<p>Popup content.</p><p>More content.</p><p>Yet more content.</p>' ),
* padded: true
* }
* } );
@ -1852,7 +1876,6 @@ OO.ui.Window = function OoUiWindow( config ) {
this.$frame
.addClass( 'oo-ui-window-frame' )
.append( this.$focusTrapBefore, this.$content, this.$focusTrapAfter );
this.$element
.addClass( 'oo-ui-window' )
.append( this.$frame, this.$overlay );
@ -1921,8 +1944,8 @@ OO.ui.Window.prototype.isVisible = function () {
/**
* Check if the window is opening.
*
* This method is a wrapper around the window manager's {@link OO.ui.WindowManager#isOpening isOpening}
* method.
* This method is a wrapper around the window manager's
* {@link OO.ui.WindowManager#isOpening isOpening} method.
*
* @return {boolean} Window is opening
*/
@ -1933,7 +1956,8 @@ OO.ui.Window.prototype.isOpening = function () {
/**
* Check if the window is closing.
*
* This method is a wrapper around the window manager's {@link OO.ui.WindowManager#isClosing isClosing} method.
* This method is a wrapper around the window manager's
* {@link OO.ui.WindowManager#isClosing isClosing} method.
*
* @return {boolean} Window is closing
*/
@ -1944,7 +1968,8 @@ OO.ui.Window.prototype.isClosing = function () {
/**
* Check if the window is opened.
*
* This method is a wrapper around the window manager's {@link OO.ui.WindowManager#isOpened isOpened} method.
* This method is a wrapper around the window manager's
* {@link OO.ui.WindowManager#isOpened isOpened} method.
*
* @return {boolean} Window is opened
*/
@ -2417,7 +2442,9 @@ OO.ui.Window.prototype.hold = function ( data ) {
return this.getHoldProcess( data ).execute().then( function () {
// Get the focused element within the window's content
var $focus = win.$content.find( OO.ui.Element.static.getDocument( win.$content ).activeElement );
var $focus = win.$content.find(
OO.ui.Element.static.getDocument( win.$content ).activeElement
);
// Blur the focused element
if ( $focus.length ) {
@ -2433,8 +2460,8 @@ OO.ui.Window.prototype.hold = function ( data ) {
/**
* Teardown window.
*
* This is called by OO.ui.WindowManager during window closing (after the animation), and should not be called directly
* by other systems.
* This is called by OO.ui.WindowManager during window closing (after the animation), and should not
* be called directly by other systems.
*
* @param {Object} [data] Window closing data
* @return {jQuery.Promise} Promise resolved when window is torn down
@ -2454,7 +2481,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
/**
* The Dialog class serves as the base class for the other types of dialogs.
* Unless extended to include controls, the rendered dialog box is a simple window
* that users can close by hitting the Esc key. Dialog windows are used with OO.ui.WindowManager,
* that users can close by hitting the Escape key. Dialog windows are used with OO.ui.WindowManager,
* which opens, closes, and controls the presentation of the window. See the
* [OOUI documentation on MediaWiki] [1] for more information.
*
@ -2468,7 +2495,8 @@ OO.ui.Window.prototype.teardown = function ( data ) {
* MyDialog.prototype.initialize = function () {
* MyDialog.parent.prototype.initialize.call( this );
* this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
* this.content.$element.append( '<p>A simple dialog window. Press \'Esc\' to close.</p>' );
* this.content.$element.append( '<p>A simple dialog window. Press Escape key to ' +
* 'close.</p>' );
* this.$body.append( this.content.$element );
* };
* MyDialog.prototype.getBodyHeight = function () {
@ -2544,9 +2572,10 @@ OO.ui.Dialog.static.name = '';
/**
* The dialog title.
*
* The title can be specified as a plaintext string, a {@link OO.ui.mixin.LabelElement Label} node, or a function
* that will produce a Label node or string. The title can also be specified with data passed to the
* constructor (see #getSetupProcess). In this case, the static value will be overridden.
* The title can be specified as a plaintext string, a {@link OO.ui.mixin.LabelElement Label} node,
* or a function that will produce a Label node or string. The title can also be specified with data
* passed to the constructor (see #getSetupProcess). In this case, the static value will be
* overridden.
*
* @abstract
* @static
@ -2558,8 +2587,8 @@ OO.ui.Dialog.static.title = '';
/**
* An array of configured {@link OO.ui.ActionWidget action widgets}.
*
* Actions can also be specified with data passed to the constructor (see #getSetupProcess). In this case, the static
* value will be overridden.
* Actions can also be specified with data passed to the constructor (see #getSetupProcess). In this
* case, the static value will be overridden.
*
* [2]: https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs#Action_sets
*
@ -2570,7 +2599,7 @@ OO.ui.Dialog.static.title = '';
OO.ui.Dialog.static.actions = [];
/**
* Close the dialog when the 'Esc' key is pressed.
* Close the dialog when the Escape key is pressed.
*
* @static
* @abstract
@ -2643,9 +2672,10 @@ OO.ui.Dialog.prototype.getActions = function () {
/**
* Get a process for taking action.
*
* When you override this method, you can create a new OO.ui.Process and return it, or add additional
* accept steps to the process the parent method provides using the {@link OO.ui.Process#first 'first'}
* and {@link OO.ui.Process#next 'next'} methods of OO.ui.Process.
* When you override this method, you can create a new OO.ui.Process and return it, or add
* additional accept steps to the process the parent method provides using the
* {@link OO.ui.Process#first 'first'} and {@link OO.ui.Process#next 'next'} methods of
* OO.ui.Process.
*
* @param {string} [action] Symbolic name of action
* @return {OO.ui.Process} Action process
@ -2805,10 +2835,10 @@ OO.ui.Dialog.prototype.executeAction = function ( action ) {
*
* There are two basic types of message dialogs, confirmation and alert:
*
* - **confirmation**: the dialog title describes what a progressive action will do and the message provides
* more details about the consequences.
* - **alert**: the dialog title describes which event occurred and the message provides more information
* about why the event occurred.
* - **confirmation**: the dialog title describes what a progressive action will do and the message
* provides more details about the consequences.
* - **alert**: the dialog title describes which event occurred and the message provides more
* information about why the event occurred.
*
* The MessageDialog class specifies two actions: accept, the primary
* action (e.g., ok) and reject, the safe action (e.g., cancel). Both will close the window,
@ -2944,7 +2974,7 @@ OO.ui.MessageDialog.prototype.getActionProcess = function ( action ) {
* @param {jQuery|string|Function|null} [data.message] Description of the action's consequence
* @param {string} [data.size] Symbolic name of the dialog size, see OO.ui.Window
* @param {Object[]} [data.actions] List of OO.ui.ActionOptionWidget configuration options for each
* action item
* action item
*/
OO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {
data = data || {};
@ -3134,16 +3164,17 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
/**
* ProcessDialog windows encapsulate a {@link OO.ui.Process process} and all of the code necessary
* to complete it. If the process terminates with an error, a customizable {@link OO.ui.Error error
* interface} alerts users to the trouble, permitting the user to dismiss the error and try again when
* relevant. The ProcessDialog class is always extended and customized with the actions and content
* required for each process.
* interface} alerts users to the trouble, permitting the user to dismiss the error and try again
* when relevant. The ProcessDialog class is always extended and customized with the actions and
* content required for each process.
*
* The process dialog box consists of a header that visually represents the working state of long
* processes with an animation. The header contains the dialog title as well as
* two {@link OO.ui.ActionWidget action widgets}: a safe action on the left (e.g., Cancel) and
* a primary action on the right (e.g., Done).
*
* Like other windows, the process dialog is managed by a {@link OO.ui.WindowManager window manager}.
* Like other windows, the process dialog is managed by a
* {@link OO.ui.WindowManager window manager}.
* Please see the [OOUI documentation on MediaWiki][1] for more information and examples.
*
* @example
@ -3163,7 +3194,9 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
* MyProcessDialog.prototype.initialize = function () {
* MyProcessDialog.parent.prototype.initialize.apply( this, arguments );
* this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
* this.content.$element.append( '<p>This is a process dialog window. The header contains the title and two buttons: \'Cancel\' (a safe action) on the left and \'Done\' (a primary action) on the right.</p>' );
* this.content.$element.append( '<p>This is a process dialog window. The header ' +
* 'contains the title and two buttons: \'Cancel\' (a safe action) on the left and ' +
* '\'Done\' (a primary action) on the right.</p>' );
* this.$body.append( this.content.$element );
* };
* MyProcessDialog.prototype.getActionProcess = function ( action ) {
@ -3253,9 +3286,15 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
this.$errorsTitle = $( '<div>' );
// Events
this.dismissButton.connect( this, { click: 'onDismissErrorButtonClick' } );
this.retryButton.connect( this, { click: 'onRetryButtonClick' } );
this.title.connect( this, { labelChange: 'fitLabel' } );
this.dismissButton.connect( this, {
click: 'onDismissErrorButtonClick'
} );
this.retryButton.connect( this, {
click: 'onRetryButtonClick'
} );
this.title.connect( this, {
labelChange: 'fitLabel'
} );
// Initialization
this.title.$element.addClass( 'oo-ui-processDialog-title' );
@ -3296,7 +3335,10 @@ OO.ui.ProcessDialog.prototype.getActionWidgetConfig = function ( config ) {
// Change back buttons to icon only on mobile
if (
isMobile &&
( config.flags === 'back' || ( Array.isArray( config.flags ) && config.flags.indexOf( 'back' ) !== -1 ) )
(
config.flags === 'back' ||
( Array.isArray( config.flags ) && config.flags.indexOf( 'back' ) !== -1 )
)
) {
$.extend( config, {
icon: 'previous',
@ -3352,8 +3394,9 @@ OO.ui.ProcessDialog.prototype.setDimensions = function () {
this.fitLabel();
// If there are many actions, they might be shown on multiple lines. Their layout can change when
// resizing the dialog and when changing the actions. Adjust the height of the footer to fit them.
// If there are many actions, they might be shown on multiple lines. Their layout can change
// when resizing the dialog and when changing the actions. Adjust the height of the footer to
// fit them.
dialog.$body.css( 'bottom', dialog.$foot.outerHeight( true ) );
// Wait for CSS transition to finish and do it again :(
setTimeout( function () {
@ -3400,7 +3443,8 @@ OO.ui.ProcessDialog.prototype.fitLabel = function () {
// We have enough space to center the label
leftWidth = rightWidth = biggerWidth;
} else {
// Let's hope we at least have enough space not to overlap, because we can't wrap the label…
// Let's hope we at least have enough space not to overlap, because we can't wrap
// the label.
if ( this.getDir() === 'ltr' ) {
leftWidth = safeWidth;
rightWidth = primaryWidth;
@ -3447,7 +3491,7 @@ OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
this.$errorItems = $( items );
if ( recoverable ) {
abilities[ this.currentAction ] = true;
// Copy the flags from the first matching action
// Copy the flags from the first matching action.
actions = this.actions.get( { actions: this.currentAction } );
if ( actions.length ) {
this.retryButton.clearFlags().setFlags( actions[ 0 ].getFlags() );
@ -3486,7 +3530,7 @@ OO.ui.ProcessDialog.prototype.getTeardownProcess = function ( data ) {
// Parent method
return OO.ui.ProcessDialog.parent.prototype.getTeardownProcess.call( this, data )
.first( function () {
// Make sure to hide errors
// Make sure to hide errors.
this.hideErrors();
this.fitOnOpen = false;
}, this );
@ -3573,13 +3617,15 @@ OO.ui.confirm = function ( text, options ) {
/**
* Display a quick modal prompt dialog, using a OO.ui.MessageDialog. While the dialog is open,
* the rest of the page will be dimmed out and the user won't be able to interact with it. The
* dialog has a text input widget and two action buttons, one to confirm an operation (labelled "OK")
* and one to cancel it (labelled "Cancel").
* dialog has a text input widget and two action buttons, one to confirm an operation
* (labelled "OK") and one to cancel it (labelled "Cancel").
*
* A window manager is created automatically when this function is called for the first time.
*
* @example
* OO.ui.prompt( 'Choose a line to go to', { textInput: { placeholder: 'Line number' } } ).done( function ( result ) {
* OO.ui.prompt( 'Choose a line to go to', {
* textInput: { placeholder: 'Line number' }
* } ).done( function ( result ) {
* if ( result !== null ) {
* console.log( 'User typed "' + result + '" then clicked "OK".' );
* } else {
@ -3589,7 +3635,8 @@ OO.ui.confirm = function ( text, options ) {
*
* @param {jQuery|string} text Message text to display
* @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
* @param {Object} [options.textInput] Additional options for text input widget, see OO.ui.TextInputWidget
* @param {Object} [options.textInput] Additional options for text input widget,
* see OO.ui.TextInputWidget
* @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to
* confirm, the promise will resolve with the value of the text input widget; otherwise, it will
* resolve to `null`.

File diff suppressed because one or more lines are too long

View file

@ -14,6 +14,9 @@
"rtl": "../wikimediaui/images/icons/articles-rtl.svg"
}
},
"articleAdd": {
"file": "../wikimediaui/images/icons/articleAdd.svg"
},
"articleCheck": {
"file": "../wikimediaui/images/icons/articleCheck.svg"
},

View file

@ -20,9 +20,6 @@
"rtl": "../wikimediaui/images/icons/newspaper-rtl.svg"
}
},
"web": {
"file": "../wikimediaui/images/icons/web.svg"
},
"reference": {
"file": "../wikimediaui/images/icons/reference.svg"
},
@ -37,6 +34,10 @@
"ltr": "../wikimediaui/images/icons/references-ltr.svg",
"rtl": "../wikimediaui/images/icons/references-rtl.svg"
}
},
"web": {
"file": "../wikimediaui/images/icons/web.svg",
"deprecated": "Deprecated since v0.30.2, use 'browser' from 'interactions' pack instead."
}
}
}

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,14 +14,20 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {
"alert": {
"file": "images/icons/alert.svg",
"variants": [ "warning" ]
"variants": [
"error",
"warning"
]
},
"bell": {
"file": "images/icons/bell.svg"

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {
@ -31,6 +34,9 @@
"rtl": "images/icons/articles-rtl.svg"
}
},
"articleAdd": {
"file": "images/icons/articleAdd.svg"
},
"articleCheck": {
"file": "images/icons/articleCheck.svg"
},
@ -74,7 +80,11 @@
"ltr": "images/icons/tag-ltr.svg",
"rtl": "images/icons/tag-rtl.svg"
},
"variants": [ "destructive", "warning" ]
"variants": [
"destructive",
"error",
"warning"
]
},
"upload": {
"file": "images/icons/upload.svg"

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {
@ -43,6 +46,18 @@
"hieroglyph": {
"file": "images/icons/hieroglyph.svg"
},
"imageLayoutBasic": {
"file": "images/icons/imageLayoutBasic.svg"
},
"imageLayoutFrame": {
"file": "images/icons/imageLayoutFrame.svg"
},
"imageLayoutFrameless": {
"file": "images/icons/imageLayoutFrameless.svg"
},
"imageLayoutThumbnail": {
"file": "images/icons/imageLayoutThumbnail.svg"
},
"language": {
"file": "images/icons/language.svg"
},

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {
@ -37,9 +40,6 @@
"rtl": "images/icons/newspaper-rtl.svg"
}
},
"web": {
"file": "images/icons/web.svg"
},
"reference": {
"file": "images/icons/reference.svg"
},
@ -54,6 +54,10 @@
"ltr": "images/icons/references-ltr.svg",
"rtl": "images/icons/references-rtl.svg"
}
},
"web": {
"file": "images/icons/web.svg",
"deprecated": "Deprecated since v0.30.2, use 'browser' from 'interactions' pack instead."
}
}
}

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -14,8 +14,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

View file

@ -13,8 +13,11 @@
"destructive": {
"color": "#d33"
},
"error": {
"color": "#d33"
},
"warning": {
"color": "#ff5d00"
"color": "#fc3"
}
},
"images": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 B

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>alert</title><path fill="#d33" d="M19.64 16.36L11.53 2.3A1.85 1.85 0 0 0 10 1.21 1.85 1.85 0 0 0 8.48 2.3L.36 16.36C-.48 17.81.21 19 1.88 19h16.24c1.67 0 2.36-1.19 1.52-2.64zM11 16H9v-2h2zm0-4H9V6h2z"/></svg>

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 290 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>alert</title><path fill="#ff5d00" d="M19.64 16.36L11.53 2.3A1.85 1.85 0 0 0 10 1.21 1.85 1.85 0 0 0 8.48 2.3L.36 16.36C-.48 17.81.21 19 1.88 19h16.24c1.67 0 2.36-1.19 1.52-2.64zM11 16H9v-2h2zm0-4H9V6h2z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>alert</title><path fill="#fc3" d="M19.64 16.36L11.53 2.3A1.85 1.85 0 0 0 10 1.21 1.85 1.85 0 0 0 8.48 2.3L.36 16.36C-.48 17.81.21 19 1.88 19h16.24c1.67 0 2.36-1.19 1.52-2.64zM11 16H9v-2h2zm0-4H9V6h2z"/></svg>

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 336 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align center</title><g fill="#fff"><path d="M1 15h18v2H1zM1 3h18v2H1z"/><rect width="8" height="6" x="6" y="7" rx="1" ry="1"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align center</title><g fill="#fff"><path d="M1 15h18v2H1zM1 3h18v2H1z"/><rect width="8" height="6" x="6" y="7" rx="1"/></g></svg>

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 257 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align center</title><g fill="#36c"><path d="M1 15h18v2H1zM1 3h18v2H1z"/><rect width="8" height="6" x="6" y="7" rx="1" ry="1"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align center</title><g fill="#36c"><path d="M1 15h18v2H1zM1 3h18v2H1z"/><rect width="8" height="6" x="6" y="7" rx="1"/></g></svg>

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 257 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align center</title><path d="M1 15h18v2H1zM1 3h18v2H1z"/><rect width="8" height="6" x="6" y="7" rx="1" ry="1"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align center</title><path d="M1 15h18v2H1zM1 3h18v2H1z"/><rect width="8" height="6" x="6" y="7" rx="1"/></svg>

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 238 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><g fill="#fff"><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1" ry="1"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><g fill="#fff"><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1"/></g></svg>

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 280 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><g fill="#36c"><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1" ry="1"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><g fill="#36c"><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1"/></g></svg>

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 280 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1" ry="1"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1"/></svg>

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 261 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><g fill="#fff"><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1" ry="1"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><g fill="#fff"><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1"/></g></svg>

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 279 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><g fill="#36c"><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1" ry="1"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><g fill="#36c"><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1"/></g></svg>

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 279 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1" ry="1"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1"/></svg>

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>add article</title><path fill="#fff" d="M15 1H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 10h-4v4H9v-4H5V9h4V5h2v4h4v2z"/></svg>

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>add article</title><path fill="#36c" d="M15 1H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 10h-4v4H9v-4H5V9h4V5h2v4h4v2z"/></svg>

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>add article</title><path d="M15 1H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 10h-4v4H9v-4H5V9h4V5h2v4h4v2z"/></svg>

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

After

Width:  |  Height:  |  Size: 234 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>camera</title><path fill="#fff" d="M13 11a3 3 0 1 0-3 3 3 3 0 0 0 3-3zm-3 5a5 5 0 1 1 5-5 5 5 0 0 1-5 5zM6.42 2.56l-.67.64a2 2 0 0 1-1.38.56H2a1.89 1.89 0 0 0-2 1.75v10.54a1.89 1.89 0 0 0 2 1.76h16a1.89 1.89 0 0 0 2-1.76V5.51a1.89 1.89 0 0 0-2-1.76h-2.37a2 2 0 0 1-1.38-.56l-.67-.64A2 2 0 0 0 12.2 2H7.8a2 2 0 0 0-1.38.56z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>camera</title><g fill="#fff"><path d="M10 16c-4.455 0-6.685-5.386-3.535-8.535C9.615 4.315 15 6.545 15 11a5 5 0 0 1-5 5zM6.42 2.56l-.67.64c-.37.357-.865.808-1.38.81H2C.914 4 0 4.712 0 5.76v10.48C0 17.27 1 18 2 18h16c1 0 2-.716 2-1.76V5.76C20 4.723 19 4 18 4h-2.37c-.515-.002-1.01-.453-1.38-.81l-.67-.64A2 2 0 0 0 12.2 2H7.8a2 2 0 0 0-1.38.56z"/><circle cx="10" cy="11" r="3"/></g></svg>

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

After

Width:  |  Height:  |  Size: 318 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>camera</title><path fill="#36c" d="M13 11a3 3 0 1 0-3 3 3 3 0 0 0 3-3zm-3 5a5 5 0 1 1 5-5 5 5 0 0 1-5 5zM6.42 2.56l-.67.64a2 2 0 0 1-1.38.56H2a1.89 1.89 0 0 0-2 1.75v10.54a1.89 1.89 0 0 0 2 1.76h16a1.89 1.89 0 0 0 2-1.76V5.51a1.89 1.89 0 0 0-2-1.76h-2.37a2 2 0 0 1-1.38-.56l-.67-.64A2 2 0 0 0 12.2 2H7.8a2 2 0 0 0-1.38.56z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>camera</title><g fill="#36c"><path d="M10 16c-4.455 0-6.685-5.386-3.535-8.535C9.615 4.315 15 6.545 15 11a5 5 0 0 1-5 5zM6.42 2.56l-.67.64c-.37.357-.865.808-1.38.81H2C.914 4 0 4.712 0 5.76v10.48C0 17.27 1 18 2 18h16c1 0 2-.716 2-1.76V5.76C20 4.723 19 4 18 4h-2.37c-.515-.002-1.01-.453-1.38-.81l-.67-.64A2 2 0 0 0 12.2 2H7.8a2 2 0 0 0-1.38.56z"/><circle cx="10" cy="11" r="3"/></g></svg>

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 235 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>camera</title><path d="M13 11a3 3 0 1 0-3 3 3 3 0 0 0 3-3zm-3 5a5 5 0 1 1 5-5 5 5 0 0 1-5 5zM6.42 2.56l-.67.64a2 2 0 0 1-1.38.56H2a1.89 1.89 0 0 0-2 1.75v10.54a1.89 1.89 0 0 0 2 1.76h16a1.89 1.89 0 0 0 2-1.76V5.51a1.89 1.89 0 0 0-2-1.76h-2.37a2 2 0 0 1-1.38-.56l-.67-.64A2 2 0 0 0 12.2 2H7.8a2 2 0 0 0-1.38.56z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>camera</title><path d="M10 16c-4.455 0-6.685-5.386-3.535-8.535C9.615 4.315 15 6.545 15 11a5 5 0 0 1-5 5zM6.42 2.56l-.67.64c-.37.357-.865.808-1.38.81H2C.914 4 0 4.712 0 5.76v10.48C0 17.27 1 18 2 18h16c1 0 2-.716 2-1.76V5.76C20 4.723 19 4 18 4h-2.37c-.515-.002-1.01-.453-1.38-.81l-.67-.64A2 2 0 0 0 12.2 2H7.8a2 2 0 0 0-1.38.56z"/><circle cx="10" cy="11" r="3"/></svg>

Before

Width:  |  Height:  |  Size: 447 B

After

Width:  |  Height:  |  Size: 494 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20"><title>code</title><g fill="#fff"><path id="left-bracket" d="M1 10.08V8.92h1.15c1.15 0 1.15 0 1.15-1.15V5a7.42 7.42 0 0 1 .09-1.3 2 2 0 0 1 .3-.7 1.84 1.84 0 0 1 .93-.68A6.44 6.44 0 0 1 6.74 2h1.18v1.15h-.86A1.32 1.32 0 0 0 6 3.62a1.71 1.71 0 0 0-.36 1.23V7a3.22 3.22 0 0 1-.28 1.72 2 2 0 0 1-1.26.77 2.15 2.15 0 0 1 1.26.79A3.26 3.26 0 0 1 5.62 12v3.15A1.67 1.67 0 0 0 6 16.37a1.31 1.31 0 0 0 1.08.47h.87V18H6.74a6.3 6.3 0 0 1-2.12-.29 1.82 1.82 0 0 1-.93-.71 1.94 1.94 0 0 1-.3-.72A7.46 7.46 0 0 1 3.31 15v-3.77c0-1.15 0-1.15-1.15-1.15zm18 0V8.92h-1.15c-1.15 0-1.15 0-1.15-1.15V5a7.42 7.42 0 0 0-.08-1.32 2 2 0 0 0-.3-.73 1.84 1.84 0 0 0-.93-.68A6.44 6.44 0 0 0 13.26 2h-1.18v1.15h.87a1.32 1.32 0 0 1 1.05.47 1.71 1.71 0 0 1 .36 1.23V7a3.22 3.22 0 0 0 .28 1.72 2 2 0 0 0 1.26.77 2.15 2.15 0 0 0-1.26.79 3.26 3.26 0 0 0-.26 1.72v3.15a1.67 1.67 0 0 1-.38 1.22 1.31 1.31 0 0 1-1.08.47h-.87V18h1.19a6.3 6.3 0 0 0 2.12-.29 1.82 1.82 0 0 0 .93-.68 1.94 1.94 0 0 0 .3-.72 7.46 7.46 0 0 0 .1-1.31v-3.77c0-1.15 0-1.15 1.15-1.15z"/><use id="right-bracket" width="20" height="20" transform="matrix(-1 0 0 1 20 0)" xlink:href="#left-bracket"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20"><title>code</title><g fill="#fff"><path id="a" d="M1 10.08V8.92h1.15c1.15 0 1.15 0 1.15-1.15V5a7.42 7.42 0 0 1 .09-1.3 2 2 0 0 1 .3-.7 1.84 1.84 0 0 1 .93-.68A6.44 6.44 0 0 1 6.74 2h1.18v1.15h-.86A1.32 1.32 0 0 0 6 3.62a1.71 1.71 0 0 0-.36 1.23V7a3.22 3.22 0 0 1-.28 1.72 2 2 0 0 1-1.26.77 2.15 2.15 0 0 1 1.26.79A3.26 3.26 0 0 1 5.62 12v3.15A1.67 1.67 0 0 0 6 16.37a1.31 1.31 0 0 0 1.08.47h.87V18H6.74a6.3 6.3 0 0 1-2.12-.29 1.82 1.82 0 0 1-.93-.71 1.94 1.94 0 0 1-.3-.72A7.46 7.46 0 0 1 3.31 15v-3.77c0-1.15 0-1.15-1.15-1.15zm18 0V8.92h-1.15c-1.15 0-1.15 0-1.15-1.15V5a7.42 7.42 0 0 0-.08-1.32 2 2 0 0 0-.3-.73 1.84 1.84 0 0 0-.93-.68A6.44 6.44 0 0 0 13.26 2h-1.18v1.15h.87a1.32 1.32 0 0 1 1.05.47 1.71 1.71 0 0 1 .36 1.23V7a3.22 3.22 0 0 0 .28 1.72 2 2 0 0 0 1.26.77 2.15 2.15 0 0 0-1.26.79 3.26 3.26 0 0 0-.26 1.72v3.15a1.67 1.67 0 0 1-.38 1.22 1.31 1.31 0 0 1-1.08.47h-.87V18h1.19a6.3 6.3 0 0 0 2.12-.29 1.82 1.82 0 0 0 .93-.68 1.94 1.94 0 0 0 .3-.72 7.46 7.46 0 0 0 .1-1.31v-3.77c0-1.15 0-1.15 1.15-1.15z"/><use transform="matrix(-1 0 0 1 20 0)" xlink:href="#a"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20"><title>code</title><g fill="#36c"><path id="left-bracket" d="M1 10.08V8.92h1.15c1.15 0 1.15 0 1.15-1.15V5a7.42 7.42 0 0 1 .09-1.3 2 2 0 0 1 .3-.7 1.84 1.84 0 0 1 .93-.68A6.44 6.44 0 0 1 6.74 2h1.18v1.15h-.86A1.32 1.32 0 0 0 6 3.62a1.71 1.71 0 0 0-.36 1.23V7a3.22 3.22 0 0 1-.28 1.72 2 2 0 0 1-1.26.77 2.15 2.15 0 0 1 1.26.79A3.26 3.26 0 0 1 5.62 12v3.15A1.67 1.67 0 0 0 6 16.37a1.31 1.31 0 0 0 1.08.47h.87V18H6.74a6.3 6.3 0 0 1-2.12-.29 1.82 1.82 0 0 1-.93-.71 1.94 1.94 0 0 1-.3-.72A7.46 7.46 0 0 1 3.31 15v-3.77c0-1.15 0-1.15-1.15-1.15zm18 0V8.92h-1.15c-1.15 0-1.15 0-1.15-1.15V5a7.42 7.42 0 0 0-.08-1.32 2 2 0 0 0-.3-.73 1.84 1.84 0 0 0-.93-.68A6.44 6.44 0 0 0 13.26 2h-1.18v1.15h.87a1.32 1.32 0 0 1 1.05.47 1.71 1.71 0 0 1 .36 1.23V7a3.22 3.22 0 0 0 .28 1.72 2 2 0 0 0 1.26.77 2.15 2.15 0 0 0-1.26.79 3.26 3.26 0 0 0-.26 1.72v3.15a1.67 1.67 0 0 1-.38 1.22 1.31 1.31 0 0 1-1.08.47h-.87V18h1.19a6.3 6.3 0 0 0 2.12-.29 1.82 1.82 0 0 0 .93-.68 1.94 1.94 0 0 0 .3-.72 7.46 7.46 0 0 0 .1-1.31v-3.77c0-1.15 0-1.15 1.15-1.15z"/><use id="right-bracket" width="20" height="20" transform="matrix(-1 0 0 1 20 0)" xlink:href="#left-bracket"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20"><title>code</title><g fill="#36c"><path id="a" d="M1 10.08V8.92h1.15c1.15 0 1.15 0 1.15-1.15V5a7.42 7.42 0 0 1 .09-1.3 2 2 0 0 1 .3-.7 1.84 1.84 0 0 1 .93-.68A6.44 6.44 0 0 1 6.74 2h1.18v1.15h-.86A1.32 1.32 0 0 0 6 3.62a1.71 1.71 0 0 0-.36 1.23V7a3.22 3.22 0 0 1-.28 1.72 2 2 0 0 1-1.26.77 2.15 2.15 0 0 1 1.26.79A3.26 3.26 0 0 1 5.62 12v3.15A1.67 1.67 0 0 0 6 16.37a1.31 1.31 0 0 0 1.08.47h.87V18H6.74a6.3 6.3 0 0 1-2.12-.29 1.82 1.82 0 0 1-.93-.71 1.94 1.94 0 0 1-.3-.72A7.46 7.46 0 0 1 3.31 15v-3.77c0-1.15 0-1.15-1.15-1.15zm18 0V8.92h-1.15c-1.15 0-1.15 0-1.15-1.15V5a7.42 7.42 0 0 0-.08-1.32 2 2 0 0 0-.3-.73 1.84 1.84 0 0 0-.93-.68A6.44 6.44 0 0 0 13.26 2h-1.18v1.15h.87a1.32 1.32 0 0 1 1.05.47 1.71 1.71 0 0 1 .36 1.23V7a3.22 3.22 0 0 0 .28 1.72 2 2 0 0 0 1.26.77 2.15 2.15 0 0 0-1.26.79 3.26 3.26 0 0 0-.26 1.72v3.15a1.67 1.67 0 0 1-.38 1.22 1.31 1.31 0 0 1-1.08.47h-.87V18h1.19a6.3 6.3 0 0 0 2.12-.29 1.82 1.82 0 0 0 .93-.68 1.94 1.94 0 0 0 .3-.72 7.46 7.46 0 0 0 .1-1.31v-3.77c0-1.15 0-1.15 1.15-1.15z"/><use transform="matrix(-1 0 0 1 20 0)" xlink:href="#a"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20"><title>code</title><path id="left-bracket" d="M1 10.08V8.92h1.15c1.15 0 1.15 0 1.15-1.15V5a7.42 7.42 0 0 1 .09-1.3 2 2 0 0 1 .3-.7 1.84 1.84 0 0 1 .93-.68A6.44 6.44 0 0 1 6.74 2h1.18v1.15h-.86A1.32 1.32 0 0 0 6 3.62a1.71 1.71 0 0 0-.36 1.23V7a3.22 3.22 0 0 1-.28 1.72 2 2 0 0 1-1.26.77 2.15 2.15 0 0 1 1.26.79A3.26 3.26 0 0 1 5.62 12v3.15A1.67 1.67 0 0 0 6 16.37a1.31 1.31 0 0 0 1.08.47h.87V18H6.74a6.3 6.3 0 0 1-2.12-.29 1.82 1.82 0 0 1-.93-.71 1.94 1.94 0 0 1-.3-.72A7.46 7.46 0 0 1 3.31 15v-3.77c0-1.15 0-1.15-1.15-1.15zm18 0V8.92h-1.15c-1.15 0-1.15 0-1.15-1.15V5a7.42 7.42 0 0 0-.08-1.32 2 2 0 0 0-.3-.73 1.84 1.84 0 0 0-.93-.68A6.44 6.44 0 0 0 13.26 2h-1.18v1.15h.87a1.32 1.32 0 0 1 1.05.47 1.71 1.71 0 0 1 .36 1.23V7a3.22 3.22 0 0 0 .28 1.72 2 2 0 0 0 1.26.77 2.15 2.15 0 0 0-1.26.79 3.26 3.26 0 0 0-.26 1.72v3.15a1.67 1.67 0 0 1-.38 1.22 1.31 1.31 0 0 1-1.08.47h-.87V18h1.19a6.3 6.3 0 0 0 2.12-.29 1.82 1.82 0 0 0 .93-.68 1.94 1.94 0 0 0 .3-.72 7.46 7.46 0 0 0 .1-1.31v-3.77c0-1.15 0-1.15 1.15-1.15z"/><use id="right-bracket" width="20" height="20" transform="matrix(-1 0 0 1 20 0)" xlink:href="#left-bracket"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20"><title>code</title><path id="a" d="M1 10.08V8.92h1.15c1.15 0 1.15 0 1.15-1.15V5a7.42 7.42 0 0 1 .09-1.3 2 2 0 0 1 .3-.7 1.84 1.84 0 0 1 .93-.68A6.44 6.44 0 0 1 6.74 2h1.18v1.15h-.86A1.32 1.32 0 0 0 6 3.62a1.71 1.71 0 0 0-.36 1.23V7a3.22 3.22 0 0 1-.28 1.72 2 2 0 0 1-1.26.77 2.15 2.15 0 0 1 1.26.79A3.26 3.26 0 0 1 5.62 12v3.15A1.67 1.67 0 0 0 6 16.37a1.31 1.31 0 0 0 1.08.47h.87V18H6.74a6.3 6.3 0 0 1-2.12-.29 1.82 1.82 0 0 1-.93-.71 1.94 1.94 0 0 1-.3-.72A7.46 7.46 0 0 1 3.31 15v-3.77c0-1.15 0-1.15-1.15-1.15zm18 0V8.92h-1.15c-1.15 0-1.15 0-1.15-1.15V5a7.42 7.42 0 0 0-.08-1.32 2 2 0 0 0-.3-.73 1.84 1.84 0 0 0-.93-.68A6.44 6.44 0 0 0 13.26 2h-1.18v1.15h.87a1.32 1.32 0 0 1 1.05.47 1.71 1.71 0 0 1 .36 1.23V7a3.22 3.22 0 0 0 .28 1.72 2 2 0 0 0 1.26.77 2.15 2.15 0 0 0-1.26.79 3.26 3.26 0 0 0-.26 1.72v3.15a1.67 1.67 0 0 1-.38 1.22 1.31 1.31 0 0 1-1.08.47h-.87V18h1.19a6.3 6.3 0 0 0 2.12-.29 1.82 1.82 0 0 0 .93-.68 1.94 1.94 0 0 0 .3-.72 7.46 7.46 0 0 0 .1-1.31v-3.77c0-1.15 0-1.15 1.15-1.15z"/><use transform="matrix(-1 0 0 1 20 0)" xlink:href="#a"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

After

Width:  |  Height:  |  Size: 223 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>eye</title><path fill="#fff" d="M10 7.5a2.5 2.5 0 1 0 2.5 2.5A2.5 2.5 0 0 0 10 7.5zm0 7a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5zM10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>eye</title><g fill="#fff"><path d="M10 14.5a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5zM10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7z"/><circle cx="10" cy="10" r="2.5"/></g></svg>

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 292 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>eye</title><path fill="#36c" d="M10 7.5a2.5 2.5 0 1 0 2.5 2.5A2.5 2.5 0 0 0 10 7.5zm0 7a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5zM10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>eye</title><g fill="#36c"><path d="M10 14.5a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5zM10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7z"/><circle cx="10" cy="10" r="2.5"/></g></svg>

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 216 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>eye</title><path d="M10 7.5a2.5 2.5 0 1 0 2.5 2.5A2.5 2.5 0 0 0 10 7.5zm0 7a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5zM10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>eye</title><path d="M10 14.5a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5zM10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7z"/><circle cx="10" cy="10" r="2.5"/></svg>

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 291 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#fff"><path d="M19 16L2 12a3.83 3.83 0 0 1-1-2.5A3.83 3.83 0 0 1 2 7l17-4z"/><rect width="4" height="8" x="4" y="9" rx="2" ry="2"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#fff"><path d="M19 16L2 12a3.83 3.83 0 0 1-1-2.5A3.83 3.83 0 0 1 2 7l17-4z"/><rect width="4" height="8" x="4" y="9" rx="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 287 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#36c"><path d="M19 16L2 12a3.83 3.83 0 0 1-1-2.5A3.83 3.83 0 0 1 2 7l17-4z"/><rect width="4" height="8" x="4" y="9" rx="2" ry="2"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#36c"><path d="M19 16L2 12a3.83 3.83 0 0 1-1-2.5A3.83 3.83 0 0 1 2 7l17-4z"/><rect width="4" height="8" x="4" y="9" rx="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 287 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><path d="M19 16L2 12a3.83 3.83 0 0 1-1-2.5A3.83 3.83 0 0 1 2 7l17-4z"/><rect width="4" height="8" x="4" y="9" rx="2" ry="2"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><path d="M19 16L2 12a3.83 3.83 0 0 1-1-2.5A3.83 3.83 0 0 1 2 7l17-4z"/><rect width="4" height="8" x="4" y="9" rx="2"/></svg>

Before

Width:  |  Height:  |  Size: 275 B

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

After

Width:  |  Height:  |  Size: 186 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#fff"><path d="M1 3l17 4c.6.7 1 1.6 1 2.5 0 .9-.4 1.8-1 2.5L1 16V3z"/><path d="M16 11v4c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2z"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#fff"><path d="M1 3l17 4c.6.7 1 1.6 1 2.5 0 .9-.4 1.8-1 2.5L1 16V3z"/><rect width="4" height="8" x="12" y="9" rx="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 B

After

Width:  |  Height:  |  Size: 226 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#36c"><path d="M1 3l17 4c.6.7 1 1.6 1 2.5 0 .9-.4 1.8-1 2.5L1 16V3z"/><path d="M16 11v4c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2z"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><g fill="#36c"><path d="M1 3l17 4c.6.7 1 1.6 1 2.5 0 .9-.4 1.8-1 2.5L1 16V3z"/><rect width="4" height="8" x="12" y="9" rx="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><path d="M1 3l17 4c.6.7 1 1.6 1 2.5 0 .9-.4 1.8-1 2.5L1 16V3z"/><path d="M16 11v4c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>feedback</title><path d="M1 3l17 4c.6.7 1 1.6 1 2.5 0 .9-.4 1.8-1 2.5L1 16V3z"/><rect width="4" height="8" x="12" y="9" rx="2"/></svg>

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 B

After

Width:  |  Height:  |  Size: 217 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0zM8 17a1.89 1.89 0 0 1 1.77-2H10a1.87 1.87 0 0 1 2 1.73 1.22 1.22 0 0 1 0 .27 1.87 1.87 0 0 1-1.73 2 1.22 1.22 0 0 1-.27 0 1.88 1.88 0 0 1-2-1.75A1 1 0 0 1 8 17z"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0z"/><circle cx="10" cy="17" r="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 584 B

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 B

After

Width:  |  Height:  |  Size: 296 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0zM8 17a1.89 1.89 0 0 1 1.77-2H10a1.87 1.87 0 0 1 2 1.73 1.22 1.22 0 0 1 0 .27 1.87 1.87 0 0 1-1.73 2 1.22 1.22 0 0 1-.27 0 1.88 1.88 0 0 1-2-1.75A1 1 0 0 1 8 17z"/></g></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0z"/><circle cx="10" cy="17" r="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 584 B

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 215 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0zM8 17a1.89 1.89 0 0 1 1.77-2H10a1.87 1.87 0 0 1 2 1.73 1.22 1.22 0 0 1 0 .27 1.87 1.87 0 0 1-1.73 2 1.22 1.22 0 0 1-.27 0 1.88 1.88 0 0 1-2-1.75A1 1 0 0 1 8 17z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0z"/><circle cx="10" cy="17" r="2"/></svg>

Before

Width:  |  Height:  |  Size: 565 B

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 B

After

Width:  |  Height:  |  Size: 217 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path fill="#fff" d="M5.49.01A4.72 4.72 0 0 1 10 4.9H7.46v-.17a2.31 2.31 0 0 0-2.38-2.22h-.19a2.1 2.1 0 0 0-2.06 2.14c0 1.18.45 1.81 1.79 2.71a3.86 3.86 0 0 1 2 3.84v.81H4.11v-.68c0-1.18-.4-1.79-1.82-2.71A4.59 4.59 0 0 1 0 4.54C0 1.9 2 .01 4.94.01a5 5 0 0 1 .55 0zM7 16.26a1.88 1.88 0 0 1-2 1.75 1.22 1.22 0 0 1-.27 0 1.86 1.86 0 0 1-1.73-2 1.22 1.22 0 0 1 0-.27 1.87 1.87 0 0 1 2-1.73h.23a1.89 1.89 0 0 1 1.77 2 1 1 0 0 1 0 .25z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><g fill="#fff"><path d="M5.49.01A4.72 4.72 0 0 1 10 4.9H7.46v-.17a2.31 2.31 0 0 0-2.38-2.22h-.19a2.1 2.1 0 0 0-2.06 2.14c0 1.18.45 1.81 1.79 2.71a3.86 3.86 0 0 1 2 3.84v.81H4.11v-.68c0-1.18-.4-1.79-1.82-2.71A4.59 4.59 0 0 1 0 4.54C0 1.9 2 .01 4.94.01a5 5 0 0 1 .55 0z"/><circle cx="5" cy="16" r="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 578 B

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 311 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path fill="#36c" d="M5.49.01A4.72 4.72 0 0 1 10 4.9H7.46v-.17a2.31 2.31 0 0 0-2.38-2.22h-.19a2.1 2.1 0 0 0-2.06 2.14c0 1.18.45 1.81 1.79 2.71a3.86 3.86 0 0 1 2 3.84v.81H4.11v-.68c0-1.18-.4-1.79-1.82-2.71A4.59 4.59 0 0 1 0 4.54C0 1.9 2 .01 4.94.01a5 5 0 0 1 .55 0zM7 16.26a1.88 1.88 0 0 1-2 1.75 1.22 1.22 0 0 1-.27 0 1.86 1.86 0 0 1-1.73-2 1.22 1.22 0 0 1 0-.27 1.87 1.87 0 0 1 2-1.73h.23a1.89 1.89 0 0 1 1.77 2 1 1 0 0 1 0 .25z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><g fill="#36c"><path d="M5.49.01A4.72 4.72 0 0 1 10 4.9H7.46v-.17a2.31 2.31 0 0 0-2.38-2.22h-.19a2.1 2.1 0 0 0-2.06 2.14c0 1.18.45 1.81 1.79 2.71a3.86 3.86 0 0 1 2 3.84v.81H4.11v-.68c0-1.18-.4-1.79-1.82-2.71A4.59 4.59 0 0 1 0 4.54C0 1.9 2 .01 4.94.01a5 5 0 0 1 .55 0z"/><circle cx="5" cy="16" r="2"/></g></svg>

Before

Width:  |  Height:  |  Size: 578 B

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 216 B

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path d="M5.49.01A4.72 4.72 0 0 1 10 4.9H7.46v-.17a2.31 2.31 0 0 0-2.38-2.22h-.19a2.1 2.1 0 0 0-2.06 2.14c0 1.18.45 1.81 1.79 2.71a3.86 3.86 0 0 1 2 3.84v.81H4.11v-.68c0-1.18-.4-1.79-1.82-2.71A4.59 4.59 0 0 1 0 4.54C0 1.9 2 .01 4.94.01a5 5 0 0 1 .55 0zM7 16.26a1.88 1.88 0 0 1-2 1.75 1.22 1.22 0 0 1-.27 0 1.86 1.86 0 0 1-1.73-2 1.22 1.22 0 0 1 0-.27 1.87 1.87 0 0 1 2-1.73h.23a1.89 1.89 0 0 1 1.77 2 1 1 0 0 1 0 .25z"/></svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path d="M5.49.01A4.72 4.72 0 0 1 10 4.9H7.46v-.17a2.31 2.31 0 0 0-2.38-2.22h-.19a2.1 2.1 0 0 0-2.06 2.14c0 1.18.45 1.81 1.79 2.71a3.86 3.86 0 0 1 2 3.84v.81H4.11v-.68c0-1.18-.4-1.79-1.82-2.71A4.59 4.59 0 0 1 0 4.54C0 1.9 2 .01 4.94.01a5 5 0 0 1 .55 0z"/><circle cx="5" cy="16" r="2"/></svg>

Before

Width:  |  Height:  |  Size: 566 B

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>image layout basic</title><g fill="#fff"><path d="M20-.5h-.5V0h.5v-.5zm-2.5 0H17V0h.5v-.5zM15-.5h-.5V0h.5v-.5zm-2.5 0H12V0h.5v-.5zM10-.5h-.5V0h.5v-.5zm-2.5 0H7V0h.5v-.5zM5-.5h-.5V0H5v-.5zm-2.5 0H2V0h.5v-.5zM0 0h-.5v.5H0V0zm0 2.5h-.5V3H0v-.5zM0 5h-.5v.5H0V5zm0 2.5h-.5V8H0v-.5zM0 10h-.5v.5H0V10zm0 2.5h-.5v.5H0v-.5zM0 15h-.5v.5H0V15zm0 2.5h-.5v.5H0v-.5zM.5 20H0v.5h.5V20zM3 20h-.5v.5H3V20zm2.5 0H5v.5h.5V20zM8 20h-.5v.5H8V20zm2.5 0H10v.5h.5V20zm2.5 0h-.5v.5h.5V20zm2.5 0H15v.5h.5V20zm2.5 0h-.5v.5h.5V20zm2.5-.5H20v.5h.5v-.5zm0-2.5H20v.5h.5V17zm0-2.5H20v.5h.5v-.5zm0-2.5H20v.5h.5V12zm0-2.5H20v.5h.5v-.5zm0-2.5H20v.5h.5V7zm0-2.5H20V5h.5v-.5zm0-2.5H20v.5h.5V2zM1 3v14h18V3zm17 13H2V4h16z"/><path d="M8.58 14h.81l3.11-4 3 4H17l-4.5-6L9 12.51 6.5 9.5 3 14h1.56l1.94-2.5L8.58 14z"/></g></svg>

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Some files were not shown because too many files have changed in this diff Show more