commit 0f71ae6e3c0a64a2aee0651a00ed4a230d25999f Author: jinhojang6 Date: Thu Aug 31 23:09:23 2023 +0900 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff5cadc --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +/.idea + +# pwa +/public/sw* +/public/workbox-* + +.env +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +public/feed.xml + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel + +firebase.js diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..55aa84b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM mediawiki + +RUN apt-get update && apt-get install vim -y + +EXPOSE 8080 \ No newline at end of file diff --git a/LocalSettings.php b/LocalSettings.php new file mode 100644 index 0000000..f5ea704 --- /dev/null +++ b/LocalSettings.php @@ -0,0 +1,142 @@ + "$wgResourceBasePath/resources/assets/change-your-logo.svg", + 'icon' => "$wgResourceBasePath/resources/assets/change-your-logo-icon.svg", +]; + +## UPO means: this is also a user preference option + +$wgEnableEmail = true; +$wgEnableUserEmail = true; # UPO + +$wgEmergencyContact = ""; +$wgPasswordSender = ""; + +$wgEnotifUserTalk = false; # UPO +$wgEnotifWatchlist = false; # UPO +$wgEmailAuthentication = true; + +## Database settings +$wgDBtype = "mysql"; +$wgDBserver = "database"; +$wgDBname = "wiki"; +$wgDBuser = "admin"; +$wgDBpassword = "610BnHyDFXz"; + +# MySQL specific settings +$wgDBprefix = ""; + +# MySQL table options to use during installation or update +$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary"; + +# Shared database table +# This has no effect unless $wgSharedDB is also set. +$wgSharedTables[] = "actor"; + +## Shared memory settings +$wgMainCacheType = CACHE_NONE; +$wgMemCachedServers = []; + +## To enable image uploads, make sure the 'images' directory +## is writable, then set this to true: +$wgEnableUploads = false; +$wgUseImageMagick = true; +$wgImageMagickConvertCommand = "/usr/bin/convert"; + +# InstantCommons allows wiki to use images from https://commons.wikimedia.org +$wgUseInstantCommons = false; + +# Periodically send a pingback to https://www.mediawiki.org/ with basic data +# about this MediaWiki instance. The Wikimedia Foundation shares this data +# with MediaWiki developers to help guide future development efforts. +$wgPingback = true; + +# Site language code, should be one of the list in ./includes/languages/data/Names.php +$wgLanguageCode = "en"; + +# Time zone +$wgLocaltimezone = "UTC"; + +## Set $wgCacheDirectory to a writable directory on the web server +## to make your wiki go slightly faster. The directory should not +## be publicly accessible from the web. +#$wgCacheDirectory = "$IP/cache"; + +$wgSecretKey = "f4c6e639c9ce3ed1b5d12bd356250574b73bf9f633f45d99462c17b8cc1fdf4a"; + +# Changing this will log out all existing sessions. +$wgAuthenticationTokenVersion = "1"; + +# Site upgrade key. Must be set to a string (default provided) to turn on the +# web installer while LocalSettings.php is in place +$wgUpgradeKey = "cc6cdc359727f97d"; + +## For attaching licensing metadata to pages, and displaying an +## appropriate copyright notice / icon. GNU Free Documentation +## License and Creative Commons licenses are supported so far. +$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright +$wgRightsUrl = ""; +$wgRightsText = ""; +$wgRightsIcon = ""; + +# Path to the GNU diff3 utility. Used for conflict resolution. +$wgDiff3 = "/usr/bin/diff3"; + +## Default skin: you can change the default skin. Use the internal symbolic +## names, e.g. 'vector' or 'monobook': +$wgDefaultSkin = "vector-2022"; + +error_reporting( -1 ); +ini_set( 'display_errors', 1 ); + +$wgShowExceptionDetails = true; +$wgShowDBErrorBacktrace = true; + +# Enabled skins. +# The following skins were automatically enabled: +wfLoadSkin( 'MinervaNeue' ); +wfLoadSkin( 'MonoBook' ); +wfLoadSkin( 'Timeless' ); +wfLoadSkin( 'Vector' ); + + +# End of automatically generated settings. +# Add more configuration options below. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..9e9d12c --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +## Install + +1. Make sure to comment out `- ./LocalSettings.php:/var/www/html/LocalSettings.php` in `docker-compose.yaml` and run `docker-compose up --build -d`. An error will be raised if you use an existing `LocalSettings.php`. + +2. Visit `http://localhost:8080/` + +3. Click `Please set up the wiki first.` and select a language + +4. Continue + +5. Set up database + +Database host: database (must be the same as the container name of mariadb) + +Database name: (must be the same as MYSQL_DATABASE of docker-compose.yaml) + +Database username: (must be the same as MYSQL_USER of docker-compose.yaml) + +Database password: (must be the same as MYSQL_PASSWORD of docker-compose.yaml) + +6. Continue + +7. Set up wiki admin account and select `I'm bored already, just install the wiki.` if a detailed configuration is not needed. + +8. Continue + +9. `LocalSettings.php` will be downloaded automatically. + +10. Stop all the containers with `docker-compose down` and Put `LocalSettings.php` in the root directory of the repo. + +11. (Important) Change `$wgDefaultSkin = "vector";` to `$wgDefaultSkin = "vector-2022";` in `LocalSettings.php` + +12. (Optional) Add the following lines below `$wgDefaultSkin` in order to display errors in your browser, if any. This will help you enable error display and debugging features for your MediaWiki installation. + +``` +error_reporting( -1 ); +ini_set( 'display_errors', 1 ); + +$wgShowExceptionDetails = true; +$wgShowDBErrorBacktrace = true; +``` + +13. (Important) Uncomment `- ./LocalSettings.php:/var/www/html/LocalSettings.php` in `docker-compose.yaml` to apply the configuration in `LocalSettings.php` + +14. run `docker-compose up --build -d` again. + +15. Sign in with the admin account + + +## Checking files + +``` +docker exec -it --user=root {container id from docker ps} bash + +e.g., +docker exec -it --user=root 24a696c42c95 bash +``` + +## Installing Vim editor inside container + +``` +apt-get update + +apt-get install vim +``` + +## Customizing CSS + +Vector/resources/common/variable.less + +- Change the hex code of @background-color-secondary + +## MediaWiki References + +- [Github](https://github.com/wikimedia/mediawiki) + +- [Manual:How to make a MediaWiki skin](https://www.mediawiki.org/wiki/Manual:How_to_make_a_MediaWiki_skin) + +- [Custom pages](https://github.com/wikimedia/mediawiki/tree/master/includes/specialpage) + +- [Object Factory](https://www.mediawiki.org/wiki/ObjectFactory) \ No newline at end of file diff --git a/Vector/.eslintignore b/Vector/.eslintignore new file mode 100644 index 0000000..ae7d35d --- /dev/null +++ b/Vector/.eslintignore @@ -0,0 +1,7 @@ +/.storybook/ +/docs/ +/a11y/ +/i18n/ +/node_modules/ +/vendor/ +/coverage/ diff --git a/Vector/.eslintrc.json b/Vector/.eslintrc.json new file mode 100644 index 0000000..7d2bfaa --- /dev/null +++ b/Vector/.eslintrc.json @@ -0,0 +1,17 @@ +{ + "root": true, + "extends": [ + "wikimedia/client-es5", + "wikimedia/jquery", + "wikimedia/mediawiki" + ], + "rules": { + "//": [ + "off", + "ResourceLoader's `packageFiles` do not require wrapping but the `module` option is only available in ES6+." + ], + "no-implicit-globals": "off", + "compat/compat": "warn", + "mediawiki/class-doc": "off" + } +} diff --git a/Vector/.eslintrcEs6.json b/Vector/.eslintrcEs6.json new file mode 100644 index 0000000..ca258a2 --- /dev/null +++ b/Vector/.eslintrcEs6.json @@ -0,0 +1,28 @@ +{ + "root": true, + "extends": [ + "wikimedia/client-es6", + "wikimedia/jquery", + "wikimedia/mediawiki" + ], + "env": { + "browser": true + }, + "globals": { + "exports": true + }, + "parserOptions": { + "sourceType": "module" + }, + "settings": { + "jsdoc": { + "preferredTypes": { + "VectorHeaderObserver": "VectorHeaderObserver" + } + } + }, + "rules": { + "compat/compat": "off", + "mediawiki/class-doc": "off" + } +} diff --git a/Vector/.gitignore b/Vector/.gitignore new file mode 100644 index 0000000..487a81d --- /dev/null +++ b/Vector/.gitignore @@ -0,0 +1,51 @@ +# git-deploy status file: +/.deploy + +# Editors +*.kate-swp +*~ +\#*# +.#* +.*.swp +.project +cscope.files +cscope.out +## NetBeans +nbproject* +project.index +## Sublime +sublime-* +sftp-config.json + +# Building & testing +/composer.lock +/docs +/a11y +/node_modules +/vendor +/coverage + +# Operating systems +## Mac OS X +.DS_Store +## Windows +Thumbs.db + +# Misc +.buildpath +.classpath +.idea +.metadata* +.settings +/static* +/tags +/.htaccess +/.htpasswd +.eslintcache + +# storybook +/.storybook/resolve-less-imports/ +/.storybook/resolve-imports/ +/.storybook/integration.less +.vscode +/.phpunit.result.cache diff --git a/Vector/.gitreview b/Vector/.gitreview new file mode 100644 index 0000000..079c01f --- /dev/null +++ b/Vector/.gitreview @@ -0,0 +1,6 @@ +[gerrit] +host=gerrit.wikimedia.org +port=29418 +project=mediawiki/skins/Vector.git +track=1 +defaultrebase=0 diff --git a/Vector/.nvmrc b/Vector/.nvmrc new file mode 100644 index 0000000..431076a --- /dev/null +++ b/Vector/.nvmrc @@ -0,0 +1 @@ +16.16.0 diff --git a/Vector/.phan/config.php b/Vector/.phan/config.php new file mode 100644 index 0000000..3f56d7d --- /dev/null +++ b/Vector/.phan/config.php @@ -0,0 +1,19 @@ + + + + . + + + diff --git a/Vector/.storybook/common.less b/Vector/.storybook/common.less new file mode 100644 index 0000000..542af74 --- /dev/null +++ b/Vector/.storybook/common.less @@ -0,0 +1,28 @@ +@import '../resources/common/variables.less'; +@import './integration.less'; +@import './icons.less'; + +body { + font-family: @font-family-sans; + margin: 0; +} + +a { + text-decoration: none; +} + +ul { + padding: 0; +} + +#mw-panel { + background-color: @background-color-secondary; +} + +.printfooter { + display: none; +} + +.vector-storybook-example-table tr { + vertical-align: top; +} \ No newline at end of file diff --git a/Vector/.storybook/config.js b/Vector/.storybook/config.js new file mode 100644 index 0000000..368134d --- /dev/null +++ b/Vector/.storybook/config.js @@ -0,0 +1,5 @@ +import { configure } from '@storybook/html'; +import './common.less'; + +// automatically import all files ending in *.stories.js +configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/Vector/.storybook/icons.less b/Vector/.storybook/icons.less new file mode 100644 index 0000000..a89580e --- /dev/null +++ b/Vector/.storybook/icons.less @@ -0,0 +1,100 @@ +.vector-menu-dropdown .vector-menu-heading:after { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23202122' d='m11.05 3.996-.965-1.053-4.035 3.86-3.947-3.86L1.05 3.996l5 5 5-5'/%3E%3C/svg%3E%0A") !important; +} + +.mw-wiki-logo { + background-image: url(https://en.wikipedia.org/static/images/project-logos/enwiki-2x.png); + background-size: 135px auto; +} + +.oo-ui-icon-bell { + opacity: 0.51; + background-image: linear-gradient(transparent,transparent), + url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3Ebell%3C/title%3E%3Cpath d=%22M16 7a5.38 5.38 0 0 0-4.46-4.85C11.6 1.46 11.53 0 10 0S8.4 1.46 8.46 2.15A5.38 5.38 0 0 0 4 7v6l-2 2v1h16v-1l-2-2zm-6 13a3 3 0 0 0 3-3H7a3 3 0 0 0 3 3z%22/%3E%3C/svg%3E"); +} + +.oo-ui-icon-tray { + background-image: linear-gradient(transparent,transparent), + url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3Etray%3C/title%3E%3Cpath d=%22M3 1a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm14 12h-4l-1 2H8l-1-2H3V3h14z%22/%3E%3C/svg%3E"); +} + +.mw-ui-icon-add:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elanguage%3C/title%3E%3Cg fill='%2354595d'%3E%3Cpath d='M11 9V4H9v5H4v2h5v5h2v-5h5V9z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.mw-ui-icon-add-invert:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elanguage%3C/title%3E%3Cg fill='white'%3E%3Cpath d='M11 9V4H9v5H4v2h5v5h2v-5h5V9z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.mw-ui-icon-add-progressive:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elanguage%3C/title%3E%3Cg fill='%23447ff5'%3E%3Cpath d='M11 9V4H9v5H4v2h5v5h2v-5h5V9z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.mw-ui-icon-add-destructive:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elanguage%3C/title%3E%3Cg fill='%23ff4242'%3E%3Cpath d='M11 9V4H9v5H4v2h5v5h2v-5h5V9z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.uls-trigger { + background-image: linear-gradient(transparent,transparent), + url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Ctitle%3E language %3C/title%3E %3Cpath d=%22M20 18h-1.44a.61.61 0 0 1-.4-.12.81.81 0 0 1-.23-.31L17 15h-5l-1 2.54a.77.77 0 0 1-.22.3.59.59 0 0 1-.4.14H9l4.55-11.47h1.89zm-3.53-4.31L14.89 9.5a11.62 11.62 0 0 1-.39-1.24q-.09.37-.19.69l-.19.56-1.58 4.19zm-6.3-1.58a13.43 13.43 0 0 1-2.91-1.41 11.46 11.46 0 0 0 2.81-5.37H12V4H7.31a4 4 0 0 0-.2-.56C6.87 2.79 6.6 2 6.6 2l-1.47.5s.4.89.6 1.5H0v1.33h2.15A11.23 11.23 0 0 0 5 10.7a17.19 17.19 0 0 1-5 2.1q.56.82.87 1.38a23.28 23.28 0 0 0 5.22-2.51 15.64 15.64 0 0 0 3.56 1.77zM3.63 5.33h4.91a8.11 8.11 0 0 1-2.45 4.45 9.11 9.11 0 0 1-2.46-4.45z%22/%3E %3C/svg%3E") !important; +} + +.mw-ui-icon-wikimedia-language:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elanguage%3C/title%3E%3Cg fill='%2354595d'%3E%3Cpath d='M20 18h-1.44a.61.61 0 01-.4-.12.81.81 0 01-.23-.31L17 15h-5l-1 2.54a.77.77 0 01-.22.3.59.59 0 01-.4.14H9l4.55-11.47h1.89zm-3.53-4.31L14.89 9.5a11.62 11.62 0 01-.39-1.24q-.09.37-.19.69l-.19.56-1.58 4.19zm-6.3-1.58a13.43 13.43 0 01-2.91-1.41 11.46 11.46 0 002.81-5.37H12V4H7.31a4 4 0 00-.2-.56C6.87 2.79 6.6 2 6.6 2l-1.47.5s.4.89.6 1.5H0v1.33h2.15A11.23 11.23 0 005 10.7a17.19 17.19 0 01-5 2.1q.56.82.87 1.38a23.28 23.28 0 005.22-2.51 15.64 15.64 0 003.56 1.77zM3.63 5.33h4.91a8.11 8.11 0 01-2.45 4.45 9.11 9.11 0 01-2.46-4.45z'/%3E%3C/g%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-userTalk:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Euser talk%3C/title%3E%3Cpath d='M18 0H2a2 2 0 00-2 2v18l4-4h14a2 2 0 002-2V2a2 2 0 00-2-2zm-4 4a1.5 1.5 0 11-1.5 1.5A1.5 1.5 0 0114 4zM6 4a1.5 1.5 0 11-1.5 1.5A1.5 1.5 0 016 4zm4 8c-2.61 0-4.83-.67-5.65-3h11.3c-.82 2.33-3.04 3-5.65 3z'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-sandbox:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Esandbox%3C/title%3E%3Cpath d='M8 12V9l6-6 3 3-6 6H8zm10-7l-3-3 2-2 3 3-2 2zM8 2h2v2H8zM4 2h2v2H4zM0 3a1 1 0 011-1h1v2H0V3zm0 3h2v2H0zm0 4h2v2H0zm0 4h2v2H0zm0 4h2v2H1a1 1 0 01-1-1v-1zm4 0h2v2H4zm4 0h2v2H8zm4 0h2v1a1 1 0 01-1 1h-1v-2zm0-4h2v2h-2z'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-settings:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Esettings%3C/title%3E%3Cg transform='translate(10 10)'%3E%3Cpath id='a' d='M1.5-10h-3l-1 6.5h5m0 7h-5l1 6.5h3'/%3E%3Cuse transform='rotate(45)' xlink:href='%23a'/%3E%3Cuse transform='rotate(90)' xlink:href='%23a'/%3E%3Cuse transform='rotate(135)' xlink:href='%23a'/%3E%3C/g%3E%3Cpath d='M10 2.5a7.5 7.5 0 000 15 7.5 7.5 0 000-15v4a3.5 3.5 0 010 7 3.5 3.5 0 010-7'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-unStar:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Eun-star%3C/title%3E%3Cpath d='M20 7h-7L10 .5 7 7H0l5.46 5.47-1.64 7 6.18-3.7 6.18 3.73-1.63-7z'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-userContributions:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Euser contributions%3C/title%3E%3Ccircle cx='2' cy='4' r='2'/%3E%3Ccircle cx='2' cy='10' r='2'/%3E%3Ccircle cx='2' cy='16' r='2'/%3E%3Ccircle cx='15.5' cy='10.5' r='2.5'/%3E%3Cpath d='M6 15h3v2H6zm0-6h5v2H6zm0-6h11v2H6zm9.5 10.556c-3.33 0-4.5 1.666-4.5 2.777V18h9v-1.667c0-1.11-1.17-2.777-4.5-2.777z'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-logIn:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elog in%3C/title%3E%3Cpath d='M1 11v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v6h8V5l4.75 5L9 15v-4H1z'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-logOut:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Elog out%3C/title%3E%3Cpath d='M3 3h8V1H3a2 2 0 00-2 2v14a2 2 0 002 2h8v-2H3z'/%3E%3Cpath d='M13 5v4H5v2h8v4l6-5z'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-ellipsis:before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Eellipsis%3C/title%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Ccircle cx='3' cy='10' r='2'/%3E%3Ccircle cx='17' cy='10' r='2'/%3E%3C/svg%3E%0A"); +} + +.mw-ui-icon-wikimedia-search:before { + background-image: url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%3E%3Ctitle%3Esearch%3C%2Ftitle%3E%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M12.2%2013.6a7%207%200%20111.4-1.4l5.4%205.4-1.4%201.4-5.4-5.4zM13%208A5%205%200%20113%208a5%205%200%200110%200z%22%2F%3E%3C%2Fsvg%3E"); +} + +.mw-ui-icon-wikimedia-userAvatar:before { + background-image: url("data:image/svg+xml;charset=utf8,%3C?xml version='1.0' encoding='UTF-8'?%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3Euser avatar%3C/title%3E%3Cpath d='M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z'/%3E%3Ccircle cx='10' cy='5.5' r='4.5'/%3E%3C/svg%3E"); +} + +.mw-ui-icon-wikimedia-watchlist:before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3E watchlist %3C/title%3E%3Cpath d='M1 3h16v2H1V3Zm0 6h6v2H1V9Zm0 6h8v2H1v-2Zm8-4.24h3.85L14.5 7l1.65 3.76H20l-3 3.17.9 4.05-3.4-2.14L11.1 18l.9-4.05-3-3.19Z'/%3E%3C/svg%3E") +} + +.vector-user-menu-legacy #pt-anonuserpage, +.vector-user-menu-legacy #pt-userpage a { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAx0lEQVQ4jdXSzQmEQAwFYEuYUixhSwgkA8mQgKXYgS3YgXZgCZagHWgHuxf14t8osssGcv145CVJvjk+hBRFK2TrkK1D0cqHkN7CUBRI7L21KAqXMIDModiwD9oAkLlH0i3L+ooGiTWPAPPfJQTIHLGOB9h46YZnKS+3PI8PISW2GkV7FO2Jrb79h4+ODyElsYJYm437NSRWRCWdylgj++U0u+UAZI5E22hsWW03UWQtr2NT66zlCjz8uzNQbFiDN7F5/xB8aj57Ynp2FKI0bAAAAABJRU5ErkJggg==") !important; +} + +.mw-ui-icon-wikimedia-speechBubbles:before { + background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3Espeech bubbles%3C/title%3E%3Cg fill=%22%23000%22%3E%3Cpath d=%22M17 4v7a2 2 0 01-2 2H4v1a2 2 0 002 2h10l4 4V6a2 2 0 00-2-2zM6 10H0v6z%22/%3E%3Crect width=%2216%22 height=%2212%22 rx=%222%22/%3E%3C/g%3E%3C/svg%3E"); +} +.mw-ui-icon-wikimedia-history:before { + background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3Ehistory%3C/title%3E%3Cg fill=%22%23000%22%3E%3Cpath d=%22M9 6v5h.06l2.48 2.47 1.41-1.41L11 10.11V6z%22/%3E%3Cpath d=%22M10 1a9 9 0 00-7.85 13.35L.5 16H6v-5.5l-2.38 2.38A7 7 0 1110 17v2a9 9 0 000-18z%22/%3E%3C/g%3E%3C/svg%3E"); +} diff --git a/Vector/.storybook/webpack.config.js b/Vector/.storybook/webpack.config.js new file mode 100644 index 0000000..a567d9a --- /dev/null +++ b/Vector/.storybook/webpack.config.js @@ -0,0 +1,79 @@ +const path = require( 'path' ); + +module.exports = { + resolve: { + alias: { + // FIXME: These imports should be updated in the story files instead of here. + '../resources/skins.vector.styles/Footer.less': '../resources/common/components/Footer.less', + '../resources/skins.vector.styles/LanguageButton.less': '../resources/skins.vector.styles/components/LanguageButton.less', + '../resources/skins.vector.styles/skin-legacy.less': '../resources/skins.vector.styles.legacy/skin-legacy.less', + '../resources/skins.vector.styles/Logo.less': '../resources/skins.vector.styles/components/Logo.less', + '../resources/skins.vector.styles/Menu.less': '../resources/common/components/Menu.less', + '../.storybook/common.less': '../resources/common/common.less', + '../resources/skins.vector.styles/MenuDropdown.less': '../resources/common/components/MenuDropdown.less', + '../resources/skins.vector.styles/MenuPortal.less': '../resources/skins.vector.styles/components/MenuPortal.less', + '../resources/skins.vector.styles/MenuTabs.less': '../resources/common/components/MenuTabs.less', + '../resources/skins.vector.styles/TabWatchstarLink.less': '../resources/common/components/TabWatchstarLink.less', + '../resources/skins.vector.styles/SearchBox.less': '../resources/common/components/SearchBox.less', + '../resources/skins.vector.styles/MainMenu.less': '../resources/skins.vector.styles/components/MainMenu.less', + '../resources/skins.vector.styles/SidebarLogo.less': '../resources/common/components/SidebarLogo.less', + '../resources/skins.vector.styles/MenuPortal.less': '../resources/skins.vector.styles/components/MenuPortal.less' + } + }, + module: { + rules: [ { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + // Beware of https://github.com/babel/babel-loader/issues/690. Changes to browsers require + // manual invalidation. + cacheDirectory: true + } + } + }, + { + test: /\.css$/, + use: [ { + loader: 'style-loader' + }, { + loader: 'css-loader' + } ] + }, + { + test: /\.(gif|png|jpe?g|svg)$/i, + loader: 'file-loader', + options: { + paths: [ + path.resolve( __dirname, './resolve-imports' ) + ] + } + }, + { + // in core some LESS imports don't specify filename + test: /\.less$/, + use: [ { + loader: 'style-loader' + }, { + loader: 'css-loader', + options: { + // FIXME: Disable resolving of CSS urls until Storybook is upgraded + // to use Webpack 5 and array values for aliases + // (which would cleanly resolve urls in LESS partial starting with `url(images/...)` ) + url: false + } + }, { + loader: 'less-loader', + options: { + relativeUrls: true, + strictUnits: true, + paths: [ + path.resolve( __dirname, 'resolve-imports' ) + ] + } + } ] + }, + ] + } +}; diff --git a/Vector/.stylelintignore b/Vector/.stylelintignore new file mode 100644 index 0000000..ac45104 --- /dev/null +++ b/Vector/.stylelintignore @@ -0,0 +1,6 @@ +/.storybook/ +/docs/ +/node_modules/ +/skinStyles/jquery.ui/ +/vendor/ +/coverage/ diff --git a/Vector/.stylelintrc.json b/Vector/.stylelintrc.json new file mode 100644 index 0000000..57686e5 --- /dev/null +++ b/Vector/.stylelintrc.json @@ -0,0 +1,13 @@ +{ + "extends": [ + "stylelint-config-wikimedia/support-modern", + "stylelint-config-wikimedia/mediawiki" + ], + "reportNeedlessDisables": true, + "rules": { + "declaration-property-unit-disallowed-list": null, + "no-descending-specificity": null, + "selector-class-pattern": null, + "selector-max-id": null + } +} diff --git a/Vector/.svgo.config.js b/Vector/.svgo.config.js new file mode 100644 index 0000000..492f687 --- /dev/null +++ b/Vector/.svgo.config.js @@ -0,0 +1,40 @@ +/** + * SVGO Configuration + * Compatible to v2.4.0+ + * Recommended options from: + * https://www.mediawiki.org/wiki/Manual:Coding_conventions/SVG#Exemplified_safe_configuration + */ +module.exports = { + plugins: [ + { + // Set of built-in plugins enabled by default. + name: 'preset-default', + params: { + overrides: { + cleanupIDs: false, + removeDesc: false, + removeTitle: false, + removeViewBox: false, + // If the SVG doesn't start with an XML declaration, then its MIME type will + // be detected as "text/plain" rather than "image/svg+xml" by libmagic and, + // consequently, MediaWiki's CSSMin CSS minifier. libmagic's default database + // currently requires that SVGs contain an XML declaration: + // https://github.com/threatstack/libmagic/blob/master/magic/Magdir/sgml#L5 + removeXMLProcInst: false + } + } + }, + 'removeRasterImages', + 'sortAttrs' + ], + // Set whitespace according to Wikimedia Coding Conventions. + // @see https://github.com/svg/svgo/blob/v2.8.0/lib/stringifier.js#L41 for available options. + js2svg: { + eol: 'lf', + finalNewline: true, + // Configure the indent to tabs (default 4 spaces) used by `--pretty` here. + indent: '\t', + pretty: true + }, + multipass: true +}; diff --git a/Vector/CODE_OF_CONDUCT.md b/Vector/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..498acf7 --- /dev/null +++ b/Vector/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct). diff --git a/Vector/COPYING b/Vector/COPYING new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/Vector/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Vector/Doxyfile b/Vector/Doxyfile new file mode 100644 index 0000000..63b0896 --- /dev/null +++ b/Vector/Doxyfile @@ -0,0 +1,36 @@ +PROJECT_NAME = Vector +PROJECT_BRIEF = "Vector is a skin for MediaWiki. Vector has been the default skin on all Wikimedia wikis since 2010." + +OUTPUT_DIRECTORY = docs +HTML_OUTPUT = php + +# Intepret the first line of a comment as a brief description? +JAVADOC_AUTOBRIEF = YES +QT_AUTOBRIEF = YES + +WARN_NO_PARAMDOC = YES + +INPUT = . +EXCLUDE_PATTERNS = doc docs vendor node_modules tests +FILE_PATTERNS = *.php + +# Search through subdirectories for input files? +RECURSIVE = YES + +# NOTE: USE_MDFILE_AS_MAINPAGE requires that the specified file is included as an input file. +USE_MDFILE_AS_MAINPAGE = ./README.md +INPUT += ./README.md + +HTML_DYNAMIC_SECTIONS = YES +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 + +GENERATE_LATEX = NO + +HAVE_DOT = YES +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 12 +TEMPLATE_RELATIONS = YES + +# Makes dot run faster. Requires graphviz >1.8.10 +DOT_MULTI_TARGETS = YES diff --git a/Vector/README.md b/Vector/README.md new file mode 100644 index 0000000..3ec8712 --- /dev/null +++ b/Vector/README.md @@ -0,0 +1,53 @@ +Vector Skin +======================== + +Installation +------------ + +See . + +### Configuration options + +See [skin.json](skin.json). + +Development +----------- + +### Node version + +It is recommended to use [nvm](https://github.com/nvm-sh/nvm) to use the version of node defined +in `.nvmrc` during local development. This ensures consistency amongst development environments. + +### Coding conventions + +We strive for compliance with MediaWiki conventions: + + + +Additions and deviations from those conventions that are more tailored to this +project are noted at: + + + +### Pre-commit tests + +A pre-commit hook is installed when executing `npm install`. By default, it runs +`npm test` which is useful for automatically validating everything that can be +in a reasonable amount of time. If you wish to defer these tests to be executed +by continuous integration only, set the `PRE_COMMIT` environment variable to `0`: + +```bash +$ export PRE_COMMIT=0 +$ git commit +``` + +Or more succinctly: + +```bash +$ PRE_COMMIT=0 git commit +``` + +Skipping the pre-commit tests has no impact on Gerrit change identifier hooks. + +### Hooks +See [hooks.txt](hooks.txt). diff --git a/Vector/bundlesize.config.json b/Vector/bundlesize.config.json new file mode 100644 index 0000000..a25311c --- /dev/null +++ b/Vector/bundlesize.config.json @@ -0,0 +1,22 @@ +[ + { + "resourceModule": "skins.vector.styles.legacy", + "maxSize": "8.4 kB" + }, + { + "resourceModule": "skins.vector.styles", + "maxSize": "12.2 kB" + }, + { + "resourceModule": "skins.vector.legacy.js", + "maxSize": "2.2 kB" + }, + { + "resourceModule": "skins.vector.search", + "maxSize": "3.2 kB" + }, + { + "resourceModule": "skins.vector.icons", + "maxSize": "1 kB" + } +] diff --git a/Vector/composer.json b/Vector/composer.json new file mode 100644 index 0000000..0a6424d --- /dev/null +++ b/Vector/composer.json @@ -0,0 +1,61 @@ +{ + "name": "mediawiki/vector-skin", + "type": "mediawiki-skin", + "description": "Modern version of the MonoBook skin", + "keywords": [ + "wiki", + "MediaWiki", + "skin" + ], + "homepage": "https://www.mediawiki.org/wiki/Skin:Vector", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Trevor Parscal" + }, + { + "name": "Roan Kattouw" + } + ], + "support": { + "wiki": "https://www.mediawiki.org/wiki/Skin:Vector", + "forum": "https://www.mediawiki.org/wiki/Skin_talk:Vector", + "source": "http://gerrit.wikimedia.org/g/mediawiki/skins/Vector", + "irc": "irc://irc.libera.chat/mediawiki" + }, + "require": { + "composer/installers": ">1.0.12" + }, + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "installer-name": "Vector" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "39.0.0", + "mediawiki/mediawiki-phan-config": "0.11.1", + "mediawiki/minus-x": "1.1.1", + "php-parallel-lint/php-console-highlighter": "1.0.0", + "php-parallel-lint/php-parallel-lint": "1.3.2" + }, + "scripts": { + "fix": [ + "minus-x fix .", + "phpcbf" + ], + "test": [ + "parallel-lint . --exclude node_modules --exclude vendor", + "@phpcs", + "minus-x check ." + ], + "test:size": "php ../../vendor/phpunit/phpunit/phpunit -c ../../phpunit.xml.dist tests/phpunit/structure/BundleSizeTest.php", + "phan": "phan -d . --long-progress-bar", + "phpcs": "phpcs -sp --cache" + }, + "config": { + "allow-plugins": { + "composer/installers": true + } + } +} diff --git a/Vector/dev-scripts/setup-storybook.sh b/Vector/dev-scripts/setup-storybook.sh new file mode 100755 index 0000000..14afa5f --- /dev/null +++ b/Vector/dev-scripts/setup-storybook.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' + +mkdir -p .storybook/resolve-imports/mediawiki.ui +mkdir -p .storybook/resolve-imports/assets + +rm -f .storybook/resolve-imports/mediawiki.skin.variables.less +cp resources/mediawiki.less/mediawiki.skin.variables.less .storybook/resolve-imports/ + +# Fetch resources via curl, `-sSL` silently, Show only errors, Location header and also with a 3XX response code. +curl -sS "https://www.mediawiki.org/w/load.php?only=styles&skin=vector&debug=true&modules=ext.echo.styles.badge|ext.uls.pt|wikibase.client.init|mediawiki.skinning.interface|mediawiki.ui.icon|mediawiki.ui.button" -o .storybook/integration.less +curl -sSL "https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/resources/src/mediawiki.less/mediawiki.skin.defaults.less?format=TEXT" | base64 --decode > .storybook/resolve-imports/mediawiki.skin.defaults.less +curl -sSL "https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/resources/src/mediawiki.less/mediawiki.mixins.less?format=TEXT" | base64 --decode > .storybook/resolve-imports/mediawiki.mixins.less +curl -sSL "https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/resources/src/mediawiki.less/mediawiki.ui/variables.less?format=TEXT" | base64 --decode > .storybook/resolve-imports/mediawiki.ui/variables.less +curl -sSL "https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/resources/src/mediawiki.less/mediawiki.mixins.rotation.less?format=TEXT" | base64 --decode > .storybook/resolve-imports/mediawiki.mixins.rotation.less +curl -sSL "https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/resources/src/mediawiki.less/mediawiki.mixins.animation.less?format=TEXT" | base64 --decode > .storybook/resolve-imports/mediawiki.mixins.animation.less +curl -sS "https://en.m.wikipedia.org/static/images/mobile/copyright/wikipedia-wordmark-en.svg" -o ".storybook/resolve-imports/assets/wordmark.svg" +curl -sS "https://en.m.wikipedia.org/static/images/mobile/copyright/wikipedia.png" -o ".storybook/resolve-imports/assets/icon.png" +curl -sS "https://en.wikipedia.org/static/images/mobile/copyright/wikipedia-tagline-en.svg" -o ".storybook/resolve-imports/assets/tagline.svg" + +# Add less variable support +echo "@msg-parentheses-start: '(';" >> .storybook/resolve-imports/mediawiki.skin.defaults.less +echo "@msg-parentheses-end: ')';" >> .storybook/resolve-imports/mediawiki.skin.defaults.less \ No newline at end of file diff --git a/Vector/gitinfo.json b/Vector/gitinfo.json new file mode 100644 index 0000000..246fa8c --- /dev/null +++ b/Vector/gitinfo.json @@ -0,0 +1 @@ +{"head": "c81a1413395428c483ac2d6fde668ba1520684e8\n", "headSHA1": "c81a1413395428c483ac2d6fde668ba1520684e8\n", "headCommitDate": "1693464040", "branch": "c81a1413395428c483ac2d6fde668ba1520684e8\n", "remoteURL": "https://gerrit-replica.wikimedia.org/r/mediawiki/skins/Vector"} \ No newline at end of file diff --git a/Vector/i18n/aae.json b/Vector/i18n/aae.json new file mode 100644 index 0000000..0971a58 --- /dev/null +++ b/Vector/i18n/aae.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Ftillimi", + "Martindimaggio" + ] + }, + "vector-languages": "Gljuh", + "vector-language-button-label": "{{PLURAL:$1|$1 gljuh}}", + "vector-no-language-button-label": "Vu gnatrë gljuh", + "vector-action-addsection": "Jungir gnë argument", + "vector-action-delete": "Kançilar", + "vector-action-move": "Tunde", + "vector-action-protect": "Mbroj", + "vector-view-create": "Kriar", + "vector-view-history": "Vrej kronologiën", + "vector-more-actions": "Më shurbise", + "vector-searchsuggest-containing": "Kërkoj paginet çë kan $1", + "vector-toc-label": "Indiçe", + "vector-toc-beginning": "Iniziu", + "vector-page-tools-label": "Strumente", + "vector-page-tools-general-label": "Generali", + "vector-unpin-element-label": "fshihe" +} diff --git a/Vector/i18n/ab.json b/Vector/i18n/ab.json new file mode 100644 index 0000000..53f99fd --- /dev/null +++ b/Vector/i18n/ab.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Fraxinus.cs", + "Pupsik-ipa", + "Temuri rajavi" + ] + }, + "vector-languages": "Абызшәақәа", + "vector-language-button-label": "{{PLURAL:$1|$1 абызшәа|$1 абызшәақәа}}", + "vector-no-language-button-label": "Абызшәақәа рыцҵатәуп", + "vector-action-addsection": "Атема ацҵатәуп", + "vector-action-delete": "Ианыхтәуп", + "vector-action-move": "Ахьӡ аԥсахра", + "vector-view-create": "Арҿиара", + "vector-view-edit": "Аредакциазура", + "vector-view-history": "Аҭоурых", + "vector-view-view": "Аԥхьара", + "vector-view-viewsource": "Ахәаԥшра", + "vector-more-actions": "Еиҭа" +} diff --git a/Vector/i18n/abs.json b/Vector/i18n/abs.json new file mode 100644 index 0000000..ac7574d --- /dev/null +++ b/Vector/i18n/abs.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Anok kutai jang" + ] + }, + "vector-action-addsection": "Kas tamba baru", + "vector-action-move": "Kas pindah", + "vector-view-create": "Biking", + "vector-view-edit": "Kas ubah", + "vector-view-history": "Lia versi lama", + "vector-view-view": "Baca", + "vector-more-actions": "Laeng-laeng" +} diff --git a/Vector/i18n/ace.json b/Vector/i18n/ace.json new file mode 100644 index 0000000..e9a73c4 --- /dev/null +++ b/Vector/i18n/ace.json @@ -0,0 +1,34 @@ +{ + "@metadata": { + "authors": [ + "Fadli Idris", + "Si Gam Acèh" + ] + }, + "vector-opt-out": "Gantoe u rupa awai", + "vector-languages": "Bahsa", + "vector-language-button-label": "{{PLURAL:$1|$1 bahsa}}", + "vector-no-language-button-label": "Tamah bahsa", + "vector-action-addsection": "Tamah bhaih", + "vector-action-delete": "Sampôh", + "vector-action-move": "Pupinah", + "vector-action-protect": "Peulindông", + "vector-action-undelete": "Bateuë sampôh", + "vector-action-unprotect": "Gantoe neulindông", + "vector-view-create": "Peugöt", + "vector-view-edit": "Peusaneut", + "vector-view-history": "Eu riwayat", + "vector-view-view": "Beuet", + "vector-view-viewsource": "Eu nè", + "vector-more-actions": "Lom", + "vector-searchsuggest-containing": "Mita mieng nyang na $1", + "vector-toc-label": "Asoe", + "vector-toc-beginning": "Awai", + "vector-page-tools-label": "Alat", + "vector-page-tools-general-label": "Umom", + "vector-page-tools-actions-label": "Buet", + "vector-pin-element-label": "pinah u bateueng binèh", + "vector-unpin-element-label": "som", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Peugah haba]]", + "tooltip-vector-anon-user-menu-title": "Peuniléh laén" +} diff --git a/Vector/i18n/acm.json b/Vector/i18n/acm.json new file mode 100644 index 0000000..5972377 --- /dev/null +++ b/Vector/i18n/acm.json @@ -0,0 +1,61 @@ +{ + "@metadata": { + "authors": [ + "Ahmedadeljaff", + "MRidhaAJ" + ] + }, + "vector-skin-desc": "توفر نسختين من مظهر فيكتور:\n* 2021 - النسخة الحديثة من مظهر مونوبوك بمظهر أحدث وتحسينات لسهولة الاستخدام.\n* 2022 - نسخة فيكتور المبنيّة كجزءٍ من مشروع مؤسسة ويكيميديا [[mw:Desktop Improvements|لتحسينات نسخة سطح المكتب]].", + "prefs-vector-enable-vector-1-label": "استخدم النسخة القديمة لفيكتور", + "prefs-vector-enable-vector-1-help": "على مدار السنوات القليلة الجاية، راح نحدث واجهة فيكتور بشكل تدريجي. راح تسمحلك النسخة القديمة لفيكتور بمشاهدة الإصدار القديم من فيكتور (اعتبارا من ديسمبر 2019). حتى تعرف بعد على التحديثات، انتقل إلى [[mw:Reading/Web/Desktop_Improvements|صفحة المشروع]].", + "vector-opt-out": "التبديل للشكل القديم", + "vector-opt-out-tooltip": "غيِّر الإعدادات لحتى ترجع إلى طريقة العرض القديمة (النسخة القديمة لفيكتور)", + "vector-action-toggle-sidebar": "تبديل الشريط الجانبي", + "vector-languages": "لغات", + "vector-language-button-aria-label": "{{GENDER:|روح|روحي}} إلى المقالة في لغةٍ ثانية. مُتاحة في {{PLURAL:$1|لغة وحده|هاي اللغات الـ$1}}", + "vector-language-button-label": "{{PLURAL:$1|$1 لغـة|$1 لغـات}}", + "vector-no-language-button-label": "حط لغات", + "vector-no-language-button-aria-label": "هذه المقالة موجودة بس بهاي اللغة. حطها إلى اللغات الثانية.", + "vector-language-redirect-to-top": "في نسخة {{SITENAME}} هاي، وصلات اللغات موجودة في الزاوية الفوك اليسرى يم العنوان. [[#p-lang-btn|انتقل لفوك]].", + "vector-language-variant-switcher-label": "غيّر لهجة اللغة", + "vector-action-addsection": "حط موضوع", + "vector-action-delete": "حذف", + "vector-action-move": "حرك", + "vector-action-protect": "إحمي", + "vector-action-undelete": "استرجع", + "vector-action-unprotect": "غير الحمايه", + "vector-view-create": "سوي", + "vector-view-edit": "تعديل", + "vector-view-history": "شوف التاريخ", + "vector-view-view": "اقرأ", + "vector-view-viewsource": "طلع المصدر", + "vector-jumptonavigation": "اطفر للتنقل", + "vector-jumptosearch": "اطفر للبحث", + "vector-jumptocontent": "اطفر للمحتوى", + "vector-more-actions": "بعد", + "vector-search-loader": "تحميل اقتراحات البحث", + "vector-searchsuggest-containing": "بحث عن صفحات تحوي $1", + "vector-intro-page": "Help:مقدمة", + "vector-toc-label": "محتوى", + "vector-toc-beginning": "المقدمة", + "vector-toc-toggle-button-label": "ثبِّت القسم الفرعي $1", + "vector-anon-user-menu-pages": "صفحات للمحررين اللي سجَّلوا خروجهم", + "vector-anon-user-menu-pages-learn": "تعلم بعد", + "vector-anon-user-menu-pages-label": "تعلم بعد عالتحرير", + "vector-main-menu-tooltip": "القائمة الرئيسة", + "vector-toc-menu-tooltip": "جدول المحتوى", + "vector-toc-collapsible-button-label": "تبديل عرض جدول المحتوى", + "vector-site-nav-label": "الموقع", + "vector-main-menu-label": "القائمة الرئيسية", + "vector-limited-width-toggle": "تبديل عرض المحتوى المحدود", + "vector-page-tools-label": "عدة", + "vector-page-tools-general-label": "عام", + "vector-page-tools-actions-label": "سوايات", + "vector-pin-element-label": "انقل للشريط الجانبي", + "vector-unpin-element-label": "ضمها", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|مناقشة]]", + "tooltip-vector-anon-user-menu-title": "بعد اختيارات", + "vector-prefs-limited-width": "شعل وضع العرض المحدود", + "vector-prefs-limited-width-help": "فعل وضع العرض المحدود لتجربة قراءة محسنة.", + "empty-language-selector-body": "محتوى الصفحه مو موجود بغير لغات" +} diff --git a/Vector/i18n/ady-cyrl.json b/Vector/i18n/ady-cyrl.json new file mode 100644 index 0000000..22cdb92 --- /dev/null +++ b/Vector/i18n/ady-cyrl.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Adamsa123", + "Amire80", + "Celekan", + "GR44 Luc", + "Highlander45temp", + "Inyzh", + "SamGamgee", + "Siklawy", + "SmartNart12" + ] + }, + "vector-action-addsection": "Ӏофтхьабз", + "vector-action-delete": "ТегъэкӀ", + "vector-action-move": "Хьы", + "vector-action-protect": "Иухъумэ", + "vector-action-undelete": "УмылъэкӀ", + "vector-action-unprotect": "Умыухъумэ", + "vector-view-create": "КъэшӀ", + "vector-view-edit": "ХэӀэзыхь", + "vector-view-history": "Тарихъым eплъ", + "vector-view-view": "Едж", + "vector-view-viewsource": "Еплъ лъапсэм", + "vector-more-actions": "Джыри" +} diff --git a/Vector/i18n/aeb-arab.json b/Vector/i18n/aeb-arab.json new file mode 100644 index 0000000..37dc15f --- /dev/null +++ b/Vector/i18n/aeb-arab.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Csisc", + "Meno25", + "Michel Bakni", + "علاء" + ] + }, + "vector-action-addsection": "أضف موضوعاً", + "vector-action-delete": "احذف", + "vector-action-move": "حوّل", + "vector-action-protect": "احم", + "vector-action-undelete": "استرجع الحذف", + "vector-action-unprotect": "غير الحماية", + "vector-view-create": "أنشئ", + "vector-view-edit": "بدّل", + "vector-view-history": "ورّي الپاج", + "vector-view-view": "أقرا", + "vector-view-viewsource": "عرض المصدر", + "vector-more-actions": "زادة" +} diff --git a/Vector/i18n/aeb-latn.json b/Vector/i18n/aeb-latn.json new file mode 100644 index 0000000..7ae859b --- /dev/null +++ b/Vector/i18n/aeb-latn.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Csisc" + ] + }, + "vector-action-addsection": "Zīd mawḑūģ", + "vector-action-move": "Ḩawwil", + "vector-view-create": "Aģmil", + "vector-view-edit": "Beddil", + "vector-view-history": "Cūf Tērīx il-milaf", + "vector-view-view": "Aqrē", + "vector-more-actions": "Ekŧer" +} diff --git a/Vector/i18n/af.json b/Vector/i18n/af.json new file mode 100644 index 0000000..5eb0da3 --- /dev/null +++ b/Vector/i18n/af.json @@ -0,0 +1,57 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Byeboer", + "Naudefj", + "Rooiratel" + ] + }, + "prefs-vector-enable-vector-1-label": "Gebruik ou Vector-vel", + "vector-opt-out": "Skakel oor na ou voorkoms", + "vector-action-toggle-sidebar": "Wissel kantbalk", + "vector-languages": "Tale", + "vector-language-button-aria-label": "Gaan na 'n artikel in 'n ander taal. Beskikbaar in {{PLURAL:$1|$1 taal|$1 tale}}", + "vector-language-button-label": "{{PLURAL:$1|$1 taal|$1 tale}}", + "vector-no-language-button-label": "Voeg tale by", + "vector-no-language-button-aria-label": "Hierdie artikel bestaan slegs in hierdie taal. Voeg die artikel by vir ander tale", + "vector-language-redirect-to-top": "Op hierdie {{SITENAME}} is die taalskakels bo-aan die bladsy oorkant die artikeltitel. [[#p-lang-btn|Gaan boontoe]].", + "vector-language-variant-switcher-label": "Verander taalvariant", + "vector-action-addsection": "Nuwe onderwerp", + "vector-action-delete": "Skrap", + "vector-action-move": "Skuif", + "vector-action-protect": "Beskerm", + "vector-action-undelete": "Ontskrap", + "vector-action-unprotect": "Wysig beskerming", + "vector-view-create": "Skep", + "vector-view-edit": "Wysig", + "vector-view-history": "Wys geskiedenis", + "vector-view-view": "Lees", + "vector-view-viewsource": "Wys bronteks", + "vector-jumptonavigation": "Gaan na navigasie", + "vector-jumptosearch": "Gaan na soektog", + "vector-jumptocontent": "Gaan na inhoud", + "vector-more-actions": "Meer", + "vector-search-loader": "Laai tans soekvoorstelle", + "vector-searchsuggest-containing": "Soek vir bladsye wat $1 bevat", + "vector-intro-page": "Help:Inleiding", + "vector-toc-label": "Inhoud", + "vector-toc-beginning": "Inleiding", + "vector-toc-toggle-button-label": "Wissel $1 subafdeling", + "vector-anon-user-menu-pages": "Bladsye vir uitgemelde redakteurs", + "vector-anon-user-menu-pages-learn": "leer meer", + "vector-anon-user-menu-pages-label": "Leer meer oor redigering", + "vector-main-menu-tooltip": "Hoofkieslys", + "vector-toc-menu-tooltip": "Inhoudsopgawe", + "vector-toc-collapsible-button-label": "Wissel die inhoudsopgawe", + "vector-site-nav-label": "Werf", + "vector-main-menu-label": "Hoofkieslys", + "vector-limited-width-toggle": "Wissel beperkte inhoudwydte", + "vector-page-tools-label": "Gereedskap", + "vector-page-tools-general-label": "Algemeen", + "vector-pin-element-label": "skuif na kantbalk", + "vector-unpin-element-label": "versteek", + "tooltip-vector-anon-user-menu-title": "Meer opsies", + "vector-prefs-limited-width": "Aktiveer beperkte breedte-modus", + "vector-prefs-limited-width-help": "Aktiveer beperkte wydte-modus vir 'n verbeterde lees ervaring." +} diff --git a/Vector/i18n/aln.json b/Vector/i18n/aln.json new file mode 100644 index 0000000..a5cc022 --- /dev/null +++ b/Vector/i18n/aln.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Bresta" + ] + }, + "vector.css": "/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Vector */", + "vector.js": "/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Vector */", + "vector-action-addsection": "Shto temë", + "vector-action-delete": "Fshij", + "vector-action-move": "Zhvendos", + "vector-action-protect": "Mbroj", + "vector-action-undelete": "Kthe fshimjen mbrapsht", + "vector-action-unprotect": "Hiq mbrojtjen", + "vector-view-create": "Krijo", + "vector-view-edit": "Redakto", + "vector-view-history": "Shih historinë", + "vector-view-view": "Lexo", + "vector-view-viewsource": "Shih kodin" +} diff --git a/Vector/i18n/alt.json b/Vector/i18n/alt.json new file mode 100644 index 0000000..a250801 --- /dev/null +++ b/Vector/i18n/alt.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "Agilight", + "Altai uul", + "HalanTul", + "Батыр Комдошев" + ] + }, + "vector-languages": "Тилдер", + "vector-language-button-label": "{{PLURAL:$1|$1 тил|$1 тилдер}}", + "vector-no-language-button-label": "Тилдер кожоры", + "vector-action-addsection": "Тема кожор", + "vector-action-delete": "Јоголтор", + "vector-action-move": "Адын солыыр", + "vector-action-protect": "Корыыр", + "vector-action-undelete": "Орныктырар", + "vector-action-unprotect": "Корышты солыыр", + "vector-view-create": "Јайалга", + "vector-view-edit": "Тӱзедери", + "vector-view-history": "Тӱӱкини кӧргӱзер", + "vector-view-view": "Кычырар", + "vector-view-viewsource": "Темдектерин кӧрӧр", + "vector-more-actions": "Кӧптӧдӧ", + "vector-searchsuggest-containing": "$1 бар бӱктерди бедрери", + "vector-toc-label": "Толынтызы", + "vector-toc-beginning": "Башталганы", + "vector-page-tools-label": "Јепселдер", + "vector-page-tools-general-label": "Текши", + "vector-unpin-element-label": "јажырар" +} diff --git a/Vector/i18n/am.json b/Vector/i18n/am.json new file mode 100644 index 0000000..55655bb --- /dev/null +++ b/Vector/i18n/am.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Codex Sinaiticus", + "Elfalem", + "Hinstein", + "Teferra" + ] + }, + "vector-action-addsection": "ርዕስ ጨምር", + "vector-action-delete": "አጥፋ", + "vector-action-move": "ለማዛወር", + "vector-action-protect": "ለመቆለፍ", + "vector-action-undelete": "አታጥፋ", + "vector-action-unprotect": "አለመቆለፍ", + "vector-view-create": "አዲስ ፍጠር", + "vector-view-edit": "አርም", + "vector-view-history": "ታሪኩን አሳይ", + "vector-view-view": "ለማንበብ", + "vector-view-viewsource": "ጥሬ ኮድ ለመመልከት", + "vector-more-actions": "ተጨማሪ" +} diff --git a/Vector/i18n/ami.json b/Vector/i18n/ami.json new file mode 100644 index 0000000..d46c1d1 --- /dev/null +++ b/Vector/i18n/ami.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Akamycoco", + "Amire80", + "Vickylin77s" + ] + }, + "vector-action-addsection": "micomod hasasowalen", + "vector-action-delete": "masopitay to", + "vector-action-move": "malinah", + "vector-action-protect": "midipot", + "vector-view-create": "misanga’", + "vector-view-edit": "misinanot", + "vector-view-history": "misongila’ a minengneng to likisi", + "vector-view-view": "miasip", + "vector-view-viewsource": "misongila’ a minengneng to yin-se-ma", + "vector-more-actions": "matongal ko adihay" +} diff --git a/Vector/i18n/an.json b/Vector/i18n/an.json new file mode 100644 index 0000000..30980c6 --- /dev/null +++ b/Vector/i18n/an.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Carlos Cristia", + "Juanpabl" + ] + }, + "skinname-vector": "Vector", + "vector.css": "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Vector */", + "vector.js": "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que usen a piel Vector */", + "vector-action-addsection": "Adhibir nueva sección", + "vector-action-delete": "Borrar", + "vector-action-move": "Tresladar", + "vector-action-protect": "Protecher", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Cambiar protección", + "vector-view-create": "Creyar", + "vector-view-edit": "Editar", + "vector-view-history": "Amostrar l'historial", + "vector-view-view": "Leyer", + "vector-view-viewsource": "Veyer o codigo fuent", + "vector-more-actions": "Mas" +} diff --git a/Vector/i18n/ang.json b/Vector/i18n/ang.json new file mode 100644 index 0000000..e28029b --- /dev/null +++ b/Vector/i18n/ang.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Gott wisst", + "Heahwrita", + "Hogweard", + "JJohnson1701" + ] + }, + "vector-action-addsection": "Besettan mearcunge", + "vector-action-delete": "Forleos", + "vector-action-move": "Wegan", + "vector-action-protect": "Beorgan", + "vector-action-undelete": "Scieppan tramet eft", + "vector-action-unprotect": "Andwendan beorgunge", + "vector-view-create": "Scieppan", + "vector-view-edit": "Adiht", + "vector-view-history": "Seoh stær", + "vector-view-view": "Ræd", + "vector-view-viewsource": "Sēon fruman", + "vector-more-actions": "Ma", + "vector-main-menu-label": "Heafodlic cyrewrit" +} diff --git a/Vector/i18n/ann.json b/Vector/i18n/ann.json new file mode 100644 index 0000000..ff5f469 --- /dev/null +++ b/Vector/i18n/ann.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Katelem" + ] + }, + "vector-languages": "Ebi kè Usem", + "vector-no-language-button-label": "Tap usem sọkọ", + "vector-action-addsection": "Tap Ibot-ikọ gbaalek", + "vector-action-delete": "Chọk", + "vector-action-move": "Nwene erieen̄", + "vector-action-protect": "Bem", + "vector-view-create": "Nama", + "vector-view-edit": "Nen̄e ge", + "vector-view-history": "Kpọ mfufuk", + "vector-view-view": "Fuk", + "vector-more-actions": "Ofifi si", + "vector-searchsuggest-containing": "Wèek ebi kè akpọk ìkakaan̄ $1", + "vector-toc-label": "Òkup me emen", + "vector-toc-beginning": "Ibebene", + "vector-page-tools-label": "Nroon̄", + "vector-page-tools-general-label": "Eyi otutuuk", + "vector-unpin-element-label": "let" +} diff --git a/Vector/i18n/anp.json b/Vector/i18n/anp.json new file mode 100644 index 0000000..0edb90d --- /dev/null +++ b/Vector/i18n/anp.json @@ -0,0 +1,57 @@ +{ + "@metadata": { + "authors": [ + "Angpradesh", + "Proabscorp!" + ] + }, + "vector-skin-desc": "दू Vector स्किन्स प्रदान करै छै:\n* 2011 - MonoBook क आधुनिक संस्करण जेकरा मँ एगो टटका दिखावट आरो उपयोग मँ सुधार छै।\n* 2022 - Vector जेकरा विकिमीडिया संस्थान केरौ [[mw:Desktop Improvements|डेस्कटॉप उन्नति]] परियोजना के रूप मँ बनैलौ गेलौ छै।", + "prefs-vector-enable-vector-1-label": "लिगेसी Vector क उपयोग करौ", + "vector-opt-out": "पुरनका दिखावट प जा", + "vector-action-toggle-sidebar": "साइडबार क टॉगल करौ", + "vector-languages": "भाषा सिनी", + "vector-language-button-label": "{{PLURAL:$1|$1 भाषा|$1 भाषा सिनी}}", + "vector-no-language-button-label": "भाषा सिनी जोड़ौ", + "vector-language-redirect-to-top": "हैय {{SITENAME}} प भाषा केरौ कड़ी सिनी पन्ना के ऊप्पर क ओरी लेख केरौ शीर्षक क पास छौं। [[#p-lang-btn|ऊप्पर जा]]।", + "vector-language-variant-switcher-label": "भाषा केरौ प्रकार बदलौ", + "vector-action-addsection": "विषय जोड़ौ", + "vector-action-delete": "मेटाबौ", + "vector-action-move": "स्थानांतरित करौ", + "vector-action-protect": "सुरक्षित करौ", + "vector-action-undelete": "हटाना वापस ला", + "vector-action-unprotect": "सुरक्षितता बदलौ", + "vector-view-create": "बनाबौ", + "vector-view-edit": "संपादन करौ", + "vector-view-history": "इतिहास देखौ", + "vector-view-view": "पढ़ौ", + "vector-view-viewsource": "स्रोत देखौ", + "vector-jumptonavigation": "नेविगेशन प जा", + "vector-jumptosearch": "खोज प जा", + "vector-jumptocontent": "सामग्री प जा", + "vector-more-actions": "आरू जादा", + "vector-search-loader": "खोज सुझाव लोड होय रहलौ छौ", + "vector-searchsuggest-containing": "$1 सँ जुड़लो पन्ना खोजौ", + "vector-intro-page": "Help:परिचय", + "vector-toc-label": "विषय सूची", + "vector-toc-beginning": "शुरुआत", + "vector-toc-toggle-button-label": "$1 उप-अनुभाग क टॉगल करौ", + "vector-anon-user-menu-pages": "लॉग-आउट करलौ गेलौ संपादक सिनी लेली पन्ना", + "vector-anon-user-menu-pages-learn": "आरू अधिक जानौ", + "vector-anon-user-menu-pages-label": "संपादन केरौ बारै मँ अधिक जानौ", + "vector-main-menu-tooltip": "मुख्य सूची", + "vector-toc-menu-tooltip": "विषयसूची", + "vector-toc-collapsible-button-label": "विषयसूची क टॉगल करौ", + "vector-site-nav-label": "साइट", + "vector-main-menu-label": "मुख्य सूची", + "vector-limited-width-toggle": "सीमित सामग्री के चौड़ाई क टॉगल करौ", + "vector-page-tools-label": "उपकरण", + "vector-page-tools-general-label": "सामान्य", + "vector-page-tools-actions-label": "कार्रवाई", + "vector-pin-element-label": "साइडबार प जा", + "vector-unpin-element-label": "नुकाबौ", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|चर्चा]]", + "tooltip-vector-anon-user-menu-title": "अन्य विकल्प सिनी", + "vector-prefs-limited-width": "सीमित चौड़ाई मोड सक्षम करौ", + "vector-prefs-limited-width-help": "बेहतर पठन अनुभव लेली सीमित चौड़ाई मोड सक्षम करौ।", + "empty-language-selector-body": "पृष्ठ सामग्री अन्य भाषा सिनी मँ समर्थित नाय छौं।" +} diff --git a/Vector/i18n/ar.json b/Vector/i18n/ar.json new file mode 100644 index 0000000..c7dccac --- /dev/null +++ b/Vector/i18n/ar.json @@ -0,0 +1,87 @@ +{ + "@metadata": { + "authors": [ + "Abanima", + "Amire80", + "Bachounda", + "Beginneruser", + "Calak", + "Dyolf77 (WMF)", + "FShbib", + "Khaled", + "Meno25", + "Michel Bakni", + "Mido", + "NEHAOUA", + "OsamaK", + "Shbib Al-Subaie", + "Wahrani", + "أحمد", + "ديفيد", + "زكريا", + "علاء", + "محمد أحمد عبد الفتاح", + "MRidhaAJ", + "Alshamiri1", + "Hubaishan", + "أيوب" + ] + }, + "skinname-vector": "فكتور القديم (2010)", + "skinname-vector-2022": "فيكتور (2022)", + "vector-skin-desc": "توفر نسختان من مظهر فيكتور:\n* 2021 - النسخة الحديثة من مظهر مونوبوك بمظهر أحدث وتحسينات لسهولة الاستخدام.\n* 2022 - نسخة فيكتور المبنيّة كجزءٍ من مشروع مؤسسة ويكيميديا [[mw:Desktop Improvements|لتحسينات نسخة سطح المكتب]].", + "prefs-vector-enable-vector-1-label": "استخدم النسخة القديمة لفيكتور", + "prefs-vector-enable-vector-1-help": "على مدار السنوات القليلة القادمة، سنقوم بتحديث واجهة فيكتور بشكل تدريجي. ستسمح لك النسخة القديمة لفيكتور بمشاهدة الإصدار القديم من فيكتور (اعتبارا من ديسمبر 2019). لمعرفة المزيد حول التحديثات، انتقل إلى [[mw:Reading/Web/Desktop_Improvements|صفحة المشروع]].", + "vector-opt-out": "التبديل إلى الشكل القديم", + "vector-opt-out-tooltip": "غيِّر الإعدادت للعودة إلى طريقة العرض القديمة (النسخة القديمة لفيكتور)", + "vector.css": "/* ستؤثِّر الأنماط المتراصة CSS المعروضة هنا على مستخدمي واجهة فكتور */", + "vector.js": "/* سيُحمَّل أي نص برمجي مكتوب بلغة جافا للمستخدمين الذين يستعملون واجهة فكتور */", + "vector-action-toggle-sidebar": "تبديل الشريط الجانبي", + "vector-languages": "لغات", + "vector-language-button-aria-label": "{{GENDER:|اذهب|اذهبي}} إلى المقالة في لغةٍ أخرى. مُتاحة في {{PLURAL:$1|لا لغة|لغة واحدة|لغتين|$1 لغات|$1 لغة}}", + "vector-language-button-label": "{{PLURAL:$1|لا لغات|لغة واحدة|لغتان|$1 لغات|$1 لغة}}", + "vector-no-language-button-label": "أضف لغات", + "vector-no-language-button-aria-label": "هذه المقالة تتواجد فقط في هذه اللغة. أضفها إلى اللغات الأخرى.", + "vector-language-redirect-to-top": "في نسخة {{SITENAME}} هذه، وصلات اللغات موجودة في الزاوية العليا اليسرى بجانب العنوان. [[#p-lang-btn|انتقل إلى الأعلى]].", + "vector-language-variant-switcher-label": "غيّر لهجة اللغة", + "vector-action-addsection": "أضف موضوعًا", + "vector-action-delete": "احذف", + "vector-action-move": "انقُل", + "vector-action-protect": "احمِ", + "vector-action-undelete": "ألغِ الحذف", + "vector-action-unprotect": "غيِّر الحماية", + "vector-view-create": "أنشئ", + "vector-view-edit": "عدِّل", + "vector-view-history": "تاريخ", + "vector-view-view": "اقرأ", + "vector-view-viewsource": "اعرض المصدر", + "vector-jumptonavigation": "اذهب إلى التنقل", + "vector-jumptosearch": "اذهب إلى البحث", + "vector-jumptocontent": "انتقل إلى المحتوى", + "vector-more-actions": "المزيد", + "vector-search-loader": "تحميل اقتراحات البحث", + "vector-searchsuggest-containing": "ابحث عن صفحات تحتوي $1", + "vector-intro-page": "Help:مقدمة", + "vector-toc-label": "المحتويات", + "vector-toc-beginning": "المقدمة", + "vector-toc-toggle-button-label": "ثبِّت القسم الفرعي $1", + "vector-anon-user-menu-pages": "صفحات للمحررين الذين سجَّلوا خروجهم", + "vector-anon-user-menu-pages-learn": "تعلَّم المزيد", + "vector-anon-user-menu-pages-label": "تعلَّم المزيد بخصوص التحرير", + "vector-main-menu-tooltip": "القائمة الرئيسة", + "vector-toc-menu-tooltip": "جدول المحتويات", + "vector-toc-collapsible-button-label": "تبديل عرض جدول المحتويات", + "vector-site-nav-label": "الموقع", + "vector-main-menu-label": "القائمة الرئيسية", + "vector-limited-width-toggle": "تبديل عرض المحتوى المحدود", + "vector-page-tools-label": "أدوات", + "vector-page-tools-general-label": "عام", + "vector-page-tools-actions-label": "إجراءات", + "vector-pin-element-label": "انقل للشريط الجانبي", + "vector-unpin-element-label": "أخف", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|نقاش]]", + "tooltip-vector-anon-user-menu-title": "المزيد من الخيارات", + "vector-prefs-limited-width": "تفعيل وضع العرض المحدود", + "vector-prefs-limited-width-help": "قم بتمكين وضع العرض المحدود لتجربة قراءة محسنة.", + "empty-language-selector-body": "محتويات الصفحة غير مدعومة بلغات أخرى." +} diff --git a/Vector/i18n/arc.json b/Vector/i18n/arc.json new file mode 100644 index 0000000..7bb2372 --- /dev/null +++ b/Vector/i18n/arc.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "334a", + "Basharh", + "Michaelovic" + ] + }, + "vector-action-addsection": "ܐܘܣܦ ܡܠܘܐܐ", + "vector-action-delete": "ܫܘܦ", + "vector-action-move": "ܫܢܝ", + "vector-action-protect": "ܛܪ", + "vector-action-undelete": "ܠܐ ܫܘܦ", + "vector-action-unprotect": "ܫܚܠܦ ܢܛܝܪܘܬܐ", + "vector-view-create": "ܒܪܝ", + "vector-view-edit": "ܫܚܠܦ", + "vector-view-history": "ܚܙܝ ܬܫܥܝܬܐ", + "vector-view-view": "ܩܪܝ", + "vector-view-viewsource": "ܚܙܝ ܡܒܘܥܐ" +} diff --git a/Vector/i18n/arn.json b/Vector/i18n/arn.json new file mode 100644 index 0000000..7134d00 --- /dev/null +++ b/Vector/i18n/arn.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Clerc", + "Fiestoforo", + "Manke ruLpa" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 zugun}}", + "vector-action-addsection": "Püñamtun zungu", + "vector-action-delete": "Liftun", + "vector-action-move": "Nengümün", + "vector-action-protect": "Nürüfkünun", + "vector-action-undelete": "Wüñoñamümün", + "vector-action-unprotect": "Kalekünun Nürüfkünun", + "vector-view-create": "Zewman", + "vector-view-edit": "Kümeelün", + "vector-view-history": "Pengepe tukulpan", + "vector-view-view": "Chillkatun", + "vector-view-viewsource": "Kimam chew küpan chi wirin", + "vector-more-actions": "Zoy", + "vector-searchsuggest-containing": "Kintun kom tapülh nielu $1" +} diff --git a/Vector/i18n/aro.json b/Vector/i18n/aro.json new file mode 100644 index 0000000..77dc6c4 --- /dev/null +++ b/Vector/i18n/aro.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Ooswesthoesbes" + ] + }, + "vector-view-edit": "Imeakie" +} diff --git a/Vector/i18n/arq.json b/Vector/i18n/arq.json new file mode 100644 index 0000000..69d2c27 --- /dev/null +++ b/Vector/i18n/arq.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Bachounda", + "GeekEmad", + "Oldstoneage" + ] + }, + "vector-skin-desc": "طبعة جديدة تاع مونوبوك، ب شبحة جديدة و تحسانات فل إستعماليّة", + "vector-action-addsection": "زيد موضوع", + "vector-action-delete": "امحي", + "vector-action-move": "حول", + "vector-action-protect": "بروجي", + "vector-action-undelete": "ردّ كيما كان", + "vector-action-unprotect": "بدّل الـحماية", + "vector-view-create": "أصنع", + "vector-view-edit": "بدّل", + "vector-view-history": "شوف التاريخ", + "vector-view-view": "اقرى", + "vector-view-viewsource": "شوف المصدر", + "vector-more-actions": "اكثر" +} diff --git a/Vector/i18n/ary.json b/Vector/i18n/ary.json new file mode 100644 index 0000000..4a6988b --- /dev/null +++ b/Vector/i18n/ary.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Abdeaitali", + "Amire80", + "Enzoreg", + "Ideophagous", + "Reda Benkhadra", + "SADI9I", + "SADIQUI", + "Zanatos" + ] + }, + "vector-opt-out": "رجع ل الشكل لقديم", + "vector-language-button-label": "{{PLURAL:$1|$1 لوغة|$1 لوغات}}", + "vector-language-redirect-to-top": "ف هاد لويكيپيديا ليانات د لوغات كاينين ف لفوق د صفحة حدا لعنوان. [[#p-lang-btn|سير لفوق]].", + "vector-action-addsection": "زيد شي موضوع", + "vector-action-delete": "محي", + "vector-action-move": "حوّل", + "vector-action-protect": "حمي", + "vector-action-undelete": "لغي الحدف", + "vector-action-unprotect": "بدّل الحماية", + "vector-view-create": "أنشئ", + "vector-view-edit": "بدل", + "vector-view-history": "تاريخ", + "vector-view-view": "قرا", + "vector-view-viewsource": "شوف لمصدر", + "vector-more-actions": "كتر", + "vector-searchsuggest-containing": "قلب علا صفاحي فيهم $1" +} diff --git a/Vector/i18n/arz.json b/Vector/i18n/arz.json new file mode 100644 index 0000000..7f0f7d1 --- /dev/null +++ b/Vector/i18n/arz.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Ghaly", + "Meno25", + "Ramsis II" + ] + }, + "vector.css": "/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة فكتور */", + "vector.js": "/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */", + "vector-language-button-label": "{{PLURAL:$1|$1 لغه|$1 لغات}}", + "vector-action-addsection": "ضيف موضوع", + "vector-action-delete": "مسح", + "vector-action-move": "نقل", + "vector-action-protect": "حمايه", + "vector-action-undelete": "الغى المسح", + "vector-action-unprotect": "غير الحمايه", + "vector-view-create": "اعمل", + "vector-view-edit": "تعديل", + "vector-view-history": "استعراض التاريخ", + "vector-view-view": "قرايه", + "vector-view-viewsource": "استعراض المصدر", + "vector-more-actions": "اكتر" +} diff --git a/Vector/i18n/as.json b/Vector/i18n/as.json new file mode 100644 index 0000000..583e913 --- /dev/null +++ b/Vector/i18n/as.json @@ -0,0 +1,69 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bishnu Saikia", + "Chaipau", + "Gitartha.bordoloi", + "Simbu123" + ] + }, + "skinname-vector": "পুৰণা ভেক্টৰ (২০১০)", + "skinname-vector-2022": "ভেক্টৰ (২০২২)", + "vector-specialversion-name": "ভেক্টৰ", + "vector-skin-desc": "২টা ভেক্টৰ ৰূপ প্ৰদান কৰে:\n* ২০১১ - নতুন ৰূপ আৰু বহুতো ব্যৱহাৰযোগ্যতাৰ উন্নতিৰ সৈতে ম'ন'বুকৰ আধুনিক সংস্কৰণ।\n* ২০২২ - WMF-ৰ [[mw:Desktop Improvements]] প্ৰকল্পৰ অংশ হিচাপে নিৰ্মিত ভেক্টৰ।", + "prefs-vector-enable-vector-1-label": "পুৰণা ভেক্টৰ ব্যৱহাৰ কৰক", + "prefs-vector-enable-vector-1-help": "পৰৱৰ্তী কেইবছৰমানত, আমি ক্ৰমান্বয়ে ভেক্টৰ আৱৰণ আপডেট কৰিম। পুৰণা ভেক্টৰ আৱৰণে আপোনাক ভেক্টৰৰ পুৰণি সংস্কৰণ চাবলৈ অনুমতি দিব (ডিচেম্বৰ ২০১৯ লৈকে)। আপডেটবোৰৰ বিষয়ে অধিক জানিবলৈ, আমাৰ [[mw:Reading/Web/Desktop_Improvements|প্ৰকল্প পৃষ্ঠালৈ]] যাওক।", + "vector-opt-out": "পুৰণি ৰূপলৈ যাওক", + "vector-opt-out-tooltip": "আৱৰণৰ পুৰণি ৰূপলৈ ঘূৰি যাবলৈ আপোনাৰ ছেটিংছ সলনি কৰক (পুৰণা ভেক্টৰ)", + "vector.css": "/* ভেক্টৰ আৱৰণৰ ব্যৱহাৰকাৰীসকলৰ বাবে ইয়াত সকলো CSS লোড কৰা হ'ব */", + "vector.js": "/* ভেক্টৰ আৱৰণৰ ব্যৱহাৰকাৰীসকলৰ বাবে ইয়াত সকলো জাভাস্ক্ৰিপ্ট লোড কৰা হ'ব */", + "vector-action-toggle-sidebar": "পাৰ্শ্বদণ্ড টগ'ল কৰক", + "vector-languages": "ভাষা", + "vector-language-button-aria-label": "অন্য এটা ভাষাৰ প্ৰবন্ধলৈ যাওক। {{PLURAL:$1|$1টা ভাষাত}} উপলব্ধ।", + "vector-language-button-label": "{{PLURAL:$1|$1টা ভাষা}}", + "vector-no-language-button-label": "ভাষা যোগ কৰক", + "vector-no-language-button-aria-label": "এই প্ৰবন্ধটো কেৱল এই ভাষাতহে আছে। অন্য ভাষাত প্ৰবন্ধটো যোগ কৰক", + "vector-language-redirect-to-top": "এই {{SITENAME}}ত ভাষাৰ সংযোগসমূহ প্ৰবন্ধৰ শিৰোনামৰ কাষত পৃষ্ঠাৰ ওপৰত আছে। [[#p-lang-btn|ওপৰলৈ যাওক]]।", + "vector-language-variant-switcher-label": "ভাষাৰ প্ৰকাৰ সলনি কৰক", + "vector-action-addsection": "বিষয় যোগ", + "vector-action-delete": "বিলোপ কৰক", + "vector-action-move": "স্থানান্তৰ কৰক", + "vector-action-protect": "সুৰক্ষিত কৰক", + "vector-action-undelete": "পুনৰুদ্ধাৰ কৰক", + "vector-action-unprotect": "সুৰক্ষা সলনি কৰক", + "vector-view-create": "সৃষ্টি কৰক", + "vector-view-edit": "সম্পাদনা", + "vector-view-history": "ইতিহাস চাওক", + "vector-view-view": "পঢ়ক", + "vector-view-viewsource": "উৎস চাওক", + "vector-jumptonavigation": "নেভিগেশ্যনলৈ যাওক", + "vector-jumptosearch": "সন্ধানলৈ যাওক", + "vector-jumptocontent": "সমললৈ যাওক", + "vector-more-actions": "অধিক", + "vector-search-loader": "সন্ধান পৰামৰ্শ লোড কৰা হৈছে", + "vector-searchsuggest-containing": "$1 থকা পৃষ্ঠাসমূহ সন্ধান কৰক", + "vector-intro-page": "Help:পৰিচয়", + "vector-toc-label": "সূচী", + "vector-toc-beginning": "পাতনি", + "vector-toc-toggle-button-label": "$1 উপ-অনুচ্ছেদ টগ'ল কৰক", + "vector-anon-user-menu-pages": "লগ-আউট কৰা সদস্যৰ বাবে পৃষ্ঠাসমূহ", + "vector-anon-user-menu-pages-learn": "অধিক শিকক", + "vector-anon-user-menu-pages-label": "সম্পাদনাৰ বিষয়ে অধিক জানক", + "vector-main-menu-tooltip": "মুখ্য মেনু", + "vector-toc-menu-tooltip": "সূচীপত্ৰ", + "vector-toc-collapsible-button-label": "সূচীপত্ৰ টগ'ল কৰক", + "vector-site-nav-label": "ছাইট", + "vector-main-menu-label": "মুখ্য মেনু", + "vector-limited-width-toggle": "সীমিত সমলৰ প্ৰস্থ টগ'ল কৰক", + "vector-page-tools-label": "সঁজুলি", + "vector-page-tools-general-label": "সাধাৰণ", + "vector-page-tools-actions-label": "কাৰ্যসমূহ", + "vector-pin-element-label": "পাৰ্শ্বদণ্ডলৈ যাওক", + "vector-unpin-element-label": "লুকুৱাওক", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|আলোচনা]]", + "tooltip-vector-anon-user-menu-title": "অধিক বিকল্প", + "vector-prefs-limited-width": "সীমিত প্ৰস্থ অৱস্থা সক্ষম কৰক", + "vector-prefs-limited-width-help": "পঠনৰ উত্তম অভিজ্ঞতাৰ বাবে সীমিত প্ৰস্থ অৱস্থা সক্ষম কৰক।", + "empty-language-selector-body": "এই পৃষ্ঠাৰ সমল অন্য ভাষাত সমৰ্থিত নহয়।" +} diff --git a/Vector/i18n/ase.json b/Vector/i18n/ase.json new file mode 100644 index 0000000..97a3500 --- /dev/null +++ b/Vector/i18n/ase.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Icemandeaf" + ] + }, + "skinname-vector": "M509x575S10e20494x425S14a20493x459S16d20492x478S1fb20494x502S17620493x525S11a20493x545", + "vector-skin-desc": "M535x520S19a00507x481S19a08465x481S22f14465x506S22f04509x506 M515x598S18d20494x403S17620499x432S11920493x452S17620499x482S14720500x502S17620499x528S17620499x548S14020485x568 M521x508S1f748479x493S1f740501x493 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M534x547S2ff00482x483S10001513x517S2e305488x487 S38700463x496 M535x536S20300516x521S20308470x521S26500516x502S26510470x502S14c30511x465S14c38465x465 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M520x540S37606481x460S15a40508x513S28801499x491S20500488x492", + "vector.css": "/* M509x529S16d20492x471S20320493x495S20320493x514 M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510 M534x518S2ff00482x483S15a10522x486S2b700514x458 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M521x508S1f748479x493S1f740501x493 M509x575S10e20494x425S14a20493x459S16d20492x478S1fb20494x502S17620493x525S11a20493x545 M517x524S15a02484x477S15a20489x484S21100504x492S22a04504x509 */", + "vector.js": "/* M520x523S1f540480x477S2a204497x495 M519x527S19220498x489S2a20c482x473S20320498x512 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510 M534x518S2ff00482x483S15a10522x486S2b700514x458 M524x539S14402493x485S1440a486x461S22b00508x509S22b10476x483 M536x521S2ff00482x483S10011515x491S28108515x461 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M509x575S10e20494x425S14a20493x459S16d20492x478S1fb20494x502S17620493x525S11a20493x545 M517x524S15a02484x477S15a20489x484S21100504x492S22a04504x509 */", + "vector-action-addsection": "M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M522x522S15a37478x479S10041485x492S20600500x492", + "vector-action-delete": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468", + "vector-action-move": "M552x509S18520488x494S18528449x494S26626522x492", + "vector-action-protect": "M512x519S15a19488x482S15a11489x482S20600488x508", + "vector-action-undelete": "M515x538S15a0a486x463S10050500x467S2330b485x516S20e00491x501 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468", + "vector-action-unprotect": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M512x519S15a19488x482S15a11489x482S20600488x508", + "vector-view-create": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501", + "vector-view-edit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468", + "vector-view-history": "M525x524S2ff00482x483S10e00507x494S26500511x474 M514x523S11541487x478S22f04489x509", + "vector-view-view": "M513x540S15a06486x459S10e50494x474S22b04493x510", + "vector-view-viewsource": "M525x524S2ff00482x483S10e00507x494S26500511x474 M509x545S16d20492x456S17620493x480S10120493x497S14a20494x530", + "vector-more-actions": "M526x508S18510501x493S18518475x493" +} diff --git a/Vector/i18n/ast.json b/Vector/i18n/ast.json new file mode 100644 index 0000000..9886ebe --- /dev/null +++ b/Vector/i18n/ast.json @@ -0,0 +1,38 @@ +{ + "@metadata": { + "authors": [ + "Esbardu", + "Tokvo", + "Xuacu", + "Fueyas" + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "Versión moderna de MonoBook, con un aspeutu frescu y munchos ameyoramientos d'usabilidá", + "prefs-vector-enable-vector-1-label": "Utilizar versión anticuada de Vector", + "vector.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */", + "vector.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */", + "vector-languages": "Llingües", + "vector-language-button-label": "{{PLURAL:$1|$1 llingua|$1 llingües}}", + "vector-no-language-button-label": "Añedir llingües", + "vector-action-addsection": "Amestar seición", + "vector-action-delete": "Desaniciar", + "vector-action-move": "Treslladar", + "vector-action-protect": "Protexer", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Camudar la proteición", + "vector-view-create": "Crear", + "vector-view-edit": "Editar", + "vector-view-history": "Ver historial", + "vector-view-view": "Lleer", + "vector-view-viewsource": "Ver fonte", + "vector-jumptonavigation": "Saltar a navegación", + "vector-jumptosearch": "Saltar a la gueta", + "vector-more-actions": "Más", + "vector-searchsuggest-containing": "Busca páxines que contengan $1", + "vector-toc-label": "Conteníu", + "vector-toc-beginning": "Entamu", + "vector-page-tools-label": "Ferramientes", + "vector-page-tools-general-label": "Xeneral", + "vector-unpin-element-label": "despintar" +} diff --git a/Vector/i18n/atj.json b/Vector/i18n/atj.json new file mode 100644 index 0000000..0b73915 --- /dev/null +++ b/Vector/i18n/atj.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Amqui", + "Benoit Rochon", + "Jean-paul echaquan" + ] + }, + "vector-action-addsection": "Acotcicta", + "vector-action-delete": "Wepina", + "vector-action-move": "Erikam", + "vector-view-create": "Ocita", + "vector-view-edit": "Meckotcita", + "vector-view-history": "E pe isparik", + "vector-view-view": "Tapwatcike", + "vector-view-viewsource": "Nte ici nta kanawapata e otciparik", + "vector-more-actions": "Erikam" +} diff --git a/Vector/i18n/av.json b/Vector/i18n/av.json new file mode 100644 index 0000000..2f0a521 --- /dev/null +++ b/Vector/i18n/av.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Gazimagomedov", + "Omarov M.", + "Умар" + ] + }, + "vector-skin-desc": "Бихьизабула 2 векторияб скин:\n* 2011 - The Modern version of MonoBook with fresh look and many usability improvements.\n* 2022 - The Vector built as part of the WMF [[mw:Desktop Improvements]] project.", + "vector-opt-out": "Басрияб куцалде бачине", + "vector-languages": "МацӀал", + "vector-language-button-label": "{{PLURAL:$1|$1 мацӀ}}", + "vector-action-addsection": "Тема жубазе", + "vector-action-delete": "Гилдизабизе", + "vector-action-move": "ЦӀар хисизе", + "vector-action-protect": "ЦӀунизе", + "vector-action-undelete": "БукӀахъинабизе", + "vector-action-unprotect": "ЦӀуни хисизе", + "vector-view-create": "ГIуцIизе", + "vector-view-edit": "Хисизабизе", + "vector-view-history": "Тарихалъухъ ралагьизе", + "vector-view-view": "ЦӀализе", + "vector-view-viewsource": "Кодалъухъ ралагьизе", + "vector-more-actions": "Жеги" +} diff --git a/Vector/i18n/avk.json b/Vector/i18n/avk.json new file mode 100644 index 0000000..502118a --- /dev/null +++ b/Vector/i18n/avk.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Axel xadolik", + "Wikimistusik" + ] + }, + "vector-action-addsection": "Loplekura va detce", + "vector-action-delete": "Sulara", + "vector-action-move": "Arrundara", + "vector-action-protect": "Nendara", + "vector-view-create": "Redura", + "vector-view-edit": "Betara", + "vector-view-history": "Wira va izvot", + "vector-view-view": "Belira", + "vector-view-viewsource": "klitawira", + "vector-more-actions": "Loon" +} diff --git a/Vector/i18n/awa.json b/Vector/i18n/awa.json new file mode 100644 index 0000000..2aebbed --- /dev/null +++ b/Vector/i18n/awa.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "1AnuraagPandey" + ] + }, + "vector-action-addsection": "शिर्षक जोडा जाय", + "vector-action-delete": "मेटावा जाय", + "vector-action-move": "घुस्कावा जाय", + "vector-action-protect": "सुरक्षित करा जाय", + "vector-action-undelete": "हटाइब वापस लिहा जाय", + "vector-action-unprotect": "सुरक्षा परिवर्तन करा जाय", + "vector-view-create": "बनावा जाय", + "vector-view-edit": "सम्पादन", + "vector-view-history": "इतिहास देखा जाय", + "vector-view-view": "पढा जाय", + "vector-view-viewsource": "स्रोत देखा जाय", + "vector-more-actions": "अउर" +} diff --git a/Vector/i18n/az.json b/Vector/i18n/az.json new file mode 100644 index 0000000..e59c64b --- /dev/null +++ b/Vector/i18n/az.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "AZISS", + "Arystanbek", + "Gulmammad", + "NMW03", + "Sortilegus", + "Toghrul Rahimli", + "Vago", + "Vugar 1981", + "Wertuose" + ] + }, + "skinname-vector": "Köhnə Vektor (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "vector-skin-desc": "2 Vektor dizaynı təqdim edir:\n* 2011 - MonoBook-un təzə görünüşü və bir çox istifadəyə yararlılıq təkmilləşdirmələri ilə Müasir versiyası.\n* 2022 - WMF [[mw:Desktop Improvements]] layihəsinin bir hissəsi kimi yaradılmış Vektor.", + "prefs-vector-enable-vector-1-label": "Legacy Vector istifadə edin", + "prefs-vector-enable-vector-1-help": "Növbəti bir neçə il ərzində Vector dizaynını tədricən yeniləyəcəyik. Legacy Vector, Vector-un köhnə versiyasına baxmağa imkan verəcəkdir (dekabr 2019-cu ildən etibarən). Yeniləmələr haqqında daha çox məlumat üçün [[mw:Reading/Web/Desktop_Improvements|layihə səhifəmizə]] nəzər yetirin.", + "vector-opt-out": "Əvvəlki dizayna keç", + "vector-opt-out-tooltip": "Köhnə dizayna qayıtmaq üçün parametrlərinizi dəyişdirin (köhnə Vektor)", + "vector.css": "/* Buradakı CSS kodu Vektor istifadəçiləri üçün yüklənəcək */", + "vector.js": "/* Buradakı JavaScript kodu Vektor istifadəçiləri üçün yüklənəcək */", + "vector-action-toggle-sidebar": "Yan paneli göstər/gizlət", + "vector-languages": "Dillər", + "vector-language-button-aria-label": "Başqa dildəki məqaləyə keçin. {{PLURAL:$1|$1 dildə}} mövcuddur.", + "vector-language-button-label": "{{PLURAL:$1|$1 dildə|$1 dildə}}", + "vector-no-language-button-label": "Dil əlavə et", + "vector-no-language-button-aria-label": "Bu məqalə yalnız bu dildə mövcuddur. Digər dillər üçün məqalə əlavə edin", + "vector-language-redirect-to-top": "Bu {{SITENAME}} layihəsində dil keçidləri məqalənin başlıq hissəsində verilmişdir. [[#p-lang-btn|Yuxarı get]].", + "vector-language-variant-switcher-label": "Dil variantını dəyişdirin", + "vector-action-addsection": "Mövzu əlavə et", + "vector-action-delete": "Sil", + "vector-action-move": "Adını dəyiş", + "vector-action-protect": "Mühafizə et", + "vector-action-undelete": "Bərpa et", + "vector-action-unprotect": "Mühafizəni kənarlaşdır", + "vector-view-create": "Yarat", + "vector-view-edit": "Redaktə", + "vector-view-history": "Tarixçəyə bax", + "vector-view-view": "Oxu", + "vector-view-viewsource": "Mənbəyə bax", + "vector-jumptonavigation": "Naviqasiyaya keçin", + "vector-jumptosearch": "Axtarışa keçin", + "vector-jumptocontent": "Məzmuna keçin", + "vector-more-actions": "Daha çox", + "vector-search-loader": "Axtarış təklifləri yüklənir", + "vector-searchsuggest-containing": "$1 ehtiva edən səhifələri axtar", + "vector-intro-page": "Help:Giriş", + "vector-toc-label": "Mündəricat", + "vector-toc-beginning": "Giriş", + "vector-toc-toggle-button-label": "$1 alt bölməsini göstər/gizlə", + "vector-anon-user-menu-pages": "Çıxış etmiş redaktorlar üçün səhifələr", + "vector-anon-user-menu-pages-learn": "daha ətraflı", + "vector-anon-user-menu-pages-label": "Redaktə haqqında ətraflı məlumat əldə edin", + "vector-main-menu-tooltip": "Əsas menyu", + "vector-toc-menu-tooltip": "Mündəricat", + "vector-toc-collapsible-button-label": "Mündəricatı göstər/gizlət", + "vector-site-nav-label": "Sayt", + "vector-main-menu-label": "Əsas menyu", + "vector-limited-width-toggle": "Məhdud məzmun genişliyini dəyişdirin", + "vector-page-tools-label": "Alətlər", + "vector-page-tools-general-label": "Ümumi", + "vector-page-tools-actions-label": "Fəaliyyətlər", + "vector-pin-element-label": "yan panelə keçir", + "vector-unpin-element-label": "gizlə", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Müzakirə]]", + "tooltip-vector-anon-user-menu-title": "Daha çox seçim", + "vector-prefs-limited-width": "Məhdud genişlik rejimini aktivləşdirin", + "vector-prefs-limited-width-help": "Təkmil oxuma təcrübəsi üçün məhdud en rejimini aktiv edin.", + "empty-language-selector-body": "Səhifə məzmunu digər dillərdə dəstəklənmir." +} diff --git a/Vector/i18n/azb.json b/Vector/i18n/azb.json new file mode 100644 index 0000000..09a6a6a --- /dev/null +++ b/Vector/i18n/azb.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Alp Er Tunqa", + "Amir a57", + "Bir morty", + "E THP", + "Ebrahimi-amir", + "Ilğım", + "Mousa" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 دیل|$1 دیل‌لر}}", + "vector-action-addsection": "مؤوضوع آرتیر", + "vector-action-delete": "سیل", + "vector-action-move": "داشی", + "vector-action-protect": "قوْرو", + "vector-action-undelete": "سیلمگی قایتار", + "vector-action-unprotect": "قوْروماغی دَییشدیر", + "vector-view-create": "یارات", + "vector-view-edit": "دَییشدیر", + "vector-view-history": "گئچمیشه باخ", + "vector-view-view": "اوْخو", + "vector-view-viewsource": "قایناغا باخ", + "vector-more-actions": "داها" +} diff --git a/Vector/i18n/ba.json b/Vector/i18n/ba.json new file mode 100644 index 0000000..d3f4c54 --- /dev/null +++ b/Vector/i18n/ba.json @@ -0,0 +1,34 @@ +{ + "@metadata": { + "authors": [ + "Assele", + "Haqmar", + "Sagan", + "Рустам Нурыев", + "З. ӘЙЛЕ" + ] + }, + "skinname-vector": "Векторлы", + "vector-skin-desc": "Ике йүнәлешле биҙәлеш темаһын тәҡдим итә:\n* 2011 - Яңыртылып биҙәлгән һәм ҡулланыу өсөн уңайлаштырылған MonoBook-тың заманса өлгөһө.\n* 2022 - ВМФ проекты сиктәрендә эшләнгән [[mw:Desktop Improvements Эш өҫтәлен яҡшыртыу]] йүнәлеше.", + "vector-languages": "Телдәр", + "vector-language-button-label": "{{PLURAL:$1|$1 тел}}", + "vector-no-language-button-label": "Тел өҫтәргә.", + "vector-action-addsection": "Тема өҫтәргә", + "vector-action-delete": "Юйырға", + "vector-action-move": "Исемен үҙгәртергә", + "vector-action-protect": "Һаҡларға", + "vector-action-undelete": "Тергеҙергә", + "vector-action-unprotect": "Һаҡлауҙы үҙгәртергә", + "vector-view-create": "Яһау", + "vector-view-edit": "Үҙгәртергә", + "vector-view-history": "Тарихты ҡарау", + "vector-view-view": "Уҡырға", + "vector-view-viewsource": "Сығанаҡты ҡарарға", + "vector-more-actions": "Тағы", + "vector-searchsuggest-containing": "Эстәлегендә $1 булған биттәрҙе эҙләргә", + "vector-toc-label": "Йөкмәткеһе", + "vector-toc-beginning": "Башы", + "vector-page-tools-label": "Ҡоралдар", + "vector-page-tools-general-label": "Дөйөм", + "vector-unpin-element-label": "йәшерергә" +} diff --git a/Vector/i18n/ban-bali.json b/Vector/i18n/ban-bali.json new file mode 100644 index 0000000..d23b2fe --- /dev/null +++ b/Vector/i18n/ban-bali.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Carma Citrawati", + "Chinamoonroll", + "Tok Pisin" + ] + }, + "vector-languages": "ᬪᬵᬱ", + "vector-language-button-label": "{{PLURAL:$1|$1 ᬪᬲ}}", + "vector-no-language-button-label": "ᬯᭂᬯᭂᬄᬪᬱ", + "vector-action-addsection": "ᬯᭂᬯᭂᬄᬢᭀᬧᬶᬓ᭄", + "vector-action-delete": "ᬳᬸᬲᬧ᭄", + "vector-action-move": "ᬕᬶᬗ᭄ᬲᬶᬭᬗ᭄", + "vector-view-create": "ᬓᬃᬤᬶ", + "vector-view-edit": "ᬳᬸᬳᬄ", + "vector-view-history": "ᬘᬶᬗᬓ᭄ᬩᬩᬤ᭄", + "vector-view-view": "ᬯᬘᬾᬦ᭄", + "vector-more-actions": "ᬮᬶᬬᬦᬦ᭄", + "vector-searchsuggest-containing": "ᬋᬋᬄ​ᬳᬦ᭄ᬢᬸᬓ᭄​ᬓᬘ​ᬫᬤᬕᬶᬂ $1", + "vector-toc-label": "ᬤᬕᬶᬂ", + "vector-toc-beginning": "ᬧᬫᬄᬩᬄ", + "vector-page-tools-label": "ᬧᬶᬭᬦ᭄ᬢᬶ", + "vector-page-tools-general-label": "ᬳᬸᬫᬸᬫ᭄", + "vector-unpin-element-label": "ᬳᭂᬂᬓᭂᬩᬂ" +} diff --git a/Vector/i18n/ban.json b/Vector/i18n/ban.json new file mode 100644 index 0000000..d2f07dc --- /dev/null +++ b/Vector/i18n/ban.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Adi Mayndra", + "Amire80", + "BASAbali", + "Carma citrawati", + "Chinamoonroll", + "Joseagush", + "NoiX180" + ] + }, + "skinname-vector": "Vector legacy (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Véktor", + "vector-skin-desc": "Nyadiayang 2 kules Véktor:\n* 2011 - Vérsi Modérn saking MonoBook antuk cingakan seger tur akéh paningkatan kawigunaan.\n* 2022 - Véktor sané kawangun dados wagian saking proyék [[mw:Desktop Improvements]] WMF.", + "prefs-vector-enable-vector-1-label": "Anggén Vektor Tetamian", + "prefs-vector-enable-vector-1-help": "Ring makudang warsa ngalantur, iraga pacang nganyarin kulea Vektor sacara matahap. Vektor Tetamian ngapersidayang Iraga antuk nyingakin antuk Vektor vérsi kuna (per Désémber 2019). Antuk malajahin luwih langkung indik panganyarain puniki, durus buka [[mw:Reading/Web/Desktop_Improvements|kaca proyék]] iraga.", + "vector-opt-out": "Alih nuju cingakan sadurungné", + "vector-opt-out-tooltip": "Uahin setélan Ida antuk mawali nuju cingakan sadurungné saking kules puniki (Vektor warisan)", + "vector.css": "/* Makasami CSS iriki pacang kabuka antuk anganggé saking kules Vector */", + "vector.js": "/* Makasami JavaScript iriki pacang kabuka antuk anganggé saking kules Vector */", + "vector-action-toggle-sidebar": "Tugel wilah sisi", + "vector-languages": "Basa", + "vector-language-button-aria-label": "Nuju suratan ring basa liyanan. Wénten {{PLURAL:$1|$1 basa}}", + "vector-language-button-label": "{{PLURAL:$1|$1 basa}}", + "vector-no-language-button-label": "Weweh basa", + "vector-no-language-button-aria-label": "Suratan puniki wantah kasedia ring basa puniki. Alih basa sasuratan nyané nuju ring basa liyanan", + "vector-language-redirect-to-top": "Ring {{SITENAME}} puniki, pranala basa magenah ring pahan duur kaca ring sisi murda suratan. [[#p-lang-btn|Nuju kaduur]].", + "vector-language-variant-switcher-label": "Gentos soroh basa", + "vector-action-addsection": "Weweh topik", + "vector-action-delete": "Usap", + "vector-action-move": "Gingsirang", + "vector-action-protect": "Saib", + "vector-action-undelete": "Tan kausap", + "vector-action-unprotect": "Uah saiban", + "vector-view-create": "Kardi", + "vector-view-edit": "Uah", + "vector-view-history": "Cingak babad", + "vector-view-view": "Wacén", + "vector-view-viewsource": "Cingak wit", + "vector-jumptonavigation": "Cebur nuju navigasi", + "vector-jumptosearch": "Cebur nuju parerehan", + "vector-jumptocontent": "Cebur nuju daging", + "vector-more-actions": "Lianan", + "vector-search-loader": "Ngamuat saran parerehan", + "vector-searchsuggest-containing": "Selehin kaca sané madaging $1", + "vector-intro-page": "Help:Pangater", + "vector-toc-label": "Daging", + "vector-toc-beginning": "Pamahbah", + "vector-toc-toggle-button-label": "Maalih subséksi $1", + "vector-anon-user-menu-pages": "Kaca panguahan sampun medal log", + "vector-anon-user-menu-pages-learn": "pelajahin malih", + "vector-anon-user-menu-pages-label": "Pelajahin malih indik panguahan", + "vector-main-menu-tooltip": "Menu utama", + "vector-toc-menu-tooltip": "Daging cakepan", + "vector-toc-collapsible-button-label": "Maalih ''daftar isi''", + "vector-site-nav-label": "Situs", + "vector-main-menu-label": "Menu utama", + "vector-limited-width-toggle": "Alihang linggah kontén kawates", + "vector-page-tools-label": "Piranti", + "vector-page-tools-general-label": "Umum", + "vector-page-tools-actions-label": "Parilaksana", + "vector-pin-element-label": "gingsirang nuju sidebar", + "vector-unpin-element-label": "engkebang", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Pabligbagan]]", + "tooltip-vector-anon-user-menu-title": "Opsi liyanan", + "vector-prefs-limited-width": "Idupang mode linggah kawates", + "vector-prefs-limited-width-help": "Idupang mode linggah kawates antuk ngabecikang pengalaman ngawacén", + "empty-language-selector-body": "Kontén kaca nénten kadukung ring basa liyanan." +} diff --git a/Vector/i18n/bar.json b/Vector/i18n/bar.json new file mode 100644 index 0000000..29f3bba --- /dev/null +++ b/Vector/i18n/bar.json @@ -0,0 +1,29 @@ +{ + "@metadata": { + "authors": [ + "Bua333", + "Joe Watzmo", + "Mucalexx", + "WikiBayer" + ] + }, + "vector-languages": "Sproochen", + "vector-language-button-label": "{{PLURAL:$1|$1 Sprache|$1 Sproochen}}", + "vector-no-language-button-label": "Sproochen dazuafiang", + "vector-action-addsection": "An Obschnitt dazua doa", + "vector-action-delete": "Leschn", + "vector-action-move": "Vaschiabm", + "vector-action-protect": "schitzn", + "vector-action-undelete": "Wiederherstön", + "vector-action-unprotect": "freigeem", + "vector-view-create": "Aufbaun", + "vector-view-edit": "Werkeln", + "vector-view-history": "Gschicht åhschaun", + "vector-view-view": "Leesen", + "vector-view-viewsource": "Quejtext ozoagn", + "vector-more-actions": "Meara", + "vector-searchsuggest-containing": "Suach nooch Seiten, dé $1 énthoiden", + "vector-page-tools-label": "Werkzeig", + "vector-page-tools-general-label": "Oigmoah", + "vector-unpin-element-label": "vastegga" +} diff --git a/Vector/i18n/bas.json b/Vector/i18n/bas.json new file mode 100644 index 0000000..6687eaa --- /dev/null +++ b/Vector/i18n/bas.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Danielgwd" + ] + }, + "vector-more-actions": "ǹtoŋ" +} diff --git a/Vector/i18n/bbc-latn.json b/Vector/i18n/bbc-latn.json new file mode 100644 index 0000000..b444e5a --- /dev/null +++ b/Vector/i18n/bbc-latn.json @@ -0,0 +1,35 @@ +{ + "@metadata": { + "authors": [ + "Daniel Harahap", + "NoiX180", + "Salomo Christian Hutajulu", + "WBT003Bugari", + "WBT006Hendra", + "WBT009Anju", + "Bennylin", + "27christian11" + ] + }, + "vector-languages": "Parhataan", + "vector-language-button-label": "{{PLURAL:$1|$1 parhataan}}", + "vector-no-language-button-label": "Tambai parhataan", + "vector-action-addsection": "Bagian na imbaru", + "vector-action-delete": "Bolonghon", + "vector-action-move": "Pahusor", + "vector-action-protect": "Ramoti", + "vector-action-undelete": "unang sesa", + "vector-action-unprotect": "Uba parlindungan", + "vector-view-create": "Tompa", + "vector-view-edit": "Patota", + "vector-view-history": "Patudu jujur panotaon", + "vector-view-view": "Jaha", + "vector-view-viewsource": "Ida haroanna", + "vector-more-actions": "Asingna muse", + "vector-searchsuggest-containing": "Diori alaman na marisi $1", + "vector-toc-label": "Impola", + "vector-toc-beginning": "Pamungka", + "vector-page-tools-label": "Parhohas", + "vector-page-tools-general-label": "Hatopan", + "vector-unpin-element-label": "bunihon" +} diff --git a/Vector/i18n/bcc.json b/Vector/i18n/bcc.json new file mode 100644 index 0000000..e618025 --- /dev/null +++ b/Vector/i18n/bcc.json @@ -0,0 +1,33 @@ +{ + "@metadata": { + "authors": [ + "Mostafadaneshvar", + "RigiMahnoor", + "Sultanselim baloch", + "Moshtank" + ] + }, + "vector-languages": "زبانان", + "vector-language-button-label": "{{PLURAL:$1|$1ءِ زبان}}", + "vector-no-language-button-label": "زبانانءِ ھۏر کنگ", + "vector-action-addsection": "سرگالے ھۏر کنگ", + "vector-action-delete": "پاک کنگ", + "vector-action-move": "دگہ جاھے کنگ", + "vector-action-protect": "سمبالی", + "vector-action-undelete": "ترینگ", + "vector-action-unprotect": "پروتکشنء ٹگل بدئ", + "vector-view-create": "بنݔنگ", + "vector-view-edit": "ٹگلݔنگ", + "vector-view-history": "رمسءِ چارگ", + "vector-view-view": "وانگ", + "vector-view-viewsource": "سرچممگءِ سۏج", + "vector-more-actions": "گݔشتِر", + "vector-searchsuggest-containing": "شۏھاز مہ تاکانءِ تۏکا $1", + "vector-toc-label": "تلمبار", + "vector-toc-beginning": "بُنرِد", + "vector-main-menu-tooltip": "رݔدگݔن منو", + "vector-main-menu-label": "رݔدگݔن منو", + "vector-page-tools-label": "ابزاران", + "vector-page-tools-general-label": "لَس", + "vector-unpin-element-label": "اندݔم کنگ" +} diff --git a/Vector/i18n/bci.json b/Vector/i18n/bci.json new file mode 100644 index 0000000..d20df6f --- /dev/null +++ b/Vector/i18n/bci.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Kjeanclaude" + ] + }, + "vector-languages": "Aniein moun", + "vector-language-button-label": "{{PLURAL:$1|$1 aniein|$1 aniein moun}}", + "vector-no-language-button-label": "Fa aniein moun goua sou", + "vector-action-addsection": "Fa ndè ouflè goua sou", + "vector-action-delete": "Nounnoun", + "vector-action-move": "Katchi floua boué nga i douman", + "vector-action-protect": "Sassawa", + "vector-view-create": "Yi", + "vector-view-edit": "Klè noun", + "vector-view-history": "Nian laa sa", + "vector-view-view": "Kanngan", + "vector-more-actions": "Ouflè ékun", + "vector-searchsuggest-containing": "Kounndè floué boué moun nga liké nga wo noun: $1", + "vector-page-tools-label": "Liké moun", + "vector-page-tools-general-label": "Lika ngba (liké kounndèlè)", + "vector-unpin-element-label": "fa fia" +} diff --git a/Vector/i18n/bcl.json b/Vector/i18n/bcl.json new file mode 100644 index 0000000..da58416 --- /dev/null +++ b/Vector/i18n/bcl.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Daramlagon", + "Filipinayzd", + "Geopoet", + "Kunokuno", + "ShimunUfesoj" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 lenggwahe|$1 mga lenggwahe}}", + "vector-action-addsection": "Magdagdag nin pag-uulayan", + "vector-action-delete": "puraon", + "vector-action-move": "Ibalyo", + "vector-action-protect": "Protektaran", + "vector-action-undelete": "Bawion sa pagkapara", + "vector-action-unprotect": "Ribayan an proteksyon", + "vector-view-create": "Gibuhon", + "vector-view-edit": "Baguhon", + "vector-view-history": "Hilingon an kasaysayan", + "vector-view-view": "Basahon", + "vector-view-viewsource": "Hilingón an ginikánan", + "vector-more-actions": "Labi pa", + "vector-searchsuggest-containing": "Maghanap nin mga pahinang igwang $1" +} diff --git a/Vector/i18n/bdr.json b/Vector/i18n/bdr.json new file mode 100644 index 0000000..781b498 --- /dev/null +++ b/Vector/i18n/bdr.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Tofeiku" + ] + }, + "vector-languages": "Ling", + "vector-language-button-label": "{{PLURAL:$1|$1 ling}}", + "vector-no-language-button-label": "Ngenopon tuturan", + "vector-action-addsection": "Namba serita'", + "vector-action-delete": "Penelanyap", + "vector-action-move": "Pinali", + "vector-action-protect": "Sindung", + "vector-view-create": "Muat", + "vector-view-edit": "Niuba", + "vector-view-history": "Ngenda' kisa dau-dau", + "vector-view-view": "Boso", + "vector-more-actions": "Iko", + "vector-searchsuggest-containing": "Penemia laman yang bengen $1", + "vector-toc-label": "Isi", + "vector-toc-beginning": "Nimpoon", + "vector-page-tools-label": "Pekakas", + "vector-page-tools-general-label": "Umum", + "vector-unpin-element-label": "tenapuk" +} diff --git a/Vector/i18n/be-tarask.json b/Vector/i18n/be-tarask.json new file mode 100644 index 0000000..e377d6c --- /dev/null +++ b/Vector/i18n/be-tarask.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "EugeneZelenko", + "Nieszczarda2", + "Red Winged Duck", + "Renessaince", + "Wizardist" + ] + }, + "skinname-vector": "Стары Вэктар (2010)", + "skinname-vector-2022": "Вэктар (2022)", + "vector-specialversion-name": "Вэктар", + "vector-skin-desc": "Прадастаўляе 2 тэмы Вэктару:\n* 2011 — сучасная вэрсія MonoBook з абноўленым выглядам і шматлікімі паляпшэньнямі;\n* 2022 — Вэктар, збудаваны ў межах праекту ФВМ [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Выкарыстаць стары Вэктар", + "prefs-vector-enable-vector-1-help": "Цягам наступных некалькіх гадоў мы будзем паступова абнаўляць тэму „Вэктар“. Пераемны Вэктар дазволіць вам праглядаць старую вэрсію Вэктара (паводле стану на сьнежань 2019 року). Каб даведацца пра абнаўленьні болей, зайдзіце на старонку [[mw:Reading/Web/Desktop_Improvements|нашага праекту]].", + "vector-opt-out": "Пераключыцца на стары выгляд", + "vector-opt-out-tooltip": "Зьмяніце налады, каб вярнуцца да старой тэмы (старога Вэктару)", + "vector.css": "/* Усе зьмешчаныя тут CSS будуць загружаныя для ўдзельнікаў, якія выкарыстоўваюць тэму афармленьня Вэктар */", + "vector.js": "/* Увесь зьмешчаны тут JavaScript будзе загружаны для ўдзельнікаў, якія выкарыстоўваюць тэму афармленьня Вэктар */", + "vector-action-toggle-sidebar": "Пераключыць бакавую панэль", + "vector-languages": "Мовы", + "vector-language-button-aria-label": "Перайсьці да артыкула на іншай мове. Выбраць з: {{PLURAL:$1|$1 language|$1 languages}}", + "vector-language-button-label": "{{PLURAL:$1|$1 мова|$1 мовы|$1 моваў}}", + "vector-no-language-button-label": "Дадаць мовы", + "vector-no-language-button-aria-label": "Гэты артыкул існуе толькі гэтай мовай. Дадайце артыкулы іншымі мовамі", + "vector-language-redirect-to-top": "У гэтым праекце {{SITENAME}} моўныя спасылкі знаходзяцца ўверсе старонкі насупраць назвы артыкулу. [[#p-lang-btn|Перайсьці ўгору]].", + "vector-language-variant-switcher-label": "Зьмяніць варыянт мовы", + "vector-action-addsection": "Дадаць тэму", + "vector-action-delete": "Выдаліць", + "vector-action-move": "Перанесьці", + "vector-action-protect": "Абараніць", + "vector-action-undelete": "Аднавіць", + "vector-action-unprotect": "Зьмяніць абарону", + "vector-view-create": "Стварыць", + "vector-view-edit": "Рэдагаваць", + "vector-view-history": "Паказаць гісторыю", + "vector-view-view": "Чытаць", + "vector-view-viewsource": "Паказаць крыніцу", + "vector-jumptonavigation": "Перайсьці да навігацыі", + "vector-jumptosearch": "Перайсьці да пошуку", + "vector-jumptocontent": "Перайсьці да зьместу", + "vector-more-actions": "Болей", + "vector-search-loader": "Загрузка прапановаў пошуку", + "vector-searchsuggest-containing": "Пошук старонак, якія маюць $1", + "vector-intro-page": "Help:Уводзіны", + "vector-toc-label": "Зьмест", + "vector-toc-beginning": "Пачатак", + "vector-toc-toggle-button-label": "Пераключыць падразьдзел $1", + "vector-anon-user-menu-pages": "Старонкі для неаўтарызаваных рэдактараў", + "vector-anon-user-menu-pages-learn": "даведацца болей", + "vector-anon-user-menu-pages-label": "Даведайцеся пра рэдагаваньне болей", + "vector-main-menu-tooltip": "Галоўнае мэню", + "vector-toc-menu-tooltip": "Зьмест", + "vector-toc-collapsible-button-label": "Схаваць/паказаць зьмест", + "vector-site-nav-label": "Сайт", + "vector-page-tools-label": "Інструмэнты", + "vector-page-tools-general-label": "Агульныя", + "vector-pin-element-label": "перанесьці ў бакавую панэль", + "vector-unpin-element-label": "схаваць", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Абмеркаваньне]]", + "tooltip-vector-anon-user-menu-title": "Болей парамэтраў", + "vector-prefs-limited-width": "Уключыць рэжым абмежаванай шырыні", + "vector-prefs-limited-width-help": "Уключыць рэжым абмежаванай шырыні дзеля лепшага чытаньня." +} diff --git a/Vector/i18n/be.json b/Vector/i18n/be.json new file mode 100644 index 0000000..cd81523 --- /dev/null +++ b/Vector/i18n/be.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Artsiom91", + "Chadyka", + "Kareyac", + "Maksim L.", + "Mikalai Udodau", + "No Sleep till Krupki", + "Plaga med", + "Tomato Cream", + "Yury Tarasievich", + "Дзяніс Тутэйшы", + "Хомелка" + ] + }, + "vector-skin-desc": "Забяспечвае 2 вокладкі Вектар:\n* 2011 — Сучасная версія вокладкі Манабук, з абноўленым відам і шматлікімі зручнымі паляпшэннямі.\n* 2022 — Вектар, створаны ў рамках праекта WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Ужыць Legacy Vector", + "prefs-vector-enable-vector-1-help": "Цягам наступных некалькіх гадоў мы будзем паступова абнаўляць шаблон Vector. Legacy Vector дазволіць праглядаць старую версію Vector (станам на снежань 2019 года). Каб даведацца больш, перайдзіце на нашу [[mw:Reading/Web/Desktop_Improvements|старонку праекта]].", + "vector-opt-out": "Пераключыцца на стары выгляд", + "vector-opt-out-tooltip": "Змяніце налады, каб вярнуцца да старога выгляду вокладкі (Стары Vector)", + "vector-action-toggle-sidebar": "Пераключыць бакавую панэль", + "vector-languages": "Мовы", + "vector-language-button-aria-label": "Перайсці да артыкула на іншай мове. Даступны на $1 {{PLURAL:$1|мове|мовах}}.", + "vector-language-button-label": "{{PLURAL:$1|$1 мова|$1 мовы|$1 моў}}", + "vector-no-language-button-label": "Дадаць мовы", + "vector-no-language-button-aria-label": "Гэты артыкул ёсць толькі на гэтай мове. Дадайце артыкул для іншых моў", + "vector-language-redirect-to-top": "На гэтай пляцоўцы {{SITENAME}} моўныя спасылкі знаходзяцца ўверсе старонкі насупраць загалоўка артыкула. [[#p-lang-btn|Перайсці ўверх]].", + "vector-language-variant-switcher-label": "Змяніць моўны варыянт", + "vector-action-addsection": "Дадаць тэму", + "vector-action-delete": "Выдаліць", + "vector-action-move": "Перанесці", + "vector-action-protect": "Ахова", + "vector-action-undelete": "Аднавіць", + "vector-action-unprotect": "Змяніць ахову", + "vector-view-create": "Стварыць", + "vector-view-edit": "Правіць", + "vector-view-history": "Паказаць гісторыю", + "vector-view-view": "Чытаць", + "vector-view-viewsource": "Паказаць зыходны код", + "vector-jumptonavigation": "Перайсці да навігацыі", + "vector-jumptosearch": "Перайсці да пошуку", + "vector-jumptocontent": "Перайсці да зместу", + "vector-more-actions": "Яшчэ", + "vector-search-loader": "Загрузка прапаноў пошуку", + "vector-searchsuggest-containing": "Шукаць старонкі, якія змяшчаюць $1", + "vector-intro-page": "Help:Даведка", + "vector-toc-label": "Змест", + "vector-toc-beginning": "Пачатак", + "vector-toc-toggle-button-label": "Змяніць стан падраздзелу $1", + "vector-anon-user-menu-pages": "Старонкі для ананімных рэдактараў", + "vector-anon-user-menu-pages-learn": "даведацца больш", + "vector-anon-user-menu-pages-label": "Даведацца больш пра праўку", + "vector-main-menu-tooltip": "Галоўнае меню", + "vector-toc-menu-tooltip": "Змест", + "vector-toc-collapsible-button-label": "Пераключыць змест", + "vector-site-nav-label": "Праект", + "vector-main-menu-label": "Галоўнае меню", + "vector-limited-width-toggle": "Пераключыць абмежаваную шырыню зместу", + "vector-page-tools-label": "Інструменты", + "vector-page-tools-general-label": "Агульныя", + "vector-page-tools-actions-label": "Дзеянні", + "vector-pin-element-label": "перанесці да бакавой панэлі", + "vector-unpin-element-label": "схаваць", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Размова]]", + "tooltip-vector-anon-user-menu-title": "Больш магчымасцей", + "vector-prefs-limited-width": "Уключыць рэжым абмежаванай шырыні", + "vector-prefs-limited-width-help": "Уключыце рэжым абмежаванай шырыні для лепшага чытання.", + "empty-language-selector-body": "Змест старонкі недаступны на іншых мовах." +} diff --git a/Vector/i18n/bew.json b/Vector/i18n/bew.json new file mode 100644 index 0000000..602690f --- /dev/null +++ b/Vector/i18n/bew.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "Naval Scene", + "Bangrapip", + "Amire80" + ] + }, + "vector-skin-desc": "Nyediain 2 kulit Bèktor:\n* 2011 - Pèrsi moderen deri MonoBook dengen roman anyar èn banyak peningkatan kebegunaan.\n* 2022 -Bèktor nyang dibangun sebagé bagèan deri proyèk WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Paké Bèktor Warisan", + "prefs-vector-enable-vector-1-help": "Dalem beberapa tahon lagi, kita bakal pelan-pelan merbaruin kulit Bèktornya. Bèktor Warisan bakal ngasi lu liat-liat paké Bèktor pèrsi lama (per Désèmber 2019). Bakal mbelajarin lebi lanjut pasal pembaruan, buka kita punya [[mw:Reading/Web/Desktop_Improvements|halaman proyèk]].", + "vector-opt-out": "Ganti ke roman lama", + "vector-opt-out-tooltip": "Robah lu punya pengaturan èn balik ke roman lama deri ni kulit (Bèktor warisan)", + "vector-action-toggle-sidebar": "Cetèkin palang samping", + "vector-languages": "Basa", + "vector-language-button-aria-label": "Pegi ke makalah dalem laèn basa. Kesedia dalem {{PLURAL:$1|$1 basa}}", + "vector-language-button-label": "{{PLURAL:$1|$1 basa}}", + "vector-no-language-button-label": "Tambah basa", + "vector-no-language-button-aria-label": "Ni makalah cuman ada dalem ni basa. Tambah makalah bakal laèn-laèn basa", + "vector-language-redirect-to-top": "Di ni {{SITENAME}}, sènggètan basa ada di atas halaman di sampingnya judulmakalah. [[#p-lang-btn|Ke atas]].", + "vector-language-variant-switcher-label": "Robah ragem basa", + "vector-action-addsection": "Tambah topik", + "vector-action-delete": "Apus", + "vector-action-move": "Pindahin", + "vector-action-protect": "Lindungin", + "vector-action-undelete": "Urungin ngapusnya", + "vector-action-unprotect": "Robah perlindungan", + "vector-view-create": "Keja", + "vector-view-edit": "Permak", + "vector-view-history": "Deleng riwayat", + "vector-view-view": "Baca", + "vector-view-viewsource": "Deleng sumber", + "vector-jumptonavigation": "Loncat ke babelan", + "vector-jumptosearch": "Loncat ke penyarian", + "vector-jumptocontent": "Loncat ke isi", + "vector-more-actions": "Laènnya", + "vector-search-loader": "Muat saran penyarian", + "vector-searchsuggest-containing": "Cari halaman nyang ada $1", + "vector-intro-page": "Help:Mukadimah", + "vector-toc-label": "Daptar isi", + "vector-toc-beginning": "Awal", + "vector-toc-toggle-button-label": "Cetèkin anakbagèan $1", + "vector-anon-user-menu-pages": "Halaman bakal pemermak nyang kuar", + "vector-anon-user-menu-pages-learn": "belajarin lebi lanjut", + "vector-anon-user-menu-pages-label": "Belajarin lebi lanjut pasal pemermakan", + "vector-main-menu-tooltip": "Menu utama", + "vector-toc-menu-tooltip": "Daptar isi", + "vector-toc-collapsible-button-label": "Cetèkin daptar isi", + "vector-site-nav-label": "Pelampang", + "vector-main-menu-label": "Menu utama", + "vector-limited-width-toggle": "Cetèkin lèbar isi kewates", + "vector-page-tools-label": "Peranti", + "vector-page-tools-general-label": "Umum", + "vector-page-tools-actions-label": "Piil", + "vector-pin-element-label": "pindah ke palang samping", + "vector-unpin-element-label": "umpetin", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Perhadring]]", + "tooltip-vector-anon-user-menu-title": "Opsi laènnya", + "vector-prefs-limited-width": "Nyalain mode lèbar kewates", + "vector-prefs-limited-width-help": "Nyalain mode lèbar kewates biar lebi ènak ngebacanya.", + "empty-language-selector-body": "Isi halaman kaga' didukung di laèn-laèn basa." +} diff --git a/Vector/i18n/bfa.json b/Vector/i18n/bfa.json new file mode 100644 index 0000000..4eb958a --- /dev/null +++ b/Vector/i18n/bfa.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Denayadennis" + ] + }, + "vector-languages": "Kutujin", + "vector-language-button-label": "{{PLURAL:$1|$1 kutu |$1 kutujin}}", + "vector-no-language-button-label": "'yalaki kune kutujin", + "vector-page-tools-label": "Tito", + "vector-page-tools-general-label": "'bukuluŋ", + "vector-unpin-element-label": "muke" +} diff --git a/Vector/i18n/bg.json b/Vector/i18n/bg.json new file mode 100644 index 0000000..1cfbc09 --- /dev/null +++ b/Vector/i18n/bg.json @@ -0,0 +1,66 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Borislav", + "DCLXVI", + "ShockD", + "Spiritia", + "StanProg", + "Termininja" + ] + }, + "vector-skin-desc": "Предоставя 2 облика от тип „Вектор“:\n* 2011: „Модерна“ – версия на MonoBook с обновен дизайн и много подобрения на ползваемостта.\n* 2022: „Векторна“ – създадена като част от проекта WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Използване на стария Vector", + "prefs-vector-enable-vector-1-help": "През следващите няколко години постепенно ще актуализираме облика Vector. Legacy Vector ще Wи позволи да видите старата версия на Vector (от декември 2019 г.). За да научите повече за актуализациите, отидете на [[mw:Reading/Web/Desktop_Improvements|страницата на проекта]].", + "vector-opt-out": "Превключване към стария изглед", + "vector-opt-out-tooltip": "Променете настройките си, за да се върнете към стария вид на облика (Vector legacy)", + "vector-action-toggle-sidebar": "Превключване на страничната лента", + "vector-languages": "Езици", + "vector-language-button-aria-label": "Към на статията на друг език. Налична на {{PLURAL:$1|$1 език|$1 езика}}", + "vector-language-button-label": "{{PLURAL:$1|$1 език|$1 езика}}", + "vector-no-language-button-label": "Добавяне на езици", + "vector-no-language-button-aria-label": "Тази статия съществува само на този език. Добавете статията за други езици", + "vector-language-redirect-to-top": "В тази {{SITENAME}} езиковите връзки са в горната част на страницата срещу заглавието на статията. [[#p-lang-btn|Отидете най-горе]].", + "vector-language-variant-switcher-label": "Промяна на езиковия вариант", + "vector-action-addsection": "Добавяне на тема", + "vector-action-delete": "Изтриване", + "vector-action-move": "Преместване", + "vector-action-protect": "Защита", + "vector-action-undelete": "Възстановяване", + "vector-action-unprotect": "Промяна на защитата", + "vector-view-create": "Създаване", + "vector-view-edit": "Редактиране", + "vector-view-history": "История", + "vector-view-view": "Преглед", + "vector-view-viewsource": "Преглед на кода", + "vector-jumptonavigation": "Направо към навигацията", + "vector-jumptosearch": "Направо към търсенето", + "vector-jumptocontent": "Направо към съдържанието", + "vector-more-actions": "Още", + "vector-search-loader": "Зареждане на предложенията за търсене", + "vector-searchsuggest-containing": "Търсене на страници съдържащи $1", + "vector-intro-page": "Help:Въведение", + "vector-toc-label": "Съдържание", + "vector-toc-beginning": "Начало", + "vector-toc-toggle-button-label": "Превключване на подраздел $1", + "vector-anon-user-menu-pages": "Страници за излезли от системата редактори", + "vector-anon-user-menu-pages-learn": "научете повече", + "vector-anon-user-menu-pages-label": "Научете повече за редактирането", + "vector-main-menu-tooltip": "Главно меню", + "vector-toc-menu-tooltip": "Съдържание", + "vector-toc-collapsible-button-label": "Скриване/показване на съдържанието", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Главно меню", + "vector-limited-width-toggle": "Превключване на ограничена дължина на съдържанието", + "vector-page-tools-label": "Инструменти", + "vector-page-tools-general-label": "Основни", + "vector-page-tools-actions-label": "Действия", + "vector-pin-element-label": "преместване към страничната лента", + "vector-unpin-element-label": "скриване", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Дискусия]]", + "tooltip-vector-anon-user-menu-title": "Допълнителни опции", + "vector-prefs-limited-width": "Включване на режим с ограничена ширина", + "vector-prefs-limited-width-help": "Включете режима с ограничена ширина за подобрено четене.", + "empty-language-selector-body": "Съдържанието на страницата не се поддържа на други езици." +} diff --git a/Vector/i18n/bgc.json b/Vector/i18n/bgc.json new file mode 100644 index 0000000..663f4eb --- /dev/null +++ b/Vector/i18n/bgc.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "भारत्पराक्रमि" + ] + }, + "vector-languages": "भाषाएँ", + "vector-language-button-label": "{{PLURAL:$1|$1 भाषा|$1 भाषाएँ}}", + "vector-no-language-button-label": "भाषाएँ जोड़ें", + "vector-action-addsection": "विषय जोड़ें", + "vector-action-delete": "हटाएँ", + "vector-action-move": "स्थानांतरित करें", + "vector-action-protect": "सुरक्षा करें", + "vector-view-create": "बनावें", + "vector-view-history": "इतिहास नै देखें", + "vector-more-actions": "और भी", + "vector-searchsuggest-containing": "$1 सी सहित पन्ने खोजें", + "vector-page-tools-label": "औजारें", + "vector-page-tools-general-label": "सामान्य", + "vector-unpin-element-label": "छिपावें" +} diff --git a/Vector/i18n/bgn.json b/Vector/i18n/bgn.json new file mode 100644 index 0000000..6e3941f --- /dev/null +++ b/Vector/i18n/bgn.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Baloch Afghanistan" + ] + }, + "vector-action-addsection": "یک بخش ئی لۆڑ کورتین", + "vector-action-move": "انتقال", + "vector-view-create": "جوڑ\t کورتین", + "vector-view-edit": "ایڈیٹ", + "vector-view-history": "تاریخچه ئی دیستین", + "vector-view-view": "وانتین", + "vector-more-actions": "گیشتیر" +} diff --git a/Vector/i18n/bho.json b/Vector/i18n/bho.json new file mode 100644 index 0000000..cb782e1 --- /dev/null +++ b/Vector/i18n/bho.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Ganesh", + "Nepaboy", + "SatyamMishra" + ] + }, + "vector-languages": "भाषा", + "vector-language-button-label": "{{PLURAL:$1|$1 भाषा|$1 भाषा सभ}}", + "vector-no-language-button-label": "भाषा जोड़ीं", + "vector-action-addsection": "बिसय जोड़ीं", + "vector-action-delete": "मिटाईं", + "vector-action-move": "स्थानांतरण", + "vector-action-protect": "सुरक्षित करीं", + "vector-action-undelete": "मत मिटाईं", + "vector-action-unprotect": "सुरक्षा बदलीं", + "vector-view-create": "बनाईं", + "vector-view-edit": "संपादन", + "vector-view-history": "इतिहास देखीं", + "vector-view-view": "पढ़ीं", + "vector-view-viewsource": "स्रोत देखीं", + "vector-more-actions": "अधिका", + "vector-searchsuggest-containing": "पन्ना खोजीं जिनहन में $1 होखे", + "vector-page-tools-label": "औजार", + "vector-page-tools-general-label": "जनरल", + "vector-unpin-element-label": "लुकवाईं" +} diff --git a/Vector/i18n/bi.json b/Vector/i18n/bi.json new file mode 100644 index 0000000..a30c41b --- /dev/null +++ b/Vector/i18n/bi.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Sotiale" + ] + }, + "vector-action-move": "Muv", + "vector-view-history": "Lukluk histri", + "vector-view-view": "Rid" +} diff --git a/Vector/i18n/bjn.json b/Vector/i18n/bjn.json new file mode 100644 index 0000000..6e3953f --- /dev/null +++ b/Vector/i18n/bjn.json @@ -0,0 +1,36 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ezagren", + "J Subhi", + "Mnam23", + "Arcuscloud" + ] + }, + "vector-opt-out": "Baalih ka tampaian lawas", + "vector-languages": "Basa", + "vector-language-button-label": "{{PLURAL:$1|$1 basa}}", + "vector-no-language-button-label": "Tambah basa", + "vector-action-addsection": "Tambahi tupik", + "vector-action-delete": "Hapus", + "vector-action-move": "Pindahakan", + "vector-action-protect": "Lindungi", + "vector-action-undelete": "Pawalangan pahapusan", + "vector-action-unprotect": "Palindungan", + "vector-view-create": "Ulah", + "vector-view-edit": "Babak", + "vector-view-history": "Janaki riwayat", + "vector-view-view": "Baca", + "vector-view-viewsource": "Janaki asal-mulanya", + "vector-more-actions": "Lainnya", + "vector-searchsuggest-containing": "Gagai laman nang baisi $1", + "vector-toc-label": "Isi", + "vector-toc-beginning": "Panambayan", + "vector-anon-user-menu-pages-learn": "palajari labih lanjut", + "vector-anon-user-menu-pages-label": "Palajari labih lanjut pasal mambabak", + "vector-page-tools-label": "Pakakas", + "vector-page-tools-general-label": "Umum", + "vector-pin-element-label": "baalih ka bilah sisi", + "vector-unpin-element-label": "suhukakan" +} diff --git a/Vector/i18n/blc.json b/Vector/i18n/blc.json new file mode 100644 index 0000000..6a28341 --- /dev/null +++ b/Vector/i18n/blc.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Muskwatch" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|smawiixw wa slhk'msta|$1 wa slhk'msta}}", + "vector-action-move": "sasttxw", + "vector-view-create": "sikstucw ti umat t'ayc", + "vector-view-edit": "qw'lasiitucw", + "vector-view-history": "sik'cicw ti s7alh7ayts ti umat t'ayc alh tu patsalh txw", + "vector-view-view": "sipaapqanu", + "vector-more-actions": "inic7acwlh" +} diff --git a/Vector/i18n/blk.json b/Vector/i18n/blk.json new file mode 100644 index 0000000..885abaf --- /dev/null +++ b/Vector/i18n/blk.json @@ -0,0 +1,35 @@ +{ + "@metadata": { + "authors": [ + "Khun Kt", + "Ninjastrikers", + "咽頭べさ", + "ခွန်ဖန်ဒွဲ့" + ] + }, + "vector-languages": "ဘာႏသာႏငဝ်းငွါဖုံႏ", + "vector-language-button-label": "{{PLURAL:$1|$1 ဘာႏသာႏငဝ်းငွါ|$1 ဘာႏသာႏငဝ်းငွါဖိုင်ႏ}}", + "vector-no-language-button-label": "ထဲမ်သော့ꩻဘာႏသာႏငဝ်းငွါဖိုင်ႏ", + "vector-action-addsection": "ထဲမ်သော့ꩻထဲင်း အကျောင်ꩻခရာႏတသာ", + "vector-action-delete": "ယားကုဲင်", + "vector-action-move": "ခြုဲင်း", + "vector-action-protect": "ရဲးကမ်းသွော့", + "vector-action-undelete": "ယားကုဲင်တဝ်းဒုမ်", + "vector-action-unprotect": "ပြောင်ꩻလုဲင်ႏ အရဲးအကမ်း", + "vector-view-create": "ဖန်ဆင်ꩻ", + "vector-view-edit": "မွဉ်းဖျင်", + "vector-view-history": "ထွားရာႏဇာႏဝင်ႏ", + "vector-view-view": "ဟော်ꩻ", + "vector-view-viewsource": "ထွားအရွီးအခိုႏ", + "vector-more-actions": "ထဲင်းယင်း", + "vector-searchsuggest-containing": "ထိုမ်ႏသွော့ ကပါသော့ꩻ လိတ်မဲ့ငါဖုံႏယို။ $1", + "vector-intro-page": "Help:ငဝ်းတယ်ႏအွဉ်", + "vector-toc-label": "ဟော်ꩻထွားရီးတာႏ", + "vector-toc-beginning": "အစ", + "vector-anon-user-menu-pages-learn": "လွူꩻထွားထဲင်းအသွုပ်", + "vector-anon-user-menu-pages-label": "လွူꩻထွားထဲင်း မွဉ်းဖျင်ခရာႏအထဲင်း", + "vector-page-tools-label": "ကိရိယာႏဖိုင်ႏ", + "vector-page-tools-general-label": "အစွိုးစွိုးအဒဝ်ႏဒဝ်ႏ", + "vector-unpin-element-label": "အွဉ်ႏပလို့ꩻ", + "tooltip-vector-anon-user-menu-title": "လွိုက်ခရာႏအထဲင်းဖိုင်ႏ" +} diff --git a/Vector/i18n/bm.json b/Vector/i18n/bm.json new file mode 100644 index 0000000..9164ec8 --- /dev/null +++ b/Vector/i18n/bm.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Amadouyoro.thiam" + ] + }, + "vector-view-view": "Kalan" +} diff --git a/Vector/i18n/bn.json b/Vector/i18n/bn.json new file mode 100644 index 0000000..2839091 --- /dev/null +++ b/Vector/i18n/bn.json @@ -0,0 +1,76 @@ +{ + "@metadata": { + "authors": [ + "Aftab1995", + "Aftabuzzaman", + "Amire80", + "Bellayet", + "Leemon2010", + "Nasir8891", + "Sourav Halder", + "Tauhid16", + "Wikitanvir", + "Yahya", + "আজিজ", + "আফতাবুজ্জামান" + ] + }, + "skinname-vector": "ভেক্টর উত্তরাধিকার (২০১০)", + "skinname-vector-2022": "ভেক্টর (২০২২)", + "vector-specialversion-name": "ভেক্টর", + "vector-skin-desc": "২টি ভেক্টর আবরণ প্রদান করে:\n* ২০১১ - নতুন চেহারায় মনোবুকের আধুনিক সংস্করণ এবং ব্যবহারযোগ্যতায় আরো অনেক উন্নতি।\n* ২০২২ - ডব্লিউএমএফ [[mw:Desktop Improvements|ডেস্কটপ উন্নয়ন]] প্রকল্পের অংশ হিসেবে নির্মিত ভেক্টর।", + "prefs-vector-enable-vector-1-label": "উত্তরাধিকার ভেক্টর ব্যবহার করুন", + "prefs-vector-enable-vector-1-help": "আগামী কয়েক বছর ধরে, আমরা ধীরে ধীরে ভেক্টর আবরণ হালনাগাদ করব। উত্তরাধিকার ভেক্টর আপনাকে ভেক্টরের পুরনো সংস্করণ দেখার অনুমতি দেবে (ডিসেম্বর ২০১৯ অনুযায়ী)। এই হালনাগাদ সম্পর্কে আরও জানতে, আমাদের [[mw:Reading/Web/Desktop_Improvements|প্রকল্প পাতায়]] যান।", + "vector-opt-out": "পুরনো চেহারাতে যান", + "vector-opt-out-tooltip": "আবরণটির পুরনো চেহারাতে ফিরে যেতে আপনার সেটিংস পরিবর্তন করুন (উত্তরাধিকার ভেক্টর)", + "vector.css": "/* এখানের সকল সিএসএস ভেক্টর আবরণ ব্যবহারকারীদের জন্য লোড হবে */", + "vector.js": "/* এখানের সকল জাভাস্ক্রিপ্ট ভেক্টর আবরণ ব্যবহারকারীদের জন্য লোড হবে */", + "vector-action-toggle-sidebar": "পার্শ্বদণ্ড দেখান", + "vector-languages": "ভাষা", + "vector-language-button-aria-label": "অন্য ভাষার একটি নিবন্ধে যান। {{PLURAL:$1|$1টি ভাষায়}} উপলব্ধ রয়েছে।", + "vector-language-button-label": "{{PLURAL:$1|$1টি ভাষা}}", + "vector-no-language-button-label": "ভাষা যোগ করুন", + "vector-no-language-button-aria-label": "এই নিবন্ধটি শুধুমাত্র এই ভাষায় বিদ্যমান। অন্যান্য ভাষার জন্য নিবন্ধ যোগ করুন", + "vector-language-redirect-to-top": "এই উইকিতে, ভাষার লিঙ্কগুলি পাতার উপরের দিকে নিবন্ধের শিরোনামের পাশে রয়েছে। [[#p-lang-btn|উপরে চলুন]]।", + "vector-language-variant-switcher-label": "ভাষার রূপভেদ পরিবর্তন করুন", + "vector-action-addsection": "আলোচনা যোগ করুন", + "vector-action-delete": "অপসারণ", + "vector-action-move": "স্থানান্তর", + "vector-action-protect": "সুরক্ষা", + "vector-action-undelete": "পুনরুদ্ধার", + "vector-action-unprotect": "সুরক্ষা পরিবর্তন", + "vector-view-create": "তৈরি করুন", + "vector-view-edit": "সম্পাদনা", + "vector-view-history": "ইতিহাস দেখুন", + "vector-view-view": "পড়ুন", + "vector-view-viewsource": "উৎস দেখুন", + "vector-jumptonavigation": "পরিভ্রমণে চলুন", + "vector-jumptosearch": "অনুসন্ধানে চলুন", + "vector-jumptocontent": "বিষয়বস্তুতে চলুন", + "vector-more-actions": "আরও", + "vector-search-loader": "অনুসন্ধানের পরামর্শ লোড করা হচ্ছে", + "vector-searchsuggest-containing": "$1 থাকা পাতাগুলিতে অনুসন্ধান করুন", + "vector-intro-page": "Help:ভূমিকা", + "vector-toc-label": "পরিচ্ছেদসমূহ", + "vector-toc-beginning": "সূচনা", + "vector-toc-toggle-button-label": "$1 উপঅনুচ্ছেদ টগল করুন", + "vector-anon-user-menu-pages": "অনিবন্ধিত সম্পাদকের জন্য পাতা", + "vector-anon-user-menu-pages-learn": "আরও জানুন", + "vector-anon-user-menu-pages-label": "সম্পাদনা করা সম্পর্কে আরও জানুন", + "vector-main-menu-tooltip": "প্রধান মেনু", + "vector-toc-menu-tooltip": "সূচিপত্র", + "vector-toc-collapsible-button-label": "সূচিপত্র টগল করুন", + "vector-site-nav-label": "সাইট", + "vector-main-menu-label": "প্রধান মেনু", + "vector-limited-width-toggle": "সীমিত বিষয়বস্তুর প্রস্থ সক্রিয় বা নিষ্ক্রিয় করুন", + "vector-page-tools-label": "সরঞ্জাম", + "vector-page-tools-general-label": "সাধারণ", + "vector-page-tools-actions-label": "কার্য", + "vector-pin-element-label": "পার্শ্বদণ্ডে নিন", + "vector-unpin-element-label": "লুকান", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|আলোচনা]]", + "tooltip-vector-anon-user-menu-title": "আরও বিকল্প", + "vector-prefs-limited-width": "সীমিত প্রস্থযুক্ত মোড সক্রিয় করুন", + "vector-prefs-limited-width-help": "উন্নত পঠন অভিজ্ঞতার জন্য সীমিত প্রস্থ মোড সক্রিয় করে।", + "empty-language-selector-body": "পাতাটির বিষয়বস্তু অন্যান্য ভাষায় নেই।" +} diff --git a/Vector/i18n/bo.json b/Vector/i18n/bo.json new file mode 100644 index 0000000..5773696 --- /dev/null +++ b/Vector/i18n/bo.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Freeyak", + "Phurbutsering", + "ཁ་བཏགས་ནག་པོ" + ] + }, + "vector-action-addsection": "བརྗོད་གཞི་ཁ་སྣོན།", + "vector-action-delete": "སུབས།", + "vector-action-move": "སྤོར་བ།", + "vector-action-protect": "འགོག་སྲུང།", + "vector-action-undelete": "མི་བསུབས་", + "vector-action-unprotect": "སྲུང་སྐྱོབ་གློད་པ།", + "vector-view-create": "གསར་བཟོ།", + "vector-view-edit": "རྩོམ་སྒྲིག", + "vector-view-history": "ལོ་རྒྱུས་ལ་ལྟ་བ།", + "vector-view-view": "ཀློག་པ།", + "vector-view-viewsource": "ཁུངས་ལ་ལྟ་བ།", + "vector-more-actions": "དེ་ལས་མང་བ།" +} diff --git a/Vector/i18n/bol.json b/Vector/i18n/bol.json new file mode 100644 index 0000000..46fcd32 --- /dev/null +++ b/Vector/i18n/bol.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "El-hussain14" + ] + }, + "vector-languages": "bòo", + "vector-language-button-label": "{{PLURAL:$1|$1 harshe|$1 bòo}}", + "vector-no-language-button-label": "Sauwadi yare", + "vector-action-addsection": "Sawwai labar", + "vector-action-protect": "deito", + "vector-view-create": "Algino", + "vector-view-history": "Beyi ewe tarihi", + "vector-more-actions": "Sauwadi", + "vector-searchsuggest-containing": "Inne ngafeka lagani gah$1", + "vector-toc-label": "Kanu labar", + "vector-toc-beginning": "Zalshe", + "vector-page-tools-label": "Karai ruta", + "vector-page-tools-general-label": "Lele", + "vector-unpin-element-label": "bunku" +} diff --git a/Vector/i18n/bpy.json b/Vector/i18n/bpy.json new file mode 100644 index 0000000..9c3aa06 --- /dev/null +++ b/Vector/i18n/bpy.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Usingha" + ] + }, + "vector-action-addsection": "বিষয় তিলকর", + "vector-action-delete": "পুসে বেলা", + "vector-action-move": "থেইকর", + "vector-action-protect": "লুকর", + "vector-action-undelete": "নাপুসি", + "vector-action-unprotect": "লুকরানিহান সিলকর", + "vector-view-create": "হঙকরিক", + "vector-view-edit": "পতানি", + "vector-view-history": "ইতিহাস চেইক", + "vector-view-view": "পাকরিক", + "vector-view-viewsource": "সোর্স চেইক", + "vector-more-actions": "আরকউ" +} diff --git a/Vector/i18n/bqi.json b/Vector/i18n/bqi.json new file mode 100644 index 0000000..157f376 --- /dev/null +++ b/Vector/i18n/bqi.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Isevand", + "Mogoeilor" + ] + }, + "vector-action-addsection": "داسۊن اْزاف کونین", + "vector-action-delete": "پاکسا کردن", + "vector-action-move": "جابجا کردن", + "vector-action-protect": "هناڌاری ۉ پٱلڌاری", + "vector-view-create": "راس كردن", + "vector-view-edit": "آلشدکاری کردن", + "vector-view-history": "ديڌن ڤیرگار", + "vector-view-view": "خوندن", + "vector-more-actions": "بیشتر" +} diff --git a/Vector/i18n/br.json b/Vector/i18n/br.json new file mode 100644 index 0000000..f815428 --- /dev/null +++ b/Vector/i18n/br.json @@ -0,0 +1,69 @@ +{ + "@metadata": { + "authors": [ + "Adriendelucca", + "Amire80", + "Fulup", + "Huñvreüs", + "Y-M D" + ] + }, + "skinname-vector": "Vektor mod kozh (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "vector-skin-desc": "Pourchas a ra 2 wiskadur Vektor:\n* 2011 - Stumm modern MonoBook freskaet e dres hag ennañ meur a wellaenn implijout\n* 2022 - Vektor aozet evel perzh eus raktres [[mw:Desktop Improvements|Gwellaat ar burev]] ar WMF.", + "prefs-vector-enable-vector-1-label": "Ober gant stumm kozh Vektor", + "prefs-vector-enable-vector-1-help": "E-pad ar bloavezhioù a zeu e vo nevesaet ar gwiskadur Vektor tamm-ha-tamm. Gant stumm kozh Vektor e c’helloc’h gwelout stumm Vektor eus miz Du 2019. Evit gouzout hiroc’h diwar-benn an nevesaat, kit da [[mw:Reading/Web/Desktop_Improvements|bajenn ar raktres]].", + "vector-opt-out": "Distreiñ d'an tres kozh", + "vector-opt-out-tooltip": "Kemmañ hoc'h arventennoù evit distreiñ da dres kozh ar gwiskadur (Vector istorel)", + "vector.css": "/* Kement CSS a zo amañ a vo karget evit implijerien ar gwiskadur Vektor */", + "vector.js": "/* Kement JavaScript a zo amañ a vo karget evit implijerien ar gwiskadur Vektor */", + "vector-action-toggle-sidebar": "Diskwel/kuzhat ar varrenn gostez", + "vector-languages": "Yezhoù", + "vector-language-button-aria-label": "Mont d’ur pennad en ur yezh all. {{PLURAL:$1|$1 yezh}} a zo.", + "vector-language-button-label": "{{PLURAL:$1|$1 yezh}}", + "vector-no-language-button-label": "Ouzhpennañ yezhoù", + "vector-no-language-button-aria-label": "N’eus eus ar pennad-mañ nemet er yezh-mañ. Ouzhpennit ar pennad e yezhoù all.", + "vector-language-redirect-to-top": "Er {{SITENAME}}-mañ emañ al liammoù yezh e laez ar bajenn a-dal da titl ar pennad. [[#p-lang-btn|Mont d’an deroù]].", + "vector-language-variant-switcher-label": "Kemmañ adstumm yezh", + "vector-action-addsection": "Rannbennad nevez", + "vector-action-delete": "Diverkañ", + "vector-action-move": "Adenvel", + "vector-action-protect": "Gwareziñ", + "vector-action-undelete": "Diziverkañ", + "vector-action-unprotect": "Kemmañ ar gwarez", + "vector-view-create": "Krouiñ", + "vector-view-edit": "Kemmañ", + "vector-view-history": "Gwelet an istor", + "vector-view-view": "Lenn", + "vector-view-viewsource": "Sellet ouzh tarzh an destenn", + "vector-jumptonavigation": "Mont d’ar merdeerezh", + "vector-jumptosearch": "Mont d’ar c’hlask", + "vector-jumptocontent": "Mont d’an endalc’had", + "vector-more-actions": "Muioc'h", + "vector-search-loader": "O kargañ alioù klask", + "vector-searchsuggest-containing": "Klask pajennoù a zo $1 enno", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Taolenn", + "vector-toc-beginning": "Deroù", + "vector-toc-toggle-button-label": "Diskwel/kuzhat isrann $1", + "vector-anon-user-menu-pages": "Pajennoù evit implijerien digevreet", + "vector-anon-user-menu-pages-learn": "gouzout hiroc'h", + "vector-anon-user-menu-pages-label": "Gouzout hiroc’h a-zivout degas kemmoù", + "vector-main-menu-tooltip": "Lañser pennañ", + "vector-toc-menu-tooltip": "Taolenn", + "vector-toc-collapsible-button-label": "Gwintañ an daolenn", + "vector-site-nav-label": "Lec'hienn", + "vector-main-menu-label": "Meuziad pennañ", + "vector-limited-width-toggle": "Gwintañ mod ledander endalc’had bihanet", + "vector-page-tools-label": "Ostilhoù", + "vector-page-tools-general-label": "Hollek", + "vector-page-tools-actions-label": "Oberoù", + "vector-pin-element-label": "mont d’ar varrenn gostez", + "vector-unpin-element-label": "kuzhat", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Kaozeadenn]]", + "tooltip-vector-anon-user-menu-title": "Muioc'h a zibaboù", + "vector-prefs-limited-width": "Gweredekaat mod ledander bihanet", + "vector-prefs-limited-width-help": "Gweredekaat mod ledander bihanet evit lenn gwelloc’h", + "empty-language-selector-body": "N’eus ket eus endalc’had ar bajenn e yezhoù all." +} diff --git a/Vector/i18n/brh.json b/Vector/i18n/brh.json new file mode 100644 index 0000000..c40428a --- /dev/null +++ b/Vector/i18n/brh.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Imdadb" + ] + }, + "vector-action-addsection": "Púskun sarhál", + "vector-action-delete": "Mesa", + "vector-action-move": "Surif", + "vector-action-protect": "Rakk", + "vector-view-create": "Biná", + "vector-view-edit": "Radbadal", + "vector-view-history": "Lekav e ur", + "vector-view-view": "Xuán", + "vector-view-viewsource": "Bumpad e ur", + "vector-more-actions": "Pen" +} diff --git a/Vector/i18n/brx.json b/Vector/i18n/brx.json new file mode 100644 index 0000000..2444d06 --- /dev/null +++ b/Vector/i18n/brx.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Brxeditor", + "Mr. Nijwmsa Boro", + "Ⓝⓘⓙⓦⓜ", + "ⓝⓘⓙⓦⓜ" + ] + }, + "vector-action-move": "दोरोद", + "vector-action-protect": "रैखा खालाम", + "vector-view-create": "दा", + "vector-view-edit": "सोलाय", + "vector-view-history": "जारिमिन नाय", + "vector-view-view": "फराय", + "vector-more-actions": "गोबां" +} diff --git a/Vector/i18n/bs.json b/Vector/i18n/bs.json new file mode 100644 index 0000000..25431bf --- /dev/null +++ b/Vector/i18n/bs.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "CERminator", + "DzWiki", + "Edinwiki", + "KWiki", + "Semso98", + "Srdjan m", + "Srđan" + ] + }, + "skinname-vector": "Stari Vector (2010)", + "vector-skin-desc": "Pruža 2 Vector skina:\n* 2011 - Moderna verzija MonoBook-a sa svježim izgledom i mnogim poboljšanjima upotrebljivosti.\n* 2022 - Vector napravljen kao dio WMF projekta [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Koristi stari Vector", + "prefs-vector-enable-vector-1-help": "Kroz narednih nekoliko godina postepeno ćemo ažurirati temu Vector. Stari Vector pružit će Vam mogućnost da koristite raniju verziju Vectora (zamrznutu u decembru 2019). Za detalje o ažuriranjima, posjetite našu [[mw:Reading/Web/Desktop_Improvements|projektnu stranicu]].", + "vector-opt-out": "Prebaci na stari izgled", + "vector-opt-out-tooltip": "Promijenite postavke da biste vratili stari izgled teme (stari Vector)", + "vector-action-toggle-sidebar": "Uključi/isključi bočnu traku", + "vector-languages": "Jezici", + "vector-language-button-aria-label": "Idi na članak na drugom jeziku. Dostupno na {{PLURAL:$1| $1 jeziku | $1 jezika}}", + "vector-language-button-label": "{{PLURAL:$1|$1 jezik|$1 jezika}}", + "vector-no-language-button-label": "Dodaj jezike", + "vector-no-language-button-aria-label": "Ovaj članak postoji samo na ovom jeziku. Dodaj članak za druge jezike", + "vector-language-redirect-to-top": "Linkovi na druge jezike nalaze se u gornjem desnom uglu stranice pored naslova članka. [[#p-lang-btn|Idi na vrh]].", + "vector-language-variant-switcher-label": "Promijeni varijantu jezika", + "vector-action-addsection": "Dodaj temu", + "vector-action-delete": "Izbriši", + "vector-action-move": "Premjesti", + "vector-action-protect": "Zaštiti", + "vector-action-undelete": "Vrati izbrisano", + "vector-action-unprotect": "Promijeni zaštitu", + "vector-view-create": "Napravi", + "vector-view-edit": "Uredi", + "vector-view-history": "Historija", + "vector-view-view": "Čitaj", + "vector-view-viewsource": "Pogledaj izvor", + "vector-jumptonavigation": "Idi na navigaciju", + "vector-jumptosearch": "Idi na pretragu", + "vector-jumptocontent": "Idi na sadržaj", + "vector-more-actions": "Više", + "vector-search-loader": "Učitavam prijedloge pretrage", + "vector-searchsuggest-containing": "Pretraži stranice koje sadrže $1", + "vector-intro-page": "Pomoć:Uvod", + "vector-toc-label": "Sadržaj", + "vector-toc-beginning": "Početak", + "vector-toc-toggle-button-label": "Uključi/isključi podsekciju $1", + "vector-anon-user-menu-pages": "Stranice za odjavljene urednike", + "vector-anon-user-menu-pages-learn": "detaljnije", + "vector-anon-user-menu-pages-label": "Saznajte više o uređivanju", + "vector-main-menu-tooltip": "Glavni meni", + "vector-toc-menu-tooltip": "Sadržaj", + "vector-toc-collapsible-button-label": "Uključi/isključi sadržaj", + "vector-site-nav-label": "Sajt", + "vector-main-menu-label": "Glavni meni", + "vector-limited-width-toggle": "Uključi/isključi ograničenu širinu sadržaja", + "vector-page-tools-label": "Alati", + "vector-page-tools-general-label": "Općenito", + "vector-page-tools-actions-label": "Radnje", + "vector-pin-element-label": "premjesti na bočnu traku", + "vector-unpin-element-label": "sakrij", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Razgovor]]", + "tooltip-vector-anon-user-menu-title": "Više opcija", + "vector-prefs-limited-width": "Uključi režim ograničene širine", + "vector-prefs-limited-width-help": "Uključuje režim ograničene širine za poboljšano iskustvo čitanja.", + "empty-language-selector-body": "Sadržaj stranice nije podržan na drugim jezicima." +} diff --git a/Vector/i18n/btm.json b/Vector/i18n/btm.json new file mode 100644 index 0000000..6a7d550 --- /dev/null +++ b/Vector/i18n/btm.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Apundung", + "IHLubis", + "Simartampua", + "Veracious" + ] + }, + "vector-languages": "Saro", + "vector-language-button-label": "{{PLURAL:$1|$1 saro}}", + "vector-no-language-button-label": "Manambai saro", + "vector-action-addsection": "Baen tema", + "vector-action-delete": "Apus", + "vector-action-move": "Pindah", + "vector-action-protect": "Jagoon", + "vector-view-create": "Baen", + "vector-view-edit": "Pature", + "vector-view-history": "Sise sejarah", + "vector-view-view": "Baca", + "vector-more-actions": "Lainna", + "vector-searchsuggest-containing": "Jalaki tompat na marisi $1", + "vector-page-tools-label": "Peralatan", + "vector-page-tools-general-label": "Umum", + "vector-unpin-element-label": "onjabkon" +} diff --git a/Vector/i18n/bto.json b/Vector/i18n/bto.json new file mode 100644 index 0000000..1ae450c --- /dev/null +++ b/Vector/i18n/bto.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Filipinayzd" + ] + }, + "vector-action-addsection": "Magrugang sa paksa", + "vector-action-delete": "Puraon", + "vector-action-move": "Ilipat", + "vector-action-protect": "Protektaran", + "vector-action-undelete": "Ibalik", + "vector-action-unprotect": "Ribayan a proteksyon", + "vector-view-create": "Gumibo", + "vector-view-edit": "Balyowan", + "vector-view-history": "Baydon a kasaysayan", + "vector-view-view": "Basahon", + "vector-view-viewsource": "Baydon a ginikanan", + "vector-more-actions": "Dakul pa" +} diff --git a/Vector/i18n/bug-bugi.json b/Vector/i18n/bug-bugi.json new file mode 100644 index 0000000..b1aa541 --- /dev/null +++ b/Vector/i18n/bug-bugi.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Amire80" + ] + }, + "vector-view-create": "ᨆᨙᨅᨘ", + "vector-view-view": "ᨅᨌ", + "vector-more-actions": "ᨒᨕᨗᨊᨕᨙ" +} diff --git a/Vector/i18n/bug.json b/Vector/i18n/bug.json new file mode 100644 index 0000000..24f7d2e --- /dev/null +++ b/Vector/i18n/bug.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Kurniasan", + "Notanotheramy", + "Amire80" + ] + }, + "vector-action-move": "Paléccé'", + "vector-view-create": "Ebbu", + "vector-view-edit": "Padéccéng", + "vector-view-view": "Baca", + "vector-view-viewsource": "Ita sumber", + "vector-more-actions": "ᨒᨕᨗᨊᨕᨙ" +} diff --git a/Vector/i18n/bxr.json b/Vector/i18n/bxr.json new file mode 100644 index 0000000..64ff413 --- /dev/null +++ b/Vector/i18n/bxr.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Bjargal", + "Elvonudinium" + ] + }, + "vector-action-addsection": "Һэдэб нэмэхэ", + "vector-action-delete": "Усадхаха", + "vector-action-move": "Зөөхэ", + "vector-view-create": "Үүдхэхэ", + "vector-view-edit": "Заһабарилха", + "vector-view-history": "Түүхые хараха", + "vector-view-view": "Уншаха", + "vector-view-viewsource": "эшэ үндэһэндэнь хандаха" +} diff --git a/Vector/i18n/ca.json b/Vector/i18n/ca.json new file mode 100644 index 0000000..4aeb574 --- /dev/null +++ b/Vector/i18n/ca.json @@ -0,0 +1,72 @@ +{ + "@metadata": { + "authors": [ + "Abella", + "Aleator", + "Amire80", + "Anskar", + "Calak", + "Fitoschido", + "Paucabot", + "SMP", + "Ssola", + "Toniher", + "Townie", + "Vriullop" + ] + }, + "skinname-vector": "Vector (versió 2010)", + "vector-skin-desc": "Proporciona dues aparences Vector:\n* 2011 - La versió moderna de MonoBook amb aspecte refrescat i moltes millores d'usabilitat.\n* 2022 - La versió Vector construïda com a part del projecte [[mw:Desktop Improvements]] de la Fundació Wikimedia.", + "prefs-vector-enable-vector-1-label": "Usa la versió antiga de Vector", + "prefs-vector-enable-vector-1-help": "En els propers anys, s'anirà actualitzant gradualment l'aparença Vector. La versió antiga de Vector us permet deixar-la tal com està a desembre de 2019. Per a saber més sobre les actualitzacions, vegeu la [[mw:Reading/Web/Desktop_Improvements|pàgina del projecte]].", + "vector-opt-out": "Canvia a l'aspecte d'abans", + "vector-opt-out-tooltip": "Canvia la configuració per tornar a l'aspecte anterior de l'aparença (Vector heretat)", + "vector-action-toggle-sidebar": "Mostra o oculta la barra lateral", + "vector-languages": "Llengües", + "vector-language-button-aria-label": "Vés a un article en una altra llengua. Disponible en {{PLURAL:$1|$1 llengua|$1 llengües}}", + "vector-language-button-label": "{{PLURAL:$1|$1 llengua|$1 llengües}}", + "vector-no-language-button-label": "Afegeix llengües", + "vector-no-language-button-aria-label": "Aquest article només existeix en aquesta llengua. Afegiu l'article per a altres llengües", + "vector-language-redirect-to-top": "En aquest projecte {{SITENAME}}, els enllaços de llengua són a dalt de la pàgina a l'altre costat del títol. [[#p-lang-btn|Vés a dalt]].", + "vector-language-variant-switcher-label": "Canvia la variant de llengua", + "vector-action-addsection": "Afegeix un tema", + "vector-action-delete": "Esborra", + "vector-action-move": "Reanomena", + "vector-action-protect": "Protegeix", + "vector-action-undelete": "Restaura", + "vector-action-unprotect": "Desprotegeix", + "vector-view-create": "Crea", + "vector-view-edit": "Modifica", + "vector-view-history": "Mostra l'historial", + "vector-view-view": "Mostra", + "vector-view-viewsource": "Mostra el codi", + "vector-jumptonavigation": "Salta a la navegació", + "vector-jumptosearch": "Salta a la cerca", + "vector-jumptocontent": "Vés al contingut", + "vector-more-actions": "Més", + "vector-search-loader": "Carregant els suggeriments de cerca", + "vector-searchsuggest-containing": "Cerca les pàgines que continguin $1", + "vector-intro-page": "Help:Introducció", + "vector-toc-label": "Contingut", + "vector-toc-beginning": "Inici", + "vector-toc-toggle-button-label": "Commuta la subsecció $1", + "vector-anon-user-menu-pages": "Pàgines per a editors no registrats", + "vector-anon-user-menu-pages-learn": "més informació", + "vector-anon-user-menu-pages-label": "Vegeu més informació sobre l'edició", + "vector-main-menu-tooltip": "Menú principal", + "vector-toc-menu-tooltip": "Taula de continguts", + "vector-toc-collapsible-button-label": "Commuta la taula de continguts.", + "vector-site-nav-label": "Lloc", + "vector-main-menu-label": "Menú principal", + "vector-limited-width-toggle": "Commuta la limitació d'amplada del contingut", + "vector-page-tools-label": "Eines", + "vector-page-tools-general-label": "General", + "vector-page-tools-actions-label": "Accions", + "vector-pin-element-label": "mou a la barra lateral", + "vector-unpin-element-label": "amaga", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussió]]", + "tooltip-vector-anon-user-menu-title": "Més opcions", + "vector-prefs-limited-width": "Activa el mode d'amplada limitada", + "vector-prefs-limited-width-help": "Activa el mode d'amplada limitada per una millor experiència de lectura.", + "empty-language-selector-body": "El contingut de la pàgina no s'admet en altres llengües." +} diff --git a/Vector/i18n/cak.json b/Vector/i18n/cak.json new file mode 100644 index 0000000..0b8041a --- /dev/null +++ b/Vector/i18n/cak.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Chocoj" + ] + }, + "vector-action-addsection": "K'ak'a' peraj", + "vector-view-create": "Tatz'uku'", + "vector-view-edit": "Tanuk'u'", + "vector-view-history": "Tatz'eta' ri natab'äl", + "vector-view-view": "Tasik'ij", + "vector-more-actions": "Ch'aqa chik" +} diff --git a/Vector/i18n/cbk-zam.json b/Vector/i18n/cbk-zam.json new file mode 100644 index 0000000..296542f --- /dev/null +++ b/Vector/i18n/cbk-zam.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "WikiEditor50" + ] + }, + "vector-view-create": "Crea", + "vector-view-edit": "Revisa", + "vector-view-view": "Lee", + "vector-more-actions": "Mas" +} diff --git a/Vector/i18n/cdo.json b/Vector/i18n/cdo.json new file mode 100644 index 0000000..1b43d4e --- /dev/null +++ b/Vector/i18n/cdo.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "GnuDoyng", + "Yejianfei", + "唐吉訶德的侍從" + ] + }, + "vector-action-addsection": "Gă uâ-dà̤", + "vector-action-delete": "刪掉咯", + "vector-action-move": "移動", + "vector-action-protect": "保護", + "vector-action-undelete": "取消刪除", + "vector-action-unprotect": "改變保護", + "vector-view-create": "Cháung-gióng", + "vector-view-edit": "Siŭ-gāi", + "vector-view-history": "Káng lĭk-sṳ̄", + "vector-view-view": "Tĕ̤k", + "vector-view-viewsource": "Káng nguòng-dâi-mā", + "vector-more-actions": "Gó-sâ̤" +} diff --git a/Vector/i18n/ce.json b/Vector/i18n/ce.json new file mode 100644 index 0000000..c6cfcbc --- /dev/null +++ b/Vector/i18n/ce.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "Sasan700", + "Исмаил Садуев", + "Умар" + ] + }, + "skinname-vector": "Вектор, ширйеларг (2010)", + "skinname-vector-2022": "Вектор (2022 шо)", + "vector-specialversion-name": "Векторан", + "vector-skin-desc": "ХӀокху хенан MonoBook-ан верси кечдинчу карладахаршца а, дуккха а тодаршца юзабилити чохь", + "prefs-vector-enable-vector-1-label": "Лелайе Векторан темин шира верси", + "prefs-vector-enable-vector-1-help": "ТӀедогӀучу массийта шарахь «Векторан» тема карлайоккхура йу. «Векторан хьалхара версис» шуьна аьтту бо «Векторан» хьалхара вариант лело (2019 декабрь). Кхин сов цуьнах лаьцна хаа хьажа [[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements|проектан агӀонга]].", + "vector-opt-out": "Латайе шира хатӀ", + "vector-opt-out-tooltip": "Шира тема латайан, хийца нисдаран гӀирс (Ширйелла векторан)", + "vector-action-toggle-sidebar": "АгӀонгара панель хийца", + "vector-languages": "Меттанаш", + "vector-language-button-label": "{{PLURAL:$1|$1 мотт}}", + "vector-no-language-button-label": "ТӀетоха меттанаш", + "vector-no-language-button-aria-label": "ХӀара йаззам кху маттахь бен бац. ТӀетоха йаззам кхечу маттана", + "vector-language-redirect-to-top": "ХӀокху сайтехь меттанийн хьажоргаш йу агӀонан йуьхьегехь, йаззаман цӀеран дуьхьала. [[#p-lang-btn|Йуьхье гӀо]].", + "vector-language-variant-switcher-label": "Меттан вариант хийца", + "vector-action-addsection": "Тема тӀетоха", + "vector-action-delete": "ДӀайаккхар", + "vector-action-move": "ЦӀе хийцар", + "vector-action-protect": "Ларйар", + "vector-action-undelete": "МеттахӀоттайе", + "vector-action-unprotect": "Ларйар хийцар", + "vector-view-create": "БӀаьра кхолла", + "vector-view-edit": "Нисйе бӀаьра", + "vector-view-history": "АгӀонан хийцамаш", + "vector-view-view": "Йеша", + "vector-view-viewsource": "Коде хьажар", + "vector-jumptonavigation": "Навигацин тӀегӀо", + "vector-jumptosearch": "Лахарна тӀегӀо", + "vector-jumptocontent": "Чулацаман тӀегӀо", + "vector-more-actions": "Кхин а", + "vector-search-loader": "Чудохуш ду лахаран кховдинарш", + "vector-searchsuggest-containing": "$1 чулацам болу агӀонаш лахар", + "vector-intro-page": "Help:Хаам", + "vector-toc-label": "Чулацам", + "vector-toc-beginning": "Йуьхь", + "vector-toc-toggle-button-label": "Гайта/Къайладаккха лахара дакъа $1", + "vector-anon-user-menu-pages": "Авторизаци йанза редакторшна агӀонаш", + "vector-anon-user-menu-pages-learn": "совнаха хаа", + "vector-anon-user-menu-pages-label": "Хийцамашбарах мадарра", + "vector-main-menu-tooltip": "Коьрта меню", + "vector-toc-menu-tooltip": "Чулацам", + "vector-toc-collapsible-button-label": "Къайлабаккха/гайта чулацам", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Коьрта меню", + "vector-page-tools-label": "ГӀирсаш", + "vector-page-tools-general-label": "Йукъара", + "vector-page-tools-actions-label": "Ардамаш", + "vector-pin-element-label": "агӀонгара панель тӀе йаккха", + "vector-unpin-element-label": "къайла", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Дискусси]]", + "tooltip-vector-anon-user-menu-title": "Дукха таронаш", + "vector-prefs-limited-width": "Дихкина шораллин раж латаде", + "vector-prefs-limited-width-help": "Йешархойн зеделларг дика дан латаде дихкина шораллин раж.", + "empty-language-selector-body": "АгӀонан чулацам кхечу меттанашкахь тӀекхочуш бац." +} diff --git a/Vector/i18n/ceb.json b/Vector/i18n/ceb.json new file mode 100644 index 0000000..c616093 --- /dev/null +++ b/Vector/i18n/ceb.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Bentong Isles", + "Jordz" + ] + }, + "vector-action-addsection": "Pagdugang og topiko", + "vector-action-delete": "Papasa", + "vector-action-move": "Ibalhin", + "vector-action-protect": "Protektahi", + "vector-action-undelete": "Ayaw papasa", + "vector-action-unprotect": "Ayaw protektahi", + "vector-view-create": "Himoa", + "vector-view-edit": "Usba", + "vector-view-history": "Tan-awa ang kaagi", + "vector-view-view": "Basaha", + "vector-view-viewsource": "Tan-awa ang ginikanan", + "vector-more-actions": "Uban pa..." +} diff --git a/Vector/i18n/chr.json b/Vector/i18n/chr.json new file mode 100644 index 0000000..05498d3 --- /dev/null +++ b/Vector/i18n/chr.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "R12ntech" + ] + }, + "vector-action-delete": "ᎧᎵ ᎠᏍᎪᎸᏛᎯ", + "vector-action-move": "ᎯᎲᎾ", + "vector-action-protect": "ᎠᏓᎦᏎᏍᏙᏗ", + "vector-view-create": "ᎪᏢᏗ", + "vector-view-edit": "ᎦᏁᏟᏴᏓ ᎰᏪᎸᎦ", + "vector-view-view": "ᎠᎪᎵᏰᏗᏊ" +} diff --git a/Vector/i18n/cjy-hant.json b/Vector/i18n/cjy-hant.json new file mode 100644 index 0000000..79b2d9c --- /dev/null +++ b/Vector/i18n/cjy-hant.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Sainbainvv" + ] + }, + "vector-view-history": "前一向掃喇來那", + "vector-more-actions": "好地多些" +} diff --git a/Vector/i18n/ckb.json b/Vector/i18n/ckb.json new file mode 100644 index 0000000..b665b5a --- /dev/null +++ b/Vector/i18n/ckb.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Aram", + "Asoxor", + "Calak", + "Muhammed taha", + "Sarchia", + "ئارام بکر", + "Halbast" + ] + }, + "skinname-vector": "ڤێکتۆری کۆن (٢٠١٠)", + "skinname-vector-2022": "ڤێکتۆر (٢٠٢٢)", + "vector-specialversion-name": "ڤێکتۆر", + "vector-skin-desc": "٢ پێستەی ڤێکتۆر دابین دەکات:\n* ٢٠١١ - وەشانی مۆدێرن لە مۆنۆبووک بە دیمەنێکی تازە و چەندین چاکسازیی بەسوود.\n* ٢٠٢٢ - ڤێکتۆرەکە وەک بەشێک لە پڕۆژەی [[mw:Desktop Improvements]] سەر بە دامەزراوەی ویکیمیدیا دروست کراوە.", + "prefs-vector-enable-vector-1-label": "ڤێکتۆری سپاردە بەکاربێنە", + "prefs-vector-enable-vector-1-help": "لەماوەی چەند ساڵی داھاتوو، ھەوڵی نوێکردنەوەی پێستەی ڤێکتۆر دەدەین. ڤێکتۆری سپاردە ڕێگەت پێ دەدات کە وەشانە کۆنەکەی ڤێکتۆر (لە کانوونی یەکەمی ٢٠١٩) ببینیت. بۆ زیاتر زانیاری لەسەر نوێکردنەوەکان، بڕۆ بۆ [[mw:Reading/Web/Desktop_Improvements|پەڕەی پرۆژەکەمان]].", + "vector-opt-out": "بیگۆڕە بۆ ڕووکەشە کۆنەکە", + "vector-opt-out-tooltip": "ڕێکخستنەکانت بۆ گەڕانەوەی دیمەنە کۆنەکەی پێستەکە (ڤێکتۆری سپاردە) بگۆڕە", + "vector-action-toggle-sidebar": "شریتەلا بگۆڕە", + "vector-languages": "زمانەکان", + "vector-language-button-aria-label": "بڕۆ بۆ وتارێک بە زمانێکی تر. بە $1 زمان بەردەستە", + "vector-language-button-label": "{{{{PLURAL:$1|$1 زمان|$1 زمان}}}}", + "vector-no-language-button-label": "زمانەکان زیاد بکە", + "vector-no-language-button-aria-label": "ئەم وتارە تەنیا بەم زمانە ھەیە. وتارەکە بۆ زمانەکانی تر زیاد بکە", + "vector-language-redirect-to-top": "لەسەر {{SITENAME}} بەستەرەکانی زمان لەسەرەوەی پەڕەکەدان بەرامبەر ناونیشانی وتارەکە. [[#p-lang-btn|بڕۆ بۆ سەرەوە]].", + "vector-action-addsection": "بابەت دابنێ", + "vector-action-delete": "سڕینەوە", + "vector-action-move": "گواستنەوە", + "vector-action-protect": "پاراستن", + "vector-action-undelete": "سڕینەوە بگەڕێنەوە", + "vector-action-unprotect": "پاراستن بگۆڕە", + "vector-view-create": "دروستکردن", + "vector-view-edit": "دەستکاری", + "vector-view-history": "مێژوو", + "vector-view-view": "خوێندنەوە", + "vector-view-viewsource": "سەرچاوەکەی ببینە", + "vector-jumptonavigation": "بۆ ڕێدۆزی بازبدە", + "vector-jumptosearch": "بۆ گەڕان بازبدە", + "vector-jumptocontent": "بۆ ناوەڕۆک بازبدە", + "vector-more-actions": "زیاتر", + "vector-search-loader": "پێشنیارەکانی گەڕان باردەکرێ", + "vector-searchsuggest-containing": "بەدوای ئەو پەڕانە بگەڕێ کە «$1»یان تێدایە.", + "vector-intro-page": "ویکیپیدیا:ناساندن", + "vector-toc-label": "ناوەڕۆکەکان", + "vector-toc-beginning": "دەستپێک", + "vector-toc-toggle-button-label": "ژێربەشی $1 بگۆڕە", + "vector-anon-user-menu-pages": "ئەو پەڕانەی بۆ ئەو دەستکاریکەرانەن کە لەدەرەوەن", + "vector-anon-user-menu-pages-learn": "زیاتر فێر بە", + "vector-anon-user-menu-pages-label": "زیاتر لەسەر دەستکاریکردن فێر بە", + "vector-main-menu-tooltip": "پێڕستی سەرەکی", + "vector-toc-menu-tooltip": "خشتەی ناوەڕۆکەکان", + "vector-toc-collapsible-button-label": "خشتەی ناوەڕۆکەکان بگۆڕە", + "vector-site-nav-label": "پێگە", + "vector-main-menu-label": "پێڕستی سەرەکی", + "vector-limited-width-toggle": "پانیی ناوەڕۆکی سنووردار بگۆڕە", + "vector-page-tools-label": "ئامرازەکان", + "vector-page-tools-general-label": "گشتی", + "vector-page-tools-actions-label": "کردەوەکان", + "vector-pin-element-label": "بڕۆ بۆ شریتەلا", + "vector-unpin-element-label": "بشارەوە", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|وتووێژ]]", + "tooltip-vector-anon-user-menu-title": "ھەڵبژاردەی زیاتر", + "vector-prefs-limited-width": "دۆخی پانیی سنووردار چالاک بکە", + "vector-prefs-limited-width-help": "دۆخی پانیی سنووردار چالاک بکە بۆ باشترکردنی ئەزموونی خوێندنەوە.", + "empty-language-selector-body": "ناوەڕۆکی پەڕە بە زمانەکانی تر پشتگیریی لێ ناکرێت." +} diff --git a/Vector/i18n/cnr-latn.json b/Vector/i18n/cnr-latn.json new file mode 100644 index 0000000..632d8f0 --- /dev/null +++ b/Vector/i18n/cnr-latn.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Bellatrix10" + ] + }, + "vector-action-addsection": "Dodaj temu", + "vector-action-delete": "Izbriši", + "vector-action-move": "Premjesti", + "vector-action-protect": "Zaštiti", + "vector-view-create": "Napravi", + "vector-view-edit": "Uredi", + "vector-view-history": "Pregledaj istoriju", + "vector-view-view": "Čitaj", + "vector-more-actions": "Više" +} diff --git a/Vector/i18n/co.json b/Vector/i18n/co.json new file mode 100644 index 0000000..bfd5198 --- /dev/null +++ b/Vector/i18n/co.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Jun Misugi", + "Paulu", + "Jumpy01" + ] + }, + "vector-opt-out": "Vultà à l'aspettu di nanzu", + "vector-action-addsection": "Aghjunghje discussione", + "vector-action-delete": "Supprimà", + "vector-action-move": "Cullucà", + "vector-action-protect": "Pruteghje", + "vector-action-unprotect": "Cambià a prutezzione", + "vector-view-create": "Creà", + "vector-view-edit": "Mudificà", + "vector-view-history": "Vede a cronolugia", + "vector-view-view": "Leghje", + "vector-view-viewsource": "Vede a surghjente", + "vector-more-actions": "Più" +} diff --git a/Vector/i18n/cop.json b/Vector/i18n/cop.json new file mode 100644 index 0000000..4f7b4a4 --- /dev/null +++ b/Vector/i18n/cop.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Bloomaround", + "ⲁϩⲙⲉⲧ" + ] + }, + "vector-action-addsection": "ⲧⲟⲩϩⲟ ⲟⲩⲑⲉⲙⲁ", + "vector-action-move": "ⲕⲓⲙ", + "vector-view-create": "ⲑⲁⲙⲓⲟ", + "vector-view-edit": "ϫⲓⲛⲫⲱⲛϩ", + "vector-view-history": "ⲁⲛⲁⲩ ⲉϯϩⲓⲥⲧⲟⲣⲓⲁ", + "vector-view-view": "ⲱϣ", + "vector-more-actions": "ϩⲟⲩⲟ ⲉⲣⲟⲥ" +} diff --git a/Vector/i18n/cps.json b/Vector/i18n/cps.json new file mode 100644 index 0000000..5c40641 --- /dev/null +++ b/Vector/i18n/cps.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Capisano", + "Oxyzen" + ] + }, + "vector-action-addsection": "Magdugang sang topiko", + "vector-action-delete": "Panason", + "vector-action-move": "Isdogon", + "vector-action-protect": "Protektahan", + "vector-action-undelete": "Indi pag panason", + "vector-action-unprotect": "Islan ang proteksyon", + "vector-view-create": "Ubrahon", + "vector-view-edit": "Bag-uhon", + "vector-view-history": "Ipakita ang kasaysayan", + "vector-view-view": "Basahon", + "vector-view-viewsource": "Lantawon ang ginhalinan" +} diff --git a/Vector/i18n/cpx-hans.json b/Vector/i18n/cpx-hans.json new file mode 100644 index 0000000..3e1ef58 --- /dev/null +++ b/Vector/i18n/cpx-hans.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "ChoiChong", + "Kahin He", + "Winston Sung" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1语言}}", + "vector-action-addsection": "添加话题", + "vector-action-move": "移动", + "vector-action-protect": "保护", + "vector-view-history": "看历史", + "vector-view-view": "读", + "vector-more-actions": "価兮", + "vector-searchsuggest-containing": "寻讨含有$1兮页面" +} diff --git a/Vector/i18n/cpx-hant.json b/Vector/i18n/cpx-hant.json new file mode 100644 index 0000000..d0e4473 --- /dev/null +++ b/Vector/i18n/cpx-hant.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "ChoiChong", + "Kahin He", + "Winston Sung" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1語言}}", + "vector-action-delete": "刪除", + "vector-action-protect": "保護", + "vector-view-create": "創建", + "vector-view-edit": "修改", + "vector-more-actions": "価兮" +} diff --git a/Vector/i18n/cpx.json b/Vector/i18n/cpx.json new file mode 100644 index 0000000..6bce58f --- /dev/null +++ b/Vector/i18n/cpx.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "ChoiChong", + "Kahin He" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1语言}}", + "vector-action-addsection": "添加话题", + "vector-action-delete": "刪除", + "vector-action-move": "移动", + "vector-action-protect": "保护", + "vector-view-create": "創建", + "vector-view-edit": "修改", + "vector-view-history": "看历史", + "vector-view-view": "读", + "vector-more-actions": "価兮", + "vector-searchsuggest-containing": "寻讨含有$1兮页面" +} diff --git a/Vector/i18n/crh-cyrl.json b/Vector/i18n/crh-cyrl.json new file mode 100644 index 0000000..e436e6d --- /dev/null +++ b/Vector/i18n/crh-cyrl.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Danvintius Bookix", + "Don Alessandro" + ] + }, + "vector-action-addsection": "Мевзу къош", + "vector-action-delete": "Ёкъ эт", + "vector-action-move": "Адыны денъиштир", + "vector-action-protect": "Къорчала", + "vector-action-undelete": "Янъыдан ярат", + "vector-action-unprotect": "Къорчалавны денъиштир", + "vector-view-create": "Ярат", + "vector-view-edit": "Денъиштир", + "vector-view-history": "Кечмишини косьтер", + "vector-view-view": "Окъу", + "vector-view-viewsource": "Менба кодуны косьтер", + "vector-more-actions": "Башкъа арекетлер" +} diff --git a/Vector/i18n/crh-latn.json b/Vector/i18n/crh-latn.json new file mode 100644 index 0000000..70d39fc --- /dev/null +++ b/Vector/i18n/crh-latn.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Don Alessandro", + "TayfunEt." + ] + }, + "vector-languages": "Tiller", + "vector-language-button-label": "{{PLURAL:$1|$1 til|$1 tiller}}", + "vector-no-language-button-label": "Til qoş", + "vector-action-addsection": "Mevzu qoş", + "vector-action-delete": "Yoq et", + "vector-action-move": "Adını deñiştir", + "vector-action-protect": "Qorçala", + "vector-action-undelete": "Yañıdan yarat", + "vector-action-unprotect": "Qorçalavnı deñiştir", + "vector-view-create": "Yarat", + "vector-view-edit": "Deñiştir", + "vector-view-history": "Keçmişini köster", + "vector-view-view": "Oqu", + "vector-view-viewsource": "Menba kodunı köster", + "vector-more-actions": "Başqa areketler", + "vector-searchsuggest-containing": "$1 içeren saifelerni qıdır", + "vector-page-tools-label": "Aletler", + "vector-unpin-element-label": "gizle" +} diff --git a/Vector/i18n/crh-ro.json b/Vector/i18n/crh-ro.json new file mode 100644 index 0000000..aef642e --- /dev/null +++ b/Vector/i18n/crh-ro.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Zolgoyo" + ] + }, + "vector-languages": "Tĭller", + "vector-language-button-label": "{{PLURAL:$1|tĭl}}", + "vector-no-language-button-label": "Tĭl qoş", + "vector-action-addsection": "Mewzu qoş", + "vector-action-delete": "Yoq et", + "vector-action-move": "Adını degĭştĭr", + "vector-action-protect": "Qolla", + "vector-view-create": "Yarat", + "vector-view-history": "Keşmĭş", + "vector-more-actions": "Taa köp", + "vector-searchsuggest-containing": "$1 ĭşergen saypalardı qıdır", + "vector-page-tools-label": "Aletler", + "vector-page-tools-general-label": "Genel", + "vector-unpin-element-label": "gĭzle" +} diff --git a/Vector/i18n/cs.json b/Vector/i18n/cs.json new file mode 100644 index 0000000..0a5de40 --- /dev/null +++ b/Vector/i18n/cs.json @@ -0,0 +1,76 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Blahma", + "Draceane", + "Dvorapa", + "Fraxinus.cs", + "Jaroslav Cerny", + "Kareyac", + "Martin Urbanec (WMF)", + "Matěj Suchánek", + "Mormegil", + "Patriccck", + "Patrik L." + ] + }, + "skinname-vector": "Starý Vektor (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "vector-skin-desc": "Poskytuje 2 vzhledy Vektor:\n* 2011 – Moderní verze vzhledu Kniha s novějším vzhledem a vylepšenou použitelností.\n* 2022 – Vektor vytvořený jako součást projektu WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Použít starý Vektor", + "prefs-vector-enable-vector-1-help": "V následujících letech budeme postupně aktualizovat vzhled Vektor. Starý Vektor vám umožní používat starou verzi Vektoru z prosince 2019. Více o aktualizacích se dozvíte na naší [[mw:Reading/Web/Desktop_Improvements|projektové stránce]].", + "vector-opt-out": "Přepnout na starý vzhled", + "vector-opt-out-tooltip": "Změnit nastavení a vrátit se zpět ke staré podobě vzhledu (starý Vektor)", + "vector.css": "/* Veškeré zde uvedené CSS bude načítáno uživatelům vzhledu „Vektor“ */", + "vector.js": "/* Veškerý zde uvedený JavaScript bude načítán uživatelům vzhledu „Vektor“ */", + "vector-action-toggle-sidebar": "Přepnout postranní panel", + "vector-languages": "Jazyky", + "vector-language-button-aria-label": "Přejděte k článku v jiném jazyce. Je dostupný v {{PLURAL:$1|$1 jazyce|$1 jazycích}}", + "vector-language-button-label": "{{PLURAL:$1|$1 jazyk|$1 jazyky|$1 jazyků}}", + "vector-no-language-button-label": "Přidat jazyky", + "vector-no-language-button-aria-label": "Tento článek existuje jenom v tomto jazyce. Přidejte jej i v ostatních jazycích", + "vector-language-redirect-to-top": "Tady na {{GRAMMAR:6sg|{{SITENAME}}}} jsou mezijazykové odkazy nahoře na stránce, napravo od názvu článku. [[#p-lang-btn|Jít nahoru]].", + "vector-language-variant-switcher-label": "Změnit variantu jazyka", + "vector-action-addsection": "Přidat téma", + "vector-action-delete": "Smazat", + "vector-action-move": "Přesunout", + "vector-action-protect": "Zamknout", + "vector-action-undelete": "Obnovit", + "vector-action-unprotect": "Změnit zámek", + "vector-view-create": "Založit", + "vector-view-edit": "Editovat", + "vector-view-history": "Zobrazit historii", + "vector-view-view": "Číst", + "vector-view-viewsource": "Zobrazit zdrojový kód", + "vector-jumptonavigation": "Skočit na navigaci", + "vector-jumptosearch": "Skočit na vyhledávání", + "vector-jumptocontent": "Přeskočit na obsah", + "vector-more-actions": "Další", + "vector-search-loader": "Načítají se návrhy pro hledání", + "vector-searchsuggest-containing": "Vyhledat stránky obsahující „$1“", + "vector-intro-page": "Help:Úvod", + "vector-toc-label": "Obsah", + "vector-toc-beginning": "Začátek", + "vector-toc-toggle-button-label": "Přepnout podsekci $1", + "vector-anon-user-menu-pages": "Stránky pro odhlášené editory", + "vector-anon-user-menu-pages-learn": "dozvědět se více", + "vector-anon-user-menu-pages-label": "Více informací o editování", + "vector-main-menu-tooltip": "Hlavní menu", + "vector-toc-menu-tooltip": "Obsah", + "vector-toc-collapsible-button-label": "Přepnout obsah", + "vector-site-nav-label": "Projekt", + "vector-main-menu-label": "Hlavní menu", + "vector-limited-width-toggle": "Přepnout omezenou šířku obsahu", + "vector-page-tools-label": "Nástroje", + "vector-page-tools-general-label": "Obecné", + "vector-page-tools-actions-label": "Akce", + "vector-pin-element-label": "přesunout do postranního panelu", + "vector-unpin-element-label": "skrýt", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskuse]]", + "tooltip-vector-anon-user-menu-title": "Další možnosti", + "vector-prefs-limited-width": "Zapnout režim omezené šířky", + "vector-prefs-limited-width-help": "Zapnout režim omezené šířky pro lepší zážitek ze čtení.", + "empty-language-selector-body": "Obsah stránky není podporován v jiných jazycích." +} diff --git a/Vector/i18n/csb.json b/Vector/i18n/csb.json new file mode 100644 index 0000000..86ee501 --- /dev/null +++ b/Vector/i18n/csb.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Kaszeba", + "Kirsan", + "Kuvaly" + ] + }, + "vector-action-addsection": "Dodôj témã", + "vector-action-delete": "Rëmôj", + "vector-action-move": "Przeniesë", + "vector-action-protect": "Zazychrëjë", + "vector-action-undelete": "Doprowadzë nazôd", + "vector-action-unprotect": "Zmieni zazychrowanié", + "vector-view-create": "Ùsadzë", + "vector-view-edit": "Edicëjô", + "vector-view-history": "Historëjô lopka", + "vector-view-view": "Czëtôj", + "vector-view-viewsource": "Zdrojowi tekst", + "vector-more-actions": "Wiãcy" +} diff --git a/Vector/i18n/cu.json b/Vector/i18n/cu.json new file mode 100644 index 0000000..718a44c --- /dev/null +++ b/Vector/i18n/cu.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "NR Deblocked", + "ОйЛ" + ] + }, + "vector-action-addsection": "новꙑ бєсѣдꙑ чѧсти сътворѥниѥ", + "vector-action-delete": "поничьжєниѥ", + "vector-action-move": "прѣимєнованиѥ", + "vector-action-protect": "ꙁабранѥниѥ", + "vector-action-unprotect": "иꙁмѣни ꙁабранѥниꙗ обраꙁъ", + "vector-view-create": "сътворѥниѥ", + "vector-view-edit": "исправлѥниѥ", + "vector-view-history": "їсторїꙗ", + "vector-view-view": "чьтѥниѥ", + "vector-view-viewsource": "страницѧ источьнъ обраꙁъ", + "vector-more-actions": "вѧщє", + "vector-main-menu-tooltip": "​Главное​ ​меню​", + "tooltip-vector-anon-user-menu-title": "Бо́льше ѻпцїй" +} diff --git a/Vector/i18n/cv.json b/Vector/i18n/cv.json new file mode 100644 index 0000000..68a6f28 --- /dev/null +++ b/Vector/i18n/cv.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Chavash", + "Chuvash2014", + "FLAGELLVM DEI", + "Astahar" + ] + }, + "vector-opt-out": "Кивӗ дизайна куҫ", + "vector-languages": "Чӗлхесем", + "vector-language-button-label": "{{PLURAL:$1|$1 чӗлхе}}", + "vector-no-language-button-label": "Чӗлхесем хуш", + "vector-action-addsection": "Тема хуш", + "vector-action-delete": "Кăларса пăрах", + "vector-action-move": "Ятне улăштар", + "vector-action-protect": "Хӳтĕле", + "vector-view-create": "Çĕннине ту", + "vector-view-edit": "Тӳрлет", + "vector-view-history": "Истори", + "vector-view-view": "Вула", + "vector-view-viewsource": "Кодне пăх", + "vector-more-actions": "Тата", + "vector-searchsuggest-containing": "Текстра $1 пур страницӑсене шырасси.", + "vector-toc-label": "Тупмалли", + "vector-toc-beginning": "Пуҫламӑш", + "vector-page-tools-label": "Хатӗрсем", + "vector-page-tools-general-label": "Пӗтӗмӗшле", + "vector-unpin-element-label": "пытар" +} diff --git a/Vector/i18n/cy.json b/Vector/i18n/cy.json new file mode 100644 index 0000000..3dc8e75 --- /dev/null +++ b/Vector/i18n/cy.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "Afalau", + "Dafyddt", + "JonesT143", + "Lloffiwr" + ] + }, + "vector-skin-desc": "Darperir 2 wedd Vector:\n* 2011 - Y fersiwn Modern o MonoBook gyda golwg newydd a llawer o welliannau hygyrchedd.\n* 2022 - Y Vector a adeiladwyd fel rhan o brosiect [[mw:Desktop Improvements]] yr WMF.", + "prefs-vector-enable-vector-1-label": "Defnyddio Legacy Vector", + "prefs-vector-enable-vector-1-help": "Dros y blynyddoedd nesaf, rydym yn mynd i ddiweddaru'r gwedd Vector. Bydd y gwedd Legacy Vector yn eich caniatáu i weld yr hen fersiwn o Vector (yn ôl Rhagfyr 2019). Os hoffech chi fwy o wybodaeth am y diweddariadau hyn, ewch i'r [[mw:Reading/Web/Desktop_Improvements|dudalen brosiect]].", + "vector-opt-out": "Defnyddio'r hen wedd", + "vector-opt-out-tooltip": "Newid eich gosodiadau i ddefnyddio'r hen wedd (Legacy Vector)", + "vector-action-toggle-sidebar": "Toglo bar ochr", + "vector-languages": "Ieithoedd", + "vector-language-button-aria-label": "Ewch i erthygl mewn iaith arall. Ar gael mewn {{PLURAL:$1|$1 iaith}}", + "vector-language-button-label": "{{PLURAL:$1|$1 iaith}}", + "vector-no-language-button-label": "Ychwanegu ieithoedd", + "vector-no-language-button-aria-label": "Mae'r erthygl hon ar gael yn yr iaith hon yn unig. Ychwanegwch yr erthygl mewn ieithoedd eraill", + "vector-language-redirect-to-top": "Ar {{SITENAME}}, lleolir dolenni iaith ar frig y dudalen yn y cyfeiriad ar draws teitl yr erthygl. [[#p-lang-btn|Ewch i'r brig]].", + "vector-language-variant-switcher-label": "Newid amrywiad iaith", + "vector-action-addsection": "Ychwanegu pwnc", + "vector-action-delete": "Dileu", + "vector-action-move": "Symud", + "vector-action-protect": "Diogelu", + "vector-action-undelete": "Adfer", + "vector-action-unprotect": "Newid diogelwch", + "vector-view-create": "Dechrau", + "vector-view-edit": "Golygu", + "vector-view-history": "Gweld hanes", + "vector-view-view": "Darllen", + "vector-view-viewsource": "Gweld cod", + "vector-jumptonavigation": "Neidio i'r panel llywio", + "vector-jumptosearch": "Neidio i'r bar chwilio", + "vector-jumptocontent": "Neidio i'r cynnwys", + "vector-more-actions": "Rhagor", + "vector-search-loader": "Wrthi'n llwytho awgrymiadau chwilio", + "vector-searchsuggest-containing": "Chwilio am dudalennau sy'n cynnwys $1", + "vector-intro-page": "Help:Cyflwyniad", + "vector-toc-label": "Cynnwys", + "vector-toc-beginning": "Y dechrau", + "vector-toc-toggle-button-label": "Toglo is-adran $1", + "vector-anon-user-menu-pages": "Tudalennau ar gyfer golygyddion allgofnodedig", + "vector-anon-user-menu-pages-learn": "dysgu mwy", + "vector-anon-user-menu-pages-label": "Dysgu mwy am olygu", + "vector-main-menu-tooltip": "Prif ddewislen", + "vector-toc-menu-tooltip": "Tabl Cynnwys", + "vector-toc-collapsible-button-label": "Toglo'r tabl cynnwys", + "vector-site-nav-label": "Safle", + "vector-main-menu-label": "Prif ddewislen", + "vector-limited-width-toggle": "Toglo lled cynnwys cyfyngedig", + "vector-page-tools-label": "Blwch offer", + "vector-page-tools-general-label": "Cyffredinol", + "vector-page-tools-actions-label": "Gweithredoedd", + "vector-pin-element-label": "symud i'r bar ochr", + "vector-unpin-element-label": "cuddio", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Trafodaeth]]", + "tooltip-vector-anon-user-menu-title": "Rhagor o opsiynau", + "vector-prefs-limited-width": "Galluogi modd lled cyfyngedig", + "vector-prefs-limited-width-help": "Galluogi modd lled cyfyngedig i wella profiad darllen.", + "empty-language-selector-body": "Ni chefnogir cynnwys y dudalen mewn ieithoedd eraill." +} diff --git a/Vector/i18n/da.json b/Vector/i18n/da.json new file mode 100644 index 0000000..2104c8b --- /dev/null +++ b/Vector/i18n/da.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Antonla", + "Byrial", + "Christian List", + "Jan Friberg", + "Peter Alberti", + "Saederup92", + "Sarrus", + "SiGNOUT", + "Steenth", + "Weblars" + ] + }, + "vector-skin-desc": "Der findes 2 Vector skins:\n\n* 2011 - Den moderne version af MonoBook med frisk udseende og mange forbedringer af brugervenligheden.\n* 2022 - Den version som er udviklet som en del af WMFs [[mw:Desktop Improvements]] project.", + "prefs-vector-enable-vector-1-label": "Brug klassisk Vector", + "prefs-vector-enable-vector-1-help": "I løbet af de næste år vil vi gradvis opdatere Vector-udseendet. Klassisk Vector vil vise den gamle version af Vector (per december 2019). For at læse mere om opdateringen, se [[mw:Reading/Web/Desktop_Improvements|vores projektside]].", + "vector-opt-out": "Skift til det gamle udseende", + "vector-opt-out-tooltip": "Ændr indstillingerne for at gå tilbage til det gamle udseende (klassisk Vector)", + "vector-action-toggle-sidebar": "Vis/skjul venstremenuen", + "vector-languages": "Sprog", + "vector-language-button-aria-label": "Gå til en artikel på et andet sprog. Tilgængelig på {{PLURAL:$1|$1 sprog}}", + "vector-language-button-label": "{{PLURAL:$1|$1 sprog}}", + "vector-no-language-button-label": "Tilføj sprog", + "vector-no-language-button-aria-label": "Denne artikel findes kun på dette sprog. Tilføj artiklen til andre sprog", + "vector-language-redirect-to-top": "På denne {{SITENAME}} er sproglinkene i toppen af siden overfor artiklens titel.\n[[#p-lang-btn|Gå til toppen]].", + "vector-language-variant-switcher-label": "Ændr sprogvariant", + "vector-action-addsection": "Tilføj emne", + "vector-action-delete": "Slet", + "vector-action-move": "Flyt", + "vector-action-protect": "Beskyt", + "vector-action-undelete": "Gendan", + "vector-action-unprotect": "Ændr beskyttelse", + "vector-view-create": "Opret", + "vector-view-edit": "Redigér", + "vector-view-history": "Se historik", + "vector-view-view": "Læs", + "vector-view-viewsource": "Se kilden", + "vector-jumptonavigation": "Spring til navigation", + "vector-jumptosearch": "Spring til søgning", + "vector-jumptocontent": "Spring til indhold", + "vector-more-actions": "Mere", + "vector-search-loader": "Henter søgeforslag", + "vector-searchsuggest-containing": "Søgning for sider der indeholder $1", + "vector-intro-page": "Help:Introduktion", + "vector-toc-label": "Indhold", + "vector-toc-beginning": "Starten", + "vector-toc-toggle-button-label": "Vis/skjul underafsnit $1", + "vector-anon-user-menu-pages": "Sider for redaktører som er logget ud", + "vector-anon-user-menu-pages-learn": "lær mere", + "vector-anon-user-menu-pages-label": "Læs mere om redigering", + "vector-main-menu-tooltip": "Hovedmenu", + "vector-toc-menu-tooltip": "Indholdsfortegnelse", + "vector-toc-collapsible-button-label": "Vis/skjul indholdsfortegnelsen", + "vector-site-nav-label": "Websted", + "vector-page-tools-label": "Værktøjer", + "vector-pin-element-label": "flyt til sidebjælken", + "vector-unpin-element-label": "skjul", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskussion]]", + "tooltip-vector-anon-user-menu-title": "Flere mugligheder", + "vector-prefs-limited-width": "Aktiver begrænset breddetilstand", + "vector-prefs-limited-width-help": "Aktiver begrænset breddetilstand for forbedret læseoplevelse." +} diff --git a/Vector/i18n/dag.json b/Vector/i18n/dag.json new file mode 100644 index 0000000..6668ece --- /dev/null +++ b/Vector/i18n/dag.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "Achiri Bitamsimli", + "Alhaj Darajaati", + "Chirifo", + "Dnshitobu", + "Jahinfo", + "Masssly", + "Musahfm", + "Ruky Wunpini" + ] + }, + "vector-languages": "Bala", + "vector-language-button-aria-label": "Kpemi lahabali bali sheli ni. Din be {{PLURAL:$1|$1 Balli |$1 Bala}}", + "vector-no-language-button-label": "Pahimi bala", + "vector-language-variant-switcher-label": "Taɣimi balli woliginsima", + "vector-action-addsection": "Pahimi yaɣili", + "vector-action-delete": "Nyahima", + "vector-action-move": "Tirisibu", + "vector-action-protect": "Gubu", + "vector-view-create": "Namma", + "vector-view-edit": "Mali niŋ", + "vector-view-history": "Lihimi tarihi", + "vector-view-view": "Karimma", + "vector-more-actions": "Lihimi n pahi", + "vector-searchsuggest-containing": "Yuli bo yaɣi shɛŋa din mali $1", + "vector-page-tools-label": "Tuma nɛma", + "vector-page-tools-general-label": "Di bɔbigbaai", + "vector-unpin-element-label": "Sɔɣima" +} diff --git a/Vector/i18n/dar.json b/Vector/i18n/dar.json new file mode 100644 index 0000000..6629cbc --- /dev/null +++ b/Vector/i18n/dar.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Soul Train" + ] + }, + "vector-view-view": "БелчӀес", + "vector-more-actions": "ГӀурра" +} diff --git a/Vector/i18n/de-ch.json b/Vector/i18n/de-ch.json new file mode 100644 index 0000000..f2928ac --- /dev/null +++ b/Vector/i18n/de-ch.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Inkowik", + "L*E*D", + "Marcell0" + ] + }, + "vector-view-edit": "Bearbeiten", + "vector-view-history": "Versionsgeschichte", + "vector-view-view": "Lesen", + "vector-more-actions": "Mehr" +} diff --git a/Vector/i18n/de-formal.json b/Vector/i18n/de-formal.json new file mode 100644 index 0000000..6403918 --- /dev/null +++ b/Vector/i18n/de-formal.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Kghbln", + "Zabe" + ] + }, + "prefs-vector-enable-vector-1-help": "Im Laufe der kommenden Jahre wird die Benutzeroberfläche Vector schrittweise modernisiert. Mit dem klassischen Vector können Sie die bisherige Version von Vector (Stand: Dezember 2019) weiterhin verwenden. Mehr über die Modernisierungen finden Sie auf der [[mw:Reading/Web/Desktop_Improvements|Projektseite]].", + "vector-action-addsection": "Abschnitt hinzufügen", + "vector-view-edit": "Bearbeiten" +} diff --git a/Vector/i18n/de.json b/Vector/i18n/de.json new file mode 100644 index 0000000..125ddd2 --- /dev/null +++ b/Vector/i18n/de.json @@ -0,0 +1,70 @@ +{ + "@metadata": { + "authors": [ + "Brettchenweber", + "CennoxX", + "Kghbln", + "Metalhead64", + "Schniggendiller", + "The Evil IP address", + "Umherirrender" + ] + }, + "skinname-vector": "Vector alt (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-skin-desc": "Bietet 2 Varianten der Benutzeroberfläche:\n* 2011 – Die moderne Version mit frischem Aussehen und vielen Verbesserungen der Benutzerfreundlichkeit.\n* 2022 – Die neueste Version, die als Teil des WMF-Projekts [[mw:Desktop Improvements]] entwickelt wurde.", + "prefs-vector-enable-vector-1-label": "Verwende klassischen Vector", + "prefs-vector-enable-vector-1-help": "Im Laufe der kommenden Jahre wird die Benutzeroberfläche Vector schrittweise modernisiert. Mit dem klassischen Vector kannst du die bisherige Version von Vector (Stand: Dezember 2019) weiterhin verwenden. Mehr über die Modernisierungen findest du auf der [[mw:Reading/Web/Desktop_Improvements|Projektseite]].", + "vector-opt-out": "Umschalten zum bisherigen Aussehen", + "vector-opt-out-tooltip": "Ändere deine Einstellungen, um zum alten Aussehen der Benutzeroberfläche zurückzukehren (Legacy-Vector)", + "vector.css": "/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. */", + "vector.js": "/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. */", + "vector-action-toggle-sidebar": "Seitenleiste umschalten", + "vector-languages": "Sprachen", + "vector-language-button-aria-label": "Zu einem Artikel in einer anderen Sprache gehen. Verfügbar in {{PLURAL:$1|$1 Sprache|$1 Sprachen}}", + "vector-language-button-label": "{{PLURAL:$1|$1 Sprache|$1 Sprachen}}", + "vector-no-language-button-label": "Sprachen hinzufügen", + "vector-no-language-button-aria-label": "Dieser Artikel existiert nur in dieser Sprache. Füge den Artikel für andere Sprachen hinzu", + "vector-language-redirect-to-top": "In {{SITENAME}} befinden sich die Sprachlinks am oberen Rand der Seite gegenüber dem Artikeltitel. [[#p-lang-btn|Zum Anfang]].", + "vector-language-variant-switcher-label": "Sprachvariante ändern", + "vector-action-addsection": "Abschnitt hinzufügen", + "vector-action-delete": "Löschen", + "vector-action-move": "Verschieben", + "vector-action-protect": "Schützen", + "vector-action-undelete": "Wiederherstellen", + "vector-action-unprotect": "Seitenschutz ändern", + "vector-view-create": "Erstellen", + "vector-view-edit": "Bearbeiten", + "vector-view-history": "Versionsgeschichte", + "vector-view-view": "Lesen", + "vector-view-viewsource": "Quelltext anzeigen", + "vector-jumptonavigation": "Zur Navigation springen", + "vector-jumptosearch": "Zur Suche springen", + "vector-jumptocontent": "Zum Inhalt springen", + "vector-more-actions": "Mehr", + "vector-search-loader": "Laden von Suchvorschlägen", + "vector-searchsuggest-containing": "Suche nach Seiten, die $1 enthalten", + "vector-intro-page": "Help:Einführung", + "vector-toc-label": "Inhaltsverzeichnis", + "vector-toc-beginning": "Anfang", + "vector-toc-toggle-button-label": "Unterabschnitt $1 umschalten", + "vector-anon-user-menu-pages": "Seiten für abgemeldete Benutzer", + "vector-anon-user-menu-pages-learn": "Weitere Informationen", + "vector-anon-user-menu-pages-label": "Erfahre mehr über das Bearbeiten", + "vector-main-menu-tooltip": "Hauptmenü", + "vector-toc-menu-tooltip": "Inhaltsverzeichnis", + "vector-toc-collapsible-button-label": "Inhaltsverzeichnis umschalten", + "vector-site-nav-label": "Website", + "vector-main-menu-label": "Hauptmenü", + "vector-limited-width-toggle": "Umschalten der eingeschränkten Breite des Inhalts", + "vector-page-tools-label": "Werkzeuge", + "vector-page-tools-general-label": "Allgemein", + "vector-page-tools-actions-label": "Aktionen", + "vector-pin-element-label": "In die Seitenleiste verschieben", + "vector-unpin-element-label": "Verbergen", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskussion]]", + "tooltip-vector-anon-user-menu-title": "Weitere Optionen", + "vector-prefs-limited-width": "Modus für begrenzte Breite aktivieren", + "vector-prefs-limited-width-help": "Aktiviere den Modus mit begrenzter Breite für eine verbesserte Leseansicht", + "empty-language-selector-body": "Seiteninhalte werden in anderen Sprachen nicht unterstützt." +} diff --git a/Vector/i18n/dga.json b/Vector/i18n/dga.json new file mode 100644 index 0000000..43bc928 --- /dev/null +++ b/Vector/i18n/dga.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Linus Konkor", + "Yirkang", + "Zakaria Tunsung" + ] + }, + "vector-languages": "Kɔkɔɛ", + "vector-language-button-label": "{{PLURAL:$1|$1 kɔkɔre|$1 kɔkɔɛ}}", + "vector-no-language-button-label": "Poɔ kɔkɔɛ", + "vector-action-addsection": "Paali yɛlzu", + "vector-action-delete": "Iri bare", + "vector-action-move": "Kyɛne ane gaa", + "vector-action-protect": "Guubo", + "vector-view-create": "Maale", + "vector-view-edit": "Leɛre", + "vector-view-history": "Kaa dabaŋkoroŋ", + "vector-view-view": "Gane", + "vector-more-actions": "Yaga", + "vector-searchsuggest-containing": "Bɔ leɛre ama naŋ taa $1", + "vector-page-tools-label": "Tɔtɔbomma", + "vector-page-tools-general-label": "Te zaa", + "vector-unpin-element-label": "Sɔgele" +} diff --git a/Vector/i18n/din.json b/Vector/i18n/din.json new file mode 100644 index 0000000..4778b79 --- /dev/null +++ b/Vector/i18n/din.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Dinkawiki" + ] + }, + "vector-action-addsection": "Mätë wɛ̈tnhom", + "vector-action-move": "Laar", + "vector-view-create": "Cak", + "vector-view-edit": "Cokic", + "vector-view-history": "Ɣoië käthɛɛr", + "vector-view-view": "Kuën", + "vector-more-actions": "Ajuëc" +} diff --git a/Vector/i18n/diq.json b/Vector/i18n/diq.json new file mode 100644 index 0000000..4b30d0f --- /dev/null +++ b/Vector/i18n/diq.json @@ -0,0 +1,50 @@ +{ + "@metadata": { + "authors": [ + "1917 Ekim Devrimi", + "Amire80", + "Asmen", + "Calak", + "Dılmıc", + "Erdemaslancan", + "Gambollar", + "Gorizon", + "Gırd", + "Kumkumuk", + "Mirzali", + "Orbot707", + "Velg" + ] + }, + "skinname-vector": "Vektor", + "vector-skin-desc": "Asayışo de newe be versiyonê MonoBookiyo modern ra û weşkerdışê ke şenê bıgureniyê", + "prefs-vector-enable-vector-1-label": "Vektorê kehani bıkarnê", + "prefs-vector-enable-vector-1-help": "Serre ke ma ver yenê ma dê asayışê vektori qedemeyın rocanê kerê. Kehan versiyonê kehan vektori hetana Çele 2019 mısade deyeno. Seba rocane kerdışan zêde melumati rê şırê [[mw:Reading/Web/Desktop_Improvements|pela proceyi]]", + "vector-opt-out": "Ravêr asayışê verêni", + "vector-opt-out-tooltip": "Kehan asayışê cildi şiyayışi rê eyaranê ho bıvurnê (Vektoro kehan)", + "vector-action-toggle-sidebar": "Toggle sidebar", + "vector-languages": "Zıwani", + "vector-language-button-label": "{{PLURAL:$1|$1 zıwan|$1 zıwani}}", + "vector-no-language-button-label": "Zıwanan cı ke", + "vector-action-addsection": "Mewzu ake", + "vector-action-delete": "Bestere", + "vector-action-move": "Bıkırışe", + "vector-action-protect": "Bışevekne", + "vector-action-undelete": "Meestere", + "vector-action-unprotect": "Şeveknayışi bıvurne", + "vector-view-create": "Vıraze", + "vector-view-edit": "Bıvurne", + "vector-view-history": "Verêni bıvêne", + "vector-view-view": "Bıwane", + "vector-view-viewsource": "Çımeyi bıvêne", + "vector-jumptonavigation": "Xıl de be pusula", + "vector-jumptosearch": "Xıl de cıgeyrayışi", + "vector-jumptocontent": "Ravêr zerreki", + "vector-more-actions": "Zêde", + "vector-search-loader": "Tewsiye cıgeyrayışi bar benê", + "vector-searchsuggest-containing": "Pelanê tede $1 esto, cı geyre", + "vector-toc-label": "Tedeesteyi", + "vector-page-tools-label": "Haceti", + "vector-page-tools-general-label": "Umumi", + "vector-unpin-element-label": "bınımne" +} diff --git a/Vector/i18n/dsb.json b/Vector/i18n/dsb.json new file mode 100644 index 0000000..e665c70 --- /dev/null +++ b/Vector/i18n/dsb.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Michawiki", + "Vlad5250" + ] + }, + "vector-action-addsection": "Temu pśidaś", + "vector-action-delete": "Wulašowaś", + "vector-action-move": "Pśesunuś", + "vector-action-protect": "Šćitaś", + "vector-action-undelete": "Wótnowiś", + "vector-action-unprotect": "Šćit změniś", + "vector-view-create": "Napóraś", + "vector-view-edit": "Wobźěłaś", + "vector-view-history": "Wersije a awtory", + "vector-view-view": "Cytaś", + "vector-view-viewsource": "Žrědło se woglědaś", + "vector-more-actions": "Wěcej" +} diff --git a/Vector/i18n/dtp.json b/Vector/i18n/dtp.json new file mode 100644 index 0000000..18bcbd3 --- /dev/null +++ b/Vector/i18n/dtp.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "FRANCIS5091", + "FRANELYA", + "Meqqal" + ] + }, + "vector-action-addsection": "Ruhangai piboboroson", + "vector-action-delete": "Pugaso", + "vector-action-move": "Poundoliho", + "vector-action-protect": "Tingoligai", + "vector-action-undelete": "Kada pugaso", + "vector-action-unprotect": "Alanai tingolig", + "vector-view-create": "Pomonsoi", + "vector-view-edit": "Idito", + "vector-view-history": "Intaai susuyan", + "vector-view-view": "Basao", + "vector-view-viewsource": "Intaai wowonod", + "vector-more-actions": "Suai", + "vector-searchsuggest-containing": "Ihumo bolikan di haro $1" +} diff --git a/Vector/i18n/dty.json b/Vector/i18n/dty.json new file mode 100644 index 0000000..112df2d --- /dev/null +++ b/Vector/i18n/dty.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Nirajan pant", + "जनक राज भट्ट", + "रमेश सिंह बोहरा", + "राम प्रसाद जोशी" + ] + }, + "vector-action-addsection": "विषय थपिदिय", + "vector-action-delete": "मेटऽ", + "vector-action-move": "साद्दे", + "vector-action-protect": "सुरक्षा अरऽ", + "vector-action-undelete": "मेट्याको रद्द अरऽ", + "vector-action-unprotect": "सुरक्षा बदेलऽ", + "vector-view-create": "सृजना गर्न्या", + "vector-view-edit": "सम्पादन", + "vector-view-history": "इतिहास तकऽ", + "vector-view-view": "पढ़ऽ", + "vector-view-viewsource": "स्रोत हेरऽ", + "vector-more-actions": "झिक्क" +} diff --git a/Vector/i18n/dv.json b/Vector/i18n/dv.json new file mode 100644 index 0000000..aea3c22 --- /dev/null +++ b/Vector/i18n/dv.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Glaisher", + "Ushau97" + ] + }, + "vector-action-addsection": "ޚިޔާލެއް އިތުރުކުރައްވާ", + "vector-action-delete": "ފޮހެލައްވާ", + "vector-action-move": "ތަން ބަދަލުކުރައްވާ", + "vector-action-protect": "ދިފާޢުކުރައްވާ", + "vector-action-undelete": "އިޔާދަކުރައްވާ", + "vector-action-unprotect": "ދިފާޢުކުރުން ބަދަލުކުރައްވާ", + "vector-view-create": "ފަށްޓަވާ", + "vector-view-edit": "އުނިއިތުރު ގެންނަވާ", + "vector-view-history": "ޞަފްޙާގެ ތާރީޚް", + "vector-view-view": "ކިޔުއްވާ", + "vector-view-viewsource": "މަސްދަރު ބައްލަވާ", + "vector-more-actions": "އިތުރަށް" +} diff --git a/Vector/i18n/dz.json b/Vector/i18n/dz.json new file mode 100644 index 0000000..282f81b --- /dev/null +++ b/Vector/i18n/dz.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Tshering Nidup" + ] + }, + "vector-view-view": "ལྷག" +} diff --git a/Vector/i18n/ee.json b/Vector/i18n/ee.json new file mode 100644 index 0000000..890cd3a --- /dev/null +++ b/Vector/i18n/ee.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Aguve", + "Amuzujoe", + "Azorbli", + "Natsubee" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 gbe|$1 gbeawo}}", + "vector-action-addsection": "Tsɔ tanya kpi", + "vector-action-delete": "Tutui", + "vector-action-move": "Ɖɔli eƒe nɔƒe", + "vector-action-protect": "Kpɔ eta", + "vector-view-create": "Dze egɔme", + "vector-view-edit": "Trɔ asi le eŋu", + "vector-view-history": "Kpɔ xoxoawo", + "vector-view-view": "Xlẽ", + "vector-view-viewsource": "Kpɔ alesi woŋlɔe", + "vector-more-actions": "Bubuwo" +} diff --git a/Vector/i18n/efi.json b/Vector/i18n/efi.json new file mode 100644 index 0000000..e371f51 --- /dev/null +++ b/Vector/i18n/efi.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Samatics", + "Emmikweok", + "Maryeren", + "Amire80" + ] + }, + "vector-languages": "Mme usem", + "vector-language-button-label": "{{PLURAL:$1|$1 usem|$1 mme usem}}", + "vector-no-language-button-label": "Dian mme usem", + "vector-action-addsection": "Dian ibuotikọ", + "vector-action-delete": "Sọhi", + "vector-action-move": "Men ka", + "vector-action-protect": "Kpeme", + "vector-view-create": "Bot", + "vector-view-history": "Se se ẹma ẹkenanam", + "vector-view-view": "Kot", + "vector-more-actions": "En̄wen", + "vector-searchsuggest-containing": "Yom mme ikpehe $1ọdọn̄ọde", + "vector-toc-label": "Se Isịnede", + "vector-toc-beginning": "Editọñọ", + "vector-page-tools-label": "N̄kpọ utom", + "vector-page-tools-general-label": "Ke ofụri ofụri", + "vector-unpin-element-label": "dịbe" +} diff --git a/Vector/i18n/egl.json b/Vector/i18n/egl.json new file mode 100644 index 0000000..a819ab0 --- /dev/null +++ b/Vector/i18n/egl.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Lévi" + ] + }, + "vector-action-addsection": "Zûnta discusiòun", + "vector-action-delete": "Scanşèla", + "vector-action-move": "Spôsta", + "vector-action-protect": "Prutēz", + "vector-action-undelete": "Fà al recóper", + "vector-action-unprotect": "Câmbia la prutesiòun", + "vector-view-create": "Invèinta", + "vector-view-edit": "Mudéfica", + "vector-view-history": "Guêrda la stôria", + "vector-view-view": "Lēş", + "vector-view-viewsource": "Guêrda la surzéia", + "vector-more-actions": "Êter" +} diff --git a/Vector/i18n/el.json b/Vector/i18n/el.json new file mode 100644 index 0000000..1f9dd31 --- /dev/null +++ b/Vector/i18n/el.json @@ -0,0 +1,72 @@ +{ + "@metadata": { + "authors": [ + "Calak", + "Crazymadlover", + "Evropi", + "Geraki", + "NikosLikomitros", + "Nikosgranturismogt", + "Norhorn", + "Omnipaedista", + "Protnet", + "ZaDiak", + "Αντιγόνη" + ] + }, + "vector-skin-desc": "Παρέχει 2 Vector θέματα:\n* 2011 - Τη σύγχρονη έκδοση του MonoBook με φρέσκια εμφάνιση και πολλές βελτιώσεις στη χρηστικότητα.\n* 2022 - Το Vector που δημιουργήθηκε ως μέρος του έργου [[mw:Desktop Improvements]] του WMF.", + "prefs-vector-enable-vector-1-label": "Χρήση του Legacy Vector", + "prefs-vector-enable-vector-1-help": "Κατά τα επόμενα χρόνια, θα αναβαθμίζουμε σταδιακά το περιβάλλον Vector. Το Legacy Vector θα σας επιτρέψει να δείτε την παλιά έκδοση του Vector (ως τον Δεκέμβριο του 2019). Για να μάθετε περισσότερα σχετικά με τις αναβαθμίσεις, μεταβείτε στη [[mw:Reading/Web/Desktop_Improvements|σελίδα του έργου]] μας.", + "vector-opt-out": "Εναλλαγή στην παλιά εμφάνιση", + "vector-opt-out-tooltip": "Αλλάξτε τις ρυθμίσεις για να πάτε πίσω στην παλιά εμφάνιση του θέματος (παλιό Vector)", + "vector.css": "/* Όλα τα CSS εδώ θα φορτώσουν για χρήστες του Vector skin */", + "vector.js": "/* Όλη η JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */", + "vector-action-toggle-sidebar": "Εναλλαγή πλευρικής στήλης", + "vector-languages": "Γλώσσες", + "vector-language-button-aria-label": "Μεταβείτε σε ένα λήμμα σε άλλη γλώσσα. Διαθέσιμο σε {{PLURAL:$1|μία γλώσσα|$1 γλώσσες}}", + "vector-language-button-label": "{{PLURAL:$1|$1 γλώσσα|$1 γλώσσες}}", + "vector-no-language-button-label": "Προσθήκη γλωσσών", + "vector-no-language-button-aria-label": "Αυτό το λήμμα υπάρχει μόνο σε αυτή τη γλώσσα. Προσθέστε το λήμμα για άλλες γλώσσες", + "vector-language-redirect-to-top": "Σε αυτή τη {{SITENAME}} οι σύνδεσμοι γλώσσας βρίσκονται στο επάνω μέρος της σελίδας απέναντι από τον τίτλο του λήμματος. [[#p-lang-btn|Μετάβαση στην κορυφή]].", + "vector-language-variant-switcher-label": "Αλλαγή παραλλαγής γλώσσας", + "vector-action-addsection": "Προσθήκη θέματος", + "vector-action-delete": "Διαγραφή", + "vector-action-move": "Μετακίνηση", + "vector-action-protect": "Προστασία", + "vector-action-undelete": "Επαναφορά", + "vector-action-unprotect": "Αλλαγή προστασίας", + "vector-view-create": "Δημιουργία", + "vector-view-edit": "Επεξεργασία", + "vector-view-history": "Προβολή ιστορικού", + "vector-view-view": "Ανάγνωση", + "vector-view-viewsource": "Προβολή κώδικα", + "vector-jumptonavigation": "Μετάβαση στην πλοήγηση", + "vector-jumptosearch": "Πήδηση στην αναζήτηση", + "vector-jumptocontent": "Μετάβαση στο περιεχόμενο", + "vector-more-actions": "Περισσότερα", + "vector-search-loader": "Φόρτωση προτάσεων αναζήτησης", + "vector-searchsuggest-containing": "Αναζητήστε σελίδες που περιέχουν $1", + "vector-intro-page": "Help:Εισαγωγή", + "vector-toc-label": "Περιεχόμενα", + "vector-toc-beginning": "Αρχή", + "vector-toc-toggle-button-label": "Εναλλαγή $1 υποενότητας", + "vector-anon-user-menu-pages": "Σελίδες για αποσυνδεμένους συντάκτες", + "vector-anon-user-menu-pages-learn": "μάθετε περισσότερα", + "vector-anon-user-menu-pages-label": "Μάθετε περισσότερα σχετικά με την επεξεργασία", + "vector-main-menu-tooltip": "Κύριο μενού", + "vector-toc-menu-tooltip": "Πίνακας Περιεχομένων", + "vector-toc-collapsible-button-label": "Εναλλαγή του πίνακα περιεχομένων", + "vector-site-nav-label": "Ιστότοπος", + "vector-main-menu-label": "Κύριο μενού", + "vector-limited-width-toggle": "Εναλλαγή περιορισμένου πλάτους περιεχομένου", + "vector-page-tools-label": "Εργαλεία", + "vector-page-tools-general-label": "Γενικά", + "vector-page-tools-actions-label": "Ενέργειες", + "vector-pin-element-label": "μετακίνηση στην πλαϊνή μπάρα", + "vector-unpin-element-label": "απόκρυψη", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Συζήτηση]]", + "tooltip-vector-anon-user-menu-title": "Περισσότερες επιλογές", + "vector-prefs-limited-width": "Ενεργοποίηση λειτουργίας περιορισμένου πλάτους", + "vector-prefs-limited-width-help": "Ενεργοποίηση λειτουργίας περιορισμένου πλάτους για βελτιωμένη εμπειρία ανάγνωσης.", + "empty-language-selector-body": "Τα περιεχόμενα της σελίδας δεν υποστηρίζονται σε άλλες γλώσσες." +} diff --git a/Vector/i18n/eml.json b/Vector/i18n/eml.json new file mode 100644 index 0000000..2a7e848 --- /dev/null +++ b/Vector/i18n/eml.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Gloria sah" + ] + }, + "vector-view-edit": "Mudéfica", + "vector-view-view": "Lēś", + "vector-more-actions": "Êter" +} diff --git a/Vector/i18n/en.json b/Vector/i18n/en.json new file mode 100644 index 0000000..202e6e3 --- /dev/null +++ b/Vector/i18n/en.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [] + }, + "skinname-vector": "Vector legacy (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "Provides 2 Vector skins:\n* 2011 - The Modern version of MonoBook with fresh look and many usability improvements.\n* 2022 - The Vector built as part of the WMF [[mw:Desktop Improvements]] project.", + "prefs-vector-enable-vector-1-label": "Use Legacy Vector", + "prefs-vector-enable-vector-1-help": "Over the next few years, we will be gradually updating the Vector skin. Legacy Vector will allow you to view the old version of Vector (as of December 2019). To learn more about the updates, go to our [[mw:Reading/Web/Desktop_Improvements|project page]].", + "vector-opt-out": "Switch to old look", + "vector-opt-out-tooltip": "Change your settings to go back to the old look of the skin (legacy Vector)", + "vector.css": "/* All CSS here will be loaded for users of the Vector skin */", + "vector.js": "/* All JavaScript here will be loaded for users of the Vector skin */", + "vector-action-toggle-sidebar": "Toggle sidebar", + "vector-languages": "Languages", + "vector-language-button-aria-label": "Go to an article in another language. Available in {{PLURAL:$1|$1 language|$1 languages}}", + "vector-language-button-label": "{{PLURAL:$1|$1 language|$1 languages}}", + "vector-no-language-button-label": "Add languages", + "vector-no-language-button-aria-label": "This article exist only in this language. Add the article for other languages", + "vector-language-redirect-to-top": "On this {{SITENAME}} the language links are at the top of the page across from the article title. [[#p-lang-btn|Go to top]].", + "vector-language-variant-switcher-label": "Change language variant", + "vector-action-addsection": "Add topic", + "vector-action-delete": "Delete", + "vector-action-move": "Move", + "vector-action-protect": "Protect", + "vector-action-undelete": "Undelete", + "vector-action-unprotect": "Change protection", + "vector-view-create": "Create", + "vector-view-edit": "Edit", + "vector-view-history": "View history", + "vector-view-view": "Read", + "vector-view-viewsource": "View source", + "vector-jumptonavigation": "Jump to navigation", + "vector-jumptosearch": "Jump to search", + "vector-jumptocontent": "Jump to content", + "vector-more-actions": "More", + "vector-search-loader": "Loading search suggestions", + "vector-searchsuggest-containing": "Search for pages containing $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Contents", + "vector-toc-beginning": "Beginning", + "vector-toc-toggle-button-label": "Toggle $1 subsection", + "vector-anon-user-menu-pages": "Pages for logged out editors", + "vector-anon-user-menu-pages-learn": "learn more", + "vector-anon-user-menu-pages-label": "Learn more about editing", + "vector-main-menu-tooltip": "Main menu", + "vector-toc-menu-tooltip": "Table of Contents", + "vector-toc-collapsible-button-label": "Toggle the table of contents", + "vector-site-nav-label": "Site", + "vector-main-menu-label": "Main menu", + "vector-limited-width-toggle": "Toggle limited content width", + "vector-page-tools-label": "Tools", + "vector-page-tools-general-label": "General", + "vector-page-tools-actions-label": "Actions", + "vector-pin-element-label": "move to sidebar", + "vector-unpin-element-label": "hide", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussion]]", + "tooltip-vector-anon-user-menu-title": "More options", + "vector-prefs-limited-width": "Enable limited width mode", + "vector-prefs-limited-width-help": "Enable limited width mode for improved reading experience.", + "empty-language-selector-body": "Page contents not supported in other languages." +} diff --git a/Vector/i18n/eo.json b/Vector/i18n/eo.json new file mode 100644 index 0000000..ee82be9 --- /dev/null +++ b/Vector/i18n/eo.json @@ -0,0 +1,58 @@ +{ + "@metadata": { + "authors": [ + "KuboF", + "Mirin", + "Objectivesea", + "Robin van der Vliet", + "Stefangrotz", + "Yekrats" + ] + }, + "skinname-vector": "Vector malnova (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "Disponigas 2 Vektorajn etosoj:\n* 2011 - La Moderna versio de MonoBook kun freŝa aspekto kaj multaj plibonigoj.\n* 2022 - La Vektoro konstruita kiel parto de la projekto WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Uzu Malnova Vector", + "vector-opt-out": "Reveni al la malnova aspekto", + "vector-opt-out-tooltip": "Ŝanĝu viajn agordojn por reveni al la malnova aspekto de la etoso (malnova Vector)", + "vector.css": "/* Ĉiu CSS ĉi tie estos ŝarĝitaj por uzantoj de la Vector etoso */", + "vector.js": "/* Ĉiuj JavaScript ĉi tie estos ŝarĝita por uzantoj de la Vector etsoso /", + "vector-action-toggle-sidebar": "Baskuligi la flankpanelon", + "vector-languages": "Lingvoj", + "vector-language-button-aria-label": "Iru al artikolo en alia lingvo. Havebla en {{PLURAL:$1|$1 lingvoj|$1 lingvo}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lingvo|$1 lingvoj}}", + "vector-no-language-button-label": "Aldoni lingvojn", + "vector-no-language-button-aria-label": "Ĉi tiu artikolo ekzistas nur en ĉi tiu lingvo. Aldonu la artikolon por aliaj lingvoj", + "vector-language-redirect-to-top": "En ĉi tiu {{SITENAME}} la lingvaj ligiloj estas ĉe la supro de la paĝo vidalvide de la titolo de la artikolo. [[#p-lang-btn|Iru al la supro]].", + "vector-language-variant-switcher-label": "Ŝanĝi lingvan varianton", + "vector-action-addsection": "Aldoni temon", + "vector-action-delete": "Forigi", + "vector-action-move": "Alinomi", + "vector-action-protect": "Protekti", + "vector-action-undelete": "Malforigi", + "vector-action-unprotect": "Ŝanĝi protektadon", + "vector-view-create": "Krei", + "vector-view-edit": "Redakti", + "vector-view-history": "Vidi historion", + "vector-view-view": "Legi", + "vector-view-viewsource": "Vidi fonton", + "vector-jumptonavigation": "Salti al navigilo", + "vector-jumptosearch": "Salti al serĉilo", + "vector-jumptocontent": "Saltu al enhavo", + "vector-more-actions": "Pli", + "vector-search-loader": "Ŝarĝante serĉsugestojn", + "vector-searchsuggest-containing": "Serĉu paĝojn enhavantajn$1", + "vector-toc-label": "Enhavo", + "vector-toc-beginning": "Komenco", + "vector-toc-toggle-button-label": "Baskuli $1 subsekcio", + "vector-anon-user-menu-pages": "Paĝoj por elsalutitaj redaktistoj", + "vector-anon-user-menu-pages-learn": "Lernu pli", + "vector-anon-user-menu-pages-label": "Lernu pli pri redaktado", + "vector-main-menu-tooltip": "Ĉefa menuo", + "vector-toc-menu-tooltip": "Enhavtabelo", + "vector-toc-collapsible-button-label": "Ŝaltu la enhavtabelon", + "vector-pin-element-label": "movigi al flanka panelo", + "vector-unpin-element-label": "kaŝi", + "tooltip-vector-anon-user-menu-title": "Pliaj agordoj" +} diff --git a/Vector/i18n/es-formal.json b/Vector/i18n/es-formal.json new file mode 100644 index 0000000..0a70512 --- /dev/null +++ b/Vector/i18n/es-formal.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "KATRINE1993", + "XanaG" + ] + }, + "vector-view-edit": "Editar", + "vector-view-history": "Ver historial", + "vector-view-view": "Leer" +} diff --git a/Vector/i18n/es.json b/Vector/i18n/es.json new file mode 100644 index 0000000..0b43bab --- /dev/null +++ b/Vector/i18n/es.json @@ -0,0 +1,89 @@ +{ + "@metadata": { + "authors": [ + "Adam N.", + "Amire80", + "Armando-Martin", + "Avengium", + "Crazymadlover", + "Dalton2", + "DarkGames26", + "Dgstranz", + "DiegoAmbrocio", + "Diegodlh", + "Fitoschido", + "FlyingAce", + "Geryescalier", + "Ihojose", + "Johny Weissmuller Jr", + "Locos epraix", + "Manuelt15", + "MarcoAurelio", + "Miguel2706", + "Platonides", + "Rodelar", + "Rodney Araujo", + "Vivaelcelta", + "Zapipedia (WMF)", + "-sasha-" + ] + }, + "skinname-vector": "Versión heredada de Vector (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "Proporciona dos apariencias de Vector:\n* 2011 - Versión moderna de MonoBook, con un aspecto actualizado y muchas mejoras de usabilidad\n* 2022 - Vector construido como parte del proyecto [[mw:Desktop Improvements|Mejoras a la IU de escritorio]] de la Fundación Wikimedia.", + "prefs-vector-enable-vector-1-label": "Utilizar versión heredada de Vector", + "prefs-vector-enable-vector-1-help": "Durante los próximos años, actualizaremos gradualmente la piel Vector. La versión heredada de Vector te permitirá ver la versión anterior de Vector (a diciembre de 2019). Para obtener más información sobre las actualizaciones, ve a nuestra [[mw:Reading/Web/Desktop_Improvements|página del proyecto]].", + "vector-opt-out": "Cambiar a la apariencia anterior", + "vector-opt-out-tooltip": "Cambie su configuración para volver al aspecto anterior de la máscara (Vector heredado)", + "vector.css": "/* Todo CSS colocado en esta página será cargado para los usuarios que usen la apariencia \"Vector\" */", + "vector.js": "/* Todo código JavaScript escrito aquí se cargará para todos los usuarios de la apariencia Vector */", + "vector-action-toggle-sidebar": "Mostrar u ocultar la barra lateral", + "vector-languages": "Idiomas", + "vector-language-button-aria-label": "Ir a un artículo en otro idioma. Disponible en {{PLURAL:$1|$1 idioma|$1 idiomas}}", + "vector-language-button-label": "{{PLURAL:$1|$1 idioma|$1 idiomas}}", + "vector-no-language-button-label": "Añadir idiomas", + "vector-no-language-button-aria-label": "Este artículo existe sólo en este idioma. Añade el artículo para otros idiomas", + "vector-language-redirect-to-top": "En {{SITENAME}}, los enlaces de idiomas se encuentran en la parte superior de la página, frente al título del artículo. [[#p-lang-btn|Ir arriba]].", + "vector-language-variant-switcher-label": "Cambiar variante de idioma", + "vector-action-addsection": "Añadir tema", + "vector-action-delete": "Borrar", + "vector-action-move": "Mover", + "vector-action-protect": "Proteger", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Cambiar protección", + "vector-view-create": "Crear", + "vector-view-edit": "Editar", + "vector-view-history": "Ver historial", + "vector-view-view": "Leer", + "vector-view-viewsource": "Ver código", + "vector-jumptonavigation": "Ir a la navegación", + "vector-jumptosearch": "Ir a la búsqueda", + "vector-jumptocontent": "Ir al contenido", + "vector-more-actions": "Más", + "vector-search-loader": "Cargando sugerencias de búsqueda", + "vector-searchsuggest-containing": "Buscar páginas que contengan $1", + "vector-intro-page": "Help:Introducción", + "vector-toc-label": "Contenidos", + "vector-toc-beginning": "Inicio", + "vector-toc-toggle-button-label": "Alternar subsección $1", + "vector-anon-user-menu-pages": "Páginas para editores desconectados", + "vector-anon-user-menu-pages-learn": "más información", + "vector-anon-user-menu-pages-label": "Obtenga más información sobre editar", + "vector-main-menu-tooltip": "Menú principal", + "vector-toc-menu-tooltip": "Tabla de contenidos", + "vector-toc-collapsible-button-label": "Cambiar a la tabla de contenidos", + "vector-site-nav-label": "Sitio", + "vector-main-menu-label": "Menú principal", + "vector-limited-width-toggle": "Activar o desactivar el límite de anchura del contenido", + "vector-page-tools-label": "Herramientas", + "vector-page-tools-general-label": "General", + "vector-page-tools-actions-label": "Acciones", + "vector-pin-element-label": "mover a la barra lateral", + "vector-unpin-element-label": "ocultar", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discusión]]", + "tooltip-vector-anon-user-menu-title": "Más opciones", + "vector-prefs-limited-width": "Habilitar el modo de ancho limitado", + "vector-prefs-limited-width-help": "Activa el modo de ancho limitado para una experiencia de lectura mejorada.", + "empty-language-selector-body": "Contenido de la página no disponible en otros idiomas." +} diff --git a/Vector/i18n/esu.json b/Vector/i18n/esu.json new file mode 100644 index 0000000..b32ac1d --- /dev/null +++ b/Vector/i18n/esu.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "82-145" + ] + }, + "vector-action-move": "Atra cimirtuq", + "vector-view-view": "Naaqe" +} diff --git a/Vector/i18n/et.json b/Vector/i18n/et.json new file mode 100644 index 0000000..28fa097 --- /dev/null +++ b/Vector/i18n/et.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ker", + "Pikne", + "WikedKentaur" + ] + }, + "skinname-vector": "Vana Vektor (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "vector-skin-desc": "Lisab kaks Vektori-kujundust:\n* 2011 – MonoBooki uuem versioon värskema väljanägemise ja mitme kasutajasõbralikuma täiendusega.\n* 2022 – WMF-i projekti [[mw:Desktop Improvements]] raames arendatud Vektor.", + "prefs-vector-enable-vector-1-label": "Kasuta vana Vektorit", + "prefs-vector-enable-vector-1-help": "Tulevatel aastatel uuendame järk-järgult Vektori-kujundust. Vana Vektor võimaldab kuvada kujunduse vana versiooni (seisuga detsember 2019). Lisateavet uuenduste kohta leiad [[mw:Reading/Web/Desktop_Improvements|projekti lehelt]].", + "vector-opt-out": "Lülitu vanale ilmele", + "vector-opt-out-tooltip": "Muuda eelistusi, et kasutada edasi kujunduse vana väljanägemist (vana Vektor)", + "vector.css": "/* Siin asuv kaskaadilaadistik laaditakse kõigi Vektori-kujunduse kasutajate jaoks. */", + "vector.js": "/* Siin asuv JavaScript laaditakse kõigi Vektori-kujunduse kasutajate jaoks. */", + "vector-action-toggle-sidebar": "Näita külgpaani või peida see", + "vector-languages": "Keeled", + "vector-language-button-aria-label": "Mine teises keeles artiklisse. Saadaval {{PLURAL:$1|$1 keeles}}", + "vector-language-button-label": "{{PLURAL:$1|$1 keel|$1 keelt}}", + "vector-no-language-button-label": "Lisa keeled", + "vector-language-redirect-to-top": "Selles {{GRAMMAR:genitive|{{SITENAME}}}} artiklis on keelelingid artikli kohal pealkirja vastas. [[#p-lang-btn|Mine üles]].", + "vector-action-addsection": "Lisa teema", + "vector-action-delete": "Kustuta", + "vector-action-move": "Teisalda", + "vector-action-protect": "Kaitse", + "vector-action-undelete": "Taasta", + "vector-action-unprotect": "Muuda kaitset", + "vector-view-create": "Loo", + "vector-view-edit": "Muuda", + "vector-view-history": "Näita ajalugu", + "vector-view-view": "Vaata", + "vector-view-viewsource": "Vaata lähteteksti", + "vector-jumptonavigation": "Mine navigeerimisribale", + "vector-jumptosearch": "Mine otsikasti", + "vector-jumptocontent": "Mine sisu juurde", + "vector-more-actions": "Veel", + "vector-search-loader": "Otsisoovituste laadimine", + "vector-searchsuggest-containing": "Otsi lehekülgi, kus sisaldub $1", + "vector-intro-page": "Help:Sissejuhatus", + "vector-toc-label": "Sisukord", + "vector-toc-beginning": "Algus", + "vector-anon-user-menu-pages": "Sisse logimata kasutaja leheküljed", + "vector-anon-user-menu-pages-learn": "lisateave", + "vector-anon-user-menu-pages-label": "Loe veel muutmise kohta", + "vector-main-menu-tooltip": "Peamenüü", + "vector-toc-menu-tooltip": "Sisukord", + "vector-main-menu-label": "Peamenüü", + "vector-page-tools-label": "Tööriistad", + "vector-page-tools-general-label": "Üldine", + "vector-page-tools-actions-label": "Toimingud", + "vector-pin-element-label": "vii külgpaanile", + "vector-unpin-element-label": "peida", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|arutelu]]", + "tooltip-vector-anon-user-menu-title": "Veel valikuid", + "vector-prefs-limited-width": "Luba piiratud laiuse režiim", + "vector-prefs-limited-width-help": "Luba piiratud laiuse režiim parema lugemiskogemuse jaoks.", + "empty-language-selector-body": "Selle lehekülje sisule puudub teiste keelte tugi." +} diff --git a/Vector/i18n/eu.json b/Vector/i18n/eu.json new file mode 100644 index 0000000..74b92ce --- /dev/null +++ b/Vector/i18n/eu.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Fitoschido", + "Subi", + "Theklan", + "Unai Fdz. de Betoño", + "Xabier Armendaritz" + ] + }, + "skinname-vector": "Vector zaharra (2010)", + "vector-skin-desc": "2 Vector itxura ematen ditu: \n* 2011 - MonoBooken bertsio modernoa, itxura hobearekin eta erabilgarritasun hobekuntza askorekin.\n* 2022 - [[mw:Desktop Improvements]] proiektuak garattuako Vectorren bertsioa.", + "prefs-vector-enable-vector-1-label": "Erabili Vector itxura zaharra", + "prefs-vector-enable-vector-1-help": "Hurrengo urteotan, pixkanaka joango gara Vector itxura aldatzen. Vector itxura zaharrak oraindik aukera emango dizu Vectorrek zuen itxura zaharra (2019ko abendukoa) erabiltzeko. Aldaketei buruz gehiago jakiteko, zoaz [[mw:Reading/Web/Desktop_Improvements|proiektuaren orrira]].", + "vector-opt-out": "Aldatu itxura zaharrera", + "vector-opt-out-tooltip": "Aldatu zure ezarpenak, atzera aurreko itxurara joateko (Vector zaharra)", + "vector.css": "/* Hemen idatzitako CSS guztia Vector itxura duten erabiltzaile guztiei agertuko zaie */", + "vector.js": "/* Hemen idatzitako JavaScript guztia Vector itxura duten erabiltzaile guztiei agertuko zaie */", + "vector-action-toggle-sidebar": "Alboko barra ezkutatu edo erakutsi", + "vector-languages": "Hizkuntzak", + "vector-language-button-aria-label": "Joan beste hizkuntza batean idatzitako artikulu batera. {{PLURAL:$1|Hizkuntza batean|$1 hizkuntzatan}} eskuragarri.", + "vector-language-button-label": "{{PLURAL:$1|Hizkuntza bat|$1 hizkuntza}}", + "vector-no-language-button-label": "Hizkuntzak gehitu", + "vector-no-language-button-aria-label": "Artikulua soilik hizkuntza honetan existitzen da. Gehitu artikulua beste hizkuntza batean", + "vector-language-redirect-to-top": "{{SITENAME}} honetan hizkuntzen loturak orriaren goiko aldean daude, artikuluaren izenburuaren eskuinaldean. [[#p-lang-btn|Joan gora]].", + "vector-language-variant-switcher-label": "Aldatu hizkuntza aldaera", + "vector-action-addsection": "Gehitu atala", + "vector-action-delete": "Ezabatu", + "vector-action-move": "Mugitu", + "vector-action-protect": "Babestu", + "vector-action-undelete": "Berreskuratu", + "vector-action-unprotect": "Babesa aldatu", + "vector-view-create": "Sortu", + "vector-view-edit": "Aldatu", + "vector-view-history": "Ikusi historia", + "vector-view-view": "Irakurri", + "vector-view-viewsource": "Kodea ikusia", + "vector-jumptonavigation": "Nabigaziora joan", + "vector-jumptosearch": "Bilaketara joan", + "vector-jumptocontent": "Edukira joan", + "vector-more-actions": "Gehiago", + "vector-search-loader": "Bilaketa gomendioak kargatzen", + "vector-searchsuggest-containing": "$1 duten orrialdeak bilatu", + "vector-intro-page": "Laguntza:Sarrera", + "vector-toc-label": "Edukiak", + "vector-toc-beginning": "⇈ Gora", + "vector-toc-toggle-button-label": "Erakutsi/ezkutatu $1 azpiatal", + "vector-anon-user-menu-pages": "Izena eman gabeko erabiltzaileentzako orrialdeak", + "vector-anon-user-menu-pages-learn": "gehiago ikasi", + "vector-anon-user-menu-pages-label": "Artikuluak aldatzeari buruz gehiago ikasi", + "vector-main-menu-tooltip": "Menu nagusia", + "vector-toc-menu-tooltip": "Eduki-taula", + "vector-toc-collapsible-button-label": "Eduki taularen ikusgarritasuna aldatu", + "vector-site-nav-label": "Gunea", + "vector-main-menu-label": "Menu nagusia", + "vector-limited-width-toggle": "Aldatu edukiaren zabalera mugatua", + "vector-page-tools-label": "Tresnak", + "vector-page-tools-general-label": "Orokorra", + "vector-page-tools-actions-label": "Ekintzak", + "vector-pin-element-label": "mugitu alboko barrara", + "vector-unpin-element-label": "ezkutatu", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Eztabaida]]", + "tooltip-vector-anon-user-menu-title": "Aukera gehiago", + "vector-prefs-limited-width": "Gaitu zabalera mugatuko modua", + "vector-prefs-limited-width-help": "Gaitu zabalera mugatuko modua irakurketa esperientzia hobetzeko.", + "empty-language-selector-body": "Orriaren edukia ez da onartzen beste hizkuntza batzuetan." +} diff --git a/Vector/i18n/ext.json b/Vector/i18n/ext.json new file mode 100644 index 0000000..6fa725c --- /dev/null +++ b/Vector/i18n/ext.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Better", + "Crucifunked", + "Julio Nepote", + "HackerPunki" + ] + }, + "vector-languages": "Luengas", + "vector-no-language-button-label": "Añidil idiomas", + "vector-action-addsection": "Añidil tema", + "vector-action-delete": "Esborral", + "vector-action-move": "Mual", + "vector-action-protect": "Protegel", + "vector-action-undelete": "Esborral", + "vector-action-unprotect": "Esprotegel", + "vector-view-create": "Crial", + "vector-view-edit": "Edital", + "vector-view-history": "Guipal l'estorial", + "vector-view-view": "Leyel", + "vector-view-viewsource": "Guipal cóigu", + "vector-more-actions": "Más", + "vector-page-tools-label": "Achiperris", + "vector-page-tools-general-label": "General" +} diff --git a/Vector/i18n/fa.json b/Vector/i18n/fa.json new file mode 100644 index 0000000..0732701 --- /dev/null +++ b/Vector/i18n/fa.json @@ -0,0 +1,75 @@ +{ + "@metadata": { + "authors": [ + "Ahmad252", + "Alireza Ivaz", + "Amire80", + "Beginneruser", + "Calak", + "DEXi", + "Ebraminio", + "Huji", + "Jeeputer", + "Ladsgroup", + "Mojtabakd", + "Reza1615", + "Zack90" + ] + }, + "skinname-vector": "وکتور قدیمی (۲۰۱۰)", + "skinname-vector-2022": "وکتور (۲۰۲۲)", + "vector-specialversion-name": "وکتور", + "vector-skin-desc": "ارائه‌دهندهٔ ۲ پوستهٔ وکتور:\n* ۲۰۱۱ - نسخهٔ مدرن مونوبوک به‌همراه نمایی تازه و بهینه‌سازی‌های کاربردی.\n* ۲۰۲۲ - پوستهٔ وکتور ساخته‌شده در قالب بخشی از پروژهٔ [[mw:Desktop Improvements|بهبودهای نمای رایانه]] بنیاد ویکی‌مدیا.", + "prefs-vector-enable-vector-1-label": "استفاده از وکتور قدیمی", + "prefs-vector-enable-vector-1-help": "در چند سال آینده، ما کم‌کم پوستهٔ وکتور را به‌روزرسانی خواهیم کرد. وکتور قدیمی به شما اجازه می‌دهد تا از نسخهٔ قدیمی وکتور (نسخهٔ دسامبر ۲۰۱۹) استفاده کنید. برای کسب اطلاعات بیشتر در خصوص به‌روزرسانی‌ها، به [[mw:Reading/Web/Desktop_Improvements|صفحهٔ پروژه]] مراجعه کنید.", + "vector-opt-out": "بازگشت به ظاهر قدیمی", + "vector-opt-out-tooltip": "تنظیمات‌تان را تغییر دهید تا به نمای قبلی پوسته (وکتور قدیمی) برگردید", + "vector.css": "/* دستورات سی‌اس‌اس که در این بخش قرار بگیرد برای کاربرانی که از پوستهٔ وکتور استفاده کنند بارگیری می‌شود */", + "vector.js": "/* دستورات جاوااسکریپت که در این بخش قرار بگیرد برای کاربرانی که از پوستهٔ وکتور استفاده کنند بارگیری می‌شود */", + "vector-action-toggle-sidebar": "جمع و باز کردن نوار کناری", + "vector-languages": "زبان‌ها", + "vector-language-button-aria-label": "به مقاله‌ای به یک زبان دیگر بروید. به {{PLURAL:$1|$1 زبان}} در دسترس است.", + "vector-language-button-label": "{{PLURAL:$1|$1 زبان}}", + "vector-no-language-button-label": "افزودن زبان‌ها", + "vector-no-language-button-aria-label": "این مقاله فقط به این زبان وجود دارد. مقاله را برای زبان‌های دیگر اضافه کنید.", + "vector-language-redirect-to-top": "در این {{SITENAME}} پیوندهای زبانی در بالای صفحه و هم‌تراز با عنوان مقاله قرار دارند. [[#p-lang-btn|رفتن به بالا]].", + "vector-language-variant-switcher-label": "تغییر گونهٔ زبان", + "vector-action-addsection": "افزودن مبحث", + "vector-action-delete": "حذف", + "vector-action-move": "انتقال", + "vector-action-protect": "محافظت", + "vector-action-undelete": "احیا", + "vector-action-unprotect": "تغییر سطح حفاظت", + "vector-view-create": "ایجاد", + "vector-view-edit": "ویرایش", + "vector-view-history": "نمایش تاریخچه", + "vector-view-view": "خواندن", + "vector-view-viewsource": "نمایش مبدأ", + "vector-jumptonavigation": "پرش به ناوبری", + "vector-jumptosearch": "پرش به جستجو", + "vector-jumptocontent": "پرش به محتوا", + "vector-more-actions": "بیشتر", + "vector-search-loader": "بارگیری پیشنهادهای جستجو", + "vector-searchsuggest-containing": "جستجو برای صفحه‌های دارای $1", + "vector-intro-page": "Help:مقدمه", + "vector-toc-label": "فهرست", + "vector-toc-beginning": "بخش آغازین", + "vector-toc-toggle-button-label": "تغییر وضعیت زیربخش‌های $1", + "vector-anon-user-menu-pages": "صفحه‌هایی برای ویرایشگرانی که از سامانه خارج شدند", + "vector-anon-user-menu-pages-learn": "بیشتر بدانید", + "vector-anon-user-menu-pages-label": "دربارهٔ ویرایش‌کردن بیشتر بدانید", + "vector-main-menu-tooltip": "منوی اصلی", + "vector-toc-menu-tooltip": "فهرست محتوا", + "vector-toc-collapsible-button-label": "تغییر وضعیت فهرست محتویات", + "vector-site-nav-label": "وبگاه", + "vector-main-menu-label": "منوی اصلی", + "vector-page-tools-label": "ابزارها", + "vector-page-tools-general-label": "عمومی", + "vector-page-tools-actions-label": "عمل‌ها", + "vector-pin-element-label": "انتقال به نوار کناری", + "vector-unpin-element-label": "نهفتن", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|بحث]]", + "tooltip-vector-anon-user-menu-title": "گزینه‌های بیشتر", + "vector-prefs-limited-width": "فعال‌سازی حالت محدودیت عرض", + "vector-prefs-limited-width-help": "فعال‌سازی حالت محدودیت عرض برای بهبود تجربهٔ مطالعه." +} diff --git a/Vector/i18n/fat.json b/Vector/i18n/fat.json new file mode 100644 index 0000000..61c418c --- /dev/null +++ b/Vector/i18n/fat.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ebenoffen1", + "Leonard Nketsia" + ] + }, + "vector-languages": "Kasahorow", + "vector-language-button-label": "{{PLURAL:$1|$1 kasa|$1 kasahorow}}", + "vector-no-language-button-label": "Fa kasa afofor ka ho", + "vector-action-addsection": "Fa tsirasɛm ka ho", + "vector-action-delete": "Pepa fi hɔ", + "vector-action-move": "Twe kɔ", + "vector-action-protect": "Bambɔ", + "vector-view-create": "Yɛ fofor", + "vector-view-edit": "Sesa mu", + "vector-view-history": "Hwɛ abakɔsɛm", + "vector-view-view": "Kenkan", + "vector-more-actions": "Pii", + "vector-searchsuggest-containing": "Hwehwɛ nkrataafa a $1 wɔ mu", + "vector-page-tools-label": "Edwumadze", + "vector-page-tools-general-label": "Kɛsemu", + "vector-unpin-element-label": "fa suma" +} diff --git a/Vector/i18n/ff.json b/Vector/i18n/ff.json new file mode 100644 index 0000000..3a5aca5 --- /dev/null +++ b/Vector/i18n/ff.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ibrahima", + "Ibrahima Malal Sarr", + "Musaddam Idriss" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|ɗemngal|$1 ɗemngal}}", + "vector-action-addsection": "Ɓeydi toɓɓere", + "vector-action-delete": "Momtu", + "vector-action-move": "Dirtin", + "vector-action-protect": "Hisnu", + "vector-view-create": "Sos", + "vector-view-edit": "Taƴto", + "vector-view-history": "Yiyto aslol", + "vector-view-view": "Tar", + "vector-view-viewsource": "Yiyto ɗaɗol", + "vector-more-actions": "Ɓeydu", + "vector-searchsuggest-containing": "Yiylo kelle coomɗe $1$1" +} diff --git a/Vector/i18n/fi.json b/Vector/i18n/fi.json new file mode 100644 index 0000000..fa369e9 --- /dev/null +++ b/Vector/i18n/fi.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "01miki10", + "Amire80", + "Crt", + "MITO", + "Majavah", + "Markus Mikkonen", + "Moj", + "Nedergard", + "Nike", + "Pxos", + "Pyscowicz", + "Rönttönen", + "Stryn", + "SuperPete", + "Yupik" + ] + }, + "skinname-vector": "Vanha Vektori (2010)", + "skinname-vector-2022": "Vektori (2022)", + "vector-specialversion-name": "Vektori", + "vector-skin-desc": "Tarjoaa 2 Vektori-ulkoasua:\n* 2011 - Monobookin moderni versio, jossa on tuore ulkoasu ja monia käytettävyysparannuksia.\n* 2022 - Vektori, joka rakennettiin osana WMF:n [[mw:Desktop Improvements]] -projektia.", + "prefs-vector-enable-vector-1-label": "Käytä vanhaa Vektoria", + "prefs-vector-enable-vector-1-help": "Seuraavien muutaman vuoden aikana päivitämme Vektori-ulkoasua vaiheittain. Vanha Vektori mahdollistaa Vektorin vanhan (joulukuu 2019) version käyttämisen. Saadaksesi lisätietoa päivityksistä katso [[mw:Reading/Web/Desktop_Improvements|projektisivumme]].", + "vector-opt-out": "Vaihda vanhaan ulkoasuun", + "vector-opt-out-tooltip": "Muuta asetuksiasi palataksesi ulkoasun vanhaan versioon (vanha Vektori)", + "vector.css": "/* Tämä sivu sisältää Vektori-ulkoasua muuttavia tyylejä. */", + "vector.js": "/* Tämän sivun JavaScript-koodi liitetään Vektori-tyyliin */", + "vector-action-toggle-sidebar": "Näytä/piilota sivupalkki", + "vector-languages": "Kielet", + "vector-language-button-aria-label": "Mene artikkeliin toisella kielellä. Saatavilla {{PLURAL:$1|$1 kielellä}}", + "vector-language-button-label": "{{PLURAL:$1|$1 kieli|$1 kieltä}}", + "vector-no-language-button-label": "Lisää kieliä", + "vector-no-language-button-aria-label": "Tämä artikkeli on olemassa vain tällä kielellä. Lisää artikkeli muille kielille", + "vector-language-redirect-to-top": "Tällä sivustolla ({{SITENAME}}) kielilinkit ovat artikkelin yläosassa otsikon vieressä. [[#p-lang-btn|Sivun yläosaan]].", + "vector-action-addsection": "Lisää aihe", + "vector-action-delete": "Poista", + "vector-action-move": "Siirrä", + "vector-action-protect": "Suojaa", + "vector-action-undelete": "Palauta", + "vector-action-unprotect": "Muuta suojausta", + "vector-view-create": "Luo", + "vector-view-edit": "Muokkaa", + "vector-view-history": "Näytä historia", + "vector-view-view": "Lue", + "vector-view-viewsource": "Näytä lähdekoodi", + "vector-jumptonavigation": "Siirry navigaatioon", + "vector-jumptosearch": "Siirry hakuun", + "vector-jumptocontent": "Siirry sisältöön", + "vector-more-actions": "Muut", + "vector-search-loader": "Ladataan hakuehdotuksia", + "vector-searchsuggest-containing": "Hae sivuja, jotka sisältävät $1", + "vector-toc-label": "Sisällysluettelo", + "vector-toc-beginning": "Johdanto", + "vector-anon-user-menu-pages": "Sivut kirjautumattomille muokkaajille", + "vector-anon-user-menu-pages-learn": "lue lisää", + "vector-anon-user-menu-pages-label": "Lue lisää muokkaamisesta", + "vector-main-menu-tooltip": "Päävalikko", + "vector-toc-menu-tooltip": "Sisällysluettelo", + "vector-site-nav-label": "Sivusto", + "vector-main-menu-label": "Päävalikko", + "vector-page-tools-label": "Työkalut", + "vector-page-tools-general-label": "Yleinen", + "vector-page-tools-actions-label": "Toiminnot", + "vector-pin-element-label": "siirrä sivupalkkiin", + "vector-unpin-element-label": "piilota", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Keskustelu]]", + "tooltip-vector-anon-user-menu-title": "Lisää valintoja", + "vector-prefs-limited-width": "Ota rajoitettu leveystila käyttöön", + "vector-prefs-limited-width-help": "Ota käyttöön rajoitettu leveystila parantaaksesi lukukokemusta." +} diff --git a/Vector/i18n/fit.json b/Vector/i18n/fit.json new file mode 100644 index 0000000..64aadef --- /dev/null +++ b/Vector/i18n/fit.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Mestos", + "Palmtree222", + "Pyscowicz" + ] + }, + "vector-action-addsection": "Lissää aihe", + "vector-action-delete": "Ota poies", + "vector-action-move": "Siirä", + "vector-action-protect": "Suojaa", + "vector-action-undelete": "Pane takashiin", + "vector-action-unprotect": "Muuta suojaa", + "vector-view-create": "Luo", + "vector-view-edit": "Mookkaa", + "vector-view-history": "Näytä histuuria", + "vector-view-view": "Lue", + "vector-view-viewsource": "Näytä lähekooti", + "vector-more-actions": "Lissää" +} diff --git a/Vector/i18n/fo.json b/Vector/i18n/fo.json new file mode 100644 index 0000000..a17db16 --- /dev/null +++ b/Vector/i18n/fo.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Diupwijk", + "EileenSanda" + ] + }, + "vector-skin-desc": "Moderna versión af MonoBook við frískari útsjónd og nógvum nýtslubetringum", + "vector-action-addsection": "Nýtt evni", + "vector-action-delete": "Strika", + "vector-action-move": "Flyt", + "vector-action-protect": "Friða", + "vector-action-undelete": "Endurstovna", + "vector-action-unprotect": "Broyt verju", + "vector-view-create": "Stovna", + "vector-view-edit": "Rætta", + "vector-view-history": "Vís søgu", + "vector-view-view": "Les", + "vector-view-viewsource": "Vís keldu", + "vector-more-actions": "Meira" +} diff --git a/Vector/i18n/fon.json b/Vector/i18n/fon.json new file mode 100644 index 0000000..596ab2f --- /dev/null +++ b/Vector/i18n/fon.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Mahuton" + ] + }, + "vector-languages": "Gbé lɛ́", + "vector-language-button-label": "{{PLURAL:$1|$1 gbé|$1 gbé lɛ}}", + "vector-no-language-button-label": "Gɔ gbé ɖévo lɛ na", + "vector-action-addsection": "Gɔ́ xóta yɔ́yɔ́ ɖévo ná", + "vector-action-delete": "Sunsun sin", + "vector-action-move": "Ɖyɔ nyikɔ tɔn", + "vector-action-protect": "Cyɔn alɔ do", + "vector-view-create": "Blɔ", + "vector-view-edit": "Wlǎn nú", + "vector-view-history": "Nyín nukún ɖo ɖiɖyɔ tɛnmɛ tɛnmɛ wémá ɔ tɔn lɛ jí", + "vector-view-view": "Xá", + "vector-more-actions": "Susu", + "vector-searchsuggest-containing": "Ba wéma é mɛ $1 ɖé é", + "vector-page-tools-label": "Azɔwanú", + "vector-unpin-element-label": "sɛxwe" +} diff --git a/Vector/i18n/fr.json b/Vector/i18n/fr.json new file mode 100644 index 0000000..b23d085 --- /dev/null +++ b/Vector/i18n/fr.json @@ -0,0 +1,84 @@ +{ + "@metadata": { + "authors": [ + "Ajeje Brazorf", + "Akeron", + "Amire80", + "Cigaryno", + "Crochet.david", + "DavidL", + "DePlusJean", + "DreZhsh", + "Eneelk", + "Gomoko", + "Jean-Frédéric", + "Niridya", + "Noé", + "Od1n", + "Orlodrim", + "Pamputt", + "Thibaut120094", + "Urhixidur", + "Verdy p", + "Wladek92" + ] + }, + "skinname-vector": "Vector (ancienne version 2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "Fournit 2 versions de l’habillage Vector :\n* 2011 – la version « Moderne » de MonoBook avec un aspect rajeuni et beaucoup d’améliorations ergonomiques ;\n* 2022 – la version « Vector » actuelle, construite comme partie du projet [[mw:Desktop Improvements|Améliorations du bureau]] de la Fondation Wikimedia.", + "prefs-vector-enable-vector-1-label": "Utiliser l’ancienne version de Vector", + "prefs-vector-enable-vector-1-help": "Dans les années à venir, nous mettrons progressivement à jour l’habillage Vector. La version historique de Vector vous permet de voir l’ancien habillage de Vector (tel qu’il était en décembre 2019). Pour en savoir plus, rendez-vous sur la [[mw:Reading/Web/Desktop_Improvements|page du projet]].", + "vector-opt-out": "Basculer vers l’ancien habillage", + "vector-opt-out-tooltip": "Modifier vos paramètres pour revenir à l’ancien aspect de l’habillage (Vector historique)", + "vector.css": "/* Tout CSS placé ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Vector */", + "vector.js": "/* Tout code JavaScript placé ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Vector */", + "vector-action-toggle-sidebar": "Afficher / masquer la barre latérale", + "vector-languages": "Langues", + "vector-language-button-aria-label": "Aller à un article dans une autre langue. Disponible en $1 langue{{PLURAL:$1||s}}.", + "vector-language-button-label": "{{PLURAL:$1|$1 langue|$1 langues}}", + "vector-no-language-button-label": "Ajouter des langues", + "vector-no-language-button-aria-label": "Cet article n’existe que dans cette langue. Ajouter l’article pour d’autres langues.", + "vector-language-redirect-to-top": "Sur {{SITENAME}}, les liens interlangues sont placés en haut à droite du titre de la page. [[#p-lang-btn|Aller en haut]].", + "vector-language-variant-switcher-label": "Modifier la variante de langue", + "vector-action-addsection": "Ajouter un sujet", + "vector-action-delete": "Supprimer", + "vector-action-move": "Renommer", + "vector-action-protect": "Protéger", + "vector-action-undelete": "Restaurer", + "vector-action-unprotect": "Changer la protection", + "vector-view-create": "Créer", + "vector-view-edit": "Modifier", + "vector-view-history": "Voir l’historique", + "vector-view-view": "Lire", + "vector-view-viewsource": "Voir la source", + "vector-jumptonavigation": "Aller à la navigation", + "vector-jumptosearch": "Aller à la recherche", + "vector-jumptocontent": "Aller au contenu", + "vector-more-actions": "Plus", + "vector-search-loader": "Chargement des suggestions de recherche", + "vector-searchsuggest-containing": "Rechercher les pages contenant $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Sommaire", + "vector-toc-beginning": "Début", + "vector-toc-toggle-button-label": "Afficher / masquer la sous-section $1", + "vector-anon-user-menu-pages": "Pages pour les contributeurs déconnectés", + "vector-anon-user-menu-pages-learn": "en savoir plus", + "vector-anon-user-menu-pages-label": "En savoir plus sur la contribution", + "vector-main-menu-tooltip": "Menu principal", + "vector-toc-menu-tooltip": "Table des matières", + "vector-toc-collapsible-button-label": "Basculer la table des matières", + "vector-site-nav-label": "Site", + "vector-main-menu-label": "Menu principal", + "vector-limited-width-toggle": "Activer ou désactiver la limitation de largeur du contenu", + "vector-page-tools-label": "Outils", + "vector-page-tools-general-label": "Général", + "vector-page-tools-actions-label": "Actions", + "vector-pin-element-label": "déplacer vers la barre latérale", + "vector-unpin-element-label": "masquer", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussion]]", + "tooltip-vector-anon-user-menu-title": "Plus d’options", + "vector-prefs-limited-width": "Activer le mode de largeur limitée", + "vector-prefs-limited-width-help": "Activer le mode de largeur limitée pour améliorer l’expérience de lecture.", + "empty-language-selector-body": "Le contenu de la page n’est pas pris en charge dans d’autres langues." +} diff --git a/Vector/i18n/frc.json b/Vector/i18n/frc.json new file mode 100644 index 0000000..3dfaf24 --- /dev/null +++ b/Vector/i18n/frc.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Beunice", + "Ebe123", + "Hangmanwa7id" + ] + }, + "vector-action-delete": "Supprimer", + "vector-action-move": "Renommer", + "vector-action-protect": "Protéger", + "vector-view-create": "Créer", + "vector-view-edit": "Changer", + "vector-view-history": "Voir l’historique", + "vector-view-view": "Lire", + "vector-view-viewsource": "Regarder la source", + "vector-more-actions": "Plus" +} diff --git a/Vector/i18n/frp.json b/Vector/i18n/frp.json new file mode 100644 index 0000000..9df27e9 --- /dev/null +++ b/Vector/i18n/frp.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "ChrisPtDe" + ] + }, + "skinname-vector": "Vèctor", + "vector.css": "/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Vèctor ». */", + "vector.js": "/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Vèctor ». */", + "vector-language-button-label": "$1 lengou{{PLURAL:$1|a|es}}", + "vector-action-addsection": "Apondre na chousa", + "vector-action-delete": "Suprimar", + "vector-action-move": "Renomar", + "vector-action-protect": "Protègiér", + "vector-action-undelete": "Refâre", + "vector-action-unprotect": "Changiér la protèccion", + "vector-view-create": "Fâre", + "vector-view-edit": "Changiér", + "vector-view-history": "Vêre l’historico", + "vector-view-view": "Liére", + "vector-view-viewsource": "Vêre lo tèxto sôrsa", + "vector-more-actions": "Més", + "vector-searchsuggest-containing": "Rechèrchiér les pâges que contegnont $1" +} diff --git a/Vector/i18n/frr.json b/Vector/i18n/frr.json new file mode 100644 index 0000000..df6210b --- /dev/null +++ b/Vector/i18n/frr.json @@ -0,0 +1,37 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Murma174", + "Pyt" + ] + }, + "vector-skin-desc": "Modern wersion faan Monobook mä frisk skak an föl muar mögelkhaiden", + "vector-languages": "Spriaken", + "vector-language-button-label": "{{PLURAL:$1|$1 spriak|$1 spriaken}}", + "vector-no-language-button-label": "Muar spriaken", + "vector-action-addsection": "Nei kirew began", + "vector-action-delete": "Strik", + "vector-action-move": "Fersküüw", + "vector-action-protect": "Seekre", + "vector-action-undelete": "Weder iinstel", + "vector-action-unprotect": "Sidjenseekerhaid", + "vector-view-create": "Maage", + "vector-view-edit": "Bewerke", + "vector-view-history": "Ferluup uunluke", + "vector-view-view": "Lees", + "vector-view-viewsource": "Kweltekst uunluke", + "vector-more-actions": "Muar", + "vector-searchsuggest-containing": "Sjük sidjen, huar $1 banen as", + "vector-toc-label": "Auersicht", + "vector-toc-beginning": "Began", + "vector-main-menu-tooltip": "Hoodütjwool", + "vector-toc-menu-tooltip": "Auersicht", + "vector-main-menu-label": "Hoodütjwool", + "vector-page-tools-label": "Werktjüügen", + "vector-page-tools-general-label": "Algemian", + "vector-page-tools-actions-label": "Aksioonen", + "vector-pin-element-label": "Tu't sidjenliist fersküüw", + "vector-unpin-element-label": "Fersteeg", + "tooltip-vector-anon-user-menu-title": "Muar ütjwool" +} diff --git a/Vector/i18n/fur.json b/Vector/i18n/fur.json new file mode 100644 index 0000000..18e9271 --- /dev/null +++ b/Vector/i18n/fur.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Klenje", + "Tocaibon" + ] + }, + "vector-languages": "Lenghis", + "vector-language-button-label": "{{PLURAL:$1|$1 lenghe|$1 lenghis}}", + "vector-no-language-button-label": "Zonte lenghis", + "vector-action-addsection": "Gnove sezion", + "vector-action-delete": "Elimine", + "vector-action-move": "Môf", + "vector-action-protect": "Protêç", + "vector-action-undelete": "Recupere", + "vector-action-unprotect": "Gambie la protezion", + "vector-view-create": "Cree", + "vector-view-edit": "Cambie", + "vector-view-history": "Cjale il storic", + "vector-view-view": "Lei", + "vector-view-viewsource": "Cjale risultive", + "vector-more-actions": "Di plui", + "vector-searchsuggest-containing": "Cîr pagjinis cun dentri $1", + "vector-page-tools-label": "Imprescj", + "vector-page-tools-general-label": "Gjenerâl", + "vector-unpin-element-label": "plate" +} diff --git a/Vector/i18n/fy.json b/Vector/i18n/fy.json new file mode 100644 index 0000000..89c6425 --- /dev/null +++ b/Vector/i18n/fy.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Kening Aldgilles", + "PiefPafPier", + "Robin van der Vliet", + "Robin0van0der0vliet", + "SK-luuut", + "Sjoerddebruin" + ] + }, + "skinname-vector": "Fektor âld & bewend (2010)", + "skinname-vector-2022": "Fektor (2022)", + "vector-specialversion-name": "Fektor", + "vector-skin-desc": "Biedt 2 Fektor-foarmjouwings:\n* 2011 - De moderne ferzje fan MonoBoek mei in fris oansjoch en protte noflike ferbetterings.\n* 2022 - De Fektor ûntwikkele as part fan it [[mw:Desktop Improvements|Buroblêdferbetterings]]-projekt fan 'e WMF.", + "prefs-vector-enable-vector-1-label": "De âlde bewende Fektor brûke", + "prefs-vector-enable-vector-1-help": "Yn 'e kommende pear jier sille wy de Fektor-foarmjouwing stadichoan bywurkje. Mei 'de âlde bewende Fektor' kinne jo it oansjoch fan de âlde ferzje fan Fektor (fan desimber 2019) behâlde. Gean nei ús [[mw:Reading/Web/Desktop_Improvements|projektside]] at jo mear witte wolle oer de oanpassings.", + "vector-opt-out": "Alde oansjoch weromsette", + "vector-opt-out-tooltip": "Jo ynstellings wizigje om werom te gean nei it âlde oansjoch fan 'e foarmjouwing (bewende Fektor)", + "vector.css": "/* Al it CSS hjirre sil foar brûkers fan de Fektor-foarmjouwing laden wurde */", + "vector.js": "/* Al it JavaScript hjirre sil foar brûkers fan de Fektor-foarmjouwing laden wurde */", + "vector-action-toggle-sidebar": "Sydbalke omklappe", + "vector-languages": "Talen", + "vector-language-button-aria-label": "Nei it artikel yn in oare taal gean. Beskikber yn {{PLURAL:$1|$1 taal|$1 talen}}", + "vector-language-button-label": "{{PLURAL:$1|$1 taal|$1 talen}}", + "vector-no-language-button-label": "Talen tafoegje", + "vector-no-language-button-aria-label": "Dit artikel is der allinnich yn dizze taal. It artikel foar oare talen tafoegje", + "vector-language-redirect-to-top": "Hjir op {{GRAMMAR:l|{{SITENAME}}}} steane de taalkeppelings boppe-oan 'e side tsjinoer de titel fan 't artikel. [[#p-lang-btn|Nei boppen]].", + "vector-language-variant-switcher-label": "Taalfariant feroarje", + "vector-action-addsection": "Nij mêd", + "vector-action-delete": "Wiskje", + "vector-action-move": "Omneame", + "vector-action-protect": "Skoattelje", + "vector-action-undelete": "Wiskjen weromdraaie", + "vector-action-unprotect": "Befeiliging wizigje", + "vector-view-create": "Oanmeitsje", + "vector-view-edit": "Bewurkje", + "vector-view-history": "Skiednis besjen", + "vector-view-view": "Lêze", + "vector-view-viewsource": "Boarne besjen", + "vector-jumptonavigation": "Springe nei navigaasje", + "vector-jumptosearch": "Springe nei sykjen", + "vector-jumptocontent": "Springe nei ynhâld", + "vector-more-actions": "Mear", + "vector-search-loader": "Laden fan syksuggestjes", + "vector-searchsuggest-containing": "Siden sykje mei as ynhâld $1", + "vector-intro-page": "Help:Yntroduksje", + "vector-toc-label": "Ynhâld", + "vector-toc-beginning": "Begjin", + "vector-toc-toggle-button-label": "Subseksje $1 omklappe", + "vector-anon-user-menu-pages": "Siden foar ôfmelde meidoggers", + "vector-anon-user-menu-pages-learn": "mear witte", + "vector-anon-user-menu-pages-label": "Mear witte oer bewurkjen", + "vector-main-menu-tooltip": "Haadmenu", + "vector-toc-menu-tooltip": "Ynhâldsopjefte", + "vector-toc-collapsible-button-label": "Ynhâldsopjefte omklappe", + "vector-site-nav-label": "Webstee", + "vector-page-tools-label": "Helpmiddels", + "vector-page-tools-general-label": "Algemien", + "vector-pin-element-label": "nei sydbalke ferplakke", + "vector-unpin-element-label": "ferbergje", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskusje]]", + "tooltip-vector-anon-user-menu-title": "Mear opsjes", + "vector-prefs-limited-width": "Modus foar breedtebeheining ynskeakelje", + "vector-prefs-limited-width-help": "Ferbetteret de lêsberens by in beheinde breedte." +} diff --git a/Vector/i18n/ga.json b/Vector/i18n/ga.json new file mode 100644 index 0000000..3bfaa07 --- /dev/null +++ b/Vector/i18n/ga.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Kscanne", + "Kwekubo", + "Moydow", + "Tem" + ] + }, + "skinname-vector": "Veicteoir", + "vector-action-addsection": "Cuir topaic leis", + "vector-action-delete": "Scrios", + "vector-action-move": "Athainmnigh", + "vector-action-protect": "Glasáil", + "vector-action-undelete": "Díscrios", + "vector-action-unprotect": "Díghlasáil", + "vector-view-create": "Cruthaigh", + "vector-view-edit": "Cuir in eagar", + "vector-view-history": "Féach ar stair", + "vector-view-view": "Léigh", + "vector-view-viewsource": "Féach ar fhoinse", + "vector-more-actions": "Tuilleadh", + "vector-searchsuggest-containing": "Cuardaigh leathanaigh ina bhfuil $1" +} diff --git a/Vector/i18n/gaa.json b/Vector/i18n/gaa.json new file mode 100644 index 0000000..5b7c801 --- /dev/null +++ b/Vector/i18n/gaa.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Flixtey", + "Gkbediako", + "Mybluberet", + "Owula kpakpo" + ] + }, + "vector-languages": "Wiemɔi", + "vector-language-button-label": "{{PLURAL:$1|$1 wiemɔ|$1 wiemɔi}}", + "vector-action-addsection": "Kɛ mlijaa yitso afata he", + "vector-action-delete": "Jiemɔ", + "vector-action-move": "Tsi", + "vector-action-protect": "Yibaamɔ", + "vector-view-create": "Bɔɔ", + "vector-view-edit": "Tsakemɔ", + "vector-view-history": "Kwɛmɔ nibii ni eho", + "vector-view-view": "Kanemɔ", + "vector-more-actions": "Pii", + "vector-page-tools-label": "Nitsumɔ he dadei", + "vector-unpin-element-label": "kɛto" +} diff --git a/Vector/i18n/gag.json b/Vector/i18n/gag.json new file mode 100644 index 0000000..4f45473 --- /dev/null +++ b/Vector/i18n/gag.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Cuman", + "Emperyan" + ] + }, + "vector-view-edit": "Diiştir", + "vector-view-view": "Oku" +} diff --git a/Vector/i18n/gan-hans.json b/Vector/i18n/gan-hans.json new file mode 100644 index 0000000..5c0db67 --- /dev/null +++ b/Vector/i18n/gan-hans.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Liangent", + "Xiaomingyan" + ] + }, + "vector-action-addsection": "添主题", + "vector-action-delete": "删吥", + "vector-action-move": "移吥", + "vector-action-protect": "护到", + "vector-action-undelete": "望下删吥𠮶页面", + "vector-action-unprotect": "更改保护", + "vector-view-create": "创建", + "vector-view-edit": "编辑", + "vector-view-history": "望下历史", + "vector-view-view": "读", + "vector-view-viewsource": "望下原始码" +} diff --git a/Vector/i18n/gan-hant.json b/Vector/i18n/gan-hant.json new file mode 100644 index 0000000..ceb23b5 --- /dev/null +++ b/Vector/i18n/gan-hant.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Symane" + ] + }, + "vector-action-addsection": "添主題", + "vector-action-delete": "刪吥", + "vector-action-move": "移吥", + "vector-action-protect": "護到", + "vector-action-undelete": "望下刪吥嗰頁面", + "vector-action-unprotect": "解除保護", + "vector-view-create": "創建", + "vector-view-edit": "編輯", + "vector-view-history": "望下歷史", + "vector-view-view": "讀", + "vector-view-viewsource": "望下原始碼" +} diff --git a/Vector/i18n/gbm.json b/Vector/i18n/gbm.json new file mode 100644 index 0000000..8c2ae45 --- /dev/null +++ b/Vector/i18n/gbm.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "बडा काजी", + "Yakku3" + ] + }, + "vector-languages": "भासा", + "vector-no-language-button-label": "भासा जोड़ा", + "vector-view-create": "बणावा", + "vector-view-history": "इत्यास हेरा", + "vector-more-actions": "खार्युं", + "vector-page-tools-general-label": "साधारण", + "vector-unpin-element-label": "लुकावा" +} diff --git a/Vector/i18n/gcf.json b/Vector/i18n/gcf.json new file mode 100644 index 0000000..ee9a1db --- /dev/null +++ b/Vector/i18n/gcf.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Laetitia Kb" + ] + }, + "vector-view-edit": "Modifyé", + "vector-view-history": "Historik-la", + "vector-view-view": "Li", + "vector-more-actions": "Plis" +} diff --git a/Vector/i18n/gcr.json b/Vector/i18n/gcr.json new file mode 100644 index 0000000..2f564ec --- /dev/null +++ b/Vector/i18n/gcr.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "LeGuyanaisPure", + "Léon973" + ] + }, + "vector-action-addsection": "Ajouté roun sijè", + "vector-action-delete": "Siprimen", + "vector-action-move": "Rounonmen", + "vector-action-protect": "Protéjé", + "vector-view-create": "Kréyé", + "vector-view-edit": "Modifyé", + "vector-view-history": "Afiché listorik", + "vector-view-view": "Li", + "vector-more-actions": "Plis" +} diff --git a/Vector/i18n/gd.json b/Vector/i18n/gd.json new file mode 100644 index 0000000..04fa42b --- /dev/null +++ b/Vector/i18n/gd.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Akerbeltz", + "GunChleoc" + ] + }, + "vector-skin-desc": "Tionndadh ùr-nodha de MonoBook le dreach ùr air 's iomadh leasachadh air a sho-chleachdachd", + "vector-action-addsection": "Cuir ris cuspair", + "vector-action-delete": "Sguab às", + "vector-action-move": "Gluais", + "vector-action-protect": "Dìon", + "vector-action-undelete": "Neo-dhèan an sguabadh às", + "vector-action-unprotect": "Atharraich an dìon", + "vector-view-create": "Cruthaich", + "vector-view-edit": "Deasaich", + "vector-view-history": "Seall an eachdraidh", + "vector-view-view": "Leugh", + "vector-view-viewsource": "Seall an tùs", + "vector-more-actions": "Barrachd" +} diff --git a/Vector/i18n/gl.json b/Vector/i18n/gl.json new file mode 100644 index 0000000..367dff1 --- /dev/null +++ b/Vector/i18n/gl.json @@ -0,0 +1,66 @@ +{ + "@metadata": { + "authors": [ + "Banjo", + "Elisardojm", + "Toliño", + "Vivaelcelta" + ] + }, + "skinname-vector": "Vector antigo (2010)", + "vector-skin-desc": "Proporciona 2 aparencias Vector:\n* 2011 - A versión Modern da aparencia MonoBook, cun aspecto actualizado e moitas melloras na usabilidade.\n* 2022 - A versión Vector creada como parte do proxecto de [[mw:Desktop Improvements|melloras do aspecto de escritorio]] da WMF.", + "prefs-vector-enable-vector-1-label": "Usar a versión antiga de Vector", + "prefs-vector-enable-vector-1-help": "Durante os próximos anos actualizaremos gradualmente o aspecto Vector. O aspecto Vector antigo permite ver a versión antiga (ata decembro de 2019). Para obter máis información sobre as actualizacións, visita a nosa [[mw:Reading/Web/Desktop_Improvements|páxina do proxecto]].", + "vector-opt-out": "Cambiar ao aspecto antigo", + "vector-opt-out-tooltip": "Cambia as súas preferencias para volver ao aspecto anterior da aparencia (o antigo Vector)", + "vector.css": "/* Todo o CSS que se coloque aquí afectará a quen use a aparencia Vector */", + "vector.js": "/* Todo o JavaScript que se coloque aquí afectará que usen a aparencia Vector */", + "vector-action-toggle-sidebar": "Activar ou desactivar a barra lateral", + "vector-languages": "Linguas", + "vector-language-button-aria-label": "Ir a un artigo noutra lingua. Dispoñible {{PLURAL:$1|nunha lingua|en $1 linguas}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lingua|$1 linguas}}", + "vector-no-language-button-label": "Engadir linguas", + "vector-no-language-button-aria-label": "Este artigo só existe nesta lingua. Engade o artigo para outra linguas.", + "vector-language-redirect-to-top": "En {{SITENAME}}, as ligazóns interlingüísticas están na parte superior da páxina, fronte ao título do artigo. [[#p-lang-btn|Ir ao inicio]].", + "vector-language-variant-switcher-label": "Cambiar a variante de lingua", + "vector-action-addsection": "Nova sección", + "vector-action-delete": "Borrar", + "vector-action-move": "Mover", + "vector-action-protect": "Protexer", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Cambiar a protección", + "vector-view-create": "Crear", + "vector-view-edit": "Editar", + "vector-view-history": "Ver o historial", + "vector-view-view": "Ler", + "vector-view-viewsource": "Ver o código fonte", + "vector-jumptonavigation": "Saltar á navegación", + "vector-jumptosearch": "Saltar á procura", + "vector-jumptocontent": "Saltar ao contido", + "vector-more-actions": "Máis", + "vector-search-loader": "Cargando as suxestións de busca", + "vector-searchsuggest-containing": "Procurar as páxinas que conteñan \"$1\"", + "vector-intro-page": "Help:Introdución", + "vector-toc-label": "Contidos", + "vector-toc-beginning": "Inicio", + "vector-toc-toggle-button-label": "Mostrar ou agochar a subsección \"$1\"", + "vector-anon-user-menu-pages": "Páxinas para os editores sen a sesión iniciada", + "vector-anon-user-menu-pages-learn": "máis información", + "vector-anon-user-menu-pages-label": "Máis información sobre a edición", + "vector-main-menu-tooltip": "Menú principal", + "vector-toc-menu-tooltip": "Táboa de contidos", + "vector-toc-collapsible-button-label": "Mostrar ou agochar a táboa de contidos", + "vector-site-nav-label": "Sitio", + "vector-main-menu-label": "Menú principal", + "vector-limited-width-toggle": "Alterna o ancho de contido limitado", + "vector-page-tools-label": "Ferramentas", + "vector-page-tools-general-label": "Xeral", + "vector-page-tools-actions-label": "Accións", + "vector-pin-element-label": "mover á barra lateral", + "vector-unpin-element-label": "agochar", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Conversa]]", + "tooltip-vector-anon-user-menu-title": "Máis opcións", + "vector-prefs-limited-width": "Activar o modo de ancho limitado", + "vector-prefs-limited-width-help": "Activar o modo de ancho limitado para mellorar a experiencia de lectura.", + "empty-language-selector-body": "Os contidos da páxina non están dispoñibles noutras linguas." +} diff --git a/Vector/i18n/gld.json b/Vector/i18n/gld.json new file mode 100644 index 0000000..28ca86d --- /dev/null +++ b/Vector/i18n/gld.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "RFScott" + ] + }, + "vector-languages": "Хэсэсэл", + "vector-language-button-label": "{{PLURAL:$1|$1 хэсэ}}", + "vector-no-language-button-label": "Гучи хэсэ", + "vector-action-addsection": "Темава аӈгойни", + "vector-action-delete": "Нангалаори", + "vector-action-move": "Энэвэмбури", + "vector-action-protect": "Кандёри", + "vector-view-create": "Аӈговори", + "vector-view-edit": "Калаори", + "vector-view-history": "Дюлэ дурун", + "vector-view-view": "Холаори", + "vector-more-actions": "Гучи", + "vector-page-tools-label": "Дебой дяка", + "vector-unpin-element-label": "дасиори" +} diff --git a/Vector/i18n/glk.json b/Vector/i18n/glk.json new file mode 100644 index 0000000..5d85edb --- /dev/null +++ b/Vector/i18n/glk.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "V6rg", + "شیخ" + ] + }, + "vector-action-addsection": "تازه مؤضۊع", + "vector-action-move": "جابجا گۊدن", + "vector-view-create": "چاگۊدن", + "vector-view-edit": "دچينواچين", + "vector-view-history": "تاریخچهٰ دئن", + "vector-view-view": "خؤندن", + "vector-more-actions": "ويشتر" +} diff --git a/Vector/i18n/gn.json b/Vector/i18n/gn.json new file mode 100644 index 0000000..640521f --- /dev/null +++ b/Vector/i18n/gn.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Hugo.arg", + "P. S. F. Freitas" + ] + }, + "vector-opt-out": "Ehecha kuri guaréicha", + "vector-opt-out-tooltip": "Emoambue ne poravorã rehecha jey hag̃ua kuatia kuri guaréicha (Vector rembiejakue)", + "vector-languages": "Ñe'ẽnguéra", + "vector-language-button-label": "{{PLURAL:$1|$1 ñe'ẽ|ñe'ẽ}}", + "vector-no-language-button-label": "Emoĩve ñe'ẽnguéra", + "vector-view-create": "Emboypy", + "vector-view-edit": "Jehaijey", + "vector-view-history": "Tembiasakue", + "vector-view-view": "Moñe'ẽ", + "vector-more-actions": "Ve", + "vector-searchsuggest-containing": "Eheka umi kuatia oguerekóva $1", + "vector-toc-beginning": "Ñepyrũ", + "vector-page-tools-label": "Tembiporu", + "vector-page-tools-general-label": "Opavave", + "vector-unpin-element-label": "toñemi" +} diff --git a/Vector/i18n/gom-deva.json b/Vector/i18n/gom-deva.json new file mode 100644 index 0000000..e0ce8fd --- /dev/null +++ b/Vector/i18n/gom-deva.json @@ -0,0 +1,48 @@ +{ + "@metadata": { + "authors": [ + "Darshan kandolkar", + "Pooja tople", + "Sanket.prabhu26", + "Supriya kankumbikar", + "The Discoverer" + ] + }, + "vector-opt-out": "आदल्या स्वरूपांत परत वच", + "vector-action-toggle-sidebar": "देग-पट्टी दाखय / लिपय", + "vector-languages": "भासो", + "vector-language-button-aria-label": "दूसऱ्या भासेन एके लेखाचेर वच. {{PLURAL:$1|$1 भासेन|$1 भासानीं}} उपलब्ध आसा.", + "vector-language-button-label": "{{PLURAL:$1|$1 भास|$1 भासो}}", + "vector-no-language-button-label": "भासो जोड", + "vector-no-language-button-aria-label": "हो लेख फकत ह्या भासेंत असतित्वांत आसा. हेर भासानी लेख जोड.", + "vector-language-redirect-to-top": "ह्या {{SITENAME}} -चेर भासेच्यो दुवे लेखाच्या माथाळ्या सामकार पानाच्या वयल्या भागांत आसात. [[#p-lang-btn|वयर वच]].", + "vector-action-addsection": "माथाळो ज़ोड", + "vector-action-delete": "काडून उडयात", + "vector-action-move": "दुसरेकडे व्हरात", + "vector-action-protect": "राख", + "vector-action-unprotect": "सुरक्षेचें स्थर बदल", + "vector-view-create": "रोच", + "vector-view-edit": "बदल", + "vector-view-history": "इतिहास पळेयात", + "vector-view-view": "वाचचें", + "vector-view-viewsource": "उगम पळेयात", + "vector-jumptonavigation": "दिशा बदलुंक उडकी मार", + "vector-jumptosearch": "सदा खातीर उडकी मार", + "vector-jumptocontent": "मजकूराशीं उडकी मार", + "vector-more-actions": "आनीक", + "vector-toc-label": "विशय सुची", + "vector-toc-beginning": "सुरवात", + "vector-toc-toggle-button-label": "$1 उपविभाग दाखय / लिपय", + "vector-anon-user-menu-pages-learn": "अदीक शिकून घे", + "vector-anon-user-menu-pages-label": "संपादना विशीं अदीक शिकून घे", + "vector-main-menu-tooltip": "मुखेल वळेरी", + "vector-toc-menu-tooltip": "विशय सुची", + "vector-toc-collapsible-button-label": "विशय सुची दाखय / लिपय", + "vector-main-menu-label": "मुखेल वळेरी", + "vector-limited-width-toggle": "पानाची रुंदाय पूर्ण वो थारावीक", + "vector-page-tools-label": "साधनां", + "vector-pin-element-label": "देग-पट्टियेचेर वर", + "vector-unpin-element-label": "लिपय", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|भासाभास]]", + "empty-language-selector-body": "पानाचो मजकूर हेर भासानी समर्थीत ना." +} diff --git a/Vector/i18n/gom-latn.json b/Vector/i18n/gom-latn.json new file mode 100644 index 0000000..3627951 --- /dev/null +++ b/Vector/i18n/gom-latn.json @@ -0,0 +1,47 @@ +{ + "@metadata": { + "authors": [ + "Isidore Dantas", + "The Discoverer" + ] + }, + "vector-opt-out": "Adlea sworupant porot voch", + "vector-action-toggle-sidebar": "Deg-pott'tti dakhoi / lipoi", + "vector-languages": "Bhaso", + "vector-language-button-aria-label": "Dusrea bhasen eke lekhacher voch. {{PLURAL:$1|$1 bhasen|$1 bhasanim}} uplobdh asa.", + "vector-language-button-label": "{{PLURAL:$1|$1 bhas|$1 bhaso}}", + "vector-no-language-button-label": "Bhaso zodd", + "vector-no-language-button-aria-label": "Ho lekh fokot hea bhasent ostitvant asa. Her bhasani lekh zodd.", + "vector-language-redirect-to-top": "Hea {{SITENAME}} -cher bhasecheo duve lekhachea mathallea samkar panachea voilea bhagant asat. [[#p-lang-btn|Voir voch]].", + "vector-action-addsection": "Vixoi zodd", + "vector-action-delete": "Kadd", + "vector-action-move": "Zago bodol", + "vector-action-protect": "Rakh", + "vector-action-undelete": "Portun hadd", + "vector-action-unprotect": "Surokxechem sthor bodol", + "vector-view-create": "Roch", + "vector-view-edit": "Bodol", + "vector-view-history": "Itihas polloi", + "vector-view-view": "Vach", + "vector-view-viewsource": "Mull polloi", + "vector-jumptonavigation": "Dixa bodlunk uddki mar", + "vector-jumptosearch": "Soda khatir uddki mar", + "vector-jumptocontent": "Mozkuraxim uddki mar", + "vector-more-actions": "Anik", + "vector-toc-label": "Vixoi suchi", + "vector-toc-beginning": "Survat", + "vector-toc-toggle-button-label": "$1 upvibhag dakhoi / lipoi", + "vector-anon-user-menu-pages-learn": "odik xikun ghe", + "vector-anon-user-menu-pages-label": "Sompadona vixim odik xikun ghe", + "vector-main-menu-tooltip": "Mukhel volleri", + "vector-toc-menu-tooltip": "Vixoi suchi", + "vector-toc-collapsible-button-label": "Vixoi suchi dakhoi / lipoi", + "vector-main-menu-label": "Mukhel volleri", + "vector-limited-width-toggle": "Panachi rundai purnn vo tharavik", + "vector-page-tools-label": "Avtam", + "vector-page-tools-actions-label": "Kornnio", + "vector-pin-element-label": "deg-pott'ttiecher vor", + "vector-unpin-element-label": "lipoi", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Bhasabhas]]", + "empty-language-selector-body": "Panacho mozkur her bhasani somorthit na." +} diff --git a/Vector/i18n/gor.json b/Vector/i18n/gor.json new file mode 100644 index 0000000..557f16d --- /dev/null +++ b/Vector/i18n/gor.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bennylin", + "Marwan Mohamad", + "Veracious" + ] + }, + "vector-languages": "Bahasa", + "vector-language-button-label": "{{PLURAL:$1|Bahasa $1}}", + "vector-action-addsection": "Duhengi topik", + "vector-action-delete": "Luluta", + "vector-action-move": "Heyiya", + "vector-action-protect": "Dahayi", + "vector-view-create": "Mohutu", + "vector-view-edit": "Boli'o", + "vector-view-history": "Bilohi riwayati", + "vector-view-view": "Baca", + "vector-more-actions": "Uweewo", + "vector-searchsuggest-containing": "Lolohe halaman otuwa $1", + "vector-toc-label": "Tuwango" +} diff --git a/Vector/i18n/got.json b/Vector/i18n/got.json new file mode 100644 index 0000000..dc63d5b --- /dev/null +++ b/Vector/i18n/got.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Gothicspeaker" + ] + }, + "vector-action-addsection": "𐌰𐌽𐌰𐌰𐌹𐌰𐌿𐌺 𐍄𐌰𐌿𐍀𐌹𐌺𐌰", + "vector-action-delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹", + "vector-action-move": "𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹", + "vector-view-create": "𐍃𐌺𐌰𐍀𐌴𐌹", + "vector-view-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹", + "vector-view-history": "𐍃𐌰𐌹 𐍃𐍀𐌹𐌻𐌻", + "vector-view-view": "𐌿𐍃𐍃𐌹𐌲𐌲𐍅", + "vector-view-viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽", + "vector-more-actions": "𐌼𐌰𐌹𐍃" +} diff --git a/Vector/i18n/gpe.json b/Vector/i18n/gpe.json new file mode 100644 index 0000000..27c58d7 --- /dev/null +++ b/Vector/i18n/gpe.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "DaSupremo", + "Pintupi Luritja Guy" + ] + }, + "vector-languages": "Languages", + "vector-language-button-label": "{{PLURAL:$1|$1 language|$1 languages}}", + "vector-no-language-button-label": "Add languages", + "vector-action-addsection": "Add topic", + "vector-action-delete": "Delete", + "vector-action-move": "Move am", + "vector-action-protect": "Protect", + "vector-view-create": "Create", + "vector-view-edit": "Edit", + "vector-view-history": "View history", + "vector-view-view": "Read", + "vector-more-actions": "More", + "vector-searchsuggest-containing": "Search for pages wey dey contain $1", + "vector-toc-label": "Contents", + "vector-toc-beginning": "Dey begin", + "vector-page-tools-label": "Tools", + "vector-page-tools-general-label": "General", + "vector-unpin-element-label": "hide am" +} diff --git a/Vector/i18n/grc.json b/Vector/i18n/grc.json new file mode 100644 index 0000000..3966efd --- /dev/null +++ b/Vector/i18n/grc.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Crazymadlover", + "Gts-tg", + "Omnipaedista" + ] + }, + "vector-action-addsection": "Θέμα προστιθέναι", + "vector-action-delete": "Σβεννύναι", + "vector-action-move": "Κινεῖν", + "vector-action-protect": "Φυλάττειν", + "vector-action-undelete": "Ἀποκαθιστάναι", + "vector-action-unprotect": "Ἄλλαξον τὴν φύλαξιν", + "vector-view-create": "Ποιεῖν", + "vector-view-edit": "Μεταγράφειν", + "vector-view-history": "Ἱστορίαν ὁρᾶν", + "vector-view-view": "Ἀναγνῶναι", + "vector-view-viewsource": "Ὁρᾶν τὴν πηγήν", + "vector-more-actions": "Πλεῖον" +} diff --git a/Vector/i18n/gsw.json b/Vector/i18n/gsw.json new file mode 100644 index 0000000..54df68c --- /dev/null +++ b/Vector/i18n/gsw.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Als-Holder", + "Amire80" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 Sproch|$1 Sproche}}", + "vector-action-addsection": "Abschnitt zuefiege", + "vector-action-delete": "Lesche", + "vector-action-move": "Verschiebe", + "vector-action-protect": "Schitze", + "vector-action-undelete": "Widerhärstelle", + "vector-action-unprotect": "Syteschutz ändere", + "vector-view-create": "Aalege", + "vector-view-edit": "Bearbeite", + "vector-view-history": "Versionsgschicht", + "vector-view-view": "Läse", + "vector-view-viewsource": "Quälltext aaluege", + "vector-more-actions": "Meh", + "vector-searchsuggest-containing": "No Syte sueche, wu s $1 din het" +} diff --git a/Vector/i18n/gu.json b/Vector/i18n/gu.json new file mode 100644 index 0000000..7a78606 --- /dev/null +++ b/Vector/i18n/gu.json @@ -0,0 +1,52 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Aritra", + "Ashok modhvadia", + "CptViraj", + "Dsvyas", + "KartikMistry" + ] + }, + "vector-skin-desc": "તાજા દેખાવ અને વધુ ઉપયોગી સુધારાઓ સાથે મોનોબુકની આધુનિક આવૃત્તિ", + "prefs-vector-enable-vector-1-label": "જૂનું વેક્ટર વાપરો", + "vector-opt-out": "જૂના દેખાવ પર જાઓ", + "vector-opt-out-tooltip": "તમારી ગોઠવણીને જૂના દેખાવ પર લઇ જાઓ (જૂનું વેક્ટર)", + "vector-action-toggle-sidebar": "સાઇડબાર છુપાવો-બતાવો", + "vector-languages": "ભાષાઓ", + "vector-language-button-aria-label": "બીજી ભાષાના લેખ પર જાઓ. આમાં પ્રાપ્ત છે: {{PLURAL:$1|$1 ભાષા|$1 ભાષાઓ}}", + "vector-language-button-label": "{{PLURAL:$1|$1 ભાષા|$1 ભાષાઓ}}", + "vector-no-language-button-label": "ભાષાઓ ઉમેરો", + "vector-no-language-button-aria-label": "આ લેખ ફક્ત આ ભાષામાં જ છે. અન્ય ભાષાઓ માટે લેખ ઉમેરો", + "vector-action-addsection": "નવો વિષય", + "vector-action-delete": "રદ કરો", + "vector-action-move": "ખસેડો", + "vector-action-protect": "સુરક્ષિત કરો", + "vector-action-undelete": "રદ કરેલું પાછું વાળો", + "vector-action-unprotect": "સુરક્ષા બદલો", + "vector-view-create": "બનાવો", + "vector-view-edit": "ફેરફાર કરો", + "vector-view-history": "ઇતિહાસ જુઓ", + "vector-view-view": "વાંચો", + "vector-view-viewsource": "સ્રોત જુઓ", + "vector-jumptonavigation": "દિશાશોધન પર જાઓ", + "vector-jumptosearch": "શોધ પર જાઓ", + "vector-jumptocontent": "લખાણ પર જાઓ", + "vector-more-actions": "વધુ", + "vector-search-loader": "શોધ સૂચનો લાવો", + "vector-searchsuggest-containing": "$1 ધરાવતા પાનાઓ શોધો", + "vector-toc-label": "વિગતો", + "vector-toc-beginning": "શરૂઆત", + "vector-anon-user-menu-pages-learn": "વધુ જાણો", + "vector-main-menu-tooltip": "મુખ્ય મેનુ", + "vector-toc-menu-tooltip": "અનુક્રમણિકા", + "vector-main-menu-label": "મુખ્ય મેનુ", + "vector-page-tools-label": "સાધનો", + "vector-page-tools-general-label": "સામાન્ય", + "vector-page-tools-actions-label": "ક્રિયાઓ", + "vector-pin-element-label": "બાજુમાં ખસેડો", + "vector-unpin-element-label": "છુપાવો", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|ચર્ચા]]", + "tooltip-vector-anon-user-menu-title": "વધુ વિકલ્પો" +} diff --git a/Vector/i18n/guc.json b/Vector/i18n/guc.json new file mode 100644 index 0000000..dfb0786 --- /dev/null +++ b/Vector/i18n/guc.json @@ -0,0 +1,29 @@ +{ + "@metadata": { + "authors": [ + "Leonfd1992", + "Maor X", + "Wilfredor" + ] + }, + "vector-opt-out": "Awanajaa sünainmüin sukuwa'ipaka paalainka", + "vector-languages": "Anüikii", + "vector-language-button-label": "{{PLURAL:$1|$1 anüikii|$1 anüikikalüirua}}", + "vector-no-language-button-label": "Supushuwa'a anüikikalüirua", + "vector-action-addsection": "Ashajiraa sünülia wane yootirayaapülee", + "vector-action-delete": "Ojuichajaa", + "vector-action-move": "Ee'irataa sünülia", + "vector-action-protect": "Eisalajaa", + "vector-view-create": "Akumajaa", + "vector-view-edit": "Anaataa", + "vector-view-history": "E'rajaa a'wanajaanüka", + "vector-view-view": "Aashaje'eraa", + "vector-view-viewsource": "Anüliaa eejeetülee", + "vector-more-actions": "Soo'omüin", + "vector-searchsuggest-containing": "Achajaa sulu'u tü ee'iyalayaaka kalu'uko $1", + "vector-toc-label": "Sulujunaa", + "vector-toc-beginning": "O'ttia", + "vector-page-tools-label": "A’yataayaapala", + "vector-page-tools-general-label": "Supushuwa'a", + "vector-unpin-element-label": "ounjulaa" +} diff --git a/Vector/i18n/gur.json b/Vector/i18n/gur.json new file mode 100644 index 0000000..7432d74 --- /dev/null +++ b/Vector/i18n/gur.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Akakiiri", + "Akandee1", + "Amire80", + "Amoramah", + "Ayire Adongo", + "Dnshitobu" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 yetɔgum|$1 yetɔgum zo'e zo'e}}", + "vector-language-variant-switcher-label": "Tee tɔgum buuri", + "vector-action-addsection": "Pa’asɛ sɔsezure", + "vector-action-delete": "Saalum", + "vector-action-move": "Lɛgum", + "vector-action-protect": "Gu", + "vector-view-create": "Maalɛ", + "vector-view-edit": "Demese", + "vector-view-history": "Tuusum bisega", + "vector-view-view": "Kãalɛ", + "vector-more-actions": "Zo'ore", + "vector-searchsuggest-containing": "Ɛ pɛgesi'a n tari $1", + "vector-intro-page": "Help:Pɔsega" +} diff --git a/Vector/i18n/guw.json b/Vector/i18n/guw.json new file mode 100644 index 0000000..bd5f7f7 --- /dev/null +++ b/Vector/i18n/guw.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Anthonymodec", + "Atej2*", + "Gadarawamo", + "Hunpatinjob", + "Misteld", + "Samatics" + ] + }, + "vector-languages": "Ogbè lẹ", + "vector-language-button-label": "{{PLURAL:$1|$1 ogbè|$1 ogbè lẹ}}", + "vector-no-language-button-label": "Yi ogbè lẹ dogọ", + "vector-action-addsection": "Yi hosọ dogọ", + "vector-action-delete": "Sunsunsẹ", + "vector-action-move": "Sẹtẹn", + "vector-action-protect": "Họ́", + "vector-view-create": "Dá", + "vector-view-edit": "Jlado", + "vector-view-history": "Pọ́n kandai", + "vector-view-view": "Hia", + "vector-more-actions": "Dogọ", + "vector-searchsuggest-containing": "Dín weda he bẹ $1 hẹn lẹ", + "vector-toc-label": "Nuhe e bẹhẹn lẹ", + "vector-anon-user-menu-pages-learn": "Plọnnu dogọ", + "vector-page-tools-label": "Azọ́nwanu lẹ", + "vector-page-tools-general-label": "Dopọ", + "vector-unpin-element-label": "whlá" +} diff --git a/Vector/i18n/gv.json b/Vector/i18n/gv.json new file mode 100644 index 0000000..9be429f --- /dev/null +++ b/Vector/i18n/gv.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "MacTire02", + "Shimmin Beg" + ] + }, + "vector-action-addsection": "Cur cooish noa rish", + "vector-action-delete": "Scryss", + "vector-action-move": "Scugh", + "vector-action-protect": "Coadee", + "vector-action-undelete": "Jee-scryss", + "vector-action-unprotect": "Caghlaa coadey", + "vector-view-create": "Croo", + "vector-view-edit": "Reagh", + "vector-view-history": "Jeeagh er shennaghys", + "vector-view-view": "Lhaih", + "vector-view-viewsource": "Jeeagh er bun" +} diff --git a/Vector/i18n/ha.json b/Vector/i18n/ha.json new file mode 100644 index 0000000..6a370b1 --- /dev/null +++ b/Vector/i18n/ha.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ammarpad", + "Bello Na'im", + "DonCamillo", + "Edith Nwobu", + "Em-em", + "Gwanki", + "Moyogo", + "Salihu aliyu" + ] + }, + "vector-language-button-aria-label": "Je zuwa maƙala domin wani harshen. Akwai a {{PLURAL:$1|$1 language|$1 languages}}", + "vector-language-button-label": "{{PLURAL:$1|$1 harshe|$1 harsuna}}", + "vector-language-variant-switcher-label": "Sauya bambancin harshe", + "vector-action-addsection": "Sabon sashe", + "vector-action-delete": "Soke", + "vector-action-move": "Gusarwa", + "vector-action-protect": "A kare", + "vector-view-create": "Ƙirƙira", + "vector-view-edit": "Gyara", + "vector-view-history": "Nuna tarihin", + "vector-view-view": "Karanta", + "vector-more-actions": "Mafi", + "vector-searchsuggest-containing": "Duba shafukan dake dauke da $1", + "vector-intro-page": "Taimako:Gabatarwa", + "vector-toc-beginning": "Farawa" +} diff --git a/Vector/i18n/hak.json b/Vector/i18n/hak.json new file mode 100644 index 0000000..1d7a9da --- /dev/null +++ b/Vector/i18n/hak.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Anson2812", + "Hakka", + "Jetlag", + "唐吉訶德的侍從" + ] + }, + "vector-action-addsection": "Kâ-ngi̍p fa-thì", + "vector-action-delete": "San-chhù", + "vector-action-move": "Yì-thûng", + "vector-action-protect": "Pó-fu", + "vector-action-undelete": "恢復", + "vector-action-unprotect": "更改保護", + "vector-view-create": "Kien-li̍p", + "vector-view-edit": "Phiên-siá", + "vector-view-history": "Khon li̍t-sṳ́", + "vector-view-view": "Thu̍k", + "vector-view-viewsource": "Khon ngièn-sṳ́-mâ", + "vector-more-actions": "Kiên-tô" +} diff --git a/Vector/i18n/haw.json b/Vector/i18n/haw.json new file mode 100644 index 0000000..98e2919 --- /dev/null +++ b/Vector/i18n/haw.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Kolonahe" + ] + }, + "vector-action-addsection": "Hoʻohui kumuhana", + "vector-action-delete": "Holoi", + "vector-action-move": "E hoʻoneʻe", + "vector-action-protect": "E hoʻomalu", + "vector-action-undelete": "Holoiʻole", + "vector-action-unprotect": "E hoʻololi i ka hoʻomalu", + "vector-view-create": "Haku", + "vector-view-edit": "Hoʻololi", + "vector-view-history": "Nānā i ka mōʻaukala", + "vector-view-view": "Heluhelu", + "vector-view-viewsource": "Nānā i ke kumu" +} diff --git a/Vector/i18n/he.json b/Vector/i18n/he.json new file mode 100644 index 0000000..5103d35 --- /dev/null +++ b/Vector/i18n/he.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Guycn2", + "Rotemliss", + "דגש" + ] + }, + "skinname-vector": "וקטור ישן (2010)", + "skinname-vector-2022": "וקטור (2022)", + "vector-skin-desc": "שתי גרסאות של עיצוב וקטור:\n* 2011 – גרסה מודרנית של העיצוב \"מונובוק\" עם מראה רענן ושיפורי שמישות רבים.\n* 2022 – הווקטור שנבנה כחלק ממיזם [[mw:Desktop Improvements|שיפורי שולחן העבודה]].", + "prefs-vector-enable-vector-1-label": "להשתמש בעיצוב וקטור הישן", + "prefs-vector-enable-vector-1-help": "בשנים הקרובות נעדכן בהדרגה את עיצוב וקטור. עיצוב וקטור הישן יאפשר לך לראות את הגרסה הישנה של וקטור (כפי שהיא הייתה בדצמבר 2019). למידע נוסף על העדכונים, ר' את [[mw:Reading/Web/Desktop_Improvements|דף הפרויקט שלנו]].", + "vector-opt-out": "מעבר למראה הישן", + "vector-opt-out-tooltip": "שינוי ההעדפות שלך וחזרה למראה הישן של העיצוב (וקטור ישן)", + "vector-action-toggle-sidebar": "שינוי מצב סרגל צד", + "vector-languages": "שפות", + "vector-language-button-aria-label": "מעבר לערך בשפה אחרת. זמין {{PLURAL:$1|בשפה אחת|ב־$1 שפות}}", + "vector-language-button-label": "{{PLURAL:$1|שפה אחת|$1 שפות}}", + "vector-no-language-button-label": "הוספת שפות", + "vector-no-language-button-aria-label": "הערך הזה קיים רק בשפה הזאת. {{GENDER:|הוסף|הוסיפי|מוזמנים להוסיף}} את הערך לשפות אחרות", + "vector-language-redirect-to-top": "במהדורה הזאת של {{SITENAME}}, קישורי השפה נמצאים בראש הדף מול כותרת הערך. [[#p-lang-btn|לעבור למעלה]].", + "vector-language-variant-switcher-label": "שינוי הגוון השפה", + "vector-action-addsection": "פסקה חדשה", + "vector-action-delete": "מחיקה", + "vector-action-move": "העברה", + "vector-action-protect": "הגנה", + "vector-action-undelete": "ביטול מחיקה", + "vector-action-unprotect": "שינוי הגנה", + "vector-view-create": "יצירה", + "vector-view-edit": "עריכה", + "vector-view-history": "גרסאות קודמות", + "vector-view-view": "קריאה", + "vector-view-viewsource": "הצגת מקור", + "vector-jumptonavigation": "קפיצה לניווט", + "vector-jumptosearch": "קפיצה לחיפוש", + "vector-jumptocontent": "לדלג לתוכן", + "vector-more-actions": "עוד", + "vector-search-loader": "טעינת הצעות חיפוש", + "vector-searchsuggest-containing": "חיפוש דפים שמכילים $1", + "vector-intro-page": "Help:ברוכים הבאים", + "vector-toc-label": "תוכן עניינים", + "vector-toc-beginning": "התחלה", + "vector-toc-toggle-button-label": "שינוי מצב התת־פרק $1", + "vector-anon-user-menu-pages": "דפים לעורכים שלא נכנסו לחשבון", + "vector-anon-user-menu-pages-learn": "מידע נוסף", + "vector-anon-user-menu-pages-label": "מידע נוסף על עריכה", + "vector-main-menu-tooltip": "תפריט ראשי", + "vector-toc-menu-tooltip": "תוכן עניינים", + "vector-toc-collapsible-button-label": "מצב תוכן העניינים", + "vector-site-nav-label": "אתר", + "vector-main-menu-label": "תפריט ראשי", + "vector-limited-width-toggle": "החלפת מצב רוחב תוכן מוגבל", + "vector-page-tools-label": "כלים", + "vector-page-tools-general-label": "כללי", + "vector-page-tools-actions-label": "פעולות", + "vector-pin-element-label": "העברה לסרגל הצד", + "vector-unpin-element-label": "הסתרה", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|דיון]]", + "tooltip-vector-anon-user-menu-title": "אפשרויות נוספות", + "vector-prefs-limited-width": "להפעיל מצב רוחב מוגבל", + "vector-prefs-limited-width-help": "הפעלת מצב רוחב מוגבל, לחוויית קריאה משופרת.", + "empty-language-selector-body": "תוכן הדף אינו נתמך בשפות אחרות." +} diff --git a/Vector/i18n/hi.json b/Vector/i18n/hi.json new file mode 100644 index 0000000..33bb1b6 --- /dev/null +++ b/Vector/i18n/hi.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "Abijeet Patro", + "Amire80", + "AnupamM", + "Saurmandal", + "Sfic", + "Siddhartha Ghai", + "ThisIsACreeper0101", + "आलोक", + "भारत्पराक्रमि", + "रोहित रावत" + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "दो Vector स्किन्स प्रदान करता है:\n* 2011 - MonoBook का आधुनिक संस्करण जिसमें एक ताज़ी दिखावट और उपयोग में सुधार हैं।\n* 2022 - Vector जिसे विकिमीडिया संस्थान के [[mw:Desktop Improvements|डेस्कटॉप उन्नति]] परियोजना के रूप में बनाया गया है।", + "prefs-vector-enable-vector-1-label": "लिगेसी Vector का उपयोग करें", + "prefs-vector-enable-vector-1-help": "अगले कुछ सालों में हम Vector स्किन को धीरे धीरे अपडेट करेंगे। लिगेसी Vector की मदद से आप Vector का पुराना संस्करण देख सकते हैं (दिसंबर 2019 के अनुसार)। अद्यतनों के बारे में अधिक जानने के लिए हमारे [[mw:Reading/Web/Desktop_Improvements|परियोजना पृष्ठ]] पर जाएँ।", + "vector-opt-out": "पुरानी दिखावट पर जाएँ", + "vector-opt-out-tooltip": "अपने सेटिंग्स को बदलकर स्किन के पुराने दिखावट (लिगेसी Vector) पर वापस जाएँ", + "vector.css": "/* सीएसएस यहाँ डालने से वेक्टर त्वचा चुने लोगों को प्रभावित करेगा */", + "vector-action-toggle-sidebar": "साइडबार को टॉगल करें", + "vector-languages": "भाषाएँ", + "vector-language-button-aria-label": "दूसरे भाषा में लेख पर जाएँ। {{PLURAL:$1|$1 भाषा|$1 भाषाओं}} में उपलब्ध", + "vector-language-button-label": "{{PLURAL:$1|$1 भाषा|$1 भाषाएँ}}", + "vector-no-language-button-label": "भाषाएँ जोड़ें", + "vector-no-language-button-aria-label": "यह लेख सिर्फ इसी भाषा में उपलब्ध है। इस लेख को दूसरी भाषाओं में अनुवादित करें।", + "vector-language-redirect-to-top": "इस {{SITENAME}} पर भाषा की कड़ियाँ पृष्ठ के ऊपर की तरफ लेख के शीर्षक के पास हैं। [[#p-lang-btn|ऊपर जाएँ]]।", + "vector-language-variant-switcher-label": "भाषा का प्रकार बदलें", + "vector-action-addsection": "विषय जोड़ें", + "vector-action-delete": "हटाएँ", + "vector-action-move": "स्थानांतरित करें", + "vector-action-protect": "सुरक्षित करें", + "vector-action-undelete": "हटाना वापस लें", + "vector-action-unprotect": "सुरक्षा बदलें", + "vector-view-create": "बनाएँ", + "vector-view-edit": "सम्पादन", + "vector-view-history": "इतिहास देखें", + "vector-view-view": "पढ़ें", + "vector-view-viewsource": "स्रोत देखें", + "vector-jumptonavigation": "नेविगेशन पर जाएँ", + "vector-jumptosearch": "खोज पर जाएँ", + "vector-jumptocontent": "सामग्री पर जाएँ", + "vector-more-actions": "अधिक", + "vector-search-loader": "खोज सुझाव लोड हो रहे हैं", + "vector-searchsuggest-containing": "$1 से युक्त पृष्ठ खोजें", + "vector-intro-page": "Help:परिचय", + "vector-toc-label": "सामग्री", + "vector-toc-beginning": "शुरुआत", + "vector-toc-toggle-button-label": "$1 उप-अनुभाग को टॉगल करें", + "vector-anon-user-menu-pages": "लॉग-आउट किए गए संपादकों के लिए पृष्ठ", + "vector-anon-user-menu-pages-learn": "अधिक जानें", + "vector-anon-user-menu-pages-label": "संपादन के बारे में अधिक जानें", + "vector-main-menu-tooltip": "मुख्य मेन्यू", + "vector-toc-menu-tooltip": "विषयसूची", + "vector-toc-collapsible-button-label": "विषयसूची को टॉगल करें", + "vector-site-nav-label": "साइट", + "vector-main-menu-label": "मुख्य मेन्यू", + "vector-page-tools-label": "उपकरण", + "vector-page-tools-general-label": "सामान्य", + "vector-page-tools-actions-label": "क्रियाएँ", + "vector-pin-element-label": "साइडबार पर जाएँ", + "vector-unpin-element-label": "छुपाएँ", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|चर्चा]]", + "tooltip-vector-anon-user-menu-title": "अन्य विकल्प" +} diff --git a/Vector/i18n/hif-latn.json b/Vector/i18n/hif-latn.json new file mode 100644 index 0000000..20badd7 --- /dev/null +++ b/Vector/i18n/hif-latn.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Girmitya", + "Thakurji" + ] + }, + "vector-action-addsection": "Topic jorro", + "vector-action-delete": "Mitao", + "vector-action-move": "Naam badlo", + "vector-action-protect": "Bachao", + "vector-action-undelete": "Pahile jaise karo", + "vector-action-unprotect": "Surakchha ke badlo", + "vector-view-create": "Banao", + "vector-view-edit": "Badlo", + "vector-view-history": "Itihaas dekho", + "vector-view-view": "Parrho", + "vector-view-viewsource": "Source dekho", + "vector-more-actions": "Aur" +} diff --git a/Vector/i18n/hil.json b/Vector/i18n/hil.json new file mode 100644 index 0000000..d2efd67 --- /dev/null +++ b/Vector/i18n/hil.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Anjoeli9806", + "Kai theos en ho logos", + "Redhotchili23" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ka pinulongan|$1 ka mga pinulongan}}", + "vector-action-addsection": "Magdugang sing topiko", + "vector-action-delete": "Panason", + "vector-action-move": "Saylohon", + "vector-action-protect": "Pangapinan", + "vector-action-undelete": "Dulaon ang pagpanas", + "vector-action-unprotect": "Ilisan ang pagpangapin", + "vector-view-create": "Himuon", + "vector-view-edit": "Liwaton", + "vector-view-history": "Lantawon ang nagkalatabo", + "vector-view-view": "Magbasa", + "vector-view-viewsource": "Lantawon ang ginhalinan", + "vector-more-actions": "Dugang Pa", + "vector-searchsuggest-containing": "Mangita sang mga panid nga nagasulod sang $1" +} diff --git a/Vector/i18n/hno.json b/Vector/i18n/hno.json new file mode 100644 index 0000000..8f51cf8 --- /dev/null +++ b/Vector/i18n/hno.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Bgo eiu" + ] + }, + "vector-languages": "زباناں", + "vector-language-button-label": "{{PLURAL:$1|$1 زبان|$1 زباناں}}", + "vector-no-language-button-label": "ہور زباناں جڑو", + "vector-action-addsection": "مضمون جوڑو", + "vector-action-delete": "ہٹاؤ", + "vector-action-move": "ہلو", + "vector-action-protect": "گاڈ کرو", + "vector-view-create": "بنڑاؤ", + "vector-view-history": "تریخ دیکھو", + "vector-more-actions": "ودھیک", + "vector-page-tools-label": "رچاݨی", + "vector-page-tools-general-label": "عام", + "vector-unpin-element-label": "چھپو" +} diff --git a/Vector/i18n/hoc.json b/Vector/i18n/hoc.json new file mode 100644 index 0000000..353a5ce --- /dev/null +++ b/Vector/i18n/hoc.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Singkiring57" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 𑣎𑣁𑣋𑣁𑣜|$1 𑣎𑣁𑣋𑣁𑣜 𑣌𑣉}}", + "vector-action-delete": "𑢯𑣗𑣁𑣕𑣉𑣖𑣈", + "vector-action-move": "𑢡𑣕𑣉𑣖𑣈", + "vector-view-create": "𑢷𑣆𑣂", + "vector-view-edit": "𑢩𑣚-𑣞𑣁𑣋𑣉𑣖 𑣜𑣃𑣈𑣈", + "vector-view-history": "𑢾𑣂𑣔𑣈𑣞𑣁𑣆 𑣓𑣈𑣚𑣈", + "vector-view-view": "𑢸𑣁𑣛𑣁𑣉𑣈", + "vector-more-actions": "𑢩𑣓𑣑𑣉𑣄 𑣚𑣁𑣁𑣄", + "vector-searchsuggest-containing": "$1 𑣖𑣈𑣓𑣁𑣄 𑣕𑣁𑣓 𑣞𑣁𑣌𑣁𑣖 𑣌𑣉 𑣓𑣈𑣚-𑣞𑣁𑣊𑣋𑣁𑣜𑣈" +} diff --git a/Vector/i18n/hr.json b/Vector/i18n/hr.json new file mode 100644 index 0000000..676b744 --- /dev/null +++ b/Vector/i18n/hr.json @@ -0,0 +1,70 @@ +{ + "@metadata": { + "authors": [ + "BadDog", + "Bugoslav", + "Ex13", + "Ivi104", + "MaGa", + "Neptune, the Mystic", + "Ponor", + "Tivek" + ] + }, + "skinname-vector": "Vector (stara inačica iz 2010.)", + "vector-skin-desc": "Postoje dvije varijante Vectora:\n* 2011. - Moderna varijante MonoBooka s osvježenim izgledom i mnogim poboljšanjima.\n* 2022. - Vector izrađen kao dio projekta WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Rabi staru inačicu izgleda Vector", + "prefs-vector-enable-vector-1-help": "Izgled sučelja Vector osvježavat će se tijekom nekoliko godina. Ova postavka omogućit će Vam upotrebu inačice Vectora iz prosinca 2019. Više o tehnološkome osuvremenjavanju saznajte na [[mw:Reading/Web/Desktop_Improvements|stranici projekta na MediaWikiju]].", + "vector-opt-out": "Prebaci na stari izgled", + "vector-opt-out-tooltip": "Promijenite postavke i vratite se na stari izgled sučelja Vector", + "vector.css": "/* Sav kôd CSS-a na ovoj stranici bit će učitan upotrebljavačima izgleda Vector */", + "vector.js": "/* Sav kôd JavaScripta na ovoj stranici bit će učitan upotrebljavačima izgleda Vector */", + "vector-action-toggle-sidebar": "Uključi / isključi bočnu traku", + "vector-languages": "Drugi jezici", + "vector-language-button-aria-label": "Idi na druge jezične varijante članka. Dostupan je na {{PLURAL:$1|$1 jeziku|$1 jezika}}", + "vector-language-button-label": "{{PLURAL:$1|$1 jezik|$1 jezika}}", + "vector-no-language-button-label": "Dodajte druge jezike", + "vector-no-language-button-aria-label": "Članak je napisan samo na ovom jeziku. Dodajte druge jezike.", + "vector-language-redirect-to-top": "Poveznice na druge jezike nalaze se uz naslov članka, pri [[#p-lang-btn|vrhu stranice]].", + "vector-language-variant-switcher-label": "Promijeni jezičnu varijantu", + "vector-action-addsection": "Dodaj temu", + "vector-action-delete": "Izbriši", + "vector-action-move": "Premjesti", + "vector-action-protect": "Zaštiti", + "vector-action-undelete": "Vrati izbrisano", + "vector-action-unprotect": "Promijeni zaštitu", + "vector-view-create": "Stvori", + "vector-view-edit": "Uredi", + "vector-view-history": "Vidi povijest", + "vector-view-view": "Čitaj", + "vector-view-viewsource": "Vidi izvor", + "vector-jumptonavigation": "Prijeđi na navigaciju", + "vector-jumptosearch": "Prijeđi na pretraživanje", + "vector-jumptocontent": "Prijeđi na sadržaj", + "vector-more-actions": "Više", + "vector-search-loader": "Učitavanje prijedloga pretrage", + "vector-searchsuggest-containing": "Traži stranice koje sadrže $1", + "vector-intro-page": "Pomoć:Uvod", + "vector-toc-label": "Sadržaj", + "vector-toc-beginning": "Početak", + "vector-toc-toggle-button-label": "Sadržaj cjeline $1", + "vector-anon-user-menu-pages": "Stranice za neprijavljene suradnike", + "vector-anon-user-menu-pages-learn": "saznajte više", + "vector-anon-user-menu-pages-label": "Vidi više o uređivanju", + "vector-main-menu-tooltip": "Glavni izbornik", + "vector-toc-menu-tooltip": "Sadržaj", + "vector-toc-collapsible-button-label": "Prikaz sadržaja stranice", + "vector-site-nav-label": "Mrežno mjesto", + "vector-main-menu-label": "Glavni izbornik", + "vector-limited-width-toggle": "Ograničenje širine teksta", + "vector-page-tools-label": "Pomagala", + "vector-page-tools-general-label": "Razno", + "vector-page-tools-actions-label": "Radnje", + "vector-pin-element-label": "premjesti", + "vector-unpin-element-label": "sakrij", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Rasprava]]", + "tooltip-vector-anon-user-menu-title": "Više mogućnosti", + "vector-prefs-limited-width": "Ograniči širinu teksta", + "vector-prefs-limited-width-help": "Ograničava širinu teksta u člancima radi bolje čitljivosti.", + "empty-language-selector-body": "Stranica ne postoji na drugim jezicima." +} diff --git a/Vector/i18n/hrx.json b/Vector/i18n/hrx.json new file mode 100644 index 0000000..11ff905 --- /dev/null +++ b/Vector/i18n/hrx.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Iohanen", + "Midnight Gambler", + "Paul Beppler" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 Sproch|$1 Sproche}}", + "vector-action-addsection": "Abschnidd addizioneere", + "vector-action-delete": "Lösche", + "vector-action-move": "Bewehe", + "vector-action-protect": "Schütz", + "vector-action-undelete": "Wiederherstelle", + "vector-action-unprotect": "Seiteschutz ännre", + "vector-view-create": "Erstelle", + "vector-view-edit": "Beaarvete", + "vector-view-history": "Vërsionsgeschicht", + "vector-view-view": "Lese", + "vector-view-viewsource": "Quelltext oonzeiche", + "vector-more-actions": "Meh", + "vector-searchsuggest-containing": "Suche noh Seite wo $1 enthelld." +} diff --git a/Vector/i18n/hsb.json b/Vector/i18n/hsb.json new file mode 100644 index 0000000..1a5af32 --- /dev/null +++ b/Vector/i18n/hsb.json @@ -0,0 +1,47 @@ +{ + "@metadata": { + "authors": [ + "J budissin", + "Martin Urbanec (WMF)", + "Michawiki" + ] + }, + "vector-opt-out": "Wróćo k staremu napohladej", + "vector-action-toggle-sidebar": "Bóčnicu přešaltować", + "vector-languages": "Rěče", + "vector-language-button-aria-label": "K zapiskej w druhej rěči hić. Přistupny w {{PLURAL:$1|$1 rěči|$1 rěčomaj|$1 rěčach|$1 rěčach}}", + "vector-language-button-label": "{{PLURAL:$1|$ rěč|$1 rěči|$1 rěče|$1 rěčow}}", + "vector-no-language-button-label": "Rěče dodać", + "vector-no-language-button-aria-label": "Tutón zapisk eksistuje jenož w tutej rěči. Dodaj zapisk za druhe rěče", + "vector-language-variant-switcher-label": "Rěčnu wariantu změnić", + "vector-action-addsection": "Temu přidać", + "vector-action-delete": "wušmórnyć", + "vector-action-move": "přesunyć", + "vector-action-protect": "škitać", + "vector-action-undelete": "Wobnowić", + "vector-action-unprotect": "Škit wotstronić", + "vector-view-create": "Wutworić", + "vector-view-edit": "Wobdźěłać", + "vector-view-history": "Stawizny", + "vector-view-view": "Čitać", + "vector-view-viewsource": "Žórło sej wobhladać", + "vector-jumptonavigation": "K nawigaciji skočić", + "vector-jumptosearch": "K pytanju skočić", + "vector-jumptocontent": "K wobsahej skočić", + "vector-more-actions": "Wjace", + "vector-search-loader": "Pytanske namjety začitać", + "vector-toc-label": "Wobsah", + "vector-toc-beginning": "Spočatk", + "vector-toc-toggle-button-label": "Podwotrězk $1 přešaltować", + "vector-anon-user-menu-pages": "Strony za wotzjewjenych wužiwarjow", + "vector-anon-user-menu-pages-learn": "Dalše informacije", + "vector-anon-user-menu-pages-label": "Wjace wo wobdźěłanju zhonić", + "vector-main-menu-tooltip": "Hłowny meni", + "vector-toc-menu-tooltip": "Zapis wobsaha", + "vector-toc-collapsible-button-label": "Zapis wobsaha přešaltować", + "vector-site-nav-label": "Webstrona", + "vector-pin-element-label": "Do bóčnicy přesunyć", + "vector-unpin-element-label": "schować", + "tooltip-vector-anon-user-menu-title": "Wjace opcijow", + "vector-prefs-limited-width": "Modus wobmjezowaneje šěrokosće zaswěćić" +} diff --git a/Vector/i18n/hsn.json b/Vector/i18n/hsn.json new file mode 100644 index 0000000..56c4bc4 --- /dev/null +++ b/Vector/i18n/hsn.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "SolidBlock", + "YulouCN" + ] + }, + "vector-skin-desc": "给杂清新的样子再加上好多吧多可用性的新MonoBook", + "vector-action-addsection": "搞杂话题", + "vector-action-delete": "消嘎", + "vector-action-move": "移走", + "vector-action-protect": "免修", + "vector-action-undelete": "还原", + "vector-action-unprotect": "换杂保护", + "vector-view-create": "弄噶", + "vector-view-edit": "增改", + "vector-view-history": "履歷", + "vector-view-view": "讀", + "vector-view-viewsource": "望下代碼", + "vector-more-actions": "更多" +} diff --git a/Vector/i18n/ht.json b/Vector/i18n/ht.json new file mode 100644 index 0000000..02cef15 --- /dev/null +++ b/Vector/i18n/ht.json @@ -0,0 +1,45 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Boukman", + "Internoob", + "Kitanago", + "Masterches", + "Tisave" + ] + }, + "vector-languages": "Lang yo", + "vector-language-button-aria-label": "Ale nan yon atik nan yon lòt lang. Disponib nan {{PLURAL:$1|$1 lang}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lang}}", + "vector-no-language-button-label": "Ajoute lang yo", + "vector-no-language-button-aria-label": "Atik sa a egziste sèlman nan lang sa a. Ajoute atik la pou lòt lang", + "vector-language-redirect-to-top": "Sou {{SITENAME}} sa a lyen lang yo nan tèt paj la anfas tit atik la. [[#p-lang-btn|Ale nan tèt]].", + "vector-language-variant-switcher-label": "Chanje variant lang", + "vector-action-addsection": "Ajoute yon sijè", + "vector-action-delete": "Efase", + "vector-action-move": "Chanje non", + "vector-action-protect": "Pwoteje", + "vector-action-undelete": "Retabli", + "vector-action-unprotect": "Chanje nivo pwoteksyon", + "vector-view-create": "Kreye", + "vector-view-edit": "Modifye", + "vector-view-history": "Gade istorik", + "vector-view-view": "Li", + "vector-view-viewsource": "Wè kòd paj la", + "vector-more-actions": "Plis", + "vector-searchsuggest-containing": "Chèche paj ki genyen ladan l $1", + "vector-toc-label": "Kontni", + "vector-anon-user-menu-pages": "Paj yo pou editè ki dekonekte yo", + "vector-anon-user-menu-pages-learn": "aprann plis", + "vector-anon-user-menu-pages-label": "Aprann plis sou modifikasyon", + "vector-main-menu-tooltip": "Meni prensipal la", + "vector-toc-menu-tooltip": "Tab dèmatyè", + "vector-toc-collapsible-button-label": "Deklannche tab dèmatyè la", + "vector-site-nav-label": "Sit", + "vector-page-tools-label": "Bwat zouti", + "vector-page-tools-general-label": "Jeneral", + "vector-unpin-element-label": "kache", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskisyon]]", + "tooltip-vector-anon-user-menu-title": "Plis opsyon" +} diff --git a/Vector/i18n/hu-formal.json b/Vector/i18n/hu-formal.json new file mode 100644 index 0000000..4c9fcad --- /dev/null +++ b/Vector/i18n/hu-formal.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Tacsipacsi" + ] + }, + "vector-action-addsection": "Új téma nyitása", + "vector-action-delete": "Törlés", + "vector-action-move": "Átnevezés", + "vector-action-protect": "Lapvédelem", + "vector-action-undelete": "Visszaállítás", + "vector-action-unprotect": "Védelem módosítása", + "vector-view-create": "Létrehozás", + "vector-view-edit": "Szerkesztés", + "vector-view-history": "Laptörténet", + "vector-view-view": "Olvasás", + "vector-view-viewsource": "A lap forrása" +} diff --git a/Vector/i18n/hu.json b/Vector/i18n/hu.json new file mode 100644 index 0000000..caed4b5 --- /dev/null +++ b/Vector/i18n/hu.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Bdamokos", + "Dani", + "Dj", + "Hanna Tardos", + "Misibacsi", + "Mmarci72", + "Máté", + "Tacsipacsi", + "Tgr" + ] + }, + "vector-skin-desc": "A MonoBook felület modern változata frissebb kinézettel és sok használhatóságot javító fejlesztéssel", + "prefs-vector-enable-vector-1-label": "Hagyományos Vector használata", + "prefs-vector-enable-vector-1-help": "A következő pár évben fokozatosan frissíteni fogjuk a Vector felületet. A hagyományos Vector beállítással a Vector felület régi (2019. decemberi) változatát használhatod továbbra is. A frissítésekről további információk a [[mw:Reading/Web/Desktop_Improvements|projektlapunkon]] találhatók.", + "vector-opt-out": "Vissza a régi megjelenéshez", + "vector-opt-out-tooltip": "A beállításaid módosítása a felület régi verziójához (hagyományos Vector) való visszatéréshez", + "vector.css": "/* Az összes itteni CSS betöltődik Vector felület használóinak */", + "vector.js": "/* Az összes itteni JavaScript betöltődik Vector felület használóinak */", + "vector-action-toggle-sidebar": "Oldalsáv megjelenítése vagy elrejtése", + "vector-languages": "Más nyelveken", + "vector-language-button-aria-label": "Ugrás egy más nyelvű szócikkre. Elérhető $1 {{PLURAL:$1|nyelven}}", + "vector-language-button-label": "$1 nyelv", + "vector-no-language-button-label": "Nyelvek hozzáadása", + "vector-no-language-button-aria-label": "Ez a szócikk nem érhető el más nyelven. Szócikkek hozzáadása más nyelveken", + "vector-language-redirect-to-top": "Ezen a {{SITENAME}} oldalon a nyelvközi hivatkozások a lap tetején, a címmel átellenben találhatók. [[#p-lang-btn|Ugrás a tetejére.]]", + "vector-language-variant-switcher-label": "Nyelvvariáns váltása", + "vector-action-addsection": "Új téma nyitása", + "vector-action-delete": "Törlés", + "vector-action-move": "Átnevezés", + "vector-action-protect": "Lapvédelem", + "vector-action-undelete": "Visszaállítás", + "vector-action-unprotect": "Védelem módosítása", + "vector-view-create": "Létrehozás", + "vector-view-edit": "Szerkesztés", + "vector-view-history": "Laptörténet", + "vector-view-view": "Olvasás", + "vector-view-viewsource": "A lap forrása", + "vector-jumptonavigation": "Ugrás a navigációhoz", + "vector-jumptosearch": "Ugrás a kereséshez", + "vector-jumptocontent": "Ugrás a tartalomhoz", + "vector-more-actions": "Több", + "vector-search-loader": "Keresési javaslatok betöltése…", + "vector-searchsuggest-containing": "Olyan oldalak keresése, amelyek tartalmazzák a következőt: $1", + "vector-toc-label": "Tartalomjegyzék", + "vector-toc-beginning": "Bevezető", + "vector-toc-toggle-button-label": "A(z) $1 alszakasz kinyitása/becsukása", + "vector-anon-user-menu-pages": "Lapok kijelentkezett szerkesztőknek", + "vector-anon-user-menu-pages-learn": "további információk", + "vector-anon-user-menu-pages-label": "Tudj meg többet a szerkesztésről", + "vector-main-menu-tooltip": "Főmenü", + "vector-toc-menu-tooltip": "Tartalomjegyzék", + "vector-toc-collapsible-button-label": "Tartalomjegyzék kinyitása/becsukása", + "vector-site-nav-label": "Wiki", + "vector-main-menu-label": "Főmenü", + "vector-limited-width-toggle": "Korlátozott tartalomszélesség ki/be", + "vector-page-tools-label": "Eszközök", + "vector-page-tools-general-label": "Általános", + "vector-page-tools-actions-label": "Műveletek", + "vector-pin-element-label": "áthelyezés az oldalsávba", + "vector-unpin-element-label": "elrejtés", + "tooltip-vector-anon-user-menu-title": "További lehetőségek", + "vector-prefs-limited-width": "Korlátozott szélességű mód bekapcsolása", + "vector-prefs-limited-width-help": "A tartalom szélességének korlátozása a kényelmesebb olvasás érdekében.", + "empty-language-selector-body": "Az oldal más nyelven nem elérhető." +} diff --git a/Vector/i18n/hy.json b/Vector/i18n/hy.json new file mode 100644 index 0000000..e297a51 --- /dev/null +++ b/Vector/i18n/hy.json @@ -0,0 +1,47 @@ +{ + "@metadata": { + "authors": [ + "Arman musikyan", + "Armenoid", + "Kareyac", + "Teak", + "Vadgt", + "Xelgen", + "Դավիթ Սարոյան", + "Սերգեյ Սաֆարյան" + ] + }, + "skinname-vector": "Սովորական", + "skinname-vector-2022": "Վեկտոր (2022)", + "vector-opt-out": "Անցնել հին տեսքին", + "vector-languages": "Լեզուներ", + "vector-language-button-label": "{{PLURAL:$1|$1 լեզու}}", + "vector-no-language-button-label": "Ավելացնել լեզուներ", + "vector-language-redirect-to-top": "Այս կայքում լեզվական հղումները գտնվում են էջի վերևում՝ հոդվածի վերնագրի դիմաց։ [[#p-lang-btn|Անցնել վերև]]։", + "vector-action-addsection": "Ավելացնել քննարկում", + "vector-action-delete": "Ջնջել", + "vector-action-move": "Վերանվանել", + "vector-action-protect": "Պաշտպանել", + "vector-action-undelete": "Վերականգնել", + "vector-action-unprotect": "Փոխել պաշտպանումը", + "vector-view-create": "Ստեղծել", + "vector-view-edit": "Խմբագրել", + "vector-view-history": "Պատմություն", + "vector-view-view": "Կարդալ", + "vector-view-viewsource": "Դիտել ելատեքստը", + "vector-more-actions": "Ավելին", + "vector-intro-page": "Օգնություն:Գլխացանկ", + "vector-toc-label": "Բովանդակություն", + "vector-toc-beginning": "Ներածություն", + "vector-anon-user-menu-pages": "Էջեր չգրանցված խմբագիրների համար", + "vector-anon-user-menu-pages-learn": "իմանալ ավելին", + "vector-main-menu-tooltip": "Հիմնական ընտրացանկ", + "vector-toc-menu-tooltip": "Բովանդակություն", + "vector-main-menu-label": "Հիմնական ընտրացանկ", + "vector-page-tools-label": "Գործիքներ", + "vector-page-tools-general-label": "Ընդհանուր", + "vector-page-tools-actions-label": "Գործողություններ", + "vector-pin-element-label": "տեղափոխել կողագոտի", + "vector-unpin-element-label": "թաքցնել", + "tooltip-vector-anon-user-menu-title": "Այլ ընտրանքներ" +} diff --git a/Vector/i18n/hyw.json b/Vector/i18n/hyw.json new file mode 100644 index 0000000..2a8981a --- /dev/null +++ b/Vector/i18n/hyw.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "ArmenBakkalian", + "Azniv Stepanian", + "Rajemian", + "Դավիթ Սարոյան", + "Սերգեյ Սաֆարյան" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 լեզու}}", + "vector-action-addsection": "Աւելցնել քննարկում", + "vector-action-delete": "Ջնջել", + "vector-action-move": "Տեղափոխել այս էջը", + "vector-action-protect": "Պահել", + "vector-view-create": "Ստեղծել", + "vector-view-edit": "Խմբագրել", + "vector-view-history": "Տեսնել պատմութիւնը", + "vector-view-view": "Կարդալ", + "vector-more-actions": "Աւելի" +} diff --git a/Vector/i18n/ia.json b/Vector/i18n/ia.json new file mode 100644 index 0000000..474de01 --- /dev/null +++ b/Vector/i18n/ia.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "McDutchie" + ] + }, + "vector-skin-desc": "Forni duo apparentias Vector:\n* 2011 - Le version moderne de MonoBook con aspecto rejuvenescite e multe meliorationes de usabilitate.\n* 2022 - Le apparentia Vector construite como parte del projecto WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Usar le version ancian de Vector", + "prefs-vector-enable-vector-1-help": "In le proxime annos nos va actualisar gradualmente le apparentia Vector. Il continua a esser possibile usar le version ancian de Vector (illo de decembre 2019). Pro leger plus sur le actualisationes, va a nostre [[mw:Reading/Web/Desktop_Improvements|pagina de projecto]].", + "vector-opt-out": "Cambiar al ancian apparentia", + "vector-opt-out-tooltip": "Cambiar tu parametros pro retornar al ancian aspecto del apparentia (Vector historic)", + "vector.css": "/* Tote CSS hic essera cargate pro le usatores del apparentia Vector */", + "vector.js": "/* Tote JavaScript hic essera cargate pro le usatores del apparentia Vector */", + "vector-action-toggle-sidebar": "Alternar barra lateral", + "vector-languages": "Linguas", + "vector-language-button-aria-label": "Leger un articulo in un altere lingua. Disponibile in $1 lingua{{PLURAL:$1||s}}.", + "vector-language-button-label": "{{PLURAL:$1|$1 lingua|$1 linguas}}", + "vector-no-language-button-label": "Adder linguas", + "vector-no-language-button-aria-label": "Iste articulo existe solmente in iste lingua. Adder le articulo pro altere linguas.", + "vector-language-redirect-to-top": "In iste {{SITENAME}} le ligamines a linguas se trova in le parte superior del pagina in facie del titulo del articulo. [[#p-lang-btn|Ir in alto]].", + "vector-language-variant-switcher-label": "Cambiar variante de lingua", + "vector-action-addsection": "Adder topico", + "vector-action-delete": "Deler", + "vector-action-move": "Renominar", + "vector-action-protect": "Proteger", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Cambiar protection", + "vector-view-create": "Crear", + "vector-view-edit": "Modificar", + "vector-view-history": "Vider historia", + "vector-view-view": "Leger", + "vector-view-viewsource": "Vider texto fonte", + "vector-jumptonavigation": "Saltar al navigation", + "vector-jumptosearch": "Saltar al recerca", + "vector-jumptocontent": "Saltar al contento", + "vector-more-actions": "Plus", + "vector-search-loader": "Cargante suggestiones de recerca", + "vector-searchsuggest-containing": "Cercar paginas que contine $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Contento", + "vector-toc-beginning": "Initio", + "vector-toc-toggle-button-label": "Alternar subsection $1", + "vector-anon-user-menu-pages": "Paginas pro redactores sin session aperte", + "vector-anon-user-menu-pages-learn": "leger plus", + "vector-anon-user-menu-pages-label": "Leger plus sur le modification", + "vector-main-menu-tooltip": "Menu principal", + "vector-toc-menu-tooltip": "Tabula de contento", + "vector-toc-collapsible-button-label": "Alternar le tabula de contento", + "vector-site-nav-label": "Sito", + "vector-main-menu-label": "Menu principal", + "vector-limited-width-toggle": "Alternar limitation de latitude de contento", + "vector-page-tools-label": "Instrumentos", + "vector-page-tools-general-label": "General", + "vector-page-tools-actions-label": "Actiones", + "vector-pin-element-label": "displaciar verso le barra lateral`", + "vector-unpin-element-label": "celar", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussion]]", + "tooltip-vector-anon-user-menu-title": "Plus optiones", + "vector-prefs-limited-width": "Activar le limitation de latitude", + "vector-prefs-limited-width-help": "Activar le limitation de latitude pro un experientia de lectura meliorate.", + "empty-language-selector-body": "Le contento del pagina non es supportate in altere linguas." +} diff --git a/Vector/i18n/ibb.json b/Vector/i18n/ibb.json new file mode 100644 index 0000000..ffb532b --- /dev/null +++ b/Vector/i18n/ibb.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Akpanufun", + "Anietie2", + "Okon Ibiono", + "Uduakj" + ] + }, + "vector-languages": "Ikọ", + "vector-no-language-button-label": "Dian usem", + "vector-action-addsection": "Dian iwod nwed", + "vector-action-delete": "Sịññe", + "vector-action-protect": "Beem", + "vector-view-history": "Se mkpo ini edem", + "vector-more-actions": "afen", + "vector-searchsuggest-containing": "Yem ikpa nwed anieghe $1", + "vector-unpin-element-label": "dịbe" +} diff --git a/Vector/i18n/id.json b/Vector/i18n/id.json new file mode 100644 index 0000000..389a834 --- /dev/null +++ b/Vector/i18n/id.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Agam Riyandana", + "Amire80", + "Arifin.wijaya", + "Bennylin", + "Daud I.F. Argana", + "Farras", + "Gombang", + "Iwan Novirion", + "Naufal06", + "Rachmat04", + "Rex", + "Veracious", + "William Surya Permana" + ] + }, + "skinname-vector": "Vektor", + "vector-skin-desc": "Menyediakan 2 kulit Vector:\n* 2011 - Versi Modern dari MonoBook dengan tampilan segar dan banyak peningkatan kegunaan.\n* 2022 - Vector yang dibangun sebagai bagian dari proyek [[mw:Desktop Improvements]] WMF.", + "prefs-vector-enable-vector-1-label": "Gunakan Vektor Warisan", + "prefs-vector-enable-vector-1-help": "Dalam beberapa tahun ke depan, kami akan memperbarui kulit Vektor secara bertahap. Vektor Warisan memungkinkan Anda untuk melihat-lihat dengan Vektor versi lama (per Desember 2019). Untuk mempelajari lebih lanjut tentang pembaruan ini, bukalah [[mw:Reading/Web/Desktop_Improvements|halaman proyek]] kami.", + "vector-opt-out": "Beralih ke tampilan lama", + "vector-opt-out-tooltip": "Ubah pengaturan Anda untuk kembali ke tampilan lama dari kulit ini (Vektor Warisan)", + "vector.css": "/* CSS yang ada di sini akan diterapkan pada kulit Vektor. */", + "vector.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */", + "vector-action-toggle-sidebar": "Buka/tutup bilah samping", + "vector-languages": "Bahasa", + "vector-language-button-aria-label": "Pergi ke artikel dalam bahasa lain. Terdapat {{PLURAL:$1|$1 bahasa}}", + "vector-language-button-label": "$1 bahasa", + "vector-no-language-button-label": "Tambah bahasa", + "vector-no-language-button-aria-label": "Artikel ini hanya tersedia dalam bahasa ini. Terjemahkan artikelnya ke dalam bahasa lain", + "vector-language-redirect-to-top": "Di {{SITENAME}} ini, pranala bahasa terletak di bagian atas halaman di sebelah judul artikel. [[#p-lang-btn|Pergi ke paling atas]].", + "vector-language-variant-switcher-label": "Ubah varian bahasa", + "vector-action-addsection": "Bagian baru", + "vector-action-delete": "Hapus", + "vector-action-move": "Pindahkan", + "vector-action-protect": "Lindungi", + "vector-action-undelete": "Pembatalan penghapusan", + "vector-action-unprotect": "Ubah perlindungan", + "vector-view-create": "Buat", + "vector-view-edit": "Sunting", + "vector-view-history": "Lihat riwayat", + "vector-view-view": "Baca", + "vector-view-viewsource": "Lihat sumber", + "vector-jumptonavigation": "Loncat ke navigasi", + "vector-jumptosearch": "Loncat ke pencarian", + "vector-jumptocontent": "Lompat ke isi", + "vector-more-actions": "Lainnya", + "vector-search-loader": "Memuat saran pencarian", + "vector-searchsuggest-containing": "Cari halaman yang berisi $1", + "vector-intro-page": "Help:Pengantar", + "vector-toc-label": "Daftar isi", + "vector-toc-beginning": "Awal", + "vector-anon-user-menu-pages": "Halaman penyunting yang telah keluar log", + "vector-anon-user-menu-pages-learn": "pelajari lebih lanjut", + "vector-anon-user-menu-pages-label": "Pelajari lebih lanjut tentang menyunting", + "vector-main-menu-tooltip": "Menu utama", + "vector-toc-menu-tooltip": "Daftar Isi", + "vector-site-nav-label": "Situs", + "vector-main-menu-label": "Menu utama", + "vector-page-tools-label": "Perkakas", + "vector-page-tools-general-label": "Umum", + "vector-page-tools-actions-label": "Tindakan", + "vector-pin-element-label": "pindah ke bilah sisi", + "vector-unpin-element-label": "sembunyikan", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskusi]]", + "tooltip-vector-anon-user-menu-title": "Opsi lainnya", + "vector-prefs-limited-width": "Aktifkan mode lebar terbatas", + "empty-language-selector-body": "Konten halaman tidak didukung dalam bahasa lain." +} diff --git a/Vector/i18n/ie.json b/Vector/i18n/ie.json new file mode 100644 index 0000000..d44c4fb --- /dev/null +++ b/Vector/i18n/ie.json @@ -0,0 +1,34 @@ +{ + "@metadata": { + "authors": [ + "Makuba", + "Renan", + "Stavanger7" + ] + }, + "vector-skin-desc": "Version modern del MonoBook che aspecte frisc e plu amelioramentes de usabilitá", + "prefs-vector-enable-vector-1-label": "Usar Legacy Vector", + "prefs-vector-enable-vector-1-help": "In proxim annus, noi va esser gradualmen actualisant li pelle Vector. Li Legacy Vector va permisser vu vider li version antiqui del Vector (quam Decembre 2019). Por aprender plu concernent li actualisationes, ea por nor [[mw:Reading/Web/Desktop_Improvements|págine del projecte]].", + "vector-opt-out": "Changear por version antiqui", + "vector-opt-out-tooltip": "Changear tui specificationes por restituer li antiqui aspecte del pelle (Vector anteriori)", + "vector.css": "/* CSS colocat ci va afectar usatores de pelle Vector */", + "vector.js": "/* Alquel JavaScript ci va esser cargat por usatores que usa li pelle Vector */", + "vector-action-toggle-sidebar": "Changear barre lateral", + "vector-language-button-label": "{{PLURAL:$1|$1 lingue|$1 lingues}}", + "vector-action-addsection": "Addir tema", + "vector-action-delete": "Deleter", + "vector-action-move": "Mover", + "vector-action-protect": "Protecter", + "vector-action-undelete": "Restituer", + "vector-action-unprotect": "Changear protection", + "vector-view-create": "Crear", + "vector-view-edit": "Redacter", + "vector-view-history": "Historico de versiones", + "vector-view-view": "Leer", + "vector-view-viewsource": "Vider fonte", + "vector-jumptonavigation": "Saltar por navigation", + "vector-jumptosearch": "Saltar por sercha", + "vector-jumptocontent": "Saltar por contenete", + "vector-more-actions": "Plu", + "vector-search-loader": "Cargar suggestiones de sercha" +} diff --git a/Vector/i18n/ig.json b/Vector/i18n/ig.json new file mode 100644 index 0000000..da485fc --- /dev/null +++ b/Vector/i18n/ig.json @@ -0,0 +1,34 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Edith Nwobu", + "Ifexin", + "Karen", + "Oby Ezeilo", + "Pasjoesscc", + "Timzy D'Great", + "Tochiprecious", + "Ukabia", + "Uzoma Ozurumba" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 asụsụ}}", + "vector-action-addsection": "Tinye isiokwu", + "vector-action-delete": "Kàcha", + "vector-action-move": "Papụ̀", + "vector-action-protect": "Cẹdolu", + "vector-action-undelete": "Á gbàkashikwà", + "vector-action-unprotect": "Nchẹdo mgbanwe", + "vector-view-create": "Kèe", + "vector-view-edit": "Dezie", + "vector-view-history": "Lèe onye rụrụ ọrụ a", + "vector-view-view": "Gụ̀ọ", + "vector-view-viewsource": "Lee ebeosi", + "vector-more-actions": "Ọzọ", + "vector-searchsuggest-containing": "Chọọ peeji ndị gụnyere $1", + "vector-toc-label": "Ndịna", + "vector-toc-toggle-button-label": "Chọba ndịnisiokwu $1", + "vector-pin-element-label": "Ga na nootu akụkụ", + "vector-unpin-element-label": "zoo" +} diff --git a/Vector/i18n/igl.json b/Vector/i18n/igl.json new file mode 100644 index 0000000..cc56414 --- /dev/null +++ b/Vector/i18n/igl.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "AgnesAbah", + "Amire80" + ] + }, + "vector-languages": "Amí ichí", + "vector-language-button-label": "{{PLURAL:$1|$1 íchi|$1 amí íchi}}", + "vector-no-language-button-label": "Dí amí ichí manwu", + "vector-action-addsection": "Dí óla manyu", + "vector-action-delete": "Dukwó", + "vector-action-move": "Tẹlo", + "vector-action-protect": "Dída", + "vector-view-create": "Nyí", + "vector-view-edit": "Nwọ́che", + "vector-view-history": "Gọ ọ́là īgbálá", + "vector-view-view": "Gbá", + "vector-more-actions": "Mànyú", + "vector-searchsuggest-containing": "Téné amí ogbá kí gwonwú $1", + "vector-toc-label": "Èyo ùkóló", + "vector-toc-beginning": "Uchane", + "vector-page-tools-label": "Amí ewñ ane", + "vector-page-tools-general-label": "Ochakadu", + "vector-unpin-element-label": "dúmája" +} diff --git a/Vector/i18n/ike-latn.json b/Vector/i18n/ike-latn.json new file mode 100644 index 0000000..78ab869 --- /dev/null +++ b/Vector/i18n/ike-latn.json @@ -0,0 +1,6 @@ +{ + "@metadata": { + "authors": [] + }, + "vector-view-edit": "Suqusiqpaa" +} diff --git a/Vector/i18n/ilo.json b/Vector/i18n/ilo.json new file mode 100644 index 0000000..ab4371d --- /dev/null +++ b/Vector/i18n/ilo.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Lam-ang", + "Saluyot" + ] + }, + "vector-skin-desc": "Moderno a bersion ti MonoBook nga addaan iti baro a langa ken adu kadagiti naserbi a panagpasayaat", + "vector-language-button-label": "{{PLURAL:$1|$1 a pagsasao|dagiti $1 a pagsasao}}", + "vector-action-addsection": "Agnayon iti topiko", + "vector-action-delete": "Ikkaten", + "vector-action-move": "Iyalis", + "vector-action-protect": "Salakniban", + "vector-action-undelete": "Isubli ti inikkat", + "vector-action-unprotect": "Baliwan ti salaknib", + "vector-view-create": "Agpartuat", + "vector-view-edit": "Urnosen", + "vector-view-history": "Kitaen ti pakasaritaan", + "vector-view-view": "Basaen", + "vector-view-viewsource": "Kitaen ti taudan", + "vector-jumptonavigation": "Darsen a mapan iti pagdaliasatan", + "vector-jumptosearch": "Darsen a mapan agbiruk", + "vector-more-actions": "Adu pay", + "vector-searchsuggest-containing": "Agbiruk kadagiti panid nga nga aglaon iti $1" +} diff --git a/Vector/i18n/inh.json b/Vector/i18n/inh.json new file mode 100644 index 0000000..74ea08a --- /dev/null +++ b/Vector/i18n/inh.json @@ -0,0 +1,38 @@ +{ + "@metadata": { + "authors": [ + "Adam-Yourist", + "Amire80", + "ElizaMag", + "Sapral Mikail", + "Умар" + ] + }, + "skinname-vector": "Вéктора", + "vector-languages": "Метташ", + "vector-language-button-label": "{{PLURAL:$1|$1 мотт}}", + "vector-no-language-button-label": "Метташ тӀатоха", + "vector-action-addsection": "Тема тӀатоха", + "vector-action-delete": "ДӀаяккха", + "vector-action-move": "ЦӀи хувца", + "vector-action-protect": "Лорае", + "vector-action-undelete": "Хьаметтаоттаде", + "vector-action-unprotect": "Лораяр хувца", + "vector-view-create": "Хьакхолла", + "vector-view-edit": "Тоаде", + "vector-view-history": "Хувцамаш", + "vector-view-view": "Де́ша", + "vector-view-viewsource": "Хьалххе бӀаргтохара разметкага хьажар", + "vector-more-actions": "Кхы а", + "vector-searchsuggest-containing": "$1 чулоацам бола оагӀонаш лахар", + "vector-toc-label": "Чулоацам", + "vector-toc-beginning": "Духь", + "vector-anon-user-menu-pages": "Авторизаци яь йоацача доакъашхошта йола оагӀонаш", + "vector-anon-user-menu-pages-learn": "дукхагӀа хá", + "vector-main-menu-tooltip": "Керттера меню", + "vector-main-menu-label": "Керттера меню", + "vector-page-tools-label": "Кечалаш", + "vector-page-tools-general-label": "Юкъара", + "vector-pin-element-label": "дехьаяккха аьттехьа", + "vector-unpin-element-label": "хьуладе" +} diff --git a/Vector/i18n/io.json b/Vector/i18n/io.json new file mode 100644 index 0000000..38f7ee8 --- /dev/null +++ b/Vector/i18n/io.json @@ -0,0 +1,49 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Joao Xavier", + "Lakaoso", + "Malafaya" + ] + }, + "skinname-vector": "Anciena modelo Vector (2010)", + "vector-skin-desc": "Furnisas du 2 posibla ''Vector skin'':\n* 2011 - La moderna versiono di ''MonoBook'' kun plusa resursi e plubonigi.\n* 2022 - La versiono ''Vector'' konstruktita kom parto dil projeto WMF [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Uzez Anciena modelo ''Vector'' (\"Legacy Vector\")", + "prefs-vector-enable-vector-1-help": "Dum la sequanta yari, ni gradope adoptos la vido-modelo ''Vector''. Legacy Vector permisos vu vidar l'anciena versiono di ''Vector'' (uzita til decembro 2019). Por savar pluse pri l'aktualigi, irez a [[mw:Reading/Web/Desktop_Improvements|nia pagino pri la projeto]].", + "vector-opt-out": "Chanjar al anciena aspekto", + "vector-opt-out-tooltip": "Modifikar vua ajusti por retroirar al ancien aspekto dil aspekto [''skin''] di la pagino (Anciena modelo Vector)", + "vector-languages": "Idiomi", + "vector-language-button-label": "{{PLURAL:$1|$1 Linguo|$1 Lingui}}", + "vector-no-language-button-label": "Adjuntez idiomi", + "vector-no-language-button-aria-label": "Ca artiklo existas nur en ca linguo. Ligez l'artiklo ad altra idiomi", + "vector-language-redirect-to-top": "En ca {{SITENAME}} la ligili ad altra idiomi esas en la supra parto di la pagino, an l'opozanta lokizo di lua titulo. [[#p-lang-btn|Irez adsupre]].", + "vector-language-variant-switcher-label": "Modifikar linguala varianto", + "vector-action-addsection": "Adjuntez temo", + "vector-action-delete": "Efacar", + "vector-action-move": "Movar", + "vector-action-protect": "Protektar", + "vector-action-undelete": "Rekuperar", + "vector-action-unprotect": "Chanjar protektado", + "vector-view-create": "Krear", + "vector-view-edit": "Redaktar", + "vector-view-history": "Kronologio", + "vector-view-view": "Lektar", + "vector-view-viewsource": "Vidar fonto", + "vector-jumptonavigation": "Irez a navigado", + "vector-jumptosearch": "Irez a serchilo", + "vector-jumptocontent": "Irez a kontenajo", + "vector-more-actions": "Pluse", + "vector-searchsuggest-containing": "Serchar pagini kontenanta $1", + "vector-toc-label": "Kontenajo", + "vector-toc-beginning": "Komenco dil artiklo", + "vector-anon-user-menu-pages": "Pagini por redakteri neenrejistrita", + "vector-anon-user-menu-pages-learn": "lernez pluse", + "vector-anon-user-menu-pages-label": "Savez pluse pri quale redaktar", + "vector-main-menu-tooltip": "Chef-menuo", + "vector-toc-menu-tooltip": "Kontenajo-tabelo", + "vector-page-tools-label": "Utensili", + "vector-page-tools-general-label": "Ordinara", + "vector-unpin-element-label": "celez", + "tooltip-vector-anon-user-menu-title": "Plusa selekti" +} diff --git a/Vector/i18n/is.json b/Vector/i18n/is.json new file mode 100644 index 0000000..99b17b3 --- /dev/null +++ b/Vector/i18n/is.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Friðrik Bragi Dýrfjörð", + "Maxí", + "Snævar", + "Sveinki", + "Sveinn í Felli", + "Ævar Arnfjörð Bjarmason" + ] + }, + "skinname-vector": "Vektor", + "vector-skin-desc": "Kemur með tvö Vector-þemu:\n* 2011 - Nútímaútgáfan af MonoBook með fersku útliti og einfaldara í notkun.\n* 2022 - Vector-útgáfan sem var gerð sem hluti af WMF [[mw:Desktop Improvements]] verkefninu.", + "prefs-vector-enable-vector-1-label": "Nota eldra Vector-skinn", + "prefs-vector-enable-vector-1-help": "Á næstu árum munum við smátt og smátt uppfæra Vector-skinnið. Eldra Vector-skinn mun gera þér kleift að sjá eldri útgáfu Vector (eins og hún var í desember 2019). Til að sjá meira um þessar uppfærslur, geturðu farið á [[mw:Reading/Web/Desktop_Improvements|verkefnissíðuna]].", + "vector-opt-out": "Skipta yfir í gamla útlitið", + "vector-opt-out-tooltip": "Breyta stillingunum mínum til að fara aftur í eldra útlit þema (gamla Vektor)", + "vector.css": "/* Allt CSS sem sett er hér mun hafa áhrif á alla notendur Vektor-skinnsins. */", + "vector.js": "/* Allt JavaScript sem sett er hér mun hafa áhrif á notendur Vektor-skinnsins. */", + "vector-action-toggle-sidebar": "Víxla hliðarstiku af/á", + "vector-languages": "Tungumál", + "vector-language-button-aria-label": "Fara á grein á öðru tungumáli. Til staðar á {{PLURAL:$1|$1 tungumáli|$1 tungumálum}}", + "vector-language-button-label": "{{PLURAL:$1|$1 tungumál}}", + "vector-no-language-button-label": "Bæta við tungumálum", + "vector-no-language-button-aria-label": "Þessi grein er bara til á þessu tungumáli. Búðu til grein á öðru tungumáli", + "vector-language-redirect-to-top": "Á þessari {{SITENAME}} eru tungumálatenglarnir efst á síðunni hinum megin við greinartitilinn. [[#p-lang-btn|Go to top]].", + "vector-language-variant-switcher-label": "Breyta tungumálaafbrigði", + "vector-action-addsection": "Bæta við umræðu", + "vector-action-delete": "Eyða", + "vector-action-move": "Færa", + "vector-action-protect": "Vernda", + "vector-action-undelete": "Hætta við eyðingu", + "vector-action-unprotect": "Breyta verndunarstigi", + "vector-view-create": "Útbúa", + "vector-view-edit": "Breyta", + "vector-view-history": "Breytingaskrá", + "vector-view-view": "Lesa", + "vector-view-viewsource": "Sýna frumkóða", + "vector-jumptonavigation": "Fara í flakk", + "vector-jumptosearch": "Fara í leit", + "vector-jumptocontent": "Fara í innihald", + "vector-more-actions": "Meira", + "vector-search-loader": "Hleð inn leitar uppástungum", + "vector-searchsuggest-containing": "Leita að síðum sem innihalda $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Efni", + "vector-toc-beginning": "Byrjun", + "vector-toc-toggle-button-label": "Sýna/fela $1 undirkafla", + "vector-anon-user-menu-pages": "Síður fyrir útskráða notendur", + "vector-anon-user-menu-pages-learn": "Læra meira", + "vector-anon-user-menu-pages-label": "Læra meira um breytingar", + "vector-main-menu-tooltip": "Aðalvalmynd", + "vector-toc-menu-tooltip": "Efnisyfirlit", + "vector-toc-collapsible-button-label": "Sýna/fela efnisyfirlit", + "vector-site-nav-label": "Vefsíða", + "vector-page-tools-label": "Verkfæri", + "vector-page-tools-general-label": "Almennt", + "vector-pin-element-label": "færa í hliðarstiku", + "vector-unpin-element-label": "fela", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussion]]", + "tooltip-vector-anon-user-menu-title": "Frekari valkostir", + "vector-prefs-limited-width": "Virkja ham takmarkaðar breiddar", + "vector-prefs-limited-width-help": "Virkja ham takmarkaðrar breiddar fyrir betri lestarupplifun." +} diff --git a/Vector/i18n/ish.json b/Vector/i18n/ish.json new file mode 100644 index 0000000..4586ea4 --- /dev/null +++ b/Vector/i18n/ish.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Hackesan" + ] + }, + "vector-view-view": "Tiè" +} diff --git a/Vector/i18n/it.json b/Vector/i18n/it.json new file mode 100644 index 0000000..730d60c --- /dev/null +++ b/Vector/i18n/it.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "Ajeje Brazorf", + "Amire80", + "Beta16", + "Darth Kule", + "Elitre", + "FRacco", + "Gianfranco", + "GpieroMW", + "Melos", + "Patafisik WMF", + "Pierpao", + "Pietrodn", + "Sakretsu", + "Scompo", + "ValterVB" + ] + }, + "vector-skin-desc": "Fornisce 2 temi Vector\n* 2011 - La versione moderna del MonoBook con un aspetto rinnovato e molti miglioramenti dell'usabilità\n* 2022 - Vector realizzata nell'ambito del progetto WMF [[mw:Desktop Improvements]]", + "prefs-vector-enable-vector-1-label": "Usa Legacy Vector", + "prefs-vector-enable-vector-1-help": "Nei prossimi anni aggiorneremo gradualmente il tema Vector. Legacy Vector ti permetterà di visualizzare la vecchia versione di Vector (risalente al dicembre 2019). Per scoprirne di più sulle novità, visita la nostra [[mw:Reading/Web/Desktop_Improvements|pagina del progetto]].", + "vector-opt-out": "Torna al vecchio aspetto", + "vector-opt-out-tooltip": "Cambia le tue impostazioni per ritornare alla visualizzazione della skin precedente (legacy Vector)", + "vector.css": "/* Gli stili CSS inseriti qui vengono caricati dagli utenti che usano il tema Vector */", + "vector.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano il tema Vector */", + "vector-action-toggle-sidebar": "Attiva/disattiva la barra laterale", + "vector-languages": "Lingue", + "vector-language-button-aria-label": "Vai a una voce in un'altra lingua. Disponibile in {{PLURAL:$1|$1 lingua|$1 lingue}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lingua|$1 lingue}}", + "vector-no-language-button-label": "Aggiungi lingue", + "vector-no-language-button-aria-label": "Questa voce esiste solo in questa lingua. Aggiungi la voce per altre lingue", + "vector-language-redirect-to-top": "Su questa {{SITENAME}} gli interlink sono in cima alla pagina a destra del titolo. [[#p-lang-btn|Vai in cima]].", + "vector-language-variant-switcher-label": "Cambia versione linguistica", + "vector-action-addsection": "Aggiungi argomento", + "vector-action-delete": "Cancella", + "vector-action-move": "Sposta", + "vector-action-protect": "Proteggi", + "vector-action-undelete": "Ripristina", + "vector-action-unprotect": "Cambia la protezione", + "vector-view-create": "Crea", + "vector-view-edit": "Modifica", + "vector-view-history": "Cronologia", + "vector-view-view": "Leggi", + "vector-view-viewsource": "Visualizza wikitesto", + "vector-jumptonavigation": "Vai alla navigazione", + "vector-jumptosearch": "Vai alla ricerca", + "vector-jumptocontent": "Vai al contenuto", + "vector-more-actions": "Altro", + "vector-search-loader": "Carica suggerimenti per la ricerca", + "vector-searchsuggest-containing": "Cerca le pagine che contengono $1", + "vector-intro-page": "Help:Introduzione", + "vector-toc-label": "Indice", + "vector-toc-beginning": "Inizio", + "vector-toc-toggle-button-label": "Attiva/disattiva la sottosezione $1", + "vector-anon-user-menu-pages": "Pagine per utenti anonimi", + "vector-anon-user-menu-pages-learn": "ulteriori informazioni", + "vector-main-menu-tooltip": "Menu principale", + "vector-toc-menu-tooltip": "Indice", + "vector-site-nav-label": "Sito", + "vector-main-menu-label": "Menu principale", + "vector-page-tools-label": "Strumenti", + "vector-page-tools-general-label": "Generale", + "vector-page-tools-actions-label": "Azioni", + "vector-pin-element-label": "sposta nella barra laterale", + "vector-unpin-element-label": "nascondi", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussione]]", + "tooltip-vector-anon-user-menu-title": "Altre opzioni", + "vector-prefs-limited-width": "Abilita la modalità con larghezza limitata", + "vector-prefs-limited-width-help": "Abilita la modalità con larghezza limitata per migliorare l'esperienza di lettura.", + "empty-language-selector-body": "Contenuti della pagina non supportati in altre lingue." +} diff --git a/Vector/i18n/izh.json b/Vector/i18n/izh.json new file mode 100644 index 0000000..26b11ef --- /dev/null +++ b/Vector/i18n/izh.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Aig mest ei varasta", + "Thadh" + ] + }, + "vector-action-protect": "Hoitaa", + "vector-view-view": "Lukkiia" +} diff --git a/Vector/i18n/ja.json b/Vector/i18n/ja.json new file mode 100644 index 0000000..bd54af0 --- /dev/null +++ b/Vector/i18n/ja.json @@ -0,0 +1,88 @@ +{ + "@metadata": { + "authors": [ + "A2y4", + "Amire80", + "Foomin10", + "Fryed-peach", + "Jaw Salvager", + "Kkairri", + "Kokage si", + "LNDDYL", + "Marine-Blue", + "MathXplore", + "MirukuPC", + "Omotecho", + "Otokoume", + "Penn Station", + "RYOUMA1117", + "Shirayuki", + "Sou0012", + "Takot", + "Tmv", + "Whym", + "Yusuke1109", + "しぃ", + "ひまり", + "春春眠眠", + "青子守歌" + ] + }, + "skinname-vector": "レガシー ベクター (2010年版)", + "skinname-vector-2022": "ベクター (2022年版)", + "vector-skin-desc": "2種類のVectorスキン(外装)を提供します。\n* 2011年版 - MonoBookのモダンバージョンで、新しい外観と多くのユーザビリティの向上が図られています。\n* 2022年版 - ウィキメディア財団による [[mw:Desktop Improvements|デスクトップ版改善]]プロジェクトの一環として作られました。", + "prefs-vector-enable-vector-1-label": "レガシーベクター外装を使用する", + "prefs-vector-enable-vector-1-help": "今後数年にわたり、Vectorスキンを徐々に更新していく予定です。Legacy Vectorでは、(2019年12月時点の) 古いVector外装を表示できます。アップデートについての詳細は、[[mw:Reading/Web/Desktop_Improvements|プロジェクトページ]]をご覧ください。", + "vector-opt-out": "以前の外観に切り替え", + "vector-opt-out-tooltip": "設定を変更して、昔の外装 (以前のVector) の外観に戻します", + "vector.css": "/* ここに記述したCSSは、Vectorスキンの利用者全てに読み込まれます */", + "vector.js": "/* ここに記述したJavaScriptは、Vectorスキンの利用者全てに読み込まれます */", + "vector-action-toggle-sidebar": "サイドバーの切り替え", + "vector-languages": "言語", + "vector-language-button-aria-label": "特定の記事の別の言語版に移動します。 {{PLURAL:$1|利用可能な言語$1件}}", + "vector-language-button-label": "{{PLURAL:$1|$1の言語版}}", + "vector-no-language-button-label": "言語を追加", + "vector-no-language-button-aria-label": "この記事はこの言語にのみ存在します。他の言語のための記事を追加", + "vector-language-redirect-to-top": "この{{SITENAME}}では言語間リンクがページの先頭にある記事タイトルの向かい側に設置されています。[[#p-lang-btn|ページの先頭をご覧ください]]。", + "vector-language-variant-switcher-label": "別の言語に切り替える", + "vector-action-addsection": "話題追加", + "vector-action-delete": "削除", + "vector-action-move": "移動", + "vector-action-protect": "保護", + "vector-action-undelete": "復元", + "vector-action-unprotect": "保護再設定", + "vector-view-create": "作成", + "vector-view-edit": "編集", + "vector-view-history": "履歴表示", + "vector-view-view": "閲覧", + "vector-view-viewsource": "ソースを閲覧", + "vector-jumptonavigation": "ナビゲーションに移動", + "vector-jumptosearch": "検索に移動", + "vector-jumptocontent": "コンテンツにスキップ", + "vector-more-actions": "その他", + "vector-search-loader": "検索候補を読み込んでいます", + "vector-searchsuggest-containing": "$1を含むページを検索する", + "vector-intro-page": "Help:はじめに", + "vector-toc-label": "目次", + "vector-toc-beginning": "ページ先頭", + "vector-toc-toggle-button-label": "$1サブセクションを切り替えます", + "vector-anon-user-menu-pages": "ログアウトした編集者のページ", + "vector-anon-user-menu-pages-learn": "もっと詳しく", + "vector-anon-user-menu-pages-label": "編集の詳細", + "vector-main-menu-tooltip": "メインメニュー", + "vector-toc-menu-tooltip": "目次", + "vector-toc-collapsible-button-label": "目次の表示・非表示を切り替え", + "vector-site-nav-label": "サイト", + "vector-main-menu-label": "メインメニュー", + "vector-limited-width-toggle": "本文の横幅制限を有効化/無効化", + "vector-page-tools-label": "ツール", + "vector-page-tools-general-label": "全般", + "vector-page-tools-actions-label": "操作", + "vector-pin-element-label": "サイドバーに移動", + "vector-unpin-element-label": "非表示", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|議論]]", + "tooltip-vector-anon-user-menu-title": "その他の操作", + "vector-prefs-limited-width": "横幅制限モードを有効にする", + "vector-prefs-limited-width-help": "横幅制限モードを有効にすることで文章の可読性が向上します。", + "empty-language-selector-body": "ページのコンテンツが他言語でサポートされていません。" +} diff --git a/Vector/i18n/jam.json b/Vector/i18n/jam.json new file mode 100644 index 0000000..9d6da60 --- /dev/null +++ b/Vector/i18n/jam.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Dentonius", + "Hazard-SJ", + "Katxis", + "Yocahuna" + ] + }, + "vector-action-addsection": "Add on one nex' topic", + "vector-action-delete": "Diliit", + "vector-action-move": "Muuv", + "vector-action-protect": "Protek", + "vector-action-undelete": "Andiliit", + "vector-action-unprotect": "Neu protektian", + "vector-view-create": "Mek", + "vector-view-edit": "Change up", + "vector-view-history": "Pree di change dem", + "vector-view-view": "Read", + "vector-view-viewsource": "Vyuu Suos", + "vector-more-actions": "More" +} diff --git a/Vector/i18n/jbo.json b/Vector/i18n/jbo.json new file mode 100644 index 0000000..eff38c4 --- /dev/null +++ b/Vector/i18n/jbo.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Gleki" + ] + }, + "skinname-vector": "la vektor", + "vector-skin-desc": "cabna versiio la monobuk i vifne tarmi i so'i da nu xamgu zenba", + "vector-action-addsection": "jmina lo se casnu pagbu", + "vector-action-delete": "vimcu", + "vector-action-move": "stika lo cmene", + "vector-action-protect": "co'a bandu", + "vector-action-undelete": "ca'o nai vimcu", + "vector-action-unprotect": "co'u bandu", + "vector-view-create": "zbasu", + "vector-view-edit": "stika", + "vector-view-history": "citri lo papri", + "vector-view-view": "tcidu", + "vector-view-viewsource": "cpacu lo krasi", + "vector-more-actions": "ji'a" +} diff --git a/Vector/i18n/jje.json b/Vector/i18n/jje.json new file mode 100644 index 0000000..2b59938 --- /dev/null +++ b/Vector/i18n/jje.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "고솜" + ] + }, + "vector-action-addsection": "새 이왁거리", + "vector-action-delete": "밀기", + "vector-action-move": "웽기기", + "vector-action-protect": "ᄌᆞᆼ그기", + "vector-view-create": "멩글기", + "vector-view-edit": "바꼬기", + "vector-view-history": "이력 베리기", + "vector-view-view": "익기", + "vector-more-actions": "더 베리기" +} diff --git a/Vector/i18n/jut.json b/Vector/i18n/jut.json new file mode 100644 index 0000000..fd7c736 --- /dev/null +++ b/Vector/i18n/jut.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Ghiutun", + "Jyllanj" + ] + }, + "vector-action-addsection": "Ny emn", + "vector-action-move": "Flytt", + "vector-action-protect": "Beskøtt", + "vector-view-create": "Oprett", + "vector-view-edit": "Redigiir", + "vector-view-history": "Sie historik", + "vector-view-view": "Läs", + "vector-more-actions": "Mier" +} diff --git a/Vector/i18n/jv.json b/Vector/i18n/jv.json new file mode 100644 index 0000000..32deff3 --- /dev/null +++ b/Vector/i18n/jv.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bennylin", + "Naufal06", + "NoiX180", + "Pras", + "Sumbukompor" + ] + }, + "skinname-vector": "Vèktor (2010)", + "skinname-vector-2022": "Vèktor (2022)", + "vector-specialversion-name": "Vèktor", + "vector-skin-desc": "Nyepakaké 2 ules Vèktor:\n* 2011 - Vèrsi modhèren Vèktor dhedhasar MonoBuku kanthi praupan seger lan manéka owahan anyar sing migunani.\n* 2022 - Vèktor kang winangun minangka péranganing proyèk [[mw:Desktop Improvements]] WMF.", + "prefs-vector-enable-vector-1-label": "Anggo Vector Baku", + "vector-opt-out": "Bali menyang pakulitan lawas", + "vector-opt-out-tooltip": "Owahi setèlanmu saperlu bali menyang pakulitan lawas (Vector Baku)", + "vector.css": "/* Kabèh CSS ing kéné bakal dimot kanggo naraguna ules Vèktor */", + "vector.js": "/* Kabèh JavaScript ing kéné bakal dimot kanggo naraguna ules Vèktor */", + "vector-languages": "Basa", + "vector-language-button-aria-label": "Ngalih menyang artikel jroning basa liya. Ana {{PLURAL:$1|$1|$1 basa}}", + "vector-language-button-label": "$1 basa", + "vector-no-language-button-label": "Tambah basa", + "vector-no-language-button-aria-label": "Artikel iki mung ana ing basa iki. Pertal artikelé menyang basa liya", + "vector-language-redirect-to-top": "Ing {{SITENAME}} iki, pranala basa kapernah ing pérangan ndhuwur kaca nuli ing sisihing irah-irahan artikel. [[#p-lang-btn|Menyang ndhuwur]].", + "vector-language-variant-switcher-label": "Owahi werna basa", + "vector-action-addsection": "Tambah rembug", + "vector-action-delete": "Busak", + "vector-action-move": "Lih", + "vector-action-protect": "Reksa", + "vector-action-undelete": "Wurung busak", + "vector-action-unprotect": "Owahi rereksan", + "vector-view-create": "Gawé", + "vector-view-edit": "Besut", + "vector-view-history": "Deleng sajarah", + "vector-view-view": "Waca", + "vector-view-viewsource": "Deleng sumber", + "vector-jumptonavigation": "Menyang navigasi", + "vector-jumptosearch": "Menyang panggolèkan", + "vector-jumptocontent": "Menyang kontèn", + "vector-more-actions": "Liyané", + "vector-search-loader": "Ngemot pamrayoganing panggolèk", + "vector-searchsuggest-containing": "Golèk kaca sing nduwèni ukara $1", + "vector-intro-page": "Wikipédia:Sugeng_rawuh", + "vector-toc-label": "Pratélaning isi", + "vector-toc-beginning": "Wiwitan", + "vector-anon-user-menu-pages": "Kaca pambesut kang metu log", + "vector-anon-user-menu-pages-learn": "sinaoni candhaké", + "vector-anon-user-menu-pages-label": "Sinaoni luwih jangkep babagan pambesutan", + "vector-main-menu-tooltip": "Menu pokok", + "vector-toc-menu-tooltip": "Pratélan Isi", + "vector-site-nav-label": "Situs", + "vector-page-tools-label": "Piranti", + "vector-pin-element-label": "lih menyang wilah sisih", + "vector-unpin-element-label": "dhelikaké", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Parembugan]]", + "tooltip-vector-anon-user-menu-title": "Pilihan liya" +} diff --git a/Vector/i18n/ka.json b/Vector/i18n/ka.json new file mode 100644 index 0000000..df2d8bb --- /dev/null +++ b/Vector/i18n/ka.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Alsandro", + "Amire80", + "David1010", + "გიორგიმელა", + "Გიო ოქრო", + "Იო ოქრო" + ] + }, + "skinname-vector": "ვექტორული (2010)", + "skinname-vector-2022": "ვექტორული (2022)", + "vector-specialversion-name": "ვექტორული", + "vector-skin-desc": "ითვალისწინებს 2 ვექტორულ იერსახეს:\n* 2011 — მონობუკის თანამედროვე ვერსია სრულად ახალი იერითა და მრავალი გამოყენებადი გაუმჯობესებით.\n* 2022 — ვექტორული იერსახე, რომელიც ფონდი ვიკიმედიის პროექტის „[[mw:Desktop Improvements|Desktop Improvements]]“ ფარგლებში შეიქმნა.", + "prefs-vector-enable-vector-1-label": "Legacy Vector-ის გამოყენება", + "prefs-vector-enable-vector-1-help": "მომდევნო რამდენიმე წელში ჩვენ თანდათან ვანახლებთ ვექტორულ გარეკანს. Legacy Vector ძველი იერსახის აღდგენის შესაძლებლობას მოგცემთ (2019 წლის დეკემბრის მდგომარეობით). განახლებებზე მეტის გასაგებად, ეწვიეთ [[mw:Reading/Web/Desktop_Improvements|პროექტის გვერდს]].", + "vector-opt-out": "ძველი იერსახის აღდგენა", + "vector-opt-out-tooltip": "შეცვალეთ თქვენი კონფიგურაცია, რათა დაუბრუნდეთ გვერდების ძველ იერსახეს", + "vector.css": "/* აქ მოცემული ყველა CSS ჩაიტვირთება ვექტორული გარეკანის ყველა მომხმარებლისათვის */", + "vector.js": "/* აქ მოცემული ყველა JavaScript ჩაიტვირთება ვექტორული გარეკანის ყველა მომხმარებლისათვის */", + "vector-action-toggle-sidebar": "გვერდითა პანელის გადართვა", + "vector-languages": "ენები", + "vector-language-button-aria-label": "სხვაენოვან სტატიაზე გადასვლა. ხელმისაწვდომია {{PLURAL:$1|$1 ენაზე}}", + "vector-language-button-label": "{{PLURAL:$1|$1 ენა}}", + "vector-no-language-button-label": "ენების დამატება", + "vector-no-language-button-aria-label": "ეს სტატია მხოლოდ ამ ენაზე არსებობს. დაამატეთ სტატია სხვა ენებისთვის", + "vector-language-redirect-to-top": "ამ საიტზე სხვა ენების ბმულები მოცემულია გვერდის დასაწყისში, სათაურის გასწვრივ. [[#p-lang-btn|დასაწყისთან გადასვლა]].", + "vector-language-variant-switcher-label": "ენის ვარიანტის შეცვლა", + "vector-action-addsection": "თემის ჩამატება", + "vector-action-delete": "წაშლა", + "vector-action-move": "გადატანა", + "vector-action-protect": "დაცვა", + "vector-action-undelete": "აღდგენა", + "vector-action-unprotect": "დაცვის შეცვლა", + "vector-view-create": "შექმნა", + "vector-view-edit": "რედაქტირება", + "vector-view-history": "ისტორია", + "vector-view-view": "შემოწმებული სტატია", + "vector-view-viewsource": "წყაროს ხილვა", + "vector-jumptonavigation": "ნავიგაციაზე გადასვლა", + "vector-jumptosearch": "ძიებაზე გადასვლა", + "vector-jumptocontent": "შინაარსზე გადასვლა", + "vector-more-actions": "მეტი", + "vector-search-loader": "იტვირთვება ძიების შეთავაზებები", + "vector-searchsuggest-containing": "იმ გვერდების მოძებნა, რომლებიც შეიცავენ $1-ს", + "vector-intro-page": "ვიკიპედია:კეთილი იყოს თქვენი მობრძანება", + "vector-toc-label": "სარჩევი", + "vector-toc-beginning": "შესავალი", + "vector-toc-toggle-button-label": "სექცია „$1“-ის გაშლა/ჩაკეცვა", + "vector-anon-user-menu-pages": "გვერდები სისტემიდან გამოსული რედაქტორებისათვის", + "vector-anon-user-menu-pages-learn": "გაიგეთ მეტი", + "vector-anon-user-menu-pages-label": "რედაქტირების შესახებ მეტის გაგება", + "vector-main-menu-tooltip": "მთავარი მენიუ", + "vector-toc-menu-tooltip": "სარჩევი", + "vector-toc-collapsible-button-label": "სარჩევის დამალვა/ჩვენება", + "vector-site-nav-label": "საიტი", + "vector-main-menu-label": "მთავარი მენიუ", + "vector-page-tools-label": "ხელსაწყოები", + "vector-page-tools-general-label": "ძირითადი", + "vector-page-tools-actions-label": "მოქმედებები", + "vector-pin-element-label": "გადატანა გვერდით ზოლზე", + "vector-unpin-element-label": "დამალვა", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|დისკუსია]]", + "tooltip-vector-anon-user-menu-title": "მეტი შესაძლებლობა", + "vector-prefs-limited-width": "შეზღუდული სიგანის რეჟიმის ჩართვა", + "vector-prefs-limited-width-help": "ჩართეთ შეზღუდული სიგანის რეჟიმი გაუმჯობესებული კითხვის ხედის ცდისთვის." +} diff --git a/Vector/i18n/kaa.json b/Vector/i18n/kaa.json new file mode 100644 index 0000000..bdbdc3d --- /dev/null +++ b/Vector/i18n/kaa.json @@ -0,0 +1,53 @@ +{ + "@metadata": { + "authors": [ + "Ajiniyaz Nurniyazov", + "Atabek", + "Nurlan" + ] + }, + "skinname-vector": "Vektor, eski (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "prefs-vector-enable-vector-1-label": "Eski Vektordan paydalanıw", + "vector-opt-out": "Eski kóriniske almastırıw", + "vector-opt-out-tooltip": "Skinniń burınǵı kórinisine (eski Vectorǵa) qaytıw ushın sazlamalardı ózgertiw", + "vector-languages": "Tiller", + "vector-language-button-label": "{{PLURAL:$1|$1 til}}", + "vector-no-language-button-label": "Tillerdi qosıw", + "vector-language-redirect-to-top": "Bul {{SITENAME}}da til siltemeleri bettiń joqarǵı bóleginde, maqala atınıń oń tárepinde jaylasqan. [[#p-lang-btn|Joqarıǵa ótiw]].", + "vector-action-addsection": "Tema qosıw", + "vector-action-delete": "Óshiriw", + "vector-action-move": "Kóshiriw", + "vector-action-protect": "Qorǵaw", + "vector-action-undelete": "Qayta tiklew", + "vector-action-unprotect": "Qorǵawdı ózgertiw", + "vector-view-create": "Jaratıw", + "vector-view-edit": "Redaktorlaw", + "vector-view-history": "Tariyxın kóriw", + "vector-view-view": "Oqıw", + "vector-view-viewsource": "Kodın kóriw", + "vector-jumptonavigation": "Navigaciyaǵa ótiw", + "vector-jumptosearch": "Izlewge ótiw", + "vector-jumptocontent": "Kontentke ótiw", + "vector-more-actions": "Jáne", + "vector-search-loader": "Izlew usınısları júklenbekte", + "vector-searchsuggest-containing": "$1 tekstin óz ishine alǵan betlerdi izlew", + "vector-intro-page": "Járdem:Xosh keldińiz", + "vector-toc-label": "Mazmunı", + "vector-toc-beginning": "Kirisiw", + "vector-anon-user-menu-pages": "Shıǵıwdı ámelge asırǵan redaktorlawshılar ushın betler", + "vector-anon-user-menu-pages-learn": "tolıq maǵlıwmat", + "vector-toc-menu-tooltip": "Mazmunı", + "vector-main-menu-label": "Bas menyu", + "vector-page-tools-label": "Ásbaplar", + "vector-page-tools-general-label": "Ulıwma", + "vector-page-tools-actions-label": "Háreketler", + "vector-pin-element-label": "qaptal panelge kóshiriw", + "vector-unpin-element-label": "jasırıw", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Talqılaw]]", + "tooltip-vector-anon-user-menu-title": "Kóbirek opciyalar", + "vector-prefs-limited-width": "Shekli en rejimin qosıw", + "vector-prefs-limited-width-help": "Oqıw kónlikpesin jaqsılaw ushın shekli en rejimin qosıw.", + "empty-language-selector-body": "Basqa tillerde kórsetiw funkciyası bul bet ushın islemeydi." +} diff --git a/Vector/i18n/kab.json b/Vector/i18n/kab.json new file mode 100644 index 0000000..f4b1379 --- /dev/null +++ b/Vector/i18n/kab.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Belkacem77", + "Mmistmurt", + "YouvaDjouadi" + ] + }, + "vector-skin-desc": "Lqem atrar n MonoBook s wudem ilemẓi akked ddeqs n usnerni ucbiḥ", + "vector-action-addsection": "Rnu-d asentel", + "vector-action-delete": "Mḥu", + "vector-action-move": "Snifel isem", + "vector-action-protect": "Mmesten", + "vector-action-undelete": "Uɣaled", + "vector-action-unprotect": "Beddel amesten", + "vector-view-create": "Rnu", + "vector-view-edit": "Ẓreg", + "vector-view-history": "Wali amazray", + "vector-view-view": "Ɣeṛ", + "vector-view-viewsource": "Ẓer aɣbalu", + "vector-more-actions": "Ugar" +} diff --git a/Vector/i18n/kbd-cyrl.json b/Vector/i18n/kbd-cyrl.json new file mode 100644 index 0000000..6888325 --- /dev/null +++ b/Vector/i18n/kbd-cyrl.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Bogups", + "Rhdtranslate", + "Тамэ Балъкъэрхэ" + ] + }, + "vector-languages": "Бзэхэр", + "vector-language-button-label": "‎{{PLURAL:$1|$1 бзэр|$1 бзэхэр}}", + "vector-no-language-button-label": "Бзэхэр щӀыгъун", + "vector-action-addsection": "Темэр хэлъхьэн", + "vector-action-delete": "ИгъэкӀын", + "vector-action-move": "‎ЦӀэр хъуэжын", + "vector-action-protect": "Хъумэн", + "vector-action-undelete": "ЗыфӀэгъэувэжын", + "vector-action-unprotect": "Хъумэныр техыжын", + "vector-view-create": "ЩӀын", + "vector-view-edit": "Зэгъэзэхуэжын", + "vector-view-history": "Тхыдэм еплъын", + "vector-view-view": "Еджэн", + "vector-view-viewsource": "КъызхэкӀам еплъын", + "vector-more-actions": "Нэхъыбэу", + "vector-searchsuggest-containing": " $1 иту напэкӀуэцӀ лъыхъуэн", + "vector-page-tools-label": "Ӏэмэпсымэхэр", + "vector-page-tools-general-label": "Зэдайр", + "vector-unpin-element-label": "гъэпщкӀун" +} diff --git a/Vector/i18n/kbp.json b/Vector/i18n/kbp.json new file mode 100644 index 0000000..85388de --- /dev/null +++ b/Vector/i18n/kbp.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Gnangbade" + ] + }, + "vector-action-addsection": "Sɔɔzɩ tɔm natʋyʋ", + "vector-action-move": "Kɛzɩ", + "vector-view-create": "Lɩzɩ", + "vector-view-edit": "Ñɔɔzɩ", + "vector-view-history": "Caanaʋ tɔm kɛdʋʋ", + "vector-view-view": "Kalɩ", + "vector-more-actions": "Sɔzʋʋ" +} diff --git a/Vector/i18n/kcg.json b/Vector/i18n/kcg.json new file mode 100644 index 0000000..160a822 --- /dev/null +++ b/Vector/i18n/kcg.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Kambai Akau" + ] + }, + "vector-languages": "Lilyem", + "vector-language-button-label": "{{PLURAL:$1|a̱lyem $1|lilyem $1}}", + "vector-no-language-button-label": "Mbeang lilyem", + "vector-action-addsection": "Mbeang a̱pyia̱ a̱lyiat", + "vector-action-delete": "Ti̱n", + "vector-action-move": "Shyei", + "vector-action-protect": "Cam", + "vector-view-create": "Khwuk", + "vector-view-edit": "Jhyuk", + "vector-view-history": "Nwuan nkhang", + "vector-view-view": "Fang", + "vector-more-actions": "Nkyang njhyang", + "vector-searchsuggest-containing": "Zop ngwat na̱ byia̱ $1", + "vector-anon-user-menu-pages-learn": "myiam nkyang jhyang", + "vector-anon-user-menu-pages-label": "Myiam nkyang jhyang tazwa jhyuk", + "vector-main-menu-tooltip": "A̱tsak meniu", + "vector-toc-menu-tooltip": "A̱tyii Nkyangmami", + "vector-page-tools-label": "Nkyangta̱m", + "vector-page-tools-general-label": "Kuzangka̱i", + "vector-unpin-element-label": "ta̱kup" +} diff --git a/Vector/i18n/kck.json b/Vector/i18n/kck.json new file mode 100644 index 0000000..12f1d71 --- /dev/null +++ b/Vector/i18n/kck.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "MthulisiNcube" + ] + }, + "vector-pin-element-label": "sodzedza musayidi bha", + "vector-unpin-element-label": "sumbika" +} diff --git a/Vector/i18n/kea.json b/Vector/i18n/kea.json new file mode 100644 index 0000000..b0858ae --- /dev/null +++ b/Vector/i18n/kea.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Quintino Lopes Castro Tavares", + "Waldir", + "Waldyrious", + "Amire80" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 língua}}", + "vector-action-addsection": "Adisiona tópiku", + "vector-action-delete": "Paga", + "vector-action-protect": "Proteji", + "vector-view-create": "Kria", + "vector-view-edit": "Muda", + "vector-view-history": "Odja istóriku", + "vector-view-view": "Le", + "vector-view-viewsource": "Odja kódigu-fonti", + "vector-more-actions": "Más", + "vector-page-tools-label": "Feramentas", + "vector-unpin-element-label": "sukundi" +} diff --git a/Vector/i18n/kg.json b/Vector/i18n/kg.json new file mode 100644 index 0000000..f88430a --- /dev/null +++ b/Vector/i18n/kg.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Rkupsala" + ] + }, + "vector-action-delete": "Kufwa", + "vector-action-move": "Nata", + "vector-action-protect": "Keba", + "vector-view-create": "Tunga", + "vector-view-edit": "Soba", + "vector-view-history": "Tala bansoba", + "vector-view-view": "Tânga" +} diff --git a/Vector/i18n/khw.json b/Vector/i18n/khw.json new file mode 100644 index 0000000..d5d9107 --- /dev/null +++ b/Vector/i18n/khw.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Rachitrali" + ] + }, + "vector-action-addsection": "نوغ موضوع", + "vector-action-delete": "بوغاوے", + "vector-action-move": "منتقل کورے", + "vector-action-protect": "محفوظ کورے", + "vector-action-undelete": "اچی انگیے", + "vector-action-unprotect": "غیر محفوظ", + "vector-view-create": "ساوزاوے", + "vector-view-edit": "ایڈٹ کورے", + "vector-view-history": "تاریخچہ", + "vector-view-view": "راوے", + "vector-view-viewsource": "مسودہ", + "vector-more-actions": "مزید" +} diff --git a/Vector/i18n/ki.json b/Vector/i18n/ki.json new file mode 100644 index 0000000..30f6a5f --- /dev/null +++ b/Vector/i18n/ki.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Stephenwanjau" + ] + }, + "vector-action-delete": "Futa" +} diff --git a/Vector/i18n/kip.json b/Vector/i18n/kip.json new file mode 100644 index 0000000..bd151e7 --- /dev/null +++ b/Vector/i18n/kip.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "राम प्रसाद जोशी" + ] + }, + "vector-view-create": "सृजना गर्ने", + "vector-view-edit": "सर्सिउ", + "vector-view-history": "इतिहास रङ्चिने", + "vector-view-view": "पढिने", + "vector-more-actions": "मस्त" +} diff --git a/Vector/i18n/kiu.json b/Vector/i18n/kiu.json new file mode 100644 index 0000000..5c07dae --- /dev/null +++ b/Vector/i18n/kiu.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "1917 Ekim Devrimi", + "Kumkumuk", + "Mirzali" + ] + }, + "vector-skin-desc": "Asayışo de newe be versiyonê MonoBookiyo modern ra û weşkerdışê ke şenê bıgureniyê", + "vector-action-addsection": "Mewzu ilawe ke", + "vector-action-delete": "Bestere", + "vector-action-move": "Bere", + "vector-action-protect": "Bısevekne", + "vector-action-undelete": "Esterıtene peyser bıcê", + "vector-action-unprotect": "Şeveknayışi bıvurne", + "vector-view-create": "Vıraze", + "vector-view-edit": "Bıvurne", + "vector-view-history": "Tarixi bıvêne", + "vector-view-view": "Bıwane", + "vector-view-viewsource": "Çımey bıvêne", + "vector-jumptonavigation": "Xıl de be pusula", + "vector-jumptosearch": "Xıl de cıgeyrayışi", + "vector-more-actions": "Zêde" +} diff --git a/Vector/i18n/kj.json b/Vector/i18n/kj.json new file mode 100644 index 0000000..0b6dc0b --- /dev/null +++ b/Vector/i18n/kj.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Martin Hipangwa" + ] + }, + "vector-page-tools-label": "Oilongifo" +} diff --git a/Vector/i18n/kjh.json b/Vector/i18n/kjh.json new file mode 100644 index 0000000..b77b513 --- /dev/null +++ b/Vector/i18n/kjh.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "AlexandrL714", + "Андрей Саг." + ] + }, + "vector-languages": "Тіллер", + "vector-language-button-label": "{{PLURAL:$1|$1 тіл}}", + "vector-no-language-button-label": "Тіллер хос саларға", + "vector-action-addsection": "Тема хозыбзарға", + "vector-action-delete": "Тастабызарға", + "vector-action-move": "Адын алыстырыбызарға", + "vector-action-protect": "Арачилирға", + "vector-view-create": "Идебзерге", + "vector-view-edit": "Тӱзедерге", + "vector-view-history": "Кӧрігтердің тархыны", + "vector-view-view": "Хығырарға", + "vector-more-actions": "Хоза", + "vector-searchsuggest-containing": "$1 страницаларны тілег", + "vector-page-tools-label": "Тиріглер", + "vector-page-tools-general-label": "Пір тиксі", + "vector-unpin-element-label": "чазырарға" +} diff --git a/Vector/i18n/kjp.json b/Vector/i18n/kjp.json new file mode 100644 index 0000000..9ad44e0 --- /dev/null +++ b/Vector/i18n/kjp.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Rul1902" + ] + }, + "vector-action-addsection": "အ်ုၯာင်ႋအ်ုကျံင်းသင့် မ်ုဆူ့ဍုဂ်ထါင်ဖှ်ေ", + "vector-action-delete": "ထုဂ်ဆိင့်", + "vector-action-move": "အ်ုၰာႋၰံင်", + "vector-action-protect": "ခ်ုဝုင်ႋလာႋ", + "vector-view-create": "ပ္တုံထံင်း", + "vector-view-edit": "သံင့်ၜးၯဴ", + "vector-view-history": "မ်ုယောဝ်ႋ မေင်ႋစိင်", + "vector-view-view": "ပဝ်ႋ", + "vector-view-viewsource": "မ်ုယောဝ်ႋအ်ုထါ်", + "vector-more-actions": "အ်ုၰာႋၰံင်" +} diff --git a/Vector/i18n/kk-cyrl.json b/Vector/i18n/kk-cyrl.json new file mode 100644 index 0000000..113433e --- /dev/null +++ b/Vector/i18n/kk-cyrl.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "Arystanbek", + "Daniyar", + "Darzz", + "GaiJin", + "Hedeyohu22", + "Kaztrans", + "Nurlan", + "U.ayaao.p", + "СеніңШешең" + ] + }, + "skinname-vector": "Ескі Vector (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "2 Vector мұқабасын ұсынады:\n* 2011 - түрі жаңа, көптеген қолданыс мүмкіндіктері қосылған MonoBook-тың заманауи нұсқасы.\n* 2022 - Уикимедиа [[mw:Desktop Improvements]] жобасының бір бөлігі ретінде құрастырылған Vector.", + "prefs-vector-enable-vector-1-label": "Ескі Vector қолдану", + "prefs-vector-enable-vector-1-help": "Алдағы бірнеше жылда біз Vector мәнерін біртіндеп жаңартамыз. Ескі Vector сізге Vector-дың бұрынғы нұсқасын көруге мүмкіндік береді (2019 жылғы желтоқсандағы жағдай бойынша). Жаңартулар туралы көбірек білу үшін [[mw:Reading/Web/Desktop_Improvements|жоба бетімізге]] өтіңіз.", + "vector-opt-out": "Ескі көрініске ауысу", + "vector-opt-out-tooltip": "Мәнердің ескі көрінісіне (ескі Vector-ға) қайту үшін баптауларыңызды өзгертіңіз", + "vector.css": "/* Мұндағы барлық CSS Vector мұқабасы бар қатысушыларға жүктеледі */", + "vector.js": "/* Мұндағы барлық JavaScript Vector мұқабасы бар қатысушыларға жүктеледі */", + "vector-action-toggle-sidebar": "Бүйірлік тақтаны қосу/өшіру", + "vector-languages": "Тілдер", + "vector-language-button-aria-label": "Басқа тілдегі мақалаға өту. {{PLURAL:$1|$1 тілде}} қолжетімді", + "vector-language-button-label": "{{PLURAL:$1|$1 тіл}}", + "vector-no-language-button-label": "Тіл қосу", + "vector-no-language-button-aria-label": "Бұл мақала осы тілде ғана қолжетімді. Басқа тілдерге мақаланы қосыңыз", + "vector-language-redirect-to-top": "Бұл {{SITENAME}} сайтында тіл сілтемелері беттің жоғары жақында мақала атауына бойында орналасқан. [[#p-lang-btn|Жоғары көтерілу]].", + "vector-language-variant-switcher-label": "Тіл нұсқасын ауыстыру", + "vector-action-addsection": "Тақырып қосу", + "vector-action-delete": "Жою", + "vector-action-move": "Жылжыту", + "vector-action-protect": "Қорғау", + "vector-action-undelete": "Жоюды болдырмау", + "vector-action-unprotect": "Қорғалуын өзгерту", + "vector-view-create": "Бастау", + "vector-view-edit": "Өңдеу", + "vector-view-history": "Өңделу тарихы", + "vector-view-view": "Оқу", + "vector-view-viewsource": "Кодын көру", + "vector-jumptonavigation": "Навигацияға өту", + "vector-jumptosearch": "Іздеуге өту", + "vector-jumptocontent": "Мазмұнға өту", + "vector-more-actions": "Тағы", + "vector-search-loader": "Іздеу ұсыныстары жүктелуде", + "vector-searchsuggest-containing": "«$1» бар беттерді іздеу", + "vector-intro-page": "Жәрдем:Таныстыру", + "vector-toc-label": "Мазмұны", + "vector-toc-beginning": "Кіріспе", + "vector-toc-toggle-button-label": "$1 суббөлімін көрсету/жасыру", + "vector-anon-user-menu-pages": "Шыққан өңдеушілерге арналған беттер", + "vector-anon-user-menu-pages-learn": "көбірек білу", + "vector-anon-user-menu-pages-label": "Өңдеу туралы көбірек білу", + "vector-main-menu-tooltip": "Басты мәзір", + "vector-toc-menu-tooltip": "Мазмұны", + "vector-toc-collapsible-button-label": "Мазмұнды көрсету/жасыру", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Басты мәзір", + "vector-limited-width-toggle": "Шектеулі мазмұн енін ауыстырып-қосу", + "vector-page-tools-label": "Құралдар", + "vector-page-tools-general-label": "Жалпы", + "vector-page-tools-actions-label": "Әрекеттер", + "vector-pin-element-label": "бүйірлік тақтаға жылжыту", + "vector-unpin-element-label": "жасыру", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Талқылау]]", + "tooltip-vector-anon-user-menu-title": "Басқа баптаулар", + "vector-prefs-limited-width": "Шектеулі ен режимін қосу", + "vector-prefs-limited-width-help": "Оқу тәжірибесін жақсарту үшін шектеулі ен режимін қосу.", + "empty-language-selector-body": "Бет мазмұнына басқа тілдерде қолдау көрсетілмейді." +} diff --git a/Vector/i18n/kl.json b/Vector/i18n/kl.json new file mode 100644 index 0000000..6a3d7b1 --- /dev/null +++ b/Vector/i18n/kl.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Iketsi", + "Qaqqalik" + ] + }, + "vector-action-addsection": "Imm. nutaaq", + "vector-action-move": "Nuuguk", + "vector-view-create": "Pilersiguk", + "vector-view-edit": "Aaqqissoruk", + "vector-view-history": "Oqalutt.", + "vector-view-view": "Takuuk", + "vector-view-viewsource": "Toqqavia takuuk" +} diff --git a/Vector/i18n/km.json b/Vector/i18n/km.json new file mode 100644 index 0000000..68f04fd --- /dev/null +++ b/Vector/i18n/km.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Sovichet", + "គីមស៊្រុន", + "វ័ណថារិទ្ធ" + ] + }, + "skinname-vector": "វ៉ិចទ័រ​​", + "vector-opt-out": "ប្តូរទៅរូបរាងចាស់", + "vector.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */", + "vector-languages": "ភាសា", + "vector-language-button-label": "{{PLURAL:$1|$1 ភាសា}}", + "vector-no-language-button-label": "បន្ថែមភាសា", + "vector-action-addsection": "បន្ថែម​ប្រធានបទ​", + "vector-action-delete": "លុបចោល", + "vector-action-move": "ប្តូរទីតាំង", + "vector-action-protect": "ការពារ", + "vector-action-undelete": "ឈប់លុបចោល", + "vector-action-unprotect": "ប្ដូរការការពារ", + "vector-view-create": "បង្កើត​", + "vector-view-edit": "កែប្រែ​", + "vector-view-history": "មើល​ប្រវត្តិ​", + "vector-view-view": "អាន", + "vector-view-viewsource": "មើល​កូដ", + "vector-more-actions": "ច្រើនទៀត", + "vector-searchsuggest-containing": "ស្វែងរកទំព័រដែលមានពាក្យ$1", + "vector-toc-label": "មាតិកា", + "vector-toc-beginning": "ក្បាលទំព័រ", + "vector-anon-user-menu-pages": "ទំព័រសម្រាប់អ្នកកែសម្រួលដែលបានកត់ឈ្មោះចេញ", + "vector-anon-user-menu-pages-learn": "ស្វែងយល់បន្ថែម", + "vector-anon-user-menu-pages-label": "ស្វែងយល់បន្ថែមអំពីការកែសម្រួល", + "vector-main-menu-tooltip": "បញ្ជីដើម", + "vector-toc-menu-tooltip": "​មាតិកា", + "vector-main-menu-label": "បញ្ជីដើម", + "vector-page-tools-label": "ឧបករណ៍​", + "vector-page-tools-general-label": "ទូទៅ​", + "vector-page-tools-actions-label": "សកម្មភាព", + "vector-pin-element-label": "ប្ដូរទីតាំងទៅរបារចំហៀង", + "vector-unpin-element-label": "លាក់", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|ទំព័រពិភាក្សា]]", + "tooltip-vector-anon-user-menu-title": "ជម្រើសផ្សេងទៀត" +} diff --git a/Vector/i18n/kn.json b/Vector/i18n/kn.json new file mode 100644 index 0000000..e497cfd --- /dev/null +++ b/Vector/i18n/kn.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Ktkaushik", + "Nayvik", + "Omshivaprakash", + "VASANTH S.N.", + "~aanzx" + ] + }, + "vector-skin-desc": "2 ವೆಕ್ಟರ್ ಚರ್ಮವನ್ನು ಒದಗಿಸುತ್ತದೆ:\n* 2011 - ತಾಜಾ ನೋಟ ಮತ್ತು ಅನೇಕ ಉಪಯುಕ್ತತೆ ಸುಧಾರಣೆಗಳೊಂದಿಗೆ ಮೊನೋಬುಕ್ ನ ಆಧುನಿಕ ಆವೃತ್ತಿ.\n* 2022 - ವೆಕ್ಟರ್ ಅನ್ನು WMF [[mw:Desktop Improvements]] ಯೋಜನೆಯ ಭಾಗವಾಗಿ ನಿರ್ಮಿಸಲಾಗಿದೆ.", + "prefs-vector-enable-vector-1-label": "ಲೆಗಸಿ ವೆಕ್ಟರ್ ಬಳಸಿ", + "vector-languages": "ಭಾಷೆಗಳು", + "vector-language-button-aria-label": "ಇನ್ನೊಂದು ಭಾಷೆಯ ಲೇಖನಕ್ಕೆ ಹೋಗಿ. {{PLURAL:$1| $1 ಭಾಷೆಯಲ್ಲಿ| $1 ಭಾಷೆಗಳಲ್ಲಿ}} ಲಭ್ಯವಿದೆ", + "vector-language-button-label": "{{PLURAL:$1|$1 ಭಾಷೆ|$1 ಭಾಷೆಗಳು}}", + "vector-no-language-button-label": "ಭಾಷೆಗಳನ್ನು ಸೇರಿಸಿ", + "vector-no-language-button-aria-label": "ಈ ಲೇಖನವು ಈ ಭಾಷೆಯಲ್ಲಿ ಮಾತ್ರ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ಇತರ ಭಾಷೆಗಳಿಗೆ ಲೇಖನವನ್ನು ಸೇರಿಸಿ", + "vector-language-variant-switcher-label": "ಭಾಷಾ ರೂಪಾಂತರವನ್ನು ಬದಲಾಯಿಸಿ", + "vector-action-addsection": "ವಿಷಯ ಸೇರಿಸಿ", + "vector-action-delete": "ಅಳಿಸು", + "vector-action-move": "ಸ್ಥಳಾಂತರಿಸಿ", + "vector-action-protect": "ಸಂರಕ್ಷಿಸು", + "vector-action-undelete": "ಅಳಿಸಬೇಡ", + "vector-action-unprotect": "ರಕ್ಷಣೆಯನ್ನು ಬದಲಾವಣೆ", + "vector-view-create": "ಸೃಷ್ಟಿಸು", + "vector-view-edit": "ಸಂಪಾದಿಸಿ", + "vector-view-history": "ಇತಿಹಾಸವನ್ನು ನೋಡಿ", + "vector-view-view": "ಓದು", + "vector-view-viewsource": "ಮೂಲವನ್ನು ನೋಡು", + "vector-jumptonavigation": "ನ್ಯಾವಿಗೇಷನ್‌ಗೆ ಹೋಗು", + "vector-jumptosearch": "ಹುಡುಕಲು ಹೋಗು", + "vector-jumptocontent": "ವಿಷಯಕ್ಕೆ ಹೋಗು", + "vector-more-actions": "ಇನ್ನಷ್ಟು", + "vector-searchsuggest-containing": "$1 ಹೊಂದಿರುವ ಪುಟಗಳಿಗಾಗಿ ಹುಡುಕಿ", + "vector-toc-label": "ಪರಿವಿಡಿ", + "vector-toc-beginning": "ಮುನ್ನುಡಿ", + "vector-anon-user-menu-pages": "ಲಾಗ್ ಔಟ್ ಆದ ಸಂಪಾದಕರಿಗೆ ಪುಟಗಳು", + "vector-anon-user-menu-pages-learn": "ಹೆಚ್ಚಿನ ಮಾಹಿತಿ", + "vector-page-tools-label": "ಉಪಕರಣಗಳು", + "vector-page-tools-general-label": "ಸಾಮಾನ್ಯ", + "vector-unpin-element-label": "ಮರೆ ಮಾಡಿ", + "vector-prefs-limited-width": "ಸೀಮಿತ ಪುಟ ಅಗಲ ಮೋಡ್ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ" +} diff --git a/Vector/i18n/ko-kp.json b/Vector/i18n/ko-kp.json new file mode 100644 index 0000000..701f070 --- /dev/null +++ b/Vector/i18n/ko-kp.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Delim" + ] + }, + "vector-skin-desc": "신선해 보이고 많은 사용성이 개선된 모노북의 현대 판본", + "vector-action-addsection": "새 주제", + "vector-action-delete": "삭제", + "vector-action-move": "이동", + "vector-action-protect": "보호", + "vector-action-undelete": "지우기취소", + "vector-action-unprotect": "보호 설정 바꾸기", + "vector-view-create": "만들기", + "vector-view-edit": "편집", + "vector-view-history": "력사보기", + "vector-view-view": "읽기", + "vector-view-viewsource": "원본 보기", + "vector-more-actions": "더 보기" +} diff --git a/Vector/i18n/ko.json b/Vector/i18n/ko.json new file mode 100644 index 0000000..7315230 --- /dev/null +++ b/Vector/i18n/ko.json @@ -0,0 +1,78 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Apzp79", + "Bluehill", + "Ellif", + "ITurtle", + "Jay94ks", + "Jerrykim306", + "Kwj2772", + "MemphisA5", + "Namoroka", + "Revi", + "Ykhwong", + "메이", + "아라" + ] + }, + "skinname-vector": "벡터 레거시 (2010)", + "skinname-vector-2022": "벡터 (2022)", + "vector-specialversion-name": "벡터", + "vector-skin-desc": "2가지의 벡터 스킨을 제공합니다:\n* 2011년형 - 말끔한 외양과 많은 이용상의 편의 개선을 갖춘 모노북의 현대적인 버전\n* 2022년형 - WMF [[mw:Desktop Improvements]] 프로젝트의 일환으로 마련한 벡터 버전", + "prefs-vector-enable-vector-1-label": "레거시 벡터 사용", + "prefs-vector-enable-vector-1-help": "향후 몇 년 동안 벡터 스킨을 점진적으로 업데이트할 것입니다. 레거시 벡터를 사용하면 이전 버전의 벡터를 볼 수 있습니다(2019년 12월 기준). 업데이트에 관해 더 알아보려면 [[mw:Reading/Web/Desktop_Improvements|프로젝트 페이지]]로 가십시오.", + "vector-opt-out": "이전 스타일로 전환", + "vector-opt-out-tooltip": "내 설정을 과거의 스킨 모습(레거시 벡터)으로 되돌립니다", + "vector.css": "/* 여기의 모든 CSS는 벡터 스킨을 사용하는 사용자에게 로드됩니다 */", + "vector.js": "/* 여기의 모든 자바스크립트는 벡터 스킨을 사용하는 사용자에게 로드됩니다 */", + "vector-action-toggle-sidebar": "사이드바 토글", + "vector-languages": "언어", + "vector-language-button-aria-label": "다른 언어로 문서를 방문합니다. {{PLURAL:$1|$1개 언어}}로 읽을 수 있습니다", + "vector-language-button-label": "{{PLURAL:$1|$1개 언어}}", + "vector-no-language-button-label": "언어 추가", + "vector-no-language-button-aria-label": "이 문서는 이 언어로만 존재합니다. 다른 언어로 문서를 추가하세요", + "vector-language-redirect-to-top": "이 {{SITENAME}}에서 언어 링크는 문서 제목 건너편의 문서 최상단에 있습니다. [[#p-lang-btn|최상단으로 이동합니다]].", + "vector-language-variant-switcher-label": "언어 변종 바꾸기", + "vector-action-addsection": "새 주제", + "vector-action-delete": "삭제", + "vector-action-move": "이동", + "vector-action-protect": "보호", + "vector-action-undelete": "삭제 취소", + "vector-action-unprotect": "보호 설정 바꾸기", + "vector-view-create": "만들기", + "vector-view-edit": "편집", + "vector-view-history": "역사 보기", + "vector-view-view": "읽기", + "vector-view-viewsource": "원본 보기", + "vector-jumptonavigation": "둘러보기로 이동", + "vector-jumptosearch": "검색으로 이동", + "vector-jumptocontent": "본문으로 이동", + "vector-more-actions": "더 보기", + "vector-search-loader": "검색 제안을 불러오는 중", + "vector-searchsuggest-containing": "$1 항목이 포함된 글을 검색", + "vector-intro-page": "Help:소개", + "vector-toc-label": "목차", + "vector-toc-beginning": "처음 위치", + "vector-toc-toggle-button-label": "$1 하위섹션 토글하기", + "vector-anon-user-menu-pages": "로그아웃한 편집자를 위한 문서", + "vector-anon-user-menu-pages-learn": "더 알아보기", + "vector-anon-user-menu-pages-label": "편집에 관해 더 알아보기", + "vector-main-menu-tooltip": "주 메뉴", + "vector-toc-menu-tooltip": "목차", + "vector-toc-collapsible-button-label": "목차 토글", + "vector-site-nav-label": "사이트", + "vector-main-menu-label": "주 메뉴", + "vector-limited-width-toggle": "내용 폭 제한 전환", + "vector-page-tools-label": "도구", + "vector-page-tools-general-label": "일반", + "vector-page-tools-actions-label": "동작", + "vector-pin-element-label": "사이드바로 이동", + "vector-unpin-element-label": "숨기기", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|토론]]", + "tooltip-vector-anon-user-menu-title": "더 많은 옵션", + "vector-prefs-limited-width": "폭 제한 모드 사용", + "vector-prefs-limited-width-help": "향상된 읽기 경험을 위해 폭 제한 모드를 활성화합니다.", + "empty-language-selector-body": "문서 내용이 다른 언어로는 지원되지 않습니다." +} diff --git a/Vector/i18n/koi.json b/Vector/i18n/koi.json new file mode 100644 index 0000000..6324a97 --- /dev/null +++ b/Vector/i18n/koi.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Enye Lav", + "Merrahtar" + ] + }, + "vector-languages": "Кыввез", + "vector-action-delete": "Чышкыны", + "vector-view-view": "Лыддьöтны" +} diff --git a/Vector/i18n/kr.json b/Vector/i18n/kr.json new file mode 100644 index 0000000..bee781e --- /dev/null +++ b/Vector/i18n/kr.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Aliyu shaba", + "Amire80", + "Mohammedbama123", + "Umargana1" + ] + }, + "vector-languages": "Tǝlam", + "vector-language-button-label": "{{PLURAL:$1|$1 telam|$1 telam wa gade}}", + "vector-no-language-button-label": "Tǝlam yira", + "vector-action-addsection": "Bayin yukko", + "vector-action-delete": "Chinta", + "vector-action-move": "Huutu", + "vector-action-protect": "Teliwune", + "vector-view-create": "Awo kelta", + "vector-view-edit": "Yasa", + "vector-view-history": "Awodoyə közina kuru", + "vector-view-view": "Qra", + "vector-more-actions": "Kureman", + "vector-searchsuggest-containing": "Na awoodoyə gnazanama mata $1", + "vector-toc-label": "Bayin awo be", + "vector-toc-beginning": "Burotǝ", + "vector-page-tools-label": "Awoo ciddaye", + "vector-page-tools-general-label": "Samma", + "vector-unpin-element-label": "Grane" +} diff --git a/Vector/i18n/krc.json b/Vector/i18n/krc.json new file mode 100644 index 0000000..9e5aea4 --- /dev/null +++ b/Vector/i18n/krc.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Ernác", + "Iltever", + "Къарачайлы" + ] + }, + "skinname-vector": "Вектор", + "vector-language-button-label": "{{PLURAL:$1|$1 тил}}", + "vector-action-addsection": "Джангы тема къош", + "vector-action-delete": "Кетер", + "vector-action-move": "Атын ауушдур", + "vector-action-protect": "Джакъла", + "vector-action-undelete": "Къайтар", + "vector-action-unprotect": "Джакълауну тюрлендир", + "vector-view-create": "Къура", + "vector-view-edit": "Тюрлендир", + "vector-view-history": "Тарихи", + "vector-view-view": "Окъу", + "vector-view-viewsource": "Кодха къара", + "vector-more-actions": "Энтда", + "vector-searchsuggest-containing": "$1 ичинде болгъан бетлени изле", + "vector-main-menu-label": "Баш меню", + "vector-limited-width-toggle": "Чекленнген контентни кенглигин алмашдыр", + "vector-page-tools-label": "Адырла", + "vector-prefs-limited-width-help": "Джазылгъан тынч окъулурча, кенгликни чеклениу режимин джандырыгъыз." +} diff --git a/Vector/i18n/kri.json b/Vector/i18n/kri.json new file mode 100644 index 0000000..7144655 --- /dev/null +++ b/Vector/i18n/kri.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Protostar" + ] + }, + "vector-action-addsection": "Add tòpik", + "vector-action-delete": "Delet", + "vector-action-move": "Muf", + "vector-action-protect": "Protèkt", + "vector-view-create": "Kreat", + "vector-view-edit": "Chenj", + "vector-view-history": "Luk historia", + "vector-view-view": "Rid", + "vector-view-viewsource": "Luk dhi sòrs", + "vector-more-actions": "Mòr" +} diff --git a/Vector/i18n/krj.json b/Vector/i18n/krj.json new file mode 100644 index 0000000..cb2e679 --- /dev/null +++ b/Vector/i18n/krj.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Pare Mo" + ] + }, + "vector-action-delete": "Borrahon", + "vector-action-protect": "Proteksiyunan", + "vector-view-create": "Maghimò", + "vector-view-edit": "Iislan", + "vector-view-history": "Tërëkon ang maragtas", + "vector-view-view": "Basahon", + "vector-searchsuggest-containing": "Magsagap kang manga pahina nga may sëlëd nga $1" +} diff --git a/Vector/i18n/krl.json b/Vector/i18n/krl.json new file mode 100644 index 0000000..06ffb00 --- /dev/null +++ b/Vector/i18n/krl.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Ilja.mos", + "Likopiän tyttö", + "Mashoi7", + "Varvana" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 kieli|$1 kieltä}}", + "vector-action-addsection": "Lisyä teema", + "vector-action-delete": "Poissa", + "vector-action-move": "Šiirrä", + "vector-action-protect": "Šuojua", + "vector-view-create": "Luaji", + "vector-view-edit": "Kohentele", + "vector-view-history": "Näytä istorija", + "vector-view-view": "Luve", + "vector-more-actions": "Vielä", + "vector-searchsuggest-containing": "Eči šivuja, kumpašissa on $1" +} diff --git a/Vector/i18n/ks-arab.json b/Vector/i18n/ks-arab.json new file mode 100644 index 0000000..aa10846 --- /dev/null +++ b/Vector/i18n/ks-arab.json @@ -0,0 +1,50 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Iflaq", + "Rishabhbhat", + "Tajamul9", + "Teashae" + ] + }, + "skinname-vector": "ویکٹر پرٛون (2010)", + "skinname-vector-2022": "ویکٹر (2022)", + "vector-specialversion-name": "ویکٹر", + "prefs-vector-enable-vector-1-label": "پرٛون ویکٹر کٔرِو اِستِمال", + "vector-opt-out": "پرٛانہِ ظٲہِریَتھ پؠٹھ گٔژھِو واپَس", + "vector-languages": "زَبانہٕ", + "vector-language-button-label": "{{PLURAL:$1|$1زَبان|$1 زَبانہٕ}}", + "vector-no-language-button-label": "زبانہٕ کٔرِو جَمَع", + "vector-action-addsection": "نٔو موضوٗع", + "vector-action-delete": "مِٹٲیو", + "vector-action-move": "پکنٲیِو", + "vector-action-protect": "رٲچھؠ", + "vector-action-undelete": "بَحال کٔرِو", + "vector-action-unprotect": "رٲچھؠ بَدلٲیو", + "vector-view-create": "تَخلیٖق", + "vector-view-edit": "اؠڈِٹ", + "vector-view-history": "تَوٲریٖخ وُچھِو", + "vector-view-view": "پٔرِو", + "vector-view-viewsource": "آگُر وُچھِو", + "vector-jumptonavigation": "رَہنُمٲیی کُن گٔژھِو", + "vector-jumptosearch": "تَلاشَس کُن گٔژھِو", + "vector-jumptocontent": "مَوادَس کُن گٔژھِو", + "vector-more-actions": "بێیہِ", + "vector-searchsuggest-containing": "صَفَن کٔرِو تَلاش یِمَن مَنٛز $1 چھُ", + "vector-intro-page": "Help:تَعارُف", + "vector-toc-label": "فِہرِست", + "vector-toc-beginning": "اِبتِدا", + "vector-anon-user-menu-pages-learn": "مٔزیٖد وُچھِو", + "vector-anon-user-menu-pages-label": "تَرمیٖم کٲری مُتلِق ہیٚچھِو", + "vector-main-menu-tooltip": "اَہَم مینیو", + "vector-toc-menu-tooltip": "مَواد فِہرِست", + "vector-site-nav-label": "سایِٹ", + "vector-main-menu-label": "اَہَم مینیو", + "vector-page-tools-label": "اَوزار", + "vector-page-tools-general-label": "عام", + "vector-page-tools-actions-label": "عَملہٕ", + "vector-pin-element-label": "اَنٛد کُن تھٲوِو", + "vector-unpin-element-label": "کٔھٹِتھ", + "tooltip-vector-anon-user-menu-title": "مٔزیٖد یَختِیار" +} diff --git a/Vector/i18n/ksh.json b/Vector/i18n/ksh.json new file mode 100644 index 0000000..de7ff5c --- /dev/null +++ b/Vector/i18n/ksh.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Purodha" + ] + }, + "skinname-vector": "Väktor", + "vector-skin-desc": "En modärne Väsjohn vun dä älldere Bedehnbovverfläsch „Monobooch“ met enem neue Ußsinn un Verbäßeronge bem Bedehne.", + "vector.css": "/* Dat CSS heh aan dä Schtäll wirrek blohß op de Bedehnbovverfläsch „Väktor“ */", + "vector.js": "/* De JavaSkreppte fun heh krejje alle Sigge met dä Bedehnbovverfläsch „Väktor“ jeschek */", + "vector-action-addsection": "Ne neue Afschnet onge drahn!", + "vector-action-delete": "Fottschmihße!", + "vector-action-move": "Ömnänne!", + "vector-action-protect": "Schöze!", + "vector-action-undelete": "Zerökholle!", + "vector-action-unprotect": "Schoz ändere!", + "vector-view-create": "Neu Schrihve!", + "vector-view-edit": "Änndere!", + "vector-view-history": "Väsjohne zeije!", + "vector-view-view": "Lässe!", + "vector-view-viewsource": "Der Wikkitäx aanlohre!", + "vector-more-actions": "Mih" +} diff --git a/Vector/i18n/ksw.json b/Vector/i18n/ksw.json new file mode 100644 index 0000000..1b4bd5b --- /dev/null +++ b/Vector/i18n/ksw.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Jaeminlovetaejoon", + "SawJaemin" + ] + }, + "vector-action-addsection": "မၤအါထီၣ်တၢ်ဂ့ၢ်ခိၣ်တီ", + "vector-action-delete": "ထူးသံကွံာ်", + "vector-action-move": "သုး", + "vector-action-protect": "ဒီသဒၢ", + "vector-view-create": "တ့ထီၣ်", + "vector-view-edit": "အဲးဒံၣ်", + "vector-view-history": "ကွၢ်တၢ်စံၣ်စိၤတဲစိၤ", + "vector-view-view": "ဖး", + "vector-more-actions": "အါထီၣ်", + "tooltip-vector-anon-user-menu-title": "တၢ်ဃုထၢအါထီၣ်" +} diff --git a/Vector/i18n/ku-latn.json b/Vector/i18n/ku-latn.json new file mode 100644 index 0000000..0154804 --- /dev/null +++ b/Vector/i18n/ku-latn.json @@ -0,0 +1,64 @@ +{ + "@metadata": { + "authors": [ + "Balyozxane", + "Bikarhêner", + "Ferhengvan", + "George Animal", + "Gomada" + ] + }, + "skinname-vector": "Vector legacy (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "2 rûyên Vectorê peyda dike:\n* 2011 - Guhartoya nûjen a MonoBook bi dîmeneke nû û gelek çêtirkirinên bikaranînê.\n* 2022 - Vektora ku wekî beşeke ji projeya WMF ya [[mw:Desktop Improvements]] hatiye çêkirin.", + "prefs-vector-enable-vector-1-label": "Legacy Vector Bi Kar Bîne", + "prefs-vector-enable-vector-1-help": "Di nav çend salên pêşî de, em ê hêdî hêdî rûyê Vectorê nû bikin. Legacy Vector dê bihêle ku hûn guhartoya kevn a Vectorê (ji kanûna pêşîn 2019an ve) bibînin. Ji bo bêtir agahdarî li ser nûkirinan, herin [[mw:Reading/Web/Desktop_Improvements|rûpela projeyê]].", + "vector-opt-out": "Rûya kevn bi kar bîne", + "vector-opt-out-tooltip": "Mîhengên xwe biguhêre ji bo vegerîna rûyê kevn (legacy Vector)", + "vector.css": "/* Hemû CSS-a li vir dê ji bo bikarhênerên rûyê Vectorê were barkirin */", + "vector.js": "/* Hemû JavaScript -a li vir dê ji bo bikarhênerên rûyê Vectorê were barkirin */", + "vector-action-toggle-sidebar": "Menuya kêlekê bigire/veke", + "vector-languages": "Bi zimanên din", + "vector-language-button-aria-label": "Here gotareke bi zimanekî din. Bi {{PLURAL:$1|$1 zimanekî|$1 zimanan}} heye.", + "vector-language-button-label": "Bi {{PLURAL:$1|zimanekî din|$1 zimanên din}}", + "vector-no-language-button-label": "Zimanekî lê zêde bike", + "vector-no-language-button-aria-label": "Ev gotar tenê bi vî zimanî heye. Gotarê ji bo zimanên din zêde bikin", + "vector-language-redirect-to-top": "Di vê {{SITENAME}}yê de lînkên zimanî li serê rûpelê li hemberî sernavê gotarê ne. [[#p-lang-btn|Here herî jor]].", + "vector-language-variant-switcher-label": "Varyanta zimanî biguhêre", + "vector-action-addsection": "Mijarekê lê zêde bike", + "vector-action-delete": "Jê bibe", + "vector-action-move": "Nav biguhêre", + "vector-action-protect": "Biparêze", + "vector-action-undelete": "Jê nebe", + "vector-action-unprotect": "Parastinê biguhêre", + "vector-view-create": "Çêke", + "vector-view-edit": "Biguhêre", + "vector-view-history": "Dîrokê bibîne", + "vector-view-view": "Bixwîne", + "vector-view-viewsource": "Çavkaniyan bibîne", + "vector-jumptonavigation": "Here nagîvasyonê", + "vector-jumptosearch": "Here lêgerînê", + "vector-jumptocontent": "Here naverokê", + "vector-more-actions": "Bêhtir", + "vector-search-loader": "Pêşniyazên lêgerînê tê barkirin", + "vector-searchsuggest-containing": "Li rûpelên ku $1 dihewînin bigere", + "vector-intro-page": "Help:Gavên pêşîn", + "vector-toc-label": "Naverok", + "vector-toc-beginning": "Destpêk", + "vector-toc-toggle-button-label": "Binêbeşa $1 bigire/veke", + "vector-anon-user-menu-pages": "Rûpelên ji bo edîtorên derketî", + "vector-anon-user-menu-pages-learn": "Zêdetir hîn bibe", + "vector-anon-user-menu-pages-label": "Di derbarê guhartinê de zêdetir hîn bibe", + "vector-main-menu-tooltip": "Menuya esasî", + "vector-toc-menu-tooltip": "Tabloya naverokê", + "vector-toc-collapsible-button-label": "Tabloya naverokê bigre/veke", + "vector-site-nav-label": "Malper", + "vector-page-tools-label": "Amûr", + "vector-pin-element-label": "Here menuya kêlekê", + "vector-unpin-element-label": "veşêre", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Gotûbêj]]", + "tooltip-vector-anon-user-menu-title": "Zêdetir opsiyon", + "vector-prefs-limited-width": "Moda firehiya sînorkirî çalak bike", + "vector-prefs-limited-width-help": "Ji bo tecrûbeya xwendinê ya baştir moda firehiya sînorkirî çalak bike" +} diff --git a/Vector/i18n/kum.json b/Vector/i18n/kum.json new file mode 100644 index 0000000..4ada654 --- /dev/null +++ b/Vector/i18n/kum.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Arsenekoumyk", + "ArslanX" + ] + }, + "vector-action-addsection": "Мавзу къошмакъ", + "vector-action-delete": "Тайдырмакъ", + "vector-action-move": "Атын алышдырмакъ", + "vector-action-protect": "Якъламакъ", + "vector-view-create": "Яратмакъ", + "vector-view-edit": "Тюзлемек", + "vector-view-history": "Тарихине къарамакъ", + "vector-view-view": "Охумакъ", + "vector-more-actions": "Дагъы" +} diff --git a/Vector/i18n/kus.json b/Vector/i18n/kus.json new file mode 100644 index 0000000..cd540c4 --- /dev/null +++ b/Vector/i18n/kus.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bugirbiig" + ] + }, + "vector-languages": "Buudi piana'ad", + "vector-language-button-label": "{{PLURAL:$1|$1 buudi pian'uk|$1 buudi pian'ad}}", + "vector-no-language-button-label": "Paasim Pian'ad", + "vector-action-addsection": "Pɛ'ɛsim pian'azug", + "vector-action-delete": "Yisim", + "vector-action-move": "Vuugim", + "vector-action-protect": "Gur", + "vector-view-create": "Maalim", + "vector-view-edit": "Dɛmisim gbɛlima", + "vector-view-history": "Gɔsim linɛ dɛŋin maal", + "vector-view-view": "Karim", + "vector-more-actions": "iem paas", + "vector-searchsuggest-containing": "Iem lakir banɛ mɔri $1", + "vector-page-tools-label": "La'ad", + "vector-page-tools-general-label": "Li wʋsa", + "vector-unpin-element-label": "su'am" +} diff --git a/Vector/i18n/kv.json b/Vector/i18n/kv.json new file mode 100644 index 0000000..d75e348 --- /dev/null +++ b/Vector/i18n/kv.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Comp1089", + "Enye Lav", + "Merrahtar" + ] + }, + "vector-languages": "Кывъяс", + "vector-language-button-label": "{{PLURAL:$1|кыв}}", + "vector-action-move": "Ним вежны", + "vector-view-create": "Лӧсьӧдны", + "vector-view-edit": "Вежны", + "vector-view-history": "История", + "vector-view-view": "Лыддьыны", + "vector-more-actions": "Нӧшта", + "vector-searchsuggest-containing": "Корсьны лист бокъяс, кӧні эм $1" +} diff --git a/Vector/i18n/kw.json b/Vector/i18n/kw.json new file mode 100644 index 0000000..7389c08 --- /dev/null +++ b/Vector/i18n/kw.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "GwikorFrank", + "Kernoweger", + "Kw-Moon", + "Nrowe" + ] + }, + "vector-action-addsection": "Keworra testen", + "vector-action-delete": "Dilea", + "vector-action-move": "Gwaya", + "vector-action-protect": "Difres", + "vector-action-undelete": "Disdhilea", + "vector-action-unprotect": "Chanjya difresans", + "vector-view-create": "Gwruthyl", + "vector-view-edit": "Golegi", + "vector-view-history": "Gweles an istori", + "vector-view-view": "Redya", + "vector-view-viewsource": "Gweles an bennfenten", + "vector-more-actions": "Moy" +} diff --git a/Vector/i18n/ky.json b/Vector/i18n/ky.json new file mode 100644 index 0000000..6a59f8b --- /dev/null +++ b/Vector/i18n/ky.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Bosogo", + "Chorobek", + "Growingup", + "Janatkg", + "Ztimur", + "Викиней", + "Элдин беги" + ] + }, + "skinname-vector": "Эски Вектор (2010)", + "skinname-vector-2022": "Вектор (2022)", + "vector-specialversion-name": "Вектор", + "vector-skin-desc": "Эки вектордук көрүнүштү камсыз кылат:\n*2011 — колдонууга ыңгайлаштырылган «MonoBook'тун» жаңы нускасы.\n*2022 — Викимедиа фондунун [[mw:Desktop Improvements|«Desktop Improvements»]] долбоорунун алкагында түзүлгөн «Вектор».", + "prefs-vector-enable-vector-1-label": "Эски Векторду колдонуу", + "prefs-vector-enable-vector-1-help": "Жакынкы жылдары «Вектор» көрүнүшүн акырындап жаңыртабыз. «Эски Вектор» «Вектордун» эски нускасын (2019-жылдын декабрына карата) көрүүгө мүмкүндүк берет. Жаңыртуулар жөнүндө көбүрөөк билүү үчүн [[mw:Reading/Web/Desktop_Improvements|долбоорубуздун барагына]] өтүңүз.", + "vector-opt-out": "Эски көрүнүшкө өтүү", + "vector-opt-out-tooltip": "Көрүнүштүн эски нускасына кайтуу үчүн жөндөмөлөрүңүздү өзгөртүңүз (Эски Вектор)", + "vector.css": "/* Бул жердеги бардык CSS «Вектор» көрүнүшүнүн колдонуучулары үчүн жүктөлөт */", + "vector.js": "/* Бул жердеги бардык JavaScript «Вектор» көрүнүшүнүн колдонуучулары үчүн жүктөлөт */", + "vector-action-toggle-sidebar": "Каптал тилкесин көрсөтүү/жашыруу", + "vector-languages": "Тилдер", + "vector-language-button-aria-label": "Башка тилдеги макалага өтүү. {{PLURAL:$1|$1 тилде жеткиликтүү}}", + "vector-language-button-label": "{{PLURAL:$1|$1 тил}}", + "vector-no-language-button-label": "Тилдерди кошуу", + "vector-no-language-button-aria-label": "Бул макала ушул тилде гана бар. Башка тилдеги макала кошуңуз", + "vector-language-redirect-to-top": "Бул {{SITENAME}}да тил шилтемелери барактын жогорусунда жайгашкан (барак аталышынын маңдайында). [[#p-lang-btn|Жогоруга өтүү]].", + "vector-language-variant-switcher-label": "Тилди өзгөртүү", + "vector-action-addsection": "Тема кошуу", + "vector-action-delete": "Өчүрүү", + "vector-action-move": "Аталышын өзгөртүү", + "vector-action-protect": "Коргоо", + "vector-action-undelete": "Калыбына келтирүү", + "vector-action-unprotect": "Коргоону өзгөртүү", + "vector-view-create": "Түзүү", + "vector-view-edit": "Түзөтүү", + "vector-view-history": "Тарыхын кароо", + "vector-view-view": "Окуу", + "vector-view-viewsource": "Булагын кароо", + "vector-jumptonavigation": "Навигацияга өтүү", + "vector-jumptosearch": "Издөөгө өтүү", + "vector-jumptocontent": "Мазмунга өтүү", + "vector-more-actions": "Көбүрөөк", + "vector-search-loader": "Издөө натыйжалары жүктөлүүдө", + "vector-searchsuggest-containing": "«$1» камтыган барактарды издөө", + "vector-intro-page": "Жардам:Бет ачар", + "vector-toc-label": "Мазмуну", + "vector-toc-beginning": "Башына кайтуу", + "vector-toc-toggle-button-label": "$1 бөлүмчөсүн көрсөтүү/жашыруу", + "vector-anon-user-menu-pages": "Катталбаган түзөтүүчүлөр үчүн барактар", + "vector-anon-user-menu-pages-learn": "чоо-жайы", + "vector-anon-user-menu-pages-label": "Түзөтүү жөнүндө көбүрөөк билүү", + "vector-main-menu-tooltip": "Иш тилкеси", + "vector-toc-menu-tooltip": "Мазмун", + "vector-toc-collapsible-button-label": "Мазмунду жашыруу/көрсөтүү", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Иш тилкеси", + "vector-limited-width-toggle": "Мазмундун туурасын чектөө/чектебөө", + "vector-page-tools-label": "Куралдар", + "vector-page-tools-general-label": "Жалпы", + "vector-page-tools-actions-label": "Аракеттер", + "vector-pin-element-label": "каптал тилкесине жылдыруу", + "vector-unpin-element-label": "жашыруу", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Талкуу]]", + "tooltip-vector-anon-user-menu-title": "Кошумча мүмкүнчүлүктөр", + "vector-prefs-limited-width": "Чектелген туурасы режимин орнотуу", + "vector-prefs-limited-width-help": "Окуу ыңгайлуулугу үчүн чектелген туурасы режимин орнотуу", + "empty-language-selector-body": "Барактын мазмуну башка тилдерде жеткиликтүү эмес." +} diff --git a/Vector/i18n/la.json b/Vector/i18n/la.json new file mode 100644 index 0000000..ed54d8d --- /dev/null +++ b/Vector/i18n/la.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Adumbrativus", + "Laurentianus", + "UV" + ] + }, + "vector-action-addsection": "Partem novam addere", + "vector-action-delete": "Delere", + "vector-action-move": "Movere", + "vector-action-protect": "Protegere", + "vector-action-undelete": "Restituere", + "vector-action-unprotect": "Protectionem mutare", + "vector-view-create": "Creare", + "vector-view-edit": "Recensere", + "vector-view-history": "Historiam inspicere", + "vector-view-view": "Legere", + "vector-view-viewsource": "Fontem inspicere", + "vector-more-actions": "Plura", + "vector-toc-label": "Index", + "vector-toc-beginning": "Initium" +} diff --git a/Vector/i18n/lad.json b/Vector/i18n/lad.json new file mode 100644 index 0000000..93d5a95 --- /dev/null +++ b/Vector/i18n/lad.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Chabi1", + "Universal Life" + ] + }, + "vector-action-addsection": "Ajustar sujeto", + "vector-action-delete": "Efassar", + "vector-action-move": "Taşirear", + "vector-action-protect": "Guadrar", + "vector-action-undelete": "Traer atrás", + "vector-action-unprotect": "Trokar proteksyon", + "vector-view-create": "Kriar", + "vector-view-edit": "Trocar", + "vector-view-history": "Ver la istoria", + "vector-view-view": "Meldar", + "vector-view-viewsource": "Ver su manadero", + "vector-more-actions": "Mas" +} diff --git a/Vector/i18n/lag.json b/Vector/i18n/lag.json new file mode 100644 index 0000000..342fa88 --- /dev/null +++ b/Vector/i18n/lag.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "Baba Tabita" + ] + }, + "vector-action-delete": "Honola", + "vector-action-move": "Seesya", + "vector-action-protect": "Fafɨra", + "vector-view-history": "Laangɨra hɨstoríya", + "vector-view-view": "Soma" +} diff --git a/Vector/i18n/lb.json b/Vector/i18n/lb.json new file mode 100644 index 0000000..4a1c6e9 --- /dev/null +++ b/Vector/i18n/lb.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Les Meloures", + "Robby" + ] + }, + "skinname-vector": "Vector (Versioun vun 2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-skin-desc": "Huet 2 Versioune vum Vector-Interface:\n* 2011 - Modern Versioun vu Monobook mat frëschem Look a ville Verbesserunge vun der Benotzerfrëndlechkeet\n* 2022 - déi aktuell Versioun vu 'Vector', déi als Deel vum Projet [[mw:Desktop Improvements]] vun der WMF entstanen ass", + "prefs-vector-enable-vector-1-label": "Déi al-Versioun vu Vector benotzen", + "prefs-vector-enable-vector-1-help": "An den nächste Jore gëtt de Layout 'Vector' Schrëtt fir Schrëtt aktualiséiert. Den traditionelle Layout Vector erlaabt Iech et fir déi al Versioun vu Vector (esou wéi am Dezember 2019) ze benotzen. Fir méi iwwer d'Aktualiséierunge gewuer ze ginn, gitt wgl. op eis [[mw:Reading/Web/Desktop_Improvements|Projetssäit]].", + "vector-opt-out": "An den ale Layout wiesselen", + "vector-opt-out-tooltip": "Ännert Är Astellunge fir op den ale Look vum Layout Vector (legacy Vector = Vector vum Dezember 2019) zréckzegoen", + "vector.css": "/* All CSS deen hei steet gëtt vun alle Benotzer vum Ausgesinn Vector gelueden */", + "vector.js": "/* All JavaScript hei gëtt geluede fir Benotzer vum Layout Vector */", + "vector-action-toggle-sidebar": "Säitleche Menü weisen/verstoppen", + "vector-languages": "Sproochen", + "vector-language-button-aria-label": "Op en Artikel an enger anerer Sprooch wiesselen. Disponibel an {{PLURAL:$1|enger Sprooch|$1 Sproochen}}", + "vector-language-button-label": "{{PLURAL:$1|$1 Sprooch|$1 Sproochen}}", + "vector-no-language-button-label": "Sproochen derbäisetzen", + "vector-no-language-button-aria-label": "Dësen Artikel gëtt et nëmmen an dëser Sprooch. Setzt den Artikel fir aner Sproochen derbäi", + "vector-language-redirect-to-top": "Op {{SITENAME}} stinn d'Linken an anere Sproochen uewen op der Säit riets niewent dem Titel vum Artikel. : [[#p-lang-btn|No uewe goen]]", + "vector-language-variant-switcher-label": "Sproochvariant änneren", + "vector-action-addsection": "Sujet derbäisetzen", + "vector-action-delete": "Läschen", + "vector-action-move": "Réckelen", + "vector-action-protect": "Spären", + "vector-action-undelete": "Restauréieren", + "vector-action-unprotect": "Spär änneren", + "vector-view-create": "Uleeën", + "vector-view-edit": "Änneren", + "vector-view-history": "Versioune weisen", + "vector-view-view": "Liesen", + "vector-view-viewsource": "Quellcode weisen", + "vector-jumptonavigation": "Op d'Navigatioun wiesselen", + "vector-jumptosearch": "Op d'Siche wiesselen", + "vector-jumptocontent": "Op den Inhalt sprangen", + "vector-more-actions": "Méi", + "vector-search-loader": "Luede vun de Propose fir ze sichen", + "vector-searchsuggest-containing": "No Säite mat $1 sichen", + "vector-intro-page": "Help:Aféierung", + "vector-toc-label": "Inhalter", + "vector-toc-beginning": "Ufank", + "vector-toc-toggle-button-label": "Ënner-Abschnitt $1 wiesselen", + "vector-anon-user-menu-pages": "Säite fir ausgeloggt Benotzer", + "vector-anon-user-menu-pages-learn": "Fir méi ze wëssen", + "vector-anon-user-menu-pages-label": "Méi gewuer ginn iwwer d'Änneren", + "vector-main-menu-tooltip": "Haaptmenü", + "vector-toc-menu-tooltip": "Inhaltsverzeechnes", + "vector-toc-collapsible-button-label": "Inhaltsverzeechnes wiesselen", + "vector-site-nav-label": "Site", + "vector-main-menu-label": "Haaptmenü", + "vector-limited-width-toggle": "Déi limitéiert Breet vum Inhalt aktivéieren oder desaktivéieren", + "vector-page-tools-label": "Geschierkëscht", + "vector-page-tools-general-label": "Allgemeng", + "vector-page-tools-actions-label": "Aktiounen", + "vector-pin-element-label": "an déi säitlech Läischt réckelen", + "vector-unpin-element-label": "verstoppen", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskussioun]]", + "tooltip-vector-anon-user-menu-title": "Méi Optiounen", + "vector-prefs-limited-width": "Aktivéiert de Modus vun der limitéiert Breet", + "vector-prefs-limited-width-help": "De Modus fir eng limitéiert Breet fir eng verbessert Lieserfarung aktivéieren.", + "empty-language-selector-body": "Inhalter vun der Säit ginn an anere Sproochen net ënnerstëtzt." +} diff --git a/Vector/i18n/lbe.json b/Vector/i18n/lbe.json new file mode 100644 index 0000000..2d7fb9c --- /dev/null +++ b/Vector/i18n/lbe.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Soul Train" + ] + }, + "vector-languages": "Мазру", + "vector-action-addsection": "Мяъна ххи бан", + "vector-action-delete": "Леххан дуван", + "vector-action-move": "ЦӀа даххана даву", + "vector-action-protect": "Ххассал дуван", + "vector-view-create": "Ляхъан бан", + "vector-view-edit": "Дакьин дуван", + "vector-view-history": "Суратту дихьан дан", + "vector-view-view": "Ккалан", + "vector-more-actions": "Ттигу", + "vector-page-tools-label": "Ярагъ" +} diff --git a/Vector/i18n/lez.json b/Vector/i18n/lez.json new file mode 100644 index 0000000..b8e8cbc --- /dev/null +++ b/Vector/i18n/lez.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Lezgia", + "Migraghvi", + "Namik", + "Soul Train" + ] + }, + "vector-languages": "ЧӀалар", + "vector-language-button-label": "{{PLURAL:$1|$1 чӀал|$1 чӀалар}}", + "vector-no-language-button-label": "ЧӀалар алава авун", + "vector-action-addsection": "Тема алава авун", + "vector-action-delete": "Алудун", + "vector-action-move": "ТӀвар эхцигун", + "vector-action-protect": "Хуьн", + "vector-action-undelete": "ТуькӀуьр хъувун", + "vector-action-unprotect": "Хуьн дегишарун", + "vector-view-create": "ТуькӀуьрун", + "vector-view-edit": "Дуьзарин", + "vector-view-history": "Тарихдиз килигун", + "vector-view-view": "КӀелун", + "vector-view-viewsource": "Чешме къалурун", + "vector-more-actions": "Мадни", + "vector-toc-label": "Къене авайбур", + "vector-toc-beginning": "Бине", + "vector-page-tools-label": "Алатар", + "vector-page-tools-general-label": "ЧӀехидин", + "vector-unpin-element-label": "чуьнуьхун" +} diff --git a/Vector/i18n/lfn.json b/Vector/i18n/lfn.json new file mode 100644 index 0000000..f3ecd0d --- /dev/null +++ b/Vector/i18n/lfn.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Cgboeree", + "Chabi", + "Katxis" + ] + }, + "vector-action-addsection": "Ajunta un tema", + "vector-action-delete": "Sutrae", + "vector-action-move": "Move", + "vector-action-protect": "Proteje", + "vector-view-create": "Crea", + "vector-view-edit": "Edita", + "vector-view-history": "Mostra istoria", + "vector-view-view": "Leje", + "vector-more-actions": "Plu" +} diff --git a/Vector/i18n/lg.json b/Vector/i18n/lg.json new file mode 100644 index 0000000..4282900 --- /dev/null +++ b/Vector/i18n/lg.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Kizito" + ] + }, + "vector-action-addsection": "Tandikawo emboozi endala", + "vector-action-delete": "Gyawo olupapula luno", + "vector-action-move": "Simbuliza", + "vector-action-protect": "Ssiba", + "vector-action-undelete": "Zawo", + "vector-action-unprotect": "Kyusa ebikugizo", + "vector-view-create": "Lukolewo", + "vector-view-edit": "Kyusa", + "vector-view-history": "Ennanda ya fayiro eno", + "vector-view-view": "Soma", + "vector-view-viewsource": "Kebera obulambike obw'ennono obw'olupapula luno" +} diff --git a/Vector/i18n/li.json b/Vector/i18n/li.json new file mode 100644 index 0000000..d6016c4 --- /dev/null +++ b/Vector/i18n/li.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Ooswesthoesbes", + "Robin van der Vliet", + "Robin0van0der0vliet" + ] + }, + "vector-skin-desc": "Modern versie van MonoBook mit e frisj uterlik en verbaeteringe op 't gebeed van gebroeksvruntjelikheid", + "vector-language-button-label": "{{PLURAL:$1|$1 spraok|$1 spraoke}}", + "vector-action-addsection": "Voog köpke toe", + "vector-action-delete": "Sjaf eweg", + "vector-action-move": "Verplaats", + "vector-action-protect": "Besjirm", + "vector-action-undelete": "Plaats trök", + "vector-action-unprotect": "Anger beveiliging", + "vector-view-create": "Maak aan", + "vector-view-edit": "Bewirk", + "vector-view-history": "Bekiek de gesjiedenis", + "vector-view-view": "Laes", + "vector-view-viewsource": "Bekiek bróntèks", + "vector-more-actions": "Mieë" +} diff --git a/Vector/i18n/lij.json b/Vector/i18n/lij.json new file mode 100644 index 0000000..e5ca1ed --- /dev/null +++ b/Vector/i18n/lij.json @@ -0,0 +1,64 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Gastaz", + "Giromin Cangiaxo", + "N. Longo", + "S4b1nuz E.656" + ] + }, + "vector-skin-desc": "O fornìsce doî têmi Vector:\n* 2011 - Versción modèrna do MonoBook co-ina câa renovâ e di bèlli avantàggi inte l'adêuviabilitæ\n* 2022 - Versción svilupâ inte l'ànbito do progètto WMF [[mw:Desktop Improvements]]", + "prefs-vector-enable-vector-1-label": "Adêuvia Legacy Vector", + "prefs-vector-enable-vector-1-help": "Inti ànni a vegnî ciàn cianìn agiorniêmo a skin do Vector. O Vector Legacy o te permetiâ d'amiâ a versción vêgia do Vector ascì (do dexénbre 2019). Pe savéine de ciù in scî agiornaménti, vànni a-a nòstra [[mw:Reading/Web/Desktop_Improvements|pàgina do progètto]].", + "vector-opt-out": "Tórna a-a vêgia câa", + "vector-opt-out-tooltip": "Càngia e tò inpostaçioìn pe tornâ a-a vizoalizaçión da vêgia skin (legacy Vector)", + "vector-action-toggle-sidebar": "Atîva/Disatîva a bâra laterâle", + "vector-languages": "Léngoe", + "vector-language-button-aria-label": "Vànni a l'artìcolo inte 'n'âtra léngoa. Disponìbile in {{PLURAL:$1|$1 léngoa|$1 léngoe}}", + "vector-language-button-label": "{{PLURAL:$1|$1 léngoa|$1 léngoe}}", + "vector-no-language-button-label": "Azónzi léngoe", + "vector-no-language-button-aria-label": "St'artìcolo chi o l'exìste sôlo inte quésta léngoa. Azónzi l'artìcolo inte âtre léngoe", + "vector-language-redirect-to-top": "Inte 'sta Wikipedia chi, i ligàmmi a-e léngoe són mìssi in çìmma a-a pàgina, da-arénte a-o sò tìtolo. [[#p-lang-btn|Vànni in çìmma]].", + "vector-language-variant-switcher-label": "Càngia variànte da léngoa", + "vector-action-addsection": "Azónzi discusción", + "vector-action-delete": "Scancélla", + "vector-action-move": "Méscia", + "vector-action-protect": "Protézzi", + "vector-action-undelete": "Ricùpera", + "vector-action-unprotect": "Càngia a proteçión", + "vector-view-create": "Crêa", + "vector-view-edit": "Modìfica", + "vector-view-history": "Cronologîa", + "vector-view-view": "Lêzi", + "vector-view-viewsource": "Véddi o wikitèsto", + "vector-jumptonavigation": "Sâta a-a navegaçión", + "vector-jumptosearch": "Sâta a-a çèrchia", + "vector-jumptocontent": "Sâta a-o contegnûo", + "vector-more-actions": "Âtro", + "vector-search-loader": "Caregaménto di sugeriménti de çèrchia", + "vector-searchsuggest-containing": "Çèrca inte pàgine che contêgnan $1", + "vector-intro-page": "Help:Introduçión", + "vector-toc-label": "Ìndice", + "vector-toc-beginning": "Prinçìpio", + "vector-toc-toggle-button-label": "Atîva a sotoseçión $1", + "vector-anon-user-menu-pages": "Pàgine pe-i contribotoî no conésci", + "vector-anon-user-menu-pages-learn": "Pe savéine de ciù", + "vector-anon-user-menu-pages-label": "Pe savéine de ciù in scê modìfiche", + "vector-main-menu-tooltip": "Menù prinçipâ", + "vector-toc-menu-tooltip": "Tabélla di contegnûi", + "vector-toc-collapsible-button-label": "Altèrna a tabélla di contegnûi", + "vector-site-nav-label": "Scîto", + "vector-main-menu-label": "Menù prinçipâ", + "vector-limited-width-toggle": "Aliniâ a larghéssa limitâ do contegnûo", + "vector-page-tools-label": "Struménti", + "vector-page-tools-general-label": "Generâ", + "vector-page-tools-actions-label": "Açioìn", + "vector-pin-element-label": "méscia inta bâra laterâle", + "vector-unpin-element-label": "ascóndi", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discusción]]", + "tooltip-vector-anon-user-menu-title": "Âtre scèlte", + "vector-prefs-limited-width": "Ativâ a modalitæ a larghéssa limitâ", + "vector-prefs-limited-width-help": "Ativâ a modalitæ a larghéssa limitâ pe megioâ l'esperiénsa de letûa.", + "empty-language-selector-body": "Contegnûi da pàgina no suportæ in de âtre léngoe." +} diff --git a/Vector/i18n/liv.json b/Vector/i18n/liv.json new file mode 100644 index 0000000..0a9dfac --- /dev/null +++ b/Vector/i18n/liv.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Kengšepā", + "Warbola" + ] + }, + "vector-action-addsection": "Pan jūrõ tēma", + "vector-action-delete": "Kištāntõgid jarā", + "vector-action-move": "Vīž jarā", + "vector-action-protect": "Kaitsõmi", + "vector-view-create": "Lūo", + "vector-view-edit": "Redigīer", + "vector-view-history": "Nägţ istōrijõ", + "vector-view-view": "Vaņțõl", + "vector-view-viewsource": "Vaņ ovāt tekstõ" +} diff --git a/Vector/i18n/lki.json b/Vector/i18n/lki.json new file mode 100644 index 0000000..77a47ea --- /dev/null +++ b/Vector/i18n/lki.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Arash71", + "Hosseinblue", + "Lakzon" + ] + }, + "vector-skin-desc": "نسخه مدرن منوبوک با نگاه تازه و بهبود قابلیت استفاده", + "vector-action-addsection": "افزودن بۀخش", + "vector-action-delete": "حۀذف کردن/پاک کردن", + "vector-action-move": "جاوواز کرِدِن", + "vector-action-protect": "پروژۀ", + "vector-action-undelete": "گلآدائن حةذف/واگردانی حذف", + "vector-action-unprotect": "گؤەڕانن/تغییر سطح حفاظت", + "vector-view-create": "دؤِرس کردن/سازین", + "vector-view-edit": "دەسکاری", + "vector-view-history": "سئرکردن تاریخچۀ-ویرگار", + "vector-view-view": "خووەنن", + "vector-view-viewsource": "بنچەک(منبع) بۊن(سەیرکە)", + "vector-more-actions": "ویشتر/فرۀتر" +} diff --git a/Vector/i18n/lkt.json b/Vector/i18n/lkt.json new file mode 100644 index 0000000..83337bc --- /dev/null +++ b/Vector/i18n/lkt.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Peter57770" + ] + }, + "vector-view-edit": "Wayútȟokeča", + "vector-view-history": "Takú eháŋni blawá", + "vector-view-view": "Yawá yo/ye", + "vector-more-actions": "Táku kȟó" +} diff --git a/Vector/i18n/lld.json b/Vector/i18n/lld.json new file mode 100644 index 0000000..bfa5aab --- /dev/null +++ b/Vector/i18n/lld.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Asenoner", + "Starladin" + ] + }, + "vector-languages": "Rujenedes", + "vector-language-button-label": "{{PLURAL:$1|$1 lingaz|$1 lingac}}", + "vector-no-language-button-label": "Jonta rujenedes", + "vector-action-addsection": "Mët leprò n tema de descuscion", + "vector-action-delete": "Straihëia", + "vector-action-move": "Spostëia", + "vector-action-protect": "Straverda", + "vector-view-create": "Mët adum", + "vector-view-edit": "Muda", + "vector-view-history": "Storia dl documënt", + "vector-view-view": "Liej", + "vector-more-actions": "De plu", + "vector-searchsuggest-containing": "Chir les plates cun laite $1", + "vector-page-tools-label": "Strumënc", + "vector-page-tools-general-label": "Generel", + "vector-unpin-element-label": "nascuend" +} diff --git a/Vector/i18n/lmo.json b/Vector/i18n/lmo.json new file mode 100644 index 0000000..18e62c0 --- /dev/null +++ b/Vector/i18n/lmo.json @@ -0,0 +1,49 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Insübrich", + "Ninonino", + "Salvemm el lombard" + ] + }, + "vector-skin-desc": "\tEl forniss 2 tema Vector\n* 2011 - La version moderna del MonoBook con on aspet rinovad e tanti mijorament a la drovabilità\n* 2022 - la Vector costruida come part del proget WMF [[mw:Desktop Improvements]]", + "prefs-vector-enable-vector-1-label": "Drova el Vector Legacy", + "prefs-vector-enable-vector-1-help": "In di agn che vegnen sgionaremm meneman el tema Vector. Legacy Vector el te permetarà de visualizà la version passada de Vector (che la risaliss al dicember 2019). Per savenn pussee sora i asgiornament, visita la nostra [[mw:Reading/Web/Desktop_Improvements|pagina de progett]].", + "vector-opt-out": "Torna a l'aspet vegg", + "vector-opt-out-tooltip": "Cambia i to impostazzion per tornà a la visualizzazion de la pell che la gh'era prima (legacy Vector)", + "vector-action-toggle-sidebar": "Ativa/desativa la sbarra de fianch", + "vector-languages": "Lengue", + "vector-language-button-aria-label": "Vai a on articol in d'on'altra lenguaː Disponibil in {{PLURAL:$1|$1 lengua|$1 lengue}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lengua|$1 lengov}}", + "vector-no-language-button-label": "Sgionta lengue", + "vector-language-redirect-to-top": "In su questa ̻{{SITENAME}} chì i ligam interlinguistich a inn metud a la testa de la pagina in pari al titol de la vos. [[#p-lang-btn|Va in scima]].", + "vector-language-variant-switcher-label": "Cambia la variant de la lengua", + "vector-action-addsection": "Sgionta un argoment", + "vector-action-delete": "Scancella", + "vector-action-move": "Sposta", + "vector-action-protect": "Protesg", + "vector-action-undelete": "Recupera", + "vector-action-unprotect": "Cambia la protezzion", + "vector-view-create": "Crea", + "vector-view-edit": "Modifega", + "vector-view-history": "Varda la storia", + "vector-view-view": "Lensg", + "vector-view-viewsource": "Varda el codes sorgent", + "vector-jumptonavigation": "Salta a la navigazzion", + "vector-jumptosearch": "Và a cercà", + "vector-jumptocontent": "Và al contegnud", + "vector-more-actions": "An'mò", + "vector-search-loader": "Caregament di sugeriment de ricerca", + "vector-searchsuggest-containing": "Cerca i pagine che gh'hann dent $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Contegnud", + "vector-toc-beginning": "Testada", + "vector-toc-toggle-button-label": "Pizza o smorza la sot-sezzion $1", + "vector-anon-user-menu-pages": "Pagine per i editor minga coness", + "vector-anon-user-menu-pages-learn": "per savénn pussee", + "vector-anon-user-menu-pages-label": "Imprend pussee sora i modifeghe", + "vector-main-menu-tooltip": "Menù principal", + "vector-main-menu-label": "Menù principal", + "tooltip-vector-anon-user-menu-title": "Pussee de opzion" +} diff --git a/Vector/i18n/ln.json b/Vector/i18n/ln.json new file mode 100644 index 0000000..19cc48a --- /dev/null +++ b/Vector/i18n/ln.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Eruedin", + "Moyogo" + ] + }, + "vector-action-addsection": "Kobakisa mpɔ̂", + "vector-action-delete": "Kolímwisa", + "vector-action-move": "Kobóngola nkómbó", + "vector-action-protect": "Kobátela", + "vector-action-undelete": "Kolímwisa tɛ̂", + "vector-action-unprotect": " Kobátela tɛ̂", + "vector-view-create": "Kokela", + "vector-view-edit": "Kobɔngisa", + "vector-view-history": "Komɔ́nisa mokóló", + "vector-view-view": "Kotánga", + "vector-view-viewsource": "Komɔ́nisa mosólo", + "vector-more-actions": "Elandí" +} diff --git a/Vector/i18n/lo.json b/Vector/i18n/lo.json new file mode 100644 index 0000000..409b238 --- /dev/null +++ b/Vector/i18n/lo.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Aefgh39622", + "Lookruk" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ພາສາ}}", + "vector-action-addsection": "ເພີ່ມຫົວຂໍ້", + "vector-action-delete": "ລຶບ", + "vector-action-move": "ຍ້າຍ", + "vector-action-protect": "ປ້ອງກັນ", + "vector-view-create": "ສ້າງ", + "vector-view-edit": "ດັດແກ້", + "vector-view-history": "ເບິ່ງປະຫວັດ", + "vector-view-view": "ອ່ານ", + "vector-more-actions": "ເພີ່ມເຕີມ", + "vector-searchsuggest-containing": "ຊອກຫາໜ້າເວັບທີ່ມີ $1" +} diff --git a/Vector/i18n/lrc.json b/Vector/i18n/lrc.json new file mode 100644 index 0000000..d727cba --- /dev/null +++ b/Vector/i18n/lrc.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Beyronvan", + "Lorestani", + "Mogoeilor" + ] + }, + "vector-action-addsection": "سالفٱ اْزاف بٱکؽت", + "vector-action-delete": "پاکسا کردن", + "vector-action-move": "جا ڤ جا بۊئیت", + "vector-action-protect": "پر ۉ پیم بٱکؽت", + "vector-action-undelete": "حذف نبيئني", + "vector-action-unprotect": "حمايت آلشت بكيد", + "vector-view-create": "دۏرس كردن", + "vector-view-edit": "ڤیرایش", + "vector-view-history": "دیئن ڤیرگار", + "vector-view-view": "ڤٱناْ", + "vector-view-viewsource": "سرچشمه نه بوينيت", + "vector-more-actions": "بؽشتر" +} diff --git a/Vector/i18n/lt.json b/Vector/i18n/lt.json new file mode 100644 index 0000000..e687984 --- /dev/null +++ b/Vector/i18n/lt.json @@ -0,0 +1,49 @@ +{ + "@metadata": { + "authors": [ + "Albertas", + "Eitvys200", + "Garas", + "Homo", + "Hugo.arg", + "Matasg", + "Pavel1513", + "Perkunas", + "Tomasdd" + ] + }, + "skinname-vector": "Vektorinė", + "vector-skin-desc": "Moderni MonoBook versija su šviežiausia išvaizda ir daugybe panaudojamumo patobulinimų", + "prefs-vector-enable-vector-1-label": "Naudoti senąją vektorinę išvaizdą", + "vector-opt-out": "Įjungti senąją išvaizdą", + "vector-action-toggle-sidebar": "Rodyti šoninę juostą", + "vector-languages": "Kalbos", + "vector-language-button-label": "{{PLURAL:$1|$1 kalba|$1 kalbų}}", + "vector-no-language-button-label": "Pridėti kalbas", + "vector-action-addsection": "Pridėti temą", + "vector-action-delete": "Ištrinti", + "vector-action-move": "Pervardyti", + "vector-action-protect": "Užrakinti", + "vector-action-undelete": "Atkurti", + "vector-action-unprotect": "Keisti apsaugą", + "vector-view-create": "Kurti", + "vector-view-edit": "Keisti", + "vector-view-history": "Istorija", + "vector-view-view": "Skaityti", + "vector-view-viewsource": "Žiūrėti kodą", + "vector-jumptonavigation": "Pereiti į navigaciją", + "vector-jumptocontent": "Pereiti prie turinio", + "vector-more-actions": "Daugiau", + "vector-search-loader": "Įkeliami paieškos pasiūlymai", + "vector-searchsuggest-containing": "Ieškoti puslapių, turinčių $1", + "vector-toc-label": "Turinys", + "vector-toc-beginning": "Pradžia", + "vector-anon-user-menu-pages-learn": "sužinoti daugiau", + "vector-main-menu-tooltip": "Pagrindinis meniu", + "vector-toc-menu-tooltip": "Turinys", + "vector-page-tools-label": "Įrankiai", + "vector-page-tools-general-label": "Bendra", + "vector-unpin-element-label": "paslėpti", + "tooltip-vector-anon-user-menu-title": "Daugiau parametrų", + "vector-prefs-limited-width-help": "Įjunkite riboto pločio režimą, kad pagerintumėte skaitymo kokybę." +} diff --git a/Vector/i18n/ltg.json b/Vector/i18n/ltg.json new file mode 100644 index 0000000..d89d6df --- /dev/null +++ b/Vector/i18n/ltg.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Dark Eagle" + ] + }, + "vector-action-addsection": "Dalikt padaļu", + "vector-action-delete": "Iztreit", + "vector-action-move": "Puorceļt", + "vector-action-protect": "Apsorguot", + "vector-action-unprotect": "Puormeit apsardzeibu", + "vector-view-edit": "Pataiseit", + "vector-view-history": "Viesture", + "vector-view-view": "Vērtīs" +} diff --git a/Vector/i18n/lus.json b/Vector/i18n/lus.json new file mode 100644 index 0000000..328cae7 --- /dev/null +++ b/Vector/i18n/lus.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Jokomarel", + "RMizo" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ṭawng|$1 ṭawngte}}", + "vector-action-addsection": "Thupui belhna", + "vector-action-delete": "Paihna", + "vector-action-move": "Sawnna", + "vector-action-protect": "Venhimna", + "vector-action-undelete": "Lak kir lehna", + "vector-action-unprotect": "Venhimna dinhmun tidanglam rawh", + "vector-view-create": "Siamna", + "vector-view-edit": "Siamţhatna", + "vector-view-history": "Hunhlui-chanchin", + "vector-view-view": "Chhiarna", + "vector-view-viewsource": "A hnar enna", + "vector-more-actions": "Belh", + "vector-searchsuggest-containing": "$1 awmna phek zawng tur" +} diff --git a/Vector/i18n/luz.json b/Vector/i18n/luz.json new file mode 100644 index 0000000..3719d23 --- /dev/null +++ b/Vector/i18n/luz.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Bluehamed", + "Sahh", + "علی ساکی لرستانی" + ] + }, + "vector-action-addsection": "اْزاف کاٛردٱن مۉزۊ", + "vector-action-delete": "هٱسف", + "vector-action-move": "جاڤٱجا کاٛردٱن", + "vector-action-protect": "مهافزٱت", + "vector-view-create": "ساختٱن", + "vector-view-edit": "چۊشخٱ", + "vector-view-history": "دیڌٱن تاریخچٱ", + "vector-view-view": "خوندٱن", + "vector-more-actions": "مٱئلیتٱر" +} diff --git a/Vector/i18n/lv.json b/Vector/i18n/lv.json new file mode 100644 index 0000000..a108f44 --- /dev/null +++ b/Vector/i18n/lv.json @@ -0,0 +1,60 @@ +{ + "@metadata": { + "authors": [ + "Marozols", + "Papuass" + ] + }, + "vector-skin-desc": "Nodrošina 2 Vector apdares:\n* 2011. gada — MonoBook modernā versija ar svaigu izskatu un daudziem lietojamības uzlabojumiem.\n* 2022. gada — Vector, kas pārveidots kā daļa no WMF [[mw:Desktop Improvements]] projekta.", + "prefs-vector-enable-vector-1-label": "Izmantot Legacy Vector", + "prefs-vector-enable-vector-1-help": "Dažu nākamo gadu laikā mēs pakāpeniski atjaunināsim Vector apdari. Legacy Vector ļaus skatīt veco Vector versiju (kāda tā bija 2019. gada decembrī). Lai uzzinātu vairāk par jauninājumiem, dodies uz mūsu [[mw:Reading/Web/Desktop_Improvements|projekta lapu]].", + "vector-opt-out": "Pārslēgties uz veco izskatu", + "vector-opt-out-tooltip": "Nomaini savus iestatījumus, lai atgrieztos pie vecā apdares izskata (Legacy Vector)", + "vector-action-toggle-sidebar": "Pārslēgt sānjoslu", + "vector-languages": "Valodas", + "vector-language-button-aria-label": "Pāriet uz rakstu citā valodā. Pieejams {{PLURAL:$1|$1 valodās|$1 valodā|$1 valodās}}", + "vector-language-button-label": "{{PLURAL:$1|$1 valodas|$1 valoda|$1 valodas}}", + "vector-no-language-button-label": "Pievienot valodas", + "vector-no-language-button-aria-label": "Šis raksts pastāv tikai šajā valodā. Pievienot rakstu citā valodā", + "vector-language-variant-switcher-label": "Mainīt valodas variantu", + "vector-action-addsection": "Jauna sadaļa", + "vector-action-delete": "Dzēst", + "vector-action-move": "Pārvietot", + "vector-action-protect": "Aizsargāt", + "vector-action-undelete": "Atjaunot", + "vector-action-unprotect": "Mainīt aizsardzību", + "vector-view-create": "Izveidot", + "vector-view-edit": "Labot", + "vector-view-history": "Hronoloģija", + "vector-view-view": "Skatīt", + "vector-view-viewsource": "Aplūkot kodu", + "vector-jumptonavigation": "Pāriet uz navigāciju", + "vector-jumptosearch": "Pāriet uz meklēšanu", + "vector-jumptocontent": "Pāriet uz saturu", + "vector-more-actions": "Vairāk", + "vector-search-loader": "Ielādē meklēšanas ieteikumus", + "vector-searchsuggest-containing": "Meklēt lapas, kas satur $1", + "vector-intro-page": "Vikipēdija:Ievads", + "vector-toc-label": "Saturs", + "vector-toc-beginning": "Sākums", + "vector-toc-toggle-button-label": "Pārslēgt $1 apakšsadaļu", + "vector-anon-user-menu-pages": "Lapas redaktoriem, kuri nav pieslēgušies", + "vector-anon-user-menu-pages-learn": "uzzināt vairāk", + "vector-anon-user-menu-pages-label": "Uzzini vairāk par rediģēšanu", + "vector-main-menu-tooltip": "Galvenā izvēlne", + "vector-toc-menu-tooltip": "Satura rādītājs", + "vector-toc-collapsible-button-label": "Pārslēgt satura rādītāju", + "vector-site-nav-label": "Vietne", + "vector-main-menu-label": "Galvenā izvēlne", + "vector-limited-width-toggle": "Pārslēgt ierobežoto satura platumu", + "vector-page-tools-label": "Rīki", + "vector-page-tools-general-label": "Vispārīgi", + "vector-page-tools-actions-label": "Darbības", + "vector-pin-element-label": "pārvietot uz sānjoslu", + "vector-unpin-element-label": "paslēpt", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskusija]]", + "tooltip-vector-anon-user-menu-title": "Vairāk iespēju", + "vector-prefs-limited-width": "Iespējot ierobežota platuma režīmu", + "vector-prefs-limited-width-help": "Iespējojiet ierobežota platuma režīmu, lai uzlabotu lasīšanas pieredzi.", + "empty-language-selector-body": "Lapas saturs netiek atbalstīts citās valodās." +} diff --git a/Vector/i18n/lzh.json b/Vector/i18n/lzh.json new file mode 100644 index 0000000..21c7956 --- /dev/null +++ b/Vector/i18n/lzh.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Itsmine", + "Justincheng12345", + "Nemo bis" + ] + }, + "skinname-vector": "動力", + "vector.css": "/* 此之 CSS 用於動力面之簿也 */", + "vector.js": "/* 此之JavaScript將載於用動力面之簿 */", + "vector-action-addsection": "入題", + "vector-action-delete": "刪", + "vector-action-move": "遷", + "vector-action-protect": "緘", + "vector-action-undelete": "覽刪", + "vector-action-unprotect": "啟", + "vector-view-create": "立", + "vector-view-edit": "纂", + "vector-view-history": "覽史", + "vector-view-view": "閱", + "vector-view-viewsource": "覽源", + "vector-more-actions": "餘" +} diff --git a/Vector/i18n/lzz.json b/Vector/i18n/lzz.json new file mode 100644 index 0000000..23d0055 --- /dev/null +++ b/Vector/i18n/lzz.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Bombola", + "Ceas08", + "Cem Rize", + "Erdemaslancan", + "Velg" + ] + }, + "vector-action-addsection": "Konu ekle", + "vector-action-delete": "Jili", + "vector-action-move": "Tori", + "vector-action-protect": "İçvi", + "vector-view-create": "dokʼidi", + "vector-view-edit": "Doktiri", + "vector-view-history": "Dosyaşi tarixi", + "vector-view-view": "İǩitxi", + "vector-more-actions": "Daha fazla" +} diff --git a/Vector/i18n/mad.json b/Vector/i18n/mad.json new file mode 100644 index 0000000..bfe3d87 --- /dev/null +++ b/Vector/i18n/mad.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Abdiafrizal", + "Boesenbergia", + "NoiX180" + ] + }, + "vector-languages": "Bhâsa", + "vector-no-language-button-label": "Tambâ bhâsa", + "vector-action-addsection": "Longkang anyar", + "vector-action-delete": "Kosot", + "vector-action-move": "Allè", + "vector-action-protect": "Lènḍhungè", + "vector-view-create": "Ghâbây", + "vector-view-edit": "Beccè'", + "vector-view-history": "Tèngghu riwayât", + "vector-view-view": "Bâca", + "vector-more-actions": "Laènna", + "vector-page-tools-label": "Pakakas", + "vector-unpin-element-label": "pangètek" +} diff --git a/Vector/i18n/mag.json b/Vector/i18n/mag.json new file mode 100644 index 0000000..043a5d0 --- /dev/null +++ b/Vector/i18n/mag.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "ऐक्टिवेटेड्" + ] + }, + "vector-languages": "भासा", + "vector-language-button-label": "{{PLURAL:$1|$1 भासा}}", + "vector-no-language-button-label": "भासा जोड़ी", + "vector-action-addsection": "बिषय जोड़ी", + "vector-action-delete": "हटावी", + "vector-action-move": "स्थानान्तरण", + "vector-action-protect": "सुरक्षित करी", + "vector-view-create": "बनावी", + "vector-view-edit": "सम्पादन", + "vector-view-history": "इतिहास देखी", + "vector-view-view": "पढ़ी", + "vector-more-actions": "आउ", + "vector-searchsuggest-containing": "$1 बाला पन्ना खोजी", + "vector-toc-label": "सामग्री", + "vector-toc-beginning": "प्रारम्भ", + "vector-page-tools-label": "उपकरण", + "vector-page-tools-general-label": "सामान्य", + "vector-unpin-element-label": "लुकावी" +} diff --git a/Vector/i18n/mai.json b/Vector/i18n/mai.json new file mode 100644 index 0000000..f85dddc --- /dev/null +++ b/Vector/i18n/mai.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Ggajendra", + "Tulsi Bhagat", + "Umeshberma", + "बिप्लब आनन्द" + ] + }, + "skinname-vector": "सदिश", + "vector-action-addsection": "विचार-बिन्दु जोडी", + "vector-action-delete": "मेटाबी", + "vector-action-move": "स्थानान्तरण करी", + "vector-action-protect": "रक्षण करू", + "vector-action-undelete": "आपस लाउ", + "vector-action-unprotect": "सुरक्षा बदलू", + "vector-view-create": "बनाबी", + "vector-view-edit": "सम्पादन करी", + "vector-view-history": "इतिहास देखी", + "vector-view-view": "पढी", + "vector-view-viewsource": "स्रोत देखी", + "vector-more-actions": "आर" +} diff --git a/Vector/i18n/mak.json b/Vector/i18n/mak.json new file mode 100644 index 0000000..6720ab2 --- /dev/null +++ b/Vector/i18n/mak.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Han4299" + ] + }, + "vector-languages": "Basa", + "vector-language-button-label": "{{PLURAL:$1|$1 basana}}", + "vector-no-language-button-label": "Tamba basa", + "vector-action-addsection": "Tawang beru", + "vector-action-delete": "Pelak", + "vector-action-move": "Palettek", + "vector-action-protect": "Linrungi", + "vector-view-create": "Parek", + "vector-view-edit": "Pinra", + "vector-view-history": "Cinik riwayakna", + "vector-view-view": "Baca", + "vector-more-actions": "Maraengangna", + "vector-searchsuggest-containing": "Boya barambang na ambonei $1", + "vector-page-tools-label": "Parewa", + "vector-page-tools-general-label": "Ammang", + "vector-unpin-element-label": "pacokkoi" +} diff --git a/Vector/i18n/map-bms.json b/Vector/i18n/map-bms.json new file mode 100644 index 0000000..bff0e37 --- /dev/null +++ b/Vector/i18n/map-bms.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Mbrt", + "StefanusRA" + ] + }, + "vector-action-addsection": "Nambah topik", + "vector-action-delete": "Busek", + "vector-action-move": "Pindah", + "vector-action-protect": "Reksa", + "vector-action-undelete": "Batalna pambusakan", + "vector-action-unprotect": "Owahi pangreksan", + "vector-view-create": "Gawe", + "vector-view-edit": "Sunting", + "vector-view-history": "Sajarah kaca", + "vector-view-view": "Waca", + "vector-view-viewsource": "Deleng sumbere", + "vector-more-actions": "Liane" +} diff --git a/Vector/i18n/mdf.json b/Vector/i18n/mdf.json new file mode 100644 index 0000000..b177e2a --- /dev/null +++ b/Vector/i18n/mdf.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Metsavend", + "Numulunj pilgae", + "Валгриш" + ] + }, + "vector-languages": "Кяльхть", + "vector-language-button-label": "{{PLURAL:$1|$1 кяль|$1 кяльхть}}", + "vector-no-language-button-label": "Поладомс кяльхть", + "vector-action-addsection": "Поладомс мезень колга корхтамс", + "vector-action-delete": "Нардамс", + "vector-action-move": "Шашфтомс", + "vector-action-protect": "Араламс", + "vector-action-undelete": "Мърдафтомс", + "vector-action-unprotect": "Араламать полафтомс", + "vector-view-create": "Тиемс", + "vector-view-edit": "Петнемс", + "vector-view-history": "История няфтемс", + "vector-view-view": "Морафтомс", + "vector-view-viewsource": "Лисьма няфтемс", + "vector-more-actions": "Сяда лама", + "vector-searchsuggest-containing": "Вешендемс лопат, конатнень эса $1", + "vector-toc-label": "Потмось", + "vector-toc-beginning": "Ушеткссь", + "vector-page-tools-label": "Кядьёнкст", + "vector-page-tools-general-label": "Марстонь", + "vector-unpin-element-label": "Кяшемс" +} diff --git a/Vector/i18n/mg.json b/Vector/i18n/mg.json new file mode 100644 index 0000000..707ac7a --- /dev/null +++ b/Vector/i18n/mg.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Jagwar" + ] + }, + "vector-action-addsection": "Hanampy lohahevitra", + "vector-action-delete": "Fafana", + "vector-action-move": "Hanolo anarana", + "vector-action-protect": "Arovy", + "vector-action-undelete": "Avereno", + "vector-action-unprotect": "Hanala ny fiarovana", + "vector-view-create": "Foronona", + "vector-view-edit": "Hanova", + "vector-view-history": "Hijery ny tantara", + "vector-view-view": "Hamaky", + "vector-view-viewsource": "Hijery fango", + "vector-more-actions": "Be kokoa" +} diff --git a/Vector/i18n/mhr.json b/Vector/i18n/mhr.json new file mode 100644 index 0000000..721a53c --- /dev/null +++ b/Vector/i18n/mhr.json @@ -0,0 +1,34 @@ +{ + "@metadata": { + "authors": [ + "Azim", + "Sergey Ivanov", + "Сай", + "Санюн Вадик", + "Lifeway", + "Венина Наталья Константиновна" + ] + }, + "vector-opt-out": "Тошто тӱжвал тӱс деке уэш куснаш", + "vector-languages": "Йылме-влак", + "vector-language-button-label": "{{PLURAL:$1|$1 йылме}}", + "vector-no-language-button-label": "Йылме-влакым ешараш", + "vector-action-addsection": "Темым ешараш", + "vector-action-delete": "Кораҥдаш", + "vector-action-move": "Лӱмым вашталташ", + "vector-action-protect": "Тӧрлатымаш деч аралаш", + "vector-action-undelete": "Шӧрымым пӧртылаш", + "vector-action-unprotect": "Оролым вашталташ", + "vector-view-create": "Ышташ", + "vector-view-edit": "Тӧрлаташ", + "vector-view-history": "Историйым ончалаш", + "vector-view-view": "Лудаш", + "vector-view-viewsource": "Тӱҥалтыш текстым ончалаш", + "vector-more-actions": "Эше", + "vector-searchsuggest-containing": "$1 мутан лаштыклам кычалмаш", + "vector-toc-label": "Контент", + "vector-toc-beginning": "Тӱҥалтыш", + "vector-page-tools-label": "Ӱзгар-влак", + "vector-page-tools-general-label": "Чумыр", + "vector-unpin-element-label": "шылташ" +} diff --git a/Vector/i18n/mi.json b/Vector/i18n/mi.json new file mode 100644 index 0000000..c843754 --- /dev/null +++ b/Vector/i18n/mi.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "MinecraftAustralia", + "Piwaiwaka", + "Ultron90" + ] + }, + "vector-languages": "Reo", + "vector-no-language-button-label": "Tāpiri reo", + "vector-action-delete": "Muku", + "vector-action-move": "Nuku", + "vector-view-view": "Tirohia", + "vector-unpin-element-label": "huna" +} diff --git a/Vector/i18n/mic.json b/Vector/i18n/mic.json new file mode 100644 index 0000000..3079089 --- /dev/null +++ b/Vector/i18n/mic.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Amqui" + ] + }, + "vector-action-move": "Ejigliwsit", + "vector-view-create": "Etlitoq", + "vector-view-view": "Egiljet" +} diff --git a/Vector/i18n/min.json b/Vector/i18n/min.json new file mode 100644 index 0000000..e9ca322 --- /dev/null +++ b/Vector/i18n/min.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Iwan Novirion", + "Luthfi94", + "Naval Scene", + "VoteITP" + ] + }, + "skinname-vector": "Vektor", + "vector-action-addsection": "Bagian baru", + "vector-action-delete": "Hapuih", + "vector-action-move": "Pindahkan", + "vector-action-protect": "Linduangkan", + "vector-action-undelete": "Pambatalan pangapuihan", + "vector-action-unprotect": "Tuka palinduangan", + "vector-view-create": "Buek", + "vector-view-edit": "Suntiang", + "vector-view-history": "Riwayaik", + "vector-view-view": "Baco", + "vector-view-viewsource": "Caliak sumber", + "vector-more-actions": "Lainnyo" +} diff --git a/Vector/i18n/mk.json b/Vector/i18n/mk.json new file mode 100644 index 0000000..612f0d7 --- /dev/null +++ b/Vector/i18n/mk.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bjankuloski06", + "Brest" + ] + }, + "skinname-vector": "Старо векторско (2010)", + "skinname-vector-2022": "Векторско (2022)", + "vector-specialversion-name": "Векторско", + "vector-skin-desc": "Дава две верзии на „Векторско“:\n\n* 2011 — Современа верзија на рувото „Монобук“ со свеж изглед и многу подобрувања на употребливоста.\n* 2022 — „Векторско“ изработено како дел од проектот „[[mw:Desktop Improvements|Столни подобрувања]]“ на Фондацијата Викимедија.", + "prefs-vector-enable-vector-1-label": "Користи Векторско по старо", + "prefs-vector-enable-vector-1-help": "Во текот на следните неколку години постепено ќе го надградуваме рувото Векторско. Неговата употреба по старо ќе ви овозможува да ја гледате старата верзија (по податок од декември 2019 г.). За да дознаете повеќе за надградбите, појдете на нашата [[mw:Reading/Web/Desktop_Improvements|проектна страница]].", + "vector-opt-out": "Смени на стариот изглед", + "vector-opt-out-tooltip": "Сменете си ги нагодувањата за да се вратите на стариот изглед на рувото (поранешното Векторско)", + "vector.css": "/* Тука поставениот CSS се однесува на корисниците на рувото „Векторско“ */", + "vector.js": "/* Тука поставениот JavaScript ќе им се вчитува на корисниците што го користат рувото „Векторско“ */", + "vector-action-toggle-sidebar": "Префрлање на страничник", + "vector-languages": "Јазици", + "vector-language-button-aria-label": "Појдете на статија на друг јазик. Достапно на {{PLURAL:$1|$1 јазик|$1 јазици}}", + "vector-language-button-label": "{{PLURAL:$1|$1 јазик|$1 јазици}}", + "vector-no-language-button-label": "Додај јазици", + "vector-no-language-button-aria-label": "Оваа статија постои само на овој јазик. Додајте ја статијата за други јазици", + "vector-language-redirect-to-top": "Јазичните врски на проектот {{SITENAME}} се во горниот дел на страницата, спроти насловот на статијата. [[#p-lang-btn|Одете најгоре]].", + "vector-language-variant-switcher-label": "Менување на јазичната варијанта", + "vector-action-addsection": "Додај тема", + "vector-action-delete": "Избриши", + "vector-action-move": "Премести", + "vector-action-protect": "Заштити", + "vector-action-undelete": "Врати", + "vector-action-unprotect": "Измени заштита", + "vector-view-create": "Создај", + "vector-view-edit": "Уреди", + "vector-view-history": "Историја", + "vector-view-view": "Читај", + "vector-view-viewsource": "Извор", + "vector-jumptonavigation": "Прејди на прегледникот", + "vector-jumptosearch": "Прејди на пребарувањето", + "vector-jumptocontent": "Прејди на содржината", + "vector-more-actions": "Повеќе", + "vector-search-loader": "Вчитувам предлози за пребарувањето", + "vector-searchsuggest-containing": "Пребарај страници кои го содржат $1", + "vector-intro-page": "Help:Вовед", + "vector-toc-label": "Содржина", + "vector-toc-beginning": "Почеток", + "vector-toc-toggle-button-label": "Префрли на пододделот $1", + "vector-anon-user-menu-pages": "Страници за одјавени уредници", + "vector-anon-user-menu-pages-learn": "дознајте повеќе", + "vector-anon-user-menu-pages-label": "Дознајте повеќе за уредувањето", + "vector-main-menu-tooltip": "Главно мени", + "vector-toc-menu-tooltip": "Содржина", + "vector-toc-collapsible-button-label": "Прик./скр. содржина", + "vector-site-nav-label": "Мрежно место", + "vector-main-menu-label": "Главно мени", + "vector-limited-width-toggle": "Префрли ограничена ширина на содржината", + "vector-page-tools-label": "Алатки", + "vector-page-tools-general-label": "Општо", + "vector-page-tools-actions-label": "Дејства", + "vector-pin-element-label": "премести во страничникот", + "vector-unpin-element-label": "скриј", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Разговор]]", + "tooltip-vector-anon-user-menu-title": "Повеќе можности", + "vector-prefs-limited-width": "Овозможи режим со ограничена ширина", + "vector-prefs-limited-width-help": "Овозможи режим со ограничена ширина за подобрено читање.", + "empty-language-selector-body": "Содржината на страницата не е поддржана на други јазици." +} diff --git a/Vector/i18n/ml.json b/Vector/i18n/ml.json new file mode 100644 index 0000000..ca252ed --- /dev/null +++ b/Vector/i18n/ml.json @@ -0,0 +1,46 @@ +{ + "@metadata": { + "authors": [ + "Akbarali", + "Anoopan", + "Praveenp" + ] + }, + "skinname-vector": "വെക്റ്റർ പഴമ (2010)", + "skinname-vector-2022": "വെക്റ്റർ (2022)", + "vector-specialversion-name": "വെക്റ്റർ", + "vector-skin-desc": "രണ്ട് വെക്റ്റർ ദൃശ്യരൂപങ്ങൾ ലഭ്യമാണ്\n*2011 - പുതിയരൂപവും, നിരവധി ഉപയോഗസൗഹൃദ മെച്ചപ്പെടുത്തലുകളുമുള്ള മോണോബുക്കിന്റെ നൂതന പതിപ്പ്\n*2022 - വിക്കിമീഡിയ ഫൗണ്ടേഷന്റെ [[mw:Desktop Improvements|ഡെസ്ക്ടോപ്പ് മെച്ചപ്പെടുത്തൽ]] പദ്ധതിയുടെ ഭാഗമായി നിർമ്മിച്ച വെക്റ്റർ", + "prefs-vector-enable-vector-1-label": "പഴയ വെക്റ്റർ ഉപയോഗിക്കുക", + "prefs-vector-enable-vector-1-help": "അടുത്ത കുറച്ച് വർഷങ്ങളിൽ, ഞങ്ങൾ വെക്റ്റർ ദൃശ്യരൂപം ക്രമേണ പുതുക്കും വെക്‌ടറിന്റെ പഴയ പതിപ്പ് കാണാൻ ലെഗസി വെക്റ്റർ നിങ്ങളെ അനുവദിക്കും (ഡിസംബർ 2019 വരെ). അപ്ഡേറ്റുകളെക്കുറിച്ച് കൂടുതലറിയാൻ, ഞങ്ങളുടെ [[mw:Reading/Web/Desktop_Improvements|പ്രോജക്റ്റ് താൾ]] കാണുക.", + "vector-opt-out": "പഴയ ദൃശ്യരൂപത്തിലേക്ക് മടങ്ങുക", + "vector.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/", + "vector.js": "/*ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുന്ന ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും*/", + "vector-languages": "ഭാഷകൾ", + "vector-language-button-label": "{{PLURAL:$1|ഒരു ഭാഷ|$1 ഭാഷകൾ}}", + "vector-no-language-button-label": "ഭാഷകൾ ചേർക്കുക", + "vector-language-redirect-to-top": "ഈ {{SITENAME}} പദ്ധതിയിൽ ഭാഷാ കണ്ണികൾ, താളിനു മുകളിൽ ലേഖനത്തിന്റെ തലക്കെട്ടിന് എതിർ വശത്തായി ആണുള്ളത്. [[#p-lang-btn|മുകളിലേക്ക് പോവുക]].", + "vector-language-variant-switcher-label": "ഭാഷയുടെ ചരം മാറ്റുക", + "vector-action-addsection": "വിഷയം ചേർക്കുക", + "vector-action-delete": "മായ്ക്കുക", + "vector-action-move": "തലക്കെട്ട് മാറ്റുക", + "vector-action-protect": "സം‌രക്ഷിക്കുക", + "vector-action-undelete": "മായ്ക്കപ്പെട്ടത് പുനഃസ്ഥാപിക്കുക", + "vector-action-unprotect": "സംരക്ഷണത്തിൽ മാറ്റംവരുത്തുക", + "vector-view-create": "സൃഷ്ടിക്കുക", + "vector-view-edit": "തിരുത്തുക", + "vector-view-history": "നാൾവഴി കാണുക", + "vector-view-view": "വായിക്കുക", + "vector-view-viewsource": "മൂലരൂപം കാണുക", + "vector-more-actions": "കൂടുതൽ", + "vector-searchsuggest-containing": "$1 അടങ്ങിയ പേജുകൾക്കായി തിരയുക", + "vector-toc-label": "ഉള്ളടക്കം", + "vector-anon-user-menu-pages-learn": "കൂടുതൽ അറിയുക", + "vector-main-menu-tooltip": "പ്രധാന മെനു", + "vector-toc-menu-tooltip": "ഉള്ളടക്കപ്പട്ടിക", + "vector-site-nav-label": "സൈറ്റ്", + "vector-main-menu-label": "പ്രധാന മെനു", + "vector-page-tools-label": "ഉപകരണങ്ങൾ", + "vector-page-tools-general-label": "സാർവത്രികം", + "vector-unpin-element-label": "മറയ്ക്കുക", + "tooltip-vector-anon-user-menu-title": "കൂടുതൽ ഐച്ഛികങ്ങൾ" +} diff --git a/Vector/i18n/mn.json b/Vector/i18n/mn.json new file mode 100644 index 0000000..cc1fe95 --- /dev/null +++ b/Vector/i18n/mn.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Chinneeb", + "MongolWiki", + "Sembuk", + "Wisdom" + ] + }, + "prefs-vector-enable-vector-1-label": "Хуучны Vector ашиглах", + "vector-opt-out": "Хуучин хувилбарт шилжих", + "vector-opt-out-tooltip": "Сайтын скинийг хуучин хувилбарт шилжүүлэх (legacy Vector)", + "vector-action-toggle-sidebar": "Хажуугийн цэсийг нээж хаах", + "vector-languages": "Хэлнүүд", + "vector-language-button-label": "{{PLURAL:$1|$1 хэлээр}}", + "vector-language-redirect-to-top": "Хэлний цэсийг хуудасны баруун дээд өнцгөөс харна уу. [[#p-lang-btn|Эхлэл рүү шилжих]].", + "vector-action-addsection": "Сэдэв нэмэх", + "vector-action-delete": "Устгах", + "vector-action-move": "Зөөх", + "vector-action-protect": "Хамгаалах", + "vector-action-undelete": "Үл устгах", + "vector-action-unprotect": "Хамгаалалтын түвшинг солих", + "vector-view-create": "Үүсгэх", + "vector-view-edit": "Засварлах", + "vector-view-history": "Түүх", + "vector-view-view": "Унших", + "vector-view-viewsource": "Кодыг харах", + "vector-more-actions": "Дэлгэрэнгүй", + "vector-searchsuggest-containing": "$1 бичвэрийг агуулсан хуудсыг хайх", + "vector-toc-label": "Гарчиг", + "vector-toc-beginning": "Эхлэл", + "vector-toc-toggle-button-label": "$1 хэсгийг нээж хаах", + "vector-main-menu-tooltip": "Үндсэн цэс", + "vector-toc-menu-tooltip": "Гарчиг", + "vector-toc-collapsible-button-label": "Гарчигийг нээж хаах", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Үндсэн цэс", + "vector-page-tools-label": "Хэрэглүүр", + "vector-page-tools-general-label": "Ерөнхий", + "vector-page-tools-actions-label": "Үйлдэл", + "vector-pin-element-label": "хажуугийн цэсэнд шилжүүлэх", + "vector-unpin-element-label": "хумих" +} diff --git a/Vector/i18n/mnc-mong.json b/Vector/i18n/mnc-mong.json new file mode 100644 index 0000000..077e1fd --- /dev/null +++ b/Vector/i18n/mnc-mong.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Nikki" + ] + }, + "vector-languages": "ᡤᡳᠰᡠᠨ", + "vector-action-addsection": "ᠨᠣᡤᡳᠯᠠ ᠵᠣᡵᡳᠩᡤᠠ", + "vector-action-delete": "ᡩᠠᠪᡤᡳᡵᡝ", + "vector-action-move": "ᡤᡠᡵᡳᠪᡠᡵᡝ", + "vector-action-protect": "ᡴᠠᡵᠮᠠᡵᠠ", + "vector-action-unprotect": "ᡴᠠᡵᠮᠠᠨ ᠪᡝ ᡥᠠᠯᠠᠮᠪᡳ", + "vector-view-create": "ᡳᠯᡳᠪᡠᡵᡝ", + "vector-view-edit": "ᠪᠠᠨᠵᡳᠪᡠᠮᡝ ᠠᡵᠠᡵᠠ", + "vector-view-history": "ᡝᡵᡝ ᡧᡠ ᡶᡳᠶᡝᠯᡝᠨ ᡳ ᠰᡠᡩᡠᡵᡳ ᠪᡝ ᠪᠠᡳᠴᠠᡵᠠ", + "vector-view-view": "ᡥᡡᠯᠠᡵᠠ", + "vector-view-viewsource": "ᡩᠠ ᡧᡠ ᠸᡝᠨ ᠪᡝ ᠪᠠᡳᠴᠠᡵᠠ", + "vector-more-actions": "ᡝᠯᡝ", + "vector-toc-label": "ᡧᠣᡧᠣᡥᠣᠨ ᡥᠠᠴᡳᠨ", + "vector-page-tools-label": "ᠠᡤᡡᡵᠠ ᡳ ᠰᡳᡨᡥᡝᠨ" +} diff --git a/Vector/i18n/mnc.json b/Vector/i18n/mnc.json new file mode 100644 index 0000000..4418c0c --- /dev/null +++ b/Vector/i18n/mnc.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "ChoiChong", + "Chulsu463", + "Minggantu", + "Obonggi", + "Араси" + ] + }, + "vector-action-addsection": "Nogila joringga", + "vector-action-delete": "Dabgire", + "vector-action-move": "Guribure", + "vector-action-protect": "Karmara", + "vector-view-create": "Ilibure", + "vector-view-edit": "Banjibume arara", + "vector-view-history": "Ere xu fiyelen i suduri be baicara", + "vector-view-view": "Hvlara", + "vector-view-viewsource": "Da šu wen be baicara", + "vector-more-actions": "Ele lbdu tuwanaki" +} diff --git a/Vector/i18n/mni.json b/Vector/i18n/mni.json new file mode 100644 index 0000000..33ca046 --- /dev/null +++ b/Vector/i18n/mni.json @@ -0,0 +1,32 @@ +{ + "@metadata": { + "authors": [ + "Awangba Mangang", + "꯴꯰꯴" + ] + }, + "vector-languages": "ꯂꯣꯟꯁꯤꯡ", + "vector-language-button-label": "{{PLURAL:$1|$1 ꯂꯣꯟ|$1 ꯂꯣꯟꯁꯤꯡ}}", + "vector-no-language-button-label": "ꯂꯣꯟꯁꯤꯡ ꯍꯥꯞꯆꯤꯟꯕ", + "vector-action-addsection": "ꯅꯩꯅꯕ ꯍꯤꯔꯝ ꯍꯥꯞꯆꯤꯟꯂꯨ", + "vector-action-delete": "ꯀꯛꯊꯠꯄꯥ", + "vector-action-move": "ꯂꯦꯡꯍꯟꯕꯥ", + "vector-action-protect": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ", + "vector-view-create": "ꯁꯥꯕꯥ", + "vector-view-edit": "ꯁꯦꯝꯒꯠꯄꯥ", + "vector-view-history": "ꯄꯨꯋꯥꯔꯤ ꯎꯠꯂꯨ", + "vector-view-view": "ꯄꯥꯑꯣ", + "vector-view-viewsource": "ꯍꯧꯔꯛꯐꯝ ꯌꯦꯡꯉꯨ", + "vector-jumptosearch": "ꯊꯤꯕꯥ ꯗ ꯆꯣꯡꯉꯨ", + "vector-more-actions": "ꯋꯥꯠꯂꯤ", + "vector-searchsuggest-containing": "ꯂꯃꯥꯏꯁꯤꯡ ꯑꯁꯤ ꯌꯥꯎꯕ ꯊꯤꯕꯥ $1", + "vector-toc-label": "ꯃꯅꯨꯡꯒꯤ ꯑꯌꯥꯎꯕꯁꯤꯡ", + "vector-toc-beginning": "ꯍꯧꯔꯛꯄ", + "vector-anon-user-menu-pages-learn": "ꯍꯦꯟꯅ ꯇꯝꯁꯤꯟꯂꯨ", + "vector-site-nav-label": "ꯃꯐꯝ", + "vector-main-menu-label": "ꯃꯔꯨꯑꯣꯏꯕ ꯌꯦꯡꯐꯝ", + "vector-page-tools-label": "ꯈꯨꯠꯂꯥꯏꯁꯤꯡ", + "vector-page-tools-general-label": "ꯃꯌꯥꯝꯒꯤ ꯑꯣꯏꯕ", + "vector-page-tools-actions-label": "ꯊꯕꯛ ꯄꯥꯡꯊꯣꯛꯄ", + "vector-unpin-element-label": "ꯂꯣꯠꯂꯨ" +} diff --git a/Vector/i18n/mnw.json b/Vector/i18n/mnw.json new file mode 100644 index 0000000..a8722ef --- /dev/null +++ b/Vector/i18n/mnw.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Htawmonzel", + "咽頭べさ" + ] + }, + "vector-languages": "အရေဝ်ဘာသာဂမၠိုင်", + "vector-language-button-label": "{{PLURAL:$1|$1 အရေဝ်ဘာသာ|$1 အရေဝ်ဘာသာဂမၠိုင်}}", + "vector-no-language-button-label": "စုတ် အရေဝ်ဘာသာဂမၠိုင်", + "vector-action-addsection": "စုတ် ပရူပရာ", + "vector-action-delete": "ပလီု", + "vector-action-move": "ပြံင်ပဆုဲ", + "vector-action-protect": "စဵုဒၞာ", + "vector-action-undelete": "ဟွံသ္ပပလီုထောံ", + "vector-view-create": "ခၞံကၠောန်", + "vector-view-edit": "ပလေဝ်ဒါန်", + "vector-view-history": "ထ္ၜး လၟေင်အပြံင်အလှာဲ", + "vector-view-view": "ဗှ်", + "vector-more-actions": "ဆက်ဗှ်", + "vector-searchsuggest-containing": "ဂၠာဲသွက်မုက်လိက်လုပ်အဝေါၚ် $1ဂမၠိုၚ်", + "vector-toc-label": "မာတိကာ", + "vector-toc-beginning": "စနူကၠာ", + "vector-page-tools-label": "ကြိယာဂမၠိုၚ်", + "vector-page-tools-general-label": "နာနာ", + "vector-unpin-element-label": "ပၞုက်" +} diff --git a/Vector/i18n/mo.json b/Vector/i18n/mo.json new file mode 100644 index 0000000..2431dcf --- /dev/null +++ b/Vector/i18n/mo.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Cybernenea11", + "TheChampionMan1234" + ] + }, + "vector-action-delete": "Штерӂере", + "vector-action-move": "Реденумире", + "vector-action-protect": "Протежаре", + "vector-view-create": "Креаре", + "vector-view-edit": "Едитязэ", + "vector-view-history": "Историк", + "vector-view-view": "Лектурэ", + "vector-more-actions": "Май мулт" +} diff --git a/Vector/i18n/mos.json b/Vector/i18n/mos.json new file mode 100644 index 0000000..e8d675c --- /dev/null +++ b/Vector/i18n/mos.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Abdul Fatawu 352", + "Amire80", + "Hasslaebetch" + ] + }, + "vector-languages": "Goama", + "vector-language-button-label": "{{PLURAL:$1|$1 buud-gomde|$1 buud-goama}}", + "vector-no-language-button-label": "Paas goama", + "vector-action-addsection": "Paase wɛɛbgẽ", + "vector-action-delete": "Yẽese", + "vector-action-move": "Kedme", + "vector-action-protect": "Kogle", + "vector-view-create": "Naane", + "vector-view-edit": "Tekre", + "vector-view-history": "Gese kibare", + "vector-view-view": "Karme", + "vector-more-actions": "Paase", + "vector-searchsuggest-containing": "Bao nemse n tar $1", + "vector-page-tools-label": "Teedo", + "vector-page-tools-general-label": "Bõn-gilli", + "vector-unpin-element-label": "lilli" +} diff --git a/Vector/i18n/mr.json b/Vector/i18n/mr.json new file mode 100644 index 0000000..66b6a3e --- /dev/null +++ b/Vector/i18n/mr.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Kaajawa", + "V.narsikar" + ] + }, + "skinname-vector": "सदिश", + "vector-skin-desc": "मोनोबुकची आधुनिक आवृत्ती टवटवीत दिसण्यासह व अनेक वापर सुधारणा असलेली", + "vector-action-addsection": "विषय जोडा", + "vector-action-delete": "वगळा", + "vector-action-move": "स्थानांतरण", + "vector-action-protect": "सुरक्षित करा", + "vector-action-undelete": "वगळलेले पुनर्स्थापित करा", + "vector-action-unprotect": "सुरक्षितता बदला", + "vector-view-create": "तयार करा", + "vector-view-edit": "संपादन", + "vector-view-history": "इतिहास पहा", + "vector-view-view": "वाचा", + "vector-view-viewsource": "स्रोत पहा", + "vector-more-actions": "अधिक" +} diff --git a/Vector/i18n/mrh.json b/Vector/i18n/mrh.json new file mode 100644 index 0000000..513fac5 --- /dev/null +++ b/Vector/i18n/mrh.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Laitei", + "Taytay", + "Teitei Para" + ] + }, + "vector-languages": "Reihchâzy", + "vector-language-button-label": "{{PLURAL:$1|$1 reihchâ|$1 reihchâzy}}", + "vector-no-language-button-label": "Reihchâzy khô", + "vector-action-addsection": "Chôtlâhpi khô", + "vector-action-delete": "Parao", + "vector-action-move": "Paly", + "vector-action-protect": "Vaih", + "vector-view-create": "Tao", + "vector-view-edit": "Taopathi", + "vector-view-history": "Chhichânazy palâ teh", + "vector-view-view": "Reih teih", + "vector-more-actions": "A hluh via", + "vector-searchsuggest-containing": "$1 ahlaopa hmiazy tlua teh", + "vector-page-tools-label": "Hmobaohpazy", + "vector-page-tools-general-label": "Vâtlâh", + "vector-unpin-element-label": "nyu" +} diff --git a/Vector/i18n/mrj.json b/Vector/i18n/mrj.json new file mode 100644 index 0000000..72b93b4 --- /dev/null +++ b/Vector/i18n/mrj.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Amdf" + ] + }, + "vector-action-delete": "Карангдаш", + "vector-action-move": "Лӹмӹм вашталташ", + "vector-action-protect": "Ӹшӹклӓш", + "vector-view-create": "Ӹштӓш", + "vector-view-edit": "Тӧрлӹмӓш", + "vector-view-history": "Историм анжымаш", + "vector-view-view": "Лыдмаш", + "vector-view-viewsource": "Сек пӹтӓриш кодым анжалаш" +} diff --git a/Vector/i18n/ms-arab.json b/Vector/i18n/ms-arab.json new file mode 100644 index 0000000..ce5a66b --- /dev/null +++ b/Vector/i18n/ms-arab.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Tofeiku" + ] + }, + "skinname-vector-2022": "ۏيکتور (2022)", + "vector-specialversion-name": "ۏيکتور", + "vector-opt-out": "توکر کواجه لاما", + "vector-languages": "بهاس", + "vector-no-language-button-label": "تمبه بهاس", + "vector-action-addsection": "بوک توڤيک", + "vector-action-delete": "هاڤوس", + "vector-action-move": "ڤينده", + "vector-action-protect": "ليندوڠ", + "vector-view-create": "چيڤتا", + "vector-view-edit": "سونتيڠ", + "vector-view-history": "ليهت سجاره", + "vector-view-view": "باچ", + "vector-more-actions": "لاݢي", + "vector-toc-label": "کاندوڠن", + "vector-main-menu-tooltip": "مينو اوتام", + "vector-main-menu-label": "مينو اوتام", + "vector-page-tools-label": "ڤرالتن", + "vector-page-tools-general-label": "عموم", + "vector-page-tools-actions-label": "تيندقن", + "vector-pin-element-label": "ڤينده کبر سيسي", + "vector-unpin-element-label": "سوروق", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|ڤربينچڠن]]" +} diff --git a/Vector/i18n/ms.json b/Vector/i18n/ms.json new file mode 100644 index 0000000..6a51f8b --- /dev/null +++ b/Vector/i18n/ms.json @@ -0,0 +1,72 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Anakmalaysia", + "Aurora", + "Izington", + "Pizza1016", + "Tofeiku", + "Bebudak", + "Hakimi97" + ] + }, + "skinname-vector": "Legasi Vektor (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "vector-skin-desc": "Menyediakan 2 kulit Vektor:\n* 2011 - Versi Moden MonoBook dengan wajah baru dan banyak penambahbaikan kebolehgunaan.\n* 2022 - Vektor terbina sebahagian daripada projek [[mw:Desktop Improvements]] WMF.", + "prefs-vector-enable-vector-1-label": "Gunakan Vektor Legasi", + "prefs-vector-enable-vector-1-help": "Dalam beberapa tahun lagi, kami akan beransur-ansur mengemas kini kulit Vektor. Vektor Legasi akan membenarkan anda melihat versi laman Vektor (setakat Disember 2019). Untuk ketahui lebih lanjut tentang kemas kini, perti ke [[mw:Reading/Web/Desktop_Improvements|laman projek]] kami.", + "vector-opt-out": "Tukar ke wajah lama", + "vector-opt-out-tooltip": "Ubahkan tetapan anda untuk menukar balik rupa lama kulit (legacy Vector)", + "vector.css": "/* Semua CSS di sini akan dimuatkan untuk pengguna kulit Vektor */", + "vector.js": "/ * Semua JavaScript di sini akan dimuatkan untuk pengguna-pengguna kulit Vektor * /", + "vector-action-toggle-sidebar": "Togol batang sisi", + "vector-languages": "Bahasa", + "vector-language-button-aria-label": "Pergi ke rencana dalam bahasa lain. Tersedia dalam {{PLURAL:$1|$1 bahasa}}", + "vector-language-button-label": "{{PLURAL:$1|satu bahasa|$1 bahasa}}", + "vector-no-language-button-label": "Tambahkan bahasa", + "vector-no-language-button-aria-label": "Rencana ini hanya wujud dalam bahasa ini. Tambah rencana untuk bahasa lain", + "vector-language-redirect-to-top": "Di {{SITENAME}} ini, pautan bahasa di atas laman melintang daripada tajuk rencana. [[#p-lang-btn|Pergi ke atas]].", + "vector-language-variant-switcher-label": "Tukar kelainan bahasa", + "vector-action-addsection": "Tambah topik", + "vector-action-delete": "Hapus", + "vector-action-move": "Pindah", + "vector-action-protect": "Lindung", + "vector-action-undelete": "Nyahhapus", + "vector-action-unprotect": "Ubah perlindungan", + "vector-view-create": "Cipta", + "vector-view-edit": "Sunting", + "vector-view-history": "Lihat sejarah", + "vector-view-view": "Baca", + "vector-view-viewsource": "Lihat sumber", + "vector-jumptonavigation": "Pergi ke pandu arah", + "vector-jumptosearch": "Pergi ke carian", + "vector-jumptocontent": "Pergi ke kandungan", + "vector-more-actions": "Lain", + "vector-search-loader": "Memuat cadangan carian", + "vector-searchsuggest-containing": "Cari untuk laman yang mengandungi $1", + "vector-intro-page": "Help:Pengenalan", + "vector-toc-label": "Kandungan", + "vector-toc-beginning": "Permulaan", + "vector-toc-toggle-button-label": "Togol subbahagian $1", + "vector-anon-user-menu-pages": "Laman untuk penyunting log keluar", + "vector-anon-user-menu-pages-learn": "Ketahui lebih lanjut", + "vector-anon-user-menu-pages-label": "Ketahui lebih lanjut tentang menyunting", + "vector-main-menu-tooltip": "Menu utama", + "vector-toc-menu-tooltip": "Isi Kandungan", + "vector-toc-collapsible-button-label": "Togol isi kandungan", + "vector-site-nav-label": "Tapak", + "vector-main-menu-label": "Menu utama", + "vector-limited-width-toggle": "Togol lebar kandungan terhad", + "vector-page-tools-label": "Peralatan", + "vector-page-tools-general-label": "Umum", + "vector-page-tools-actions-label": "Tindakan", + "vector-pin-element-label": "alih ke bar sisi", + "vector-unpin-element-label": "sorokkan", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Perbincangan]]", + "tooltip-vector-anon-user-menu-title": "Lebih pilihan", + "vector-prefs-limited-width": "Bolehkan mod lebar terhad", + "vector-prefs-limited-width-help": "Bolehkan mod lebar terhad untuk pengalaman membaca yang lebih baik.", + "empty-language-selector-body": "Kandungan laman tidak disokong dalam bahasa lain." +} diff --git a/Vector/i18n/mt.json b/Vector/i18n/mt.json new file mode 100644 index 0000000..04d811c --- /dev/null +++ b/Vector/i18n/mt.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Chrisportelli", + "Leli Forte", + "ToniSant" + ] + }, + "vector-skin-desc": "Tipprovdi żewġ dehriet tal-Vector:\n* 2011 - Il-verżjoni moderna tal-MonoBook b'dehra friska u titjib fl-użabilità.\n* 2022 - Il-Vector mibni bħala parti mill-proġett tal-WMF [[mw:Desktop Improvements]]", + "prefs-vector-enable-vector-1-label": "Uża l-verżjoni preċedenti tal-Vector", + "prefs-vector-enable-vector-1-help": "Fis-snin li ġejjin se naġġornaw id-dehra tal-Vector. Id-dehra tal-Vector l-antika se tħallik tara l-verżjoni preċedenti tal-Vector (sa Diċembru tal-2019). Biex tkun taf aktar dwar dawn l-aġġornament żur il-[[mw:Reading/Web/Desktop_Improvements|paġna tal-proġett]].", + "vector-opt-out": "Mur lura għad-dehra l-antika", + "vector-opt-out-tooltip": "Aqleb l-preferenzi tiegħek sabiex tmur lura għad-dehra l-antika (Vector antik)", + "vector-action-toggle-sidebar": "ċaqlaq il-ġenb", + "vector-languages": "Lingwi", + "vector-language-button-aria-label": "Żur artiklu f'lingwa differenti. Disponibbli fi {{PLURAL:$1|$1 lingwa|$1 lingwi}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lingwa|$1 lingwi}}", + "vector-no-language-button-label": "Żid lingwa", + "vector-no-language-button-aria-label": "Dan l-artiklu jeżisti biss f'din il-lingwa. Żid l-artiklu għal lingwi oħra.", + "vector-language-redirect-to-top": "Fuq il-{{SITENAME}}, il-ħoloq tal-lingwi jinsabu fuq in-naħa ta' fuq tal-paġna, ħdejn it-titlu tal-artiklu. [[#p-lang-btn|Mur fuq]].", + "vector-language-variant-switcher-label": "Biddel il-varjant tal-lingwa", + "vector-action-addsection": "Żid diskussjoni", + "vector-action-delete": "Ħassar", + "vector-action-move": "Mexxi", + "vector-action-protect": "Ipproteġi", + "vector-action-undelete": "Irkupra", + "vector-action-unprotect": "Biddel il-protezzjoni", + "vector-view-create": "Oħloq", + "vector-view-edit": "Immodifika", + "vector-view-history": "Ara l-kronoloġija", + "vector-view-view": "Aqra", + "vector-view-viewsource": "Ara s-sors", + "vector-jumptonavigation": "Aqbeż lejn in-navigazzjoni", + "vector-jumptosearch": "Aqbeż lejn it-tfittxija", + "vector-jumptocontent": "Aqbeż għall-kontentut", + "vector-more-actions": "Aktar", + "vector-search-loader": "Is-suġġerimenti għat-tfittxija tegħlin", + "vector-searchsuggest-containing": "Fittex għal paġni li għandhom $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Kontenut", + "vector-toc-beginning": "Bidu", + "vector-toc-toggle-button-label": "Uri jew aħbi s-sottosezzjoni $1", + "vector-anon-user-menu-pages": "Il-paġni għal edituri anonimi", + "vector-anon-user-menu-pages-learn": "kun af aktar", + "vector-anon-user-menu-pages-label": "Tgħallem iktar dwar kif timmodifika", + "vector-main-menu-tooltip": "Menu prinċipali", + "vector-toc-menu-tooltip": "Werrej", + "vector-toc-collapsible-button-label": "Aħbi jew uri l-werrej", + "vector-site-nav-label": "Sit", + "vector-main-menu-label": "Menu prinċipali", + "vector-page-tools-label": "Għodda", + "vector-page-tools-general-label": "Ġenerali", + "vector-page-tools-actions-label": "Azzjonijiet", + "vector-pin-element-label": "mexxi għall-ġenb", + "vector-unpin-element-label": "aħbi", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskussjoni]]", + "tooltip-vector-anon-user-menu-title": "Aktar għażliet" +} diff --git a/Vector/i18n/mui.json b/Vector/i18n/mui.json new file mode 100644 index 0000000..80d38ec --- /dev/null +++ b/Vector/i18n/mui.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Jawadywn", + "Mahali syarifuddin", + "Masjawad99" + ] + }, + "vector-action-addsection": "Imboke topik", + "vector-action-move": "Pindahke", + "vector-view-create": "Ngawék", + "vector-view-edit": "Robah", + "vector-view-history": "Selék riwayat", + "vector-view-view": "Baco", + "vector-view-viewsource": "Jingok sumber", + "vector-more-actions": "Laénnyo" +} diff --git a/Vector/i18n/mvf.json b/Vector/i18n/mvf.json new file mode 100644 index 0000000..d02f402 --- /dev/null +++ b/Vector/i18n/mvf.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Enkhsaihan2005", + "Nikki", + "Wikibilig" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ᠬᠡᠯᠡ}}", + "vector-action-addsection": "ᠰᠡᠳᠦᠪ ᠨᠡᠮᠡᠬᠦ", + "vector-view-create": "ᠡᠭᠦᠰᠬᠡᠬᠦ", + "vector-view-edit": "ᠵᠠᠰᠠᠪᠤᠷᠢᠯᠠᠬᠤ", + "vector-view-history": "ᠲᠡᠦᠬᠡ", + "vector-view-view": "ᠤᠩᠰᠢᠬᠤ", + "vector-more-actions": "ᠳᠡᠯᠭᠡᠷᠡᠩᠭᠦᠢ", + "vector-page-tools-label": "ᠬᠡᠷᠡᠭᠯᠡᠭᠦᠷ" +} diff --git a/Vector/i18n/mwl.json b/Vector/i18n/mwl.json new file mode 100644 index 0000000..43d0084 --- /dev/null +++ b/Vector/i18n/mwl.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Athena in Wonderland", + "MokaAkashiyaPT" + ] + }, + "vector-action-addsection": "Nuobo cacho", + "vector-action-delete": "Botar fuora", + "vector-action-move": "Arrastrar", + "vector-action-protect": "Porteger", + "vector-action-unprotect": "Altarar la porteçon", + "vector-view-create": "Criar", + "vector-view-edit": "Eiditar", + "vector-view-history": "Ber stórico", + "vector-view-view": "Lher", + "vector-more-actions": "Mais" +} diff --git a/Vector/i18n/my.json b/Vector/i18n/my.json new file mode 100644 index 0000000..6fee6a1 --- /dev/null +++ b/Vector/i18n/my.json @@ -0,0 +1,54 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Dr Lotus Black", + "Lionslayer", + "Myanmars", + "Ninjastrikers", + "Penguinlay" + ] + }, + "vector-opt-out": "ပုံစံဟောင်းသို့ပြောင်းပါ", + "vector-languages": "ဘာသာစကားများ", + "vector-language-button-label": "{{PLURAL:$1|ဘာသာစကား $1 ခု|$1 ဘာသာစကားများ $1 ခု}}", + "vector-no-language-button-label": "ဘာသာစကားများ ထည့်သွင်းရန်", + "vector-no-language-button-aria-label": "ဤဆောင်းပါးသည် ဤဘာသာစကားဖြင့်သာ တည်ရှိပါသည်။ အခြားဘာသာစကားများအတွက် ဆောင်းပါးကို ထည့်ပါ။", + "vector-language-redirect-to-top": "ဤ{{SITENAME}}ရှိ ဘာသာစကားလင့်ခ်များသည် ဆောင်းပါးခေါင်းစဉ်မှ စာမျက်နှာ၏ ထိပ်ဆုံးတွင် တည်ရှိကြသည်။ [[#p-lang-btn|ထိပ်ဆုံးသို့သွားရန်]]", + "vector-language-variant-switcher-label": "ဘာသာစကား မူကွဲကို ပြောင်းရန်", + "vector-action-addsection": "အကြောင်းအရာအသစ် ထပ်ထည့်ရန်", + "vector-action-delete": "ဖျက်​ပါ​", + "vector-action-move": "ရွှေ့ပါ", + "vector-action-protect": "ကာကွယ်ပါ", + "vector-action-undelete": "မဖျက်တော့ရန်", + "vector-action-unprotect": "ကာကွယ်ခြင်းကို ပြောင်းလဲရန်", + "vector-view-create": "စတင်ရေးသားရန်", + "vector-view-edit": "ပြင်ဆင်ရန်", + "vector-view-history": "ရာဇဝင်ကြည့်ရန်", + "vector-view-view": "ဖတ်ရန်", + "vector-view-viewsource": "ရင်းမြစ်ကို ကြည့်ရန်", + "vector-jumptonavigation": "အ​ညွှန်း​သို့ ခုန်ကူးရန်", + "vector-jumptosearch": "ရှာဖွေရန် ခုန်ကူးမည်", + "vector-jumptocontent": "မာတိကာသို့ ခုန်သွားရန်", + "vector-more-actions": "ပို၍", + "vector-search-loader": "ရှာဖွေမှုအကြံပြုချက်များကို ဝန်ဆွဲတင်နေပါသည်", + "vector-searchsuggest-containing": "$1 ပါဝင်သော စာမျက်နှာများ ရှာဖွေရန်", + "vector-intro-page": "အကူအညီ-နိဒါန်း", + "vector-toc-label": "မာတိကာ", + "vector-toc-beginning": "အစပိုင်း", + "vector-anon-user-menu-pages": "ထွက်ပြီးသား တည်းဖြတ်သူများအတွက် စာမျက်နှာများ", + "vector-anon-user-menu-pages-learn": "ပိုမို လေ့လာရန်", + "vector-anon-user-menu-pages-label": "တည်းဖြတ်ခြင်းအကြောင်း ပိုမိုလေ့လာရန်", + "vector-main-menu-tooltip": "ပင်မ မီနူး", + "vector-toc-menu-tooltip": "မာတိကာ", + "vector-site-nav-label": "ဆိုဒ်", + "vector-main-menu-label": "ပင်မ မီနူး", + "vector-page-tools-label": "ကိရိယာများ", + "vector-page-tools-general-label": "ယေဘုယျ", + "vector-page-tools-actions-label": "ဆောင်ရွက်ချက်များ", + "vector-pin-element-label": "ဘေးဘားသို့ရွှေ့ပါ", + "vector-unpin-element-label": "ဝှက်ရန်", + "vector-2022-prefs-talkpage": "[[mw:Talk-Reading/Web/Desktop_Improvements|ဆွေးနွေးချက်]]", + "tooltip-vector-anon-user-menu-title": "နောက်ထပ် ရွေးချယ်စရာများ", + "empty-language-selector-body": "အခြားဘာသာစကားများဖြင့် စာမျက်နှာအကြောင်းအရာများကို ပံ့ပိုးမထားပါ။" +} diff --git a/Vector/i18n/myv.json b/Vector/i18n/myv.json new file mode 100644 index 0000000..ba21539 --- /dev/null +++ b/Vector/i18n/myv.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Botuzhaleny-sodamo", + "Rueter", + "Сантяй" + ] + }, + "vector-languages": "Кельть", + "vector-language-button-label": "{{PLURAL:$1|$1 кель|$1 кельть}}", + "vector-no-language-button-label": "Поладомс кельть", + "vector-action-addsection": "Поладомс мезде кортамс", + "vector-action-delete": "Нардамс", + "vector-action-move": "Печтевтемс", + "vector-action-protect": "Аравтомс ванстомас", + "vector-action-undelete": "Вельмевтемс нардазенть", + "vector-action-unprotect": "Полавтомс ванстоманзо", + "vector-view-create": "Теемс-Шкамс", + "vector-view-edit": "Витнемс-петнемс", + "vector-view-history": "Ваномс юронзо-путовксонзо", + "vector-view-view": "Ловномс", + "vector-view-viewsource": "Ваномс косто саезь", + "vector-more-actions": "Седе ламо", + "vector-searchsuggest-containing": "Вешнемс лопат, конатнесэ $1", + "vector-toc-label": "Потмокс", + "vector-toc-beginning": "Ушодкс", + "vector-page-tools-label": "Кедьёнкст", + "vector-page-tools-general-label": "Овсекс", + "vector-unpin-element-label": "кекшемс" +} diff --git a/Vector/i18n/mzn.json b/Vector/i18n/mzn.json new file mode 100644 index 0000000..1e35afa --- /dev/null +++ b/Vector/i18n/mzn.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Mjbmr", + "محک" + ] + }, + "vector-languages": "زوون", + "vector-language-button-label": "{{PLURAL:$1|$1 زوون}}", + "vector-no-language-button-label": "زوون اضافه هکردن", + "vector-action-addsection": "ترنه گپ بزوئن", + "vector-action-delete": "پاک هاکردن", + "vector-action-move": "دکش هاکردن", + "vector-action-protect": "زلفن بزوئن", + "vector-action-undelete": "دباره بنویشته بیّن", + "vector-action-unprotect": "زلفن عوض هاکردن", + "vector-view-create": "بساتن", + "vector-view-edit": "دچی‌ین", + "vector-view-history": "تاریخچه", + "vector-view-view": "بخوندستن", + "vector-view-viewsource": "ونه منبع ره هارشائن", + "vector-more-actions": "ویشته", + "vector-searchsuggest-containing": "$1 دار صفحه‌ئون دله چرخه‌تو هکردن", + "vector-toc-beginning": "لید", + "vector-page-tools-label": "ابزارون", + "vector-page-tools-general-label": "عمومی", + "vector-unpin-element-label": "پیتی" +} diff --git a/Vector/i18n/nah.json b/Vector/i18n/nah.json new file mode 100644 index 0000000..89388e4 --- /dev/null +++ b/Vector/i18n/nah.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Akapochtli", + "Languaeditor", + "Ricardo gs", + "Taresi" + ] + }, + "vector-action-addsection": "Xikpiwi tlanehnewilli", + "vector-action-delete": "Xikixpolo", + "vector-action-move": "Xiksaka", + "vector-action-protect": "Xicpiya", + "vector-action-undelete": "Xicmāquīxti", + "vector-action-unprotect": "Xicpatla tlapiyaliztli", + "vector-view-create": "Xikchiwa", + "vector-view-edit": "Xikpatla", + "vector-view-history": "Xikitta tlatololli", + "vector-view-view": "Xikixpowa", + "vector-view-viewsource": "Xiquitta tzintiliztli", + "vector-more-actions": "Achiyok" +} diff --git a/Vector/i18n/nan.json b/Vector/i18n/nan.json new file mode 100644 index 0000000..2af8800 --- /dev/null +++ b/Vector/i18n/nan.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "A-lú-mih", + "Ianbu", + "Luuva", + "唐吉訶德的侍從" + ] + }, + "vector-action-addsection": "Ke chi̍t-ê toān-lo̍h", + "vector-action-delete": "Thâi", + "vector-action-move": "Sóa khì", + "vector-action-protect": "Pó-hō͘", + "vector-action-undelete": "chhú-siau thâi tiàu", + "vector-action-unprotect": "kái pó-hō·", + "vector-view-create": "Khai-sí siá", + "vector-view-edit": "Siu-kái", + "vector-view-history": "khoàⁿ le̍k-sú", + "vector-view-view": "Tha̍k", + "vector-view-viewsource": "Khoàⁿ goân-sí lōe-iông", + "vector-more-actions": "Koh khoàⁿ" +} diff --git a/Vector/i18n/nap.json b/Vector/i18n/nap.json new file mode 100644 index 0000000..56ed9fc --- /dev/null +++ b/Vector/i18n/nap.json @@ -0,0 +1,32 @@ +{ + "@metadata": { + "authors": [ + "C.R.", + "Chelin", + "Finizio", + "Ruthven", + "Sannita" + ] + }, + "vector-skin-desc": "Verziona muderna 'e MonoBook cu n'aspetto nuovo nuovo e tante migliuramente d'uso", + "vector-languages": "Lengue", + "vector-language-button-label": "{{PLURAL:$1|$1 lengua|$1 lengue}}", + "vector-no-language-button-label": "Azzecca lengue", + "vector-action-addsection": "Aggiunge chiacchierata", + "vector-action-delete": "Scancèlla", + "vector-action-move": "Mòve", + "vector-action-protect": "Prutegge", + "vector-action-undelete": "Arrepiglia", + "vector-action-unprotect": "Càgna prutezzione", + "vector-view-create": "Crèa", + "vector-view-edit": "Càgna", + "vector-view-history": "Vide 'a cronologgia", + "vector-view-view": "Liegge", + "vector-view-viewsource": "Vire sorgente", + "vector-more-actions": "'E 'cchiù", + "vector-searchsuggest-containing": "Truova 'e paggene ca teneno $1", + "vector-toc-label": "Cuntenute", + "vector-page-tools-label": "Strumiente", + "vector-page-tools-general-label": "Generale", + "vector-unpin-element-label": "annascunne" +} diff --git a/Vector/i18n/nb.json b/Vector/i18n/nb.json new file mode 100644 index 0000000..7a5b41e --- /dev/null +++ b/Vector/i18n/nb.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Danmichaelo", + "Event", + "Jon Harald Søby", + "Kjetil r", + "Nghtwlkr" + ] + }, + "skinname-vector": "Vector (2010)", + "vector-skin-desc": "Gir 2 Vector-drakter:\n* 2011 – Den moderne versjonen av Monobook med et friskt nytt utseende og mange brukbarhetsforbedringer.\n* 2022 – Vector som bygget av WMFs [[mw:Desktop Improvements]]-prosjekt.", + "prefs-vector-enable-vector-1-label": "Bruk klassisk Vector", + "prefs-vector-enable-vector-1-help": "I løpet av de neste årene vil vi gradvis oppdatere Vector-drakta. Klassisk Vector vil la deg vise den gamle versjonen av Vector (per desember 2019). For å lære mer om oppdateringene, gå til [[mw:Reading/Web/Desktop_Improvements|prosjektsiden vår]].", + "vector-opt-out": "Bytt til det klassiske utseendet", + "vector-opt-out-tooltip": "Endre innstillingene dine for å gå tilbake til draktas klassiske utseende (klassisk Vector)", + "vector.css": "/* CSS i denne fila vil gjelde alle som bruker drakta Vector */", + "vector.js": "/* Javascript i denne fila vil gjelde for brukere av drakta Vector */", + "vector-action-toggle-sidebar": "Vis/skjul sidefelt", + "vector-languages": "Språk", + "vector-language-button-aria-label": "Gå til en artikkel på et annet språk. Tilgjengelig på {{PLURAL:$1|$1 språk}}", + "vector-language-button-label": "{{PLURAL:$1|$1 språk}}", + "vector-no-language-button-label": "Legg til språk", + "vector-no-language-button-aria-label": "Artikkelen finnes kun på dette språket. Legg til artikkelen på andre språk", + "vector-language-redirect-to-top": "På denne {{SITENAME}}-utgaven finner man språklenkene i toppen av siden på motsatt side av artikkeltittelen. [[#p-lang-btn|Gå til toppen]].", + "vector-language-variant-switcher-label": "Bytt språkvariant", + "vector-action-addsection": "Nytt emne", + "vector-action-delete": "Slett", + "vector-action-move": "Flytt", + "vector-action-protect": "Beskytt", + "vector-action-undelete": "Gjenopprett", + "vector-action-unprotect": "Endre beskyttelse", + "vector-view-create": "Opprett", + "vector-view-edit": "Rediger", + "vector-view-history": "Vis historikk", + "vector-view-view": "Les", + "vector-view-viewsource": "Vis kilden", + "vector-jumptonavigation": "Hopp til navigering", + "vector-jumptosearch": "Hopp til søk", + "vector-jumptocontent": "Hopp til innhold", + "vector-more-actions": "Mer", + "vector-search-loader": "Laster søkeforslag", + "vector-searchsuggest-containing": "Søk etter sider som inneholder $1", + "vector-intro-page": "Help:Introduksjon", + "vector-toc-label": "Innhold", + "vector-toc-beginning": "Begynnelsen", + "vector-toc-toggle-button-label": "Vis/skjul underseksjonen $1", + "vector-anon-user-menu-pages": "Sider for utloggede bidragsytere", + "vector-anon-user-menu-pages-learn": "lær mer", + "vector-anon-user-menu-pages-label": "Lær mer om redigering", + "vector-main-menu-tooltip": "Hovedmeny", + "vector-toc-menu-tooltip": "Innholdsfortegnelse", + "vector-toc-collapsible-button-label": "Vis/skjul innholdsfortegnelsen", + "vector-site-nav-label": "Nettsted", + "vector-main-menu-label": "Hovedmeny", + "vector-limited-width-toggle": "Slå av/på begrenset bredde på innholdet", + "vector-page-tools-label": "Verktøy", + "vector-page-tools-general-label": "Generelt", + "vector-page-tools-actions-label": "Handlinger", + "vector-pin-element-label": "flytt til sidefeltet", + "vector-unpin-element-label": "skjul", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskusjon]]", + "tooltip-vector-anon-user-menu-title": "Flere alternativer", + "vector-prefs-limited-width": "Aktiver modus med begrenset bredde", + "vector-prefs-limited-width-help": "Aktiver modus med begrenset bredde for en bedre leseopplevelse.", + "empty-language-selector-body": "Sideinnholdet støttes ikke på andre språk." +} diff --git a/Vector/i18n/nds-nl.json b/Vector/i18n/nds-nl.json new file mode 100644 index 0000000..1b23d20 --- /dev/null +++ b/Vector/i18n/nds-nl.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Servien" + ] + }, + "vector-skin-desc": "Moderne versy van MonoBook mid een fris uterlik en verbeateringen up et gebeed van gebruuksvrendelikheid", + "vector-opt-out": "Oavergån up olde formgeaving", + "vector-opt-out-tooltip": "Wysig juw instellingen üm weader nå de olde formgeaving te gån (Legacy Vector)", + "vector-language-redirect-to-top": "Up disse {{SITENAME}} ståt de språkverwysingen boavenan de syde teagenoaver de name van et artikel. [[#p-lang-btn|Nå boaven]].", + "vector-action-addsection": "Ny underwarp", + "vector-action-delete": "Vordsmyten", + "vector-action-move": "Hernömen", + "vector-action-protect": "Beveiligen", + "vector-action-undelete": "Weaderümmeplaatsen", + "vector-action-unprotect": "Beveiliging wysigen", + "vector-view-create": "Upstellen", + "vector-view-edit": "Bewarken", + "vector-view-history": "Geskydenisse bekyken", + "vector-view-view": "Leasen", + "vector-view-viewsource": "Brontekste bekyken", + "vector-jumptonavigation": "Nå navigaty springen", + "vector-jumptosearch": "Nå söken springen", + "vector-more-actions": "Meyr", + "vector-main-menu-tooltip": "Höyvdmenü", + "vector-main-menu-label": "Höyvdmenü", + "empty-language-selector-body": "Sydinhold wördt neet understöänd in andere språken." +} diff --git a/Vector/i18n/nds.json b/Vector/i18n/nds.json new file mode 100644 index 0000000..4d31806 --- /dev/null +++ b/Vector/i18n/nds.json @@ -0,0 +1,29 @@ +{ + "@metadata": { + "authors": [ + "Servien", + "Slomox", + "Zylbath", + "Wikiundeplattsnacker" + ] + }, + "vector-languages": "Spraken", + "vector-language-button-label": "{{PLURAL:$1|$1 Spraak|$1 Spraaken}}", + "vector-no-language-button-label": "Spraaken tofögen", + "vector-action-addsection": "Thema tofögen", + "vector-action-delete": "Wegdoon", + "vector-action-move": "Schuven", + "vector-action-protect": "Schuren", + "vector-action-undelete": "Wedderhalen", + "vector-action-unprotect": "Siedenschuul ännern", + "vector-view-create": "Opstellen", + "vector-view-edit": "Ännern", + "vector-view-history": "Historie bekieken", + "vector-view-view": "Lesen", + "vector-view-viewsource": "Borntext bekieken", + "vector-more-actions": "Mehr", + "vector-searchsuggest-containing": "Söök för Sieden mit $1", + "vector-page-tools-label": "Warktüüch", + "vector-page-tools-general-label": "Allmeen", + "vector-unpin-element-label": "versteken" +} diff --git a/Vector/i18n/ne.json b/Vector/i18n/ne.json new file mode 100644 index 0000000..ec1d8bf --- /dev/null +++ b/Vector/i18n/ne.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "Bada Kaji", + "Bhawani Gautam", + "CAPTAIN MEDUSA", + "RajeshPandey", + "पर्वत सुबेदी", + "बडा काजी", + "बिप्लब आनन्द", + "राम प्रसाद जोशी", + "सरोज कुमार ढकाल" + ] + }, + "skinname-vector": "भेक्टर विरासत (२०१०)", + "skinname-vector-2022": "भेक्टर (२०२२)", + "vector-specialversion-name": "भेक्टर", + "vector-skin-desc": "२ भेक्टर स्किनहरू प्रदान गर्दछ:\n* २०११ - ताजा लुक र धेरै उपयोगिता सुधारहरू सहित मोनोबुक को आधुनिक संस्करण।\n* २०२२ - डब्ल्यूएमएफ [[mw:Desktop Improvements]] परियोजनाको भागको रूपमा निर्मित भेक्टर।", + "prefs-vector-enable-vector-1-label": "पुरानो संस्करण प्रयोग गर्नुहोस्", + "prefs-vector-enable-vector-1-help": "आगामी केही वर्षहरूमा, हामी बिस्तारै भेक्टर छाला अद्यावधिक गर्दैछौं। लिगेसी भेक्टरले तपाईंलाई भेक्टरको पुरानो संस्करण (डिसेम्बर २०१९ सम्म) हेर्न अनुमति दिनेछ। अद्यावधिकहरू बारे थप जान्नको लागि, हाम्रो [[mw:Reading/Web/Desktop_Improvements|परियोजना पृष्ठ]]मा जानुहोस्।", + "vector-opt-out": "पुरानो स्वरूपमा परिवर्तन गर्नुहोस्", + "vector-opt-out-tooltip": "छालाको पुरानो लुकमा फर्कन आफ्नो सेटिङहरू परिवर्तन गर्नुहोस् (लेगेसी भेक्टर)", + "vector.css": "/* यहाँ सबै सीएसएस भेक्टर छालाका प्रयोगकर्ताहरूका लागि लोड हुनेछ */", + "vector.js": "/* यहाँ सबै जाभास्क्रिप्ट भेक्टर स्किनका प्रयोगकर्ताहरूका लागि लोड हुनेछन् */", + "vector-action-toggle-sidebar": "बाँया खण्ड सक्षम गर्नुहोस्", + "vector-languages": "भाषाहरू", + "vector-language-button-aria-label": "$1 {{PLURAL:$1|भाषामा}} उपलब्ध छ। अर्को भाषाको लेखमा जानुहोस्।", + "vector-language-button-label": "{{PLURAL:$1|$1 भाषा|$1 भाषाहरू}}", + "vector-no-language-button-label": "भाषाहरू थप्नुहोस्", + "vector-no-language-button-aria-label": "यो लेख यस भाषामा मात्र अवस्थित छ। अन्य भाषाहरूको लागि लेख थप्नुहोस्", + "vector-language-redirect-to-top": "यस {{SITENAME}}मा भाषा कडीहरू लेख शीर्षकबाट पृष्ठको शीर्षमा छन्। [[#p-lang-btn|शीर्षमा जानुहोस्]]।", + "vector-language-variant-switcher-label": "भाषा भिन्नता परिवर्तन गर्नुहोस्", + "vector-action-addsection": "विषय थप्नुहोस्", + "vector-action-delete": "हटाउने", + "vector-action-move": "सार्नुहोस्", + "vector-action-protect": "सुरक्षित गर्ने", + "vector-action-undelete": "हटाएको रद्द गर्ने", + "vector-action-unprotect": "सुरक्षा परिवर्तन गर्ने", + "vector-view-create": "सिर्जना गर्नुहोस्", + "vector-view-edit": "सम्पादन", + "vector-view-history": "इतिहास हेर्नुहोस्", + "vector-view-view": "पढ्नुहोस्", + "vector-view-viewsource": "स्रोत हेर्ने", + "vector-jumptonavigation": "अन्वेषणमा जानुहाेस्", + "vector-jumptosearch": "खाेजमा जानुहाेस्", + "vector-jumptocontent": "सामग्रीमा जानुहोस्", + "vector-more-actions": "थप", + "vector-search-loader": "खोज सुझावहरू खोल्दै", + "vector-searchsuggest-containing": "$1 भएको पृष्ठहरू खोज्नुहोस्", + "vector-intro-page": "Help:स्वशिक्षा", + "vector-toc-label": "विषयसूची", + "vector-toc-beginning": "सुरुवात", + "vector-toc-toggle-button-label": "$1 उपखण्ड सक्षम गर्नुहोस्", + "vector-anon-user-menu-pages": "निर्गमन सम्पादकहरूका लागि पृष्ठहरू", + "vector-anon-user-menu-pages-learn": "थप जान्नुहोस्", + "vector-anon-user-menu-pages-label": "सम्पादन गर्ने बारे थप जान्नुहोस्", + "vector-main-menu-tooltip": "मुख्य सूचीपत्र", + "vector-toc-menu-tooltip": "विषयसूची", + "vector-toc-collapsible-button-label": "सामग्रीको तालिका सक्षम गर्नुहोस्", + "vector-site-nav-label": "साइट", + "vector-main-menu-label": "मुख्य सूचीपत्र", + "vector-limited-width-toggle": "सीमित सामग्री चौडाइ टगल गर्नुहोस्", + "vector-page-tools-label": "उपकरणहरू", + "vector-page-tools-general-label": "साधारण", + "vector-page-tools-actions-label": "कार्यहरू", + "vector-pin-element-label": "बाँया खण्डमा सार्नुहोस्", + "vector-unpin-element-label": "लुकाउनुहोस्", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|चर्चा]]", + "tooltip-vector-anon-user-menu-title": "थप विकल्पहरू", + "vector-prefs-limited-width": "सीमित चौडाइ मोड सक्षम गर्नुहोस्", + "vector-prefs-limited-width-help": "सुधारिएको पठन अनुभवको लागि सीमित चौडाइ मोड सक्षम गर्नुहोस्।", + "empty-language-selector-body": "पृष्ठ सामग्री अन्य भाषाहरूमा समर्थित छैन।" +} diff --git a/Vector/i18n/new.json b/Vector/i18n/new.json new file mode 100644 index 0000000..f972066 --- /dev/null +++ b/Vector/i18n/new.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "Eukesh" + ] + }, + "vector-action-move": "संकादिसँ", + "vector-view-create": "दयेकादिसँ", + "vector-view-edit": "सम्पादन", + "vector-view-history": "इतिहास स्वयादिसँ", + "vector-view-view": "ब्वनादिसँ" +} diff --git a/Vector/i18n/nia.json b/Vector/i18n/nia.json new file mode 100644 index 0000000..47d15c1 --- /dev/null +++ b/Vector/i18n/nia.json @@ -0,0 +1,38 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "NoiX180", + "Slaia" + ] + }, + "vector-skin-desc": "Versi modern MonoBook. Oroma awuyu zikhalania ba oya zi no te'atulö'ö", + "prefs-vector-enable-vector-1-label": "Oguna'ö versi Vector satua", + "prefs-vector-enable-vector-1-help": "Ba ndröfi-ndröfi fönada itugu ara itugu oi tefonukha guli Vector. Fili Vector Satua ba wamaigi versi satua (irugi Des 2019). Ae ba [[mw:Reading/Web/Desktop_Improvements|newali proyek]] ba wamaigi fefu ngawalö wamohouni.", + "vector-opt-out": "Oguna'ö zikhala satua", + "vector-opt-out-tooltip": "Bulö'ö stelan na'omasi'ö mangawuli furi ba zikhala satua (legacy Vector/Vector Satua)", + "vector-action-toggle-sidebar": "Oroma'ö/bini'ö nahia ba zinga", + "vector-languages": "Li", + "vector-language-button-label": "{{PLURAL:$1|$1 li}}", + "vector-no-language-button-label": "Nönö li bö'ö", + "vector-action-addsection": "Nönö mbörö huhuo", + "vector-action-delete": "Tibo'ö", + "vector-action-move": "Fawu'a", + "vector-action-protect": "Kusi", + "vector-action-undelete": "Fangawuli furi zi no tetibo'ö", + "vector-action-unprotect": "Kusi (tebai mubulö'ö)", + "vector-view-create": "Fazökhi", + "vector-view-edit": "Bulö'ö", + "vector-view-history": "Faigi waö-waö", + "vector-view-view": "Baso", + "vector-view-viewsource": "Faigi kode", + "vector-jumptonavigation": "Ae ba navigasi", + "vector-jumptosearch": "Ae ba wangalui", + "vector-jumptocontent": "Ae ba nösi", + "vector-more-actions": "Tohu-tohunia", + "vector-search-loader": "Mama'anö duma-duma ni'alui", + "vector-searchsuggest-containing": "Alui nga'örö si so bakha $1", + "vector-page-tools-label": "Fakake", + "vector-page-tools-general-label": "Umum", + "vector-unpin-element-label": "bini'ö" +} diff --git a/Vector/i18n/nit.json b/Vector/i18n/nit.json new file mode 100644 index 0000000..28f0221 --- /dev/null +++ b/Vector/i18n/nit.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Athram Rajkumar", + "Madavi Jangu" + ] + }, + "vector-languages": "గొట్టిక్", + "vector-language-button-label": "{{PLURAL:$1|$1 గొట్టి|$1 గొట్టిక్}}", + "vector-no-language-button-label": "గొట్టికున్ సెర్ప్", + "vector-action-addsection": "గొట్టిన్ సెర్ప్", + "vector-action-delete": "పుస్స్", + "vector-action-move": "పావిడ్", + "vector-action-protect": "సంరక్షించు", + "vector-view-create": "తయ్యర్", + "vector-view-history": "కానున్ ఓల్", + "vector-more-actions": "పెన కొన్ని", + "vector-searchsuggest-containing": "ఇత్తి అనేక పేజీకుంగ్ సటి కిరావ్$1", + "vector-toc-label": "గొట్టిక్ ఇడ్డెకాధ్", + "vector-toc-beginning": "చాలు ఇదార్", + "vector-page-tools-label": "సామన్", + "vector-page-tools-general-label": "ఆగమి", + "vector-unpin-element-label": "డాప్" +} diff --git a/Vector/i18n/nl.json b/Vector/i18n/nl.json new file mode 100644 index 0000000..541889c --- /dev/null +++ b/Vector/i18n/nl.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bdijkstra", + "Calak", + "Mainframe98", + "McDutchie", + "Nickthijssen1994", + "Romaine", + "SPQRobin", + "Siebrand", + "Sjoerddebruin", + "Troefkaart", + "Strepulah" + ] + }, + "skinname-vector": "Vector, oude versie (2010)", + "vector-skin-desc": "Bevat 2 Vector vormgevingen:\n* 2011 - De Moderne versie van MonoBook met een fris uiterlijk en veel verbeteringen op het gebied van gebruiksvriendelijkheid.\n* 2022 - De Vector versie als onderdeel van het WMF [[mw:Desktop Improvements]] project.", + "prefs-vector-enable-vector-1-label": "Gebruik de Legacy Vector", + "prefs-vector-enable-vector-1-help": "De komende jaren zullen we de Vector-skin geleidelijk bijwerken. Met Legacy Vector kunt u de oude versie van Vector bekijken (vanaf december 2019). Ga voor meer informatie over de updates naar onze [[mw:Reading/Web/Desktop_Improvements|projectpagina]].", + "vector-opt-out": "Naar oude vormgeving omschakelen", + "vector-opt-out-tooltip": "Wijzig uw instellingen om terug te gaan naar het oude uiterlijk van de skin (Legacy Vector)", + "vector.css": "/* Alle hier geplaatste CSS-code wordt geladen voor gebruikers van de vormgeving Vector */", + "vector.js": "/* Alle hier geplaatste JavaScript-code wordt geladen voor gebruikers van de vormgeving Vector */", + "vector-action-toggle-sidebar": "Zijbalk in- of uitschakelen", + "vector-languages": "Talen", + "vector-language-button-aria-label": "Ga naar een artikel in een andere taal. Beschikbaar in {{PLURAL:$1|$1 taal|$1 talen}}", + "vector-language-button-label": "{{PLURAL:$1|$1 taal|$1 talen}}", + "vector-no-language-button-label": "Talen toevoegen", + "vector-no-language-button-aria-label": "Dit artikel bestaat alleen in deze taal. Het artikel in andere talen toevoegen.", + "vector-language-redirect-to-top": "Op deze {{SITENAME}} staan de taallinks bovenaan de pagina tegenover de titel van het artikel. [[#p-lang-btn|Naar boven]].", + "vector-language-variant-switcher-label": "Taalvariant wijzigen", + "vector-action-addsection": "Onderwerp toevoegen", + "vector-action-delete": "Verwijderen", + "vector-action-move": "Hernoemen", + "vector-action-protect": "Beveiligen", + "vector-action-undelete": "Terugplaatsen", + "vector-action-unprotect": "Beveiliging wijzigen", + "vector-view-create": "Aanmaken", + "vector-view-edit": "Bewerken", + "vector-view-history": "Geschiedenis weergeven", + "vector-view-view": "Lezen", + "vector-view-viewsource": "Brontekst bekijken", + "vector-jumptonavigation": "Naar navigatie springen", + "vector-jumptosearch": "Naar zoeken springen", + "vector-jumptocontent": "Naar inhoud springen", + "vector-more-actions": "Meer", + "vector-search-loader": "Zoeksuggesties worden geladen", + "vector-searchsuggest-containing": "Zoek naar pagina's die $1 bevatten", + "vector-intro-page": "Help:Inleiding", + "vector-toc-label": "Inhoud", + "vector-toc-beginning": "Top", + "vector-anon-user-menu-pages": "Pagina's voor uitgelogde redacteuren", + "vector-anon-user-menu-pages-learn": "meer lezen", + "vector-anon-user-menu-pages-label": "Meer leren over bewerken", + "vector-main-menu-tooltip": "Hoofdmenu", + "vector-toc-menu-tooltip": "Inhoudsopgave", + "vector-toc-collapsible-button-label": "Inhoudsopgave tonen of verbergen", + "vector-site-nav-label": "Site", + "vector-main-menu-label": "Hoofdmenu", + "vector-limited-width-toggle": "Beperkte inhoudsbreedte inschakelen", + "vector-page-tools-label": "Hulpmiddelen", + "vector-page-tools-general-label": "Algemeen", + "vector-page-tools-actions-label": "Handelingen", + "vector-pin-element-label": "naar zijbalk verplaatsen", + "vector-unpin-element-label": "verbergen", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Overleg]]", + "tooltip-vector-anon-user-menu-title": "Meer opties", + "vector-prefs-limited-width": "Inschakelen modus beperkte breedte", + "vector-prefs-limited-width-help": "Inschakelen modus beperkte breedte voor een verbeterde leeservaring.", + "empty-language-selector-body": "Pagina-inhoud wordt niet ondersteund in andere talen." +} diff --git a/Vector/i18n/nmz.json b/Vector/i18n/nmz.json new file mode 100644 index 0000000..dadca94 --- /dev/null +++ b/Vector/i18n/nmz.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "GastonJeremiah" + ] + }, + "vector-languages": "Lam", + "vector-language-button-label": "{{PLURAL:$1|gwɛɛlb $1|$1 lam}}", + "vector-no-language-button-label": "Mɔɔgm lam", + "vector-action-addsection": "Hewlb gwɛɛtjugu", + "vector-action-delete": "Kpii", + "vector-action-move": "Tɔtg", + "vector-action-protect": "Hɛg", + "vector-view-create": "Hɛ/ree", + "vector-view-edit": "Manyii", + "vector-view-history": "Gwɛɛt nyanb", + "vector-view-view": "Kaal", + "vector-more-actions": "Jeengu", + "vector-searchsuggest-containing": "Bag wadii iban$1", + "vector-toc-label": "L'nin gwɛɛt", + "vector-toc-beginning": "Baɦdgm", + "vector-page-tools-label": "Ŋmɛɛg̈b want", + "vector-page-tools-general-label": "Biilgo", + "vector-unpin-element-label": "kpɛɦdr" +} diff --git a/Vector/i18n/nn.json b/Vector/i18n/nn.json new file mode 100644 index 0000000..c5e9cea --- /dev/null +++ b/Vector/i18n/nn.json @@ -0,0 +1,57 @@ +{ + "@metadata": { + "authors": [ + "Gunnernett", + "Njardarlogar", + "Ranveig" + ] + }, + "skinname-vector": "Vector, eldre (2010)", + "vector-skin-desc": "Gjev 2 Vector-drakter:\n* 2011 – Den moderne versjonen av Monobook med eut friskt nytt utseende og mange brukarvennlege forbetringar.\n* 2022 – Vector som bygga av [[mw:Desktop Improvements]]-prosjektet til WMF.", + "prefs-vector-enable-vector-1-label": "Bruk klassisk Vector", + "prefs-vector-enable-vector-1-help": "I løpet av dei neste åra vil Vector-drakta stadig gå gjennom oppdateringar. Klassisk Vector vil la deg visa den gamle versjonen av Vector (per desember 2019). For å læra meir om oppdateringane, gå til [[mw:Reading/Web/Desktop_Improvements|prosjektsida vår]].", + "vector-opt-out": "Byt til den gamle utsjånaden", + "vector-opt-out-tooltip": "Endra innstillingane dine for å gå tilbake til den klassiske utsjånaden til drakta (klassisk Vector)", + "vector-action-toggle-sidebar": "Vis/skjul sidefelt", + "vector-languages": "Språk", + "vector-language-button-aria-label": "Gå til ein artikkel på eit anna språk. Tilgjengeleg på {{PLURAL:$1|$1 språk}}", + "vector-language-button-label": "{{PLURAL:$1|$1 språk}}", + "vector-no-language-button-label": "Legg til språk", + "vector-no-language-button-aria-label": "Denne artikkelen finst berre på dette språket. Legg til artikkelen på andre språk", + "vector-language-redirect-to-top": "På denne utgåva av {{SITENAME}} er språklenkjene plasserte på toppen av sida, på motsett side av tittelen.\n[[#p-lang-btn|Gå til toppen]].", + "vector-language-variant-switcher-label": "Endre språkvariant", + "vector-action-addsection": "Nytt emne", + "vector-action-delete": "Slett", + "vector-action-move": "Flytt", + "vector-action-protect": "Vern", + "vector-action-undelete": "Gjenopprett", + "vector-action-unprotect": "Endra vern", + "vector-view-create": "Opprett", + "vector-view-edit": "Endre", + "vector-view-history": "Sjå historikken", + "vector-view-view": "Les", + "vector-view-viewsource": "Sjå kjelda", + "vector-jumptonavigation": "Hopp til navigering", + "vector-jumptosearch": "Hopp til søk", + "vector-jumptocontent": "Hopp til innhald", + "vector-more-actions": "Meir", + "vector-search-loader": "Hentar søkeforslag", + "vector-searchsuggest-containing": "Søk etter sider som inneheld $1", + "vector-intro-page": "Help:Introduksjon", + "vector-toc-label": "Innhald", + "vector-toc-beginning": "Byrjinga", + "vector-toc-toggle-button-label": "Vis/skjul underseksjonen $1", + "vector-anon-user-menu-pages": "Sider for utlogga bidragsytarar", + "vector-anon-user-menu-pages-learn": "lær meir", + "vector-anon-user-menu-pages-label": "Lær meir om redigering", + "vector-main-menu-tooltip": "Hovudmeny", + "vector-toc-menu-tooltip": "Innhaldsliste", + "vector-toc-collapsible-button-label": "Vis/skjul innhaldslista", + "vector-site-nav-label": "Nettstad", + "vector-main-menu-label": "Hovudmeny", + "vector-page-tools-actions-label": "Handlingar", + "vector-pin-element-label": "flytt til sidefeltet", + "vector-unpin-element-label": "gøym", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskusjon]]", + "tooltip-vector-anon-user-menu-title": "Fleire val" +} diff --git a/Vector/i18n/nod.json b/Vector/i18n/nod.json new file mode 100644 index 0000000..a95f400 --- /dev/null +++ b/Vector/i18n/nod.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Noktonissian" + ] + }, + "vector-languages": "ᨽᩣᩈᩣ", + "vector-language-button-label": "{{PLURAL:$1|$1 ᨽᩣᩈᩣ}}", + "vector-no-language-button-label": "ᨽᩮ᩠ᨾᩥ᩵ᨽᩣᩈᩣ", + "vector-action-addsection": "ᨲᩮᩬᩥ᩵ᨾᩉ᩠ᩅᩫᨡᩬᩴ᩶", + "vector-action-delete": "ᩃᩫ᩠ᨷ", + "vector-action-move": "ᨸᩖ᩠᩵ᨿᩁᨩᩨ᩵", + "vector-action-protect": "ᨣᩩ᩶ᨾᨠᩢ᩠ᨶ", + "vector-view-create": "ᨸᩖᩯᨦ", + "vector-view-edit": "ᨠᩯ᩶ᨡᩱ", + "vector-view-history": "ᨹᩬᩴ᩵ᨷᩅᩢᨲ᩠ᨲᩥ᩺", + "vector-view-view": "ᩋ᩵ᩣ᩠ᨶ", + "vector-more-actions": "ᨾᩦᨳᩯ᩠ᨾ", + "vector-searchsuggest-containing": "ᨪᩰᩬᩡᩉᩣᩉ᩠ᨶ᩶ᩣᨴᩦ᩵ᨾᩦ$1", + "vector-page-tools-label": "ᨣᩕᩮᩬᩥ᩵ᨦᨾᩨ", + "vector-page-tools-general-label": "ᨵ᩠ᩅᩫ᩵ᨻᩱ", + "vector-unpin-element-label": "ᨪ᩵ᩬᩁ" +} diff --git a/Vector/i18n/nog.json b/Vector/i18n/nog.json new file mode 100644 index 0000000..00f735c --- /dev/null +++ b/Vector/i18n/nog.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Abylaikhan 94", + "Gorgich", + "TayfunEt." + ] + }, + "vector-languages": "Тиллер", + "vector-language-button-label": "{{PLURAL:$1|$1 тил}}", + "vector-no-language-button-label": "Тил косув", + "vector-action-addsection": "Мевзу косув", + "vector-action-delete": "Йок ет", + "vector-action-move": "Тагы", + "vector-action-protect": "Корув", + "vector-view-create": "Яратув", + "vector-view-edit": "Туьрлентуьв", + "vector-view-history": "Тарихын карав", + "vector-view-view": "Окув", + "vector-more-actions": "Тагы", + "vector-searchsuggest-containing": "Бар бетлерди излев $1", + "vector-page-tools-label": "Алетлер", + "vector-unpin-element-label": "сакла" +} diff --git a/Vector/i18n/nov.json b/Vector/i18n/nov.json new file mode 100644 index 0000000..66ad923 --- /dev/null +++ b/Vector/i18n/nov.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Malafaya" + ] + }, + "vector-action-delete": "Ekarta", + "vector-view-edit": "Modifika", + "vector-view-view": "Lekte" +} diff --git a/Vector/i18n/nqo.json b/Vector/i18n/nqo.json new file mode 100644 index 0000000..715b366 --- /dev/null +++ b/Vector/i18n/nqo.json @@ -0,0 +1,64 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Babamamadidiane", + "Lancine.kounfantoh.fofana", + "Lanciné.kounfantoh.fofana", + "Youssoufkadialy" + ] + }, + "vector-skin-desc": "Vector ߝߊߘߌߦߊߓߐ߫ ߂ ߡߊߛߐ߫:\n* ߂߀߁߁ – MonoBook ߞߊ߬ߞߎߘߊ ߦߌߟߡߊ߫ ߞߎߘߊ ߡߊ߬ߝߟߍ߬ߟߌ߫ ߡߝߊߣߍ߲ ߟߢߊ߬ߟߌ߫ ߦߙߌߞߊ߫ ߟߎ߫ ߛߌߦߊߡߊ߲߫ ߠߎ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ ߘߊߞߘߐ߫.\n* ߂߀߂߂ – Vector ߦߌߟߡߊ ߡߍ߲ ߠߊߘߊ߲ߣߍ߲߫ ߦߋ߫ [[mw:Desktop Improvements]] ߥߞߌߡߋߘߌߦߊ߫ ߖߎ߬ߓߌߟߊ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߮ ߘߏ߫ ߘߌ߫.", + "prefs-vector-enable-vector-1-label": "Vector ߦߌߟߡߊ߫ ߞߘߐ ߟߊߓߊ߯ߙߊ߫", + "prefs-vector-enable-vector-1-help": "ߛߊ߲߬ ߘߊ߲ߘߐ߫ ߣߊ߬ߣߐ ߢߌ߲߬ ߠߎ߬ ߞߘߐ߫߸ ߊ߲ ߞߍߕߐ߫ ߦߋ߫ Vector ߝߊߘߌߦߊߓߐ ߘߐ߲߬ߘߐ߰ߣߍ߲߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߫ߟߋ. Vector ߞߊ߬ߞߘߐ ߞߍߕߐ߫ ߦߴߌ ߟߊߘߌ߬ߢߍ߬ ߟߊ߫ Vector ߞߘߐ߬ߡߊ߲߬ߓߊ ߟߎ߬ ߟߋ߬ ߦߋ߫ ߟߊ߫ (ߦߏ߫ ߊ߬ ߕߘߍ߬ ߦߋ߫ ߢߊ ߡߍ߲ ߂߀߁߉ ߞߏߟߌ߲ߞߏߟߌ߲ ߠߊ߫). ߖߐ߲߬ߛߊ߫ ߞߊ߬ ߘߏߜߘߍ߫ ߟߎ߫ ߘߐߞߊ߬ߙߊ߲߬ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ ߏ߬ ߞߊ߲߬߸ ߕߊ߯ [[mw:Reading/Web/Desktop_Improvements|project page]] ߞߊ߲߫.", + "vector-opt-out": "ߊ߬ ߟߊߕߊ߬ߡߌ߲߫ ߘߐ߬ߜߍ߬ ߢߊ߫ ߞߘߐ ߡߊ߬", + "vector-opt-out-tooltip": "ߌ ߟߊ߫ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߦߊ߬ߘߊ ߡߊߝߊ߬ߟߋ߲߫ ߞߵߌ ߞߐߛߊ߬ߦߌ߫ ߝߊߘߌߦߊߓߐ߫ ߝߟߍߟߌ߫ ߞߘߐ (Vector ߞߘߐ߬ߡߊ߲) ߡߊ߬", + "vector-action-toggle-sidebar": "ߞߙߍ߬ߝߍ߬ ߝߙߊߕߌ ߦߟߍ߬ߡߊ߲߬ߦߟߍߡߊ߲߫", + "vector-languages": "ߞߊ߲ ߠߎ߬", + "vector-language-button-aria-label": "ߕߊ߯ ߞߎߡߘߊ ߘߏ߫ ߘߐ߫ ߞߊ߲߫ ߜߘߍ߫ ߘߐ߫. ߡߍ߲ ߡߊߛߐ߬ߘߐ߲߬ߕߊ ߦߋ߫ ߞߊ߲߫{{PLURAL:$1|ߞߊ߲߫ $1 ߟߎ߫}} ߘߐ߫", + "vector-language-button-label": "{{PLURAL:$1|ߞߊ߲ $1|ߞߊ߲ $1 ߠߎ߬}}", + "vector-no-language-button-label": "ߞߊ߲ ߠߎ߬ ߟߊߘߏ߲߬", + "vector-no-language-button-aria-label": "ߞߎߡߘߊ ߢߌ߲߬ ߦߋ߫ ߞߊ߲ ߣߌ߲߬ ߘߐߙߐ߲߫ ߠߋ߬ ߘߐ߫. ߞߎߡߘߊ ߢߌ߲߬ ߠߊߘߏ߲߬ ߞߊ߲ ߜߘߍ ߟߎ߫ ߘߐ߫.", + "vector-language-redirect-to-top": "{{SITENAME}} ߣߌ߲߬ ߞߊ߲߬߸ ߞߊ߲ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߦߋ߫ ߞߐߜߍ ߣߌ߲߬ ߛߊ߲ߝߍ߬ ߞߎߡߘߊ ߞߎ߲߬ߕߐ߮ ߞߍ߬ߙߍߝߍ߬. [[#p-lang-btn|ߓߊ߯ ߛߊ߲ߝߍ߬]]", + "vector-language-variant-switcher-label": "ߞߊ߲߫ ߓߐߣߍ߲ߢߐ߲߯ߡߊ ߟߎ߫ ߡߊߝߊ߬ߘߋ߲߬", + "vector-action-addsection": "ߥߟߊ߬ߘߊ߫ ߝߙߊ߬", + "vector-action-delete": "ߊ߬ ߖߏ߬ߛߌ߬", + "vector-action-move": "ߊ߬ ߛߋ߲߬ߓߐ߫", + "vector-action-protect": "ߊ߬ ߟߊߞߊ߲ߘߊ߫", + "vector-action-undelete": "ߊ߬ ߖߏ߰ߛߌ߬ߣߍ߲ ߓߐ߫", + "vector-action-unprotect": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬", + "vector-view-create": "ߊ߬ ߟߊߘߊ߲߫", + "vector-view-edit": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߫", + "vector-view-history": "ߘߐ߬ߝߐ ߡߊߝߟߍ߫", + "vector-view-view": "ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲", + "vector-view-viewsource": "ߊ߬ ߓߐߖߎ ߡߊߝߟߍ߫", + "vector-jumptonavigation": "ߌ ߖߎߙߊ߲߫ ߛߏ߲߯ߓߊߟߌ ߘߐ߫", + "vector-jumptosearch": "ߌ ߖߎߙߊ߲߫ ߢߌߣߌ߲ߠߌ߲ ߘߐ߫", + "vector-jumptocontent": "ߌ ߖߎߙߊ߲ ߞߣߐߘߐ ߘߐ߫", + "vector-more-actions": "ߡߞߊ߬ߝߏ߬ ߜߘߍ߫ ߟߎ߫", + "vector-search-loader": "ߢߌߣߌ߲ߠߌ߲ ߘߐ߬ߛߎ߬ߟߌ ߟߊߢߎ߲ ߦߴߌ ߘߐ߫", + "vector-searchsuggest-containing": "ߞߐߜߍ߬ ߟߎ߫ ߢߌߣߌ߲߫ $1 ߦߋ߫ ߡߍ߲ ߠߎ߬ ߘߐ߫", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "ߞߣߐߘߐ ߟߎ߬", + "vector-toc-beginning": "ߘߊߡߌߣߊ", + "vector-toc-toggle-button-label": "ߕߍߕߍ߯ߟߋ߲߫ $1 ߦߟߍ߬ߡߊ߲߬ߦߟߍߡߊ߲߫", + "vector-anon-user-menu-pages": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߓߐ߬ߣߍ߲ ߠߎ߬ ߟߊ߫ ߞߐߜߍ ߟߎ߬", + "vector-anon-user-menu-pages-learn": "ߘߏߜߘߍ߫ ߟߎ߫ ߘߐߞߊ߬ߙߊ߲߬", + "vector-anon-user-menu-pages-label": "ߘߏߜߘߍ߫ ߟߎ߫ ߘߐߞߊ߬ߙߊ߲߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߊ߲߬", + "vector-main-menu-tooltip": "ߢߣߊߕߊߟߌ ߓߊߖߎߡߊ", + "vector-toc-menu-tooltip": "ߞߣߐߘߐ ߟߎ߬ ߥߟߊ߬ߟߋ߲", + "vector-toc-collapsible-button-label": "ߞߣߐߘߐ ߟߎ߬ ߥߟߊ߬ߟߋ߲ ߟߊߝߌ߲߬ߞߌ߲߬ߝߊ߲ߞߊ߲߫", + "vector-site-nav-label": "ߞߍߦߙߐ", + "vector-main-menu-label": "ߢߣߊߕߊߟߌ ߢߣߊߡߊ", + "vector-limited-width-toggle": "ߞߣߐߘߐ ߥߊ߲߬ߥߊ߲ ߘߊ߲߬ߛߌ߰ߟߌ ߓߌ߬ߟߴߊ߬ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߓߴߊ߬", + "vector-page-tools-label": "ߖߐ߯ߙߊ߲ ߠߎ߬", + "vector-page-tools-general-label": "ߝߘߏ߬ߓߊ߬ߡߊ", + "vector-page-tools-actions-label": "ߞߍߟߌ ߟߎ߬", + "vector-pin-element-label": "ߊ߬ ߟߥߊ߫ ߝߘߎ߬ߝߍ߬ ߝߙߊߕߌ ߟߊ߫", + "vector-unpin-element-label": "ߊ߬ ߢߡߊߘߏ߲߰", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussion]]", + "tooltip-vector-anon-user-menu-title": "ߢߣߊߕߊߟߌ߫ ߜߘߍ߫ ߟߎ߬", + "vector-prefs-limited-width": "ߥߊ߲߬ߥߊ߲߬ ߡߊߓߍ߲߬ߣߍ߲ ߞߍߗߏ߮ ߓߌ߬ߟߴߊ߬ ߟߊ߫", + "vector-prefs-limited-width-help": "ߥߊ߲߬ߥߊ߲߬ ߡߊߓߍ߲߬ߣߍ߲ ߞߍߗߏ߮ ߓߌ߬ߟߴߊ߬ ߟߊ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߝߊ߰ߡߎ߲߬ߠߌ߲߫ ߞߏ ߘߐ߫.", + "empty-language-selector-body": "ߞߐߜߍ ߞߣߐߘߐ ߟߊߘߤߊ߬ߣߍ߲߫ ߕߍ߫ ߞߊ߲߫ ߜߘߍ ߟߎ߬ ߘߐ߫." +} diff --git a/Vector/i18n/nrm.json b/Vector/i18n/nrm.json new file mode 100644 index 0000000..4c332f2 --- /dev/null +++ b/Vector/i18n/nrm.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "WikiEoFrEn" + ] + }, + "vector-view-create": "Criyaer", + "vector-view-edit": "Amendaer", + "vector-view-view": "Luure" +} diff --git a/Vector/i18n/nso.json b/Vector/i18n/nso.json new file mode 100644 index 0000000..ea729e7 --- /dev/null +++ b/Vector/i18n/nso.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Mohau" + ] + }, + "vector-action-addsection": "Lokela sererwa", + "vector-action-delete": "Phumula", + "vector-action-move": "Huduša", + "vector-action-protect": "Lota", + "vector-view-create": "Hlola", + "vector-view-edit": "Fetola", + "vector-view-history": "Laetša histori", + "vector-view-view": "Bala", + "vector-view-viewsource": "Lebelela mothopo" +} diff --git a/Vector/i18n/ny.json b/Vector/i18n/ny.json new file mode 100644 index 0000000..2abfbcd --- /dev/null +++ b/Vector/i18n/ny.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Icem4k" + ] + }, + "vector-more-actions": "Zambiri" +} diff --git a/Vector/i18n/nyn.json b/Vector/i18n/nyn.json new file mode 100644 index 0000000..2ce9d97 --- /dev/null +++ b/Vector/i18n/nyn.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Kakonjo" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 orurimi|$1 endimi}}", + "vector-action-addsection": "Taho omuhajaano", + "vector-action-delete": "Sangura", + "vector-action-move": "Tambuza", + "vector-action-protect": "Tsiba", + "vector-view-create": "Hangaho", + "vector-view-edit": "Gorora", + "vector-view-history": "Reba ebi'kozirwe", + "vector-view-view": "Shoma", + "vector-more-actions": "Ebikukiraho", + "vector-toc-toggle-button-label": "Rabyamu $1 Akacweeka" +} diff --git a/Vector/i18n/nys.json b/Vector/i18n/nys.json new file mode 100644 index 0000000..eb8475d --- /dev/null +++ b/Vector/i18n/nys.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Gnangarra" + ] + }, + "vector-action-addsection": "Wer katitjiny", + "vector-action-delete": "Barranginy", + "vector-action-move": "Ngatta", + "vector-action-protect": "Nap-nap", + "vector-view-create": "Yeye-quadga", + "vector-view-edit": "Wallak", + "vector-view-history": "genuny kura", + "vector-view-view": "miall wongie", + "vector-more-actions": "Karro" +} diff --git a/Vector/i18n/nzi.json b/Vector/i18n/nzi.json new file mode 100644 index 0000000..c24ffa1 --- /dev/null +++ b/Vector/i18n/nzi.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Valentine Badu" + ] + }, + "vector-action-addsection": "Fa tidwɛkɛ boka nwo", + "vector-action-delete": "Twikyi", + "vector-action-move": "Fa kɔ", + "vector-action-protect": "Gyima", + "vector-view-create": "Buke", + "vector-view-edit": "Sa nu", + "vector-more-actions": "Kpondɛ dɔɔnwo", + "vector-unpin-element-label": "Fa fia" +} diff --git a/Vector/i18n/oc.json b/Vector/i18n/oc.json new file mode 100644 index 0000000..a111078 --- /dev/null +++ b/Vector/i18n/oc.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Boulaur", + "Cedric31", + "Quentí" + ] + }, + "vector.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */", + "vector.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */", + "vector-language-button-label": "{{PLURAL:$1|$1 lenga|$1 lengas}}", + "vector-action-addsection": "Apondre un subjècte", + "vector-action-delete": "Suprimir", + "vector-action-move": "Renomenar", + "vector-action-protect": "Protegir", + "vector-action-undelete": "Restablir", + "vector-action-unprotect": "Suprimir la proteccion", + "vector-view-create": "Crear", + "vector-view-edit": "Modificar", + "vector-view-history": "Veire l'istoric", + "vector-view-view": "Legir", + "vector-view-viewsource": "Veire la font", + "vector-more-actions": "Mai" +} diff --git a/Vector/i18n/ojb.json b/Vector/i18n/ojb.json new file mode 100644 index 0000000..c582077 --- /dev/null +++ b/Vector/i18n/ojb.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Aandeginini" + ] + }, + "vector-action-addsection": "Asigagindaaso dibaajimowin", + "vector-action-delete": "Gaasiibii'an", + "vector-action-move": "Mamaajii", + "vector-action-protect": "Ganawendan", + "vector-view-create": "Ozhitoon", + "vector-view-edit": "Aanji'", + "vector-view-history": "Gaa'-waabam", + "vector-view-view": "Agindan", + "vector-more-actions": "Nawaj" +} diff --git a/Vector/i18n/olo.json b/Vector/i18n/olo.json new file mode 100644 index 0000000..78bcf77 --- /dev/null +++ b/Vector/i18n/olo.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Denö", + "Ilja.mos", + "Mashoi7" + ] + }, + "vector-action-addsection": "Ližiä aihe", + "vector-action-delete": "Ota iäre", + "vector-action-move": "Siirrä", + "vector-action-protect": "Suojua", + "vector-action-unprotect": "Vaihta suojavustu", + "vector-view-create": "Luaji", + "vector-view-edit": "Kohendele", + "vector-view-history": "Kačo histourii", + "vector-view-view": "Luve", + "vector-view-viewsource": "Kačo algukoodu", + "vector-more-actions": "Vie" +} diff --git a/Vector/i18n/om.json b/Vector/i18n/om.json new file mode 100644 index 0000000..f4c1aed --- /dev/null +++ b/Vector/i18n/om.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Ahrada2016", + "Maammee", + "Oromoo" + ] + }, + "vector-action-addsection": "Mata duree ida'i", + "vector-action-delete": "Balleessi", + "vector-action-move": "Oofi", + "vector-action-protect": "Eegumsa", + "vector-action-undelete": "Hin balleessin", + "vector-view-create": "Uumi", + "vector-view-edit": "Gulaali", + "vector-view-history": "Seenaa laali", + "vector-view-view": "Dubbisi", + "vector-view-viewsource": "Lakkaddaa laali", + "vector-jumptonavigation": "Gara kallatti ce'i", + "vector-jumptosearch": "Gara barbaadutti ce'i", + "vector-more-actions": "Dabalata" +} diff --git a/Vector/i18n/or.json b/Vector/i18n/or.json new file mode 100644 index 0000000..24cb47e --- /dev/null +++ b/Vector/i18n/or.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Jnanaranjan Sahu", + "Psubhashish" + ] + }, + "vector-action-addsection": "ନୂଆ ଯୋଡ଼ନ୍ତୁ", + "vector-action-delete": "ଲିଭାଇବେ", + "vector-action-move": "ଘୁଞ୍ଚାଇବେ", + "vector-action-protect": "କିଳିବେ", + "vector-action-undelete": "ଲିଭାଇବେ ନାହିଁ", + "vector-action-unprotect": "କିଳିବେ ନାହିଁ", + "vector-view-create": "ତିଆରି କରନ୍ତୁ", + "vector-view-edit": "ସମ୍ପାଦନା (Edit)", + "vector-view-history": "ଇତିହାସ", + "vector-view-view": "ପଢ଼ନ୍ତୁ", + "vector-view-viewsource": "ସୋର୍ସ ଦେଖନ୍ତୁ", + "vector-more-actions": "ଅଧିକ" +} diff --git a/Vector/i18n/os.json b/Vector/i18n/os.json new file mode 100644 index 0000000..c8a644c --- /dev/null +++ b/Vector/i18n/os.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Amikeco", + "Bouron", + "Taamu", + "Таймураз" + ] + }, + "vector-languages": "Æвзæгтæ", + "vector-no-language-button-label": "Æвзæгтæ бафтау", + "vector-action-addsection": "Нæуæг ныхас бакæнын", + "vector-action-delete": "Схафын", + "vector-action-move": "Ном ивын", + "vector-action-protect": "Сæхгæнын", + "vector-action-undelete": "Рацаразын", + "vector-action-unprotect": "Ивын хъахъхъæд", + "vector-view-create": "Скæнын", + "vector-view-edit": "Ивын", + "vector-view-history": "Истори", + "vector-view-view": "Кæсын", + "vector-view-viewsource": "Код кæсын", + "vector-more-actions": "Фылдæр", + "vector-searchsuggest-containing": "Агур фæрстæ, кæцыты ис ", + "vector-page-tools-label": "Фæрæзтæ", + "vector-page-tools-general-label": "Иумæйаг", + "vector-unpin-element-label": "бамбæхс" +} diff --git a/Vector/i18n/osi.json b/Vector/i18n/osi.json new file mode 100644 index 0000000..eb05d79 --- /dev/null +++ b/Vector/i18n/osi.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "NoiX180" + ] + }, + "vector-view-edit": "Uwah", + "vector-view-view": "Waca" +} diff --git a/Vector/i18n/ovd.json b/Vector/i18n/ovd.json new file mode 100644 index 0000000..8509f47 --- /dev/null +++ b/Vector/i18n/ovd.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Martin Wiss", + "Sabelöga" + ] + }, + "vector-view-edit": "ender", + "vector-view-view": "Les", + "vector-more-actions": "Mįer" +} diff --git a/Vector/i18n/pa.json b/Vector/i18n/pa.json new file mode 100644 index 0000000..029f8b2 --- /dev/null +++ b/Vector/i18n/pa.json @@ -0,0 +1,66 @@ +{ + "@metadata": { + "authors": [ + "Aalam", + "Babanwalia", + "Bgo eiu", + "Jagseer S Sidhu", + "Raj Singh", + "TariButtar", + "Tow", + "Kuldeepburjbhalaike" + ] + }, + "vector-skin-desc": "2 ਵੈਕਟਰ ਸਕਿਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ:\n* 2011 - ਤਾਜ਼ਾ ਦਿੱਖ ਅਤੇ ਬਹੁਤ ਸਾਰੇ ਉਪਯੋਗਤਾ ਸੁਧਾਰਾਂ ਦੇ ਨਾਲ ਮੋਨੋਬੁੱਕ ਦਾ ਆਧੁਨਿਕ ਸੰਸਕਰਣ।\n* 2022 - WMF [[mw:Desktop Improvements]] ਪ੍ਰੋਜੈਕਟ ਦੇ ਹਿੱਸੇ ਵਜੋਂ ਬਣਾਇਆ ਵੈਕਟਰ।", + "prefs-vector-enable-vector-1-label": "ਪੁਰਾਣੀ ਦਿੱਖ ਵਰਤੋ", + "prefs-vector-enable-vector-1-help": "ਅਗਲੇ ਕੁਝ ਸਾਲਾਂ ਵਿੱਚ, ਅਸੀਂ ਹੌਲੀ-ਹੌਲੀ ਵੈਕਟਰ ਸਕਿਨ ਨੂੰ ਅਪਡੇਟ ਕਰਾਂਗੇ। ਪੁਰਾਤਨ ਵੈਕਟਰ ਤੁਹਾਨੂੰ ਵੈਕਟਰ ਦਾ ਪੁਰਾਣਾ ਸੰਸਕਰਣ (ਦਸੰਬਰ 2019 ਤੱਕ) ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਵੇਗਾ। ਅੱਪਡੇਟ ਬਾਰੇ ਹੋਰ ਜਾਣਨ ਲਈ, ਸਾਡੇ [[mw:Reading/Web/Desktop_Improvements|ਪ੍ਰੋਜੈਕਟ ਪੇਜ]] 'ਤੇ ਜਾਓ।", + "vector-opt-out": "ਪੁਰਾਣੀ ਦਿੱਖ ’ਤੇ ਉਲਟਾਓ", + "vector-opt-out-tooltip": "ਸਕਿਨ (ਪੁਰਾਣੇ ਵੈਕਟਰ) ਦੀ ਪੁਰਾਣੀ ਦਿੱਖ 'ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਆਪਣੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲੋ", + "vector-action-toggle-sidebar": "ਸਾਈਡਬਾਰ ਨੂੰ ਟੌਗਲ ਕਰੋ", + "vector-languages": "ਬੋਲੀਆਂ", + "vector-language-button-aria-label": "ਕਿਸੇ ਹੋਰ ਭਾਸ਼ਾ ਵਿੱਚ ਲੇਖ 'ਤੇ ਜਾਓ। {{PLURAL:$1|$1 ਭਾਸ਼ਾ|$1 ਭਾਸ਼ਾਵਾਂ}} ਵਿੱਚ ਉਪਲਬਧ ਹੈ", + "vector-language-button-label": "{{PLURAL:$1|$1 ਭਾਸ਼ਾ|$1 ਭਾਸ਼ਾਵਾਂ}}", + "vector-no-language-button-label": "ਹੋਰ ਬੋਲੀਆਂ ਜੋੜੋ", + "vector-no-language-button-aria-label": "ਇਹ ਲੇਖ ਸਿਰਫ਼ ਇਸ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਹੈ। ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਲਈ ਲੇਖ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ", + "vector-language-variant-switcher-label": "ਭਾਸ਼ਾ ਰੂਪ ਬਦਲੋ", + "vector-action-addsection": "ਵਿਸ਼ਾ ਜੋੜੋ", + "vector-action-delete": "ਹਟਾਓ", + "vector-action-move": "ਭੇਜੋ", + "vector-action-protect": "ਸੁਰੱਖਿਆ", + "vector-action-undelete": "ਹਟਾਉਣਾ-ਵਾਪਸ", + "vector-action-unprotect": "ਸੁਰੱਖਿਆ ਬਦਲੋ", + "vector-view-create": "ਬਣਾਓ", + "vector-view-edit": "ਸੋਧੋ", + "vector-view-history": "ਅਤੀਤ ਵੇਖੋ", + "vector-view-view": "ਪੜ੍ਹੋ", + "vector-view-viewsource": "ਸਰੋਤ ਵੇਖੋ", + "vector-jumptonavigation": "ਨੈਵੀਗੇਸ਼ਨ 'ਤੇ ਜਾਓ", + "vector-jumptosearch": "ਸਰਚ ਤੇ ਜਾਓ", + "vector-jumptocontent": "ਸਮੱਗਰੀ 'ਤੇ ਜਾਓ", + "vector-more-actions": "ਹੋਰ", + "vector-search-loader": "ਖੋਜ ਸੁਝਾਅ ਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ", + "vector-searchsuggest-containing": "$1 ਵਾਲੇ ਪੰਨਿਆਂ ਦੀ ਖੋਜ ਕਰੋ", + "vector-intro-page": "ਮਦਦ:ਜਾਣ-ਪਛਾਣ", + "vector-toc-label": "ਸਮੱਗਰੀ", + "vector-toc-beginning": "ਸ਼ੁਰੂਆਤ", + "vector-toc-toggle-button-label": "$1 ਉਪਭਾਗ ਨੂੰ ਟੌਗਲ ਕਰੋ", + "vector-anon-user-menu-pages": "ਲੌਗ ਆਊਟ ਕੀਤੇ ਸੰਪਾਦਕਾਂ ਲਈ ਪੰਨੇ", + "vector-anon-user-menu-pages-learn": "ਹੋਰ ਜਾਣੋ", + "vector-anon-user-menu-pages-label": "ਸੰਪਾਦਨ ਬਾਰੇ ਹੋਰ ਜਾਣੋ", + "vector-main-menu-tooltip": "ਮੁੱਖ ਮੇਨੂ", + "vector-toc-menu-tooltip": "ਸਮੱਗਰੀ ਸਾਰਨੀ", + "vector-toc-collapsible-button-label": "ਸਮੱਗਰੀ ਦੀ ਸਾਰਣੀ ਨੂੰ ਟੌਗਲ ਕਰੋ", + "vector-site-nav-label": "ਸਾਈਟ", + "vector-main-menu-label": "ਮੁੱਖ ਮੀਨੂ", + "vector-limited-width-toggle": "ਸੀਮਤ ਸਮੱਗਰੀ ਚੌੜਾਈ ਨੂੰ ਟੌਗਲ ਕਰੋ", + "vector-page-tools-label": "ਸੰਦ", + "vector-page-tools-general-label": "ਆਮ", + "vector-page-tools-actions-label": "ਕਾਰਵਾਈਆਂ", + "vector-pin-element-label": "ਸਾਈਡਬਾਰ 'ਤੇ ਜਾਓ", + "vector-unpin-element-label": "ਲੁਕਾਓ", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|ਚਰਚਾ]]", + "tooltip-vector-anon-user-menu-title": "ਹੋਰ ਚੋਣਾਂ", + "vector-prefs-limited-width": "ਛੋਟੀ ਚੌੜਾਈ ਚੋਣ ਨੂੰ ਚਾਲੂ ਕਰੋ", + "vector-prefs-limited-width-help": "ਪੜ੍ਹਨ ਦੇ ਬਿਹਤਰ ਅਨੁਭਵ ਲਈ ਸੀਮਤ ਚੌੜਾਈ ਮੋਡ ਨੂੰ ਵਰਤੋਂ।", + "empty-language-selector-body": "ਪੰਨਾ ਸਮੱਗਰੀ ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।" +} diff --git a/Vector/i18n/pag.json b/Vector/i18n/pag.json new file mode 100644 index 0000000..775d42e --- /dev/null +++ b/Vector/i18n/pag.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Lam-ang" + ] + }, + "vector-action-delete": "Buralen", + "vector-action-move": "Iyales", + "vector-action-protect": "Iyagel", + "vector-view-create": "Palsaen", + "vector-view-edit": "Dumaen", + "vector-view-history": "Nengnengen so awaran", + "vector-view-view": "Basaen", + "vector-more-actions": "Lalo" +} diff --git a/Vector/i18n/pam.json b/Vector/i18n/pam.json new file mode 100644 index 0000000..f831466 --- /dev/null +++ b/Vector/i18n/pam.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Katimawan2005", + "Leeheonjin", + "Val2397" + ] + }, + "vector-action-addsection": "Dagdagan ing pisasabian", + "vector-action-delete": "Buran", + "vector-action-move": "Iyalis", + "vector-action-protect": "Protectan/kambilan", + "vector-action-undelete": "Isubli/iurung ya pangabura", + "vector-action-unprotect": "Idayu ya panga-protecta", + "vector-view-create": "Maglalang", + "vector-view-edit": "Alilan", + "vector-view-history": "Lawen ya ing amlat", + "vector-view-view": "Basan", + "vector-view-viewsource": "Lawen ya ing pikuanan", + "vector-more-actions": "Maki-mayigit pa" +} diff --git a/Vector/i18n/pap.json b/Vector/i18n/pap.json new file mode 100644 index 0000000..08a4a54 --- /dev/null +++ b/Vector/i18n/pap.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Irus", + "ObaTango" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 idioma}}", + "vector-action-addsection": "Añadí un tópiko", + "vector-action-delete": "Kita", + "vector-action-move": "Move", + "vector-action-protect": "Protehá", + "vector-view-create": "Krea", + "vector-view-edit": "Editá", + "vector-view-history": "Bista di e historia", + "vector-view-view": "Lesa", + "vector-more-actions": "Mas", + "vector-searchsuggest-containing": "Buska página ku tin $1" +} diff --git a/Vector/i18n/pbb.json b/Vector/i18n/pbb.json new file mode 100644 index 0000000..9ddeada --- /dev/null +++ b/Vector/i18n/pbb.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "Sahaquiel9102" + ] + }, + "vector-action-delete": "Cjũcj", + "vector-action-move": "Quẽese'j", + "vector-action-protect": "Pjupj", + "vector-view-edit": "Yu'ptjej", + "vector-view-view": "Lẽeĩ" +} diff --git a/Vector/i18n/pcd.json b/Vector/i18n/pcd.json new file mode 100644 index 0000000..87c0794 --- /dev/null +++ b/Vector/i18n/pcd.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Geoleplubo" + ] + }, + "vector-action-addsection": "Rajouter un sujeut", + "vector-action-delete": "Défacer", + "vector-action-move": "Canger ch'nom", + "vector-action-protect": "Garantir", + "vector-action-undelete": "N'poin défacher", + "vector-action-unprotect": "Canger l'garantie", + "vector-view-create": "Créer", + "vector-view-edit": "Éditer", + "vector-view-history": "Vir l'histoère", + "vector-view-view": "Lire", + "vector-view-viewsource": "Vir l'source", + "vector-more-actions": "Pus" +} diff --git a/Vector/i18n/pcm.json b/Vector/i18n/pcm.json new file mode 100644 index 0000000..9dc033f --- /dev/null +++ b/Vector/i18n/pcm.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Samatics" + ] + }, + "vector-languages": "Langwej-dem", + "vector-language-button-label": "{{PLURAL:$1|$1 langwej|$1 langwej-dem}}", + "vector-no-language-button-label": "Ad langwej-dem", + "vector-action-addsection": "Put anoda topik", + "vector-action-delete": "Komot-am", + "vector-action-move": "Muv-am", + "vector-action-protect": "Protet-am", + "vector-view-create": "Mek-am", + "vector-view-edit": "Chenj-am", + "vector-view-history": "See wetin don hapun hie", + "vector-view-view": "Read-am", + "vector-more-actions": "Si oda tins:", + "vector-searchsuggest-containing": "Find pej-dem wey get $1", + "vector-page-tools-label": "Tins wey you go yuz wok", + "vector-page-tools-general-label": "General", + "vector-unpin-element-label": "hide-am" +} diff --git a/Vector/i18n/pdc.json b/Vector/i18n/pdc.json new file mode 100644 index 0000000..a3903b2 --- /dev/null +++ b/Vector/i18n/pdc.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Xqt" + ] + }, + "vector-action-delete": "Verwische", + "vector-action-move": "Ziehe", + "vector-action-protect": "Schitze", + "vector-view-create": "Schtaerte", + "vector-view-edit": "Ennere", + "vector-view-history": "Gschicht zeige", + "vector-view-view": "Lese" +} diff --git a/Vector/i18n/pfl.json b/Vector/i18n/pfl.json new file mode 100644 index 0000000..a4c39f4 --- /dev/null +++ b/Vector/i18n/pfl.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Manuae" + ] + }, + "vector-action-addsection": "Abschnidd dzufiesche", + "vector-action-delete": "Lesche", + "vector-action-move": "Vaschiewe", + "vector-action-protect": "Schidze", + "vector-action-undelete": "Zriggbringe", + "vector-view-create": "Oaleesche", + "vector-view-edit": "Droa schaffe", + "vector-view-history": "Dadaigschischd", + "vector-view-view": "Lese", + "vector-view-viewsource": "Gwelltegschd zaische", + "vector-more-actions": "Mea" +} diff --git a/Vector/i18n/pi.json b/Vector/i18n/pi.json new file mode 100644 index 0000000..cc57f67 --- /dev/null +++ b/Vector/i18n/pi.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Hemant wikikosh1" + ] + }, + "vector-view-create": "रचेतु" +} diff --git a/Vector/i18n/pih.json b/Vector/i18n/pih.json new file mode 100644 index 0000000..d7550d0 --- /dev/null +++ b/Vector/i18n/pih.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "AmaryllisGardener", + "Fanjiayi", + "MinecraftAustralia" + ] + }, + "vector-view-edit": "Edet", + "vector-view-history": "View histrei" +} diff --git a/Vector/i18n/piu.json b/Vector/i18n/piu.json new file mode 100644 index 0000000..2c3daf8 --- /dev/null +++ b/Vector/i18n/piu.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Pintupi Luritja Guy" + ] + }, + "vector-languages": "Wangka tjuṯa", + "vector-language-button-label": "{{PLURAL:$1|wangka $1}}", + "vector-no-language-button-label": "Wangka tuturrpuwa", + "vector-action-addsection": "Kuwitjina tuturrpuwa", + "vector-action-move": "Mantji", + "vector-view-create": "Palyala", + "vector-view-history": "Yara nyawa", + "vector-more-actions": "Piyuku", + "vector-searchsuggest-containing": "Ngurrila piipaku $1lawana", + "vector-toc-label": "Yangkirraḻpa tjuṯa", + "vector-toc-beginning": "Ngankirri", + "vector-page-tools-label": "Tuula tjuṯa", + "vector-page-tools-general-label": "Puḻka", + "vector-unpin-element-label": "kumpitjurra" +} diff --git a/Vector/i18n/pl.json b/Vector/i18n/pl.json new file mode 100644 index 0000000..61b3792 --- /dev/null +++ b/Vector/i18n/pl.json @@ -0,0 +1,72 @@ +{ + "@metadata": { + "authors": [ + "Chrumps", + "Matma Rex", + "Msz2001", + "Nux", + "Openbk", + "Rail", + "Sp5uhe", + "Woytecr" + ] + }, + "skinname-vector": "Stary Wektor (2010)", + "skinname-vector-2022": "Wektor (2022)", + "vector-specialversion-name": "Wektor", + "vector-skin-desc": "Dodaje dwie skórki Wektor:\n* 2011 – Odświeżona wersja skórki Książka, z nowym wyglądem i usprawnieniami.\n* 2022 – Skórka Wektor zbudowana jako część projektu [[mw:Desktop Improvements|ulepszania interfejsu]] Fundacji Wikimedia.", + "prefs-vector-enable-vector-1-label": "Użyj starego Wektora", + "prefs-vector-enable-vector-1-help": "W ciągu najbliższych kilku lat będziemy stopniowo aktualizować skórkę Wektor. Stary Wektor umożliwi ci używanie poprzedniej wersji skórki (na grudzień 2019). Aby dowiedzieć się więcej o aktualizacjach przejdź do naszej [[mw:Reading/Web/Desktop_Improvements|strony projektu]].", + "vector-opt-out": "Przełącz na stary widok", + "vector-opt-out-tooltip": "Zmień ustawienia, aby powrócić do starego wyglądu skórki (stary Wektor)", + "vector.css": "/* Umieszczony tutaj kod CSS zostanie załadowany przez użytkowników korzystających ze skórki Wektor */", + "vector.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany przez użytkowników korzystających ze skórki Wektor */", + "vector-action-toggle-sidebar": "Przełącz panel boczny", + "vector-languages": "Języki", + "vector-language-button-aria-label": "Przejdź do artykułu w innym języku. Treść dostępna w {{PLURAL:$1|$1 języku|$1 językach}}", + "vector-language-button-label": "$1 {{PLURAL:$1|język|języki|języków}}", + "vector-no-language-button-label": "Dodaj języki", + "vector-no-language-button-aria-label": "Ten artykuł istnieje tylko w tym języku. Dodaj artykuły w innych językach.", + "vector-language-redirect-to-top": "W tym projekcie linki pomiędzy różnymi wersjami językowymi znajdują się na górze strony, naprzeciw jej tytułu. [[#p-lang-btn|Przejdź do góry]].", + "vector-language-variant-switcher-label": "Zmień wariant języka", + "vector-action-addsection": "Dodaj temat", + "vector-action-delete": "Usuń", + "vector-action-move": "Przenieś", + "vector-action-protect": "Zabezpiecz", + "vector-action-undelete": "Odtwórz", + "vector-action-unprotect": "Zmień zabezpieczenie", + "vector-view-create": "Utwórz", + "vector-view-edit": "Edytuj", + "vector-view-history": "Wyświetl historię", + "vector-view-view": "Czytaj", + "vector-view-viewsource": "Tekst źródłowy", + "vector-jumptonavigation": "Przejdź do nawigacji", + "vector-jumptosearch": "Przejdź do wyszukiwania", + "vector-jumptocontent": "Przejdź do zawartości", + "vector-more-actions": "Więcej", + "vector-search-loader": "Wczytywanie sugestii", + "vector-searchsuggest-containing": "Szukaj stron zawierających $1", + "vector-intro-page": "Help:Pierwsze kroki", + "vector-toc-label": "Spis treści", + "vector-toc-beginning": "Początek", + "vector-toc-toggle-button-label": "Przełącz podsekcję $1", + "vector-anon-user-menu-pages": "Strony dla anonimowych edytorów", + "vector-anon-user-menu-pages-learn": "dowiedz się więcej", + "vector-anon-user-menu-pages-label": "Dowiedz się więcej na temat edytowania", + "vector-main-menu-tooltip": "Główne menu", + "vector-toc-menu-tooltip": "Spis treści", + "vector-toc-collapsible-button-label": "Przełącz stan spisu treści", + "vector-site-nav-label": "Witryna", + "vector-main-menu-label": "Menu główne", + "vector-limited-width-toggle": "Przełącz ograniczenie szerokości strony", + "vector-page-tools-label": "Narzędzia", + "vector-page-tools-general-label": "Ogólne", + "vector-page-tools-actions-label": "Działania", + "vector-pin-element-label": "przypnij", + "vector-unpin-element-label": "ukryj", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|dyskusja]]", + "tooltip-vector-anon-user-menu-title": "Więcej opcji", + "vector-prefs-limited-width": "Włącz tryb ograniczonej szerokości", + "vector-prefs-limited-width-help": "Włącz tryb ograniczonej szerokości, aby poprawić wygodę czytania.", + "empty-language-selector-body": "Treść strony nie jest dostępna w innych językach." +} diff --git a/Vector/i18n/pms.json b/Vector/i18n/pms.json new file mode 100644 index 0000000..40dab80 --- /dev/null +++ b/Vector/i18n/pms.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Borichèt" + ] + }, + "vector-action-addsection": "Gionté n'argoment", + "vector-action-delete": "Scancelé", + "vector-action-move": "Tramudé", + "vector-action-protect": "Protege", + "vector-action-undelete": "Arcuperé", + "vector-action-unprotect": "Cangé la protession", + "vector-view-create": "Creé", + "vector-view-edit": "Modifiché", + "vector-view-history": "Smon-e la stòria", + "vector-view-view": "Lese", + "vector-view-viewsource": "Vëdde la sorgiss", + "vector-more-actions": "Ëd pi" +} diff --git a/Vector/i18n/pnb.json b/Vector/i18n/pnb.json new file mode 100644 index 0000000..879ff5f --- /dev/null +++ b/Vector/i18n/pnb.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Abbas dhothar", + "Arslan", + "Bgo eiu", + "Khalid Mahmood" + ] + }, + "vector-opt-out": "پرانی وضع اُتے پرتو", + "vector-languages": "بولیاں", + "vector-language-button-label": "{{PLURAL:$1|$1 بولی|$1 بولیاں}}", + "vector-no-language-button-label": "بولیاں جوڑو", + "vector-action-addsection": "مضمون پایو", + "vector-action-delete": "مٹاؤ", + "vector-action-move": "لے چلو", + "vector-action-protect": "بچاؤ", + "vector-action-undelete": "واپس لیاؤ", + "vector-action-unprotect": "تبدیلی بچاؤ", + "vector-view-create": "بݨاؤ", + "vector-view-edit": "سودھو", + "vector-view-history": "تریخ ویکھو", + "vector-view-view": "پڑھو", + "vector-view-viewsource": "سورس ویکھو", + "vector-more-actions": "ہور", + "vector-searchsuggest-containing": "اس ٹرم نوں صفحےآں وچ کھوجو ", + "vector-page-tools-label": "سند", + "vector-page-tools-general-label": "عام", + "vector-unpin-element-label": "لُکاؤ" +} diff --git a/Vector/i18n/pnt.json b/Vector/i18n/pnt.json new file mode 100644 index 0000000..1e5ecad --- /dev/null +++ b/Vector/i18n/pnt.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Omnipaedista", + "Sinopeus", + "ZaDiak" + ] + }, + "vector-action-delete": "Σβήσον", + "vector-action-move": "Ετεροχλάεμαν", + "vector-action-protect": "Ασπάλιγμαν", + "vector-action-undelete": "Κλώσιμον", + "vector-action-unprotect": "Άνοιγμαν", + "vector-view-create": "Ποίσον", + "vector-view-edit": "Άλλαξον", + "vector-view-history": "Τερέστεν ιστορίαν", + "vector-view-view": "Δεάβασον", + "vector-view-viewsource": "Τερέστεν κωδικόν" +} diff --git a/Vector/i18n/ppl.json b/Vector/i18n/ppl.json new file mode 100644 index 0000000..1c80fd8 --- /dev/null +++ b/Vector/i18n/ppl.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "A R King" + ] + }, + "vector-action-addsection": "Yankwik temaj", + "vector-action-delete": "Shikishti", + "vector-action-move": "Shikijkwani", + "vector-action-undelete": "Shalkwepa", + "vector-view-create": "Shikchiwa", + "vector-view-edit": "Shikpata", + "vector-view-history": "Ken mupatak", + "vector-view-view": "Shiamatachia", + "vector-view-viewsource": "Shikita ne codigoj" +} diff --git a/Vector/i18n/prg.json b/Vector/i18n/prg.json new file mode 100644 index 0000000..50d4d31 --- /dev/null +++ b/Vector/i18n/prg.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Nertiks", + "Nērtiks Jōrgesuns", + "Peteris", + "Tīgelika" + ] + }, + "vector-language-button-aria-label": "Jaīs en artīkelin pra kittan billin. Preiēiminan en {{PLURAL:$1|$1 bilāmans|$1 billai|$1 bilāmans}}", + "vector-language-button-label": "$1 {{PLURAL:$1|billas|bilā|billas}}", + "vector-language-variant-switcher-label": "Kitawīdinais billas wariāntin", + "vector-action-addsection": "Preidāis tēman", + "vector-action-delete": "Āupausinais", + "vector-action-move": "Prapīdais", + "vector-action-protect": "Kūnsteis", + "vector-action-unprotect": "Kitawīdintun pakūnsnan", + "vector-view-create": "Teīkeis", + "vector-view-edit": "Redigīs", + "vector-view-history": "Enwaidinnais istōrijan", + "vector-view-view": "Skaitāis", + "vector-view-viewsource": "Wīdais appun", + "vector-more-actions": "Tūls", + "vector-searchsuggest-containing": "Laukīs pāusans turīnts $1" +} diff --git a/Vector/i18n/prs.json b/Vector/i18n/prs.json new file mode 100644 index 0000000..c572191 --- /dev/null +++ b/Vector/i18n/prs.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Ahmed-Najib-Biabani-Ibrahimkhel", + "Mjbmr" + ] + }, + "vector-view-create": "ساختن", + "vector-view-edit": "ویرایش", + "vector-view-history": "نمایش تاریخچه", + "vector-view-view": "خواندن", + "vector-more-actions": "بیشتر" +} diff --git a/Vector/i18n/ps.json b/Vector/i18n/ps.json new file mode 100644 index 0000000..b4c8491 --- /dev/null +++ b/Vector/i18n/ps.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Af420", + "Ahmed-Najib-Biabani-Ibrahimkhel", + "Amjad Khan" + ] + }, + "skinname-vector": "وېکټور", + "vector.css": "/* د CSS هره بڼه چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */", + "vector.js": "/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */", + "vector-language-button-aria-label": "ليکنه په بله ژبه کي وګورئ. دا ليکنه په {{PLURAL:$1|$1 ژبه|$1 ژبو}} کې شتون لري.", + "vector-language-button-label": "{{PLURAL:$1|$1 ژبه|$1 ژبې}}", + "vector-language-redirect-to-top": "په دې {{SITENAME}} کې د نورو ژبو لینکونه د لیکنې د سرلیک څخه لوړ موقيعت لري. [[#p-lang-btn|لوړ ولاړ سئ]].", + "vector-action-addsection": "سرليک ورگډول", + "vector-action-delete": "ړنگول", + "vector-action-move": "لېږدول", + "vector-action-protect": "ژغورل", + "vector-action-undelete": "ناړنگول", + "vector-action-unprotect": "ژغورنه بدلول", + "vector-view-create": "جوړول", + "vector-view-edit": "سمول", + "vector-view-history": "پېښليک کتل", + "vector-view-view": "لوستل", + "vector-view-viewsource": "سرچينه کتل", + "vector-more-actions": "نور", + "vector-toc-beginning": "پیل" +} diff --git a/Vector/i18n/pt-br.json b/Vector/i18n/pt-br.json new file mode 100644 index 0000000..7792a09 --- /dev/null +++ b/Vector/i18n/pt-br.json @@ -0,0 +1,77 @@ +{ + "@metadata": { + "authors": [ + "!Silent", + "Cainamarques", + "Diego Queiroz", + "Duke of Wikipädia", + "Eduardo Addad de Oliveira", + "Eduardoaddad", + "Felipe L. Ewald", + "Fúlvio", + "Giro720", + "He7d3r", + "Helder.wiki", + "Jaideraf", + "Luan", + "Opraco", + "YuriNikolai", + 555 + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "Fornece 2 temas Vector:\n* 2011 - Versão moderna do MonoBook com um aspeto fresco e várias melhorias de usabilidade.\n* 2022 - O Vector criado como parte do projeto [[mw:Desktop Improvements|Melhoramentos do ambiente de trabalho]] da WMF.", + "prefs-vector-enable-vector-1-label": "Usar Vector legado", + "prefs-vector-enable-vector-1-help": "Nos próximos anos, atualizaremos gradualmente o tema Vector. O Vector legado permitirá que você visualize a versão antiga do Vector (a partir de dezembro de 2019). Para saber mais sobre as atualizações, acesse nossa [[mw:Reading/Web/Desktop_Improvements|página do projeto]].", + "vector-opt-out": "Mudar para aparência antiga", + "vector-opt-out-tooltip": "Alterar as suas configurações para voltar ao aspeto anterior do tema (Vector anterior)", + "vector.css": "/* Todos os CSS colocado aqui serão carregados para usuários do tema Vector */", + "vector.js": "/* Todos os JavaScript aqui colocado será carregado para usuários do tema Vector */", + "vector-action-toggle-sidebar": "Alternar barra lateral", + "vector-languages": "Idiomas", + "vector-language-button-aria-label": "Vá para um artigo em outro idioma. Disponível em {{PLURAL:$1|$1 idioma|$1 idiomas}}", + "vector-language-button-label": "{{PLURAL:$1|$1 idioma|$1 idiomas}}", + "vector-no-language-button-label": "Adicionar idiomas", + "vector-no-language-button-aria-label": "Este artigo existe somente neste idioma. Adicione o artigo em outros idiomas", + "vector-language-redirect-to-top": "Nesta {{SITENAME}}, os links dos idiomas estão no topo da página, em frente ao título do artigo. [[#p-lang-btn|Ir para o topo]].", + "vector-language-variant-switcher-label": "Alterar a variante de idioma", + "vector-action-addsection": "Adicionar tópico", + "vector-action-delete": "Excluir", + "vector-action-move": "Mover", + "vector-action-protect": "Proteger", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Alterar a proteção", + "vector-view-create": "Criar", + "vector-view-edit": "Editar", + "vector-view-history": "Ver histórico", + "vector-view-view": "Ler", + "vector-view-viewsource": "Ver código-fonte", + "vector-jumptonavigation": "Ir para navegação", + "vector-jumptosearch": "Ir para pesquisar", + "vector-jumptocontent": "Ir para o conteúdo", + "vector-more-actions": "Mais", + "vector-search-loader": "Carregando sugestões de pesquisa", + "vector-searchsuggest-containing": "Procurar pelas páginas contendo $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Conteúdo", + "vector-toc-beginning": "Início", + "vector-toc-toggle-button-label": "Alternar subseção $1", + "vector-anon-user-menu-pages": "Páginas para editores conectados", + "vector-anon-user-menu-pages-learn": "saiba mais", + "vector-anon-user-menu-pages-label": "Saiba mais sobre edição", + "vector-main-menu-tooltip": "Menu principal", + "vector-toc-menu-tooltip": "Índice", + "vector-toc-collapsible-button-label": "Alternar o índice", + "vector-site-nav-label": "Site", + "vector-main-menu-label": "Menu principal", + "vector-page-tools-label": "Ferramentas", + "vector-page-tools-general-label": "Geral", + "vector-page-tools-actions-label": "Ações", + "vector-pin-element-label": "mover para a barra lateral", + "vector-unpin-element-label": "Esconder", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discussão]]", + "tooltip-vector-anon-user-menu-title": "Mais opções", + "vector-prefs-limited-width": "Ativar modo de largura limitada", + "vector-prefs-limited-width-help": "Ative o modo de largura limitada para melhorar a experiência de leitura.", + "empty-language-selector-body": "O conteúdo da página não é suportado em outros idiomas." +} diff --git a/Vector/i18n/pt.json b/Vector/i18n/pt.json new file mode 100644 index 0000000..d699e83 --- /dev/null +++ b/Vector/i18n/pt.json @@ -0,0 +1,74 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Athena in Wonderland", + "Crazymadlover", + "Giro720", + "GoEThe", + "Hamilton Abreu", + "Luan", + "Malafaya", + "MokaAkashiyaPT", + "Vitorvicentevalente", + "Waldir", + "Waldyrious" + ] + }, + "skinname-vector": "Vector antigo (2010)", + "vector-skin-desc": "Fornece 2 temas Vector:\n* 2011 - Versão moderna do MonoBook com um aspeto fresco e várias melhorias de usabilidade.\n* 2022 - O Vector criado como parte do projeto [[mw:Desktop Improvements|Melhoramentos do ambiente de trabalho]] da WMF.", + "prefs-vector-enable-vector-1-label": "Usar o Vector antigo", + "prefs-vector-enable-vector-1-help": "Durante os próximos anos iremos atualizar gradualmente o tema Vector. O Vetor antigo permitirá ver a versão antiga do tema Vector (a partir de dezembro de 2019). Para saber mais sobre as atualizações, consulte a [[mw:Reading/Web/Desktop_Improvements|página do projeto]].", + "vector-opt-out": "Mudar para aparência antiga", + "vector-opt-out-tooltip": "Alterar as suas configurações para voltar ao aspeto anterior do tema (Vector anterior)", + "vector.css": "/* Todo o código CSS colocado aqui será carregado para os utilizadores do tema Vector */", + "vector.js": "/* Todo o código Javascript colocado aqui será carregado para os utilizadores do tema Vector */", + "vector-action-toggle-sidebar": "Alternar barra lateral", + "vector-languages": "Línguas", + "vector-language-button-aria-label": "Ir para um artigo noutra língua. Disponível em {{PLURAL:$1|$1 língua|$1 línguas}}", + "vector-language-button-label": "{{PLURAL:$1|$1 língua|$1 línguas}}", + "vector-no-language-button-label": "Adicionar línguas", + "vector-no-language-button-aria-label": "Este artigo só existe nesta língua. Adicione o artigo noutras línguas", + "vector-language-redirect-to-top": "Na wiki {{SITENAME}} as hiperligações interlínguas estão localizadas no topo da página do lado oposto ao título. [[#p-lang-btn|Ir para o topo]].", + "vector-language-variant-switcher-label": "Mudar a variante da língua", + "vector-action-addsection": "Adicionar tópico", + "vector-action-delete": "Eliminar", + "vector-action-move": "Mover", + "vector-action-protect": "Proteger", + "vector-action-undelete": "Restaurar", + "vector-action-unprotect": "Alterar proteção", + "vector-view-create": "Criar", + "vector-view-edit": "Editar", + "vector-view-history": "Ver histórico", + "vector-view-view": "Ler", + "vector-view-viewsource": "Ver fonte", + "vector-jumptonavigation": "Saltar para a navegação", + "vector-jumptosearch": "Saltar para a pesquisa", + "vector-jumptocontent": "Saltar para o conteúdo", + "vector-more-actions": "Mais", + "vector-search-loader": "A carregar sugestões de pesquisa", + "vector-searchsuggest-containing": "Procurar páginas que contenham $1", + "vector-intro-page": "Help:Introduction", + "vector-toc-label": "Conteúdo", + "vector-toc-beginning": "Início", + "vector-toc-toggle-button-label": "Alternar a subsecção $1", + "vector-anon-user-menu-pages": "Páginas para editores sem sessão iniciada", + "vector-anon-user-menu-pages-learn": "saber mais", + "vector-anon-user-menu-pages-label": "Saiba mais sobre edição", + "vector-main-menu-tooltip": "Menu principal", + "vector-toc-menu-tooltip": "Índice", + "vector-toc-collapsible-button-label": "Alternar o índice", + "vector-site-nav-label": "''Site''", + "vector-main-menu-label": "Menu principal", + "vector-limited-width-toggle": "Alternar a largura de conteúdo limitada", + "vector-page-tools-label": "Ferramentas", + "vector-page-tools-general-label": "Geral", + "vector-page-tools-actions-label": "Operações", + "vector-pin-element-label": "mover para a barra lateral", + "vector-unpin-element-label": "ocultar", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|discussão]]", + "tooltip-vector-anon-user-menu-title": "Mais opções", + "vector-prefs-limited-width": "Ativar o modo de largura limitada", + "vector-prefs-limited-width-help": "Ativar o modo de largura limitada, para uma melhor experiência de leitura.", + "empty-language-selector-body": "O conteúdo da página não é suportado noutras línguas." +} diff --git a/Vector/i18n/pwn.json b/Vector/i18n/pwn.json new file mode 100644 index 0000000..f89382b --- /dev/null +++ b/Vector/i18n/pwn.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Akamycoco", + "Iyumu" + ] + }, + "vector-action-addsection": "padjulu ta sipazulju a ljavaran", + "vector-action-delete": "qemulip", + "vector-action-move": "patjaliyav", + "vector-action-protect": "pinaljakevan", + "vector-view-create": "qemati", + "vector-view-edit": "remasudj ta vincikan", + "vector-view-history": "kileqeleq a pacun ta sinantjaucikel", + "vector-view-view": "semupu", + "vector-view-viewsource": "kileqeleq a pacun ta tinagiljan a sinikipukeljang", + "vector-more-actions": "patjaliyav" +} diff --git a/Vector/i18n/qqq.json b/Vector/i18n/qqq.json new file mode 100644 index 0000000..c415de1 --- /dev/null +++ b/Vector/i18n/qqq.json @@ -0,0 +1,80 @@ +{ + "@metadata": { + "authors": [ + "Ajeje Brazorf", + "Amire80", + "Darth Kule", + "EugeneZelenko", + "Liuxinyu970226", + "Lloffiwr", + "Matma Rex", + "Metalhead64", + "Raymond", + "Robby", + "Shirayuki", + "Tacsipacsi", + "Thibaut120094", + "Umherirrender", + "Verdy p", + "Mormegil" + ] + }, + "skinname-vector": "{{name}}", + "skinname-vector-2022": "{{name}}", + "vector-specialversion-name": "{{name}}", + "vector-skin-desc": "{{desc|what=skin|name=Vector|url=https://www.mediawiki.org/wiki/Skin:Vector}}", + "prefs-vector-enable-vector-1-label": "Label for the checkbox to force Legacy Vector operation accessible via Special:Preferences. When this checkbox is enabled, the December 2019 of Vector is used. When this checkbox is disabled, the actively developed version of Vector is used instead.", + "prefs-vector-enable-vector-1-help": "Detail explaining the operation of the prefs-vector-enable-vector-1-label checkbox.", + "vector-opt-out": "Text of link that takes the user to the Special:Preferences page so they can opt-out of the latest version of Vector and go back to legacy Vector.", + "vector-opt-out-tooltip": "Used as the tooltip for the Vector opt-out link", + "vector.css": "{{optional}}\n{{related/css}}", + "vector.js": "{{optional}}\n{{related/js}}", + "vector-action-toggle-sidebar": "Accessibility label for the button that toggles the sidebar's visibility, as well as audible presentation for screen readers.", + "vector-languages": "Label for language alert in sidebar when language switching is in header\n\n{{Identical|Language}}", + "vector-language-button-aria-label": "Accessibility label for language button dropdown menu in modern Vector.\n* $1 - the count of languages available, supports plural", + "vector-language-button-label": "Label for language button in modern Vector.\n\nArguments:\n* $1 number of languages, supports plural", + "vector-no-language-button-label": "Label for language button when article does not exist in any other language.", + "vector-no-language-button-aria-label": "Accessibility label for language button dropdown menu in modern Vector.", + "vector-language-redirect-to-top": "Explains language links location at top of page and provides link to top. See also [[:phab:T295555]].", + "vector-language-variant-switcher-label": "Label for the language variant switcher.", + "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n{{Identical|Add topic}}", + "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Translating:MediaWiki|useskin=vector}}\n\n{{Identical|Delete}}", + "vector-action-move": "The \"Move\" action renames pages.\n\nUsed in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}", + "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}", + "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}", + "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}", + "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n\nWhen Visual Editor is enabled, it appears next to {{msg-mw|Visualeditor-ca-createsource}}.\n\n{{Identical|Create}}", + "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Translating:MediaWiki|useskin=vector}}\n{{Identical|Edit}}", + "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Translating:MediaWiki|useskin=vector}}\n{{Identical|View history}}", + "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Translating:MediaWiki|useskin=vector}}.\n{{Identical|Read}}", + "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}", + "vector-jumptonavigation": "Accessibility link for jumping to the navigation links. Visually hidden by default.\n\nSee also\n* {{msg-mw|Navigation}}", + "vector-jumptosearch": "Accessibility link for jumping to the site search. Visually hidden by default.\n\nSee also\n* {{msg-mw|Search}}", + "vector-jumptocontent": "Accessibility link for jumping to the content and skipping the navigation. Visually hidden by default.", + "vector-more-actions": "Label in the Vector skin's menu for the less-important or rarer actions which are not shown as tabs (like moving the page, or for sysops deleting or protecting the page), as well as (for users with a narrow viewing window in their browser) the less-important tab actions which the user's browser is unable to fit in. {{Identical|More}}", + "vector-search-loader": "Text to display below search input while the search suggestion module is loading", + "vector-searchsuggest-containing": "Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term. Used in the Codex typeahead search component.", + "vector-intro-page": "Introduction or tutorial page for the wiki. Typically either Project/Help:Introduction ([[d:Q3945]]) or Project/Help:Tutorial ([[d:Q915263]]).", + "vector-toc-label": "Heading of table of contents\n\n{{Identical|Content}}", + "vector-toc-beginning": "Shown in the table of contents: Text of link to the beginning of the article.", + "vector-toc-toggle-button-label": "Used to label TOC section toggle buttons for screen readers\n\n* $1 – The name of the TOC section to show/hide", + "vector-anon-user-menu-pages": "Label describing the anon editor links in the anon user menu", + "vector-anon-user-menu-pages-learn": "Lowercase text of link that goes to Help:Introduction and helps the user learn more about editing", + "vector-anon-user-menu-pages-label": "Accessible version of 'vector-anon-user-menu-pages' link text, prompts user to learn more about editing", + "vector-main-menu-tooltip": "Used as title attribute for main menu icon on hover.", + "vector-toc-menu-tooltip": "Used as title attribute for table of contents icon on hover.", + "vector-toc-collapsible-button-label": "Used as the label for the table of contents collapsible toggle button", + "vector-site-nav-label": "Accessible label for site (main menu) nav landmark", + "vector-main-menu-label": "Main menu label", + "vector-limited-width-toggle": "Toggle for control to limit content width.", + "vector-page-tools-label": "Label for the page tools pinnable dropdown\n{{identical|Tools}}", + "vector-page-tools-general-label": "Label for the page tools 'General' menu\n{{identical|General}}", + "vector-page-tools-actions-label": "Label for the page tools 'Actions' menu\n{{identical|Action}}", + "vector-pin-element-label": "Label for toggle button in PinnableHeader to pin an element", + "vector-unpin-element-label": "Label for toggle button in PinnableHeader to unpin an element", + "vector-2022-prefs-talkpage": "Link to the desktop improvements project talk page which is shown before the preview link in skin preferences. See T307113 for more information.", + "tooltip-vector-anon-user-menu-title": "Used as title attribute for user menu icon on hover for anonymous users.", + "vector-prefs-limited-width": "Used in [[Special:Preferences]]", + "vector-prefs-limited-width-help": "Help message used on [[Special:Preferences]].\n\nSee also:\n* {{msg-mw|Mypreferences}}", + "empty-language-selector-body": "Text of the body of the dropdown that explains to the user that the page is not supported in other languages. The dropdown opens when the less prominent language button is clicked, inside non-content pages" +} diff --git a/Vector/i18n/qu.json b/Vector/i18n/qu.json new file mode 100644 index 0000000..789fd27 --- /dev/null +++ b/Vector/i18n/qu.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "AlimanRuna" + ] + }, + "vector-action-addsection": "Allwiyta yapay", + "vector-action-delete": "Qulluy", + "vector-action-move": "Astay", + "vector-action-protect": "Amachay", + "vector-action-undelete": "Qullusqata paqarichiy", + "vector-action-unprotect": "Amachayta wakinchay", + "vector-view-create": "Kamariy", + "vector-view-edit": "Llamk'apuy", + "vector-view-history": "Wiñay kawsayta qhaway", + "vector-view-view": "Ñawiriy", + "vector-view-viewsource": "Pukyu qillqata qhaway", + "vector-more-actions": "Aswan" +} diff --git a/Vector/i18n/qug.json b/Vector/i18n/qug.json new file mode 100644 index 0000000..306f4ae --- /dev/null +++ b/Vector/i18n/qug.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Sylvain2803" + ] + }, + "vector-action-addsection": "Shuk mushuk rimanakuyta kallarina", + "vector-action-delete": "Pichana", + "vector-action-move": "Apakuna", + "vector-action-protect": "Harkana", + "vector-action-undelete": "Kutin wacharichina", + "vector-action-unprotect": "Harkayta shukchina", + "vector-view-create": "Kamarina", + "vector-view-edit": "Killkana", + "vector-view-history": "Wiñay kawsayta rikuna", + "vector-view-view": "Killkakatina", + "vector-view-viewsource": "Pukyu killkata rikuna" +} diff --git a/Vector/i18n/qwh.json b/Vector/i18n/qwh.json new file mode 100644 index 0000000..9e7f470 --- /dev/null +++ b/Vector/i18n/qwh.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Michaelobregon" + ] + }, + "vector-view-history": "Isturyalta rikay", + "vector-view-view": "Ñawinchay" +} diff --git a/Vector/i18n/rap.json b/Vector/i18n/rap.json new file mode 100644 index 0000000..b1f644c --- /dev/null +++ b/Vector/i18n/rap.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Clerc", + "MJohnsson" + ] + }, + "vector-action-delete": "horo'i", + "vector-view-edit": "Haka titika" +} diff --git a/Vector/i18n/rej.json b/Vector/i18n/rej.json new file mode 100644 index 0000000..2970c10 --- /dev/null +++ b/Vector/i18n/rej.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "MFikriansori" + ] + }, + "vector-action-addsection": "Tambêak dik nêbahas", + "vector-action-delete": "Apus", + "vector-action-move": "Aliak", + "vector-action-protect": "Lindung", + "vector-view-create": "Nêa", + "vector-view-edit": "Ubêak", + "vector-view-history": "Kêliak riwayat", + "vector-view-view": "Baco", + "vector-more-actions": "Igai" +} diff --git a/Vector/i18n/rgn.json b/Vector/i18n/rgn.json new file mode 100644 index 0000000..959fd80 --- /dev/null +++ b/Vector/i18n/rgn.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [] + }, + "vector-action-addsection": "Zonta una cjacarèda", + "vector-action-delete": "Scanzèla", + "vector-action-move": "Chèmbia nòm", + "vector-action-protect": "Metti-j una pruteziò", + "vector-action-undelete": "Armett a post", + "vector-action-unprotect": "Sbloca" +} diff --git a/Vector/i18n/rif.json b/Vector/i18n/rif.json new file mode 100644 index 0000000..baad84e --- /dev/null +++ b/Vector/i18n/rif.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Amara-Amaziɣ", + "MoubarikBelkasim" + ] + }, + "vector-action-addsection": "ⵔⵏⵓ ⴰⵙⵏⵜⵍ", + "vector-action-delete": "ⴽⴽⵙ", + "vector-action-move": "ⵙⵎⵓⵜⵜⵉ", + "vector-view-create": "ⵙⵏⵓⵍⴼⵓ", + "vector-view-edit": "ⵙⵏⴼⵍ", + "vector-view-history": "ⴰⵎⵣⵔⵓⵢ", + "vector-view-view": "ⵖⵔ" +} diff --git a/Vector/i18n/rki.json b/Vector/i18n/rki.json new file mode 100644 index 0000000..b03971b --- /dev/null +++ b/Vector/i18n/rki.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Aggasena", + "Cakkaparla", + "ReyLon Mrat", + "Tejoebāsa", + "YaThaWinTha" + ] + }, + "vector-languages": "ဘာသာစကားတိ", + "vector-language-button-label": "{{PLURAL:$1|ဘာသာစကား $1 ခု|$1 ဘာသာစကားများ $1 ခု}}", + "vector-no-language-button-label": "ဘာသာစကားတိ ထည့်သွင်းပါ", + "vector-action-addsection": "ခေါင်းစီးတိထည့်ပါ", + "vector-action-delete": "ဖျက်​ပါ​", + "vector-action-move": "ရွိလျားရေ", + "vector-action-protect": "ကာကွယ်ရေ", + "vector-view-create": "ဖန်တီးပါ", + "vector-view-edit": "တီးဖြတ်ပါ", + "vector-view-history": "သမိုင်းတိကိုကြည့်ပါ", + "vector-view-view": "ဖတ်ကြေ့ပါ", + "vector-more-actions": "ထပ်လို့", + "vector-searchsuggest-containing": "$1ပါဝင်ရေ စာမျက်နှာတိ ယှာဖွီရန်", + "vector-page-tools-label": "ကိရိယာတိ", + "vector-page-tools-general-label": "အထွီအထွီ", + "vector-unpin-element-label": "ဝှက်တေ" +} diff --git a/Vector/i18n/rm.json b/Vector/i18n/rm.json new file mode 100644 index 0000000..8778812 --- /dev/null +++ b/Vector/i18n/rm.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Gion-andri", + "Terfili" + ] + }, + "vector-action-addsection": "Agiuntar chapitel", + "vector-action-delete": "Stizzar", + "vector-action-move": "Spustar", + "vector-action-protect": "Bloccar", + "vector-action-undelete": "Restituir", + "vector-action-unprotect": "Midar la protecziun", + "vector-view-create": "Crear", + "vector-view-edit": "Modifitgar", + "vector-view-history": "Cronologia", + "vector-view-view": "Leger", + "vector-view-viewsource": "Mussar il code", + "vector-more-actions": "dapli" +} diff --git a/Vector/i18n/rmc.json b/Vector/i18n/rmc.json new file mode 100644 index 0000000..69b7a2e --- /dev/null +++ b/Vector/i18n/rmc.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Adehertogh" + ] + }, + "vector-languages": "Čhiba", + "vector-language-button-label": "{{PLURAL:$1|$1 čhib|$1 čhiba}}", + "vector-action-addsection": "Te prithovel dumakero koter", + "vector-action-delete": "Tele te khosel", + "vector-action-move": "Avrete te thovel", + "vector-action-protect": "Tele te phandel", + "vector-view-create": "Ker", + "vector-view-edit": "Te pikerel", + "vector-view-history": "Te dikhel čirlatuňipen", + "vector-view-view": "Te genel", + "vector-more-actions": "Buter" +} diff --git a/Vector/i18n/rmf.json b/Vector/i18n/rmf.json new file mode 100644 index 0000000..9865a50 --- /dev/null +++ b/Vector/i18n/rmf.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Szonja" + ] + }, + "vector-action-addsection": "Tilja topikos", + "vector-action-delete": "Tšuu nikki", + "vector-action-undelete": "Tšuu paale", + "vector-view-create": "Luona", + "vector-view-edit": "Muoka", + "vector-view-history": "Sik histores", + "vector-view-view": "Draba", + "vector-view-viewsource": "Sik navasiinako koodos" +} diff --git a/Vector/i18n/rn.json b/Vector/i18n/rn.json new file mode 100644 index 0000000..5e4af75 --- /dev/null +++ b/Vector/i18n/rn.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Gilbert Ndihokubwayo" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ururimi|$1 indimi}}", + "vector-action-addsection": "Ongeraho ishingiro", + "vector-action-delete": "Kuraho", + "vector-action-move": "Imura", + "vector-action-protect": "Gukinga", + "vector-view-create": "Tanguza", + "vector-view-edit": "Hinyanyura inyandiko", + "vector-view-history": "Raba uko vyagiye birakurikirana", + "vector-view-view": "Soma", + "vector-more-actions": "Ibindi", + "vector-searchsuggest-containing": "Rondera impapuro zirimwo $1" +} diff --git a/Vector/i18n/ro.json b/Vector/i18n/ro.json new file mode 100644 index 0000000..6504f09 --- /dev/null +++ b/Vector/i18n/ro.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "AdiJapan", + "Amire80", + "Danutz", + "Firilacroco", + "ImGelu", + "Minisarm", + "NGC 54", + "Strainu", + "Tanea.d" + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "Versiunea modernă pentru MonoBook cu o înfățișare reîmprospătată și multe îmbunătățiri de uzabilitate", + "prefs-vector-enable-vector-1-label": "Folosiți versiunea veche de Vector", + "prefs-vector-enable-vector-1-help": "De-a lungul următorilor ani vom actualiza gradual skin-ul Vector. Versiunea veche de Vector vă va permite să folosiți varianta din decembrie 2019. Pentru a afla mai multe despre aceste actualizări, vizitați [[mw:Reading/Web/Desktop_Improvements|pagina proiectului]].", + "vector-opt-out": "Comută la aspectul vechi", + "vector-opt-out-tooltip": "Schimbați-vă preferințele pentru a trece la aspectul vechi al skinului Vector", + "vector.css": "/* CSS plasate aici vor afecta utilizatorii stilului Vector */", + "vector-action-toggle-sidebar": "Arată/ascunde bara laterală", + "vector-languages": "Limbi", + "vector-language-button-aria-label": "Mergeți la un articol în altă limbă. Disponibil în {{PLURAL:$1|$1 limbă|$1 limbi}}", + "vector-language-button-label": "{{PLURAL:$1|$1 limbă|$1 limbi}}", + "vector-no-language-button-label": "Adăugare limbi", + "vector-language-redirect-to-top": "Pe acest wiki {{SITENAME}}, legăturile limbii sunt situate în partea de sus a paginii în rând cu titlul articolului. [[#p-lang-btn|Mergi sus]].", + "vector-action-addsection": "Adăugare subiect", + "vector-action-delete": "Ștergere", + "vector-action-move": "Redenumire", + "vector-action-protect": "Protejare", + "vector-action-undelete": "Recuperare", + "vector-action-unprotect": "Modificare protecție", + "vector-view-create": "Creare", + "vector-view-edit": "Modificare", + "vector-view-history": "Istoric", + "vector-view-view": "Lectură", + "vector-view-viewsource": "Vedeți sursa", + "vector-jumptonavigation": "Sari la navigare", + "vector-jumptosearch": "Sari la căutare", + "vector-jumptocontent": "Sari la conținut", + "vector-more-actions": "Mai mult", + "vector-search-loader": "Se încarcă sugestiile de căutare", + "vector-searchsuggest-containing": "Căutați după pagini care conțin $1", + "vector-toc-label": "Cuprins", + "vector-toc-beginning": "Început", + "vector-anon-user-menu-pages": "Pagini pentru editorii neautentificați", + "vector-anon-user-menu-pages-learn": "aflați mai mult", + "vector-anon-user-menu-pages-label": "Aflați mai mult despre editare", + "vector-main-menu-tooltip": "Meniul principal", + "vector-toc-collapsible-button-label": "Comută cuprinsul", + "vector-main-menu-label": "Meniul principal", + "vector-limited-width-toggle": "Comută lățimea limitată a conținutului", + "vector-page-tools-label": "Unelte", + "vector-page-tools-actions-label": "Acțiuni", + "vector-pin-element-label": "mută în bara laterală", + "vector-unpin-element-label": "ascunde", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Discuție]]", + "tooltip-vector-anon-user-menu-title": "Mai multe opțiuni", + "vector-prefs-limited-width": "Activează modul de lățime limitată", + "vector-prefs-limited-width-help": "Activează modul de lățime limitată pentru experiență de lectură îmbunătățită.", + "empty-language-selector-body": "Conținutul paginii nu este suportat în alte limbi." +} diff --git a/Vector/i18n/roa-tara.json b/Vector/i18n/roa-tara.json new file mode 100644 index 0000000..593c37c --- /dev/null +++ b/Vector/i18n/roa-tara.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Joetaras" + ] + }, + "skinname-vector": "Vettore", + "vector-skin-desc": "Versione moderne de MonoBook cu 'nu sguarde aggiornate e 'nu sbuènne de miglioramende sus a l'ausabbilità", + "prefs-vector-enable-vector-1-label": "Ause 'u vettore andiche", + "prefs-vector-enable-vector-1-help": "Jndr'à le prossime anne, amma aggiornà a chiane chiane 'u skin Vector. Legacy Vector te face 'ndrucà 'a versione vecchie de Vector (partenne da decembre 2019). Pe sapè de cchiù sus a le aggiornaminde, vèje sus 'a [[mw:Reading/Web/Desktop_Improvements|pàgene d'u pruggette]] nostre.", + "vector-opt-out": "Passe a grafeche d'apprime", + "vector-opt-out-tooltip": "Cange le 'mbostaziune pe turnà rrete a 'u vecchie mode d'u skin (Vector andiche)", + "vector.css": "/* Tutte le CSS aqquà avène carecate pe le utinde ca ausane 'a masckere Vector */", + "vector.js": "/* Tutte le JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vector */", + "vector-action-toggle-sidebar": "Live e mitte 'a barre laterale", + "vector-language-button-aria-label": "Vèje a 'na vôsce jndr'à 'n'otra lènghe. Desponibbele jndr'à {{PLURAL:$1|$1 lènghe}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lènghe}}", + "vector-language-variant-switcher-label": "Cange 'a variande d'a lènghe", + "vector-action-addsection": "Aggiunge 'na discussiona", + "vector-action-delete": "Scangille", + "vector-action-move": "Spuèste", + "vector-action-protect": "Protegge", + "vector-action-undelete": "Repristine", + "vector-action-unprotect": "Cange 'a protezione", + "vector-view-create": "Ccreje", + "vector-view-edit": "Cange", + "vector-view-history": "Vide 'u cunde", + "vector-view-view": "Ligge", + "vector-view-viewsource": "Vide 'u sorgende", + "vector-jumptonavigation": "Zumbe sus 'a navigazzione", + "vector-jumptosearch": "Zumbe sus 'a recerche", + "vector-jumptocontent": "Zumbe a 'u condenute", + "vector-more-actions": "De cchiù", + "vector-search-loader": "Stoche a careche le suggereminde de recerche", + "vector-searchsuggest-containing": "Cirche le pàggene ca tènene $1", + "vector-intro-page": "Help:'Ndroduzione", + "vector-anon-user-menu-pages": "Pàggene pe le cangiature non trasute", + "vector-anon-user-menu-pages-learn": "'mbare de cchiù", + "vector-anon-user-menu-pages-label": "'Mbare de cchiù sus a le cangiaminde", + "vector-main-menu-tooltip": "Menu prengepàle", + "tooltip-vector-anon-user-menu-title": "Cchiù opziune" +} diff --git a/Vector/i18n/rsk.json b/Vector/i18n/rsk.json new file mode 100644 index 0000000..0deda00 --- /dev/null +++ b/Vector/i18n/rsk.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Keresturec", + "Vlad5250" + ] + }, + "vector-skin-desc": "Понука 2 Векторски теми:\n* 2011 - Сучасна верзия Монобука зоз швижим випатрунком и з велїма хасновитима злєпшанями.\n* 2022 - Нови Вектор направени у рамикох проєкта [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Хаснуй старшу векторску тему", + "prefs-vector-enable-vector-1-help": "У наиходзацих пар рокох будземе поступнє ажурировац векторску тему. Виберце опцию понад же бисце ше врацели на старши випатрунок теми (так як вона була у децембре 2019). [[mw:Reading/Web/Desktop_Improvements|Детальнєйше о ажурированьох]]", + "vector-opt-out": "Прейдзце на старши випатрунок", + "vector-opt-out-tooltip": "Пременьце штелованя же бисце ше врацели на стари випатрунок теми (старша векторска)", + "vector-action-toggle-sidebar": "Прикаж/скри бочни панел", + "vector-languages": "Язики", + "vector-language-button-aria-label": "Прейдзце на статю на другим язику. Доступна є на {{PLURAL:$1|$1 язику|$1 язикох}}", + "vector-language-button-label": "{{PLURAL:$1|$1 язик|$1 язики}}", + "vector-no-language-button-label": "Додай язики", + "vector-no-language-button-aria-label": "Тота статя еґзистує лєм на тим язику. Додайце статю за други язики.", + "vector-language-redirect-to-top": "Язични вязи ше находза на верху бока попри наслова статї. [[#p-lang-btn|Идзце на верх]].", + "vector-language-variant-switcher-label": "Пременїц вариянту язика", + "vector-action-addsection": "Додай тему", + "vector-action-delete": "Посцерай", + "vector-action-move": "Пременовац", + "vector-action-protect": "Защициц", + "vector-action-undelete": "Обновиц", + "vector-action-unprotect": "Премень защиту", + "vector-view-create": "Витвориц", + "vector-view-edit": "Ушориц", + "vector-view-history": "Опать историю", + "vector-view-view": "Читай", + "vector-view-viewsource": "Опатриц жридлови код", + "vector-jumptonavigation": "Прейдз на навиґацию", + "vector-jumptosearch": "Прейдз на глєданє", + "vector-jumptocontent": "Прейдз на змист", + "vector-more-actions": "Вецей", + "vector-search-loader": "Учитуєм предклади з глєданя", + "vector-searchsuggest-containing": "Найдз боки хтори содержа $1", + "vector-intro-page": "Help:Увод", + "vector-toc-label": "Змист", + "vector-toc-beginning": "Початок", + "vector-toc-toggle-button-label": "Уключиц/Виключиц пододзельок $1", + "vector-anon-user-menu-pages": "Боки за одявених редакторох", + "vector-anon-user-menu-pages-learn": "дознайце вецей", + "vector-anon-user-menu-pages-label": "Дознай вецей о ушорйованю", + "vector-main-menu-tooltip": "Главни мени", + "vector-toc-menu-tooltip": "Змист", + "vector-toc-collapsible-button-label": "Прикаж/скри змист", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Главни мени", + "vector-limited-width-toggle": "Уключце огранїчену ширину змисту", + "vector-page-tools-label": "Алатки", + "vector-page-tools-general-label": "Обще", + "vector-page-tools-actions-label": "Акциї", + "vector-pin-element-label": "премесциц на бочни панел", + "vector-unpin-element-label": "скриц", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Дискусия]]", + "tooltip-vector-anon-user-menu-title": "Вецей опциї", + "vector-prefs-limited-width": "Уключиц режим огранїченей ширини", + "vector-prefs-limited-width-help": "Уключце режим огранїченей ширини за олєгчане читанє", + "empty-language-selector-body": "Змист бока нє потримани на других язикох" +} diff --git a/Vector/i18n/ru.json b/Vector/i18n/ru.json new file mode 100644 index 0000000..c666620 --- /dev/null +++ b/Vector/i18n/ru.json @@ -0,0 +1,86 @@ +{ + "@metadata": { + "authors": [ + "Alexander Yukal", + "Amire80", + "Ignatus", + "Iniquity", + "Jack who built the house", + "JenVan", + "Kaganer", + "Kareyac", + "Megakott", + "Nemo bis", + "Okras", + "Ole Yves", + "Pacha Tchernof", + "Serhio Magpie", + "Stjn", + "Sunpriat", + "Tanzun", + "Thothsum", + "Александр Сигачёв", + "Adam-Yourist", + "BerryAVGN", + "З. ӘЙЛЕ" + ] + }, + "skinname-vector": "Векторная, устаревшая (2010)", + "skinname-vector-2022": "Векторная (2022)", + "vector-specialversion-name": "Векторная", + "vector-skin-desc": "Предоставляет две векторные темы оформления:\n* 2011: ''Современная'' — версия MonoBook с обновлённым оформлением и многими улучшениями пользовательского опыта.\n* 2022: ''Векторная'' — созданная в рамках проекта Фонда Викимедиа «[[mw:Desktop Improvements]]».", + "prefs-vector-enable-vector-1-label": "Использовать Векторную тему оформления прежней версии", + "prefs-vector-enable-vector-1-help": "В течение следующих нескольких лет мы постепенно будем обновлять «Векторную» тему оформления. Прежняя версия темы оформления «Векторная» позволит вам видеть старую версию «Векторной» (по состоянию на декабрь 2019 года). Чтобы узнать больше об обновлениях, перейдите на [[mw:Reading/Web/Desktop_Improvements|страницу нашего проекта]].", + "vector-opt-out": "Элекке күренешенә кире ҡайтырға", + "vector-opt-out-tooltip": "Измените настройки, чтобы вернуться к старому виду темы оформления (Устаревшая Векторная)", + "vector.css": "/* Весь CSS будет отсюда будет загружен пользователям темы оформления «Векторная» */", + "vector.js": "/* Любой код JavaScript отсюда будет загружаться пользователям темы оформления «Векторная» */", + "vector-action-toggle-sidebar": "Переключить боковую панель", + "vector-languages": "Языки", + "vector-language-button-aria-label": "Перейти к статье на другом языке. Доступно на {{PLURAL:$1|$1 языке|$1 языках}}", + "vector-language-button-label": "{{PLURAL:$1|$1 язык|$1 языка|$1 языков}}", + "vector-no-language-button-label": "Добавить языки", + "vector-no-language-button-aria-label": "Данная статья существует только на этом языке. Добавьте статью для других языков", + "vector-language-redirect-to-top": "На этом сайте языковые ссылки находятся в начале страницы, напротив заголовка статьи. [[#p-lang-btn|Перейти к началу]].", + "vector-language-variant-switcher-label": "Изменить вариант языка", + "vector-action-addsection": "Добавить тему", + "vector-action-delete": "Удалить", + "vector-action-move": "Переименовать", + "vector-action-protect": "Защитить", + "vector-action-undelete": "Восстановить", + "vector-action-unprotect": "Изменить защиту", + "vector-view-create": "Создать", + "vector-view-edit": "Править", + "vector-view-history": "История", + "vector-view-view": "Читать", + "vector-view-viewsource": "Просмотр кода", + "vector-jumptonavigation": "Перейти к навигации", + "vector-jumptosearch": "Перейти к поиску", + "vector-jumptocontent": "Перейти к содержанию", + "vector-more-actions": "Ещё", + "vector-search-loader": "Загружаются поисковые предложения", + "vector-searchsuggest-containing": "Поиск страниц, содержащих $1", + "vector-intro-page": "Help:Введение", + "vector-toc-label": "Содержание", + "vector-toc-beginning": "Начало", + "vector-toc-toggle-button-label": "Отобразить/Скрыть подраздел $1", + "vector-anon-user-menu-pages": "Страницы для неавторизованных редакторов", + "vector-anon-user-menu-pages-learn": "узнать больше", + "vector-anon-user-menu-pages-label": "Подробнее о редактировании", + "vector-main-menu-tooltip": "Главное меню", + "vector-toc-menu-tooltip": "Содержание", + "vector-toc-collapsible-button-label": "Отобразить/Скрыть содержание", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Главное меню", + "vector-limited-width-toggle": "Отобразить/Скрыть ограниченную ширину содержимого", + "vector-page-tools-label": "Инструменты", + "vector-page-tools-general-label": "Общие", + "vector-page-tools-actions-label": "Действия", + "vector-pin-element-label": "переместить в боковую панель", + "vector-unpin-element-label": "скрыть", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Обсуждение]]", + "tooltip-vector-anon-user-menu-title": "Больше возможностей", + "vector-prefs-limited-width": "Включить режим ограниченной ширины", + "vector-prefs-limited-width-help": "Включите режим ограниченной ширины для улучшения читательского опыта.", + "empty-language-selector-body": "Содержимое страницы недоступно на других языках." +} diff --git a/Vector/i18n/rue.json b/Vector/i18n/rue.json new file mode 100644 index 0000000..286d31c --- /dev/null +++ b/Vector/i18n/rue.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Gazeb", + "KHMELNYTSKYIA", + "Tkalyn" + ] + }, + "vector-action-addsection": "Придати тему", + "vector-action-delete": "Вымазати", + "vector-action-move": "Переменовати", + "vector-action-protect": "Всокотити", + "vector-action-undelete": "Обновити", + "vector-action-unprotect": "Змінити замок", + "vector-view-create": "Створити", + "vector-view-edit": "Едітовати", + "vector-view-history": "Видїти історію", + "vector-view-view": "Чітати", + "vector-view-viewsource": "Видїти код", + "vector-more-actions": "Веце" +} diff --git a/Vector/i18n/rup.json b/Vector/i18n/rup.json new file mode 100644 index 0000000..12f9446 --- /dev/null +++ b/Vector/i18n/rup.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "D'AroemenenZullenNiVergaan" + ] + }, + "vector-action-addsection": "Dimândari noao", + "vector-view-history": "Vedz isturia" +} diff --git a/Vector/i18n/rut.json b/Vector/i18n/rut.json new file mode 100644 index 0000000..47451d2 --- /dev/null +++ b/Vector/i18n/rut.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Rut" + ] + }, + "vector-languages": "ЧIелбыр", + "vector-language-button-label": "{{PLURAL:$1|$1 чIел|$1 чIелбыр}}", + "vector-no-language-button-label": "ЧIелбыр уу лихъихьин", + "vector-action-addsection": "Яратмиш тема", + "vector-action-delete": "Хъуъ", + "vector-action-move": "ЦIинды дур вын", + "vector-action-protect": "Тебин гьыъын", + "vector-view-create": "Яратмиш", + "vector-view-history": "Тарих", + "vector-more-actions": "Бала", + "vector-searchsuggest-containing": "Мид-кид джарбыр ахтармиш $1", + "vector-toc-label": "Китабад-кьул", + "vector-toc-beginning": "Сифте", + "vector-page-tools-label": "Инструментбыр", + "vector-page-tools-general-label": "Уртахды", + "vector-unpin-element-label": "гиркIа" +} diff --git a/Vector/i18n/rw.json b/Vector/i18n/rw.json new file mode 100644 index 0000000..528eadd --- /dev/null +++ b/Vector/i18n/rw.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "RebecaRwanda", + "Vogone" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ururimi|$1 indimi}}", + "vector-action-addsection": "Ongeramo Ingingo", + "vector-action-move": "Imura", + "vector-view-create": "Tangiza", + "vector-view-edit": "Hindura", + "vector-view-history": "Reba amateka", + "vector-view-view": "Soma", + "vector-more-actions": "Ibindi" +} diff --git a/Vector/i18n/ryu.json b/Vector/i18n/ryu.json new file mode 100644 index 0000000..7cf7d8b --- /dev/null +++ b/Vector/i18n/ryu.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "ChoiChong", + "Kyoww", + "春春眠眠" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1ぬ口}}", + "vector-action-addsection": "話題追加", + "vector-action-delete": "ちゃーすん", + "vector-action-move": "移動", + "vector-action-protect": "保護", + "vector-view-create": "ちゅくゆん", + "vector-view-edit": "直すん", + "vector-view-history": "履歴んーじゅん", + "vector-view-view": "読むん", + "vector-more-actions": "うぬ他", + "vector-searchsuggest-containing": "$1含むページ検索すん" +} diff --git a/Vector/i18n/sa.json b/Vector/i18n/sa.json new file mode 100644 index 0000000..94f97ae --- /dev/null +++ b/Vector/i18n/sa.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "NehalDaveND", + "Shubha" + ] + }, + "vector-action-addsection": "विषयः योज्यताम्", + "vector-action-delete": "अपाक्रियताम्", + "vector-action-move": "शीर्षकं परिवर्त्यताम्", + "vector-action-protect": "संरक्ष्यताम्", + "vector-action-undelete": "अनपाक्रियाम्", + "vector-action-unprotect": "संरक्षणं परिवर्तयतु", + "vector-view-create": "सृज्यताम्", + "vector-view-edit": "सम्पाद्यताम्", + "vector-view-history": "इतिहासः दृश्यताम्", + "vector-view-view": "पठ्यताम्", + "vector-view-viewsource": "स्रोतः दृश्यताम्", + "vector-more-actions": "अधिकम्" +} diff --git a/Vector/i18n/sah.json b/Vector/i18n/sah.json new file mode 100644 index 0000000..90a8dd2 --- /dev/null +++ b/Vector/i18n/sah.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "HalanTul", + "MARKSDNW" + ] + }, + "vector-skin-desc": "Аныгы, саҥардыллыбыт, тупсарыллыбыт MonoBook", + "vector-languages": "Тыллар", + "vector-language-button-label": "{{PLURAL:$1|$1 тыл|$1 тыллар}}", + "vector-no-language-button-label": "Тылы эбии", + "vector-action-addsection": "Тиэмэ эбии", + "vector-action-delete": "Сот", + "vector-action-move": "Аатын уларыт", + "vector-action-protect": "Уларыйбат гын", + "vector-action-undelete": "Төннөр", + "vector-action-unprotect": "Көмүскэлин уларыт", + "vector-view-create": "Ай", + "vector-view-edit": "Уларыт", + "vector-view-history": "Устуоруйатын көрүү", + "vector-view-view": "Ааҕыы", + "vector-view-viewsource": "Бэлиэлэрин көрүү", + "vector-more-actions": "Эбии", + "vector-searchsuggest-containing": "Иһилэригэр $1 баар сирэйдэри көрдөөһүн", + "vector-toc-label": "Иһинээҕитэ", + "vector-toc-beginning": "Саҕаланыы", + "vector-page-tools-label": "Сэп-сэбиргэл", + "vector-page-tools-general-label": "Сүнньүнэн", + "vector-unpin-element-label": "Кистээ" +} diff --git a/Vector/i18n/sat.json b/Vector/i18n/sat.json new file mode 100644 index 0000000..b7e4701 --- /dev/null +++ b/Vector/i18n/sat.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Albinus", + "Amire80", + "Manik Soren", + "Ramjit Tudu", + "Rocky 734", + "Samar88", + "Srabony90" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ᱯᱟᱹᱨᱥᱤ|$1 ᱯᱟᱹᱨᱥᱤ ᱠᱚ}}", + "vector-action-addsection": "ᱥᱟᱛᱚᱢ ᱥᱮᱞᱮᱫ", + "vector-action-delete": "ᱜᱮᱫ ᱜᱤᱰᱤ", + "vector-action-move": "ᱩᱪᱟᱹᱲ", + "vector-action-protect": "ᱨᱩᱠᱷᱤᱭᱟᱹ", + "vector-action-undelete": "ᱵᱟᱝ ᱜᱮᱫ ᱜᱤᱰᱤ", + "vector-action-unprotect": "ᱵᱚᱫᱚᱞ ᱨᱩᱠᱷᱤᱭᱟᱹ", + "vector-view-create": "ᱛᱮᱭᱟᱨ", + "vector-view-edit": "ᱥᱟᱯᱲᱟᱣ", + "vector-view-history": "ᱱᱟᱜᱟᱢ ᱧᱮᱞᱢᱮ", + "vector-view-view": "ᱯᱟᱲᱦᱟᱣᱢᱮ", + "vector-view-viewsource": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞᱢᱮ", + "vector-more-actions": "ᱵᱟᱹᱲᱛᱤ" +} diff --git a/Vector/i18n/saz.json b/Vector/i18n/saz.json new file mode 100644 index 0000000..a3a6ded --- /dev/null +++ b/Vector/i18n/saz.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "MooRePrabu" + ] + }, + "vector-view-view": "ꢗꢾꢮ꣄ꢣꢶ" +} diff --git a/Vector/i18n/sc.json b/Vector/i18n/sc.json new file mode 100644 index 0000000..c14949f --- /dev/null +++ b/Vector/i18n/sc.json @@ -0,0 +1,32 @@ +{ + "@metadata": { + "authors": [ + "Andria", + "L2212", + "Marzedu", + "Taxandru", + "Uharteko", + "Via maxima" + ] + }, + "vector-languages": "Limbas", + "vector-language-button-label": "{{PLURAL:$1|$1 limba|$1 limbas}}", + "vector-no-language-button-label": "Annanghe limbas", + "vector-action-addsection": "Agiunghe cuntierra", + "vector-action-delete": "Burra", + "vector-action-move": "Move", + "vector-action-protect": "Barda", + "vector-action-undelete": "Recùpera", + "vector-view-create": "Crea", + "vector-view-edit": "Modìfica", + "vector-view-history": "Càstia istòria", + "vector-view-view": "Leghe", + "vector-view-viewsource": "Càstia mitza", + "vector-more-actions": "Prus", + "vector-searchsuggest-containing": "Chirca pàginas chi cuntèngiant $1", + "vector-toc-label": "Ìnditze", + "vector-toc-beginning": "Incumintzu", + "vector-page-tools-label": "Ainas", + "vector-page-tools-general-label": "Generale", + "vector-unpin-element-label": "cua" +} diff --git a/Vector/i18n/scn.json b/Vector/i18n/scn.json new file mode 100644 index 0000000..4e47224 --- /dev/null +++ b/Vector/i18n/scn.json @@ -0,0 +1,39 @@ +{ + "@metadata": { + "authors": [ + "Ajeje Brazorf", + "Gmelfi", + "Melos", + "Pippinu", + "Sarvaturi" + ] + }, + "vector-skin-desc": "Virsioni muderna di MonoBook cu n'aspettu novu e tanti migghiuramenti nta l'usabbilità", + "vector-languages": "Lingui", + "vector-language-button-label": "{{PLURAL:$1|$1 lingua|$1 lingui}}", + "vector-no-language-button-label": "Agghiunci lingui", + "vector-action-addsection": "Agghiunci n'argumentu", + "vector-action-delete": "Cancella", + "vector-action-move": "Sposta", + "vector-action-protect": "Pruteggi", + "vector-action-undelete": "Annulla la cancillazzioni", + "vector-action-unprotect": "Cancia la prutizzioni", + "vector-view-create": "Crea", + "vector-view-edit": "Cancia", + "vector-view-history": "Talìa la crunuluggìa", + "vector-view-view": "Leggi", + "vector-view-viewsource": "Talìa la surgenti", + "vector-more-actions": "Àutri cosi", + "vector-searchsuggest-containing": "Arricerca li pàggini ca cuntènnunu$1", + "vector-intro-page": "Help:Ntroduzzioni", + "vector-toc-label": "Ìnnici", + "vector-anon-user-menu-pages-learn": "àutri nfurmazzioni", + "vector-main-menu-tooltip": "Menu principali", + "vector-site-nav-label": "Situ", + "vector-main-menu-label": "Menu principali", + "vector-page-tools-label": "Strummenta", + "vector-page-tools-general-label": "Ginirali", + "vector-page-tools-actions-label": "Azzioni", + "vector-unpin-element-label": "ammuccia", + "tooltip-vector-anon-user-menu-title": "Àutri opzioni" +} diff --git a/Vector/i18n/sco.json b/Vector/i18n/sco.json new file mode 100644 index 0000000..25ae796 --- /dev/null +++ b/Vector/i18n/sco.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "Aursani", + "Avicennasis", + "John Reid", + "Macofe", + "Omnipaedista", + "C1614" + ] + }, + "vector-skin-desc": "Modern version o MonoBook wi ae fresh luik n monie uisabeelitie impruivments", + "vector-languages": "Leids", + "vector-no-language-button-label": "Eik leids", + "vector-action-addsection": "Eik topic", + "vector-action-delete": "Delyte", + "vector-action-move": "Muiv", + "vector-action-protect": "Fend", + "vector-action-undelete": "Ondelyte", + "vector-action-unprotect": "Chynge protection", + "vector-view-create": "Ceaut", + "vector-view-edit": "Eedit", + "vector-view-history": "See histerie", + "vector-view-view": "Read", + "vector-view-viewsource": "See Soorce", + "vector-more-actions": "Mair", + "vector-searchsuggest-containing": "Sairch fur pages containin $1", + "vector-page-tools-label": "Tuils", + "vector-page-tools-general-label": "General", + "vector-unpin-element-label": "Dern" +} diff --git a/Vector/i18n/sd.json b/Vector/i18n/sd.json new file mode 100644 index 0000000..e962c16 --- /dev/null +++ b/Vector/i18n/sd.json @@ -0,0 +1,60 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Aursani", + "Mehtab ahmed", + "Sindhu", + "Tweety" + ] + }, + "skinname-vector": "ويڪٽر ليگيسي (2010ع)", + "skinname-vector-2022": "ويڪٽر (2022ع)", + "vector-specialversion-name": "ويڪٽر", + "vector-skin-desc": "2 ويڪٽر ظاھريتون مھيا ڪري ٿو:\n* 2011ع - تازي ڏيک ۽ گهڻين ئي استعمال جي بھتريِن سان مونوبڪ جو ماڊرن ورزن.\n* 2022ع - ڊبليو.ايم.ايف [[mw:Desktop Improvements]] رٿا جي حصي طور اڏيل ويڪٽر.", + "prefs-vector-enable-vector-1-label": "ويڪٽر ليگيسي استعمال ڪريو", + "prefs-vector-enable-vector-1-help": "ايندڙ ڪجهہ سالن دوران، اسان ويڪٽر ظاھريت ۾ آھستي آھستي تجديد ڪنداسين. ليگيسي ويڪٽر توھان کي ويڪٽر جي پراڻي ورزن ڏسڻ جي اجازت ڏيندو (ڊسمبر 2019ع مطابق). اسان جي جدتن بابت وڌيڪ ڄاڻڻ لاءِ، اسان جي [[mw:Reading/Web/Desktop_Improvements|رٿا صفحي]] تي وڃو.", + "vector-opt-out": "پراڻي ڏيک ڏانھن وڃو", + "vector-opt-out-tooltip": "پراڻي ظاھري ڏيک (ليگيسي ويڪٽر) ڏانھن واپس وڃڻ لاءِ پنھنجيون ترتيبون بدلايو", + "vector.css": "/* سڀ سي.ايس.ايس ويڪٽر ظاھريت جي واپرائيندڙ لاءِ ھتي لاٿي ويندي */", + "vector.js": "/* سڀ جاوااسڪرپٽ ويڪٽر ظاھريت جي واپرائيندڙ لاءِ ھتي لاٿي ويندي */", + "vector-action-toggle-sidebar": "ٽوگل سائيڊبار", + "vector-languages": "ٻوليون", + "vector-language-button-aria-label": "ڪنھن مضمون ڏانھن ڪنھن ٻي ٻوليءَ ۾ وڃو. {{PLURAL:$1|$1 ٻوليءَ|$1 ٻولين ۾}} موجود آھي", + "vector-language-button-label": "{{PLURAL:$1|$1 ٻولي|$1 ٻوليون}}", + "vector-no-language-button-label": "ٻوليون شامل ڪريو", + "vector-language-redirect-to-top": "ھن {{SITENAME}} تي ٻوليءَ جا ڳنڍڻا صفحي جي مٿان آھن، مضمون جي عنوان کان اڳتي. [[#p-lang-btn|مٿي وڃو]].", + "vector-language-variant-switcher-label": "ٻوليءَ جو ويرينٽ بدلايو", + "vector-action-addsection": "موضوع شامل ڪريو", + "vector-action-delete": "ڊاھيو", + "vector-action-move": "چوريو", + "vector-action-protect": "تحفظيو", + "vector-action-undelete": "اڻ‌ڊاهيو", + "vector-action-unprotect": "تحفظ بدلايو", + "vector-view-create": "سرجيو", + "vector-view-edit": "سنواريو", + "vector-view-history": "سوانح ڏسو", + "vector-view-view": "پڙھو", + "vector-view-viewsource": "ذريعو ڏسو", + "vector-jumptonavigation": "نيويگيشن ڏانھن ٽپ ڏيو", + "vector-jumptosearch": "ڳولا ڏانھن هلو", + "vector-jumptocontent": "مواد ڏانھن ٽپ ڏيو", + "vector-more-actions": "وڌيڪ", + "vector-search-loader": "ڳولا صلاحون لاھيندي", + "vector-searchsuggest-containing": "اھي صفحا ڳوليو جن ۾ $1 آھي", + "vector-intro-page": "Help:تعارف", + "vector-toc-label": "فھرست", + "vector-toc-beginning": "شروعات", + "vector-toc-toggle-button-label": "سبسيڪشن $1 کي ٽوگل ڪريو", + "vector-anon-user-menu-pages": "ٻاھر نڪتل سنواريندڙن لاءِ صفحا", + "vector-anon-user-menu-pages-learn": "وڌيڪ ڄاڻيو", + "vector-anon-user-menu-pages-label": "سنوارڻ بابت وڌيڪ ڄاڻيو", + "vector-main-menu-tooltip": "مک مينيو", + "vector-main-menu-label": "مک مينيو", + "vector-page-tools-label": "اوزارَ", + "vector-page-tools-general-label": "عام", + "vector-page-tools-actions-label": "عمل", + "vector-pin-element-label": "سائڊبار ڏانھن چوريو", + "vector-unpin-element-label": "لڪايو", + "tooltip-vector-anon-user-menu-title": "وڌيڪ چارا" +} diff --git a/Vector/i18n/sdc.json b/Vector/i18n/sdc.json new file mode 100644 index 0000000..5f3ebbd --- /dev/null +++ b/Vector/i18n/sdc.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "F Samaritani", + "Felis", + "Jun Misugi" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 linga|$1 linghi}}", + "vector-action-addsection": "Aggiungì oggettu", + "vector-action-delete": "Canzella", + "vector-action-move": "Ippustha", + "vector-action-protect": "Pruteggì", + "vector-view-create": "Cria", + "vector-view-edit": "Mudifigga", + "vector-view-history": "Vèdi isthòria", + "vector-view-view": "Leggi", + "vector-view-viewsource": "Vèdi fonti", + "vector-more-actions": "Più", + "vector-toc-label": "Ìndizi" +} diff --git a/Vector/i18n/sdh.json b/Vector/i18n/sdh.json new file mode 100644 index 0000000..0c5f5a7 --- /dev/null +++ b/Vector/i18n/sdh.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Paraw2" + ] + }, + "vector-action-addsection": "بابەت تازە بدە سەری", + "vector-action-delete": "بسڕەوە", + "vector-action-move": "جیوەجی بکە", + "vector-action-protect": "بپیەرێزەێ", + "vector-view-create": "درسکردن", + "vector-view-edit": "وێراشتەێ بکە", + "vector-view-history": "دیرۆکەگەی بۊن", + "vector-view-view": "بخوەنە", + "vector-view-viewsource": "سەرچاوەگەێ بۊن", + "vector-more-actions": "فرەتر" +} diff --git a/Vector/i18n/se.json b/Vector/i18n/se.json new file mode 100644 index 0000000..e730432 --- /dev/null +++ b/Vector/i18n/se.json @@ -0,0 +1,64 @@ +{ + "@metadata": { + "authors": [ + "Gálaniitoluodda", + "Jeblad", + "Kimberli Mäkäräinen (WMNO)", + "Trondtr", + "Tynnoel", + "Lea-Christine Sara" + ] + }, + "vector-skin-desc": "Addá 2 Vector hámi:\n* 2011 - Ođđaáigásaš veršuvdna Monobookas, ođđa hápmi ja ollu buoriduvvon bealit.\n* 2022 - Vector mii lea WMFas huksejuvvon [[mw:Desktop Improvements]] -prošeavtta áigge.", + "prefs-vector-enable-vector-1-label": "Ane klassihkalaš Vectora", + "prefs-vector-enable-vector-1-help": "Daid boahttevaš jagiid mii áigot ceahkkálaga ođasmahttit Vector hámi. Klassihkalaš Vector čájeha dutnje dan boares Vector veršuvnna (juovlamánnu 2019) Deaddil [[mw:Reading/Web/Desktop_Improvements|project page]] vai oahpat eambbo.", + "vector-opt-out": "Molsso ovdalaš hápmái ", + "vector-opt-out-tooltip": "Lonut iežat ásahusaid molsun dihte boares hápmái (klassihkalaš Vector) ", + "vector-action-toggle-sidebar": "Čájet/čiega siidofealta", + "vector-languages": "Gielat", + "vector-language-button-aria-label": "Geahča artihkkala eará gillii. Olámuttos {{PLURAL:$1|$1 gillii}}", + "vector-language-button-label": "{{PLURAL:$1|$1 giella|$1 giela}}", + "vector-no-language-button-label": "Lasit gielaid", + "vector-no-language-button-aria-label": "Dát artihkkal gávdno dušše dán gillii. Ráhkat artihkkala eará gielaide.", + "vector-language-variant-switcher-label": "Lonut giellavariánta", + "vector-action-addsection": "Lasit fáttá", + "vector-action-delete": "Sihko", + "vector-action-move": "Sirdde", + "vector-action-protect": "Suodjal", + "vector-action-undelete": "Máhcat", + "vector-action-unprotect": "Rievdat suodjaleami", + "vector-view-create": "Álggat", + "vector-view-edit": "Rievdat", + "vector-view-history": "Geahča historjjá", + "vector-view-view": "Loga", + "vector-view-viewsource": "Geahča gáldokoda", + "vector-jumptonavigation": "Njuikes navigašuvdnii", + "vector-jumptosearch": "Njuikes ohcamii", + "vector-jumptocontent": "Njuikes sisdollui", + "vector-more-actions": "Eanet", + "vector-search-loader": "Viežžamin ohcanevttohusaid", + "vector-searchsuggest-containing": "Oza siidduid main lea $1", + "vector-intro-page": "Help:Oahpisdeapmi", + "vector-toc-label": "Sisdoallu", + "vector-toc-beginning": "Álgu", + "vector-toc-toggle-button-label": "Čájet/čiega vuolitsekšuvnna $1", + "vector-anon-user-menu-pages": "Siiddut olggoščálihuvvon rievdadeddjiide", + "vector-anon-user-menu-pages-learn": "oahpa eambbo", + "vector-anon-user-menu-pages-label": "Oahpa eambbo rievdadeami birra", + "vector-main-menu-tooltip": "Váldofállu", + "vector-toc-menu-tooltip": "Sisdoallologahallan", + "vector-toc-collapsible-button-label": "Čájet dahje čiega sisdoallologahallama", + "vector-site-nav-label": "Neahttasiidu", + "vector-main-menu-label": "Váldofállu", + "vector-limited-width-toggle": "Čájet/čiega ráddjejuvvon viidodaga sisdoalus", + "vector-page-tools-label": "Reaiddut", + "vector-page-tools-general-label": "Obbalaš", + "vector-page-tools-actions-label": "Doaimmat", + "vector-pin-element-label": "sirdde siidofeltii", + "vector-unpin-element-label": "čiega", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Ságastallan]]", + "tooltip-vector-anon-user-menu-title": "Eambbo alternatiivvat", + "vector-prefs-limited-width": "Álggat modusa mas lea ráddjejuvvon govdodat", + "vector-prefs-limited-width-help": "Álggat modusa mas lea ráddjejuvvon govdodat vai buorrána lohkanvásáhus.", + "empty-language-selector-body": "Siidosisdoallu ii dorjo eará gielaide." +} diff --git a/Vector/i18n/ses.json b/Vector/i18n/ses.json new file mode 100644 index 0000000..f51ae81 --- /dev/null +++ b/Vector/i18n/ses.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Songhay" + ] + }, + "vector-action-addsection": "Furari tonton", + "vector-action-delete": "Tuusu", + "vector-action-move": "Ganandi", + "vector-action-protect": "Jejebu", + "vector-view-create": "Tee", + "vector-view-edit": "Barmay", + "vector-view-history": "Taarikoo guna", + "vector-view-view": "Caw", + "vector-more-actions": "Ka tonton" +} diff --git a/Vector/i18n/sg.json b/Vector/i18n/sg.json new file mode 100644 index 0000000..2f65834 --- /dev/null +++ b/Vector/i18n/sg.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Mdkidiri" + ] + }, + "vector-action-addsection": "Zîa mbênî lilö daä", + "vector-action-delete": "Lungûla", + "vector-action-move": "Sanzêe ïrï", + "vector-action-protect": "Funga", + "vector-action-undelete": "Kîri na nî", + "vector-action-unprotect": "Sanzêe fungä", + "vector-view-create": "Seka", + "vector-view-edit": "Sepe", + "vector-view-history": "Tanda mbai nî", + "vector-view-view": "Dîko", + "vector-view-viewsource": "Fa ligbî nî" +} diff --git a/Vector/i18n/sgs.json b/Vector/i18n/sgs.json new file mode 100644 index 0000000..cd369ee --- /dev/null +++ b/Vector/i18n/sgs.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Hugo.arg" + ] + }, + "vector-action-addsection": "Pridietė ožvardėnėma", + "vector-action-delete": "Trintė", + "vector-action-move": "Parvadintė", + "vector-action-protect": "Ožrakintė", + "vector-action-undelete": "Atkortė", + "vector-action-unprotect": "Keistė apsauga", + "vector-view-create": "Padėrbtė", + "vector-view-edit": "Taisītė", + "vector-view-history": "Istuorėjė", + "vector-view-view": "Skaitītė", + "vector-view-viewsource": "Veizietė kuoda", + "vector-more-actions": "Dā" +} diff --git a/Vector/i18n/sh-latn.json b/Vector/i18n/sh-latn.json new file mode 100644 index 0000000..f4a2b14 --- /dev/null +++ b/Vector/i18n/sh-latn.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "BadDog", + "Conquistador", + "OC Ripper", + "Srdjan m", + "Srđan", + "Vlad5250", + "Winston Sung" + ] + }, + "vector-skin-desc": "Pruža dvije varijante Vectora:\n* 2011 – Savremena verzija MonoBooka s osvježenim izgledom i mnogim poboljšanjima.\n* 2022 – Vector izrađen kao dio projekta [[mw:Desktop Improvements|Poboljšanja računarskog prikaza]] Fondacije Wikimedia.", + "prefs-vector-enable-vector-1-label": "Koristi stari Vector", + "prefs-vector-enable-vector-1-help": "Kroz narednih nekoliko godina postepeno ćemo ažurirati Vektorsku temu. Njegova stara upotreba pružit će Vam mogućnost da koristite raniju verziju (decembar 2019). Za detalje o ažuriranjima, posjetite našu [[mw:Reading/Web/Desktop_Improvements|stranicu projekta]].", + "vector-opt-out": "Prebaci na stari izgled", + "vector-opt-out-tooltip": "Promijenite postavke da biste vratili stari izgled teme (stari Vector)", + "vector-action-toggle-sidebar": "Prikaži/sakrij bočnu traku", + "vector-languages": "Jezici", + "vector-language-button-aria-label": "Prijedi na druge jezične varijante članka. Dostupno je na {{PLURAL:$1|$1 jeziku|$1 jezika}}", + "vector-language-button-label": "{{PLURAL:$1|$1 jezik|$1 jezika}}", + "vector-no-language-button-label": "Dodaj jezike", + "vector-no-language-button-aria-label": "Ovaj članak postoji samo na ovom jeziku. Dodajte druge jezike", + "vector-language-variant-switcher-label": "Promijeni jezičnu varijantu", + "vector-action-addsection": "Dodaj temu", + "vector-action-delete": "Izbriši", + "vector-action-move": "Premjesti", + "vector-action-protect": "Zaštiti", + "vector-action-undelete": "Vrati", + "vector-action-unprotect": "Promijeni zaštitu", + "vector-view-create": "Napravi", + "vector-view-edit": "Uredi", + "vector-view-history": "Historija", + "vector-view-view": "Prikaži", + "vector-view-viewsource": "Izvorni kod", + "vector-jumptonavigation": "Prijeđi na navigaciju", + "vector-jumptosearch": "Prijeđi na pretragu", + "vector-jumptocontent": "Prijeđi na sadržaj", + "vector-more-actions": "Više", + "vector-search-loader": "Učitavanje prijedloga pretrage", + "vector-searchsuggest-containing": "Pretraži stranice koje sadrže $1", + "vector-toc-label": "Sadržaj", + "vector-toc-beginning": "Početak", + "vector-anon-user-menu-pages": "Stranice za neprijavljene suradnike", + "vector-anon-user-menu-pages-learn": "detaljnije", + "vector-anon-user-menu-pages-label": "Saznajte više o uređivanju", + "vector-main-menu-tooltip": "Glavni meni", + "vector-toc-menu-tooltip": "Sadržaj", + "vector-toc-collapsible-button-label": "Prikaži/sakrij sadržaj", + "vector-site-nav-label": "Sajt", + "vector-main-menu-label": "Glavni meni", + "vector-limited-width-toggle": "Uključi/isključi ograničenu širinu sadržaja", + "vector-page-tools-label": "Alati", + "vector-page-tools-general-label": "Opšte", + "vector-page-tools-actions-label": "Radnje", + "vector-pin-element-label": "premjesti na bočnu traku", + "vector-unpin-element-label": "sakrij", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Razgovor]]", + "tooltip-vector-anon-user-menu-title": "Više mogućnosti", + "vector-prefs-limited-width": "Ograniči širinu teksta", + "vector-prefs-limited-width-help": "Omogući režim ograničene širine za poboljšano čitanje.", + "empty-language-selector-body": "Sadržaj stranice nije podržan na drugim jezicima." +} diff --git a/Vector/i18n/sh.json b/Vector/i18n/sh.json new file mode 100644 index 0000000..03da508 --- /dev/null +++ b/Vector/i18n/sh.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "BadDog", + "Conquistador", + "OC Ripper", + "Srdjan m", + "Srđan", + "Vlad5250" + ] + }, + "vector-skin-desc": "Pruža dvije varijante Vectora:\n* 2011 – Savremena verzija MonoBooka s osvježenim izgledom i mnogim poboljšanjima.\n* 2022 – Vector izrađen kao dio projekta [[mw:Desktop Improvements|Poboljšanja računarskog prikaza]] Fondacije Wikimedia.", + "prefs-vector-enable-vector-1-label": "Koristi stari Vector", + "vector-opt-out": "Prebaci na stari izgled", + "vector-opt-out-tooltip": "Promijenite postavke da biste vratili stari izgled teme (stari Vector)", + "vector-action-toggle-sidebar": "Prikaži/sakrij bočnu traku", + "vector-languages": "Jezici", + "vector-language-button-aria-label": "Prijedi na druge jezične varijante članka. Dostupno je na {{PLURAL:$1|$1 jeziku|$1 jezika}}", + "vector-language-button-label": "{{PLURAL:$1|$1 jezik|$1 jezika}}", + "vector-no-language-button-label": "Dodaj jezike", + "vector-no-language-button-aria-label": "Ovaj članak postoji samo na ovom jeziku. Dodajte druge jezike", + "vector-language-redirect-to-top": "Linkovi na druge jezike nalaze se u gornjem desnom uglu stranice, pored naslova članka. [[#p-lang-btn|Idi na vrh]].", + "vector-language-variant-switcher-label": "Promijeni jezičnu varijantu", + "vector-action-addsection": "Dodaj temu", + "vector-action-delete": "Izbriši", + "vector-action-move": "Premjesti", + "vector-action-protect": "Zaštiti", + "vector-action-undelete": "Vrati", + "vector-action-unprotect": "Promijeni zaštitu", + "vector-view-create": "Napravi", + "vector-view-edit": "Uredi", + "vector-view-history": "Historija", + "vector-view-view": "Prikaži", + "vector-view-viewsource": "Izvorni kod", + "vector-jumptonavigation": "Prijeđi na navigaciju", + "vector-jumptosearch": "Prijeđi na pretragu", + "vector-jumptocontent": "Prijeđi na sadržaj", + "vector-more-actions": "Više", + "vector-search-loader": "Učitavanje prijedloga pretrage", + "vector-searchsuggest-containing": "Pretraži stranice koje sadrže $1", + "vector-toc-label": "Sadržaj", + "vector-toc-beginning": "Početak", + "vector-anon-user-menu-pages": "Stranice za neprijavljene suradnike", + "vector-anon-user-menu-pages-learn": "detaljnije", + "vector-anon-user-menu-pages-label": "Saznajte više o uređivanju", + "vector-main-menu-tooltip": "Glavni meni", + "vector-toc-menu-tooltip": "Sadržaj", + "vector-toc-collapsible-button-label": "Prikaži/sakrij sadržaj", + "vector-site-nav-label": "Sajt", + "vector-main-menu-label": "Glavni meni", + "vector-page-tools-label": "Alati", + "vector-page-tools-general-label": "Opšte", + "vector-page-tools-actions-label": "Radnje", + "vector-unpin-element-label": "sakrij", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Razgovor]]", + "tooltip-vector-anon-user-menu-title": "Više mogućnosti", + "vector-prefs-limited-width": "Ograniči širinu teksta", + "vector-prefs-limited-width-help": "Omogući režim ograničene širine za poboljšano čitanje." +} diff --git a/Vector/i18n/shi.json b/Vector/i18n/shi.json new file mode 100644 index 0000000..d76446f --- /dev/null +++ b/Vector/i18n/shi.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Amara-Amaziɣ", + "Ayour2002", + "Dalinanir", + "Lhoussine AIT TAYFST" + ] + }, + "vector-languages": "Tutlayin", + "vector-language-button-label": "{{PLURAL:$1|$1 tutlayt|$1 tutlayin}}", + "vector-action-addsection": "Rnu asntl", + "vector-action-delete": "Kks", + "vector-action-move": "Smatti", + "vector-action-protect": "Qqil", + "vector-action-undelete": "Rard may mayḥiydn", + "vector-action-unprotect": "ssnfl aḥbu", + "vector-view-create": "Snulfu", + "vector-view-edit": "Snfl", + "vector-view-history": "Ẓr amzruy", + "vector-view-view": "Ɣr", + "vector-view-viewsource": "Ẓr aɣbalu", + "vector-more-actions": "Uggar", + "vector-page-tools-label": "Imassn", + "vector-unpin-element-label": "ssntl" +} diff --git a/Vector/i18n/shn.json b/Vector/i18n/shn.json new file mode 100644 index 0000000..f241831 --- /dev/null +++ b/Vector/i18n/shn.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Saiddzone", + "Saimawnkham" + ] + }, + "vector-opt-out": "လၢႆႈၸူး ၽၢင်ႁၢင်ႈၵဝ်ႇ", + "vector-language-button-label": "{{PLURAL:$1|$1 ၽႃႇသႃႇၵႂၢမ်း}}", + "vector-no-language-button-label": "ထႅမ်သႂ်ႇ ၽႃႇသႃႇ", + "vector-language-redirect-to-top": "တီႈ {{SITENAME}} ဢၼ်ၼႆႉ ဢၼ်ပဵၼ် ႁဵင်းၵွင်ႉ ၽႃႇသႃႇၵႂၢမ်းၼၼ်ႉ မီးဝႆႉတီႈ ပွတ်းၽၢႆႇၼိူဝ်ၼႃႈလိၵ်ႈ ဢၼ်မီးတီႈ တၢင်းတဵဝ်းလဵဝ်ၵၼ်တင်း ႁူဝ်ၶေႃႈ လိၵ်ႈႁွမ်တွမ်ၼၼ်ႉယဝ်ႉ။ [[#p-lang-btn|ၵႂႃႇၸူး ပွတ်းၽၢႆႇၼိူဝ်]]။", + "vector-action-addsection": "ထႅမ်သႂ်ႇ ႁူဝ်ၶေႃႈ", + "vector-action-delete": "မွတ်ႇပႅတ်ႈ", + "vector-action-move": "ၶၢႆႉ", + "vector-action-protect": "ႁေႉၵင်ႈ", + "vector-view-create": "သၢင်ႈ", + "vector-view-edit": "မႄးထတ်း", + "vector-view-history": "တူၺ်းပိုၼ်း", + "vector-view-view": "ဢၢၼ်ႇ", + "vector-view-viewsource": "တူၺ်း ငဝ်ႈငႃႇ", + "vector-more-actions": "ၼမ်လိူဝ်", + "vector-searchsuggest-containing": "ၶူၼ်ႉႁႃ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈ ၸိူဝ်းၶဝ်ႈပႃးဝႆႉ $1" +} diff --git a/Vector/i18n/shy-latn.json b/Vector/i18n/shy-latn.json new file mode 100644 index 0000000..0bcc6d7 --- /dev/null +++ b/Vector/i18n/shy-latn.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Vikoula5" + ] + }, + "vector-action-addsection": "Rnud ameggay", + "vector-action-delete": "Mḥu", + "vector-action-move": "Snifel isem", + "vector-action-protect": "Ḥrez", + "vector-view-create": "Rnu", + "vector-view-edit": "Glef", + "vector-view-history": "Wali amazray", + "vector-view-view": "Ɣer", + "vector-more-actions": "Ugar" +} diff --git a/Vector/i18n/si.json b/Vector/i18n/si.json new file mode 100644 index 0000000..ad85a65 --- /dev/null +++ b/Vector/i18n/si.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Singhalawap", + "Thushara", + "දසනැබළයෝ", + "පසිඳු කාවින්ද", + "සුරනිමල" + ] + }, + "vector-action-addsection": "මාතෘකාවක් එක්කරන්න", + "vector-action-delete": "මකන්න", + "vector-action-move": "ගෙනයන්න", + "vector-action-protect": "ආරක්‍ෂණය", + "vector-action-undelete": "මකාදැමීම අවලංගු කරන්න", + "vector-action-unprotect": "ආරක්ෂණ තත්වය වෙනස් කරන්න", + "vector-view-create": "තනන්න", + "vector-view-edit": "සංස්කරණය කරන්න", + "vector-view-history": "ඉතිහාසය බලන්න", + "vector-view-view": "කියවන්න", + "vector-view-viewsource": "මූලාශ්‍රය නරඹන්න", + "vector-more-actions": "තවත්" +} diff --git a/Vector/i18n/sjd.json b/Vector/i18n/sjd.json new file mode 100644 index 0000000..e07ff47 --- /dev/null +++ b/Vector/i18n/sjd.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Meerrahtar", + "Merrahtar" + ] + }, + "vector-languages": "Кӣл", + "vector-language-button-label": "{{PLURAL:$1|$1 кӣлл|$1 кӣл|$1 кӣллэ}}", + "vector-no-language-button-label": "Лажьхэ кӣлэтҍ", + "vector-action-addsection": "Лажьхэ те̄ма", + "vector-action-delete": "Вэ̄цксэ", + "vector-action-move": "Во̄айхэ нэ̄м", + "vector-action-protect": "Пынне", + "vector-view-create": "Лыһкэ", + "vector-view-edit": "Вуайхэ", + "vector-view-history": "Исторья", + "vector-view-view": "Ло̄гкэ", + "vector-more-actions": "Вя̄л", + "vector-searchsuggest-containing": "О̄дзэ лыстэнҍ, мэ̄йн лӣ $1", + "vector-main-menu-label": "Шурьмусс меню", + "vector-page-tools-label": "Тӯййшэмка̄вьн", + "vector-unpin-element-label": "пе̄ҋҋтэ" +} diff --git a/Vector/i18n/sje.json b/Vector/i18n/sje.json new file mode 100644 index 0000000..614026a --- /dev/null +++ b/Vector/i18n/sje.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Bidumsábme", + "Olve Utne" + ] + }, + "vector-languages": "Giela", + "vector-language-button-label": "{{PLURAL:$1|$1 giella|$1 giela}}", + "vector-no-language-button-label": "Lasedä gielajt", + "vector-action-addsection": "Lasedä ábdnasav", + "vector-action-delete": "Gádodä", + "vector-action-move": "Sirde", + "vector-action-protect": "Várrjalä", + "vector-view-create": "Álge", + "vector-view-edit": "Rävvdadä", + "vector-view-history": "Vuosedä histurjav", + "vector-view-view": "Lågå", + "vector-view-viewsource": "Vuosedä wikitiekstav", + "vector-more-actions": "Ienap", + "vector-searchsuggest-containing": "Åtså belijda májdne lä tjállám $1", + "vector-toc-label": "Sisadno", + "vector-toc-beginning": "Állgo", + "vector-page-tools-label": "Riejdo", + "vector-page-tools-general-label": "Gájjkasatj", + "vector-unpin-element-label": "tjiega" +} diff --git a/Vector/i18n/sk.json b/Vector/i18n/sk.json new file mode 100644 index 0000000..d3e1b0c --- /dev/null +++ b/Vector/i18n/sk.json @@ -0,0 +1,61 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Helix84", + "KuboF", + "Luky001", + "Mikulas1", + "Robert Važan", + "Rudko", + "Sudo77(new)", + "Teslaton", + "Vegetator", + "Yardom78" + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "Poskytuje 2 verzie vzhľadu Vektor:\n* 2011 - Moderná verzia MonoBooku so sviežim vzhľadom a vylepšenou použiteľnosťou.\n* 2022 - Vektor vytvorený ako súčasť projektu Nadácie Wikimedia [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Použiť starý Vector", + "prefs-vector-enable-vector-1-help": "V nasledujúcich rokoch budeme postupne aktualizovať vzhľad Vector. Starý Vector vám umožní používať starú verziu Vectora z decembra 2019. Viac o aktualizáciách sa dozviete na našej [[mw:Reading/Web/Desktop_Improvements|projektovej stránke]].", + "vector-opt-out": "Prepnúť na starý vzhľad", + "vector-opt-out-tooltip": "Zmeniť nastavenie a vrátiť sa späť k starej podobe vzhľadu (starý Vector)", + "vector.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */", + "vector.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */", + "vector-languages": "Jazyky", + "vector-language-button-aria-label": "Prejsť na článok v inom jazyku. Je dostupný v {{PLURAL:$1| $1 jazyku| $1 jazykoch}}", + "vector-language-button-label": "{{PLURAL:$1|$1 jazyk|$1 jazyky|$1 jazykov}}", + "vector-no-language-button-label": "Pridať jazyky", + "vector-no-language-button-aria-label": "Tento článok existuje iba v tomto jazyku. Pridajte článok v iných jazykoch", + "vector-language-redirect-to-top": "Tu na {{GRAMMAR:6sg|{{SITENAME}}}} sú jazykové odkazy vpravo hore vedľa názvu článku. [[#p-lang-btn|Ísť hore]].", + "vector-action-addsection": "Pridať tému", + "vector-action-delete": "Zmazať", + "vector-action-move": "Presunúť", + "vector-action-protect": "Zamknúť", + "vector-action-undelete": "Obnoviť", + "vector-action-unprotect": "Zmeniť stav ochrany", + "vector-view-create": "Vytvoriť", + "vector-view-edit": "Upraviť", + "vector-view-history": "Zobraziť históriu", + "vector-view-view": "Čítať", + "vector-view-viewsource": "Zobraziť kód", + "vector-jumptonavigation": "Prejsť na navigáciu", + "vector-jumptosearch": "Prejsť na vyhľadávanie", + "vector-jumptocontent": "Preskočiť na obsah", + "vector-more-actions": "Viac", + "vector-search-loader": "Načítavajú sa návrhy pre vyhľadávanie", + "vector-searchsuggest-containing": "Hľadať stránky obsahujúce $1", + "vector-toc-label": "Obsah", + "vector-toc-beginning": "Začiatok", + "vector-anon-user-menu-pages": "Stránky pre odhlásených redaktorov", + "vector-anon-user-menu-pages-learn": "zistiť viac", + "vector-anon-user-menu-pages-label": "Viac informácií o editovaní", + "vector-main-menu-tooltip": "Hlavné menu", + "vector-toc-menu-tooltip": "Obsah", + "vector-toc-collapsible-button-label": "Prepnúť obsah", + "vector-page-tools-label": "Nástroje", + "vector-unpin-element-label": "skryť", + "tooltip-vector-anon-user-menu-title": "Ďalšie možnosti", + "vector-prefs-limited-width": "Povoliť režim obmedzenej šírky", + "vector-prefs-limited-width-help": "Povoliť režim obmedzenej šírky pre lepšiu čitateľnosť." +} diff --git a/Vector/i18n/skr-arab.json b/Vector/i18n/skr-arab.json new file mode 100644 index 0000000..e021a11 --- /dev/null +++ b/Vector/i18n/skr-arab.json @@ -0,0 +1,35 @@ +{ + "@metadata": { + "authors": [ + "Saraiki" + ] + }, + "vector-opt-out": "پراݨی شکل صورت تے واپس ون٘ڄو", + "vector-languages": "زباناں", + "vector-language-button-label": "{{PLURAL:$1|$1 زبان|$1 زباناں}}", + "vector-no-language-button-label": "زباناں شامل کرو", + "vector-action-addsection": "نواں موضوع", + "vector-action-delete": "مٹاؤ", + "vector-action-move": "ٹورو", + "vector-action-protect": "حفاظت کرو", + "vector-action-undelete": "اݨ مٹایا کرو", + "vector-action-unprotect": "تحفظ وچ تبدیلی", + "vector-view-create": "بݨاؤ", + "vector-view-edit": "لکھو", + "vector-view-history": "تاریخچہ", + "vector-view-view": "پڑھو", + "vector-view-viewsource": "ماخذ ݙیکھو", + "vector-more-actions": "ٻئے", + "vector-intro-page": "Help:تعارف", + "vector-toc-label": "شامل حصے", + "vector-anon-user-menu-pages-learn": "ٻیا سِکھو", + "vector-main-menu-tooltip": "اصل مینیو", + "vector-toc-menu-tooltip": "تندیر", + "vector-site-nav-label": "سائٹ", + "vector-main-menu-label": "اصل مینیو", + "vector-page-tools-label": "اوزار", + "vector-page-tools-general-label": "عمومی", + "vector-page-tools-actions-label": "عمل", + "vector-unpin-element-label": "لُکاؤ", + "tooltip-vector-anon-user-menu-title": "ٻئے اختیار" +} diff --git a/Vector/i18n/sl.json b/Vector/i18n/sl.json new file mode 100644 index 0000000..d6e526a --- /dev/null +++ b/Vector/i18n/sl.json @@ -0,0 +1,69 @@ +{ + "@metadata": { + "authors": [ + "Dbc334", + "Eleassar", + "Janezdrilc", + "Smihael", + "Yerpo" + ] + }, + "skinname-vector": "Vector (različica 2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "Ponuja dve preobleki Vector:\n* 2011 – sodobna različica MonoBook s svežim videzom in številnimi izboljšavami uporabnosti.\n* 2022 – preobleka Vector, ustvarjena kot del projekta WMF [[mw:Desktop Improvements|Izboljšave namizja]]", + "prefs-vector-enable-vector-1-label": "Uporabljaj stari Vector", + "prefs-vector-enable-vector-1-help": "V naslednjih nekaj letih bomo postopoma posodabljali preobleko Vector. Stari Vector vam omogoča prikaz stare različice preobleke Vector (iz decembra 2019). Več o posodobitvah lahko izveste na naši [[mw:Reading/Web/Desktop_Improvements|projektni strani]].", + "vector-opt-out": "Preklopi na stari videz", + "vector-opt-out-tooltip": "Spremenite nastavitve, da se vrnete na stari videz preobleke (stari Vector)", + "vector.css": "/* Vsi koda CSS tukaj se bo naložila za uporabnike preobleke Vector */", + "vector.js": "/* Vsa koda JavaScript tukaj se bo naložila za uporabnike preobleke Vector */", + "vector-action-toggle-sidebar": "Preklop stranske letvice", + "vector-languages": "Jeziki", + "vector-language-button-aria-label": "P9jdi na članek v drugem jeziku. Na voljo v {{PLURAL:$1|$1 jeziku|$1 jezikih}}.", + "vector-language-button-label": "{{PLURAL:$1|$1 jezik|$1 jezika|$1 jeziki|$1 jezikov}}", + "vector-no-language-button-label": "Dodaj jezike", + "vector-no-language-button-aria-label": "Ta članek obstaja samo v tem jeziku. Dodajte članke v drugih jezikih.", + "vector-language-redirect-to-top": "V projektu {{SITENAME}} so jezikovne povezave na vrhu strani ob naslovu članka. [[#p-lang-btn|Pojdi na vrh]].", + "vector-language-variant-switcher-label": "Spremeni različico jezika", + "vector-action-addsection": "Dodaj temo", + "vector-action-delete": "Izbriši", + "vector-action-move": "Prestavi", + "vector-action-protect": "Zaščiti", + "vector-action-undelete": "Odizbriši", + "vector-action-unprotect": "Spremeni zaščito", + "vector-view-create": "Ustvari", + "vector-view-edit": "Uredi", + "vector-view-history": "Zgodovina", + "vector-view-view": "Preberi", + "vector-view-viewsource": "Izvorno besedilo", + "vector-jumptonavigation": "Pojdi na navigacijo", + "vector-jumptosearch": "Pojdi na iskanje", + "vector-jumptocontent": "Pojdi na vsebino", + "vector-more-actions": "Več", + "vector-search-loader": "Nalaganje predlogov za iskanje", + "vector-searchsuggest-containing": "Poišči strani, ki vsebujejo $1", + "vector-intro-page": "Help:Uvod", + "vector-toc-label": "Vsebina", + "vector-toc-beginning": "Začetek", + "vector-toc-toggle-button-label": "Vklopi podrazdelek $1", + "vector-anon-user-menu-pages": "Strani za neprijavljene urejevalce", + "vector-anon-user-menu-pages-learn": "več o tem", + "vector-anon-user-menu-pages-label": "Več o urejanju", + "vector-main-menu-tooltip": "Glavni meni", + "vector-toc-menu-tooltip": "Kazalo vsebine", + "vector-toc-collapsible-button-label": "Vklopi kazalo vsebine", + "vector-site-nav-label": "Projekt", + "vector-main-menu-label": "Glavni meni", + "vector-limited-width-toggle": "Preklop omejene širine vsebine", + "vector-page-tools-label": "Orodja", + "vector-page-tools-general-label": "Splošno", + "vector-page-tools-actions-label": "Dejanja", + "vector-pin-element-label": "prestavi v stransko letvico", + "vector-unpin-element-label": "skrij", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Pogovor]]", + "tooltip-vector-anon-user-menu-title": "Več možnosti", + "vector-prefs-limited-width": "Omogoči način omejene širine", + "vector-prefs-limited-width-help": "Omogoči način omejene širine za boljšo izkušnjo branja in gledanja.", + "empty-language-selector-body": "Vsebina strani ni podprta v drugih jezikih." +} diff --git a/Vector/i18n/sli.json b/Vector/i18n/sli.json new file mode 100644 index 0000000..81cb95e --- /dev/null +++ b/Vector/i18n/sli.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Przemub", + "Schläsinger", + "Timpul", + "Äberlausitzer" + ] + }, + "vector-action-addsection": "Obschniet hinzufiega", + "vector-action-delete": "Läscha", + "vector-action-move": "Verschieba", + "vector-action-protect": "Schitza", + "vector-action-undelete": "Wiederherstella", + "vector-action-unprotect": "Freigahn", + "vector-view-create": "Erstella", + "vector-view-edit": "Beorbeetn", + "vector-view-history": "Versionsgeschichte", + "vector-view-view": "Lasa", + "vector-view-viewsource": "Quelltext siehn", + "vector-more-actions": "Meh" +} diff --git a/Vector/i18n/sly.json b/Vector/i18n/sly.json new file mode 100644 index 0000000..deb6741 --- /dev/null +++ b/Vector/i18n/sly.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "ZQheert" + ] + }, + "vector-action-delete": "Lelei", + "vector-action-move": "Palettei", + "vector-view-create": "Bua'", + "vector-view-edit": "edi'", + "vector-view-view": "Bacai", + "vector-view-viewsource": "Tilingi assala'na" +} diff --git a/Vector/i18n/sma.json b/Vector/i18n/sma.json new file mode 100644 index 0000000..a27dc53 --- /dev/null +++ b/Vector/i18n/sma.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Trondtr" + ] + }, + "vector-view-history": "Vuesieh histovrijem" +} diff --git a/Vector/i18n/smn.json b/Vector/i18n/smn.json new file mode 100644 index 0000000..3c4eb61 --- /dev/null +++ b/Vector/i18n/smn.json @@ -0,0 +1,35 @@ +{ + "@metadata": { + "authors": [ + "Kimberli Mäkäräinen (WMNO)", + "Seipinne", + "Trondtr", + "Yupik" + ] + }, + "vector-opt-out": "Molso ovdebii olgoldâsháámán", + "vector-languages": "Kielah", + "vector-language-button-label": "{{PLURAL:$1|$1 kielâ|$1 kielâ|$1 kielâ|$1 kiellâd}}", + "vector-no-language-button-label": "Lasseet kielâid", + "vector-action-addsection": "Lasseet fáádá", + "vector-action-delete": "Siho", + "vector-action-move": "Sirde", + "vector-action-protect": "Suoijii", + "vector-action-undelete": "Maaccât", + "vector-view-create": "Räähti", + "vector-view-edit": "Mute", + "vector-view-history": "Čääiti historjá", + "vector-view-view": "Luuvâ", + "vector-view-viewsource": "Čääiti käldeekoodi", + "vector-jumptonavigation": "Njuškii navigistmân", + "vector-jumptosearch": "Njuškii ucâmân", + "vector-jumptocontent": "Njuškii siskáldâsân", + "vector-more-actions": "Eenâb", + "vector-searchsuggest-containing": "Uusâ siijđoid, moh siskáldeh $1", + "vector-toc-beginning": "Algâttâs", + "vector-main-menu-tooltip": "Uáivivaljiittâh", + "vector-main-menu-label": "Uáivivaljiittâh", + "vector-page-tools-label": "Tyejiniävuh", + "vector-unpin-element-label": "čievâ", + "tooltip-vector-anon-user-menu-title": "Lase valjiimeh" +} diff --git a/Vector/i18n/sms.json b/Vector/i18n/sms.json new file mode 100644 index 0000000..a40d0fc --- /dev/null +++ b/Vector/i18n/sms.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Yupik" + ] + }, + "vector-languages": "Ǩiõl", + "vector-language-button-label": "{{PLURAL:$1|$1 ǩiõllâd|0=Ni õhtt ǩiõll|1=1 ǩiõll|2=2 ǩiõl|3=3 ǩiõl|4=4 ǩiõl|5=5 ǩiõl|6=6 ǩiõl}}", + "vector-no-language-button-label": "Lââʹzzet ǩiõlid", + "vector-action-addsection": "Lââʹzzet teeʹm", + "vector-action-delete": "Jaukkâd", + "vector-action-move": "Seeʹrd", + "vector-action-protect": "Suõjjâd", + "vector-action-undelete": "Maaccât", + "vector-action-unprotect": "Muuʹtt suõjjeemtääʹzz", + "vector-view-create": "Raaj", + "vector-view-edit": "Muuʹtt", + "vector-view-history": "Čuäʹjet historia", + "vector-view-view": "Looǥǥ", + "vector-view-viewsource": "Čuäʹjet käivvkood", + "vector-more-actions": "Lââʹzz", + "vector-searchsuggest-containing": "Ooʒʒ seeidaid, koin lij $1", + "vector-toc-label": "Siiskâžlooǥǥtõs", + "vector-anon-user-menu-pages-learn": "lââʹssteâđ", + "vector-main-menu-tooltip": "Väʹlddvaʹlljõk", + "vector-toc-menu-tooltip": "Siiskâžlooǥǥtõs", + "vector-site-nav-label": "Seiddõs", + "vector-page-tools-label": "Neävv", + "vector-unpin-element-label": "čiõǥǥ" +} diff --git a/Vector/i18n/sn.json b/Vector/i18n/sn.json new file mode 100644 index 0000000..7d8b014 --- /dev/null +++ b/Vector/i18n/sn.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "Masiziva" + ] + }, + "prefs-vector-enable-vector-1-label": "Shandisa Legacy Vector", + "prefs-vector-enable-vector-1-help": "Mumakore mashoma achatevera, tichange tichivandudza ganda re Vector neufambe. Legacy Vector ichakubvumidza kuona uhlovo wekare cheVector (kubva muna Zvita 2019). Kuti mudzidze zvimwe pamusoro pezvivandudzo, endai [[mw:Reading/Web/Desktop_Improvements|kuzanhi rewushumo]] redu.", + "vector-opt-out": "Chinja kumataridziko ekare", + "vector-opt-out-tooltip": "Shandura marongero ako kuti udzokere kumataridziko eganda rekare (legacy Vector)", + "vector-action-toggle-sidebar": "Hlogora bhaaredivi", + "vector-languages": "Mitauro", + "vector-language-button-aria-label": "Enda kusipwi ririmumumwe mutauro. Rinowanikwa mu{{PLURAL:$1|$1 mutauro|$1 mitauro}}", + "vector-language-button-label": "{{PLURAL:$1|$1 mutauro|$1 mitauro}}", + "vector-no-language-button-label": "Wedzera mitauro", + "vector-no-language-button-aria-label": "Sipwi iri riripo mumutuaro uyu bedzi. Wedzera sipwi kuitira mimwe mitauro.", + "vector-language-redirect-to-top": "Pa {{SITENAME}} ino zvikochekero zvemutauro zvirikumusoro kwe zanhi mhiri kwe dumidzo resipwi. [[#p-lang-btn|Enda kumusoro]].", + "vector-language-variant-switcher-label": "Shandura chisiyano chemutauro", + "vector-action-addsection": "Wedzera ndaba", + "vector-action-delete": "Bharanura", + "vector-action-move": "Chichinura", + "vector-action-protect": "Dzivirira", + "vector-action-undelete": "Dzosarubharanuro", + "vector-action-unprotect": "Shandura rudziviriro", + "vector-view-create": "Sika", + "vector-view-edit": "Chinjirudza", + "vector-view-history": "Ringa nhoroondo", + "vector-view-view": "Werenga", + "vector-view-viewsource": "Ringa mabviro", + "vector-jumptonavigation": "Svetuka kumufambairo", + "vector-jumptosearch": "Svetuka kukwekutsvaga", + "vector-jumptocontent": "Svetuka kuchirochemo", + "vector-more-actions": "Zvimwe", + "vector-search-loader": "Zvikarakadzo zvatsvagwa zvirikurayichwa.", + "vector-searchsuggest-containing": "Tsvaga mazanhi ane $1", + "vector-intro-page": "Help:Musumo", + "vector-toc-label": "Zvirozvemo", + "vector-toc-beginning": "Pekutanga", + "vector-toc-toggle-button-label": "Hlogora $1 chikamuzasi", + "vector-anon-user-menu-pages": "Mazanhi evachinjirudzi vakabuda", + "vector-anon-user-menu-pages-learn": "dzidza zvimwe", + "vector-anon-user-menu-pages-label": "Dzidza nezvezvimwe zvekuchinjirudza", + "vector-main-menu-tooltip": "Nhorongoshwa huru", + "vector-toc-menu-tooltip": "Tafura ye zvirozvemo", + "vector-toc-collapsible-button-label": "Hlogora tafura ye zvirozvemo", + "vector-site-nav-label": "Sayiti", + "vector-main-menu-label": "Nhorongoshwa huru", + "vector-limited-width-toggle": "Hlogora hupamhi hwezvirozvemo zvakaganhukwa", + "vector-page-tools-label": "Maturusi", + "vector-page-tools-general-label": "Chikumbi", + "vector-page-tools-actions-label": "Zviito", + "vector-pin-element-label": "chichinura kubhaaredivi", + "vector-unpin-element-label": "viga", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Hurukuro]]", + "tooltip-vector-anon-user-menu-title": "Zvimwe zvisarudzo", + "vector-prefs-limited-width": "Baridza mashandiro ehupamhi hwakaganhuka", + "vector-prefs-limited-width-help": "Baridza mashandiro ehupamhi hwakaganhuka kuti kuwerenga kwako kuve kurinani.", + "empty-language-selector-body": "Zvirozvemo zvezanhi hazvitsigirwe mumimwe mitauro." +} diff --git a/Vector/i18n/so.json b/Vector/i18n/so.json new file mode 100644 index 0000000..32634f5 --- /dev/null +++ b/Vector/i18n/so.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Abdullahi", + "Maax" + ] + }, + "vector-action-addsection": "Hadal ku dar", + "vector-action-delete": "Tirtir", + "vector-action-move": "Wareeji", + "vector-action-protect": "Difaac", + "vector-action-undelete": "Ha tirtirin", + "vector-action-unprotect": "Bedel difaacida", + "vector-view-create": "Abuur", + "vector-view-edit": "Wax ka badal", + "vector-view-history": "Fiiri taariikhda", + "vector-view-view": "Akhri", + "vector-view-viewsource": "Itusi xogta", + "vector-more-actions": "Dheeraad" +} diff --git a/Vector/i18n/sq.json b/Vector/i18n/sq.json new file mode 100644 index 0000000..2559902 --- /dev/null +++ b/Vector/i18n/sq.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Besnik b", + "Dasius", + "Ftillimi", + "GretaDoci", + "MicroBoy", + "Mikullovci11", + "Olsi" + ] + }, + "vector-action-addsection": "Shto një temë", + "vector-action-delete": "Fshije", + "vector-action-move": "Zhvendose", + "vector-action-protect": "Mbroje", + "vector-action-undelete": "Anulo fshirjen", + "vector-action-unprotect": "Ndrysho mbrojtjen", + "vector-view-create": "Krijo", + "vector-view-edit": "Redakto", + "vector-view-history": "Shihni historikun", + "vector-view-view": "Lexo", + "vector-view-viewsource": "Shihni burimin", + "vector-more-actions": "Më tepër" +} diff --git a/Vector/i18n/sr-ec.json b/Vector/i18n/sr-ec.json new file mode 100644 index 0000000..5847850 --- /dev/null +++ b/Vector/i18n/sr-ec.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Acamicamacaraca", + "Amire80", + "BadDog", + "Milicevic01", + "Obsuser", + "Rancher", + "Жељко Тодоровић", + "Михајло Анђелковић", + "Сербијана", + "Srđan" + ] + }, + "skinname-vector": "Векторско (2010)", + "skinname-vector-2022": "Векторско (2022)", + "vector-specialversion-name": "Векторско", + "vector-skin-desc": "Пружа 2 Векторске теме:\n* 2011 - Савремена верзија Монобука са свежим изгледом и много корисних побољшања.\n* 2022 - Нови Вектор направљен у оквиру пројекта [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Користи старију векторску тему", + "prefs-vector-enable-vector-1-help": "У наредном периоду постепено ћемо ажурирати векторску тему. Изаберите опцију изнад како бисте се вратили на старији изглед теме (децембар 2019). [[mw:Reading/Web/Desktop_Improvements|Детаљније о ажурирањима]]", + "vector-opt-out": "Старији изглед", + "vector-opt-out-tooltip": "Промените подешавања да бисте се вратили старом изгледу теме (старија векторска)", + "vector.css": "/* CSS постављен овде учитаће се свим корисницима векторске теме */", + "vector.js": "/* JavaScript постављен овде учитаће се свим корисницима векторске теме */", + "vector-action-toggle-sidebar": "Прикажи/сакриј бочну траку", + "vector-languages": "Језици", + "vector-language-button-aria-label": "Чланак на другим језицима. Доступан на: {{PLURAL:$1|$1}}", + "vector-language-button-label": "{{PLURAL:$1|$1 језик|$1 језика}}", + "vector-no-language-button-label": "Додај језике", + "vector-no-language-button-aria-label": "Овај чланак постоји само на овом језику. Додајте друге језике.", + "vector-language-redirect-to-top": "Језичке везе се налазе на врху странице поред наслова чланка. [[#p-lang-btn|Идите на врх]].", + "vector-language-variant-switcher-label": "Промени варијанту језика", + "vector-action-addsection": "Додај тему", + "vector-action-delete": "Избриши", + "vector-action-move": "Премести", + "vector-action-protect": "Заштити", + "vector-action-undelete": "Врати", + "vector-action-unprotect": "Промени заштиту", + "vector-view-create": "Направи", + "vector-view-edit": "Уреди", + "vector-view-history": "Историја", + "vector-view-view": "Читај", + "vector-view-viewsource": "Извор", + "vector-jumptonavigation": "Пређи на навигацију", + "vector-jumptosearch": "Пређи на претрагу", + "vector-jumptocontent": "Пређи на садржај", + "vector-more-actions": "Више", + "vector-search-loader": "Учитавам предлоге претраге", + "vector-searchsuggest-containing": "Претражи странице које садрже $1", + "vector-toc-label": "Садржај", + "vector-toc-beginning": "Почетак", + "vector-anon-user-menu-pages": "Странице за одјављене уреднике", + "vector-anon-user-menu-pages-learn": "детаљније", + "vector-anon-user-menu-pages-label": "Детаљније о уређивању", + "vector-main-menu-tooltip": "Главни мени", + "vector-toc-menu-tooltip": "Садржај", + "vector-toc-collapsible-button-label": "Прикажи/сакриј садржај", + "vector-site-nav-label": "Сајт", + "vector-main-menu-label": "Главни мени", + "vector-limited-width-toggle": "Смањи ширину садржаја", + "vector-page-tools-label": "Алатке", + "vector-page-tools-general-label": "Опште", + "vector-page-tools-actions-label": "Радње", + "vector-pin-element-label": "помери на страну", + "vector-unpin-element-label": "сакриј", + "tooltip-vector-anon-user-menu-title": "Више опција", + "vector-prefs-limited-width": "Режим ограничене ширине", + "vector-prefs-limited-width-help": "Омогућава режим ограничене ширине за побољшано читачко искуство", + "empty-language-selector-body": "Садржај странице није подржан на другим језицима" +} diff --git a/Vector/i18n/sr-el.json b/Vector/i18n/sr-el.json new file mode 100644 index 0000000..7b12456 --- /dev/null +++ b/Vector/i18n/sr-el.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Kizule", + "Michaello", + "Milicevic01", + "Obsuser", + "Rancher", + "Zoranzoki21", + "Жељко Тодоровић", + "Сербијана" + ] + }, + "skinname-vector": "Vektorsko (2010)", + "skinname-vector-2022": "Vektorsko (2022)", + "vector-specialversion-name": "Vektorsko", + "vector-skin-desc": "Pruža 2 Vektorske teme:\n* 2011 - Savremena verzija Monobuka sa svežim izgledom i mnogo korisnih poboljšanja.\n* 2022 - Novi Vektor napravljen u okviru projekta [[mw:Desktop Improvements]].", + "prefs-vector-enable-vector-1-label": "Koristi stariju vektorsku temu", + "prefs-vector-enable-vector-1-help": "U narednom periodu postepeno ćemo ažurirati vektorsku temu. Izaberite opciju iznad kako biste se vratili na stariji izgled teme (decembar 2019). [[mw:Reading/Web/Desktop_Improvements|Detaljnije o ažuriranjima]]", + "vector-opt-out": "Stariji izgled", + "vector-opt-out-tooltip": "Promenite podešavanja da biste se vratili starom izgledu teme (starija vektorska)", + "vector.css": "/* CSS postavljen ovde učitaće se svim korisnicima vektorske teme */", + "vector.js": "/* JavaScript postavljen ovde učitaće se svim korisnicima vektorske teme */", + "vector-action-toggle-sidebar": "Prikaži/sakrij bočnu traku", + "vector-languages": "Jezici", + "vector-language-button-aria-label": "Članak na drugim jezicima. Dostupan na: {{PLURAL:$1|$1}}", + "vector-language-button-label": "$1 jezik{{PLURAL:$1||a}}", + "vector-no-language-button-label": "Dodaj jezike", + "vector-no-language-button-aria-label": "Ovaj članak postoji samo na ovom jeziku. Dodajte druge jezike.", + "vector-language-redirect-to-top": "Jezičke veze se nalaze na vrhu stranice pored naslova članka. [[#p-lang-btn|Idite na vrh]].", + "vector-language-variant-switcher-label": "Promeni varijantu jezika", + "vector-action-addsection": "Dodaj temu", + "vector-action-delete": "Izbriši", + "vector-action-move": "Premesti", + "vector-action-protect": "Zaštiti", + "vector-action-undelete": "Vrati", + "vector-action-unprotect": "Promeni zaštitu", + "vector-view-create": "Napravi", + "vector-view-edit": "Uredi", + "vector-view-history": "Istorija", + "vector-view-view": "Čitaj", + "vector-view-viewsource": "Izvor", + "vector-jumptonavigation": "Pređi na navigaciju", + "vector-jumptosearch": "Pređi na pretragu", + "vector-jumptocontent": "Pređi na sadržaj", + "vector-more-actions": "Više", + "vector-search-loader": "Učitavam predloge pretrage", + "vector-searchsuggest-containing": "Pretraži stranice koje sadrže $1", + "vector-toc-label": "Sadržaj", + "vector-toc-beginning": "Početak", + "vector-anon-user-menu-pages": "Stranice za odjavljene urednike", + "vector-anon-user-menu-pages-learn": "detaljnije", + "vector-anon-user-menu-pages-label": "Detaljnije o uređivanju", + "vector-main-menu-tooltip": "Glavni meni", + "vector-toc-menu-tooltip": "Sadržaj", + "vector-toc-collapsible-button-label": "Prikaži/sakrij sadržaj", + "vector-site-nav-label": "Sajt", + "vector-main-menu-label": "Glavni meni", + "vector-page-tools-label": "Alatke", + "vector-page-tools-general-label": "Opšte", + "vector-page-tools-actions-label": "Radnje", + "vector-pin-element-label": "pomeri na stranu", + "vector-unpin-element-label": "sakrij", + "tooltip-vector-anon-user-menu-title": "Više opcija", + "vector-prefs-limited-width": "Režim ograničene širine", + "vector-prefs-limited-width-help": "Omogućava režim ograničene širine za poboljšano čitačko iskustvo", + "empty-language-selector-body": "Sadržaj stranice nije podržan na drugim jezicima" +} diff --git a/Vector/i18n/sro.json b/Vector/i18n/sro.json new file mode 100644 index 0000000..fd6d3d9 --- /dev/null +++ b/Vector/i18n/sro.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "F Samaritani", + "Jaime Sulas" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 lìngua|$1 linguas}}", + "vector-action-addsection": "Aciungi arraxonu", + "vector-action-delete": "Burra", + "vector-action-move": "Movi", + "vector-action-protect": "Cadela", + "vector-view-create": "Cria", + "vector-view-edit": "Muda", + "vector-view-history": "Càstia sa stòria", + "vector-view-view": "Ligi", + "vector-more-actions": "Àteru", + "vector-searchsuggest-containing": "Circa is pàginas chi tenint $1", + "vector-toc-menu-tooltip": "Ìndixi" +} diff --git a/Vector/i18n/ss.json b/Vector/i18n/ss.json new file mode 100644 index 0000000..44a5edf --- /dev/null +++ b/Vector/i18n/ss.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Sibande" + ] + }, + "vector-action-addsection": "Ngeta sihloko", + "vector-action-move": "Khweshisa", + "vector-view-create": "Create", + "vector-view-edit": "Hlela", + "vector-view-history": "Bona umlandvo", + "vector-view-view": "Fundza" +} diff --git a/Vector/i18n/st.json b/Vector/i18n/st.json new file mode 100644 index 0000000..d0e1dec --- /dev/null +++ b/Vector/i18n/st.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Coldfact", + "Gustave London", + "Tšepo" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 puo|$1 lipuo}}", + "vector-view-edit": "Fetola", + "vector-view-history": "Sheba histori", + "vector-view-view": "Bala", + "vector-more-actions": "Tse ling", + "vector-searchsuggest-containing": "Batla maqephe a nang le $1" +} diff --git a/Vector/i18n/stq.json b/Vector/i18n/stq.json new file mode 100644 index 0000000..e078e6f --- /dev/null +++ b/Vector/i18n/stq.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Pyt" + ] + }, + "vector-action-addsection": "Ousnit bietouföigje", + "vector-action-delete": "Läskje", + "vector-action-move": "Ferskuuwe", + "vector-action-protect": "Skutsje", + "vector-action-undelete": "Wierhäärstaale", + "vector-action-unprotect": "Siedenskuts annerje", + "vector-view-create": "Moakje", + "vector-view-edit": "Beoarbaidje", + "vector-view-history": "Versionsgeskichte", + "vector-view-view": "Leese", + "vector-view-viewsource": "Wältext bekiekje", + "vector-more-actions": "Moor" +} diff --git a/Vector/i18n/sty.json b/Vector/i18n/sty.json new file mode 100644 index 0000000..f0b9c93 --- /dev/null +++ b/Vector/i18n/sty.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Khanmarat", + "Sorbat" + ] + }, + "vector-languages": "Телләр", + "vector-language-button-label": "{{PLURAL:$1|$1 тел|телләрнең $1 }}", + "vector-no-language-button-label": "Телләр ҡушҡалы", + "vector-action-addsection": "Тема өстәгәле", + "vector-action-delete": "Йуҡ иткәле", + "vector-action-move": "Исемен алмаштырғалы", + "vector-action-protect": "Йаҡлағалы", + "vector-view-create": "Ҡылғалы", + "vector-view-edit": "Төсәткәле", + "vector-view-history": "Тариҡны ҡарағалы", + "vector-view-view": "Уғығалы", + "vector-more-actions": "Тағын", + "vector-searchsuggest-containing": "$1 эцтәлегентә парын питләрне эстәү", + "vector-page-tools-label": "Ҡораллар", + "vector-page-tools-general-label": "Умумий", + "vector-unpin-element-label": "йәшергәле" +} diff --git a/Vector/i18n/su.json b/Vector/i18n/su.json new file mode 100644 index 0000000..1cfd4ae --- /dev/null +++ b/Vector/i18n/su.json @@ -0,0 +1,33 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Daud I.F. Argana", + "Kandar", + "Pijri Paijar", + "Akbar Soepadhi" + ] + }, + "vector-skin-desc": "MonoBook vérsi modéren dina pidangan anu leuwih anyar jeung leuwih hadé", + "vector-languages": "Basa", + "vector-language-button-label": "{{PLURAL:$1|$1 basa}}", + "vector-no-language-button-label": "Tambahkeun basa", + "vector-action-addsection": "Tambah jejer", + "vector-action-delete": "Hapus", + "vector-action-move": "Pindahkeun", + "vector-action-protect": "Konci", + "vector-action-undelete": "Bolaykeun ngahapus", + "vector-action-unprotect": "Robah protéksi", + "vector-view-create": "Jieun", + "vector-view-edit": "Édit", + "vector-view-history": "Témbongkeun jujutan", + "vector-view-view": "Baca", + "vector-view-viewsource": "Témbongkeun sumber", + "vector-more-actions": "Lianna", + "vector-searchsuggest-containing": "Paluruh kaca-kaca anu ngandung $1", + "vector-toc-label": "Eusi", + "vector-toc-beginning": "Mimiti", + "vector-page-tools-label": "Parabot", + "vector-page-tools-general-label": "Umum", + "vector-unpin-element-label": "sumputkeun" +} diff --git a/Vector/i18n/sv.json b/Vector/i18n/sv.json new file mode 100644 index 0000000..7ea6aab --- /dev/null +++ b/Vector/i18n/sv.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Larske", + "Lokal Profil", + "Martinwiss", + "Najami", + "Sabelöga", + "Skalman", + "Sturban", + "WikiPhoenix" + ] + }, + "skinname-vector": "Vector, äldre (2010)", + "vector-skin-desc": "Innehåller 2 Vector-utseenden:\n* 2011 - Modern version av MonoBook med ett nytt utseende och flera användarvänlighetsförbättringar.\n* 2022 - Inbyggda versionen av Vector som är en del av WMF:s [[mw:Desktop Improvements]]-projekt.", + "prefs-vector-enable-vector-1-label": "Använd gamla Vector", + "prefs-vector-enable-vector-1-help": "Under de nästkommande åren kommer vi gradvis uppdatera utseendet Vector. Gamla Vector kommer låta dig se den gamla version av Vector (fr.o.m. december 2019). För att läsa mer om uppdateringarna, gå till vår [[mw:Reading/Web/Desktop_Improvements|projektsida]].", + "vector-opt-out": "Byt till gamla utseendet", + "vector-opt-out-tooltip": "Ändra dina inställningar för att återgå till utseendets gamla design (gamla Vector)", + "vector.css": "/* All CSS här kommer att läsas in för de som använder utseendet Vector */", + "vector.js": "/* All JavaScript här kommer att läsas in för alla som använder utseendet Vector */", + "vector-action-toggle-sidebar": "Visa/dölj sidofält", + "vector-languages": "Språk", + "vector-language-button-aria-label": "Gå till en artikel på ett annat språk. Tillgänglig på {{PLURAL:$1|$1 språk}}", + "vector-language-button-label": "{{PLURAL:$1|$1 språk}}", + "vector-no-language-button-label": "Lägg till språk", + "vector-no-language-button-aria-label": "Den här artikeln finns bara på det här språket. Lägg till artikeln på andra språk", + "vector-language-redirect-to-top": "På denna {{SITENAME}} finns språklänkar längst upp på sidan mittemot artikeltiteln. [[#p-lang-btn|Gå längst upp]].", + "vector-language-variant-switcher-label": "Ändra språkvariant", + "vector-action-addsection": "Nytt ämne", + "vector-action-delete": "Radera", + "vector-action-move": "Flytta", + "vector-action-protect": "Skrivskydda", + "vector-action-undelete": "Återställ", + "vector-action-unprotect": "Ändra skydd", + "vector-view-create": "Skapa", + "vector-view-edit": "Redigera", + "vector-view-history": "Visa historik", + "vector-view-view": "Läs", + "vector-view-viewsource": "Visa källa", + "vector-jumptonavigation": "Hoppa till navigering", + "vector-jumptosearch": "Hoppa till sök", + "vector-jumptocontent": "Hoppa till innehållet", + "vector-more-actions": "Mer", + "vector-search-loader": "Laddar in sökförslag", + "vector-searchsuggest-containing": "Sök efter sidor som innehåller $1", + "vector-intro-page": "Help:Introduktion", + "vector-toc-label": "Innehåll", + "vector-toc-beginning": "Inledning", + "vector-toc-toggle-button-label": "Växla underavsnittet $1", + "vector-anon-user-menu-pages": "Sidor för utloggade redigerade", + "vector-anon-user-menu-pages-learn": "läs mer", + "vector-anon-user-menu-pages-label": "Läs mer om redigering", + "vector-main-menu-tooltip": "Huvudmeny", + "vector-toc-menu-tooltip": "Innehållsförteckning", + "vector-toc-collapsible-button-label": "Växla innehållsförteckningen", + "vector-site-nav-label": "Webbplats", + "vector-main-menu-label": "Huvudmeny", + "vector-limited-width-toggle": "Aktivera/inaktivera begränsad bredd på innehåll", + "vector-page-tools-label": "Verktyg", + "vector-page-tools-general-label": "Allmänt", + "vector-page-tools-actions-label": "Åtgärder", + "vector-pin-element-label": "flytta till sidofältet", + "vector-unpin-element-label": "dölj", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Diskussion]]", + "tooltip-vector-anon-user-menu-title": "Fler alternativ", + "vector-prefs-limited-width": "Aktivera läget med begränsad bredd", + "vector-prefs-limited-width-help": "Aktivera läget med begränsad bredd för förbättrad läsupplevelse.", + "empty-language-selector-body": "Sidans innehåll stöds inte på andra språk." +} diff --git a/Vector/i18n/sw.json b/Vector/i18n/sw.json new file mode 100644 index 0000000..0edcbef --- /dev/null +++ b/Vector/i18n/sw.json @@ -0,0 +1,35 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Edwingudfriend", + "Hussein m mmbaga", + "Kipala", + "Lloffiwr", + "Muddyb", + "Muddyb Blast Producer", + "Wangombe", + "Yasen igra" + ] + }, + "vector-languages": "Lugha", + "vector-language-button-label": "{{PLURAL:$1|Lugha $1}}", + "vector-no-language-button-label": "Ongeza lugha", + "vector-action-addsection": "Weka mada", + "vector-action-delete": "Futa", + "vector-action-move": "Hamisha", + "vector-action-protect": "Linda", + "vector-action-undelete": "Rudisha", + "vector-action-unprotect": "Badilisha ulinzi", + "vector-view-create": "Anzisha", + "vector-view-edit": "Hariri", + "vector-view-history": "Fungua historia", + "vector-view-view": "Soma", + "vector-view-viewsource": "Tazama msimbo", + "vector-jumptocontent": "Rukia yaliyomo", + "vector-more-actions": "Zaidi", + "vector-searchsuggest-containing": "Tafuta kurasa zilizo na $1", + "vector-page-tools-label": "Zana", + "vector-page-tools-general-label": "Kijumla", + "vector-unpin-element-label": "ficha" +} diff --git a/Vector/i18n/sxu.json b/Vector/i18n/sxu.json new file mode 100644 index 0000000..60a5364 --- /dev/null +++ b/Vector/i18n/sxu.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Jun Misugi" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 Sprooche|$1 Sproochn}}", + "vector-action-addsection": "Abschnidd hinzufüchen", + "vector-action-move": "Forschie'm", + "vector-view-create": "Ärschdelln", + "vector-view-edit": "Ändorn", + "vector-view-history": "Fersionsgeschischde", + "vector-view-view": "Lesn", + "vector-more-actions": "Mehr" +} diff --git a/Vector/i18n/syl.json b/Vector/i18n/syl.json new file mode 100644 index 0000000..1551c92 --- /dev/null +++ b/Vector/i18n/syl.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "এম আবু সাঈদ", + "ꠢꠣꠍꠘ ꠞꠣꠎꠣ" + ] + }, + "vector-languages": "ꠜꠣꠡꠣꠁꠘ", + "vector-language-button-label": "{{PLURAL:$1|$1 ꠝꠣꠔ|$1 ꠝꠣꠔꠣꠁꠘ}}", + "vector-no-language-button-label": "ꠢꠇ꠆ꠇꠟ ꠝꠣꠔꠣꠁꠘ ꠎꠥꠉ ꠈꠞꠂꠘ", + "vector-action-addsection": "ꠐꠙꠤꠇ ꠡꠥꠞꠥ ꠈꠞꠁꠘ", + "vector-action-delete": "ꠙꠣꠟꠣꠃꠇ꠆ꠇꠣ", + "vector-action-move": "ꠢꠞꠣꠅ", + "vector-action-protect": "ꠞꠇꠇꠣ ꠈꠞꠣ", + "vector-view-create": "ꠛꠣꠘꠣꠅ", + "vector-view-edit": "ꠟꠦꠈ", + "vector-view-history": "ꠁꠔꠤꠀꠡ ꠖꠦꠈꠇꠣ", + "vector-view-view": "ꠙꠠ", + "vector-more-actions": "ꠀꠞꠧ", + "vector-searchsuggest-containing": "ꠚꠣꠔꠣ ꠕꠥꠇꠣꠃꠇ꠆ꠇꠣ ꠎꠦꠘꠅ $1", + "vector-toc-label": "ꠎꠤꠘꠤꠡꠣꠁꠘ", + "vector-toc-beginning": "ꠀꠞꠝ꠆ꠛꠅ", + "vector-page-tools-label": "ꠎꠤꠘꠤꠡꠣꠁꠘ", + "vector-page-tools-general-label": "ꠡꠣꠗꠣꠞꠘ", + "vector-unpin-element-label": "ꠟꠥꠇꠣꠁꠘ" +} diff --git a/Vector/i18n/szl.json b/Vector/i18n/szl.json new file mode 100644 index 0000000..5f91c78 --- /dev/null +++ b/Vector/i18n/szl.json @@ -0,0 +1,58 @@ +{ + "@metadata": { + "authors": [ + "Britscher", + "Gaj777", + "Krol111", + "Przem(1)s", + "Przemub", + "Uostofchuodnego" + ] + }, + "prefs-vector-enable-vector-1-label": "Użyj Legacy Vector", + "prefs-vector-enable-vector-1-help": "Over the next few years, we will be gradually updating the Vector skin. Legacy Vector will allow you to view the old version of Vector (as of December 2019). To learn more about the updates, go to our [[mw:Reading/Web/Desktop_Improvements|project page]].", + "vector-opt-out": "Przeszaltruj na stary widok", + "vector-opt-out-tooltip": "Zmiyń ustawiyniŏ, coby wrōcić sie do starego wyglōndu skōrki (legacy Vector)", + "vector-action-toggle-sidebar": "Przeszaltruj bocznŏ lajsta", + "vector-languages": "Gŏdki", + "vector-language-button-aria-label": "Pōdź do artikla w inkszyj gŏdce. Dostympne we {{PLURAL:$1|$1 godce|$1 godkach}}", + "vector-language-button-label": "$1 {{PLURAL:$1|gŏdka|gŏdki|gŏdek}}", + "vector-no-language-button-label": "Przidej gŏdki", + "vector-no-language-button-aria-label": "Tyn artikel je ino we tyj godce. Przidej artikle we inkszych godkach.", + "vector-language-redirect-to-top": "We tym projekcie sam linki miyndzy roztomajtymi godkowymi wersyjami sōm na przodku zajty, na prawo ôd mjana artikla. [[#p-lang-btn|Pōdź na przodek]].", + "vector-language-variant-switcher-label": "Wybier godkowy wariant", + "vector-action-addsection": "Przidej tymat", + "vector-action-delete": "Wychrōń", + "vector-action-move": "Przeniyś", + "vector-action-protect": "Zawrzij", + "vector-action-undelete": "Wćep nazod", + "vector-action-unprotect": "Uodymkńij", + "vector-view-create": "Stwōrz", + "vector-view-edit": "Edytuj", + "vector-view-history": "Pokŏż gyszichtã", + "vector-view-view": "Czytej", + "vector-view-viewsource": "Zdrzōdłowy kod", + "vector-jumptonavigation": "Pōdź do nawigacyje", + "vector-jumptosearch": "Pōdź do wyszukiwanio", + "vector-jumptocontent": "Pōdź kaj inhalt", + "vector-more-actions": "Wiyncyj", + "vector-search-loader": "Ładowanie sugestyjōw", + "vector-searchsuggest-containing": "Szukej zajtōw ftore zawiyrajōm $1", + "vector-intro-page": "Help:Půmoc", + "vector-toc-label": "Wykŏz inhaltu", + "vector-toc-beginning": "Przodek", + "vector-toc-toggle-button-label": "Przeszaltruj podsekcyjõ $1", + "vector-anon-user-menu-pages": "Zajty dlo niyzameldowanych używŏczōw", + "vector-anon-user-menu-pages-learn": "wiyncyj informacyje", + "vector-anon-user-menu-pages-label": "Wiyncyj informacyje ô sprowianiu", + "vector-main-menu-tooltip": "Przodnie menu", + "vector-toc-menu-tooltip": "Wykŏz inhaltu", + "vector-toc-collapsible-button-label": "Przeszaltruj sztand wykŏzu inhaltu", + "vector-site-nav-label": "Neczajta", + "vector-pin-element-label": "przeciep do bocznyj lajsty", + "vector-unpin-element-label": "skryj", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|dyskusyjŏ]]", + "tooltip-vector-anon-user-menu-title": "Wiyncyj ôpcyji", + "vector-prefs-limited-width": "Aktywuj modus ôgraniczōnyj szyrzki", + "vector-prefs-limited-width-help": "Aktywuj modus ôgraniczōnyj szyrzki dlo grajfniyjszego widoku czytaniŏ" +} diff --git a/Vector/i18n/szy.json b/Vector/i18n/szy.json new file mode 100644 index 0000000..bad8cb5 --- /dev/null +++ b/Vector/i18n/szy.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Akamycoco", + "Benel", + "Bunukwiki", + "Tokoabibi" + ] + }, + "vector-skin-desc": "ayzaay a MonoBook, izaw baluhayay a nuhekalan atu yadah pisaungayay a sakapahay.", + "vector-language-button-label": "{{PLURAL:$1|$1 kamu}}", + "vector-action-addsection": "micunus sasakamuen", + "vector-action-delete": "misipu", + "vector-action-move": "milimad", + "vector-action-protect": "midiput", + "vector-action-undelete": "palawpes tu masipuay", + "vector-action-unprotect": "misumad tu midiputay", + "vector-view-create": "patizeng", + "vector-view-edit": "mikawaway-kalumyiti", + "vector-view-history": "ciwsace nazipa’an", + "vector-view-view": "miasip", + "vector-view-viewsource": "ciwsace yuensma-kodo", + "vector-more-actions": "yadah" +} diff --git a/Vector/i18n/ta.json b/Vector/i18n/ta.json new file mode 100644 index 0000000..48f2c0b --- /dev/null +++ b/Vector/i18n/ta.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "ElangoRamanujam", + "Jayarathina", + "Kaartic", + "Kanags", + "Mayooranathan", + "Shanmugamp7", + "Siddhan", + "Surya Prakash.S.A.", + "TRYPPN" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 மொழி|$1 மொழிகள்}}", + "vector-action-addsection": "தலைப்பைச் சேர்", + "vector-action-delete": "நீக்குக", + "vector-action-move": "நகர்த்தவும்", + "vector-action-protect": "காக்கவும்", + "vector-action-undelete": "நீக்கத்தை நிறுத்து", + "vector-action-unprotect": "காப்பை மாற்று", + "vector-view-create": "உருவாக்கவும்", + "vector-view-edit": "தொகு", + "vector-view-history": "வரலாற்றைக் காட்டவும்", + "vector-view-view": "படிக்கவும்", + "vector-view-viewsource": "மூலத்தைக் காட்டவும்", + "vector-more-actions": "மேலும்", + "vector-searchsuggest-containing": "$1 உள்ளடக்கிய பக்கங்களை தேடு", + "vector-unpin-element-label": "மறை" +} diff --git a/Vector/i18n/tay.json b/Vector/i18n/tay.json new file mode 100644 index 0000000..4d163bc --- /dev/null +++ b/Vector/i18n/tay.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Corainn", + "Hitaypayan", + "Translatealcd" + ] + }, + "vector-action-addsection": "Misan tnwang kkayal", + "vector-action-delete": "’muyut", + "vector-action-move": "Smhzi’", + "vector-action-protect": "Mlahang", + "vector-action-undelete": "Laxiy pzyuciy", + "vector-action-unprotect": "Sbah kinlahang", + "vector-view-create": "ps’rux", + "vector-view-edit": "Smr’zyut miru’", + "vector-view-history": "Psbzinah mita’ kwara’ binrwan sraral", + "vector-view-view": "Lpgun", + "vector-more-actions": "Pzyux na’" +} diff --git a/Vector/i18n/tcy.json b/Vector/i18n/tcy.json new file mode 100644 index 0000000..ca6c168 --- /dev/null +++ b/Vector/i18n/tcy.json @@ -0,0 +1,32 @@ +{ + "@metadata": { + "authors": [ + "BHARATHESHA ALASANDEMAJALU", + "Chidananda Kampa", + "Kiranpoojary", + "Mahaveer Indra", + "NamwikiTL", + "VASANTH S.N.", + "Vishwanatha Badikana", + "ChiK" + ] + }, + "vector-languages": "ಬಾಸೆಲು", + "vector-no-language-button-label": "ಬಾಸೆಲೆನ್ ಸೇರ್ಪಾಲೆ", + "vector-action-addsection": "ವಿಸಯೊ ಸೇರಾಲೆ", + "vector-action-delete": "ಮಾಜಾಲೆ", + "vector-action-move": "ಸ್ತಲಾಂತರೊ ಮಲ್ಪುಲೆ", + "vector-action-protect": "ಸಂರಕ್ಷಿಸಾಲೆ", + "vector-action-undelete": "ಮಾಜಾವಡೆ", + "vector-action-unprotect": "ಬದಲಾವಣೆನ್ ರಕ್ಷಿಸಾಲೆ", + "vector-view-create": "ಸ್ರಿಸ್ಟಿಸಲೆ", + "vector-view-edit": "ಸಂಪೊಲಿಪುಲೆ", + "vector-view-history": "ಇತಿಹಾಸೊನು ತೂಲೆ", + "vector-view-view": "ಓದ್‍ಲೆ", + "vector-view-viewsource": "ಮೂಲೊನು ತೂಲೆ", + "vector-more-actions": "ನನಾತ್", + "vector-searchsuggest-containing": "ಉಂದು$1 ಇಪ್ಪುನ ಪುಟೊಕ್ಲೆನ್ ನಾಡ್‌ಲೆ", + "vector-toc-label": "ವಿಸಯೊಲು", + "vector-page-tools-general-label": "ಸಾಮಾನ್ಯೊ", + "vector-unpin-element-label": "ಅಡೆಂಗಾವು" +} diff --git a/Vector/i18n/tdd.json b/Vector/i18n/tdd.json new file mode 100644 index 0000000..8e7ec69 --- /dev/null +++ b/Vector/i18n/tdd.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Aey Tai Nuea", + "咽頭べさ" + ] + }, + "vector-languages": "ᥚᥣᥱ ᥔᥣᥱ ᥑᥣᥛᥰ", + "vector-language-button-label": "{{PLURAL:$1|$1 ᥚᥣᥱ ᥔᥣᥱ|$1 ᥚᥣᥱ ᥔᥣᥱ ᥑᥣᥛᥰ}}", + "vector-no-language-button-label": "ᥚᥣᥱ ᥔᥣᥱ ᥑᥣᥛᥰ ᥖᥒᥰ ᥔᥥᥒᥲ", + "vector-action-addsection": "ᥗᥦᥛᥴ ᥔᥬᥱ ᥞᥨᥝᥴ ᥑᥨᥝᥲ", + "vector-action-delete": "ᥛᥩᥖᥱ ᥙᥦᥖ", + "vector-action-move": "ᥑᥣᥭᥳ", + "vector-action-protect": "ᥞᥥᥳ ᥐᥒᥲ", + "vector-view-create": "ᥔᥣᥒᥲ", + "vector-view-edit": "ᥛᥨᥢᥳ ᥛᥥᥰ", + "vector-view-history": "ᥖᥨᥭᥰ ᥙᥪᥢᥰ", + "vector-view-view": "ᥚᥖᥴ ᥖᥨᥭᥰ", + "vector-more-actions": "ᥘᥛᥴ ᥘᥫᥴ", + "vector-searchsuggest-containing": "ᥔᥩᥐ ᥞᥣᥴ ᥖᥩᥢᥲ ᥖᥣᥱ ᥘᥣᥲ ᥘᥤᥐ ᥓᥫᥰ ᥑᥝᥲ ᥙᥣᥰ ᥝᥭᥳ $1", + "vector-toc-label": "ᥘᥣᥛᥰ ᥘᥬᥰ", + "vector-page-tools-label": "ᥑᥫᥒ ᥐᥛᥳ ᥐᥦᥛ", + "vector-page-tools-general-label": "ᥐᥧ ᥓᥫᥰ", + "vector-unpin-element-label": "ᥔᥫᥒᥱ ᥝᥭᥳ" +} diff --git a/Vector/i18n/te.json b/Vector/i18n/te.json new file mode 100644 index 0000000..3fb16db --- /dev/null +++ b/Vector/i18n/te.json @@ -0,0 +1,47 @@ +{ + "@metadata": { + "authors": [ + "Arjunaraoc", + "Bvprasadenwiki", + "Chaduvari", + "Kiranmayee", + "Praveen Illa", + "Ravichandra", + "V Bhavya", + "Veeven" + ] + }, + "skinname-vector": "వెక్టర్", + "prefs-vector-enable-vector-1-label": "పాత వెక్టర్ వాడు", + "prefs-vector-enable-vector-1-help": "వచ్చే కొద్ది సంవత్సరాలలో, వెక్టర్ రూపం క్రమేపీ నవీకరించుతున్నాం. పాత వెక్టర్ (డిసెంబర్ 2019 ) నాటి వెక్టర్ రూపం వాడుటకు సహాయంగా వుంటుంది. తాజా సమాచారానికి [[mw:Reading/Web/Desktop_Improvements|ప్రాజెక్టు పేజీ]] చూడండి.", + "vector-opt-out": "పాత రూపానికి మార్చు", + "vector-opt-out-tooltip": "పాత వెక్టర్ రూపానికి వెళ్లడానికి మీ అమరికలు మార్చు", + "vector-languages": "భాషలు", + "vector-language-button-label": "{{PLURAL:$1|$1 భాష|$1 భాషలు}}", + "vector-no-language-button-label": "భాషలను చేర్చు", + "vector-language-redirect-to-top": "ఈ {{SITENAME}} లో భాషా లింకులు పేజీకి పైన, వ్యాస శీర్షిక ఉండే వరుసలో కుడి చివర ఉంటాయి. [[#p-lang-btn|పైకి వెళ్ళు]].", + "vector-action-addsection": "అంశాన్ని చేర్చు", + "vector-action-delete": "తొలగించు", + "vector-action-move": "తరలించు", + "vector-action-protect": "సంరక్షించు", + "vector-action-undelete": "తొలగింపును రద్దుచెయ్యి", + "vector-action-unprotect": "సంరక్షణను మార్చు", + "vector-view-create": "సృష్టించు", + "vector-view-edit": "మార్చు", + "vector-view-history": "చరిత్ర", + "vector-view-view": "చదువు", + "vector-view-viewsource": "మూలాన్ని చూపించు", + "vector-more-actions": "మరిన్ని", + "vector-toc-label": "విషయ సూచిక", + "vector-toc-beginning": "ప్రవేశిక", + "vector-toc-toggle-button-label": "$1 ఉపవర్గాన్ని టాగుల్ చెయ్యి", + "vector-main-menu-tooltip": "ప్రధాన మెనూ", + "vector-main-menu-label": "ప్రధాన మెనూ", + "vector-page-tools-label": "పరికరాలు", + "vector-page-tools-general-label": "సాధారణం", + "vector-pin-element-label": "సైడ్‌బార్‌ లోకి తరలించు", + "vector-unpin-element-label": "దాచు", + "vector-prefs-limited-width": "లిమిటెడ్ విడ్త్ మోడ్‌ను చేతనం చెయ్యి", + "vector-prefs-limited-width-help": "చదవడంలో మెరుగైన అనుభూతి కోసం లిమిటెడ్ విడ్త్ మోడ్‌ను చేతనం చేసుకోండి", + "empty-language-selector-body": "ఈ పేజీ లోని కంటెంటులకు ఇతర భాషలలో మద్దతు లేదు." +} diff --git a/Vector/i18n/tet.json b/Vector/i18n/tet.json new file mode 100644 index 0000000..0cc9b82 --- /dev/null +++ b/Vector/i18n/tet.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "MF-Warburg" + ] + }, + "vector-action-protect": "Proteje", + "vector-view-create": "Kria", + "vector-view-edit": "Edita", + "vector-view-history": "Haree istória", + "vector-view-view": "Lee" +} diff --git a/Vector/i18n/tg-cyrl.json b/Vector/i18n/tg-cyrl.json new file mode 100644 index 0000000..fa68b64 --- /dev/null +++ b/Vector/i18n/tg-cyrl.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Ibrahim" + ] + }, + "vector-action-addsection": "Иловаи унвон", + "vector-action-delete": "Ҳазф", + "vector-action-move": "Кӯчонидан", + "vector-action-protect": "Муҳофизат", + "vector-action-undelete": "Эҳё", + "vector-action-unprotect": "Тағйири муҳофизат", + "vector-view-create": "Эҷод", + "vector-view-edit": "Вироиш", + "vector-view-history": "Намоиши таърих", + "vector-view-view": "Хондан", + "vector-view-viewsource": "Намоиши манбаъ", + "vector-more-actions": "Бештар" +} diff --git a/Vector/i18n/tg-latn.json b/Vector/i18n/tg-latn.json new file mode 100644 index 0000000..1ecb038 --- /dev/null +++ b/Vector/i18n/tg-latn.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Liangent" + ] + }, + "vector-action-addsection": "Ilovai unvon", + "vector-action-delete": "Hazf", + "vector-action-move": "Kūconidan", + "vector-action-protect": "Muhofizat", + "vector-action-undelete": "Ehjo", + "vector-action-unprotect": "Ba dar ovardan az muhofizat", + "vector-view-create": "Eçod", + "vector-view-edit": "Viroiş", + "vector-view-history": "Namoişi ta'rix", + "vector-view-view": "Xondan", + "vector-view-viewsource": "Namoişi manba'" +} diff --git a/Vector/i18n/th.json b/Vector/i18n/th.json new file mode 100644 index 0000000..9728b16 --- /dev/null +++ b/Vector/i18n/th.json @@ -0,0 +1,70 @@ +{ + "@metadata": { + "authors": [ + "Aefgh39622", + "Amire80", + "Ans", + "Bebiezaza", + "Ekminarin", + "Geonuch", + "Horus", + "Octahedron80", + "Patsagorn Y.", + "Trisorn Triboon", + "Woraponboonkerd" + ] + }, + "skinname-vector": "เวกเตอร์แบบเก่า (2553)", + "skinname-vector-2022": "เวกเตอร์ (2565)", + "vector-specialversion-name": "เวกเตอร์", + "vector-skin-desc": "Provides 2 Vector skins:\n* 2011 - The Modern version of MonoBook with fresh look and many usability improvements.\n* 2022 - The Vector built as part of the WMF [[mw:Desktop Improvements]] project.", + "prefs-vector-enable-vector-1-label": "ใช้สกินเวกเตอร์แบบเก่า", + "prefs-vector-enable-vector-1-help": "ในอีกไม่กี่ปีข้างหน้า เราจะปรับปรุงสกินเวกเตอร์ ส่วนมุมมองดั้งเดิมนั้นยังสามารถให้คุณใช้งานได้อยู่ (รุ่น ณ เดือนธันวาคม พ.ศ. 2562) เรียนรู้เพิ่มเติมเกี่ยวกับการปรับปรุงนี้ได้ที่[[mw:Reading/Web/Desktop_Improvements|หน้าโครงการ]]", + "vector-opt-out": "สลับกลับมุมมองดั้งเดิม", + "vector-opt-out-tooltip": "เปลี่ยนแปลงการตั้งค่าเพื่อกลับไปยังมุมมองแบบเดิม (เวกเตอร์ดั้งเดิม)", + "vector.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */", + "vector.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */", + "vector-action-toggle-sidebar": "เปิด/ปิดแถบข้าง", + "vector-languages": "ภาษา", + "vector-language-button-aria-label": "ไปที่บทความในภาษาอื่น ซึ่งมีใน {{PLURAL:$1|}}$1 ภาษา", + "vector-language-button-label": "{{PLURAL:$1|$1 language|$1 ภาษา}}", + "vector-no-language-button-label": "เพิ่มภาษา", + "vector-no-language-button-aria-label": "บทความนี้มีเฉพาะในภาษานี้ เพิ่มบทความสำหรับภาษาอื่น ๆ", + "vector-language-redirect-to-top": "ใน {{SITENAME}} ลิงก์ข้ามไปยังรุ่นภาษาอื่นของบทความนี้ถูกย้ายไปด้านบนแล้วที่ทางขวาของชื่อหน้า [[#p-lang-btn|ไปด้านบน]]", + "vector-action-addsection": "เพิ่มหัวข้อ", + "vector-action-delete": "ลบ", + "vector-action-move": "ย้าย", + "vector-action-protect": "ป้องกัน", + "vector-action-undelete": "กู้คืน", + "vector-action-unprotect": "เปลี่ยนการป้องกัน", + "vector-view-create": "สร้าง", + "vector-view-edit": "แก้ไข", + "vector-view-history": "ดูประวัติ", + "vector-view-view": "อ่าน", + "vector-view-viewsource": "ดูต้นฉบับ", + "vector-jumptonavigation": "ไปยังการนำทาง", + "vector-jumptosearch": "ไปยังการค้นหา", + "vector-jumptocontent": "ข้ามไปเนื้อหา", + "vector-more-actions": "เพิ่มเติม", + "vector-search-loader": "กำลังโหลดคำแนะนำการค้นหา", + "vector-searchsuggest-containing": "$1", + "vector-toc-label": "สารบัญ", + "vector-toc-beginning": "บทนำ", + "vector-anon-user-menu-pages": "หน้าสำหรับผู้แก้ไขที่ออกจากระบบ", + "vector-anon-user-menu-pages-learn": "เรียนรู้เพิ่มเติม", + "vector-anon-user-menu-pages-label": "เรียนรู้เพิ่มเกี่ยวกับการแก้ไข", + "vector-main-menu-tooltip": "เมนูหลัก", + "vector-toc-menu-tooltip": "สารบัญ", + "vector-site-nav-label": "ไซต์", + "vector-main-menu-label": "เมนูหลัก", + "vector-page-tools-label": "เครื่องมือ", + "vector-page-tools-general-label": "ทั่วไป", + "vector-page-tools-actions-label": "การกระทำ", + "vector-pin-element-label": "ย้ายเมนูไปที่แถบด้านข้าง", + "vector-unpin-element-label": "ซ่อน", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|อภิปราย]]", + "tooltip-vector-anon-user-menu-title": "ตัวเลือกเพิ่มเติม", + "vector-prefs-limited-width": "เปิดใช้งานโหมดจำกัดความกว้าง", + "vector-prefs-limited-width-help": "เปิดใช้งานโหมดจำกัดความกว้างสำหรับประสบการณ์อ่านที่ดีขึ้น", + "empty-language-selector-body": "ไม่รองรับเนื้อหาของหน้าในภาษาอื่น" +} diff --git a/Vector/i18n/ti.json b/Vector/i18n/ti.json new file mode 100644 index 0000000..366ef05 --- /dev/null +++ b/Vector/i18n/ti.json @@ -0,0 +1,40 @@ +{ + "@metadata": { + "authors": [ + "Joanmp17" + ] + }, + "skinname-vector": "ቨክተር", + "vector-opt-out": "ናብ ናይ ቀደም ትርኢት ለውጥ", + "vector-languages": "ቋንቋታት", + "vector-language-button-label": "{{PLURAL:$1|$1 ቋንቋ|$1 ቋንቋታት}}", + "vector-no-language-button-label": "ቋንቋታት ወስኽ", + "vector-action-addsection": "ክፋል ወስኽ", + "vector-action-delete": "ሰርዝ", + "vector-action-move": "ኣንቀሳቕስ", + "vector-action-protect": "ሓልው", + "vector-action-unprotect": "ሓለዋ ለውጥ", + "vector-view-create": "ፍጠር", + "vector-view-edit": "ኣመዓራርይ", + "vector-view-history": "ታሪኽ ርኣይ", + "vector-view-view": "ኣንብብ", + "vector-view-viewsource": "ኮድ ርኣይ", + "vector-jumptonavigation": "ናብ ዳህሳስ ኪድ", + "vector-jumptosearch": "ናብ ምድላይ ኪድ", + "vector-jumptocontent": "ናብ ትሕዝቶ ኪድ", + "vector-more-actions": "ተወሳኺ", + "vector-toc-label": "ትሕዝቶታት", + "vector-toc-beginning": "መጀመርታ", + "vector-anon-user-menu-pages-learn": "ተወሳኺ ሓበሬታ", + "vector-anon-user-menu-pages-label": "ብዛዕባ ኣርትዖት ዝያዳ ሓበሬታ ርኸብ", + "vector-main-menu-tooltip": "ቀንዲ መምረጺ", + "vector-toc-menu-tooltip": "ሰሌዳ ትሕዝቶታት", + "vector-main-menu-label": "ቀንዲ መምረጺ", + "vector-page-tools-label": "መሳርሒታት", + "vector-page-tools-general-label": "ሓፈሻዊ", + "vector-page-tools-actions-label": "ተግባራት", + "vector-pin-element-label": "ናብ ጎድናዊ ሽራጥ ኣንቀሳቕስ", + "vector-unpin-element-label": "ሕባእ", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|ምይይጥ]]", + "tooltip-vector-anon-user-menu-title": "ተወሳኺ ኣማራጽታት" +} diff --git a/Vector/i18n/tk.json b/Vector/i18n/tk.json new file mode 100644 index 0000000..5871739 --- /dev/null +++ b/Vector/i18n/tk.json @@ -0,0 +1,44 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Hanberke", + "TayfunEt." + ] + }, + "vector-opt-out": "Köne görnüşe geçiň", + "vector-languages": "Diller", + "vector-language-button-label": "{{PLURAL:$1|$1 Dil}}", + "vector-no-language-button-label": "Dil goşuň", + "vector-no-language-button-aria-label": "Bu makala diňe şu dilde bar. Makalany başga diller üçin goşuň", + "vector-language-redirect-to-top": "Bu {{SITENAME}} saýtynda diller ýokarda, makala adynyň ýanynda. [[#p-lang-btn|Ýokary git]].", + "vector-language-variant-switcher-label": "Dil görnüşini üýtgediň", + "vector-action-addsection": "Mowzuk goş", + "vector-action-delete": "Öçür", + "vector-action-move": "Adyny üýtget", + "vector-action-protect": "Goraga al", + "vector-action-undelete": "Öçürmäni yzyna al", + "vector-action-unprotect": "Goragy üýtget", + "vector-view-create": "Döret", + "vector-view-edit": "Düzet", + "vector-view-history": "Taryhy gör", + "vector-view-view": "Oka", + "vector-view-viewsource": "Çeşmäni gör", + "vector-jumptonavigation": "Nawigasiýa geçiň", + "vector-jumptosearch": "Gözleg geçiň", + "vector-jumptocontent": "Mazmuna geçiň", + "vector-more-actions": "Has köp", + "vector-searchsuggest-containing": "Içindäki sahypalary gözläň $1", + "vector-toc-label": "Mazmuny", + "vector-toc-beginning": "Başlangyç", + "vector-anon-user-menu-pages-learn": "köpräk oka", + "vector-anon-user-menu-pages-label": "Redaktirlemek barada has giňişleýin öwreniň", + "vector-main-menu-tooltip": "Esasy menýu", + "vector-toc-menu-tooltip": "Mazmuny", + "vector-toc-collapsible-button-label": "Mazmunyň tablisasyny üýtgediň", + "vector-site-nav-label": "Saýt", + "vector-main-menu-label": "Esasy menýu", + "vector-page-tools-label": "Gurallar", + "vector-unpin-element-label": "gizle", + "tooltip-vector-anon-user-menu-title": "Has köp wariant" +} diff --git a/Vector/i18n/tl.json b/Vector/i18n/tl.json new file mode 100644 index 0000000..8208573 --- /dev/null +++ b/Vector/i18n/tl.json @@ -0,0 +1,68 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "AnakngAraw", + "GinawaSaHapon", + "Ianlopez1115", + "Jojit fb", + "Sky Harbor" + ] + }, + "skinname-vector": "Legacy na Vector (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "Nagbibigay ng 2 skin o pabalat ng Vector:\n* 2011 - Ang Makabagong bersyon ng MonoBook na may bagong itsura at maraming pagpapabuti sa usabilidad.\n* 2022 - Kasama ang paggawa ng Vector sa proyektong [[mw:Desktop Improvements|Pagpapabuti sa Desktop]] ng WMF.", + "prefs-vector-enable-vector-1-label": "Gamitin ang Legacy na Vector", + "prefs-vector-enable-vector-1-help": "Sa susunod na ilang taon, unti-unti naming babaguhin ang skin ng Vector. Pinapahitunlot ng Legacy na Vector na tingnan ang lumang bersyon ng Vector (mula noong Disyembre 2019). Upang matuto nang higit pa tungkol sa mga binago, pumunta sa aming [[mw:Reading/Web/Desktop_Improvements|pahina ng proyekto]].", + "vector-opt-out": "Bumalik sa lumang itsura", + "vector-opt-out-tooltip": "Palitan ang iyong mga kagustuhan upang makabalik sa lumang itsura ng skin o pabalat (legacy na Vector)", + "vector.css": "/* Ang lahat ng CSS dito ay ikakarga para sa mga tagagamit ng pabalat na Vector */", + "vector.js": "/* Ang lahat ng JavaScript dito ay ikakarga para sa mga tagagamit ng pabalat na Vector */", + "vector-action-toggle-sidebar": "Ipakita/itago ang sidebar", + "vector-languages": "Mga wika", + "vector-language-button-aria-label": "Pumunta sa isang artikulo na nakasulat sa ibang wika. Mayroon ito sa $1 (na) wika", + "vector-language-button-label": "{{PLURAL:$1|$1 wika|$1 (na) wika}}", + "vector-no-language-button-label": "Magdagdag ng wika", + "vector-no-language-button-aria-label": "Mayroon lamang ang artikulong ito sa wikang ito. Idagdag ang artikulo sa ibang mga wika", + "vector-language-redirect-to-top": "Sa {{SITENAME}} na ito, ang mga link ng wika ay nasa itaas ng pahina sa may bandang pamagat ng artikulo. [[#p-lang-btn|Pumunta sa itaas]].", + "vector-language-variant-switcher-label": "Ibahin ang baryante o variant ng wika", + "vector-action-addsection": "Magdagdag ng paksa", + "vector-action-delete": "Burahin", + "vector-action-move": "Ilipat", + "vector-action-protect": "Protektahan", + "vector-action-undelete": "Alisin ang pagbubura", + "vector-action-unprotect": "Baguhin ang proteksyon", + "vector-view-create": "Gawin", + "vector-view-edit": "Baguhin", + "vector-view-history": "Tingnan ang kasaysayan", + "vector-view-view": "Basahin", + "vector-view-viewsource": "Tingnan ang wikitext", + "vector-jumptonavigation": "Pumunta sa nabigasyon", + "vector-jumptosearch": "Pumunta sa paghahanap", + "vector-jumptocontent": "Pumunta sa nilalaman", + "vector-more-actions": "Higit pa", + "vector-search-loader": "Kinakarga ang mga minunungkahing mahahanap", + "vector-searchsuggest-containing": "Maghanap ng mga pahinang may $1", + "vector-intro-page": "Wikipedia:Maligayang pagdating!", + "vector-toc-label": "Mga nilalaman", + "vector-toc-beginning": "Simula", + "vector-toc-toggle-button-label": "Ipakita/Itago ang subseksyon na $1", + "vector-anon-user-menu-pages": "Mga pahina para sa naka-logout na mga patnugot o editor", + "vector-anon-user-menu-pages-learn": "alamin pa", + "vector-anon-user-menu-pages-label": "Alamin pa ang tungkol sa pagpapatnugot", + "vector-main-menu-tooltip": "Pangunahing pagpipilian", + "vector-toc-menu-tooltip": "Talaan ng mga Nilalaman", + "vector-toc-collapsible-button-label": "Itago/Ipakita ang talaan ng mga nilalaman", + "vector-site-nav-label": "Sayt", + "vector-main-menu-label": "Pangunahing pagpipilian", + "vector-page-tools-label": "Mga kagamitan", + "vector-page-tools-general-label": "Pangkalahatan", + "vector-page-tools-actions-label": "Mga aksyon", + "vector-pin-element-label": "ilipat sa gilid", + "vector-unpin-element-label": "itago", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Usapan]]", + "tooltip-vector-anon-user-menu-title": "Marami pang pagpipilian", + "vector-prefs-limited-width": "Paganahin ang limitadong lapad", + "vector-prefs-limited-width-help": "Paganahin ang limitadong lapad para sa pinabuting karanasan sa pagbabasa." +} diff --git a/Vector/i18n/tly.json b/Vector/i18n/tly.json new file mode 100644 index 0000000..79ce33c --- /dev/null +++ b/Vector/i18n/tly.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ganbarzada", + "Patriot Kor", + "Patriot Kur", + "Гусейн" + ] + }, + "vector-skin-desc": "Bo rec žəj 2 gylə vektorə myžori dojdəː\n* 2011: ''Ysətnəni'' — MonoBook versijə de nujə kardə byə reci ijən de ištirokəkon pije xəjrinə cijon.\n* 2022: ''Vektorə'' — WMF «[[mw:Desktop Improvements]]» projektədə soxtə byə.", + "prefs-vector-enable-vector-1-label": "Vektor versijə oko doj", + "prefs-vector-enable-vector-1-help": "Omə soronədə əmə \"Vektorə\" myžori nujə bəkardemon. Ce \"Vekrorə\" reci navynə versijə ct \"Vekrorə\" reci kanə versijə vinde bədo (aktuale bə 2019 sori dekabrə mangi). Nujətijon barədə ve umute dvvardən bə [[mw:Reading/Web/Desktop_Improvements|cəmə projekti səhifə]].", + "vector-opt-out": "Bə kanə dizajni dəvarde", + "vector-opt-out-tooltip": "Səbəro ovaxte by kanə versijə dizajni dəvarde (kanə Vektor)", + "vector-action-toggle-sidebar": "Kəno paneli nišo doj", + "vector-languages": "Zyvonon", + "vector-language-button-aria-label": "Bə məǧolə čo zyvonədə dəvarde. Dastrəse bə {{PLURAL:$1|$1 zyvonədə|$1 zyvononədə}}", + "vector-language-button-label": "{{PLURAL:$1|$1 zzvon|$1 zzvonon}}", + "vector-no-language-button-label": "Zyvonon əlovə karde", + "vector-no-language-button-aria-label": "Ym məǧolə iglə by zyvonədə heste. Bo čo zyvonon məǧolə əlovə bykənən", + "vector-language-variant-switcher-label": "Zyvoni varianti ovaxte", + "vector-action-addsection": "Myžori əlovə karde", + "vector-action-delete": "Mole", + "vector-action-move": "Nomi ovaxte", + "vector-action-protect": "Mydofiə karde", + "vector-action-undelete": "Bərpo kardej", + "vector-action-unprotect": "Mydofijə ovaxte", + "vector-view-create": "Soxtej", + "vector-view-edit": "Sərost kardej", + "vector-view-history": "Tarixi dijə bykə", + "vector-view-view": "Bıhánd", + "vector-view-viewsource": "Səvoni dijə karde", + "vector-jumptonavigation": "Bə navigasijə dəvarde", + "vector-jumptosearch": "Bə nəve dəvarde", + "vector-jumptocontent": "Bə mətni dəvarde", + "vector-more-actions": "Hənijən", + "vector-search-loader": "Iglə nəvə tovsijon əlovə kardə bejdən", + "vector-searchsuggest-containing": "Səhifon nəve končo heste $1", + "vector-intro-page": "Help:Navsyxan", + "vector-toc-label": "Myndəričot", + "vector-toc-beginning": "Bino", + "vector-toc-toggle-button-label": "Nišo doj/Nijo karde žinə ǧysmədə $1", + "vector-anon-user-menu-pages": "Səhifon bo ǧejd nybə sərost kardəkəson", + "vector-anon-user-menu-pages-learn": "ve umute", + "vector-anon-user-menu-pages-label": "Sərost kardej barədə hande", + "vector-main-menu-tooltip": "Asosa menyu", + "vector-toc-menu-tooltip": "Myndəričot", + "vector-toc-collapsible-button-label": "Myndəričoti nijo/nišo karde", + "vector-site-nav-label": "Sajt", + "vector-main-menu-label": "Əsosə menju", + "vector-limited-width-toggle": "Kontenti məhdudə hovuži ovaxte", + "vector-page-tools-label": "Diləgon", + "vector-page-tools-general-label": "Umumi", + "vector-page-tools-actions-label": "Hərəkəton", + "vector-pin-element-label": "bə kəno paneli dəvarde", + "vector-unpin-element-label": "nijo karde", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|No-pegət]]", + "tooltip-vector-anon-user-menu-title": "Ve imkonon", + "vector-prefs-limited-width": "Məhdud kardə byə hovuži režimi pekarde", + "vector-prefs-limited-width-help": "Məhdud kardə byə hovuži režimi pekən bo handə səryštə təkmil karde", + "empty-language-selector-body": "Səhifə myndəričot dastrəs ni bə čo zyvononədə." +} diff --git a/Vector/i18n/tn.json b/Vector/i18n/tn.json new file mode 100644 index 0000000..92ff659 --- /dev/null +++ b/Vector/i18n/tn.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Rebelagent" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 teme|$1 diteme}}", + "vector-action-addsection": "Tsenya Setlhogo", + "vector-action-delete": "Sutlha", + "vector-action-move": "Sutisa", + "vector-action-protect": "Sireletsa", + "vector-view-create": "Dira", + "vector-view-edit": "Fetola", + "vector-view-history": "Bona Segologolo", + "vector-view-view": "Bala", + "vector-more-actions": "Bontsi", + "vector-searchsuggest-containing": "Batla ditsebe tse di naleng $1", + "vector-page-tools-label": "Didirisiwa" +} diff --git a/Vector/i18n/tok.json b/Vector/i18n/tok.json new file mode 100644 index 0000000..3ceac85 --- /dev/null +++ b/Vector/i18n/tok.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Gtbot2007", + "Keenan Pepper", + "LesVisages", + "Robin van der Vliet", + "Tbodt", + "שוקו מוקה", + "20kdc", + "Frzzl" + ] + }, + "vector-languages": "toki", + "vector-language-button-label": "toki $1", + "vector-no-language-button-label": "o sin e lipu toki", + "vector-action-addsection": "o pana e ijo toki sin", + "vector-action-delete": "o weka", + "vector-action-move": "o ante e nimi", + "vector-action-protect": "o awen", + "vector-view-create": "o pali", + "vector-view-edit": "o ante", + "vector-view-history": "o lukin e tenpo pini", + "vector-view-view": "o lukin", + "vector-more-actions": "ante", + "vector-searchsuggest-containing": "o alasa e lipu ni: lipu li jo insa e $1", + "vector-toc-beginning": "open", + "vector-page-tools-label": "ilo", + "vector-unpin-element-label": "o len" +} diff --git a/Vector/i18n/tpi.json b/Vector/i18n/tpi.json new file mode 100644 index 0000000..182aa9a --- /dev/null +++ b/Vector/i18n/tpi.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Iketsi", + "Wantok" + ] + }, + "vector-action-delete": "Rausim", + "vector-action-move": "Surikim", + "vector-action-protect": "Tambuim", + "vector-view-create": "Kirapim", + "vector-view-edit": "Senisim", + "vector-view-history": "Ol senis", + "vector-view-view": "Rit", + "vector-view-viewsource": "Lukim as tok" +} diff --git a/Vector/i18n/tr.json b/Vector/i18n/tr.json new file mode 100644 index 0000000..4f636df --- /dev/null +++ b/Vector/i18n/tr.json @@ -0,0 +1,80 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Arystanbek", + "BaRaN6161 TURK", + "Betseg", + "Cobija", + "Emperyan", + "Hedda", + "Jelican9", + "Joseph", + "Kumkumuk", + "MuratTheTurkish", + "Rapsar", + "Sadrettin", + "SaldırganSincap", + "Sayginer", + "Stultiwikia", + "ToprakM", + "Vito Genovese" + ] + }, + "skinname-vector": "Eski Vektör (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "2 Vector görünümleri sağlar:\n* 2011 - MonoBook'un yeni görünümü ve birçok kullanılabilirlik geliştirmesiyle Modern versiyonu.\n* 2022 - Vector, WMF [[mw:Desktop Improvements|mw:Masaüstü İyileştirmeleri]] projesinin bir parçası olarak oluşturuldu.", + "prefs-vector-enable-vector-1-label": "Eski Vektörü Kullan", + "prefs-vector-enable-vector-1-help": "Önümüzdeki birkaç yıl içinde Vektör görünümünü kademeli olarak güncelleyeceğiz. Eski Vektörün eski sürümünü görüntülemenize izin verir (Aralık 2019 itibariyle). Güncellemeler hakkında daha fazla bilgi için [[mw:Reading/Web/Desktop_Improvements|proje sayfamıza]] gidin.", + "vector-opt-out": "Eski görünüme geç", + "vector-opt-out-tooltip": "Görünümün eski görünümüne geri dönmek için ayarlarınızı değiştirin (eski Vektör)", + "vector-action-toggle-sidebar": "Kenar çubuğunu aç/kapat", + "vector-languages": "Diller", + "vector-language-button-aria-label": "Başka bir dildeki sayfaya gidin. {{PLURAL:$1|$1 dilde}} mevcut", + "vector-language-button-label": "$1 dil", + "vector-no-language-button-label": "Dil ekle", + "vector-no-language-button-aria-label": "Bu madde yalnızca bu dilde mevcuttur. Maddeyi diğer dillere ekleyin", + "vector-language-redirect-to-top": "Bu {{SITENAME}} sürümündeki dil bağlantıları sayfanın en yukarısında, madde başlığının sağ tarafında yer alıyor. [[#p-lang-btn|Yukarı gidin]].", + "vector-language-variant-switcher-label": "Dil varyantını değiştir", + "vector-action-addsection": "Konu ekle", + "vector-action-delete": "Sil", + "vector-action-move": "Taşı", + "vector-action-protect": "Koru", + "vector-action-undelete": "Geri al", + "vector-action-unprotect": "Korumayı değiştir", + "vector-view-create": "Oluştur", + "vector-view-edit": "Değiştir", + "vector-view-history": "Geçmişi gör", + "vector-view-view": "Oku", + "vector-view-viewsource": "Kaynağı gör", + "vector-jumptonavigation": "Gezinti kısmına atla", + "vector-jumptosearch": "Arama kısmına atla", + "vector-jumptocontent": "İçeriğe atla", + "vector-more-actions": "Daha fazla", + "vector-search-loader": "Arama önerileri yükleniyor", + "vector-searchsuggest-containing": "$1 içeren sayfaları ara", + "vector-intro-page": "Help:Giriş", + "vector-toc-label": "İçindekiler", + "vector-toc-beginning": "Giriş", + "vector-toc-toggle-button-label": "$1 alt bölümünü aç/kapa", + "vector-anon-user-menu-pages": "Çıkış yapmış editörler için sayfalar", + "vector-anon-user-menu-pages-learn": "daha fazla bilgi", + "vector-anon-user-menu-pages-label": "Değişiklik yapma hakkında daha fazla bilgi edinin", + "vector-main-menu-tooltip": "Ana menü", + "vector-toc-menu-tooltip": "İçindekiler", + "vector-toc-collapsible-button-label": "İçindekiler tablosunu değiştir", + "vector-site-nav-label": "Site", + "vector-main-menu-label": "Ana menü", + "vector-limited-width-toggle": "Sınırlı içerik genişliğini değiştir", + "vector-page-tools-label": "Araçlar", + "vector-page-tools-general-label": "Genel", + "vector-page-tools-actions-label": "Eylemler", + "vector-pin-element-label": "kenar çubuğuna taşı", + "vector-unpin-element-label": "gizle", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Tartışma]]", + "tooltip-vector-anon-user-menu-title": "Daha fazla seçenek", + "vector-prefs-limited-width": "Sınırlı genişlik modunu etkinleştir", + "vector-prefs-limited-width-help": "Gelişmiş okuma deneyimi için sınırlı genişlik modunu etkinleştirin.", + "empty-language-selector-body": "Sayfa içeriği diğer dillerde desteklenmemektedir." +} diff --git a/Vector/i18n/tru.json b/Vector/i18n/tru.json new file mode 100644 index 0000000..1949f25 --- /dev/null +++ b/Vector/i18n/tru.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Ariyo" + ] + }, + "vector-action-addsection": "Maḥat Fusoqo ḥaṭo", + "vector-action-delete": "Slag", + "vector-action-move": "Mtaxar", + "vector-action-protect": "Mastar", + "vector-view-create": "Xlaq", + "vector-view-edit": "Mşaḥlaf", + "vector-view-history": "Maktabzabno", + "vector-view-view": "Qray", + "vector-view-viewsource": "Maḥway li aMabu³e." +} diff --git a/Vector/i18n/trv.json b/Vector/i18n/trv.json new file mode 100644 index 0000000..155dd01 --- /dev/null +++ b/Vector/i18n/trv.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Akamycoco", + "Iyuqciyang" + ] + }, + "vector-action-addsection": "kari mnrana", + "vector-action-delete": "wada srsan", + "vector-action-move": "Hdlun", + "vector-action-protect": "pnklawa", + "vector-view-create": "Phiyug", + "vector-view-edit": "Smmalu patas", + "vector-view-history": "Patas endaan qmita", + "vector-view-view": "Smpug patas", + "vector-view-viewsource": "ida nkiya patas sspgan ka qtai", + "vector-more-actions": "Knlala" +} diff --git a/Vector/i18n/ts.json b/Vector/i18n/ts.json new file mode 100644 index 0000000..c00b029 --- /dev/null +++ b/Vector/i18n/ts.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Thuvack" + ] + }, + "vector-action-addsection": "Veka nholoko ya mhaka", + "vector-action-delete": "Sula", + "vector-action-move": "Yi sa kunwana", + "vector-action-protect": "Sirhelela", + "vector-action-undelete": "Cinca kusula", + "vector-action-unprotect": "Cinca kusirhelela", + "vector-view-create": "Tumbuluxa", + "vector-view-edit": "Lulamisa", + "vector-view-history": "Languta matimu", + "vector-view-view": "Hlaya", + "vector-view-viewsource": "Languta xihlovo" +} diff --git a/Vector/i18n/tt-cyrl.json b/Vector/i18n/tt-cyrl.json new file mode 100644 index 0000000..32272b6 --- /dev/null +++ b/Vector/i18n/tt-cyrl.json @@ -0,0 +1,51 @@ +{ + "@metadata": { + "authors": [ + "Derslek", + "Don Alessandro", + "Rinatus", + "Ерней", + "Ильгиз", + "Ильнар", + "Рашат Якупов" + ] + }, + "skinname-vector": "Сызымлы, иске (2010)", + "skinname-vector-2022": "Сызымлы (2022)", + "vector-specialversion-name": "Сызымлы", + "vector-skin-desc": "Хәзерге заманга туры килгән MonoBook күренеше, яңа бизәлеш һәм яңа мөмкинлекләр", + "vector-opt-out": "Иске дизайнга кайту", + "vector-languages": "Телләр", + "vector-language-button-label": "{{PLURAL:$1|$1 тел}}", + "vector-no-language-button-label": "Телләр өстәү", + "vector-language-redirect-to-top": "Бу сайтта тел сылтамаларын битнең югары өлешендә, мәкалә исеме янында, табарга була. [[#p-lang-btn|Өскә кайту]].", + "vector-language-variant-switcher-label": "Телне алмаштыру", + "vector-action-addsection": "Яңа тема өстәү", + "vector-action-delete": "Бетерү", + "vector-action-move": "Күчерү", + "vector-action-protect": "Яклау", + "vector-action-undelete": "Кайтару", + "vector-action-unprotect": "Яклауны үзгәртү", + "vector-view-create": "Төзү", + "vector-view-edit": "Үзгәртү", + "vector-view-history": "Тарихын карау", + "vector-view-view": "Уку", + "vector-view-viewsource": "Чыганагын карау", + "vector-jumptonavigation": "Навигациягә күчү", + "vector-jumptosearch": "Эзләүгә күчү", + "vector-jumptocontent": "Эчтәлеккә күчү", + "vector-more-actions": "Тагын", + "vector-searchsuggest-containing": "$1 ны үз эченә алган битләрне эзләү", + "vector-intro-page": "Help:Кереш", + "vector-toc-label": "Эчтәлек", + "vector-toc-beginning": "Башы", + "vector-anon-user-menu-pages-learn": "күбрәк белү", + "vector-main-menu-tooltip": "Төп меню", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Төп меню", + "vector-page-tools-label": "Кораллар", + "vector-page-tools-general-label": "Гомуми", + "vector-page-tools-actions-label": "Гамәлләр", + "vector-unpin-element-label": "яшерү", + "empty-language-selector-body": "Битнең эчтәлекләре башка телләрдә бирелми." +} diff --git a/Vector/i18n/tt-latn.json b/Vector/i18n/tt-latn.json new file mode 100644 index 0000000..f4a9710 --- /dev/null +++ b/Vector/i18n/tt-latn.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Don Alessandro", + "Frhdkazan", + "TayfunEt." + ] + }, + "skinname-vector": "Sızımlı", + "vector-languages": "Tellär", + "vector-action-addsection": "Yaña tema östäw", + "vector-action-delete": "Beterü", + "vector-action-move": "Küçerü", + "vector-action-protect": "Yaqlaw", + "vector-action-undelete": "Qaytaru", + "vector-action-unprotect": "Yaqlawnı beterü", + "vector-view-create": "Tözü", + "vector-view-edit": "Üzgärtü", + "vector-view-history": "Tarixın qaraw", + "vector-view-view": "Uqu", + "vector-view-viewsource": "Çığanağın qaraw", + "vector-more-actions": "Başqalar", + "vector-page-tools-label": "Qorallar", + "vector-unpin-element-label": "yäşerü" +} diff --git a/Vector/i18n/tum.json b/Vector/i18n/tum.json new file mode 100644 index 0000000..de362cc --- /dev/null +++ b/Vector/i18n/tum.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Tumbuka Arch" + ] + }, + "vector-languages": "Viyowoyelo", + "vector-language-button-label": "{{PLURAL:$1|$1 chiyowoyelo|$1 viyowoyelo}}", + "vector-no-language-button-label": "Sazgapo viyowoyelo", + "vector-action-addsection": "Sazgapo mutu", + "vector-action-delete": "Fufuta", + "vector-action-move": "Ithya", + "vector-view-create": "Yata", + "vector-view-edit": "Lemba", + "vector-view-history": "Wona mayambilo", + "vector-view-view": "Ŵelenga", + "vector-more-actions": "Vinandi", + "vector-searchsuggest-containing": "Fufuza ma jani agho muli $1", + "vector-page-tools-label": "Vilwelo", + "vector-page-tools-general-label": "Vya masiku ghose", + "vector-unpin-element-label": "kubisa" +} diff --git a/Vector/i18n/tw.json b/Vector/i18n/tw.json new file mode 100644 index 0000000..50ddfb2 --- /dev/null +++ b/Vector/i18n/tw.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "AC Krah", + "Amire80", + "Robertjamal12", + "Warmglow" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 kasa|$1 kasa ahorow}}", + "vector-language-redirect-to-top": "Wɔ {{SITENAME}} kasa links nu wɔ suro biaɛ a krataa no din titiriw no wɔ [[#p-lang-btn|Go to top]]", + "vector-action-addsection": "Fa atifi asɛm ka ho", + "vector-action-delete": "Pepa", + "vector-action-move": "Yi kɔ bɛbi foforo", + "vector-action-protect": "Bammɔ", + "vector-view-create": "Create", + "vector-view-edit": "Sesa", + "vector-view-history": "Hwɛ abakɔsɛm", + "vector-view-view": "Kenkan", + "vector-more-actions": "Pii", + "vector-unpin-element-label": "fa sie" +} diff --git a/Vector/i18n/tyv.json b/Vector/i18n/tyv.json new file mode 100644 index 0000000..ace7d9f --- /dev/null +++ b/Vector/i18n/tyv.json @@ -0,0 +1,33 @@ +{ + "@metadata": { + "authors": [ + "Agilight", + "Riverman", + "Sborsody", + "Монгуш Салим", + "Karak-Kyzyl" + ] + }, + "skinname-vector": "Вектор", + "vector-languages": "Дылдар", + "vector-language-button-label": "{{PLURAL:$1|$1 дыл}}", + "vector-no-language-button-label": "Дылдар немээр", + "vector-action-addsection": "Тема немээр", + "vector-action-delete": "Казыыр", + "vector-action-move": "Өскээр адаар", + "vector-action-protect": "Камгалаары", + "vector-action-undelete": "Эгидер", + "vector-action-unprotect": "Камгалалды өскертири", + "vector-view-create": "Чаяар", + "vector-view-edit": "Эдер", + "vector-view-history": "Төөгүнү көөр", + "vector-view-view": "Номчуур", + "vector-view-viewsource": "Дөзү бижиин көөрү", + "vector-more-actions": "Оон", + "vector-searchsuggest-containing": "Мындыг чүүлдерлиг арыннарны дилээри: $1", + "vector-toc-label": "Ишти", + "vector-toc-beginning": "Эгези", + "vector-page-tools-label": "Херекселдер", + "vector-page-tools-general-label": "Ниити", + "vector-unpin-element-label": "чажырар" +} diff --git a/Vector/i18n/tzm.json b/Vector/i18n/tzm.json new file mode 100644 index 0000000..173d426 --- /dev/null +++ b/Vector/i18n/tzm.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Hakim1bal", + "Moha", + "Mohamed Belarhzali", + "Tifinaghes", + "ⵕⴰⵊⵉ" + ] + }, + "skinname-vector": "Vector", + "vector-action-addsection": "ⵔⵏⵓ ⴰⵙⵏⵜⵍ", + "vector-action-delete": "Kkes", + "vector-action-move": "ⵙⵎⵓⵜⵜⵉ", + "vector-action-undelete": "ⵙⵙⵓⵖⴰⵍ ⵓⴽⵓⵙ", + "vector-action-unprotect": "ⴱⴷⴷⴻⵍ ⵜⴰⵙⵜⴰⵏⵜ", + "vector-view-create": "Senflul", + "vector-view-edit": "Senfel", + "vector-view-history": "Ẓeṛ amezruy", + "vector-view-view": "Γer", + "vector-view-viewsource": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ", + "vector-more-actions": "Uggar" +} diff --git a/Vector/i18n/udm.json b/Vector/i18n/udm.json new file mode 100644 index 0000000..0fe1b97 --- /dev/null +++ b/Vector/i18n/udm.json @@ -0,0 +1,36 @@ +{ + "@metadata": { + "authors": [ + "Andrewboltachev", + "Kaganer", + "Kotwys", + "Wadorgurt", + "Света Поторочина", + "Udmwiki" + ] + }, + "skinname-vector": "Вектор", + "vector-opt-out": "Вуж тусэ берытсконо", + "vector-languages": "Кылъёс", + "vector-language-button-label": "{{PLURAL:$1|$1 кыл}}", + "vector-no-language-button-label": "Кылъёсты ватсан", + "vector-action-addsection": "Выль тема ватсано", + "vector-action-delete": "Ӵушоно", + "vector-action-move": "Выжтоно", + "vector-action-protect": "Утёно", + "vector-view-create": "Кылдытоно", + "vector-view-edit": "Тупатоно", + "vector-view-history": "Историзэ учконо", + "vector-view-view": "Лыдӟоно", + "vector-view-viewsource": "Кылдэмез сярысь тодэтсэ учконо", + "vector-jumptonavigation": "Навигация доры потоно", + "vector-jumptosearch": "Утчан доры потоно", + "vector-jumptocontent": "Пуштрос доры потоно", + "vector-more-actions": "Эшшо", + "vector-searchsuggest-containing": "Утчано бамъёсты, кудъёсаз вань $1", + "vector-toc-label": "Пуштросэз", + "vector-toc-beginning": "Кутскон", + "vector-page-tools-label": "Тӥрлык", + "vector-page-tools-general-label": "Огъя", + "vector-unpin-element-label": "адсконтэм кароно" +} diff --git a/Vector/i18n/ug-arab.json b/Vector/i18n/ug-arab.json new file mode 100644 index 0000000..e8a0873 --- /dev/null +++ b/Vector/i18n/ug-arab.json @@ -0,0 +1,34 @@ +{ + "@metadata": { + "authors": [ + "Arlin", + "Sahran", + "Tel'et", + "Uzdil" + ] + }, + "skinname-vector": "Vector", + "vector.css": "/* CSS placed here will affect users of the Vector skin */", + "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */", + "vector-languages": "تىللار", + "vector-language-button-label": "{{PLURAL:$1|$1 تىل}}", + "vector-no-language-button-label": "تىل قوش", + "vector-action-addsection": "يېڭى تېما قوش", + "vector-action-delete": "ئۆچۈر", + "vector-action-move": "يۆتكە", + "vector-action-protect": "قوغدا", + "vector-action-undelete": "ئەسلىگە قايتۇر", + "vector-action-unprotect": "قوغداش ئۆزگەرت", + "vector-view-create": "قۇر", + "vector-view-edit": "تەھرىرلەش", + "vector-view-history": "تارىخ كۆرسەت", + "vector-view-view": "ئوقۇ", + "vector-view-viewsource": "مەنبەنى كۆرسەت", + "vector-more-actions": "تېخىمۇ كۆپ", + "vector-searchsuggest-containing": "$1 نى ئۆز ئىچىگە ئالغان بەتلەرنى ئىزدە", + "vector-toc-label": "مەزمۇنلار", + "vector-toc-beginning": "كىرىش سۆز", + "vector-page-tools-label": "قوراللار", + "vector-page-tools-general-label": "ئادەتتىكى", + "vector-unpin-element-label": "يوشۇر" +} diff --git a/Vector/i18n/uk.json b/Vector/i18n/uk.json new file mode 100644 index 0000000..213cfdf --- /dev/null +++ b/Vector/i18n/uk.json @@ -0,0 +1,80 @@ +{ + "@metadata": { + "authors": [ + "AS", + "Ahonc", + "Amire80", + "Base", + "Calak", + "DDPAT", + "Dim Grits", + "Ice bulldog", + "Movses", + "NickK", + "Piramidion", + "Prima klasy4na", + "VoidWanderer", + "Ата", + "Пан Хаунд", + "Тест" + ] + }, + "skinname-vector": "Старий вектор (2010)", + "skinname-vector-2022": "Вектор (2022)", + "vector-specialversion-name": "Вектор", + "vector-skin-desc": "Надає дві теми Vector:\n* 2011 — Сучасна версія MonoBook зі свіжим виглядом і багатьма зручними покращеннями.\n* 2022 — Vector, розроблений у рамках проєкту ФВМ зі [[mw:Desktop Improvements|стаціонарних покращень]].", + "prefs-vector-enable-vector-1-label": "Використовувати стару версію", + "prefs-vector-enable-vector-1-help": "Протягом наступних декількох років ми поступово оновлюватимемо тему оформлення «Векторне». Стара версія цього оформлення дозволить вам бачити його таким, яким воно було станом на грудень 2019 року. Щоб дізнатись більше про ці оновлення, відвідайте нашу [[mw:Reading/Web/Desktop_Improvements|сторінку проєкту]].", + "vector-opt-out": "Перемкнутися на старий вигляд", + "vector-opt-out-tooltip": "Змінити ваші налаштування щоб повернутись до оформлення Вектор", + "vector.css": "/* Увесь CSS-код буде завантажений в темі оформлення Векторне */", + "vector.js": "/* Увесь тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */", + "vector-action-toggle-sidebar": "Перемкнути бічну панель", + "vector-languages": "Мови", + "vector-language-button-aria-label": "Перейдіть до статті іншою мовою. Доступний у {{PLURAL:$1|$1 мові|$1 мовах}}", + "vector-language-button-label": "{{PLURAL:$1|$1 мова|$1 мови|$1 мов}}", + "vector-no-language-button-label": "Додати мови", + "vector-no-language-button-aria-label": "Ця стаття існує лише цією мовою. Додайте статтю для інших мов", + "vector-language-redirect-to-top": "Перемикач мовної версії розташований справа від назви статті. [[#p-lang-btn|Перейти]].", + "vector-language-variant-switcher-label": "Змінити варіант мови", + "vector-action-addsection": "Додати тему", + "vector-action-delete": "Вилучити", + "vector-action-move": "Перейменувати", + "vector-action-protect": "Захистити", + "vector-action-undelete": "Відновити", + "vector-action-unprotect": "Зміна захисту", + "vector-view-create": "Створити", + "vector-view-edit": "Редагувати", + "vector-view-history": "Переглянути історію", + "vector-view-view": "Читати", + "vector-view-viewsource": "Переглянути код", + "vector-jumptonavigation": "Перейти до навігації", + "vector-jumptosearch": "Перейти до пошуку", + "vector-jumptocontent": "Перейти до вмісту", + "vector-more-actions": "Ще", + "vector-search-loader": "Завантажуються підказки пошуку", + "vector-searchsuggest-containing": "Знайдіть сторінки, що містять $1", + "vector-intro-page": "Help:Вступ", + "vector-toc-label": "Зміст", + "vector-toc-beginning": "Вступ", + "vector-toc-toggle-button-label": "Перемкнути підрозділ $1", + "vector-anon-user-menu-pages": "Сторінки для редакторів, які не ввійшли в систему", + "vector-anon-user-menu-pages-learn": "дізнатися більше", + "vector-anon-user-menu-pages-label": "Дізнатися більше про редагування", + "vector-main-menu-tooltip": "Головне меню", + "vector-toc-menu-tooltip": "Зміст", + "vector-toc-collapsible-button-label": "Сховати/показати зміст", + "vector-site-nav-label": "Сайт", + "vector-main-menu-label": "Головне меню", + "vector-limited-width-toggle": "Перемкнути ширину вмісту", + "vector-page-tools-label": "Інструменти", + "vector-page-tools-general-label": "Загальний", + "vector-page-tools-actions-label": "Дії", + "vector-pin-element-label": "перемістити на бічну панель", + "vector-unpin-element-label": "сховати", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Обговорення]]", + "tooltip-vector-anon-user-menu-title": "Більше опцій", + "vector-prefs-limited-width": "Увімкнути режим обмеженої ширини", + "vector-prefs-limited-width-help": "Увімкнути режим обмеженої ширини для кращого читання.", + "empty-language-selector-body": "Вміст сторінки не підтримується іншими мовами." +} diff --git a/Vector/i18n/ur.json b/Vector/i18n/ur.json new file mode 100644 index 0000000..3b5df4a --- /dev/null +++ b/Vector/i18n/ur.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "Calak", + "Istabani", + "Muhammad Shuaib", + "Noor2020", + "Obaid Raza", + "Tahir mq", + "عثمان خان شاہ", + "عرفان ارشد", + "محبوب عالم" + ] + }, + "skinname-vector": "ویکٹر قدیم (2010ء)", + "skinname-vector-2022": "ویکٹر (2022ء)", + "vector-specialversion-name": "ویکٹر", + "vector-skin-desc": "مونوبک کا جدید نسخہ (ورژن) مع شائستہ صورت اور کئی افادیت میں بہتریاں", + "prefs-vector-enable-vector-1-label": "قدیم ویکٹر استعمال کریں", + "vector-opt-out": "پرانی وضع پر واپس جائیں", + "vector-action-toggle-sidebar": "بغلی پٹی کو بدلیں", + "vector-languages": "زبانیں", + "vector-language-button-label": "{{PLURAL:$1|$1 زبان|$1 زبانیں}}", + "vector-no-language-button-label": "زبانیں شامل کریں", + "vector-no-language-button-aria-label": "اس زبان میں یہ مضمون موجود نہیں ہے۔ دوسری زبانوں کے مضامین شامل کريں۔", + "vector-language-redirect-to-top": "اس {{SITENAME}} پر دیگر زبانوں کے مضامین کے روابط صفحہ کے اوپر عنوان کے بائیں جانب موجود ہیں۔ [[#p-lang-btn|اوپر جائیں]]۔", + "vector-language-variant-switcher-label": "زبان کا لہجہ بدلیں", + "vector-action-addsection": "نیا موضوع", + "vector-action-delete": "حذف کریں", + "vector-action-move": "منتقل کریں", + "vector-action-protect": "محفوظ کریں", + "vector-action-undelete": "بحال کریں", + "vector-action-unprotect": "حفاظت میں تبدیلی", + "vector-view-create": "تخلیق کریں", + "vector-view-edit": "ترمیم", + "vector-view-history": "تاریخچہ", + "vector-view-view": "مطالعہ", + "vector-view-viewsource": "مسودہ دیکھیے", + "vector-jumptosearch": "خانۂ تلاش میں جائیں", + "vector-jumptocontent": "مندرجات کا رخ کریں", + "vector-more-actions": "مزید", + "vector-search-loader": "تجاویزِ تلاش کھل رہی ہیں", + "vector-intro-page": "Help:تعارف", + "vector-toc-label": "مندرجات", + "vector-toc-beginning": "دیباچہ", + "vector-toc-toggle-button-label": "$1 کے ذیلی قطعہ پر جائیں", + "vector-anon-user-menu-pages-learn": "مزید تفصیلات", + "vector-anon-user-menu-pages-label": "ترمیم کاری کے متعلق مزید تفصیلات", + "vector-main-menu-tooltip": "مرکزی مینو", + "vector-toc-menu-tooltip": "فہرست عناوین", + "vector-toc-collapsible-button-label": "فہرست عناوین دیکھیں", + "vector-site-nav-label": "ویب گاہ", + "vector-main-menu-label": "مرکزی مینو", + "vector-page-tools-label": "آلات", + "vector-page-tools-general-label": "عمومی", + "vector-page-tools-actions-label": "اقدامات", + "vector-pin-element-label": "بغلی پٹی پر جائیں", + "vector-unpin-element-label": "چھپائیں", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|تبادلۂ خیال]]", + "tooltip-vector-anon-user-menu-title": "مزید اختیارات", + "empty-language-selector-body": "صفحے کے مندرجات دوسری زبانوں میں قابل قبول نہیں ہیں۔" +} diff --git a/Vector/i18n/uz.json b/Vector/i18n/uz.json new file mode 100644 index 0000000..3de74d5 --- /dev/null +++ b/Vector/i18n/uz.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "Abdulla", + "Amire80", + "Arystanbek", + "Casual", + "CoderSI", + "Malikxan", + "Nataev", + "Sociologist" + ] + }, + "skinname-vector": "Vektor (2010)", + "skinname-vector-2022": "Vektor (2022)", + "vector-specialversion-name": "Vektor", + "prefs-vector-enable-vector-1-label": "Eski Vektordan foydalanish", + "prefs-vector-enable-vector-1-help": "Keyingi bir necha yil ichida biz Vektor tashqi koʻrinishini asta-sekinlik bilan yangilaymiz. „Eski Vektor“ Vektorning eski versiyasini koʻrishga izn beradi (2019-yil dekabrga koʻra).\nYangilanishlar haqida batafsil maʼlumot uchun [[mw:Reading/Web/Desktop_Improvements|loyiha sahifamizga]] oʻting.", + "vector-opt-out": "Eski koʻrinishiga almashtirish", + "vector-opt-out-tooltip": "Eski tashqi koʻrinishga qaytish uchun sozlamalaringizni oʻzgartiring (eski Vektor)", + "vector-action-toggle-sidebar": "Yonqutini ochish/yopish", + "vector-languages": "Tillar", + "vector-language-button-aria-label": "Boshqa tildagi maqolaga oʻting. {{PLURAL:$1|$1 ta tilda}} mavjud", + "vector-language-button-label": "{{PLURAL:$1|$1 ta til}}", + "vector-no-language-button-label": "Til qoʻshish", + "vector-language-redirect-to-top": "Bu {{SITENAME}}da til havolalari sahifaning eng yuqori qismida, maqola sarlavhasining oʻng tarafida joylashgan. [[#p-lang-btn|Yuqoriga oʻtish]].", + "vector-language-variant-switcher-label": "Til variantini oʻzgartirish", + "vector-action-addsection": "Mavzu qoʻshish", + "vector-action-delete": "Oʻchirish", + "vector-action-move": "Koʻchirish", + "vector-action-protect": "Himoyalash", + "vector-action-undelete": "Tiklash", + "vector-action-unprotect": "Himoyani oʻzgartirish", + "vector-view-create": "Yaratish", + "vector-view-edit": "Tahrirlash", + "vector-view-history": "Tarix", + "vector-view-view": "Mutolaa", + "vector-view-viewsource": "Manbasini koʻrish", + "vector-jumptonavigation": "Navigatsiya qismiga oʻtish", + "vector-jumptosearch": "Qidirish qismiga oʻtish", + "vector-jumptocontent": "Kontent qismiga oʻtish", + "vector-more-actions": "Yana", + "vector-search-loader": "Qidiruv takliflari yuklanmoqda", + "vector-searchsuggest-containing": "$1ni oʻz ichiga olgan sahifalar uchun qidiruv", + "vector-intro-page": "Help:Mundarija", + "vector-toc-label": "Mundarija", + "vector-toc-beginning": "Boshlanishi", + "vector-anon-user-menu-pages": "Chiqishni amalga oshirgan tahrirchilar uchun sahifalar", + "vector-anon-user-menu-pages-learn": "batafsil maʼlumot", + "vector-anon-user-menu-pages-label": "Tahrirlash haqida batafsil maʼlumot", + "vector-main-menu-tooltip": "Asosiy menyu", + "vector-toc-menu-tooltip": "Mundarija", + "vector-site-nav-label": "Sayt", + "vector-main-menu-label": "Asosiy menyu", + "vector-page-tools-label": "Asboblar", + "vector-page-tools-general-label": "Umumiy", + "vector-page-tools-actions-label": "Amallar", + "vector-pin-element-label": "yonqutiga oʻtish", + "vector-unpin-element-label": "yashirish", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Munozara]]", + "tooltip-vector-anon-user-menu-title": "Koʻproq opsiyalar", + "empty-language-selector-body": "Sahifa kontenti boshqa tillarda dastaklanmaydi." +} diff --git a/Vector/i18n/vec.json b/Vector/i18n/vec.json new file mode 100644 index 0000000..ccab744 --- /dev/null +++ b/Vector/i18n/vec.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Alunardon90", + "Candalua", + "Fierodelveneto", + "Frigotoni", + "GatoSelvadego", + "Vajotwo" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 łéngua|$1 łéngue}}", + "vector-action-addsection": "Xonta discusion", + "vector-action-delete": "Descançeła", + "vector-action-move": "Sposta", + "vector-action-protect": "Protexi", + "vector-action-undelete": "Recùpara", + "vector-action-unprotect": "Canbia ƚa protesion", + "vector-view-create": "Crea", + "vector-view-edit": "Canbia", + "vector-view-history": "Varda l'istorego", + "vector-view-view": "Lexi", + "vector-view-viewsource": "Varda el testo", + "vector-more-actions": "Piasè" +} diff --git a/Vector/i18n/vep.json b/Vector/i18n/vep.json new file mode 100644 index 0000000..dc32614 --- /dev/null +++ b/Vector/i18n/vep.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Sebranik", + "Игорь Бродский" + ] + }, + "vector-action-addsection": "Ližada tem", + "vector-action-delete": "Čuta poiš", + "vector-action-move": "Udesnimitada", + "vector-action-protect": "Kaita", + "vector-action-undelete": "Pördutada", + "vector-action-unprotect": "Toižetada kaičend", + "vector-view-create": "Säta", + "vector-view-edit": "Redaktiruida", + "vector-view-history": "Kacta istorii", + "vector-view-view": "Lugeda", + "vector-view-viewsource": "Kacta purtkehe", + "vector-more-actions": "Völ" +} diff --git a/Vector/i18n/vi.json b/Vector/i18n/vi.json new file mode 100644 index 0000000..ee5579c --- /dev/null +++ b/Vector/i18n/vi.json @@ -0,0 +1,82 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Bluetpp", + "CactiStaccingCrane", + "Keo010122", + "Minh Nguyen", + "Nghiemtrongdai VN", + "Ngoxuannguyenchuong", + "NguoiDungKhongDinhDanh", + "NguyenHung", + "Nguyenphutrong2", + "Nguyễn Mạnh An", + "Prenn", + "Thienhau2003", + "Thingofme", + "Tryvix1509", + "Trần Nguyễn Minh Huy", + "Vinhtantran", + "Withoutaname" + ] + }, + "skinname-vector": "Vectơ cũ (2010)", + "skinname-vector-2022": "Vectơ (2022)", + "vector-specialversion-name": "Vectơ", + "vector-skin-desc": "Cung cấp 2 giao diện Vector:\n* 2011 - Phiên bản MonoBook hiện đại với giao diện mới và nhiều cải tiến về khả năng sử dụng.\n* 2022 - Vector được xây dựng như một phần của dự án WMF [[mw:Desktop Improvements|Cải thiện phiên bản máy tính]].", + "prefs-vector-enable-vector-1-label": "Chế độ Vectơ cũ", + "prefs-vector-enable-vector-1-help": "Trong thời gian vài năm nữa, giao diện Vectơ sẽ được cập nhật từ từ. Chế độ Vectơ cũ cho phép bạn xem phiên bản giao diện Vectơ cũ (tính đến tháng 12 năm 2019). Tìm hiểu thêm về các thay đổi này tại [[mw:Reading/Web/Desktop_Improvements|trang dự án]].", + "vector-opt-out": "Chuyển sang giao diện cũ", + "vector-opt-out-tooltip": "Thay đổi tùy chọn để quay lại kiểu giao diện cũ (Vectơ cũ)", + "vector.css": "/* Tất cả mã CSS tại đây sẽ được tải khi người dùng sử dụng giao diện Vectơ */", + "vector.js": "/* Tất cả mã JavaScript tại đây sẽ được tải khi người dùng sử dụng giao diện Vectơ */", + "vector-action-toggle-sidebar": "Bật/tắt thanh bên", + "vector-languages": "Ngôn ngữ", + "vector-language-button-aria-label": "Xem bài viết trong ngôn ngữ khác. Bài có sẵn trong {{PLURAL:$1}}$1 ngôn ngữ", + "vector-language-button-label": "{{PLURAL:$1}}$1 ngôn ngữ", + "vector-no-language-button-label": "Thêm ngôn ngữ", + "vector-no-language-button-aria-label": "Bài viết này chỉ tồn tại bằng ngôn ngữ này. Thêm bài viết cho các ngôn ngữ khác", + "vector-language-redirect-to-top": "Ở {{SITENAME}} này, các liên kết giữa ngôn ngữ nằm ở đầu trang, đối diện với tiêu đề bài viết. [[#p-lang-btn|Đi tới đầu trang]].", + "vector-language-variant-switcher-label": "Thay đổi biến thể ngôn ngữ", + "vector-action-addsection": "Tạo chủ đề", + "vector-action-delete": "Xóa", + "vector-action-move": "Di chuyển", + "vector-action-protect": "Khóa", + "vector-action-undelete": "Phục hồi", + "vector-action-unprotect": "Đổi mức khóa", + "vector-view-create": "Tạo", + "vector-view-edit": "Sửa đổi", + "vector-view-history": "Xem lịch sử", + "vector-view-view": "Đọc", + "vector-view-viewsource": "Xem mã nguồn", + "vector-jumptonavigation": "Bước tới điều hướng", + "vector-jumptosearch": "Bước tới tìm kiếm", + "vector-jumptocontent": "Bước tới nội dung", + "vector-more-actions": "Thêm", + "vector-search-loader": "Đang tải gợi ý tìm kiếm", + "vector-searchsuggest-containing": "Tìm trang có $1", + "vector-intro-page": "Help:Giới thiệu", + "vector-toc-label": "Nội dung", + "vector-toc-beginning": "Đầu", + "vector-toc-toggle-button-label": "Hiện/ẩn mục $1", + "vector-anon-user-menu-pages": "Trang dành cho người dùng chưa đăng nhập", + "vector-anon-user-menu-pages-learn": "tìm hiểu thêm", + "vector-anon-user-menu-pages-label": "Tìm hiểu thêm về sửa đổi", + "vector-main-menu-tooltip": "Trình đơn chính", + "vector-toc-menu-tooltip": "Mục lục", + "vector-toc-collapsible-button-label": "Đóng mở mục lục", + "vector-site-nav-label": "Trang Web", + "vector-main-menu-label": "Trình đơn chính", + "vector-limited-width-toggle": "Chuyển đổi chiều rộng nội dung giới hạn", + "vector-page-tools-label": "Công cụ", + "vector-page-tools-general-label": "Chung", + "vector-page-tools-actions-label": "Tác vụ", + "vector-pin-element-label": "chuyển sang thanh bên", + "vector-unpin-element-label": "ẩn", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Thảo luận]]", + "tooltip-vector-anon-user-menu-title": "Thêm tùy chọn", + "vector-prefs-limited-width": "Bật chế độ giới hạn chiều rộng nội dung", + "vector-prefs-limited-width-help": "Bật chế độ giới hạn chiều rộng nội dung để cải thiện trải nghiệm đọc.", + "empty-language-selector-body": "Nội dung trang không được hỗ trợ ở ngôn ngữ khác." +} diff --git a/Vector/i18n/vls.json b/Vector/i18n/vls.json new file mode 100644 index 0000000..c2b841c --- /dev/null +++ b/Vector/i18n/vls.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "DasRakel" + ] + }, + "vector-action-delete": "Wegdoen", + "vector-action-move": "Ernoemn", + "vector-view-create": "Anmoakn", + "vector-view-edit": "Bewerkn", + "vector-view-history": "Geschiedenisse bekykn", + "vector-view-view": "Leezn", + "vector-view-viewsource": "Brontekst bekykn" +} diff --git a/Vector/i18n/vmf.json b/Vector/i18n/vmf.json new file mode 100644 index 0000000..439e93a --- /dev/null +++ b/Vector/i18n/vmf.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Silvicola" + ] + }, + "vector.css": "/* CSS hiir beâjflusd nôr dii Vector-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */", + "vector-action-addsection": "Ân najn abschnid ôôfangn", + "vector-action-delete": "Leschn", + "vector-action-move": "Umdaafn", + "vector-action-protect": "Schidsn", + "vector-action-undelete": "Leschn riggängich machn", + "vector-action-unprotect": "Schuds ufgeebn", + "vector-view-create": "Ôôleechn", + "vector-view-edit": "Bearbajdn", + "vector-view-history": "Wärsjoonsfolche", + "vector-view-view": "Leesn", + "vector-view-viewsource": "Gwäl-dhägsd ôôgugn" +} diff --git a/Vector/i18n/vmw.json b/Vector/i18n/vmw.json new file mode 100644 index 0000000..f42492c --- /dev/null +++ b/Vector/i18n/vmw.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Gildo Máquina", + "Jacinto Jeque", + "Tomas Armando Moz", + "Gito da Ana" + ] + }, + "vector-languages": "Mattaava", + "vector-language-button-label": "{{PLURAL:$1|$1 nttaava|$1 Mattaava}}", + "vector-no-language-button-label": "Yuncererya mattaava", + "vector-action-addsection": "Ophitaanya yoolempwa", + "vector-action-delete": "Ocipiha", + "vector-action-move": "Okumiha", + "vector-action-protect": "Okhapelela", + "vector-view-create": "Opaka", + "vector-view-edit": "Owehiha", + "vector-view-history": "Moonelo wa ethale", + "vector-view-view": "Osoma", + "vector-more-actions": "Vanceene", + "vector-searchsuggest-containing": "Waavya makukhu arimomo $1", + "vector-page-tools-label": "Ikaruma", + "vector-page-tools-general-label": "Xeneraale", + "vector-unpin-element-label": "ottukuttherya" +} diff --git a/Vector/i18n/vo.json b/Vector/i18n/vo.json new file mode 100644 index 0000000..ec38417 --- /dev/null +++ b/Vector/i18n/vo.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Malafaya" + ] + }, + "vector-action-addsection": "Lüükön yegädi", + "vector-action-delete": "Moükön", + "vector-action-move": "Topätükön", + "vector-action-protect": "Jelön", + "vector-action-undelete": "Sämoükön", + "vector-action-unprotect": "Votükön jeli", + "vector-view-create": "Jafön", + "vector-view-edit": "Redakön", + "vector-view-history": "Logön jenotemi", + "vector-view-view": "Reidön", + "vector-view-viewsource": "Logön fonäti", + "vector-more-actions": "Pluikos" +} diff --git a/Vector/i18n/vot.json b/Vector/i18n/vot.json new file mode 100644 index 0000000..7bdc92d --- /dev/null +++ b/Vector/i18n/vot.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Paivud" + ] + }, + "vector-action-addsection": "Vassõn teema", + "vector-action-delete": "Pühi", + "vector-action-move": "Liikut", + "vector-action-protect": "Varjaa", + "vector-view-create": "Loo cülci", + "vector-view-edit": "Muuttaa", + "vector-view-history": "Istori", + "vector-view-view": "Lukõa", + "vector-view-viewsource": "Lähtekoodi" +} diff --git a/Vector/i18n/vro.json b/Vector/i18n/vro.json new file mode 100644 index 0000000..b9f1abd --- /dev/null +++ b/Vector/i18n/vro.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Võrok" + ] + }, + "vector-action-addsection": "Vahtsõ teema ülespandminõ", + "vector-action-delete": "Kistudaq ärq", + "vector-action-move": "Nõstaq ümbre", + "vector-action-protect": "Kaidsaq", + "vector-action-undelete": "Tiiq tagasi", + "vector-action-unprotect": "Muudaq kaidsõt", + "vector-view-create": "Luuq", + "vector-view-edit": "Toimõndaq", + "vector-view-history": "Näütäq aoluku", + "vector-view-view": "Loeq", + "vector-view-viewsource": "Kaeq lätteteksti", + "vector-more-actions": "Viil" +} diff --git a/Vector/i18n/wa.json b/Vector/i18n/wa.json new file mode 100644 index 0000000..8e9a443 --- /dev/null +++ b/Vector/i18n/wa.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Reptilien.19831209BE1", + "Srtxg" + ] + }, + "vector-action-addsection": "Radjouter on sudjet", + "vector-action-delete": "Disfacer", + "vector-action-move": "Displaecî", + "vector-action-protect": "Protedjî", + "vector-action-undelete": "Rapexhî", + "vector-action-unprotect": "Candjî l' protedjaedje", + "vector-view-create": "Ahiver", + "vector-view-edit": "Candjî", + "vector-view-history": "Vey l’ istwere", + "vector-view-view": "Lére", + "vector-view-viewsource": "Vey côde sourdant", + "vector-more-actions": "Di pus" +} diff --git a/Vector/i18n/wal.json b/Vector/i18n/wal.json new file mode 100644 index 0000000..eda30ed --- /dev/null +++ b/Vector/i18n/wal.json @@ -0,0 +1,52 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Ella Lachow" + ] + }, + "vector-opt-out": "Gal\"a be'uwaassi zaara", + "vector-languages": "Doonata", + "vector-language-button-label": "{{PLURAL:$1|$1 doonaa|$1 doonata}}", + "vector-no-language-button-label": "Doonata gujja", + "vector-action-addsection": "Huuphe yohuwaa gujja", + "vector-action-delete": "Xayssa", + "vector-action-move": "Yuushsha", + "vector-action-protect": "Naaga", + "vector-action-undelete": "Xayssoppa", + "vector-action-unprotect": "Naaguwaa laamma", + "vector-view-create": "Medha", + "vector-view-edit": "Giigissa", + "vector-view-history": "Haydaa be'a", + "vector-view-view": "Nabbaba", + "vector-view-viewsource": "Man\"iyaa be'a", + "vector-jumptonavigation": "Koshshaakko xaalla", + "vector-jumptosearch": "Koyyiyoosaakko xaalla", + "vector-jumptocontent": "Kesuwaakko xaalla", + "vector-more-actions": "Aaruwassi", + "vector-search-loader": "Koshshaa zoreta ehiidi de'ees", + "vector-searchsuggest-containing": "Oyqqida sinttata koyya $1", + "vector-intro-page": "Help:Geluwaa", + "vector-toc-label": "Kesota", + "vector-toc-beginning": "Doomettaa", + "vector-toc-toggle-button-label": "$1 sima shaahuwaa laameretta", + "vector-anon-user-menu-pages": "Gelennan giigissiyaageetu sinttata", + "vector-anon-user-menu-pages-learn": "Aahuwaan luxa", + "vector-anon-user-menu-pages-label": "Giigissuwaabaa aahuwaan luxa", + "vector-main-menu-tooltip": "Huuphe kesuwaa", + "vector-toc-menu-tooltip": "Kesuwaa", + "vector-toc-collapsible-button-label": "Kesota laameretta", + "vector-site-nav-label": "Sohuwaa", + "vector-main-menu-label": "Huuphe kesuwaa", + "vector-limited-width-toggle": "Guutta kesuwaa zananaa laameretta", + "vector-page-tools-label": "Buqurata", + "vector-page-tools-general-label": "Xaaxi waaxin", + "vector-page-tools-actions-label": "Oosota", + "vector-pin-element-label": "Sayidibaariyakko yuuyya", + "vector-unpin-element-label": "gentta", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Tobbiyaa]]", + "tooltip-vector-anon-user-menu-title": "Aaho doorota", + "vector-prefs-limited-width": "Guutta zanana hanotaa oosuwaan peeshsha", + "vector-prefs-limited-width-help": "Lo'ida nabbabuwaa meeziyaasi guutta zanana hanotaa oosuwaan peeshsha.", + "empty-language-selector-body": "Sinttaa kesoy hara doonatun kaafettibeenna." +} diff --git a/Vector/i18n/war.json b/Vector/i18n/war.json new file mode 100644 index 0000000..475b8af --- /dev/null +++ b/Vector/i18n/war.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Harvzsf", + "JinJian" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 ka pinulongan|$1 ka mga pinulongan}}", + "vector-action-addsection": "Igdugang hin himangrawon", + "vector-action-delete": "Para-a", + "vector-action-move": "Balhina", + "vector-action-protect": "Panalipda", + "vector-action-undelete": "Igbalik an ginpara", + "vector-action-unprotect": "Liwani an panalipod", + "vector-view-create": "Himo-a", + "vector-view-edit": "Igliwat", + "vector-view-history": "Kitaa an kaagi", + "vector-view-view": "Basaha", + "vector-view-viewsource": "Kitaa an ginkuhaan", + "vector-more-actions": "Damo pa", + "vector-searchsuggest-containing": "Pamiling hin mga pakli nga nagsusulod hin $1" +} diff --git a/Vector/i18n/wls.json b/Vector/i18n/wls.json new file mode 100644 index 0000000..5bebaef --- /dev/null +++ b/Vector/i18n/wls.json @@ -0,0 +1,61 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Lea.Fakauvea", + "Lea.fakauvea" + ] + }, + "skinname-vector": "Vector āfea (2010)", + "skinname-vector-2022": "Vector (2022)", + "vector-specialversion-name": "Vector", + "vector-skin-desc": "E lava hau fili fa'ahiga Vector e lua:\n* 2011 - Te Vector fo'ou aki tona sino mo me'a gaue fo'ou.\n* 2022 - Te Vector ne'e fau tonu fakatahi mo te [[mw:gaue fakafo'ou]] ote Kautahi Vikimetia.", + "prefs-vector-enable-vector-1-label": "Faka'aoga te Vector āfea", + "prefs-vector-enable-vector-1-help": "Hoki fetogi te sino o te Vector i te 'u ta'u ka hoko mai. E lave pe tau faka'aoga te Vector āfea (o Tesepeli 2019). Ki he fakakātoa o te 'u logo, vaka'i te [[mw:Reading/Web/Desktop_Improvements|pāsina gaue]].", + "vector-opt-out": "Fetogi ki tona āfea", + "vector-opt-out-tooltip": "Fetogi tau fakatu'utu'u ki hau liliu ki re Vector āfea", + "vector.css": "/* Ko CSS fuli i heni e faka'asi ānai ke sio ki ai nātou e faka'aoga te Vector */", + "vector.js": "/* Ko te 'atu JavaScript i heni e faka'asi ānai kia nātou e faka'aoga'i te Vector */", + "vector-action-toggle-sidebar": "Faka'asi te pou hema", + "vector-languages": "Lea", + "vector-language-button-aria-label": "'Alu ki he fakamatala i he tahi lea. E ma'u i te {{PLURAL:$1|lea e $1|lea e$1}}", + "vector-language-button-label": "{{PLURAL:$1|$1 lea|lea e $1}}", + "vector-no-language-button-label": "Kumi he tahi lea", + "vector-no-language-button-aria-label": "E tohi pe te fakamatala i te lea aeni. Fakaliliu ki ni tahi 'u lea.", + "vector-language-redirect-to-top": "I te {{SITENAME}} e fai te fili o tau lea i te fuga pāsina i te faha'i mata'u o te higoa o te fakamatala. [[#p-lang-btn|'Alu ki 'oluga]].", + "vector-language-variant-switcher-label": "Fetogi te maga lea", + "vector-action-addsection": "Tohi he kupu", + "vector-action-delete": "Molehi", + "vector-action-move": "Fetogi higoa", + "vector-action-protect": "Puipui", + "vector-action-undelete": "Fakafisi", + "vector-action-unprotect": "Fetogi te puipui", + "vector-view-create": "Fa'u", + "vector-view-edit": "Fetogi", + "vector-view-history": "Kamata'aga", + "vector-view-view": "Lau", + "vector-view-viewsource": "sio te fa'u", + "vector-jumptonavigation": "Ki te fe'aluaki", + "vector-jumptosearch": "Ki te kumi", + "vector-jumptocontent": "Ki te fakamatala", + "vector-more-actions": "Mo 'ihi atu", + "vector-search-loader": "Kua vave asi mai te fua o te kumi", + "vector-searchsuggest-containing": "Kumi pāsina e tohi ai $1", + "vector-intro-page": "Tokoni:Kamata'aga", + "vector-toc-label": "Faka'alu'alu", + "vector-toc-beginning": "Kamata", + "vector-toc-toggle-button-label": "Fakahā te vaega $1", + "vector-anon-user-menu-pages": "Pāsina o nātou kua mavae ki tu'a", + "vector-anon-user-menu-pages-learn": "Ki hona hoko atu", + "vector-anon-user-menu-pages-label": "O 'uhiga mo te fai tohi", + "vector-main-menu-tooltip": "Fakahoahoa pāsina", + "vector-toc-menu-tooltip": "Laupapa fakatu'utu'u", + "vector-toc-collapsible-button-label": "Ave kehe te laupapa fakatu'utu'u", + "vector-site-nav-label": "Site", + "vector-page-tools-label": "Me'a gaue", + "vector-page-tools-general-label": "Tāfito", + "vector-pin-element-label": "'Alu ki te pou tafa", + "vector-unpin-element-label": "fufū", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|Felogo'i]]", + "tooltip-vector-anon-user-menu-title": "Hoko atu" +} diff --git a/Vector/i18n/wo.json b/Vector/i18n/wo.json new file mode 100644 index 0000000..e784265 --- /dev/null +++ b/Vector/i18n/wo.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Ibou" + ] + }, + "vector-action-addsection": "Yokkuw tëriit", + "vector-action-delete": "Far", + "vector-action-move": "Tuddewaat", + "vector-action-protect": "Aar", + "vector-action-undelete": "Delloowaat", + "vector-action-unprotect": "Aaradi", + "vector-view-create": "Sos", + "vector-view-edit": "Soppi", + "vector-view-history": "Wone jaar-jaaram", + "vector-view-view": "Jàng", + "vector-view-viewsource": "Wone gongikuwaayam", + "vector-more-actions": "Yeneen" +} diff --git a/Vector/i18n/wuu-hans.json b/Vector/i18n/wuu-hans.json new file mode 100644 index 0000000..8d08df0 --- /dev/null +++ b/Vector/i18n/wuu-hans.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Benojan", + "Poiuyt", + "Subarupan", + "Winston Sung", + "飞舞回堂前" + ] + }, + "vector.css": "/* 放勒伊𡍲个CSS会影响用Vector皮肤个用户 */", + "vector-action-addsection": "加话题", + "vector-action-delete": "删除", + "vector-action-move": "移动", + "vector-action-protect": "保护", + "vector-action-undelete": "取消删除", + "vector-action-unprotect": "更改保护", + "vector-view-create": "创建", + "vector-view-edit": "编辑", + "vector-view-history": "望历史", + "vector-view-view": "阅读", + "vector-view-viewsource": "望源码", + "vector-more-actions": "更多" +} diff --git a/Vector/i18n/wuu-hant.json b/Vector/i18n/wuu-hant.json new file mode 100644 index 0000000..d4f5637 --- /dev/null +++ b/Vector/i18n/wuu-hant.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Winston Sung" + ] + }, + "vector-languages": "閒話", + "vector-language-button-label": "{{PLURAL:$1|$1種閒話}}", + "vector-action-addsection": "加話題", + "vector-action-delete": "刪除", + "vector-action-move": "移動", + "vector-action-protect": "保護", + "vector-view-history": "望歷史", + "vector-view-view": "閱讀", + "vector-more-actions": "更多", + "vector-page-tools-label": "家生", + "vector-unpin-element-label": "囥脫" +} diff --git a/Vector/i18n/wuu.json b/Vector/i18n/wuu.json new file mode 100644 index 0000000..6814b01 --- /dev/null +++ b/Vector/i18n/wuu.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Benojan", + "Poiuyt", + "Subarupan", + "飞舞回堂前" + ] + }, + "vector.css": "/* 放勒伊𡍲个CSS会影响用Vector皮肤个用户 */", + "vector-action-addsection": "加话题", + "vector-action-delete": "删除", + "vector-action-move": "移动", + "vector-action-protect": "保护", + "vector-action-undelete": "取消删除", + "vector-action-unprotect": "更改保护", + "vector-view-create": "创建", + "vector-view-edit": "编辑", + "vector-view-history": "望历史", + "vector-view-view": "阅读", + "vector-view-viewsource": "望源码", + "vector-more-actions": "更多" +} diff --git a/Vector/i18n/xal.json b/Vector/i18n/xal.json new file mode 100644 index 0000000..870fe4e --- /dev/null +++ b/Vector/i18n/xal.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Huuchin" + ] + }, + "vector-action-addsection": "Төриг немх", + "vector-action-delete": "Һарһх", + "vector-action-move": "Көндәх", + "vector-action-protect": "Харсх", + "vector-action-undelete": "Һарһх биш", + "vector-action-unprotect": "Харсх биш", + "vector-view-create": "Бүтәх", + "vector-view-edit": "Ясх", + "vector-view-history": "Тууҗин хәләвр", + "vector-view-view": "Умшлһн", + "vector-view-viewsource": "Темдгллһнә хәләвр", + "vector-more-actions": "Нань" +} diff --git a/Vector/i18n/xh.json b/Vector/i18n/xh.json new file mode 100644 index 0000000..d562dab --- /dev/null +++ b/Vector/i18n/xh.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Nomden" + ] + }, + "vector-action-addsection": "Faka isihloko", + "vector-action-move": "Susa", + "vector-view-edit": "Tshintsha", + "vector-view-history": "Khawujonge imbali yeli phepha", + "vector-view-view": "Funda", + "vector-more-actions": "Veza ezinye iinkcukacha" +} diff --git a/Vector/i18n/xmf.json b/Vector/i18n/xmf.json new file mode 100644 index 0000000..d1d4898 --- /dev/null +++ b/Vector/i18n/xmf.json @@ -0,0 +1,66 @@ +{ + "@metadata": { + "authors": [ + "Kilavagora", + "Lika2672", + "Machirkholi", + "Narazeni", + "Silovan" + ] + }, + "skinname-vector": "ვექტორული (2010)", + "skinname-vector-2022": "ვექტორული (2022)", + "vector-specialversion-name": "ვექტორული", + "vector-skin-desc": "ითოლწონენს 2 ვექტორულ მიოჯინუს:\n* 2011 — მონობუკიშ თეხანური ვერსია ედომუშამო ახალი მიოჯინუთ დო ანდა გჷმარინაფონი გოუჯგუშაფათ.\n* 2022 — ვექტორული მიოჯინუ, ნამუჸ ფონდი ვიკიმედიას პროექტიშ „[[mw:Desktop Improvements|Desktop Improvements]]“ ფარგანეფს გიჭყჷნ.", + "prefs-vector-enable-vector-1-label": "Legacy Vector-ია გჷმორინაფა", + "prefs-vector-enable-vector-1-help": "გეჸვენჯ მუსხირენ წანას, ჩქი ჭიეჭიეთ მუთმუახალენთ ვექტორულ კაბრას. Legacy Vector ჯვეში მიოჯინუშ ახალშო აკონწყუალაშ შილებუამობას მერჩანა (2019 წანაშ ქირსეთუთაშ დგომარობათ). მოახალაფეფიშ გეშა უმოსიშ გაგებელო ესურით [[mw:Reading/Web/Desktop_Improvements|პროექტიშ ხასჷლას]].", + "vector-opt-out": "ჯვეში მეჯინაშა გინულა", + "vector-opt-out-tooltip": "გოთირეთ თქვანი კონფიგურაცია, ხასჷლეფიშ ჯვეშ მიოჯინუშა დართინალო", + "vector.css": "/* თაქ მოჩამილი არძა CSS ქენიხარგუ ვექტორული კაბრაშ არძა მახვარებუშო */", + "vector.js": "/* თაქ მოჩამილი არძა JavaScript ქენიხარგუ ვექტორული კაბრაშ არძა მახვარებუშო */", + "vector-action-toggle-sidebar": "ელახიანი პანელიშ გინოჸოთამა", + "vector-languages": "ნინეფი", + "vector-language-button-aria-label": "შხვანინამ სტატიაშა გინულა. ხემიოლუ რე {{PLURAL:$1|$1 ნინაშა}}", + "vector-language-button-label": "{{PLURAL:$1|$1 ნინა}}", + "vector-no-language-button-label": "არძა ნინა", + "vector-no-language-button-aria-label": "ათე სტატია ხვალე თე ნინაშა რე. ქეგუძინით სტატია შხვა ნინეფშო", + "vector-language-variant-switcher-label": "ნინაშ ვარიანტიშ თირუა", + "vector-action-addsection": "თემაშ მიშაძინა", + "vector-action-delete": "ლასუა", + "vector-action-move": "გინოღალა", + "vector-action-protect": "თხილუა", + "vector-action-undelete": "ახალშო აკონწყუალა", + "vector-action-unprotect": "თხილუაშ თირუა", + "vector-view-create": "გოჭყაფა", + "vector-view-edit": "რედაქტირაფა", + "vector-view-history": "ისტორიაშ ძირაფა", + "vector-view-view": "კითხირი", + "vector-view-viewsource": "წყუშ ძირაფა", + "vector-jumptonavigation": "ნავიგაციაშა გინულა", + "vector-jumptosearch": "გორუაშა გინულა", + "vector-jumptocontent": "დინორეშა გინულა", + "vector-more-actions": "უმოსი", + "vector-search-loader": "იხარგუაფუ გორუაშ მერზიაფეფი", + "vector-searchsuggest-containing": "თი ხასჷლეფიშ გორუა, ნამუეფჷთ იკათუანა $1-ის", + "vector-intro-page": "მოხვარა:დაჭყაფუ", + "vector-toc-label": "გიშაგორალი", + "vector-toc-beginning": "დაჭყაფუ", + "vector-toc-toggle-button-label": "სექცია „$1“-იშ გოფაჩუა/ინოკიჩუა", + "vector-anon-user-menu-pages": "ხასჷლეფი სისტემაშე გიშულირი რედაქტორეფიშო", + "vector-anon-user-menu-pages-learn": "ქიგეგით უმოსი", + "vector-anon-user-menu-pages-label": "ქიგეგით უმოსი რედაქტირაფაშ გეშა", + "vector-main-menu-tooltip": "თარი მენიუ", + "vector-toc-menu-tooltip": "გიშაგორალი", + "vector-toc-collapsible-button-label": "გიშაგორალიშ ტყობინაფა/ძირაფა", + "vector-site-nav-label": "საიტი", + "vector-main-menu-label": "თარი მენიუ", + "vector-page-tools-label": "ხეჭკუდეფი", + "vector-page-tools-general-label": "თარი", + "vector-page-tools-actions-label": "ქიმინუეფი", + "vector-pin-element-label": "გინოღალა ელახიან ღოზიშა", + "vector-unpin-element-label": "ტყობინაფა", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|დისკუსია]]", + "tooltip-vector-anon-user-menu-title": "უმოსი პარამეტრი", + "vector-prefs-limited-width": "გოხურგილი სიგანაშ რეჟიმიშ ჩართება", + "empty-language-selector-body": "ხასჷლაშ დინორე შხვა ნინაშა ვა რე ხემიოლი." +} diff --git a/Vector/i18n/xsy.json b/Vector/i18n/xsy.json new file mode 100644 index 0000000..ac7ec69 --- /dev/null +++ b/Vector/i18n/xsy.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Akamycoco", + "Lalotahes" + ] + }, + "vector-action-delete": "boloe’", + "vector-action-move": " tilkoraeh", + "vector-action-protect": "kinalahaeng", + "vector-view-create": "paskayzaeh", + "vector-view-edit": " bienji", + "vector-view-history": "komita’ kahayza’an kin’i’iyaeh", + "vector-view-view": "kiSka:at", + "vector-view-viewsource": " komita’ ka yuensema:", + "vector-more-actions": "akoy" +} diff --git a/Vector/i18n/yi.json b/Vector/i18n/yi.json new file mode 100644 index 0000000..86d40a6 --- /dev/null +++ b/Vector/i18n/yi.json @@ -0,0 +1,39 @@ +{ + "@metadata": { + "authors": [ + "Castillerian", + "Har-wradim", + "Joystick", + "Pacha Tchernof", + "פוילישער" + ] + }, + "skinname-vector": "וועקטאר אלט (2010)", + "vector-skin-desc": "פֿארזארגט צוויי וועקטאר וואריאנטן:\n* 2011 - די מאדערנע ווערסיע פון מאנאבוק מיט פרישן אויסזען און א סך באניצער־פריינדלעכקייט פארבעסערונגען\n* 2022 - די נייעסטע ווערסיע, אנטוויקלט אלס טייל פונעם WMF [[mw:Desktop Improvements|דעסקטאפ פֿארבעסערונגען]] פראיעקט", + "prefs-vector-enable-vector-1-help": "במשך די קומענדיגע יארן וועט מען ביסלעכווייז דערהיינטיקן דעם וועקטאר באניצער־אייבערפֿלאך. קלאסישער וועקטאר וועט אייך לאזן באקוקן די אלטע ווערסיע פון וועקטאר (פֿון דעצעמבער 2019). To learn more about the updates, go to our [[mw:Reading/Web/Desktop_Improvements|project page]].", + "vector.css": "/* אלע CSS דא וועל ווערן געלאדן פֿאר באניצער פונעם וועקטאר סקין */", + "vector-languages": "שפּראַכן", + "vector-language-button-label": "{{PLURAL:$1|$1 שפּראַך|$1 שפּראַכן}}", + "vector-no-language-button-label": "צולייגן שפראַכן", + "vector-language-redirect-to-top": "אין דער אויסגאבע פֿון {{SITENAME}} געפֿינען זיך די שפּראַך פֿאַרבינדונגען אין שפּיץ פֿונעם בלאַט, קעגנאיבער דעם אַרטיקל טיטל. [[#p-lang-btn|גיין ארויף אויבן]].", + "vector-action-addsection": "צושטעלן טעמע", + "vector-action-delete": "אויסמעקן", + "vector-action-move": "באַוועגן", + "vector-action-protect": "שיצן", + "vector-action-undelete": "מבטל זיין אויסמעקן", + "vector-action-unprotect": "ענדערונג באַשיצונג", + "vector-view-create": "שאַפֿן", + "vector-view-edit": "רעדאַקטירן", + "vector-view-history": "ווייזן היסטאָריע", + "vector-view-view": "לייענען", + "vector-view-viewsource": "ווײַזן מקור", + "vector-more-actions": "נאָך", + "vector-toc-label": "אינהאַלט", + "vector-toc-beginning": "אָנפֿאַנג", + "vector-main-menu-tooltip": "הויפט־מעניו", + "vector-toc-menu-tooltip": "אינהאַלט טאַבעלע", + "vector-page-tools-label": "געצייג", + "vector-page-tools-general-label": "אַלגעמיין", + "vector-pin-element-label": "אַריבערפיֿרן צו זייט־פאַס", + "vector-unpin-element-label": "באַהאַלטן" +} diff --git a/Vector/i18n/yo.json b/Vector/i18n/yo.json new file mode 100644 index 0000000..a7680ca --- /dev/null +++ b/Vector/i18n/yo.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Demmy" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|ojúewé $1|àwọn ojúewé $1}}", + "vector-action-addsection": "Àfikún orí-ọ̀rọ̀", + "vector-action-delete": "Ìparẹ́", + "vector-action-move": "Ìyípòdà", + "vector-action-protect": "Àbò", + "vector-action-undelete": "Ìmúkúrò ìparẹ́", + "vector-action-unprotect": "Ìyípadà àbò", + "vector-view-create": "Ṣ'èdá", + "vector-view-edit": "Àtúnṣe", + "vector-view-history": "Wo ìtàn", + "vector-view-view": "Àwòkà", + "vector-view-viewsource": "Wo àmìọ̀rọ̀", + "vector-more-actions": "Ọ̀pọ̀", + "vector-searchsuggest-containing": "Ṣe ìwárí fún àwọn ojúewé tó ní $1" +} diff --git a/Vector/i18n/yoi.json b/Vector/i18n/yoi.json new file mode 100644 index 0000000..22cab08 --- /dev/null +++ b/Vector/i18n/yoi.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Kainuguni" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1ぬ物言ぬ版}}", + "vector-view-create": "作るん", + "vector-view-edit": "直ん", + "vector-view-history": "ページぬ歴史読むん", + "vector-view-view": "読むん", + "vector-more-actions": "其ぬ他", + "vector-searchsuggest-containing": "$1含むページさばぐん" +} diff --git a/Vector/i18n/yrl.json b/Vector/i18n/yrl.json new file mode 100644 index 0000000..1ae0197 --- /dev/null +++ b/Vector/i18n/yrl.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Duke of Wikipädia", + "Karapananguasú Kururú Teremembé", + "Maracajá Teremembé" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1 nhẽẽga|$1 nhẽẽga'etá}}", + "vector-action-addsection": "Add topic", + "vector-action-delete": "Muçaká", + "vector-action-move": "Yatimana", + "vector-action-protect": "Uçupirũ", + "vector-view-create": "Umunhã", + "vector-view-edit": "Murupiawa", + "vector-view-history": "E-maã marãduwapawa", + "vector-view-view": "Mugetá", + "vector-more-actions": "Yawá píri", + "vector-searchsuggest-containing": "Sikari papera-itá pitasuka supé $1" +} diff --git a/Vector/i18n/yua.json b/Vector/i18n/yua.json new file mode 100644 index 0000000..1e4ddde --- /dev/null +++ b/Vector/i18n/yua.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "26agcp", + "Lorenzoitza" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|Junp'éel t'aan|$1 t'aano'ob}}", + "vector-action-delete": "Tupej", + "vector-view-edit": "K'eex", + "vector-view-history": "Ba'ax a ilmaj", + "vector-view-view": "Xook", + "vector-more-actions": "U la'ak'" +} diff --git a/Vector/i18n/yue-hant.json b/Vector/i18n/yue-hant.json new file mode 100644 index 0000000..436e2a1 --- /dev/null +++ b/Vector/i18n/yue-hant.json @@ -0,0 +1,70 @@ +{ + "@metadata": { + "authors": [ + "Deryck Chan", + "Hello903hello", + "Ktchankt", + "Moon0319", + "OmniBus", + "Roy17", + "Waihorace", + "Winston Sung", + "Yueman" + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "有2隻Vector外觀:\n* 2011 - MonoBook嘅摩登版,有新嘅樣,又有好多功能改進。\n* 2022 - 由維基媒體基金會[[mw:Desktop Improvements|桌面改善]]計劃搞出嚟嘅Vector版本。", + "prefs-vector-enable-vector-1-label": "用舊版Vector", + "prefs-vector-enable-vector-1-help": "來緊幾年,我哋會逐步更新Vector外觀。揀舊版Vector畀你用返Vector嘅舊版本(2019年12月版)。要瞭解更新詳情,請去我哋嘅[[mw:Reading/Web/Desktop_Improvements|計畫專頁]]。", + "vector-opt-out": "轉返舊貌", + "vector-opt-out-tooltip": "改你嘅設定用返舊款外觀(舊版Vector)", + "vector.css": "/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */", + "vector.js": "/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */", + "vector-action-toggle-sidebar": "邊欄開閂", + "vector-languages": "語言", + "vector-language-button-aria-label": "去睇另一種語文嘅文章。有{{PLURAL:$1|$1種語言版本}}。", + "vector-language-button-label": "{{PLURAL:$1|$1種語言}}", + "vector-no-language-button-label": "加語言", + "vector-no-language-button-aria-label": "呢篇文淨係喺呢種語言先有。喺第種語言開呢篇文。", + "vector-language-variant-switcher-label": "改語言變體", + "vector-action-addsection": "加主題", + "vector-action-delete": "剷走", + "vector-action-move": "搬", + "vector-action-protect": "保護", + "vector-action-undelete": "取消剷走", + "vector-action-unprotect": "改保護", + "vector-view-create": "開", + "vector-view-edit": "改", + "vector-view-history": "睇返紀錄", + "vector-view-view": "閱", + "vector-view-viewsource": "睇吓原始碼", + "vector-jumptonavigation": "跳去導覽", + "vector-jumptosearch": "跳去搵嘢", + "vector-jumptocontent": "跳去內容", + "vector-more-actions": "多啲", + "vector-search-loader": "載入緊搜索提議", + "vector-searchsuggest-containing": "搵包含 $1 嘅版", + "vector-intro-page": "Help:目錄", + "vector-toc-label": "目錄", + "vector-toc-beginning": "文頭", + "vector-toc-toggle-button-label": "切換去 $1 細章節", + "vector-anon-user-menu-pages": "未簽到編者用嘅版面", + "vector-anon-user-menu-pages-learn": "知多啲", + "vector-anon-user-menu-pages-label": "知多啲有關改嘢", + "vector-main-menu-tooltip": "主目錄", + "vector-toc-menu-tooltip": "內容一覽", + "vector-toc-collapsible-button-label": "開/收內容一覽", + "vector-site-nav-label": "站點", + "vector-main-menu-label": "主目錄", + "vector-limited-width-toggle": "切換限制內容闊度", + "vector-page-tools-label": "架撐", + "vector-page-tools-general-label": "基本", + "vector-page-tools-actions-label": "動作", + "vector-pin-element-label": "移去側欄", + "vector-unpin-element-label": "收埋", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|傾下]]", + "tooltip-vector-anon-user-menu-title": "多啲選項", + "vector-prefs-limited-width": "啟用限制闊度模式", + "vector-prefs-limited-width-help": "啟用限制闊度模式去改善閱讀嘅體驗。", + "empty-language-selector-body": "頁面內容唔支援其他語言。" +} diff --git a/Vector/i18n/yue.json b/Vector/i18n/yue.json new file mode 100644 index 0000000..6f48226 --- /dev/null +++ b/Vector/i18n/yue.json @@ -0,0 +1,54 @@ +{ + "@metadata": { + "authors": [ + "Deryck Chan", + "Hello903hello", + "Ktchankt", + "Moon0319", + "OmniBus", + "Roy17", + "Waihorace", + "Yueman" + ] + }, + "skinname-vector": "Vector", + "vector-skin-desc": "MonoBook嘅摩登版,有新嘅樣,又有好多功能改進", + "prefs-vector-enable-vector-1-label": "用舊版Vector", + "prefs-vector-enable-vector-1-help": "來緊幾年,我哋會逐步更新Vector外觀。揀舊版Vector畀你用返Vector嘅舊版本(2019年12月版)。要瞭解更新詳情,請去我哋嘅[[mw:Reading/Web/Desktop_Improvements|計畫專頁]]。", + "vector-opt-out": "轉返舊貌", + "vector-opt-out-tooltip": "改你嘅設定用返舊款外觀(舊版Vector)", + "vector.css": "/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */", + "vector.js": "/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */", + "vector-action-toggle-sidebar": "邊欄開閂", + "vector-languages": "語言", + "vector-language-button-aria-label": "去睇另一種語文嘅文章。有$1種語言版本。", + "vector-language-button-label": "{{PLURAL:$1|$1種語言}}", + "vector-no-language-button-label": "加語言", + "vector-no-language-button-aria-label": "呢篇文淨係喺呢種語言先有。喺第種語言開呢篇文。", + "vector-language-redirect-to-top": "喺呢個{{SITENAME}}度,其他語言嘅連結喺頁頂文章標題側邊。[[#p-lang-btn|去頁頂]]。", + "vector-action-addsection": "加主題", + "vector-action-delete": "剷走", + "vector-action-move": "搬", + "vector-action-protect": "保護", + "vector-action-undelete": "取消剷走", + "vector-action-unprotect": "改保護", + "vector-view-create": "開", + "vector-view-edit": "改", + "vector-view-history": "睇返紀錄", + "vector-view-view": "閱", + "vector-view-viewsource": "睇吓原始碼", + "vector-jumptonavigation": "跳去導覽", + "vector-jumptosearch": "跳去搵嘢", + "vector-jumptocontent": "跳去內容", + "vector-more-actions": "多啲", + "vector-search-loader": "載入緊搜索提議", + "vector-searchsuggest-containing": "搵包含 $1 嘅版", + "vector-toc-label": "目錄", + "vector-toc-beginning": "文頭", + "vector-anon-user-menu-pages-learn": "知多啲", + "vector-main-menu-tooltip": "主目錄", + "vector-toc-menu-tooltip": "內容一覽", + "vector-toc-collapsible-button-label": "開/收內容一覽", + "vector-site-nav-label": "站點", + "vector-unpin-element-label": "收埋" +} diff --git a/Vector/i18n/za.json b/Vector/i18n/za.json new file mode 100644 index 0000000..662b3c1 --- /dev/null +++ b/Vector/i18n/za.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Biŋhai", + "唐吉訶德的侍從" + ] + }, + "vector-action-delete": "Ca", + "vector-action-move": "Daen", + "vector-action-protect": "Bauj", + "vector-view-create": "Laeb", + "vector-view-edit": "gaij", + "vector-view-history": "Cazyawj lizsij", + "vector-view-view": "Doeg" +} diff --git a/Vector/i18n/zea.json b/Vector/i18n/zea.json new file mode 100644 index 0000000..d0f9aab --- /dev/null +++ b/Vector/i18n/zea.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Ooswesthoesbes" + ] + }, + "vector-action-addsection": "Voeg kopje toe", + "vector-action-delete": "Wissen", + "vector-action-move": "Verschuuf", + "vector-action-protect": "Bescherm", + "vector-action-undelete": "Plaets truhhe", + "vector-action-unprotect": "Beveiligienge anpass'n", + "vector-view-create": "Anmaeken", + "vector-view-edit": "Bewerk", + "vector-view-history": "Geschiedenisse bekiek'n", + "vector-view-view": "Lezen", + "vector-view-viewsource": "Brontekst bekieken" +} diff --git a/Vector/i18n/zgh.json b/Vector/i18n/zgh.json new file mode 100644 index 0000000..1ad1a28 --- /dev/null +++ b/Vector/i18n/zgh.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Amara-Amaziɣ", + "Aslmad mohamed belarhzali", + "Brahim-essaidi", + "YesIn", + "ⵕⴰⵊⵉ" + ] + }, + "vector-languages": "ⵜⵓⵜⵍⴰⵢⵉⵏ", + "vector-language-button-label": "{{PLURAL:$1|$1 ⵜⵓⵜⵍⴰⵢⵜ|$1 ⵜⵓⵜⵍⴰⵢⵉⵏ}}", + "vector-no-language-button-label": "ⵔⵏⵓ ⵜⵓⵜⵍⴰⵢⵉⵏ", + "vector-action-addsection": "ⵔⵏⵓ ⴰⵙⵏⵜⵍ", + "vector-action-delete": "ⴽⴽⵙ", + "vector-action-move": "ⵙⵎⴰⵜⵜⵉ", + "vector-action-protect": "ⵢⴰⵔⴰⵢ", + "vector-view-create": "ⵙⵏⴼⵍⵓⵍ", + "vector-view-edit": "ⵙⵏⴼⵍ", + "vector-view-history": "ⵙⴽⵏ ⴰⵎⵣⵔⴰⵢ", + "vector-view-view": "ⵖⵔ", + "vector-more-actions": "ⵓⴳⴳⴰⵔ", + "vector-search-loader": "ⴰⵣⴷⴰⵎ ⵏ ⵉⵙⵓⵎⴰⵔ ⵏ ⵓⵔⵣⵣⵓ", + "vector-searchsuggest-containing": "ⵔⵣⵓ ⵖⴼ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵓⵎⴰⵏⵉⵏ $1", + "vector-toc-label": "ⵜⵓⵎⴰⵢⵉⵏ", + "vector-toc-beginning": "ⵜⵓⴷⴷⵎⴰ", + "vector-page-tools-label": "ⵉⵎⴰⵙⵙⵏ", + "vector-page-tools-general-label": "ⴰⵎⴰⵜⴰⵢ", + "vector-unpin-element-label": "ⵙⵙⵏⵜⵍ" +} diff --git a/Vector/i18n/zh-hans.json b/Vector/i18n/zh-hans.json new file mode 100644 index 0000000..c7cd694 --- /dev/null +++ b/Vector/i18n/zh-hans.json @@ -0,0 +1,97 @@ +{ + "@metadata": { + "authors": [ + "500000000006城", + "AYZ04", + "Amire80", + "Bo77le", + "Cwek", + "Diskdance", + "FakeGreenHand", + "Func", + "GuoPC", + "Hydra", + "Irati", + "Lakejason0", + "Lantx", + "Lanyun1103", + "Liangent", + "Liuxinyu970226", + "Shizhao", + "Stang", + "StarrySky", + "Sunny00217", + "Tr jason", + "Tranve", + "Winston Sung", + "Wzl19371", + "Xiaomingyan", + "Xiplus", + "Xzonn", + "Yfdyh000", + "Yining Chen", + "落花有意12138", + 50829, + "Kishinsagi", + "魔琴", + "LittlePaw365" + ] + }, + "skinname-vector": "旧版Vector(2010)", + "skinname-vector-2022": "Vector(2022)", + "vector-skin-desc": "共提供2种Vector皮肤:\n* 2011年版 - MonoBook的现代版本,外观清晰,提升了使用体验。\n* 2022年版 - 由维基媒体基金会[[mw:Desktop Improvements]]项目设计的Vector皮肤。", + "prefs-vector-enable-vector-1-label": "使用旧版Vector", + "prefs-vector-enable-vector-1-help": "接下来的几年中,我们将逐步更新Vector皮肤。旧版Vector允许您查看Vector的旧版本(截至2019年12月)。有关本次更新的更多信息,请查看我们的[[mw:Reading/Web/Desktop_Improvements|项目页面]]。", + "vector-opt-out": "切换到旧外观", + "vector-opt-out-tooltip": "更改您的设置来使用该皮肤的旧外观(旧版Vector)。", + "vector.css": "/* 此处所有CSS将为使用Vector皮肤的用户加载 */", + "vector.js": "/* 此处所有JavaScript将为使用Vector皮肤的用户加载 */", + "vector-action-toggle-sidebar": "折叠侧栏", + "vector-languages": "语言", + "vector-language-button-aria-label": "前往另一种语言写成的文章。{{PLURAL:$1|$1种语言}}可用", + "vector-language-button-label": "{{PLURAL:$1|$1种语言}}", + "vector-no-language-button-label": "添加语言", + "vector-no-language-button-aria-label": "这篇条目只存在于此语言中。添加其他语言的条目", + "vector-language-redirect-to-top": "在{{SITENAME}}中,语言链接位于页面顶部,标题的另一侧。[[#p-lang-btn|前往顶部]]。", + "vector-language-variant-switcher-label": "更改语言变体", + "vector-action-addsection": "添加话题", + "vector-action-delete": "删除", + "vector-action-move": "移动", + "vector-action-protect": "保护", + "vector-action-undelete": "还原", + "vector-action-unprotect": "更改保护", + "vector-view-create": "创建", + "vector-view-edit": "编辑", + "vector-view-history": "查看历史", + "vector-view-view": "阅读", + "vector-view-viewsource": "查看源代码", + "vector-jumptonavigation": "跳到导航", + "vector-jumptosearch": "跳到搜索", + "vector-jumptocontent": "跳到内容", + "vector-more-actions": "更多", + "vector-search-loader": "正在加载搜索建议", + "vector-searchsuggest-containing": "搜索包含$1的页面", + "vector-intro-page": "Help:新手入门", + "vector-toc-label": "目录", + "vector-toc-beginning": "序言", + "vector-toc-toggle-button-label": "切换 $1 小节", + "vector-anon-user-menu-pages": "未登录编辑者的页面", + "vector-anon-user-menu-pages-learn": "了解详情", + "vector-anon-user-menu-pages-label": "了解有关编辑的更多信息", + "vector-main-menu-tooltip": "主菜单", + "vector-toc-menu-tooltip": "目录", + "vector-toc-collapsible-button-label": "切换目录", + "vector-site-nav-label": "站点", + "vector-main-menu-label": "主菜单", + "vector-limited-width-toggle": "开关有限宽度模式", + "vector-page-tools-label": "工具", + "vector-page-tools-general-label": "常规", + "vector-page-tools-actions-label": "操作", + "vector-pin-element-label": "移至侧栏", + "vector-unpin-element-label": "隐藏", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|讨论]]", + "tooltip-vector-anon-user-menu-title": "更多选项", + "vector-prefs-limited-width": "启用有限宽度模式", + "vector-prefs-limited-width-help": "限制页面宽度以改善阅读体验。", + "empty-language-selector-body": "页面内容不支持其他语言。" +} diff --git a/Vector/i18n/zh-hant.json b/Vector/i18n/zh-hant.json new file mode 100644 index 0000000..ab41052 --- /dev/null +++ b/Vector/i18n/zh-hant.json @@ -0,0 +1,80 @@ +{ + "@metadata": { + "authors": [ + "1233thehongkonger", + "Amire80", + "Cwlin0416", + "Diskdance", + "Hello903hello", + "Jonathan5566", + "Justincheng12345", + "Kly", + "LNDDYL", + "Liuxinyu970226", + "LuciferianThomas", + "Mark85296341", + "Sunny00217", + "Tranve", + "Winston Sung", + "Xiplus", + "捍粵者" + ] + }, + "skinname-vector": "舊版Vector(2010)", + "skinname-vector-2022": "Vector(2022)", + "vector-skin-desc": "提供兩種 Vector 外觀:\n* 2011年版 - 現代版的 MonoBook,有著較新穎的外觀與許多可用性的改進。\n* 2022年版 - 作為維基媒體基金會 [[mw:Desktop Improvements]] 計畫一部分組建的 Vector 外觀。", + "prefs-vector-enable-vector-1-label": "使用舊版Vector", + "prefs-vector-enable-vector-1-help": "在接下來的幾年,我們會逐步更新 Vector 外觀。舊版 Vector 能讓您檢視舊版本 Vector(截至2019年12月)。要了解更多更新方面內容,請前往我們的[[mw:Reading/Web/Desktop_Improvements|計畫頁面]]。", + "vector-opt-out": "切換至舊外觀", + "vector-opt-out-tooltip": "變更您的設定以切回舊外觀(舊版 Vector)", + "vector.css": "/* 此處所有的 CSS 都會在使用者使用 Vector 外觀時載入 */", + "vector.js": "/* 此處所有的 JavaScript 都會在使用者使用 Vector 外觀時載入 */", + "vector-action-toggle-sidebar": "切換側欄", + "vector-languages": "語言", + "vector-language-button-aria-label": "前往別種語言的條目。有 {{PLURAL:$1|$1}} 種語言可用", + "vector-language-button-label": "{{PLURAL:$1|$1}} 種語言", + "vector-no-language-button-label": "新增語言", + "vector-no-language-button-aria-label": "這篇條目只存在於此語言中。添加其他語言的條目", + "vector-language-redirect-to-top": "在{{SITENAME}}中,語言連結位於頁面頂端,標題的另一側。[[#p-lang-btn|前往頂端]]。", + "vector-language-variant-switcher-label": "變更語言變體", + "vector-action-addsection": "新增話題", + "vector-action-delete": "刪除", + "vector-action-move": "移動", + "vector-action-protect": "保護", + "vector-action-undelete": "取消刪除", + "vector-action-unprotect": "變更保護", + "vector-view-create": "建立", + "vector-view-edit": "編輯", + "vector-view-history": "檢視歷史", + "vector-view-view": "閱讀", + "vector-view-viewsource": "檢視原始碼", + "vector-jumptonavigation": "跳至導覽", + "vector-jumptosearch": "跳至搜尋", + "vector-jumptocontent": "跳至內容", + "vector-more-actions": "更多", + "vector-search-loader": "正在載入搜尋建議", + "vector-searchsuggest-containing": "搜尋包含 $1 的頁面", + "vector-intro-page": "Help:新手入門", + "vector-toc-label": "目次", + "vector-toc-beginning": "序言", + "vector-toc-toggle-button-label": "切換 $1 子章節", + "vector-anon-user-menu-pages": "用於已登出編輯者的頁面", + "vector-anon-user-menu-pages-learn": "了解更多", + "vector-anon-user-menu-pages-label": "了解更多有關編輯", + "vector-main-menu-tooltip": "主選單", + "vector-toc-menu-tooltip": "目次", + "vector-toc-collapsible-button-label": "切換目錄", + "vector-site-nav-label": "站台", + "vector-main-menu-label": "主選單", + "vector-limited-width-toggle": "切換限制內容寬度", + "vector-page-tools-label": "工具", + "vector-page-tools-general-label": "一般", + "vector-page-tools-actions-label": "操作", + "vector-pin-element-label": "移至側邊欄", + "vector-unpin-element-label": "隱藏", + "vector-2022-prefs-talkpage": "[[mw:Talk:Reading/Web/Desktop_Improvements|討論]]", + "tooltip-vector-anon-user-menu-title": "更多選項", + "vector-prefs-limited-width": "啟用限制寬度模式", + "vector-prefs-limited-width-help": "啟用限制寬度模式來改善閱讀體驗。", + "empty-language-selector-body": "頁面內容不支援其他語言。" +} diff --git a/Vector/i18n/zh-hk.json b/Vector/i18n/zh-hk.json new file mode 100644 index 0000000..d6f9018 --- /dev/null +++ b/Vector/i18n/zh-hk.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "C933103", + "LuciferianThomas", + "StarrySky", + "Winston Sung", + "Wxyveronica" + ] + }, + "vector-language-button-label": "{{PLURAL:$1|$1}} 種語言", + "vector-no-language-button-label": "添加語言", + "vector-view-edit": "編輯", + "vector-view-history": "檢視歷史", + "vector-view-view": "閱讀", + "vector-more-actions": "更多", + "vector-toc-label": "目次", + "vector-toc-beginning": "序言" +} diff --git a/Vector/i18n/zu.json b/Vector/i18n/zu.json new file mode 100644 index 0000000..ddb92ea --- /dev/null +++ b/Vector/i18n/zu.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "3atbulletz", + "Fwolff", + "Irus", + "Nkankane", + "INgobemnyama" + ] + }, + "vector-languages": "iziLimi", + "vector-no-language-button-label": "engeza iziLimi", + "vector-action-addsection": "Faka isihloko", + "vector-view-create": "Qamba", + "vector-view-edit": "Ukuhlela", + "vector-view-history": "Bona umlando", + "vector-view-view": "Funda", + "vector-more-actions": "Okunye", + "vector-toc-beginning": "ekuqaleni", + "vector-unpin-element-label": "fihla" +} diff --git a/Vector/includes/Components/VectorComponent.php b/Vector/includes/Components/VectorComponent.php new file mode 100644 index 0000000..6be3a7d --- /dev/null +++ b/Vector/includes/Components/VectorComponent.php @@ -0,0 +1,14 @@ +id = $id; + $this->href = $href; + $this->label = $label; + $this->icon = $icon; + $this->event = $event; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return [ + 'id' => $this->id, + 'href' => $this->href, + 'html-vector-button-icon' => Hooks::makeIcon( $this->icon ), + 'label' => $this->label, + 'is-quiet' => true, + 'class' => 'mw-ui-primary mw-ui-progressive', + 'event' => $this->event, + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentDropdown.php b/Vector/includes/Components/VectorComponentDropdown.php new file mode 100644 index 0000000..c781c81 --- /dev/null +++ b/Vector/includes/Components/VectorComponentDropdown.php @@ -0,0 +1,56 @@ +id = $id; + $this->label = $label; + $this->class = $class; + $this->icon = $icon; + $this->tooltip = $tooltip; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + // FIXME: Stop hardcoding button and icon styles, this assumes all dropdowns with icons are icon buttons + // Not the case for the language dropdown, page tools, etc + $icon = $this->icon; + $headingClass = $icon ? + 'mw-checkbox-hack-button mw-ui-button mw-ui-quiet mw-ui-icon-element ' : ''; + + return [ + 'id' => $this->id, + 'label' => $this->label, + 'heading-class' => $headingClass, + 'icon' => $this->icon, + 'html-vector-menu-heading-attributes' => '', + 'html-vector-menu-checkbox-attributes' => '', + 'class' => $this->class, + 'html-tooltip' => $this->tooltip, + 'checkbox-class' => '', + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentLanguageButton.php b/Vector/includes/Components/VectorComponentLanguageButton.php new file mode 100644 index 0000000..6b765af --- /dev/null +++ b/Vector/includes/Components/VectorComponentLanguageButton.php @@ -0,0 +1,34 @@ +label = $label; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return [ + 'id' => 'p-lang-btn-sticky-header', + 'class' => 'mw-interlanguage-selector', + 'is-quiet' => true, + 'tabindex' => '-1', + 'html-vector-button-icon' => Hooks::makeIcon( 'wikimedia-language' ), + 'event' => 'ui.dropdown-p-lang-btn-sticky-header', + 'label' => $this->label, + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentLanguageDropdown.php b/Vector/includes/Components/VectorComponentLanguageDropdown.php new file mode 100644 index 0000000..fb06cda --- /dev/null +++ b/Vector/includes/Components/VectorComponentLanguageDropdown.php @@ -0,0 +1,85 @@ +...` + * @param string $beforePortlet no known usages. Perhaps can be removed in future + * @param string $afterPortlet used by Extension:ULS + * @param Title|null $title + */ + public function __construct( + string $label, string $ariaLabel, string $class, int $numLanguages, + // @todo: replace with >MenuContents class. + string $itemHTML, string $beforePortlet = '', string $afterPortlet = '', $title = null + ) { + $this->label = $label; + $this->ariaLabel = $ariaLabel; + $this->class = $class; + $this->numLanguages = $numLanguages; + $this->menuContentsData = [ + 'html-items' => $itemHTML, + 'html-before-portal' => $beforePortlet, + 'html-after-portal' => $afterPortlet, + ]; + $this->title = $title; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $title = $this->title; + $isSubjectPage = $title && $title->exists() && !$title->isTalkPage(); + // If page doesn't exist or if it's in a talk namespace, we should + // display a less prominent "language" button, without a label, and + // quiet instead of progressive. For this reason some default values + // should be updated for this case. (T316559) + if ( !$isSubjectPage ) { + $icon = 'language'; + $label = ''; + $headingClass = 'mw-ui-button mw-ui-quiet mw-portlet-lang-heading-empty'; + $checkboxClass = 'mw-interlanguage-selector-empty'; + } else { + $icon = 'language-progressive'; + $label = $this->label; + $headingClass = 'mw-ui-button mw-ui-quiet ' + . self::CLASS_PROGRESSIVE . ' mw-portlet-lang-heading-' . strval( $this->numLanguages ); + $checkboxClass = 'mw-interlanguage-selector'; + } + $dropdown = new VectorComponentDropdown( 'p-lang-btn', $label, $this->class ); + $dropdownData = $dropdown->getTemplateData(); + // override default heading class. + $dropdownData['heading-class'] = $headingClass; + // ext.uls.interface attaches click handler to this selector. + $dropdownData['checkbox-class'] = $checkboxClass; + $dropdownData['icon'] = $icon; + $dropdownData['aria-label'] = $this->ariaLabel; + $dropdownData['is-language-selector-empty'] = !$isSubjectPage; + + return $dropdownData + $this->menuContentsData; + } +} diff --git a/Vector/includes/Components/VectorComponentLink.php b/Vector/includes/Components/VectorComponentLink.php new file mode 100644 index 0000000..933508d --- /dev/null +++ b/Vector/includes/Components/VectorComponentLink.php @@ -0,0 +1,66 @@ +href = $href; + $this->text = $text; + $this->icon = $icon; + $this->localizer = $localizer; + $this->accessKeyHint = $accessKeyHint; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $localizer = $this->localizer; + $accessKeyHint = $this->accessKeyHint; + $additionalAttributes = []; + if ( $localizer ) { + $msg = $localizer->msg( $accessKeyHint . '-label' ); + if ( $msg->exists() ) { + $additionalAttributes[ 'aria-label' ] = $msg->text(); + } + } + return [ + 'icon' => $this->icon, + 'text' => $this->text, + 'href' => $this->href, + 'html-attributes' => $localizer && $accessKeyHint ? Html::expandAttributes( + Linker::tooltipAndAccesskeyAttribs( + $accessKeyHint, + [], + [], + $localizer + ) + $additionalAttributes + ) : '', + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentMainMenu.php b/Vector/includes/Components/VectorComponentMainMenu.php new file mode 100644 index 0000000..924c1bd --- /dev/null +++ b/Vector/includes/Components/VectorComponentMainMenu.php @@ -0,0 +1,100 @@ +sidebarData = $sidebarData; + $this->languageData = $languageData; + $this->localizer = $localizer; + $this->isPinned = $featureManager->isFeatureEnabled( Constants::FEATURE_MAIN_MENU_PINNED ); + + if ( $user->isRegistered() ) { + $this->optOut = new VectorComponentMainMenuActionOptOut( $skin ); + + $isPageToolsEnabled = $featureManager->isFeatureEnabled( Constants::FEATURE_PAGE_TOOLS ); + if ( $isPageToolsEnabled ) { + $this->pinnableHeader = new VectorComponentPinnableHeader( + $this->localizer, + $this->isPinned, + self::ID, + 'main-menu-pinned' + ); + } + } + if ( $shouldLanguageAlertBeInSidebar ) { + $this->alert = new VectorComponentMainMenuActionLanguageSwitchAlert( $skin ); + } + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $action = $this->optOut; + $alert = $this->alert; + $pinnableHeader = $this->pinnableHeader; + + $portletsRest = []; + foreach ( $this->sidebarData[ 'array-portlets-rest' ] as $data ) { + $portletsRest[] = ( new VectorComponentMenu( $data ) )->getTemplateData(); + } + $firstPortlet = new VectorComponentMenu( $this->sidebarData['data-portlets-first'] ); + $languageMenu = new VectorComponentMenu( $this->languageData ); + + $pinnableContainer = new VectorComponentPinnableContainer( self::ID, $this->isPinned ); + $pinnableElement = new VectorComponentPinnableElement( self::ID ); + + return $pinnableElement->getTemplateData() + $pinnableContainer->getTemplateData() + [ + 'data-portlets-first' => $firstPortlet->getTemplateData(), + 'array-portlets-rest' => $portletsRest, + 'data-main-menu-action' => $action ? $action->getTemplateData() : null, + // T295555 Add language switch alert message temporarily (to be removed). + 'data-vector-language-switch-alert' => $alert ? $alert->getTemplateData() : null, + 'data-pinnable-header' => $pinnableHeader ? $pinnableHeader->getTemplateData() : null, + 'data-languages' => $languageMenu->getTemplateData(), + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentMainMenuAction.php b/Vector/includes/Components/VectorComponentMainMenuAction.php new file mode 100644 index 0000000..7c7da8d --- /dev/null +++ b/Vector/includes/Components/VectorComponentMainMenuAction.php @@ -0,0 +1,60 @@ +skin = $skin; + $this->htmlData = $htmlData; + $this->headingOptions = $headingOptions; + $this->actionName = $actionName; + } + + /** + * Generate data needed to create MainMenuAction item. + * @param array $htmlData data to make a link or raw html + * @param array $headingOptions optional heading for the html + * @return array keyed data for the MainMenuAction template + */ + private function makeMainMenuActionData( array $htmlData = [], array $headingOptions = [] ): array { + $skin = $this->skin; + $htmlContent = ''; + // Populates the main menu as a standalone link or custom html. + if ( array_key_exists( 'link', $htmlData ) ) { + $htmlContent = $skin->makeLink( 'link', $htmlData['link'] ); + } elseif ( array_key_exists( 'html-content', $htmlData ) ) { + $htmlContent = $htmlData['html-content']; + } + + return $headingOptions + [ + 'action' => $this->actionName, + 'html-content' => $htmlContent, + ]; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return $this->makeMainMenuActionData( $this->htmlData, $this->headingOptions ); + } +} diff --git a/Vector/includes/Components/VectorComponentMainMenuActionLanguageSwitchAlert.php b/Vector/includes/Components/VectorComponentMainMenuActionLanguageSwitchAlert.php new file mode 100644 index 0000000..68bc60e --- /dev/null +++ b/Vector/includes/Components/VectorComponentMainMenuActionLanguageSwitchAlert.php @@ -0,0 +1,41 @@ +skin = $skin; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $skin = $this->skin; + $languageSwitchAlert = [ + 'html-content' => Html::noticeBox( + $skin->msg( 'vector-language-redirect-to-top' )->parse(), + 'vector-language-sidebar-alert' + ), + ]; + $headingOptions = [ + 'heading' => $skin->msg( 'vector-languages' )->plain(), + ]; + + $component = new VectorComponentMainMenuAction( + 'lang-alert', $skin, $languageSwitchAlert, $headingOptions + ); + return $component->getTemplateData(); + } +} diff --git a/Vector/includes/Components/VectorComponentMainMenuActionOptOut.php b/Vector/includes/Components/VectorComponentMainMenuActionOptOut.php new file mode 100644 index 0000000..710d95c --- /dev/null +++ b/Vector/includes/Components/VectorComponentMainMenuActionOptOut.php @@ -0,0 +1,55 @@ +skin = $skin; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $skin = $this->skin; + // Note: This data is also passed to legacy template where it is unused. + $optOutUrl = [ + 'text' => $skin->msg( 'vector-opt-out' )->text(), + 'href' => SpecialPage::getTitleFor( + 'Preferences', + false, + 'mw-prefsection-rendering-skin' + )->getLinkURL( 'useskin=vector&wprov=' . self::OPT_OUT_LINK_TRACKING_CODE ), + 'title' => $skin->msg( 'vector-opt-out-tooltip' )->text(), + 'active' => false, + ]; + $htmlData = [ + 'link' => $optOutUrl, + ]; + $component = new VectorComponentMainMenuAction( 'opt-out', $skin, $htmlData, [] ); + return $component->getTemplateData(); + } +} diff --git a/Vector/includes/Components/VectorComponentMenu.php b/Vector/includes/Components/VectorComponentMenu.php new file mode 100644 index 0000000..eef50dd --- /dev/null +++ b/Vector/includes/Components/VectorComponentMenu.php @@ -0,0 +1,45 @@ +data = $data; + } + + /** + * Counts how many items the menu has. + * + * @return int + */ + public function count(): int { + $htmlItems = $this->data['html-items'] ?? ''; + return substr_count( $htmlItems, 'data + [ + 'class' => '', + 'label' => '', + 'html-tooltip' => '', + 'label-class' => '', + 'heading-class' => '', + 'html-before-portal' => '', + 'html-items' => '', + 'html-after-portal' => '', + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentMenuListItem.php b/Vector/includes/Components/VectorComponentMenuListItem.php new file mode 100644 index 0000000..72fc66a --- /dev/null +++ b/Vector/includes/Components/VectorComponentMenuListItem.php @@ -0,0 +1,35 @@ +link = $link; + $this->class = $class; + $this->id = $id; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return $this->link->getTemplateData() + [ + 'item-class' => $this->class, + 'item-id' => $this->id, + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentMenuVariants.php b/Vector/includes/Components/VectorComponentMenuVariants.php new file mode 100644 index 0000000..5a85c41 --- /dev/null +++ b/Vector/includes/Components/VectorComponentMenuVariants.php @@ -0,0 +1,46 @@ +updateVariantsMenuLabel( $data, $pageLang, $ariaLabel ) ); + } + + /** + * Change the portlets menu so the label is the selected variant + * @param array $portletData + * @param Language|StubUserLang $pageLang + * @param string $ariaLabel + * @return array + */ + private function updateVariantsMenuLabel( array $portletData, $pageLang, string $ariaLabel ): array { + $languageConverterFactory = MediaWikiServices::getInstance()->getLanguageConverterFactory(); + $converter = $languageConverterFactory->getLanguageConverter( $pageLang ); + $portletData['label'] = $pageLang->getVariantname( + $converter->getPreferredVariant() + ); + // T289523 Add aria-label data to the language variant switcher. + $portletData['aria-label'] = $ariaLabel; + return $portletData; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return parent::getTemplateData(); + } +} diff --git a/Vector/includes/Components/VectorComponentPageTools.php b/Vector/includes/Components/VectorComponentPageTools.php new file mode 100644 index 0000000..02238dd --- /dev/null +++ b/Vector/includes/Components/VectorComponentPageTools.php @@ -0,0 +1,95 @@ +menus = $menus; + $this->localizer = $localizer; + $this->isPinned = $featureManager->isFeatureEnabled( Constants::FEATURE_PAGE_TOOLS_PINNED ); + $this->pinnableHeader = new VectorComponentPinnableHeader( + $localizer, + $this->isPinned, + // Name + self::ID, + // Feature name + 'page-tools-pinned' + ); + } + + /** + * Revises the labels of the p-tb and p-cactions menus. + * + * @return array + */ + private function getMenus(): array { + return array_map( function ( $menu ) { + switch ( $menu['id'] ?? '' ) { + case self::TOOLBOX_ID: + $menu['label'] = $this->localizer->msg( 'vector-page-tools-general-label' )->text(); + break; + case self::ACTIONS_ID: + $menu['label'] = $this->localizer->msg( 'vector-page-tools-actions-label' )->text(); + break; + } + + return $menu; + }, $this->menus ); + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $pinnedContainer = new VectorComponentPinnableContainer( self::ID, $this->isPinned ); + $pinnableElement = new VectorComponentPinnableElement( self::ID ); + + $data = $pinnableElement->getTemplateData() + + $pinnedContainer->getTemplateData(); + + return $data + [ + 'data-pinnable-header' => $this->pinnableHeader->getTemplateData(), + 'data-menus' => $this->getMenus() + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentPinnableContainer.php b/Vector/includes/Components/VectorComponentPinnableContainer.php new file mode 100644 index 0000000..95c148c --- /dev/null +++ b/Vector/includes/Components/VectorComponentPinnableContainer.php @@ -0,0 +1,32 @@ +id = $id; + $this->isPinned = $isPinned; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return [ + 'id' => $this->id, + 'is-pinned' => $this->isPinned, + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentPinnableElement.php b/Vector/includes/Components/VectorComponentPinnableElement.php new file mode 100644 index 0000000..754ec39 --- /dev/null +++ b/Vector/includes/Components/VectorComponentPinnableElement.php @@ -0,0 +1,26 @@ +id = $id; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return [ + 'id' => $this->id, + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentPinnableHeader.php b/Vector/includes/Components/VectorComponentPinnableHeader.php new file mode 100644 index 0000000..eb0a722 --- /dev/null +++ b/Vector/includes/Components/VectorComponentPinnableHeader.php @@ -0,0 +1,80 @@ +localizer = $localizer; + $this->pinned = $pinned; + $this->id = $id; + $this->featureName = $featureName; + $this->moveElement = $moveElement; + $this->labelTagName = $labelTagName; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $messageLocalizer = $this->localizer; + $data = [ + 'is-pinned' => $this->pinned, + 'label' => $messageLocalizer->msg( $this->id . '-label' ), + 'label-tag-name' => $this->labelTagName, + 'pin-label' => $messageLocalizer->msg( 'vector-pin-element-label' ), + 'unpin-label' => $messageLocalizer->msg( 'vector-unpin-element-label' ), + 'data-pinnable-element-id' => $this->id, + 'data-feature-name' => $this->featureName + ]; + if ( $this->moveElement ) { + // Assumes consistent naming standard for pinnable elements and their containers + $data = array_merge( $data, [ + 'data-unpinned-container-id' => $this->id . '-unpinned-container', + 'data-pinned-container-id' => $this->id . '-pinned-container', + ] ); + } + return $data; + } +} diff --git a/Vector/includes/Components/VectorComponentSearchBox.php b/Vector/includes/Components/VectorComponentSearchBox.php new file mode 100644 index 0000000..a4ead94 --- /dev/null +++ b/Vector/includes/Components/VectorComponentSearchBox.php @@ -0,0 +1,151 @@ +config; + } + + /** + * Returns `true` if Vue search is enabled to show thumbnails and `false` otherwise. + * Note this is only relevant for Vue search experience (not legacy search). + * + * @return bool + */ + private function doesSearchHaveThumbnails(): bool { + return $this->getConfig()->get( 'VectorWvuiSearchOptions' )['showThumbnail']; + } + + /** + * Gets the value of the "input-location" parameter for the SearchBox Mustache template. + * + * @return string Either `Constants::SEARCH_BOX_INPUT_LOCATION_DEFAULT` or + * `Constants::SEARCH_BOX_INPUT_LOCATION_MOVED` + */ + private function getSearchBoxInputLocation(): string { + return $this->location; + } + + /** + * Annotates search box with Vector-specific information + * + * @param array $searchBoxData + * @param bool $isCollapsible + * @param bool $isPrimary + * @param string $formId + * @param bool $autoExpandWidth + * @return array modified version of $searchBoxData + */ + private function getSearchData( + array $searchBoxData, + bool $isCollapsible, + bool $isPrimary, + string $formId, + bool $autoExpandWidth + ) { + $searchClass = 'vector-search-box-vue '; + + if ( $isCollapsible ) { + $searchClass .= ' vector-search-box-collapses '; + } + + if ( $this->doesSearchHaveThumbnails() ) { + $searchClass .= ' ' . self::SEARCH_SHOW_THUMBNAIL_CLASS . + ( $autoExpandWidth ? ' ' . self::SEARCH_AUTO_EXPAND_WIDTH_CLASS : '' ); + } + + // Annotate search box with a component class. + $searchBoxData['class'] = trim( $searchClass ); + $searchBoxData['is-collapsible'] = $isCollapsible; + $searchBoxData['is-primary'] = $isPrimary; + $searchBoxData['form-id'] = $formId; + $searchBoxData['input-location'] = $this->getSearchBoxInputLocation(); + + // At lower resolutions the search input is hidden search and only the submit button is shown. + // It should behave like a form submit link (e.g. submit the form with no input value). + // We'll wire this up in a later task T284242. + $collapseIconAttrs = Linker::tooltipAndAccesskeyAttribs( 'search' ); + $searchBoxData['data-collapse-icon'] = array_merge( [ + 'href' => Title::newFromText( $searchBoxData['page-title'] )->getLocalURL(), + 'label' => $this->localizer->msg( 'search' ), + 'icon' => 'wikimedia-search', + 'is-quiet' => true, + 'class' => 'search-toggle', + ], $collapseIconAttrs ); + + return $searchBoxData; + } + + /** + * @param array $searchBoxData + * @param bool $isCollapsible + * @param bool $isPrimary + * @param string $formId + * @param bool $autoExpandWidth + * @param Config $config + * @param string $location + * @param MessageLocalizer $localizer + */ + public function __construct( + array $searchBoxData, + bool $isCollapsible, + bool $isPrimary, + string $formId, + bool $autoExpandWidth, + Config $config, + string $location, + MessageLocalizer $localizer + ) { + $this->searchBoxData = $searchBoxData; + $this->isCollapsible = $isCollapsible; + $this->isPrimary = $isPrimary; + $this->formId = $formId; + $this->autoExpandWidth = $autoExpandWidth; + $this->location = $location; + $this->config = $config; + $this->localizer = $localizer; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return $this->getSearchData( + $this->searchBoxData, + $this->isCollapsible, + $this->isPrimary, + $this->formId, + $this->autoExpandWidth + ); + } +} diff --git a/Vector/includes/Components/VectorComponentStickyHeader.php b/Vector/includes/Components/VectorComponentStickyHeader.php new file mode 100644 index 0000000..b9b5ed6 --- /dev/null +++ b/Vector/includes/Components/VectorComponentStickyHeader.php @@ -0,0 +1,167 @@ + '#', + 'id' => 'ca-talk-sticky-header', + 'event' => 'talk-sticky-header', + 'icon' => 'wikimedia-speechBubbles', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon' + ]; + private const SUBJECT_ICON = [ + 'href' => '#', + 'id' => 'ca-subject-sticky-header', + 'event' => 'subject-sticky-header', + 'icon' => 'wikimedia-article', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon' + ]; + private const HISTORY_ICON = [ + 'href' => '#', + 'id' => 'ca-history-sticky-header', + 'event' => 'history-sticky-header', + 'icon' => 'wikimedia-history', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon' + ]; + // Event and icon will be updated depending on watchstar state + private const WATCHSTAR_ICON = [ + 'href' => '#', + 'id' => 'ca-watchstar-sticky-header', + 'event' => 'watch-sticky-header', + 'icon' => 'wikimedia-star', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon mw-watchlink' + ]; + private const EDIT_VE_ICON = [ + 'href' => '#', + 'id' => 'ca-ve-edit-sticky-header', + 'event' => 've-edit-sticky-header', + 'icon' => 'wikimedia-edit', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon' + ]; + private const EDIT_WIKITEXT_ICON = [ + 'href' => '#', + 'id' => 'ca-edit-sticky-header', + 'event' => 'wikitext-edit-sticky-header', + 'icon' => 'wikimedia-wikiText', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon' + ]; + private const EDIT_PROTECTED_ICON = [ + 'href' => '#', + 'id' => 'ca-viewsource-sticky-header', + 'event' => 've-edit-protected-sticky-header', + 'icon' => 'wikimedia-editLock', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon' + ]; + + /** @var MessageLocalizer */ + private $localizer; + /** @var VectorComponent */ + private $search; + /** @var VectorComponent|null */ + private $langButton; + /** @var bool */ + private $includeEditIcons; + + /** + * @param MessageLocalizer $localizer + * @param VectorComponent $searchBox + * @param VectorComponent|null $langButton + * @param bool $includeEditIcons whether to include edit icons in the result + */ + public function __construct( + MessageLocalizer $localizer, + VectorComponent $searchBox, + $langButton = null, + $includeEditIcons = false + ) { + $this->search = $searchBox; + $this->langButton = $langButton; + $this->includeEditIcons = $includeEditIcons; + $this->localizer = $localizer; + } + + /** + * @param mixed $key + * @return Message + */ + private function msg( $key ): Message { + return $this->localizer->msg( $key ); + } + + /** + * Creates button data for the "Add section" button in the sticky header + * + * @return array + */ + private function getAddSectionButtonData() { + return [ + 'href' => '#', + 'id' => 'ca-addsection-sticky-header', + 'event' => 'addsection-sticky-header', + 'html-vector-button-icon' => Hooks::makeIcon( 'wikimedia-speechBubbleAdd-progressive' ), + 'label' => $this->msg( [ 'vector-2022-action-addsection', 'skin-action-addsection' ] )->text(), + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'sticky-header-icon mw-ui-primary mw-ui-progressive' + ]; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $icons = [ + self::TALK_ICON, + self::SUBJECT_ICON, + self::HISTORY_ICON, + self::WATCHSTAR_ICON, + ]; + if ( $this->includeEditIcons ) { + $icons[] = self::EDIT_WIKITEXT_ICON; + $icons[] = self::EDIT_PROTECTED_ICON; + $icons[] = self::EDIT_VE_ICON; + } + $buttons = [ + $this->getAddSectionButtonData() + ]; + if ( $this->langButton ) { + $buttons[] = $this->langButton->getTemplateData(); + } + $searchBoxData = $this->search->getTemplateData(); + + return [ + 'data-icons' => $icons, + 'data-buttons' => $buttons, + 'data-button-start' => [ + 'label' => $this->msg( 'search' ), + 'icon' => 'wikimedia-search', + 'is-quiet' => true, + 'tabindex' => '-1', + 'class' => 'vector-sticky-header-search-toggle', + 'event' => 'ui.' . $searchBoxData['form-id'] . '.icon' + ], + 'data-search' => $searchBoxData, + ]; + } +} diff --git a/Vector/includes/Components/VectorComponentTableOfContents.php b/Vector/includes/Components/VectorComponentTableOfContents.php new file mode 100644 index 0000000..edcee1a --- /dev/null +++ b/Vector/includes/Components/VectorComponentTableOfContents.php @@ -0,0 +1,98 @@ +tocData = $tocData; + $this->localizer = $localizer; + $this->isPinned = $featureManager->isFeatureEnabled( Constants::FEATURE_TOC_PINNED ); + $this->config = $config; + $this->pinnableHeader = new VectorComponentPinnableHeader( + $this->localizer, + $this->isPinned, + self::ID, + 'toc-pinned', + false, + 'h2' + ); + } + + /** + * @return bool + */ + public function isPinned(): bool { + return $this->isPinned; + } + + /** + * In tableOfContents.js we have tableOfContents::getTableOfContentsSectionsData(), + * that yields the same result as this function, please make sure to keep them in sync. + * @inheritDoc + */ + public function getTemplateData(): array { + $sections = $this->tocData[ 'array-sections' ] ?? []; + if ( empty( $sections ) ) { + return []; + } + // Populate button labels for collapsible TOC sections + foreach ( $sections as &$section ) { + if ( $section['is-top-level-section'] && $section['is-parent-section'] ) { + $section['vector-button-label'] = + $this->localizer->msg( 'vector-toc-toggle-button-label', $section['line'] )->text(); + } + } + $this->tocData[ 'array-sections' ] = $sections; + + $pinnableElement = new VectorComponentPinnableElement( self::ID ); + + return $pinnableElement->getTemplateData() + + array_merge( $this->tocData, [ + 'is-vector-toc-beginning-enabled' => $this->config->get( + 'VectorTableOfContentsBeginning' + ), + 'vector-is-collapse-sections-enabled' => + $this->tocData[ 'number-section-count'] >= $this->config->get( + 'VectorTableOfContentsCollapseAtCount' + ), + 'data-pinnable-header' => $this->pinnableHeader->getTemplateData(), + ] ); + } +} diff --git a/Vector/includes/Components/VectorComponentUserLinks.php b/Vector/includes/Components/VectorComponentUserLinks.php new file mode 100644 index 0000000..242968b --- /dev/null +++ b/Vector/includes/Components/VectorComponentUserLinks.php @@ -0,0 +1,177 @@ +localizer = $localizer; + $this->user = $user; + $this->portletData = $portletData; + $this->linkOptions = $linkOptions; + $this->userIcon = $userIcon; + } + + /** + * @param string $key + * @return Message + */ + private function msg( $key ): Message { + return $this->localizer->msg( $key ); + } + + /** + * @param bool $isDefaultAnonUserLinks + * @param bool $isAnonEditorLinksEnabled + * @return VectorComponentDropdown + */ + private function getDropdown( $isDefaultAnonUserLinks, $isAnonEditorLinksEnabled ) { + $user = $this->user; + $isAnon = !$user->isRegistered(); + + $class = 'vector-user-menu'; + if ( VectorServices::getFeatureManager()->isFeatureEnabled( Constants::FEATURE_PAGE_TOOLS ) ) { + $class .= ' mw-ui-icon-flush-right'; + } + $class .= !$isAnon ? + ' vector-user-menu-logged-in' : + ' vector-user-menu-logged-out'; + + // Hide entire user links dropdown on larger viewports if it only contains + // create account & login link, which are only shown on smaller viewports + if ( $isAnon && $isDefaultAnonUserLinks && !$isAnonEditorLinksEnabled ) { + $class .= ' user-links-collapsible-item'; + } + + $tooltip = ''; + $icon = $this->userIcon; + if ( $icon === '' ) { + $icon = 'ellipsis'; + // T287494 We use tooltip messages to provide title attributes on hover over certain menu icons. + // For modern Vector, the "tooltip-p-personal" key is set to "User menu" which is appropriate for + // the user icon (dropdown indicator for user links menu) for logged-in users. + // This overrides the tooltip for the user links menu icon which is an ellipsis for anonymous users. + $tooltip = Linker::tooltip( 'vector-anon-user-menu-title' ) ?? ''; + } + + return new VectorComponentDropdown( + 'vector-user-links-dropdown', $this->msg( 'personaltools' )->text(), $class, $icon, $tooltip + ); + } + + /** + * @param bool $isDefaultAnonUserLinks + * @param bool $isAnonEditorLinksEnabled + * @return array + */ + private function getDropdownMenus( $isDefaultAnonUserLinks, $isAnonEditorLinksEnabled ) { + $user = $this->user; + $isAnon = !$user->isRegistered(); + $portletData = $this->portletData; + + // Hide default user menu on larger viewports if it only contains + // create account & login link, which are only shown on smaller viewports + // FIXME: Replace array_merge with an add class helper function + $userMenuClass = $portletData[ 'data-user-menu' ][ 'class' ]; + $userMenuClass = $isAnon && $isDefaultAnonUserLinks ? + $userMenuClass . ' user-links-collapsible-item' : $userMenuClass; + $dropdownMenus = [ + new VectorComponentMenu( [ + 'label' => null, + 'class' => $userMenuClass + ] + $portletData[ 'data-user-menu' ] ) + ]; + + if ( $isAnon ) { + // T317789: The `anontalk` and `anoncontribs` links will not be added to + // the menu if `$wgGroupPermissions['*']['edit']` === false which can + // leave the menu empty due to our removal of other user menu items in + // `Hooks::updateUserLinksDropdownItems`. In this case, we do not want + // to render the anon "learn more" link. + if ( $isAnonEditorLinksEnabled ) { + $anonEditorLabelLinkData = [ + 'text' => $this->msg( 'vector-anon-user-menu-pages-learn' )->text(), + 'href' => Title::newFromText( $this->msg( 'vector-intro-page' )->text() )->getLocalURL(), + 'aria-label' => $this->msg( 'vector-anon-user-menu-pages-label' )->text(), + ]; + $anonEditorLabelLink = new SkinComponentLink( + '', $anonEditorLabelLinkData, $this->localizer, $this->linkOptions + ); + $anonEditorLabelLinkHtml = $anonEditorLabelLink->getTemplateData()[ 'html' ]; + $dropdownMenus[] = new VectorComponentMenu( [ + 'label' => $this->msg( 'vector-anon-user-menu-pages' )->text() . " " . $anonEditorLabelLinkHtml, + ] + $portletData[ 'data-user-menu-anon-editor' ] ); + } + } else { + // Logout isnt enabled for temp users, who are considered still considered registeredt + $isLogoutLinkEnabled = isset( $portletData[ 'data-user-menu-logout' ][ 'is-empty' ] ) && + !$portletData[ 'data-user-menu-logout'][ 'is-empty' ]; + if ( $isLogoutLinkEnabled ) { + $dropdownMenus[] = new VectorComponentMenu( [ + 'label' => null + ] + $portletData[ 'data-user-menu-logout' ] ); + } + } + + return $dropdownMenus; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $portletData = $this->portletData; + + $isDefaultAnonUserLinks = count( $portletData['data-user-menu']['array-items'] ) === 2; + $isAnonEditorLinksEnabled = isset( $portletData['data-user-menu-anon-editor']['is-empty'] ) + && !$portletData['data-user-menu-anon-editor']['is-empty']; + + $overflowMenu = new VectorComponentMenu( [ + 'label' => null, + ] + $portletData[ 'data-vector-user-menu-overflow' ] ); + + return [ + 'is-wide' => count( $overflowMenu ) > 3, + 'data-user-links-overflow-menu' => $overflowMenu->getTemplateData(), + 'data-user-links-dropdown' => $this->getDropdown( $isDefaultAnonUserLinks, $isAnonEditorLinksEnabled ) + ->getTemplateData(), + 'data-user-links-dropdown-menus' => array_map( static function ( $menu ) { + return $menu->getTemplateData(); + }, $this->getDropdownMenus( $isDefaultAnonUserLinks, $isAnonEditorLinksEnabled ) ), + ]; + } +} diff --git a/Vector/includes/Constants.php b/Vector/includes/Constants.php new file mode 100644 index 0000000..c323b81 --- /dev/null +++ b/Vector/includes/Constants.php @@ -0,0 +1,291 @@ + + */ + private $features = []; + + /** + * A map of requirement name to the Requirement instance that represents it. + * + * The names of requirements are assumed to be static for the lifetime of the request. Therefore + * we can use them to look up Requirement instances quickly. + * + * @var Array + */ + private $requirements = []; + + /** + * Register a feature and its requirements. + * + * Essentially, a "feature" is a friendly (hopefully) name for some component, however big or + * small, that has some requirements. A feature manager allows us to decouple the component's + * logic from its requirements, allowing them to vary independently. Moreover, the use of + * friendly names wherever possible allows us to define a common language with our non-technical + * colleagues. + * + * ```php + * $featureManager->registerFeature( 'featureA', 'requirementA' ); + * ``` + * + * defines the "featureA" feature, which is enabled when the "requirementA" requirement is met. + * + * ```php + * $featureManager->registerFeature( 'featureB', [ 'requirementA', 'requirementB' ] ); + * ``` + * + * defines the "featureB" feature, which is enabled when the "requirementA" and "requirementB" + * requirements are met. Note well that the feature is only enabled when _all_ requirements are + * met, i.e. the requirements are evaluated in order and logically `AND`ed together. + * + * @param string $feature The name of the feature + * @param string|array $requirements The feature's requirements. As above, you can define a + * feature that requires a single requirement via the shorthand + * + * ```php + * $featureManager->registerFeature( 'feature', 'requirementA' ); + * // Equivalent to $featureManager->registerFeature( 'feature', [ 'requirementA' ] ); + * ``` + * + * @throws \LogicException If the feature is already registered + * @throws \Wikimedia\Assert\ParameterAssertionException If the feature's requirements aren't + * the name of a single requirement or a list of requirements + * @throws \InvalidArgumentException If the feature references a requirement that isn't + * registered + */ + public function registerFeature( string $feature, $requirements ) { + // + // Validation + if ( array_key_exists( $feature, $this->features ) ) { + throw new \LogicException( sprintf( + 'Feature "%s" is already registered.', + $feature + ) ); + } + + Assert::parameterType( 'string|array', $requirements, 'requirements' ); + + $requirements = (array)$requirements; + + Assert::parameterElementType( 'string', $requirements, 'requirements' ); + + foreach ( $requirements as $name ) { + if ( !array_key_exists( $name, $this->requirements ) ) { + throw new \InvalidArgumentException( sprintf( + 'Feature "%s" references requirement "%s", which hasn\'t been registered', + $feature, + $name + ) ); + } + } + + // Mutation + $this->features[$feature] = $requirements; + } + + /** + * Return a list of classes that should be added to the body tag + * + * @return array + */ + public function getFeatureBodyClass() { + $featureManager = $this; + return array_map( static function ( $featureName ) use ( $featureManager ) { + // switch to lower case and switch from camel case to hyphens + $featureClass = ltrim( strtolower( preg_replace( '/[A-Z]([A-Z](?![a-z]))*/', '-$0', $featureName ) ), '-' ); + $prefix = 'vector-feature-' . $featureClass . '-'; + return $featureManager->isFeatureEnabled( $featureName ) ? $prefix . 'enabled' : $prefix . 'disabled'; + }, array_keys( $this->features ) ); + } + + /** + * Gets whether the feature's requirements are met. + * + * @param string $feature + * @return bool + * + * @throws \InvalidArgumentException If the feature isn't registered + */ + public function isFeatureEnabled( string $feature ): bool { + if ( !array_key_exists( $feature, $this->features ) ) { + throw new \InvalidArgumentException( "The feature \"{$feature}\" isn't registered." ); + } + + $requirements = $this->features[$feature]; + + foreach ( $requirements as $name ) { + if ( !$this->requirements[$name]->isMet() ) { + return false; + } + } + + return true; + } + + /** + * Register a complex {@see Requirement}. + * + * A complex requirement is one that depends on object that may or may not be fully loaded + * while the application is booting, e.g. see `User::isSafeToLoad`. + * + * Such requirements are expected to be registered during a hook that is run early on in the + * application lifecycle, e.g. the `BeforePerformAction` and `APIBeforeMain` hooks. + * + * @param Requirement $requirement + * + * @throws \LogicException If the requirement has already been registered + */ + public function registerRequirement( Requirement $requirement ) { + $name = $requirement->getName(); + + if ( array_key_exists( $name, $this->requirements ) ) { + throw new \LogicException( "The requirement \"{$name}\" is already registered." ); + } + + $this->requirements[$name] = $requirement; + } + + /** + * Register a {@see SimpleRequirement}. + * + * A requirement is some condition of the application state that a feature requires to be true + * or false. + * + * @param string $name The name of the requirement + * @param bool $isMet Whether the requirement is met + * + * @throws \LogicException If the requirement has already been registered + */ + public function registerSimpleRequirement( string $name, bool $isMet ) { + $this->registerRequirement( new SimpleRequirement( $name, $isMet ) ); + } + + /** + * Gets whether the requirement is met. + * + * @param string $name The name of the requirement + * @return bool + * + * @throws \InvalidArgumentException If the requirement isn't registered + */ + public function isRequirementMet( string $name ): bool { + if ( !array_key_exists( $name, $this->requirements ) ) { + throw new \InvalidArgumentException( "Requirement \"{$name}\" isn't registered." ); + } + + return $this->requirements[$name]->isMet(); + } +} diff --git a/Vector/includes/FeatureManagement/Requirement.php b/Vector/includes/FeatureManagement/Requirement.php new file mode 100644 index 0000000..a02810f --- /dev/null +++ b/Vector/includes/FeatureManagement/Requirement.php @@ -0,0 +1,47 @@ +registerRequirement( + * new DynamicConfigRequirement( + * $config, + * MainConfigNames::Sitename, + * 'requirementName' + * ) + * ); + * ``` + * + * registers a requirement that will evaluate to true only when `mediawiki/includes/Setup.php` has + * finished executing (after all service wiring has executed). I.e., every call to + * `Requirement->isMet()` reinterrogates the Config object for the current state and returns it. + * Contrast to + * + * ```lang=php + * $featureManager->registerSimpleRequirement( + * 'requirementName', + * (bool)$config->get( MainConfigNames::Sitename ) + * ); + * ``` + * + * wherein state is evaluated only once at registration time and permanently cached. + * + * NOTE: This API hasn't settled. It may change at any time without warning. Please don't bind to + * it unless you absolutely need to + * + * @unstable + * + * @package MediaWiki\Skins\Vector\FeatureManagement\Requirements + * @internal + */ +final class DynamicConfigRequirement implements Requirement { + + /** + * @var \Config + */ + private $config; + + /** + * @var string + */ + private $configName; + + /** + * @var string + */ + private $requirementName; + + /** + * @param \Config $config + * @param string $configName Any `Config` key. This name is used to query `$config` state. E.g., + * `'DBname'`. See https://www.mediawiki.org/wiki/Manual:Configuration_settings + * @param string $requirementName The name of the requirement presented to FeatureManager. + * This name _usually_ matches the `$configName` parameter for simplicity but allows for + * abstraction as needed. See `Requirement->getName()`. + */ + public function __construct( \Config $config, string $configName, string $requirementName ) { + $this->config = $config; + $this->configName = $configName; + $this->requirementName = $requirementName; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->requirementName; + } + + /** + * @inheritDoc + */ + public function isMet(): bool { + return (bool)$this->config->get( $this->configName ); + } +} diff --git a/Vector/includes/FeatureManagement/Requirements/LimitedWidthContentRequirement.php b/Vector/includes/FeatureManagement/Requirements/LimitedWidthContentRequirement.php new file mode 100644 index 0000000..4a4fce4 --- /dev/null +++ b/Vector/includes/FeatureManagement/Requirements/LimitedWidthContentRequirement.php @@ -0,0 +1,159 @@ +config = $config; + $this->title = $title; + $this->request = $request; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return Constants::REQUIREMENT_LIMITED_WIDTH_CONTENT; + } + + /** + * Per the $options configuration (for use with $wgVectorMaxWidthOptions) + * determine whether max-width should be disabled on the page. + * For the main page: Check the value of $options['exclude']['mainpage'] + * For all other pages, the following will happen: + * - the array $options['include'] of canonical page names will be checked + * against the current page. If a page has been listed there, function will return false + * (max-width will not be disabled) + * Max width is disabled if: + * 1) The current namespace is listed in array $options['exclude']['namespaces'] + * OR + * 2) A query string parameter matches one of the regex patterns in $exclusions['querystring']. + * + * @internal only for use inside tests. + * @param array $options + * @param Title $title + * @param WebRequest $request + * @return bool + */ + private static function shouldDisableMaxWidth( array $options, Title $title, WebRequest $request ) { + $canonicalTitle = $title->getRootTitle(); + + $inclusions = $options['include'] ?? []; + $exclusions = $options['exclude'] ?? []; + + if ( $title->isMainPage() ) { + // only one check to make + return $exclusions['mainpage'] ?? false; + } elseif ( $canonicalTitle->isSpecialPage() ) { + $canonicalTitle->fixSpecialName(); + } + + // + // Check the inclusions based on the canonical title + // The inclusions are checked first as these trump any exclusions. + // + // Now we have the canonical title and the inclusions link we look for any matches. + foreach ( $inclusions as $titleText ) { + $includedTitle = Title::newFromText( $titleText ); + + if ( $canonicalTitle->equals( $includedTitle ) ) { + return false; + } + } + + // + // Check the exclusions + // If nothing matches the exclusions to determine what should happen + // + $excludeNamespaces = $exclusions['namespaces'] ?? []; + // Max width is disabled on certain namespaces + if ( $title->inNamespaces( $excludeNamespaces ) ) { + return true; + } + $excludeQueryString = $exclusions['querystring'] ?? []; + + foreach ( $excludeQueryString as $param => $excludedParamPattern ) { + $paramValue = $request->getRawVal( $param ); + if ( $paramValue !== null ) { + if ( $excludedParamPattern === '*' ) { + // Backwards compatibility for the '*' wildcard. + $excludedParamPattern = '.+'; + } + return (bool)preg_match( "/$excludedParamPattern/", $paramValue ); + } + } + + return false; + } + + /** + * Check query parameter to override config or not. + * Then check for AB test value. + * Fallback to config value. + * + * @inheritDoc + */ + public function isMet(): bool { + return $this->title && !self::shouldDisableMaxWidth( + $this->config->get( 'VectorMaxWidthOptions' ), + $this->title, + $this->request + ); + } +} diff --git a/Vector/includes/FeatureManagement/Requirements/LoggedInRequirement.php b/Vector/includes/FeatureManagement/Requirements/LoggedInRequirement.php new file mode 100644 index 0000000..30cd9d1 --- /dev/null +++ b/Vector/includes/FeatureManagement/Requirements/LoggedInRequirement.php @@ -0,0 +1,68 @@ +user = $user; + $this->name = $name; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->name; + } + + /** + * Returns true if the user is logged-in and false otherwise. + * + * @inheritDoc + */ + public function isMet(): bool { + return $this->user->isRegistered(); + } +} diff --git a/Vector/includes/FeatureManagement/Requirements/OverridableConfigRequirement.php b/Vector/includes/FeatureManagement/Requirements/OverridableConfigRequirement.php new file mode 100644 index 0000000..88234d9 --- /dev/null +++ b/Vector/includes/FeatureManagement/Requirements/OverridableConfigRequirement.php @@ -0,0 +1,208 @@ +registerRequirement( + * new OverridableConfigRequirement( + * $config, + * $user, + * $request, + * $centralIdLookup, + * MainConfigNames::Sitename, + * 'requirementName', + * 'overrideName', + * 'configTestName', + * ) + * ); + * ``` + * + * registers a requirement that will evaluate to true only when `mediawiki/includes/Setup.php` has + * finished executing (after all service wiring has executed). I.e., every call to + * `Requirement->isMet()` re-interrogates the request, user authentication status, + * and config object for the current state and returns it. Contrast to: + * + * ```lang=php + * $featureManager->registerSimpleRequirement( + * 'requirementName', + * (bool)$config->get( MainConfigNames::Sitename ) + * ); + * ``` + * + * wherein state is evaluated only once at registration time and permanently cached. + * + * NOTE: This API hasn't settled. It may change at any time without warning. Please don't bind to + * it unless you absolutely need to + * + * @package MediaWiki\Skins\Vector\FeatureManagement\Requirements + */ +final class OverridableConfigRequirement implements Requirement { + + /** + * @var Config + */ + private $config; + + /** + * @var User + */ + private $user; + + /** + * @var WebRequest + */ + private $request; + + /** + * @var CentralIdLookup|null + */ + private $centralIdLookup; + + /** + * @var string + */ + private $configName; + + /** + * @var string + */ + private $requirementName; + + /** + * @var string + */ + private $overrideName; + + /** + * @var string|null + */ + private $configTestName; + + /** + * This constructor accepts all dependencies needed to determine whether + * the overridable config is enabled for the current user and request. + * + * @param Config $config + * @param User $user + * @param WebRequest $request + * @param CentralIdLookup|null $centralIdLookup + * @param string $configName Any `Config` key. This name is used to query `$config` state. + * @param string $requirementName The name of the requirement presented to FeatureManager. + * @param string|null $overrideName The name of the override presented to FeatureManager, i.e. query parameter. + * When not set defaults to lowercase version of config key. + * @param string|null $configTestName The name of the AB test config presented to FeatureManager if applicable. + */ + public function __construct( + Config $config, + User $user, + WebRequest $request, + ?CentralIdLookup $centralIdLookup, + string $configName, + string $requirementName, + ?string $overrideName = null, + ?string $configTestName = null + ) { + $this->config = $config; + $this->user = $user; + $this->request = $request; + $this->centralIdLookup = $centralIdLookup; + $this->configName = $configName; + $this->requirementName = $requirementName; + $this->overrideName = $overrideName === null ? strtolower( $configName ) : $overrideName; + $this->configTestName = $configTestName; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->requirementName; + } + + /** + * Check query parameter to override config or not. + * Then check for AB test value. + * Fallback to config value. + * + * @inheritDoc + */ + public function isMet(): bool { + // Check query parameter. + if ( $this->request->getCheck( $this->overrideName ) ) { + return $this->request->getBool( $this->overrideName ); + } + + // Check if there's config for AB testing. + if ( + !empty( $this->configTestName ) && + (bool)$this->config->get( $this->configTestName ) && + $this->user->isRegistered() + ) { + $id = null; + if ( $this->centralIdLookup ) { + $id = $this->centralIdLookup->centralIdFromLocalUser( $this->user ); + } + + // $id will be 0 if the central ID lookup failed. + if ( !$id ) { + $id = $this->user->getId(); + } + + return $id % 2 === 0; + } + + // If AB test is not enabled, fallback to checking config state. + $thisConfig = $this->config->get( $this->configName ); + + // Backwards compatibility with config variables that have been set in production. + if ( is_bool( $thisConfig ) ) { + $thisConfig = [ + 'logged_in' => $thisConfig, + 'logged_out' => $thisConfig, + ]; + } elseif ( array_key_exists( 'default', $thisConfig ) ) { + $thisConfig = [ + 'default' => $thisConfig['default'], + ]; + } else { + $thisConfig = [ + 'logged_in' => $thisConfig['logged_in'] ?? false, + 'logged_out' => $thisConfig['logged_out'] ?? false, + ]; + } + + // Fallback to config. + return array_key_exists( 'default', $thisConfig ) ? + $thisConfig[ 'default' ] : + $thisConfig[ $this->user->isRegistered() ? 'logged_in' : 'logged_out' ]; + } +} diff --git a/Vector/includes/FeatureManagement/Requirements/SimpleRequirement.php b/Vector/includes/FeatureManagement/Requirements/SimpleRequirement.php new file mode 100644 index 0000000..79908f7 --- /dev/null +++ b/Vector/includes/FeatureManagement/Requirements/SimpleRequirement.php @@ -0,0 +1,70 @@ +name = $name; + $this->isMet = $isMet; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->name; + } + + /** + * @inheritDoc + */ + public function isMet(): bool { + return $this->isMet; + } +} diff --git a/Vector/includes/FeatureManagement/Requirements/UserPreferenceRequirement.php b/Vector/includes/FeatureManagement/Requirements/UserPreferenceRequirement.php new file mode 100644 index 0000000..a91501c --- /dev/null +++ b/Vector/includes/FeatureManagement/Requirements/UserPreferenceRequirement.php @@ -0,0 +1,115 @@ +user = $user; + $this->userOptionsLookup = $userOptionsLookup; + $this->optionName = $optionName; + $this->requirementName = $requirementName; + $this->title = $title; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->requirementName; + } + + /** + * Checks whether the user preference is enabled or not. Returns true if + * enabled AND title is not null. + * + * @internal + * + * @return bool + */ + public function isPreferenceEnabled() { + $user = $this->user; + $userOptionsLookup = $this->userOptionsLookup; + $isEnabled = $userOptionsLookup->getBoolOption( + $user, + $this->optionName + ); + + return $this->title && $isEnabled; + } + + /** + * @inheritDoc + */ + public function isMet(): bool { + return $this->isPreferenceEnabled(); + } +} diff --git a/Vector/includes/FeatureManagement/TODO.md b/Vector/includes/FeatureManagement/TODO.md new file mode 100644 index 0000000..017407d --- /dev/null +++ b/Vector/includes/FeatureManagement/TODO.md @@ -0,0 +1,11 @@ +TODO +==== + +Currently the `FeatureManager` class is a very shallow interpretation of Piotr Miazga's proposed +API and associated scaffolding classes (see https://phabricator.wikimedia.org/T244481 and +https://gerrit.wikimedia.org/r/#/c/mediawiki/skins/Vector/+/572323/). This document aims to list +the steps required to get from this system to something as powerful as Piotr's. + +1. Consider supporing memoization of those requirements (see https://gerrit.wikimedia.org/r/#/c/mediawiki/skins/Vector/+/573626/7/includes/FeatureManagement/FeatureManager.php@68) +2. Add support for getting all requirements +3. Add support for getting all features enabled when a requirement is enabled/disabled diff --git a/Vector/includes/Hooks.php b/Vector/includes/Hooks.php new file mode 100644 index 0000000..ecbabcc --- /dev/null +++ b/Vector/includes/Hooks.php @@ -0,0 +1,744 @@ +() + * @package Vector + * @internal + */ +class Hooks implements + GetPreferencesHook, + LocalUserCreatedHook, + MakeGlobalVariablesScriptHook, + ResourceLoaderSiteModulePagesHook, + ResourceLoaderSiteStylesModulePagesHook, + RequestContextCreateSkinHook, + SkinPageReadyConfigHook +{ + /** + * Checks if the current skin is a variant of Vector + * + * @param string $skinName + * @return bool + */ + private static function isVectorSkin( string $skinName ): bool { + return ( + $skinName === Constants::SKIN_NAME_LEGACY || + $skinName === Constants::SKIN_NAME_MODERN + ); + } + + /** + * @param Config $config + * @return array + */ + private static function getActiveABTest( $config ) { + $ab = $config->get( + Constants::CONFIG_WEB_AB_TEST_ENROLLMENT + ); + if ( count( $ab ) === 0 ) { + // If array is empty then no experiment and need to validate. + return $ab; + } + if ( !array_key_exists( 'buckets', $ab ) ) { + throw new RuntimeException( 'Invalid VectorWebABTestEnrollment value: Must contain buckets key.' ); + } + if ( !array_key_exists( 'unsampled', $ab['buckets'] ) ) { + throw new RuntimeException( 'Invalid VectorWebABTestEnrollment value: Must define an `unsampled` bucket.' ); + } else { + // check bucket values. + foreach ( $ab['buckets'] as $bucketName => $bucketDefinition ) { + if ( !is_array( $bucketDefinition ) ) { + throw new RuntimeException( 'Invalid VectorWebABTestEnrollment value: Buckets should be arrays' ); + } + $samplingRate = $bucketDefinition['samplingRate']; + if ( is_string( $samplingRate ) ) { + throw new RuntimeException( + 'Invalid VectorWebABTestEnrollment value: Sampling rate should be number between 0 and 1.' + ); + } + } + } + + return $ab; + } + + /** + * Passes config variables to Vector (modern) ResourceLoader module. + * @param RL\Context $context + * @param Config $config + * @return array + */ + public static function getVectorResourceLoaderConfig( + RL\Context $context, + Config $config + ) { + return [ + 'wgVectorSearchApiUrl' => $config->get( 'VectorSearchApiUrl' ), + 'wgVectorWebABTestEnrollment' => self::getActiveABTest( $config ), + ]; + } + + /** + * Generates config variables for skins.vector.search Resource Loader module (defined in + * skin.json). + * + * @param RL\Context $context + * @param Config $config + * @return array + */ + public static function getVectorSearchResourceLoaderConfig( + RL\Context $context, + Config $config + ): array { + $result = $config->get( 'VectorWvuiSearchOptions' ); + $result['highlightQuery'] = + VectorServices::getLanguageService()->canWordsBeSplitSafely( $context->getLanguage() ); + + return $result; + } + + /** + * SkinPageReadyConfig hook handler + * + * Replace searchModule provided by skin. + * + * @since 1.35 + * @param RL\Context $context + * @param mixed[] &$config Associative array of configurable options + * @return void This hook must not abort, it must return no value + */ + public function onSkinPageReadyConfig( + RL\Context $context, + array &$config + ): void { + // It's better to exit before any additional check + if ( !self::isVectorSkin( $context->getSkin() ) ) { + return; + } + + // Tell the `mediawiki.page.ready` module not to wire up search. + // This allows us to use the new Vue implementation. + // Context has no knowledge of legacy / modern Vector + // and from its point of view they are the same thing. + // Please see the modules `skins.vector.js` and `skins.vector.legacy.js` + // for the wire up of search. + // The related method self::getVectorResourceLoaderConfig handles which + // search to load. + $config['search'] = false; + } + + /** + * Moves watch item from actions to views menu. + * + * @internal used inside Hooks::onSkinTemplateNavigation + * @param array &$content_navigation + */ + private static function updateActionsMenu( &$content_navigation ) { + $key = null; + if ( isset( $content_navigation['actions']['watch'] ) ) { + $key = 'watch'; + } + if ( isset( $content_navigation['actions']['unwatch'] ) ) { + $key = 'unwatch'; + } + + // Promote watch link from actions to views and add an icon + // The second check to isset is pointless but shuts up phan. + if ( $key !== null && isset( $content_navigation['actions'][ $key ] ) ) { + $content_navigation['views'][$key] = $content_navigation['actions'][$key]; + unset( $content_navigation['actions'][$key] ); + } + } + + /** + * Adds icons to items in the "views" menu. + * + * @internal used inside Hooks::onSkinTemplateNavigation + * @param array &$content_navigation + * @param bool $isLegacy is this the legacy Vector skin? + */ + private static function updateViewsMenuIcons( &$content_navigation, $isLegacy ) { + $featureManager = VectorServices::getFeatureManager(); + + foreach ( $content_navigation['views'] as $key => $item ) { + $icon = $item['icon'] ?? null; + if ( $icon ) { + if ( $isLegacy ) { + self::appendClassToItem( + $item['class'], + [ 'icon' ] + ); + } else { + // Force the item as a button with hidden text. + $item['button'] = true; + $item['text-hidden'] = true; + $item = self::updateMenuItemData( $item, true ); + } + } elseif ( !$isLegacy ) { + // The vector-tab-noicon class is only used in Vector-22. + self::appendClassToItem( + $item['class'], + [ 'vector-tab-noicon' ] + ); + } + $content_navigation['views'][$key] = $item; + } + } + + /** + * All associated pages menu items do not have icons so are given the vector-tab-noicon class. + * + * @internal used inside Hooks::onSkinTemplateNavigation + * @param array &$content_navigation + */ + private static function updateAssociatedPagesMenuIcons( &$content_navigation ) { + foreach ( $content_navigation['associated-pages'] as $key => $item ) { + self::appendClassToItem( + $item['class'], + [ 'vector-tab-noicon' ] + ); + $content_navigation['associated-pages'][$key] = $item; + } + } + + /** + * Adds class to a property + * + * @param array &$item to update + * @param array|string $classes to add to the item + */ + private static function appendClassToItem( &$item, $classes ) { + $existingClasses = $item; + + if ( is_array( $existingClasses ) ) { + // Treat as array + $newArrayClasses = is_array( $classes ) ? $classes : [ trim( $classes ) ]; + $item = array_merge( $existingClasses, $newArrayClasses ); + } elseif ( is_string( $existingClasses ) ) { + // Treat as string + $newStrClasses = is_string( $classes ) ? trim( $classes ) : implode( ' ', $classes ); + $item .= ' ' . $newStrClasses; + } else { + // Treat as whatever $classes is + $item = $classes; + } + + if ( is_string( $item ) ) { + $item = trim( $item ); + } + } + + /** + * Updates personal navigation menu (user links) dropdown for modern Vector: + * - Adds icons + * - Makes user page and watchlist collapsible + * + * @internal used inside ::updateUserLinksItems + * @param SkinTemplate $sk + * @param array &$content_navigation + * @suppress PhanTypeInvalidDimOffset + */ + private static function updateUserLinksDropdownItems( $sk, &$content_navigation ) { + // For logged-in users in modern Vector, rearrange some links in the personal toolbar. + $user = $sk->getUser(); + $isRegistered = $user->isRegistered(); + if ( $isRegistered ) { + // Remove user page from personal menu dropdown for logged in use + $content_navigation['user-menu']['userpage']['collapsible'] = true; + // watchlist may be disabled if $wgGroupPermissions['*']['viewmywatchlist'] = false; + // See [[phab:T299671]] + if ( isset( $content_navigation['user-menu']['watchlist'] ) ) { + $content_navigation['user-menu']['watchlist']['collapsible'] = true; + } + + // Anon editor links handled manually in new anon editor menu + $logoutMenu = []; + if ( isset( $content_navigation['user-menu']['logout'] ) ) { + $logoutMenu['logout'] = $content_navigation['user-menu']['logout']; + $logoutMenu['logout']['id'] = 'pt-logout'; + unset( $content_navigation['user-menu']['logout'] ); + } + $content_navigation['user-menu-logout'] = $logoutMenu; + + self::updateMenuItems( $content_navigation, 'user-menu' ); + self::updateMenuItems( $content_navigation, 'user-menu-logout' ); + } + + if ( !$isRegistered ) { + // Remove "Not logged in" from personal menu dropdown for anon users. + unset( $content_navigation['user-menu']['anonuserpage'] ); + + // Make login and create account collapsible + if ( isset( $content_navigation['user-menu']['login'] ) ) { + $content_navigation['user-menu']['login']['collapsible'] = true; + } + if ( isset( $content_navigation['user-menu']['login-private'] ) ) { + $content_navigation['user-menu']['login-private']['collapsible'] = true; + } + if ( isset( $content_navigation['user-menu']['createaccount'] ) ) { + $content_navigation['user-menu']['createaccount']['collapsible'] = true; + } + + // Anon editor links handled manually in new anon editor menu + $anonEditorMenu = []; + if ( isset( $content_navigation['user-menu']['anoncontribs'] ) ) { + $anonEditorMenu['anoncontribs'] = $content_navigation['user-menu']['anoncontribs']; + $anonEditorMenu['anoncontribs']['id'] = 'pt-anoncontribs'; + unset( $content_navigation['user-menu']['anoncontribs'] ); + } + if ( isset( $content_navigation['user-menu']['anontalk'] ) ) { + $anonEditorMenu['anontalk'] = $content_navigation['user-menu']['anontalk']; + $anonEditorMenu['anontalk']['id'] = 'pt-anontalk'; + unset( $content_navigation['user-menu']['anontalk'] ); + } + $content_navigation['user-menu-anon-editor'] = $anonEditorMenu; + + // Only show icons for anon menu items (login and create account). + self::updateMenuItems( $content_navigation, 'user-menu' ); + } + } + + /** + * Populates 'vector-user-menu-overflow' bucket for modern Vector with modified personal navigation (user links) + * menu items, including 'notification', 'user-interface-preferences', 'user-page', 'vector-user-menu-overflow' + * + * @internal used inside ::updateUserLinksItems + * @param SkinTemplate $sk + * @param array &$content_navigation + */ + private static function updateUserLinksOverflowItems( $sk, &$content_navigation ) { + $overflow = 'vector-user-menu-overflow'; + $content_navigation[$overflow] = []; + $featureManager = VectorServices::getFeatureManager(); + + // Logged in and logged out overflow items + if ( isset( $content_navigation['user-interface-preferences']['uls'] ) ) { + $content_navigation[$overflow]['uls'] = array_merge( + $content_navigation['user-interface-preferences']['uls'], [ + 'collapsible' => true, + ] ); + } + + // Logged in overflow items + if ( isset( $content_navigation['user-page']['userpage'] ) ) { + $content_navigation[$overflow]['userpage'] = array_merge( + $content_navigation['user-page']['userpage'], [ + // T312157: Style the userpage link as a blue link rather than a quiet button. + 'button' => false, + 'collapsible' => true, + // Remove icon + 'icon' => '', + ] ); + } + if ( isset( $content_navigation['notifications'] ) ) { + foreach ( $content_navigation['notifications'] as $key => $data ) { + $content_navigation[$overflow][$key] = $data; + $icon = $data['icon'] ?? null; + if ( $icon ) { + $linkClass = $content_navigation[$overflow][$key]['link-class'] ?? []; + $item = $content_navigation[$overflow][$key]; + $newLinkClass = [ + // Allows Echo to react to clicks + 'mw-echo-notification-badge-nojs' + ]; + if ( in_array( 'mw-echo-unseen-notifications', $linkClass ) ) { + $newLinkClass[] = 'mw-echo-unseen-notifications'; + } + $item['button'] = true; + $item['text-hidden'] = true; + $item['link-class'] = $newLinkClass; + $content_navigation[$overflow][$key] = $item; + } + } + } + if ( isset( $content_navigation['user-menu']['watchlist'] ) ) { + $content_navigation[$overflow]['watchlist'] = array_merge( + $content_navigation['user-menu']['watchlist'], [ + 'id' => 'pt-watchlist-2', + 'button' => true, + 'collapsible' => true, + 'text-hidden' => true, + ] ); + } + + // Anon/temp overflow items + if ( isset( $content_navigation['user-menu']['createaccount'] ) ) { + $content_navigation[$overflow]['createaccount'] = array_merge( + $content_navigation['user-menu']['createaccount'], [ + 'id' => 'pt-createaccount-2', + 'collapsible' => true, + // Remove icon + 'icon' => '', + ] ); + } + if ( isset( $content_navigation['user-menu']['login'] ) ) { + $content_navigation[$overflow]['login'] = array_merge( + $content_navigation['user-menu']['login'], [ + 'id' => 'pt-login-2', + 'collapsible' => true, + // Remove icon + 'icon' => '', + ] ); + } + if ( isset( $content_navigation['user-menu']['login-private'] ) ) { + $content_navigation[$overflow]['login-private'] = array_merge( + $content_navigation['user-menu']['login-private'], [ + 'id' => 'pt-login-private-2', + 'collapsible' => true, + // Remove icon + 'icon' => '', + ] ); + } + + self::updateMenuItems( $content_navigation, $overflow ); + } + + /** + * Updates personal navigation menu (user links) for modern Vector wherein user page, create account and login links + * are removed from the dropdown to be handled separately. In legacy Vector, the custom "user-page" bucket is + * removed to preserve existing behavior. + * + * @internal used inside Hooks::onSkinTemplateNavigation + * @param SkinTemplate $sk + * @param array &$content_navigation + */ + private static function updateUserLinksItems( $sk, &$content_navigation ) { + $skinName = $sk->getSkinName(); + if ( self::isSkinVersionLegacy( $skinName ) ) { + // Remove user page from personal toolbar since it will be inside the personal menu for logged-in + // users in legacy Vector. + unset( $content_navigation['user-page'] ); + } else { + self::updateUserLinksOverflowItems( $sk, $content_navigation ); + self::updateUserLinksDropdownItems( $sk, $content_navigation ); + } + } + + /** + * Modifies list item to make it collapsible. + * + * @internal used in ::updateItemData and ::createMoreOverflowMenu + * @param array &$item + * @param string $prefix defaults to user-links- + */ + private static function makeMenuItemCollapsible( array &$item, string $prefix = 'user-links-' ) { + $COLLAPSE_MENU_ITEM_CLASS = $prefix . 'collapsible-item'; + self::appendClassToItem( $item[ 'class' ], $COLLAPSE_MENU_ITEM_CLASS ); + } + + /** + * Make an icon + * + * @internal for use inside Vector skin. + * @param string $name + * @return string of HTML + */ + public static function makeIcon( $name ) { + // Html::makeLink will pass this through rawElement + return ''; + } + + /** + * Update template data to include classes and html that handle buttons, icons, and collapsible items. + * + * @internal used in ::updateMenuItemData + * @param array $item data to update + * @param string $buttonClassProp property to append button classes + * @param string $iconHtmlProp property to set icon HTML + * @param bool $isSmallIcon when set a small icon will be applied rather than the standard icon size + * @return array $item Updated data + */ + private static function updateItemData( $item, $buttonClassProp, $iconHtmlProp, $isSmallIcon = false ) { + $hasButton = $item['button'] ?? false; + $hideText = $item['text-hidden'] ?? false; + $isCollapsible = $item['collapsible'] ?? false; + $icon = $item['icon'] ?? ''; + unset( $item['button'] ); + unset( $item['icon'] ); + unset( $item['text-hidden'] ); + unset( $item['collapsible'] ); + + if ( $isCollapsible ) { + self::makeMenuItemCollapsible( $item ); + } + if ( $hasButton ) { + self::appendClassToItem( $item[ $buttonClassProp ], [ 'mw-ui-button', 'mw-ui-quiet' ] ); + } + if ( $icon ) { + if ( $hideText ) { + $iconElementClasses = [ 'mw-ui-icon', 'mw-ui-icon-element', + // Some extensions declare icons without the wikimedia- prefix. e.g. Echo + 'mw-ui-icon-' . $icon, + // FIXME: Some icon names are prefixed with `wikimedia-`. + // We should seek to remove all these instances. + 'mw-ui-icon-wikimedia-' . $icon + ]; + if ( $isSmallIcon ) { + $iconElementClasses[] = 'mw-ui-icon-small'; + } + self::appendClassToItem( $item[ $buttonClassProp ], $iconElementClasses ); + } else { + $item[ $iconHtmlProp ] = self::makeIcon( $icon ); + } + } + return $item; + } + + /** + * Updates template data for Vector menu items. + * + * @internal used inside Hooks::updateMenuItems ::updateViewsMenuIcons and ::updateUserLinksDropdownItems + * @param array $item menu item data to update + * @param bool $isSmallIcon when set a small icon will be applied rather than the standard icon size + * @return array $item Updated menu item data + */ + public static function updateMenuItemData( $item, $isSmallIcon = false ) { + $buttonClassProp = 'link-class'; + $iconHtmlProp = 'link-html'; + return self::updateItemData( $item, $buttonClassProp, $iconHtmlProp, $isSmallIcon ); + } + + /** + * Updates user interface preferences for modern Vector to upgrade icon/button menu items. + * + * @param array &$content_navigation + * @param string $menu identifier + */ + private static function updateMenuItems( &$content_navigation, $menu ) { + foreach ( $content_navigation[$menu] as $key => $item ) { + $content_navigation[$menu][$key] = self::updateMenuItemData( $item ); + } + } + + /** + * Vector 2022 only: + * Creates an additional menu that will be injected inside the more (cactions) + * dropdown menu. This menu is a clone of `views` and this menu will only be + * shown at low resolutions (when the `views` menu is hidden). + * + * An additional menu is used instead of adding to the existing cactions menu + * so that the emptyPortlet logic for that menu is preserved and the cactions menu + * is not shown at large resolutions when empty (e.g. all items including collapsed + * items are hidden). + * + * @param array &$content_navigation + */ + private static function createMoreOverflowMenu( &$content_navigation ) { + $clonedViews = []; + foreach ( array_keys( $content_navigation['views'] ?? [] ) as $key ) { + $newItem = $content_navigation['views'][$key]; + self::makeMenuItemCollapsible( + $newItem, + 'vector-more-' + ); + $clonedViews['more-' . $key] = $newItem; + } + // Inject collapsible menu items ahead of existing actions. + $content_navigation['views-overflow'] = $clonedViews; + } + + /** + * Upgrades Vector's watch action to a watchstar. + * This is invoked inside SkinVector, not via skin registration, as skin hooks + * are not guaranteed to run last. + * This can possibly be revised based on the outcome of T287622. + * + * @see https://www.mediawiki.org/wiki/Manual:Hooks/SkinTemplateNavigation + * @param SkinTemplate $sk + * @param array &$content_navigation + */ + public static function onSkinTemplateNavigation( $sk, &$content_navigation ) { + $title = $sk->getRelevantTitle(); + + $skinName = $sk->getSkinName(); + // These changes should only happen in Vector. + if ( !$skinName || !self::isVectorSkin( $skinName ) ) { + return; + } + + if ( + $sk->getConfig()->get( 'VectorUseIconWatch' ) && + $title && $title->canExist() + ) { + self::updateActionsMenu( $content_navigation ); + } + + self::updateUserLinksItems( $sk, $content_navigation ); + if ( $skinName === Constants::SKIN_NAME_MODERN ) { + self::createMoreOverflowMenu( $content_navigation ); + } + + // The updating of the views menu happens /after/ the overflow menu has been created + // this avoids icons showing in the more overflow menu. + self::updateViewsMenuIcons( $content_navigation, self::isSkinVersionLegacy( $skinName ) ); + self::updateAssociatedPagesMenuIcons( $content_navigation ); + } + + /** + * Adds MediaWiki:Vector.css as the skin style that controls classic Vector. + * + * @param string $skin + * @param array &$pages + */ + public function onResourceLoaderSiteStylesModulePages( $skin, &$pages ): void { + $config = MediaWikiServices::getInstance()->getMainConfig(); + if ( $skin === Constants::SKIN_NAME_MODERN && $config->get( 'VectorShareUserScripts' ) ) { + $pages['MediaWiki:Vector.css'] = [ 'type' => 'style' ]; + } + } + + /** + * Adds MediaWiki:Vector.css as the skin style that controls classic Vector. + * + * @param string $skin + * @param array &$pages + */ + public function onResourceLoaderSiteModulePages( $skin, &$pages ): void { + $config = MediaWikiServices::getInstance()->getMainConfig(); + if ( $skin === Constants::SKIN_NAME_MODERN && $config->get( 'VectorShareUserScripts' ) ) { + $pages['MediaWiki:Vector.js'] = [ 'type' => 'script' ]; + } + } + + /** + * Adds the persistent sidebar hidden API preference. + * + * @param User $user User whose preferences are being modified. + * @param array[] &$prefs Preferences description array, to be fed to a HTMLForm object. + */ + public function onGetPreferences( $user, &$prefs ): void { + $config = MediaWikiServices::getInstance()->getMainConfig(); + $vectorPrefs = [ + Constants::PREF_KEY_SIDEBAR_VISIBLE => [ + 'type' => 'api', + 'default' => $config->get( + Constants::CONFIG_KEY_DEFAULT_SIDEBAR_VISIBLE_FOR_AUTHORISED_USER + ), + ], + Constants::PREF_KEY_PAGE_TOOLS_PINNED => [ + 'type' => 'api' + ], + Constants::PREF_KEY_MAIN_MENU_PINNED => [ + 'type' => 'api' + ], + Constants::PREF_KEY_TOC_PINNED => [ + 'type' => 'api' + ], + Constants::PREF_KEY_LIMITED_WIDTH => [ + 'type' => 'toggle', + 'label-message' => 'vector-prefs-limited-width', + 'section' => 'rendering/skin/skin-prefs', + 'help-message' => 'vector-prefs-limited-width-help', + 'hide-if' => [ '!==', 'skin', Constants::SKIN_NAME_MODERN ], + ] + ]; + $prefs += $vectorPrefs; + } + + /** + * Called one time when initializing a users preferences for a newly created account. + * + * @param User $user Newly created user object. + * @param bool $isAutoCreated + */ + public function onLocalUserCreated( $user, $isAutoCreated ) { + $config = MediaWikiServices::getInstance()->getMainConfig(); + $default = $config->get( Constants::CONFIG_KEY_DEFAULT_SKIN_VERSION_FOR_NEW_ACCOUNTS ); + if ( $default ) { + $optionsManager = MediaWikiServices::getInstance()->getUserOptionsManager(); + $optionsManager->setOption( + $user, + Constants::PREF_KEY_SKIN, + $default === Constants::SKIN_VERSION_LEGACY ? + Constants::SKIN_NAME_LEGACY : Constants::SKIN_NAME_MODERN + ); + } + } + + /** + * Temporary RequestContextCreateSkin hook handler. + * Switches to new Vector on certain pages. + * + * @see https://www.mediawiki.org/wiki/Manual:Hooks/RequestContextCreateSkin + * + * @param IContextSource $context The RequestContext object the skin is being created for. + * @param Skin|null|string &$skin A variable reference you may set a Skin instance or string + * key on to override the skin that will be used for the context. + * @return bool|void + */ + public function onRequestContextCreateSkin( $context, &$skin ) { + if ( !$skin ) { + // user is anonymous + $user = $context->getUser(); + $config = $context->getConfig(); + $titles = $config->get( 'Vector2022PreviewPages' ); + $title = $context->getTitle(); + $titleText = $title ? $title->getPrefixedText() : null; + if ( $titleText && $user->isAnon() && in_array( $titleText, $titles ) ) { + $skin = 'vector-2022'; + } + } + } + + /** + * NOTE: Please use ResourceLoaderGetConfigVars hook instead if possible + * for adding config to the page. + * Adds config variables to JS that depend on current page/request. + * + * Adds a config flag that can disable saving the VectorSidebarVisible + * user preference when the sidebar menu icon is clicked. + * + * @param array &$vars Array of variables to be added into the output. + * @param OutputPage $out OutputPage instance calling the hook + */ + public function onMakeGlobalVariablesScript( &$vars, $out ): void { + $skin = $out->getSkin(); + $skinName = $skin->getSkinName(); + if ( !self::isVectorSkin( $skinName ) ) { + return; + } + $config = $out->getConfig(); + $user = $out->getUser(); + + if ( $user->isRegistered() && self::isSkinVersionLegacy( $skinName ) ) { + $vars[ 'wgVectorDisableSidebarPersistence' ] = + $config->get( + Constants::CONFIG_KEY_DISABLE_SIDEBAR_PERSISTENCE + ); + } + // Must be exposed to CentralNotice banners via mw.config + $vars[ 'wgVector2022PreviewPages' ] = $config->get( 'Vector2022PreviewPages' ); + } + + /** + * Gets whether the current skin version is the legacy version. + * + * @param string $skinName hint that can be used to detect modern vector. + * @return bool + */ + private static function isSkinVersionLegacy( $skinName ): bool { + return $skinName === Constants::SKIN_NAME_LEGACY; + } +} diff --git a/Vector/includes/ResourceLoader/VectorResourceLoaderUserModule.php b/Vector/includes/ResourceLoader/VectorResourceLoaderUserModule.php new file mode 100644 index 0000000..eeceb6e --- /dev/null +++ b/Vector/includes/ResourceLoader/VectorResourceLoaderUserModule.php @@ -0,0 +1,27 @@ +getUserObj(); + $pages = []; + $config = $this->getConfig(); + if ( $context->getSkin() === Constants::SKIN_NAME_MODERN && + $config->get( 'VectorShareUserScripts' ) && + $config->get( MainConfigNames::AllowUserCss ) && + $user->isRegistered() + ) { + $userPage = $user->getUserPage()->getPrefixedDBkey(); + $pages["$userPage/vector.js"] = [ 'type' => 'script' ]; + } + return $pages; + } +} diff --git a/Vector/includes/ResourceLoader/VectorResourceLoaderUserStylesModule.php b/Vector/includes/ResourceLoader/VectorResourceLoaderUserStylesModule.php new file mode 100644 index 0000000..8b1761f --- /dev/null +++ b/Vector/includes/ResourceLoader/VectorResourceLoaderUserStylesModule.php @@ -0,0 +1,27 @@ +getUserObj(); + $pages = []; + $config = $this->getConfig(); + if ( $context->getSkin() === Constants::SKIN_NAME_MODERN && + $config->get( 'VectorShareUserScripts' ) && + $config->get( MainConfigNames::AllowUserCss ) && + $user->isRegistered() + ) { + $userPage = $user->getUserPage()->getPrefixedDBkey(); + $pages["$userPage/vector.css"] = [ 'type' => 'style' ]; + } + return $pages; + } +} diff --git a/Vector/includes/ServiceWiring.php b/Vector/includes/ServiceWiring.php new file mode 100644 index 0000000..0cc6a3c --- /dev/null +++ b/Vector/includes/ServiceWiring.php @@ -0,0 +1,302 @@ + static function ( MediaWikiServices $services ) { + $featureManager = new FeatureManager(); + + $featureManager->registerRequirement( + new DynamicConfigRequirement( + $services->getMainConfig(), + Constants::CONFIG_KEY_FULLY_INITIALISED, + Constants::REQUIREMENT_FULLY_INITIALISED + ) + ); + + $context = RequestContext::getMain(); + + // Feature: Languages in sidebar + // ================================ + $featureManager->registerRequirement( + new OverridableConfigRequirement( + $services->getMainConfig(), + $context->getUser(), + $context->getRequest(), + $services->getCentralIdLookupFactory()->getNonLocalLookup(), + Constants::CONFIG_KEY_LANGUAGE_IN_HEADER, + Constants::REQUIREMENT_LANGUAGE_IN_HEADER, + null + ) + ); + + // --- + + // Temporary T286932 - remove after languages A/B test is finished. + $requirementName = 'T286932'; + + // MultiConfig checks each config in turn, allowing us to override the main config for specific keys. + $config = new MultiConfig( [ + new HashConfig( [] ), + $services->getMainConfig(), + ] ); + + $featureManager->registerRequirement( + new OverridableConfigRequirement( + $config, + $context->getUser(), + $context->getRequest(), + $services->getCentralIdLookupFactory()->getNonLocalLookup(), + Constants::CONFIG_KEY_LANGUAGE_IN_HEADER, + $requirementName, + /* $overrideName = */ '' + ) + ); + + // --- + + $featureManager->registerFeature( + Constants::FEATURE_LANGUAGE_IN_HEADER, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_LANGUAGE_IN_HEADER, + ] + ); + + // Feature: T293470: Language in main page header + // ================================ + $featureManager->registerRequirement( + new OverridableConfigRequirement( + $services->getMainConfig(), + $context->getUser(), + $context->getRequest(), + null, + Constants::CONFIG_LANGUAGE_IN_MAIN_PAGE_HEADER, + Constants::REQUIREMENT_LANGUAGE_IN_MAIN_PAGE_HEADER + ) + ); + + $featureManager->registerSimpleRequirement( + Constants::REQUIREMENT_IS_MAIN_PAGE, + $context->getTitle() ? $context->getTitle()->isMainPage() : false + ); + + $featureManager->registerFeature( + Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_IS_MAIN_PAGE, + Constants::REQUIREMENT_LANGUAGE_IN_HEADER, + Constants::REQUIREMENT_LANGUAGE_IN_MAIN_PAGE_HEADER + ] + ); + + // Feature: T295555: Language switch alert in sidebar + // ================================ + $featureManager->registerRequirement( + new OverridableConfigRequirement( + $services->getMainConfig(), + $context->getUser(), + $context->getRequest(), + null, + Constants::CONFIG_LANGUAGE_ALERT_IN_SIDEBAR, + Constants::REQUIREMENT_LANGUAGE_ALERT_IN_SIDEBAR + ) + ); + + $featureManager->registerFeature( + Constants::FEATURE_LANGUAGE_ALERT_IN_SIDEBAR, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_LANGUAGE_IN_HEADER, + Constants::REQUIREMENT_LANGUAGE_ALERT_IN_SIDEBAR + ] + ); + + // Feature: Sticky header + // ================================ + $featureManager->registerRequirement( + new OverridableConfigRequirement( + $services->getMainConfig(), + $context->getUser(), + $context->getRequest(), + null, + Constants::CONFIG_STICKY_HEADER, + Constants::REQUIREMENT_STICKY_HEADER + ) + ); + + $featureManager->registerFeature( + Constants::FEATURE_STICKY_HEADER, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_STICKY_HEADER + ] + ); + + // Feature: Page tools menu + // ================================ + $featureManager->registerRequirement( + new OverridableConfigRequirement( + $services->getMainConfig(), + $context->getUser(), + $context->getRequest(), + null, + Constants::CONFIG_PAGE_TOOLS, + Constants::REQUIREMENT_PAGE_TOOLS + ) + ); + $featureManager->registerFeature( + Constants::FEATURE_PAGE_TOOLS, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_PAGE_TOOLS, + ] + ); + + // Feature: Page tools pinned + // ================================ + $featureManager->registerRequirement( + new LoggedInRequirement( + $context->getUser(), + Constants::REQUIREMENT_LOGGED_IN + ) + ); + + $featureManager->registerRequirement( + new UserPreferenceRequirement( + $context->getUser(), + $services->getUserOptionsLookup(), + Constants::PREF_KEY_PAGE_TOOLS_PINNED, + Constants::REQUIREMENT_PAGE_TOOLS_PINNED, + $context->getTitle() + ) + ); + + $featureManager->registerFeature( + Constants::FEATURE_PAGE_TOOLS_PINNED, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_LOGGED_IN, + Constants::REQUIREMENT_PAGE_TOOLS, + Constants::REQUIREMENT_PAGE_TOOLS_PINNED + ] + ); + + // Feature: Table of Contents pinned + // ================================ + $featureManager->registerRequirement( + new UserPreferenceRequirement( + $context->getUser(), + $services->getUserOptionsLookup(), + Constants::PREF_KEY_TOC_PINNED, + Constants::REQUIREMENT_TOC_PINNED, + $context->getTitle() + ) + ); + + $featureManager->registerFeature( + Constants::FEATURE_TOC_PINNED, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_TOC_PINNED + ] + ); + + // Feature: Main menu pinned + // ================================ + $featureManager->registerRequirement( + new UserPreferenceRequirement( + $context->getUser(), + $services->getUserOptionsLookup(), + Constants::PREF_KEY_MAIN_MENU_PINNED, + Constants::REQUIREMENT_MAIN_MENU_PINNED, + $context->getTitle() + ) + ); + + $featureManager->registerFeature( + Constants::FEATURE_MAIN_MENU_PINNED, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_LOGGED_IN, + Constants::REQUIREMENT_PAGE_TOOLS, + Constants::REQUIREMENT_MAIN_MENU_PINNED + ] + ); + + // Feature: Max Width (skin) + // ================================ + $featureManager->registerRequirement( + new UserPreferenceRequirement( + $context->getUser(), + $services->getUserOptionsLookup(), + Constants::PREF_KEY_LIMITED_WIDTH, + Constants::REQUIREMENT_LIMITED_WIDTH, + $context->getTitle() + ) + ); + $featureManager->registerFeature( + Constants::FEATURE_LIMITED_WIDTH, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_LIMITED_WIDTH + ] + ); + + // Feature: Max Width (content) + // ================================ + $featureManager->registerRequirement( + new LimitedWidthContentRequirement( + $services->getMainConfig(), + $context->getRequest(), + $context->getTitle() + ) + ); + $featureManager->registerFeature( + Constants::FEATURE_LIMITED_WIDTH_CONTENT, + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_LIMITED_WIDTH_CONTENT, + ] + ); + + return $featureManager; + } +]; + +// @codeCoverageIgnoreEnd diff --git a/Vector/includes/Services/LanguageService.php b/Vector/includes/Services/LanguageService.php new file mode 100644 index 0000000..0bfeb5d --- /dev/null +++ b/Vector/includes/Services/LanguageService.php @@ -0,0 +1,45 @@ +splittableLanguages = [ + 'ar', 'ary', 'arz', 'ckb', 'fa', 'glk', 'ks', 'mzn', 'pnb', 'ps', 'sd', 'skr', 'ug', 'ur', + 'as', 'bn', 'bpy', + 'awa', 'bh', 'dty', 'gom', 'hi', 'ks', 'mai', 'mr', 'ne', 'new', 'pi', 'sa', + 'gu', + 'pa', + 'kn', 'tcy', + 'km', + 'ml', + 'or', + 'si', + 'ta', + 'te', + ]; + } + + /** + * Gets whether or not we can split words arbitrarily, for example when highlighting the user's query in the search + * autocomplete widget. + * + * @param string $code + * @return bool + */ + public function canWordsBeSplitSafely( string $code ): bool { + return !in_array( $code, $this->splittableLanguages ); + } +} diff --git a/Vector/includes/SkinVector22.php b/Vector/includes/SkinVector22.php new file mode 100644 index 0000000..fb48d75 --- /dev/null +++ b/Vector/includes/SkinVector22.php @@ -0,0 +1,498 @@ +getConfig()->get( 'VectorResponsive' ); + // For historic reasons, the viewport is added when Vector is loaded on the mobile + // domain. This is only possible for 3rd parties or by useskin parameter as there is + // no preference for changing mobile skin. Only need to check if $responsive is falsey. + if ( !$responsive && ExtensionRegistry::getInstance()->isLoaded( 'MobileFrontend' ) ) { + $mobFrontContext = MediaWikiServices::getInstance()->getService( 'MobileFrontend.Context' ); + if ( $mobFrontContext->shouldDisplayMobileView() ) { + return true; + } + } + return $responsive; + } + + /** + * This should be upstreamed to the Skin class in core once the logic is finalized. + * Returns false if the page is a special page without any languages, or if an action + * other than view is being used. + * + * @return bool + */ + private function canHaveLanguages(): bool { + $action = $this->getContext()->getActionName(); + + // FIXME: This logic should be moved into the ULS extension or core given the button is hidden, + // it should not be rendered, short term fix for T328996. + if ( $action === 'history' ) { + return false; + } + + $title = $this->getTitle(); + // Defensive programming - if a special page has added languages explicitly, best to show it. + if ( $title && $title->isSpecialPage() && empty( $this->getLanguagesCached() ) ) { + return false; + } + return true; + } + + /** + * Remove the add topic button from data-views if present + * + * @param array &$parentData Template data + * @return bool An add topic button was removed + */ + private function removeAddTopicButton( array &$parentData ): bool { + $views = $parentData['data-portlets']['data-views']['array-items']; + $hasAddTopicButton = false; + $html = ''; + foreach ( $views as $i => $view ) { + if ( $view['id'] === 'ca-addsection' ) { + array_splice( $views, $i, 1 ); + $hasAddTopicButton = true; + continue; + } + $html .= $view['html-item']; + } + $parentData['data-portlets']['data-views']['array-items'] = $views; + $parentData['data-portlets']['data-views']['html-items'] = $html; + return $hasAddTopicButton; + } + + /** + * @param string $location Either 'top' or 'bottom' is accepted. + * @return bool + */ + protected function isLanguagesInContentAt( string $location ): bool { + if ( !$this->canHaveLanguages() ) { + return false; + } + $featureManager = VectorServices::getFeatureManager(); + $inContent = $featureManager->isFeatureEnabled( + Constants::FEATURE_LANGUAGE_IN_HEADER + ); + $isMainPage = $this->getTitle() ? $this->getTitle()->isMainPage() : false; + + switch ( $location ) { + case 'top': + return $isMainPage ? $inContent && $featureManager->isFeatureEnabled( + Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER + ) : $inContent; + case 'bottom': + return $inContent && $isMainPage && !$featureManager->isFeatureEnabled( + Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER + ); + default: + throw new RuntimeException( 'unknown language button location' ); + } + } + + /** + * Whether or not the languages are out of the sidebar and in the content either at + * the top or the bottom. + * + * @return bool + */ + final protected function isLanguagesInContent(): bool { + return $this->isLanguagesInContentAt( 'top' ) || $this->isLanguagesInContentAt( 'bottom' ); + } + + /** + * Calls getLanguages with caching. + * + * @return array + */ + protected function getLanguagesCached(): array { + if ( $this->languages === null ) { + $this->languages = $this->getLanguages(); + } + return $this->languages; + } + + /** + * Check whether ULS is enabled + * + * @return bool + */ + final protected function isULSExtensionEnabled(): bool { + return ExtensionRegistry::getInstance()->isLoaded( 'UniversalLanguageSelector' ); + } + + /** + * Show the ULS button if it's modern Vector, languages in header is enabled, + * and the ULS extension is enabled. Hide it otherwise. + * There is no point in showing the language button if ULS extension is unavailable + * as there is no ways to add languages without it. + * @return bool + */ + protected function shouldHideLanguages(): bool { + return !$this->isLanguagesInContent() || !$this->isULSExtensionEnabled(); + } + + /** + * Determines if the language switching alert box should be in the sidebar. + * + * @return bool + */ + private function shouldLanguageAlertBeInSidebar(): bool { + $featureManager = VectorServices::getFeatureManager(); + $isMainPage = $this->getTitle() ? $this->getTitle()->isMainPage() : false; + $shouldShowOnMainPage = $isMainPage && !empty( $this->getLanguagesCached() ) && + $featureManager->isFeatureEnabled( Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER ); + return ( $this->isLanguagesInContentAt( 'top' ) && !$isMainPage && !$this->shouldHideLanguages() && + $featureManager->isFeatureEnabled( Constants::FEATURE_LANGUAGE_ALERT_IN_SIDEBAR ) ) || + $shouldShowOnMainPage; + } + + /** + * Merges the `view-overflow` menu into the `action` menu. + * This ensures that the previous state of the menu e.g. emptyPortlet class + * is preserved. + * + * @param array $data + * @return array + */ + private function mergeViewOverflowIntoActions( array $data ): array { + $portlets = $data['data-portlets']; + $actions = $portlets['data-actions']; + $overflow = $portlets['data-views-overflow']; + // if the views overflow menu is not empty, then signal that the more menu despite + // being initially empty now has collapsible items. + if ( !$overflow['is-empty'] ) { + $data['data-portlets']['data-actions']['class'] .= ' vector-has-collapsible-items'; + } + $data['data-portlets']['data-actions']['html-items'] = $overflow['html-items'] . $actions['html-items']; + return $data; + } + + /** + * @inheritDoc + */ + public function getHtmlElementAttributes() { + $original = parent::getHtmlElementAttributes(); + $featureManager = VectorServices::getFeatureManager(); + $original['class'] .= ' ' . implode( ' ', $featureManager->getFeatureBodyClass() ); + + if ( VectorServices::getFeatureManager()->isFeatureEnabled( Constants::FEATURE_STICKY_HEADER ) ) { + // T290518: Add scroll padding to root element when the sticky header is + // enabled. This class needs to be server rendered instead of added from + // JS in order to correctly handle situations where the sticky header + // isn't visible yet but we still need scroll padding applied (e.g. when + // the user navigates to a page with a hash fragment in the URI). For this + // reason, we can't rely on the `vector-sticky-header-visible` class as it + // is added too late. + // + // Please note that this class applies scroll padding which does not work + // when applied to the body tag in Chrome, Safari, and Firefox (and + // possibly others). It must instead be applied to the html tag. + $original['class'] = implode( ' ', [ $original['class'] ?? '', self::STICKY_HEADER_ENABLED_CLASS ] ); + } + $original['class'] = trim( $original['class'] ); + + return $original; + } + + /** + * Determines wheather the initial state of sidebar is visible on not + * + * @return bool + */ + private function isMainMenuVisible(): bool { + $skin = $this->getSkin(); + if ( $skin->getUser()->isRegistered() ) { + $userOptionsLookup = MediaWikiServices::getInstance()->getUserOptionsLookup(); + $userPrefSidebarState = $userOptionsLookup->getOption( + $skin->getUser(), + Constants::PREF_KEY_SIDEBAR_VISIBLE + ); + + $defaultLoggedinSidebarState = $this->getConfig()->get( + Constants::CONFIG_KEY_DEFAULT_SIDEBAR_VISIBLE_FOR_AUTHORISED_USER + ); + + // If the sidebar user preference has been set, return that value, + // if not, then the default sidebar state for logged-in users. + return ( $userPrefSidebarState !== null ) + ? (bool)$userPrefSidebarState + : $defaultLoggedinSidebarState; + } + return $this->getConfig()->get( + Constants::CONFIG_KEY_DEFAULT_SIDEBAR_VISIBLE_FOR_ANONYMOUS_USER + ); + } + + /** + * Pulls the page tools menu out of $sidebar into $pageToolsMenu + * + * @param array &$sidebar + * @param array &$pageToolsMenu + */ + private static function extractPageToolsFromSidebar( array &$sidebar, array &$pageToolsMenu ) { + $restPortlets = $sidebar[ 'array-portlets-rest' ] ?? []; + $toolboxMenuIndex = array_search( + VectorComponentPageTools::TOOLBOX_ID, + array_column( + $restPortlets, + 'id' + ) + ); + + if ( $toolboxMenuIndex !== false ) { + // Splice removes the toolbox menu from the $restPortlets array + // and current returns the first value of array_splice, i.e. the $toolbox menu data. + $pageToolsMenu = array_splice( $restPortlets, $toolboxMenuIndex ); + $sidebar['array-portlets-rest'] = $restPortlets; + } + } + + /** + * Get the ULS button label, accounting for the number of available + * languages. + * + * @return array + */ + final protected function getULSLabels(): array { + $numLanguages = count( $this->getLanguagesCached() ); + + if ( $numLanguages === 0 ) { + return [ + 'label' => $this->msg( 'vector-no-language-button-label' )->text(), + 'aria-label' => $this->msg( 'vector-no-language-button-aria-label' )->text() + ]; + } else { + return [ + 'label' => $this->msg( 'vector-language-button-label' )->numParams( $numLanguages )->escaped(), + 'aria-label' => $this->msg( 'vector-language-button-aria-label' )->numParams( $numLanguages )->escaped() + ]; + } + } + + /** + * @return array + */ + public function getTemplateData(): array { + $featureManager = VectorServices::getFeatureManager(); + $parentData = parent::getTemplateData(); + $localizer = $this->getContext(); + $parentData = $this->mergeViewOverflowIntoActions( $parentData ); + $portlets = $parentData['data-portlets']; + + $langData = $parentData['data-portlets']['data-languages'] ?? null; + $config = $this->getConfig(); + + $isPageToolsEnabled = $featureManager->isFeatureEnabled( Constants::FEATURE_PAGE_TOOLS ); + $sidebar = $parentData[ 'data-portlets-sidebar' ]; + $pageToolsMenu = []; + if ( $isPageToolsEnabled ) { + self::extractPageToolsFromSidebar( $sidebar, $pageToolsMenu ); + } + + $hasAddTopicButton = $config->get( 'VectorPromoteAddTopic' ) && + $this->removeAddTopicButton( $parentData ); + + $langButtonClass = $langData['class'] ?? ''; + $ulsLabels = $this->getULSLabels(); + $user = $this->getUser(); + $localizer = $this->getContext(); + + $tocData = $parentData['data-toc']; + $tocComponents = []; + + // If the table of contents has no items, we won't output it. + // empty array is interpreted by Mustache as falsey. + $isTocAvailable = !empty( $tocData ) && !empty( $tocData[ 'array-sections' ] ); + if ( $isTocAvailable ) { + $dataToc = new VectorComponentTableOfContents( + $parentData['data-toc'], + $localizer, + $this->getConfig(), + VectorServices::getFeatureManager() + ); + $tocComponents = [ + 'data-toc' => $dataToc, + 'data-toc-pinnable-container' => new VectorComponentPinnableContainer( + VectorComponentTableOfContents::ID, + $dataToc->isPinned() + ), + 'data-page-titlebar-toc-dropdown' => new VectorComponentDropdown( + 'vector-page-titlebar-toc', + // label + $this->msg( 'vector-toc-collapsible-button-label' ), + // class + 'vector-page-titlebar-toc mw-ui-icon-flush-left', + // icon + 'listBullet', + ), + 'data-page-titlebar-toc-pinnable-container' => new VectorComponentPinnableContainer( + 'vector-page-titlebar-toc', + $dataToc->isPinned() + ), + 'data-sticky-header-toc-dropdown' => new VectorComponentDropdown( + 'vector-sticky-header-toc', + // label + $this->msg( 'vector-toc-collapsible-button-label' ), + // class + 'mw-portlet mw-portlet-sticky-header-toc vector-sticky-header-toc mw-ui-icon-flush-left', + // icon + 'listBullet' + ), + 'data-sticky-header-toc-pinnable-container' => new VectorComponentPinnableContainer( + 'vector-sticky-header-toc', + $dataToc->isPinned() + ), + ]; + } + + $isRegistered = $user->isRegistered(); + $userPage = $isRegistered ? $this->buildPersonalPageItem() : []; + $components = $tocComponents + [ + 'data-add-topic-button' => $hasAddTopicButton ? new VectorComponentButton( + $this->msg( [ 'vector-2022-action-addsection', 'skin-action-addsection' ] )->text(), + 'ca-addsection', + $this->getTitle()->getLocalURL( 'action=edit§ion=new' ), + 'wikimedia-speechBubbleAdd-progressive', + 'addsection-header' + ) : null, + 'data-vector-variants' => new VectorComponentMenuVariants( + // @phan-suppress-next-line PhanTypeInvalidDimOffset, PhanTypeMismatchArgument + $parentData['data-portlets']['data-variants'], + $this->getTitle()->getPageLanguage(), + $this->msg( 'vector-language-variant-switcher-label' ) + ), + 'data-vector-user-links' => new VectorComponentUserLinks( + $localizer, + $user, + $portlets, + $this->getOptions()['link'], + $userPage[ 'icon' ] ?? '' + ), + 'data-lang-btn' => $langData ? new VectorComponentLanguageDropdown( + $ulsLabels['label'], + $ulsLabels['aria-label'], + $langButtonClass, + count( $this->getLanguagesCached() ), + $langData['html-items'] ?? '', + $langData['html-before-portal'] ?? '', + $langData['html-after-portal'] ?? '', + $this->getTitle() + ) : null, + 'data-search-box' => new VectorComponentSearchBox( + $parentData['data-search-box'], + true, + // is primary mode of search + true, + 'searchform', + true, + $config, + Constants::SEARCH_BOX_INPUT_LOCATION_MOVED, + $localizer + ), + 'data-main-menu' => new VectorComponentMainMenu( + $sidebar, + $this->shouldLanguageAlertBeInSidebar(), + $parentData['data-portlets']['data-languages'] ?? [], + $localizer, + $this->getUser(), + VectorServices::getFeatureManager(), + $this, + ), + 'data-main-menu-dropdown' => new VectorComponentDropdown( + VectorComponentMainMenu::ID . '-dropdown', + $this->msg( VectorComponentMainMenu::ID . '-label' )->text(), + VectorComponentMainMenu::ID . '-dropdown' . ' mw-ui-icon-flush-left mw-ui-icon-flush-right', + 'menu' + ), + 'data-page-tools' => $isPageToolsEnabled ? new VectorComponentPageTools( + array_merge( [ $parentData['data-portlets']['data-actions'] ?? [] ], $pageToolsMenu ), + $localizer, + $this->getUser(), + $featureManager + ) : null, + 'data-page-tools-dropdown' => $isPageToolsEnabled ? new VectorComponentDropdown( + VectorComponentPageTools::ID . '-dropdown', + $this->msg( 'toolbox' )->text(), + VectorComponentPageTools::ID . '-dropdown', + ) : null, + 'data-vector-sticky-header' => $featureManager->isFeatureEnabled( + Constants::FEATURE_STICKY_HEADER + ) ? new VectorComponentStickyHeader( + $localizer, + new VectorComponentSearchBox( + $parentData['data-search-box'], + // Collapse inside search box is disabled. + false, + false, + 'vector-sticky-search-form', + false, + $config, + Constants::SEARCH_BOX_INPUT_LOCATION_MOVED, + $localizer + ), + // Show sticky ULS if the ULS extension is enabled and the ULS in header is not hidden + $this->isULSExtensionEnabled() && !$this->shouldHideLanguages() ? + new VectorComponentLanguageButton( $ulsLabels[ 'label' ] ) : null, + true + ) : null + ]; + foreach ( $components as $key => $component ) { + // Array of components or null values. + if ( $component ) { + $parentData[$key] = $component->getTemplateData(); + } + } + + return array_merge( $parentData, [ + 'is-language-in-content' => $this->isLanguagesInContent(), + 'has-buttons-in-content-top' => $this->isLanguagesInContentAt( 'top' ) || $hasAddTopicButton, + 'is-language-in-content-bottom' => $this->isLanguagesInContentAt( 'bottom' ), + 'is-main-menu-visible' => $this->isMainMenuVisible(), + // Cast empty string to null + 'html-subtitle' => $parentData['html-subtitle'] === '' ? null : $parentData['html-subtitle'], + 'is-page-tools-enabled' => $isPageToolsEnabled + ] ); + } +} diff --git a/Vector/includes/SkinVectorLegacy.php b/Vector/includes/SkinVectorLegacy.php new file mode 100644 index 0000000..d71c5c6 --- /dev/null +++ b/Vector/includes/SkinVectorLegacy.php @@ -0,0 +1,186 @@ + $pData ) { + $data['data-portlets'][$key] = $this->decoratePortletData( + $key, + $pData + ); + } + $mainMenuData = $data['data-portlets-sidebar']; + $mainMenuData['data-portlets-first'] = $this->decoratePortletData( + 'navigation', $mainMenuData['data-portlets-first'] + ); + $rest = $mainMenuData['array-portlets-rest']; + foreach ( $rest as $key => $pData ) { + $rest[$key] = $this->decoratePortletData( + $pData['id'], $pData + ); + } + $mainMenuData['array-portlets-rest'] = $rest; + $data['data-portlets-main-menu'] = $mainMenuData; + return $data; + } + + /** + * Performs the following updates to portlet data: + * - Adds concept of menu types + * - Marks the selected variant in the variant portlet + * - modifies tooltips of personal and user-menu portlets + * @param string $key + * @param array $portletData + * @return array + */ + private function decoratePortletData( + string $key, + array $portletData + ): array { + $isIconDropdown = false; + switch ( $key ) { + case 'data-user-menu': + $type = self::MENU_TYPE_DROPDOWN; + $isIconDropdown = true; + break; + case 'data-actions': + case 'data-variants': + case 'data-sticky-header-toc': + $type = self::MENU_TYPE_DROPDOWN; + break; + case 'data-views': + case 'data-associated-pages': + case 'data-namespaces': + $type = self::MENU_TYPE_TABS; + break; + case 'data-notifications': + case 'data-personal': + case 'data-user-page': + case 'data-vector-user-menu-overflow': + $type = self::MENU_TYPE_DEFAULT; + break; + default: + $type = self::MENU_TYPE_PORTAL; + break; + } + + if ( $key === 'data-personal' ) { + // Set tooltip to empty string for the personal menu for both logged-in and logged-out users + // to avoid showing the tooltip for legacy version. + $portletData['html-tooltip'] = ''; + $portletData['class'] .= ' vector-user-menu-legacy'; + } + + // Special casing for Variant to change label to selected. + // Hopefully we can revisit and possibly remove this code when the language switcher is moved. + if ( $key === 'data-variants' ) { + $variantMenu = new VectorComponentMenuVariants( + $portletData, + $this->getTitle()->getPageLanguage(), + $this->msg( 'vector-language-variant-switcher-label' ) + ); + $portletData = $variantMenu->getTemplateData(); + } + + $portletData = $this->updatePortletClasses( + $portletData, + $type + ); + + return $portletData + [ + 'is-dropdown' => $type === self::MENU_TYPE_DROPDOWN, + 'is-portal' => $type === self::MENU_TYPE_PORTAL, + ]; + } + + /** + * Helper for applying Vector menu classes to portlets + * + * @param array $portletData returned by SkinMustache to decorate + * @param int $type representing one of the menu types (see MENU_TYPE_* constants) + * @return array modified version of portletData input + */ + private function updatePortletClasses( + array $portletData, + int $type = self::MENU_TYPE_DEFAULT + ) { + $extraClasses = [ + self::MENU_TYPE_DROPDOWN => 'vector-menu-dropdown', + self::MENU_TYPE_TABS => 'vector-menu-tabs vector-menu-tabs-legacy', + self::MENU_TYPE_PORTAL => 'vector-menu-portal portal', + self::MENU_TYPE_DEFAULT => '', + ]; + $portletData['class'] .= ' ' . $extraClasses[$type]; + + if ( !isset( $portletData['heading-class'] ) ) { + $portletData['heading-class'] = ''; + } + + $portletData['class'] = trim( $portletData['class'] ); + $portletData['heading-class'] = trim( $portletData['heading-class'] ); + return $portletData; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + $parentData = $this->decoratePortletsData( parent::getTemplateData() ); + + $components = [ + 'data-search-box' => new VectorComponentSearchBox( + $parentData['data-search-box'], + false, + // is primary mode of search + true, + 'searchform', + true, + $this->getConfig(), + Constants::SEARCH_BOX_INPUT_LOCATION_DEFAULT, + $this->getContext() + ), + ]; + foreach ( $components as $key => $component ) { + $parentData[$key] = $component->getTemplateData(); + } + + // SkinVector sometimes serves new Vector as part of removing the + // skin version user preference. To avoid T302461 we need to unset it here. + // This shouldn't be run on SkinVector22. + unset( $parentData['data-toc'] ); + return $parentData; + } +} diff --git a/Vector/includes/VectorServices.php b/Vector/includes/VectorServices.php new file mode 100644 index 0000000..48a80ef --- /dev/null +++ b/Vector/includes/VectorServices.php @@ -0,0 +1,37 @@ +getService( Constants::SERVICE_FEATURE_MANAGER ); + } + + /** + * Gets the language service. + * + * @return LanguageService + */ + public static function getLanguageService(): LanguageService { + return new LanguageService(); + } +} diff --git a/Vector/includes/templates/BeforeContent.mustache b/Vector/includes/templates/BeforeContent.mustache new file mode 100644 index 0000000..a531e95 --- /dev/null +++ b/Vector/includes/templates/BeforeContent.mustache @@ -0,0 +1,12 @@ +{{!- + Page Precontent - Placed below the page toolbar on all pages. + Contains the indicators (if the language button is beside the title) + qnd tagline, which is only rendered on article page. +}} +
+ {{#has-buttons-in-content-top}} + {{>Indicators}} + {{/has-buttons-in-content-top}} + + {{#is-article}}
{{msg-tagline}}
{{/is-article}} +
diff --git a/Vector/includes/templates/Button.mustache b/Vector/includes/templates/Button.mustache new file mode 100644 index 0000000..1dcad3b --- /dev/null +++ b/Vector/includes/templates/Button.mustache @@ -0,0 +1,11 @@ +{{#href}} + {{{html-vector-button-icon}}}{{label}} +{{#href}}{{/href}} +{{^href}}{{/href}} diff --git a/Vector/includes/templates/ColumnEnd.mustache b/Vector/includes/templates/ColumnEnd.mustache new file mode 100644 index 0000000..8a8bb6d --- /dev/null +++ b/Vector/includes/templates/ColumnEnd.mustache @@ -0,0 +1,10 @@ +
+ +
diff --git a/Vector/includes/templates/Dropdown/Close.mustache b/Vector/includes/templates/Dropdown/Close.mustache new file mode 100644 index 0000000..2da2875 --- /dev/null +++ b/Vector/includes/templates/Dropdown/Close.mustache @@ -0,0 +1,3 @@ +{{! this template must be used with Dropdown/Open to avoid unclosed HTML tags }} + + \ No newline at end of file diff --git a/Vector/includes/templates/Dropdown/Open.mustache b/Vector/includes/templates/Dropdown/Open.mustache new file mode 100644 index 0000000..3f368ce --- /dev/null +++ b/Vector/includes/templates/Dropdown/Open.mustache @@ -0,0 +1,37 @@ +{{! + See @typedef MenuDefinition +}} +{{! this template must be used with Dropdown/Close to avoid unclosed HTML tags }} +{{! DO NOT REMOVE vector-menu class. It is used for click tracking in Extension:WikimediaEvents }} +
+ {{! + Dropdown menus use the checkbox hack and require `input` and `label` elements. + The `label` element functions as the "visual" button and is hidden from screenreader users (T325026) + while the `input` element is the actual semantic button for toggling the dropdown. + The `input` element will always have an `aria-label`, which will usually match the + text inside the `label` element, unless an alternative label is provided via the `#aria-label` + mustache template data. + }} + + + {{! FIXME: Rename this class to vector-dropdown-content. It currently clashes with MenuContents mustache template }} +
+ diff --git a/Vector/includes/templates/Footer.mustache b/Vector/includes/templates/Footer.mustache new file mode 100644 index 0000000..9a00f7e --- /dev/null +++ b/Vector/includes/templates/Footer.mustache @@ -0,0 +1,23 @@ +{{! + @typedef object footerItem + @prop string id of list item element + @prop string html of list item + @prop footerItem[] items + + @typedef object footerRow + @prop string className of list element + @prop string id of list element + @prop footerItem[] array-items + + string|null html-user-language-attributes a string of attribute HTML + footerRow data-info the info row + footerRow data-places the places row + footerRow data-icons the icons row +}} +{{! `role` is unnecessary but kept to support selectors in any gadgets or user styles and + to mitigate a VoiceOver bug. }} +
+ {{#data-info}}{{>Footer__row}}{{/data-info}} + {{#data-places}}{{>Footer__row}}{{/data-places}} + {{#data-icons}}{{>Footer__row}}{{/data-icons}} +
diff --git a/Vector/includes/templates/Footer__row.mustache b/Vector/includes/templates/Footer__row.mustache new file mode 100644 index 0000000..e39cecb --- /dev/null +++ b/Vector/includes/templates/Footer__row.mustache @@ -0,0 +1,5 @@ +
    + {{#array-items}} +
  • {{{html}}}
  • + {{/array-items}} +
diff --git a/Vector/includes/templates/Header.mustache b/Vector/includes/templates/Header.mustache new file mode 100644 index 0000000..4053fd5 --- /dev/null +++ b/Vector/includes/templates/Header.mustache @@ -0,0 +1,17 @@ +
+
+ {{^is-page-tools-enabled}} + {{>deprecated/MainMenuBtn}} + {{/is-page-tools-enabled}} + {{#is-page-tools-enabled}} + + {{/is-page-tools-enabled}} + {{#data-logos}}{{>Logo}}{{/data-logos}} +
+
+ {{#data-search-box}}{{>SearchBox}}{{/data-search-box}} + {{#data-vector-user-links}}{{>UserLinks}}{{/data-vector-user-links}} +
+
diff --git a/Vector/includes/templates/Icon.mustache b/Vector/includes/templates/Icon.mustache new file mode 100644 index 0000000..5e2f913 --- /dev/null +++ b/Vector/includes/templates/Icon.mustache @@ -0,0 +1 @@ + diff --git a/Vector/includes/templates/Indicators.mustache b/Vector/includes/templates/Indicators.mustache new file mode 100644 index 0000000..ccd5d98 --- /dev/null +++ b/Vector/includes/templates/Indicators.mustache @@ -0,0 +1,6 @@ +{{! @typedef Indicator[]}} +
+{{#array-indicators}} +
{{{html}}}
+{{/array-indicators}} +
diff --git a/Vector/includes/templates/LanguageDropdown.mustache b/Vector/includes/templates/LanguageDropdown.mustache new file mode 100644 index 0000000..2e6643e --- /dev/null +++ b/Vector/includes/templates/LanguageDropdown.mustache @@ -0,0 +1,11 @@ +{{! Use `.mw-portlet-lang` to target styles at this element}} +{{>Dropdown/Open}} + {{#is-language-selector-empty}} +
+ {{msg-empty-language-selector-body}} +
+ {{/is-language-selector-empty}} + {{^is-language-selector-empty}} + {{>MenuContents}} + {{/is-language-selector-empty}} +{{>Dropdown/Close}} diff --git a/Vector/includes/templates/LegacyMenu.mustache b/Vector/includes/templates/LegacyMenu.mustache new file mode 100644 index 0000000..046c5b6 --- /dev/null +++ b/Vector/includes/templates/LegacyMenu.mustache @@ -0,0 +1,34 @@ +{{! + See @typedef MenuDefinition +}} +{{! `role` is unnecessary but kept to support selectors in any gadgets or user styles. }} +{{! DO NOT REMOVE vector-menu class. It is used for click tracking in Extension:WikimediaEvents }} + diff --git a/Vector/includes/templates/LegacyMoreMenu.mustache b/Vector/includes/templates/LegacyMoreMenu.mustache new file mode 100644 index 0000000..de4a40b --- /dev/null +++ b/Vector/includes/templates/LegacyMoreMenu.mustache @@ -0,0 +1,4 @@ +{{! Use .mw-portlet-cactions to style }} +{{>Dropdown/Open}} + {{>MenuContents}} +{{>Dropdown/Close}} diff --git a/Vector/includes/templates/LegacySidebar.mustache b/Vector/includes/templates/LegacySidebar.mustache new file mode 100644 index 0000000..7b4de7b --- /dev/null +++ b/Vector/includes/templates/LegacySidebar.mustache @@ -0,0 +1,12 @@ +{{! + See @typedef SidebarData +}} +
+ + {{#data-portlets-first}}{{>LegacyMenu}}{{/data-portlets-first}} + {{#array-portlets-rest}}{{>LegacyMenu}}{{/array-portlets-rest}} + {{#data-portlets.data-languages}}{{>LegacyMenu}}{{/data-portlets.data-languages}} +
diff --git a/Vector/includes/templates/LegacyUserLinks.mustache b/Vector/includes/templates/LegacyUserLinks.mustache new file mode 100644 index 0000000..30a4531 --- /dev/null +++ b/Vector/includes/templates/LegacyUserLinks.mustache @@ -0,0 +1 @@ +{{#data-personal}}{{>LegacyMenu}}{{/data-personal}} diff --git a/Vector/includes/templates/Link.mustache b/Vector/includes/templates/Link.mustache new file mode 100644 index 0000000..5156bba --- /dev/null +++ b/Vector/includes/templates/Link.mustache @@ -0,0 +1,4 @@ +{{! + }}{{#icon}}{{>Icon}}{{/icon}}{{text}}{{! +}} diff --git a/Vector/includes/templates/Logo.mustache b/Vector/includes/templates/Logo.mustache new file mode 100644 index 0000000..2af73a5 --- /dev/null +++ b/Vector/includes/templates/Logo.mustache @@ -0,0 +1,26 @@ +{{! + LogoDefinition logo + string link-mainpage link to the main page (from SkinMustache in core) + string msg-sitesubtitle the contents of the sitesubtitle message key +}} + diff --git a/Vector/includes/templates/MainMenu.mustache b/Vector/includes/templates/MainMenu.mustache new file mode 100644 index 0000000..0f34ee5 --- /dev/null +++ b/Vector/includes/templates/MainMenu.mustache @@ -0,0 +1,24 @@ +{{! Use `.vector-main-menu` to target styles at this element}} +{{>PinnableElement/Open}} + {{^is-page-tools-enabled}} + {{#data-portlets-first}}{{>MainMenuGroup}}{{/data-portlets-first}} + {{#data-main-menu-action}}{{>MainMenuAction}}{{/data-main-menu-action}} + {{#array-portlets-rest}}{{>MainMenuGroup}}{{/array-portlets-rest}} + {{^is-language-in-content}} + {{#data-languages}}{{>MainMenuGroup}}{{/data-languages}} + {{/is-language-in-content}} + {{! T295555 Add language switch alert message. }} + {{#data-vector-language-switch-alert}}{{>MainMenuAction}}{{/data-vector-language-switch-alert}} + {{/is-page-tools-enabled}} + + {{#is-page-tools-enabled}} + {{#data-portlets-first}}{{>Menu}}{{/data-portlets-first}} + {{#data-main-menu-action}}{{>MainMenuAction}}{{/data-main-menu-action}} + {{#array-portlets-rest}}{{>Menu}}{{/array-portlets-rest}} + {{^is-language-in-content}} + {{#data-languages}}{{>Menu}}{{/data-languages}} + {{/is-language-in-content}} + {{! T295555 Add language switch alert message. }} + {{#data-vector-language-switch-alert}}{{>MainMenuAction}}{{/data-vector-language-switch-alert}} + {{/is-page-tools-enabled}} +{{>PinnableElement/Close}} diff --git a/Vector/includes/templates/MainMenuAction.mustache b/Vector/includes/templates/MainMenuAction.mustache new file mode 100644 index 0000000..9241779 --- /dev/null +++ b/Vector/includes/templates/MainMenuAction.mustache @@ -0,0 +1,9 @@ +{{! `heading` is optional. }} +
+
+ {{#heading}}
{{.}}
{{/heading}} +
+ {{{html-content}}} +
+
+
diff --git a/Vector/includes/templates/MainMenuDropdown.mustache b/Vector/includes/templates/MainMenuDropdown.mustache new file mode 100644 index 0000000..9494de3 --- /dev/null +++ b/Vector/includes/templates/MainMenuDropdown.mustache @@ -0,0 +1,8 @@ +{{#data-main-menu-dropdown}}{{>Dropdown/Open}}{{/data-main-menu-dropdown}} + {{#data-main-menu}} + {{>PinnableContainer/Unpinned/Open}} + {{! Use `#vector-main-menu-unpinned-container .vector-main-menu` to target styles at this element}} + {{^is-pinned}}{{>MainMenu}}{{/is-pinned}} + {{>PinnableContainer/Close}} + {{/data-main-menu}} +{{#data-main-menu-dropdown}}{{>Dropdown/Close}}{{/data-main-menu-dropdown}} diff --git a/Vector/includes/templates/MainMenuGroup.mustache b/Vector/includes/templates/MainMenuGroup.mustache new file mode 100644 index 0000000..c66a960 --- /dev/null +++ b/Vector/includes/templates/MainMenuGroup.mustache @@ -0,0 +1,13 @@ +{{! + See @typedef MenuDefinition +}} +
+
+ {{{html-vector-heading-icon}}}{{label}} +
+ {{>MenuContents}} +
diff --git a/Vector/includes/templates/MainMenuPinned.mustache b/Vector/includes/templates/MainMenuPinned.mustache new file mode 100644 index 0000000..1aa4ca0 --- /dev/null +++ b/Vector/includes/templates/MainMenuPinned.mustache @@ -0,0 +1,27 @@ +{{! + @typedef object main-menu-action + @prop string href + @prop string text + + string html-logo-attributes for site logo. Must be used inside tag e.g. `class="logo" lang="en-gb"` + MenuDefinition data-portlets-first + MenuDefinition[] array-portlets-rest + main-menu-action data-main-menu-action For displaying an emphasized action in the main menu. +}} +
+
+ +
+
diff --git a/Vector/includes/templates/Menu.mustache b/Vector/includes/templates/Menu.mustache new file mode 100644 index 0000000..bb64909 --- /dev/null +++ b/Vector/includes/templates/Menu.mustache @@ -0,0 +1,12 @@ +{{! + See @typedef MenuDefinition +}} +{{! DO NOT REMOVE vector-menu class. It is used for click tracking in Extension:WikimediaEvents }} +
+ {{#label}} +
+ {{{.}}} +
+ {{/label}} + {{>MenuContents}} +
diff --git a/Vector/includes/templates/MenuContents.mustache b/Vector/includes/templates/MenuContents.mustache new file mode 100644 index 0000000..bda485a --- /dev/null +++ b/Vector/includes/templates/MenuContents.mustache @@ -0,0 +1,6 @@ +
+ {{{html-before-portal}}} +
    {{! + }}{{{html-items}}}
+ {{{html-after-portal}}} +
diff --git a/Vector/includes/templates/PageTitlebar.mustache b/Vector/includes/templates/PageTitlebar.mustache new file mode 100644 index 0000000..c73a5aa --- /dev/null +++ b/Vector/includes/templates/PageTitlebar.mustache @@ -0,0 +1,47 @@ +{{!- + Page titlebar - Main

title for all pages, with either the indicators or language selector. + When language button is visible, indicators are placed in the BeforeContent.mustache template instead. +}} +
+ {{#data-toc}} + {{! Checkbox hack used by collapsed TOC on narrow viewports for no JS users }} + + + {{! TOC is moved into this dropdown from the sidebar in stickyHeader.js. }} + + {{/data-toc}} + {{{html-title-heading}}} + + {{#has-buttons-in-content-top}} + {{#data-lang-btn}} + {{>LanguageDropdown}} + {{/data-lang-btn}} + {{#data-add-topic-button}} + {{>Button}} + {{/data-add-topic-button}} + {{/has-buttons-in-content-top}} + + {{^has-buttons-in-content-top}} + {{>Indicators}} + {{/has-buttons-in-content-top}} +
diff --git a/Vector/includes/templates/PageToolbar.mustache b/Vector/includes/templates/PageToolbar.mustache new file mode 100644 index 0000000..1b52f79 --- /dev/null +++ b/Vector/includes/templates/PageToolbar.mustache @@ -0,0 +1,31 @@ +
+
+ {{#data-portlets}} +
+ +
+
+ + + +
+ {{/data-portlets}} +
+
diff --git a/Vector/includes/templates/PageTools.mustache b/Vector/includes/templates/PageTools.mustache new file mode 100644 index 0000000..1b307af --- /dev/null +++ b/Vector/includes/templates/PageTools.mustache @@ -0,0 +1,4 @@ +{{! Use `.vector-page-tools` to target styles at this element}} +{{>PinnableElement/Open}} + {{#data-menus}}{{>Menu}}{{/data-menus}} +{{>PinnableElement/Close}} diff --git a/Vector/includes/templates/PinnableContainer/Close.mustache b/Vector/includes/templates/PinnableContainer/Close.mustache new file mode 100644 index 0000000..04f5b84 --- /dev/null +++ b/Vector/includes/templates/PinnableContainer/Close.mustache @@ -0,0 +1 @@ +

diff --git a/Vector/includes/templates/PinnableContainer/Pinned/Open.mustache b/Vector/includes/templates/PinnableContainer/Pinned/Open.mustache new file mode 100644 index 0000000..0256234 --- /dev/null +++ b/Vector/includes/templates/PinnableContainer/Pinned/Open.mustache @@ -0,0 +1 @@ +
diff --git a/Vector/includes/templates/PinnableContainer/Unpinned/Open.mustache b/Vector/includes/templates/PinnableContainer/Unpinned/Open.mustache new file mode 100644 index 0000000..d27aa8a --- /dev/null +++ b/Vector/includes/templates/PinnableContainer/Unpinned/Open.mustache @@ -0,0 +1 @@ +
diff --git a/Vector/includes/templates/PinnableElement/Close.mustache b/Vector/includes/templates/PinnableElement/Close.mustache new file mode 100644 index 0000000..04f5b84 --- /dev/null +++ b/Vector/includes/templates/PinnableElement/Close.mustache @@ -0,0 +1 @@ +
diff --git a/Vector/includes/templates/PinnableElement/Open.mustache b/Vector/includes/templates/PinnableElement/Open.mustache new file mode 100644 index 0000000..457475f --- /dev/null +++ b/Vector/includes/templates/PinnableElement/Open.mustache @@ -0,0 +1,2 @@ +
+ {{#data-pinnable-header}}{{>PinnableHeader}}{{/data-pinnable-header}} diff --git a/Vector/includes/templates/PinnableHeader.mustache b/Vector/includes/templates/PinnableHeader.mustache new file mode 100644 index 0000000..7a0e173 --- /dev/null +++ b/Vector/includes/templates/PinnableHeader.mustache @@ -0,0 +1,11 @@ +
+ <{{label-tag-name}} class="vector-pinnable-header-label">{{label}} + + +
diff --git a/Vector/includes/templates/SearchBox.mustache b/Vector/includes/templates/SearchBox.mustache new file mode 100644 index 0000000..ade2135 --- /dev/null +++ b/Vector/includes/templates/SearchBox.mustache @@ -0,0 +1,44 @@ +{{! + See @typedef SearchData +}} + + {{#is-collapsible}} + {{#data-collapse-icon}} + {{>Button}} + {{/data-collapse-icon}} + {{/is-collapsible}} +
+ {{#has-label}} +

+ {{msg-search}} +

+ {{/has-label}} +
+
+ + + {{! We construct two buttons (for 'go' and 'fulltext' search modes), but only one will be + visible and actionable at a time (they are overlaid on top of each other in CSS). + * Browsers will use the 'fulltext' one by default (as it's the first in tree-order), + which is desirable when they are unable to show search suggestions (either due to being + broken or having JavaScript turned off). + * The mediawiki.searchSuggest module, after doing tests for the broken browsers, removes + the 'fulltext' button and handles 'fulltext' search itself; this will reveal the 'go' + button and cause it to be used. !}} + + +
+
+
+
diff --git a/Vector/includes/templates/StickyHeader.mustache b/Vector/includes/templates/StickyHeader.mustache new file mode 100644 index 0000000..3470fd5 --- /dev/null +++ b/Vector/includes/templates/StickyHeader.mustache @@ -0,0 +1,57 @@ +{{! + Sticky header is hidden from screen readers because it contains duplicated content + that is already accessible to assistive tech via landmark roles, element type, and other navigation methods. + The interactive elements in the sticky header should have the `tabindex="-1"` attribute set to ensure + the header is also not tab accessible. + + See https://dequeuniversity.com/rules/axe/4.1/aria-hidden-focus and https://phabricator.wikimedia.org/T290201 + for more context. + + The exception to this is the TOC in the sticky header, which is not duplicated and is moved into the + sticky header in the DOM. We apply `aria-hidden` to all the contents of the sticky header except for the TOC. +}} +
+
+ + {{#data-search}} + {{>SearchBox}} + {{/data-search}} +
+ {{#data-toc}} + {{! TOC is moved into this dropdown from the sidebar in stickyHeader.js. }} + + {{/data-toc}} + +
+
+ +
diff --git a/Vector/includes/templates/TableOfContents.mustache b/Vector/includes/templates/TableOfContents.mustache new file mode 100644 index 0000000..d2792d0 --- /dev/null +++ b/Vector/includes/templates/TableOfContents.mustache @@ -0,0 +1,3 @@ +{{>PinnableElement/Open}} + {{>TableOfContents__list}} +{{>PinnableElement/Close}} diff --git a/Vector/includes/templates/TableOfContents__line.mustache b/Vector/includes/templates/TableOfContents__line.mustache new file mode 100644 index 0000000..36c1f8b --- /dev/null +++ b/Vector/includes/templates/TableOfContents__line.mustache @@ -0,0 +1,20 @@ +
  • + +
    + {{number}}{{{line}}}
    +
    + {{#extensionData.DiscussionTools-html-summary}} + {{{.}}} + {{/extensionData.DiscussionTools-html-summary}} + {{#is-top-level-section}}{{#is-parent-section}} + + {{/is-parent-section}}{{/is-top-level-section}} +
      + {{#array-sections}} + {{>TableOfContents__line}} + {{/array-sections}} +
    +
  • diff --git a/Vector/includes/templates/TableOfContents__list.mustache b/Vector/includes/templates/TableOfContents__list.mustache new file mode 100644 index 0000000..6017bbd --- /dev/null +++ b/Vector/includes/templates/TableOfContents__list.mustache @@ -0,0 +1,13 @@ +
      + {{#is-vector-toc-beginning-enabled}} +
    • + +
      {{ msg-vector-toc-beginning }}
      +
      +
    • + {{/is-vector-toc-beginning-enabled}} + {{#array-sections}} + {{>TableOfContents__line}} + {{/array-sections}} +
    diff --git a/Vector/includes/templates/Tabs.mustache b/Vector/includes/templates/Tabs.mustache new file mode 100644 index 0000000..0726beb --- /dev/null +++ b/Vector/includes/templates/Tabs.mustache @@ -0,0 +1,7 @@ +{{! + See @typedef MenuDefinition +}} +{{! DO NOT REMOVE vector-menu class. It is used for click tracking in Extension:WikimediaEvents }} +
    + {{>TabsMenuContents}} +
    diff --git a/Vector/includes/templates/TabsListItem.mustache b/Vector/includes/templates/TabsListItem.mustache new file mode 100644 index 0000000..9ad454d --- /dev/null +++ b/Vector/includes/templates/TabsListItem.mustache @@ -0,0 +1,6 @@ +
  • {{! +}}{{#array-links}}{{! + }}{{>Link}}{{! +}}{{/array-links}}{{! +}}{{text}}{{! +}}
  • diff --git a/Vector/includes/templates/TabsMenuContents.mustache b/Vector/includes/templates/TabsMenuContents.mustache new file mode 100644 index 0000000..7ef73aa --- /dev/null +++ b/Vector/includes/templates/TabsMenuContents.mustache @@ -0,0 +1,7 @@ +
    + {{{html-before-portal}}} +
      + {{#array-items}}{{>TabsListItem}}{{/array-items}} +
    + {{{html-after-portal}}} +
    diff --git a/Vector/includes/templates/UserLinks.mustache b/Vector/includes/templates/UserLinks.mustache new file mode 100644 index 0000000..020f86c --- /dev/null +++ b/Vector/includes/templates/UserLinks.mustache @@ -0,0 +1,4 @@ + diff --git a/Vector/includes/templates/UserLinksDropdown.mustache b/Vector/includes/templates/UserLinksDropdown.mustache new file mode 100644 index 0000000..2c528d3 --- /dev/null +++ b/Vector/includes/templates/UserLinksDropdown.mustache @@ -0,0 +1,3 @@ +{{#data-user-links-dropdown}}{{>Dropdown/Open}}{{/data-user-links-dropdown}} + {{#data-user-links-dropdown-menus}}{{>Menu}}{{/data-user-links-dropdown-menus}} +{{#data-user-links-dropdown}}{{>Dropdown/Close}}{{/data-user-links-dropdown}} diff --git a/Vector/includes/templates/VariantsDropdown.mustache b/Vector/includes/templates/VariantsDropdown.mustache new file mode 100644 index 0000000..17f1c5d --- /dev/null +++ b/Vector/includes/templates/VariantsDropdown.mustache @@ -0,0 +1,4 @@ +{{! Use `.mw-portlet-variants` to target styles at this element}} +{{>Dropdown/Open}} + {{>MenuContents}} +{{>Dropdown/Close}} diff --git a/Vector/includes/templates/deprecated/MainMenuBtn.mustache b/Vector/includes/templates/deprecated/MainMenuBtn.mustache new file mode 100644 index 0000000..75cc699 --- /dev/null +++ b/Vector/includes/templates/deprecated/MainMenuBtn.mustache @@ -0,0 +1,11 @@ + diff --git a/Vector/includes/templates/skin-legacy.mustache b/Vector/includes/templates/skin-legacy.mustache new file mode 100644 index 0000000..279e0f3 --- /dev/null +++ b/Vector/includes/templates/skin-legacy.mustache @@ -0,0 +1,69 @@ +{{! + string|null html-site-notice the contents of a banner defined in MediaWiki:Sitenotice. + Also used by CentralNotice to inject banners into Vector. + Indicator[] array-indicators wiki-defined badges such as "good article", + "featured article". An empty array if none are defined. + string html-title + bool is-article + string msg-tagline + string html-subtitle + string html-undelete-link + string html-newtalk + string msg-vector-jumptonavigation + string msg-vector-jumptosearch + string html-body-content + string html-categories + string html-after-content + string msg-navigation-heading + MenuDefinition data-portlets.data-personal + MenuDefinition data-portlets.data-namespaces + MenuDefinition data-portlets.data-variants + MenuDefinition data-portlets.data-views + MenuDefinition data-portlets.data-actions + object data-search-box. See SearchBox.mustache for documentation. + object data-portlets-main-menu. See MainMenu.mustache for documentation. + object data-footer for footer template partial. see Footer.mustache for documentation. +}} +
    +
    +
    + +
    {{{html-site-notice}}}
    + {{>Indicators}} + {{{html-title-heading}}} +
    + {{#is-article}}
    {{msg-tagline}}
    {{/is-article}} +
    {{{html-subtitle}}}
    +
    {{{html-undelete-link}}}
    + {{{html-user-message}}} + {{! + Keep this empty `div` for compatibility with gadgets and user scripts + using this place to insert extra elements before. + }} +
    + {{msg-vector-jumptonavigation}} + {{msg-vector-jumptosearch}} + {{{html-body-content}}} + {{{html-categories}}} +
    +
    +{{{html-after-content}}} +
    +

    {{msg-navigation-heading}}

    +
    + {{#data-portlets}} + {{>LegacyUserLinks}} +
    + {{#data-namespaces}}{{>LegacyMenu}}{{/data-namespaces}} + {{#data-variants}}{{>LegacyMenu}}{{/data-variants}} +
    +
    + {{#data-views}}{{>LegacyMenu}}{{/data-views}} + {{#data-actions}}{{>LegacyMenu}}{{/data-actions}} + {{#data-search-box}}{{>SearchBox}}{{/data-search-box}} +
    + {{/data-portlets}} +
    + {{#data-portlets-main-menu}}{{>LegacySidebar}}{{/data-portlets-main-menu}} +
    +{{#data-footer}}{{>Footer}}{{/data-footer}} diff --git a/Vector/includes/templates/skin.mustache b/Vector/includes/templates/skin.mustache new file mode 100644 index 0000000..631adb3 --- /dev/null +++ b/Vector/includes/templates/skin.mustache @@ -0,0 +1,89 @@ +{{! + string|null html-site-notice the contents of a banner defined in MediaWiki:Sitenotice. + Also used by CentralNotice to inject banners into Vector. + Indicator[] array-indicators wiki-defined badges such as "good article", + "featured article". An empty array if none are defined. + string html-title + bool is-article + string msg-tagline + string html-subtitle + string html-undelete-link + string html-newtalk + string msg-vector-jumptonavigation + string msg-vector-jumptosearch + string msg-vector-jumptocontent + string html-body-content + string html-categories + string html-after-content + LogoOptions data-logos + object data-portlets + MenuDefinition data-portlets.data-personal + MenuDefinition data-portlets.data-namespaces + MenuDefinition data-portlets.data-variants + MenuDefinition data-portlets.data-views + MenuDefinition data-portlets.data-actions + object data-search-box. See SearchBox.mustache for documentation. + boolean is-main-menu-visible For users that want to see the sidebar on initial render, this should be + true. + string msg-vector-action-toggle-sidebar The label used by the sidebar button. + string msg-vector-main-menu-tooltip The title attribute for the main menu icon. + object data-main-menu. See MainMenu.mustache for documentation. + object data-footer for footer template partial. see Footer.mustache for documentation. +}} +
    + {{msg-vector-jumptocontent}} +
    + + {{>Header}} + {{>MainMenuPinned}} +
    +
    {{{html-site-notice}}}
    +
    + {{#data-toc}} + + + {{/data-toc}} +
    + {{! `role` is unnecessary but kept to support selectors in any gadgets or user styles. }} +
    + {{>PageTitlebar}} + {{>PageToolbar}} + {{#is-page-tools-enabled}}{{>ColumnEnd}}{{/is-page-tools-enabled}} +
    + {{>BeforeContent}} + {{! the #contentSub element is currently used by editors, do not hide or remove it + until https://phabricator.wikimedia.org/T316830 has been addressed}} +
    {{{html-subtitle}}}
    + {{#html-undelete-link}}
    {{{.}}}
    {{/html-undelete-link}} + {{{html-user-message}}} + {{{html-body-content}}} + {{{html-categories}}} + {{#is-page-tools-enabled}}{{#is-language-in-content-bottom}} + {{#data-lang-btn}}{{>LanguageDropdown}}{{/data-lang-btn}} + {{/is-language-in-content-bottom}}{{/is-page-tools-enabled}} +
    + {{^is-page-tools-enabled}}{{#is-language-in-content-bottom}} + {{#data-lang-btn}}{{>LanguageDropdown}}{{/data-lang-btn}} + {{/is-language-in-content-bottom}}{{/is-page-tools-enabled}} +
    + {{{html-after-content}}} +
    + +
    {{! END mw-page-container-inner }} +
    {{! END mw-page-container }} +{{#data-vector-sticky-header}}{{>StickyHeader}}{{/data-vector-sticky-header}} diff --git a/Vector/jest.config.js b/Vector/jest.config.js new file mode 100644 index 0000000..5a52ad2 --- /dev/null +++ b/Vector/jest.config.js @@ -0,0 +1,58 @@ +// For a detailed explanation regarding each configuration property, visit: +// https://jestjs.io/docs/en/configuration.html + +module.exports = { + moduleNameMapper: { + '^./templates/(.*).mustache': '/includes/templates/$1.mustache' + }, + + // Automatically clear mock calls and instances between every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + collectCoverage: true, + + // An array of glob patterns indicating a set of files fo + // which coverage information should be collected + collectCoverageFrom: [ + 'resources/**/*.(js|vue)' + ], + + // The directory where Jest should output its coverage files + coverageDirectory: 'coverage', + + // An array of regexp pattern strings used to skip coverage collection + coveragePathIgnorePatterns: [ + '/node_modules/' + ], + + // An object that configures minimum threshold enforcement for coverage results + coverageThreshold: { + global: { + branches: 26, + functions: 32, + lines: 34, + statements: 34 + } + }, + + // An array of file extensions your modules use + moduleFileExtensions: [ + 'js', + 'json', + 'vue' + ], + + // The paths to modules that run some code to configure or + // set up the testing environment before each test + setupFiles: [ + './jest.setup.js' + ], + + testEnvironment: 'jsdom', + + transform: { + '^.+\\.mustache?$': 'mustache-jest', + '.*\\.(vue)$': '/node_modules/@vue/vue3-jest' + } +}; diff --git a/Vector/jest.setup.js b/Vector/jest.setup.js new file mode 100644 index 0000000..1dc3b76 --- /dev/null +++ b/Vector/jest.setup.js @@ -0,0 +1,7 @@ +/* eslint-disable */ +// @ts-nocheck +var mockMediaWiki = require( '@wikimedia/mw-node-qunit/src/mockMediaWiki.js' ); +global.mw = mockMediaWiki(); +global.$ = require('jquery'); +global.mw.util.showPortlet = function() {}; +global.mw.Api.prototype.saveOption = function() {}; diff --git a/Vector/jsdoc.json b/Vector/jsdoc.json new file mode 100644 index 0000000..6214830 --- /dev/null +++ b/Vector/jsdoc.json @@ -0,0 +1,50 @@ +{ + "opts": { + "destination": "docs/js", + "package": "package.json", + "pedantic": true, + "readme": "README.md", + "recurse": true, + "template": "node_modules/jsdoc-wmf-theme" + }, + "source": { + "include": [ "resources" ] + }, + "templates": { + "cleverLinks": true, + "default": { + "useLongnameInNav": true + }, + "wmf": { + "linkMap": { + "\"addEventListener\"": "https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener", + "jQuery": "https://api.jquery.com", + "AbortSignal": "https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal", + "Document": "https://developer.mozilla.org/docs/Web/API/Document", + "Element": "https://developer.mozilla.org/docs/Web/API/Element", + "Event": "https://developer.mozilla.org/docs/Web/API/Event", + "EventTarget": "https://developer.mozilla.org/docs/Web/API/EventTarget", + "HTMLElement": "https://developer.mozilla.org/docs/Web/API/HTMLElement", + "IntersectionObserver": "https://developer.mozilla.org/docs/Web/API/IntersectionObserver", + "IntersectionObserverEntry": "https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry", + "MediaQueryList": "https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList", + "MediaQueryListEvent": "https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryListEvent", + "Node": "https://developer.mozilla.org/docs/Web/API/Node", + "NodeList": "https://developer.mozilla.org/docs/Web/API/NodeList", + "HTMLInputElement": "https://developer.mozilla.org/docs/Web/API/HTMLInputElement", + "\"removeEventListener\"": "https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener", + "Window": "https://developer.mozilla.org/docs/Web/API/Window", + "CheckboxHack": "https://doc.wikimedia.org/mediawiki-core/master/js", + "MediaWikiPageReadyModule": "https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.plugin.page.ready", + "MW": "https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw", + "MwMap": "https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Map", + "RequestInit": "https://developer.mozilla.org/en-US/docs/Web/API/Request/Request", + "JQueryStatic": "https://api.jquery.com", + "JQuery.Promise": "https://api.jquery.com/promise/", + "VectorResourceLoaderVirtualConfig": "#", + "void": "#", + "Vue.VNode": "https://vuejs.org/v2/api/#VNode-Interface" + } + } + } +} diff --git a/Vector/package-lock.json b/Vector/package-lock.json new file mode 100644 index 0000000..d79efbc --- /dev/null +++ b/Vector/package-lock.json @@ -0,0 +1,41465 @@ +{ + "name": "Vector", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "Vector", + "devDependencies": { + "@babel/core": "7.8.0", + "@storybook/html": "5.2.8", + "@types/jest": "27.0.0", + "@types/jquery": "3.3.33", + "@types/mustache": "4.0.1", + "@types/node-fetch": "2.5.7", + "@vue/test-utils": "2.0.1", + "@vue/vue3-jest": "27.0.0-alpha.4", + "@wikimedia/codex": "0.4.2", + "@wikimedia/codex-icons": "0.4.2", + "@wikimedia/codex-search": "0.4.2", + "@wikimedia/mw-node-qunit": "6.4.1", + "@wikimedia/types-wikimedia": "0.3.3", + "babel-loader": "8.0.6", + "eslint-config-wikimedia": "0.22.1", + "grunt-banana-checker": "0.9.0", + "jest": "27.4.7", + "jest-fetch-mock": "3.0.3", + "jsdoc": "3.6.10", + "jsdoc-wmf-theme": "0.0.5", + "less": "3.8.1", + "less-loader": "4.1.0", + "mustache": "3.0.1", + "mustache-jest": "1.1.1", + "node-fetch": "2.6.7", + "postcss-less": "6.0.0", + "pre-commit": "1.2.2", + "stylelint-config-wikimedia": "0.13.0", + "svgo": "2.8.0", + "ts-jest": "27.1.3", + "typescript": "4.5.5", + "vue": "3.2.37", + "wmf-a11y": "0.0.0" + }, + "peerDependencies": { + "babel-core": "6.26.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helpers": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.17.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.17.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.17.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.17.9", + "@babel/plugin-transform-modules-systemjs": "^7.17.8", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.17.9", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.17.10", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.13.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "10.0.29", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + }, + "node_modules/@emotion/core": { + "version": "10.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/css": { + "version": "10.0.27", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/serialize": { + "version": "0.11.16", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/@emotion/sheet": { + "version": "0.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/styled-base": "^10.3.0", + "babel-plugin-emotion": "^10.0.27" + }, + "peerDependencies": { + "@emotion/core": "^10.0.27", + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/styled-base": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + }, + "peerDependencies": { + "@emotion/core": "^10.0.28", + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/utils": { + "version": "0.11.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "comment-parser": "1.3.0", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~2.2.3" + }, + "engines": { + "node": "^12 || ^14 || ^16 || ^17" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/environment/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/environment/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/fake-timers/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/globals/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/globals/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/test-result/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mdn/browser-compat-data": { + "version": "4.1.20", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@reach/router": { + "version": "1.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "create-react-context": "0.3.0", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "15.x || 16.x || 16.4.0-alpha.0911da3", + "react-dom": "15.x || 16.x || 16.4.0-alpha.0911da3" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@storybook/addons": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/api": "5.2.8", + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "core-js": "^3.0.1", + "global": "^4.3.2", + "util-deprecate": "^1.0.2" + } + }, + "node_modules/@storybook/api": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/router": "5.2.8", + "@storybook/theming": "5.2.8", + "core-js": "^3.0.1", + "fast-deep-equal": "^2.0.1", + "global": "^4.3.2", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3", + "prop-types": "^15.6.2", + "react": "^16.8.3", + "semver": "^6.0.0", + "shallow-equal": "^1.1.0", + "store2": "^2.7.1", + "telejson": "^3.0.2", + "util-deprecate": "^1.0.2" + } + }, + "node_modules/@storybook/api/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/channel-postmessage": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "core-js": "^3.0.1", + "global": "^4.3.2", + "telejson": "^3.0.2" + } + }, + "node_modules/@storybook/channels": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.0.1" + } + }, + "node_modules/@storybook/client-api": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addons": "5.2.8", + "@storybook/channel-postmessage": "5.2.8", + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/router": "5.2.8", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "eventemitter3": "^4.0.0", + "global": "^4.3.2", + "is-plain-object": "^3.0.0", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3", + "qs": "^6.6.0", + "stable": "^0.1.8", + "util-deprecate": "^1.0.2" + } + }, + "node_modules/@storybook/client-logger": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.0.1" + } + }, + "node_modules/@storybook/components": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "5.2.8", + "@storybook/theming": "5.2.8", + "@types/react-syntax-highlighter": "10.1.0", + "@types/react-textarea-autosize": "^4.3.3", + "core-js": "^3.0.1", + "global": "^4.3.2", + "markdown-to-jsx": "^6.9.1", + "memoizerific": "^1.11.3", + "polished": "^3.3.1", + "popper.js": "^1.14.7", + "prop-types": "^15.7.2", + "react": "^16.8.3", + "react-dom": "^16.8.3", + "react-focus-lock": "^1.18.3", + "react-helmet-async": "^1.0.2", + "react-popper-tooltip": "^2.8.3", + "react-syntax-highlighter": "^8.0.1", + "react-textarea-autosize": "^7.1.0", + "simplebar-react": "^1.0.0-alpha.6" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@storybook/core": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.7.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-transform-react-constant-elements": "^7.6.3", + "@babel/preset-env": "^7.7.1", + "@storybook/addons": "5.2.8", + "@storybook/channel-postmessage": "5.2.8", + "@storybook/client-api": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/node-logger": "5.2.8", + "@storybook/router": "5.2.8", + "@storybook/theming": "5.2.8", + "@storybook/ui": "5.2.8", + "airbnb-js-shims": "^1 || ^2", + "ansi-to-html": "^0.6.11", + "autoprefixer": "^9.4.9", + "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-emotion": "^10.0.14", + "babel-plugin-macros": "^2.4.5", + "babel-preset-minify": "^0.5.0 || 0.6.0-alpha.5", + "boxen": "^3.0.0", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "chalk": "^2.4.2", + "cli-table3": "0.5.1", + "commander": "^2.19.0", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "corejs-upgrade-webpack-plugin": "^2.2.0", + "css-loader": "^3.0.0", + "detect-port": "^1.3.0", + "dotenv-webpack": "^1.7.0", + "ejs": "^2.6.1", + "express": "^4.17.0", + "file-loader": "^3.0.1", + "file-system-cache": "^1.0.5", + "find-cache-dir": "^3.0.0", + "fs-extra": "^8.0.1", + "global": "^4.3.2", + "html-webpack-plugin": "^4.0.0-beta.2", + "inquirer": "^6.2.0", + "interpret": "^1.2.0", + "ip": "^1.1.5", + "json5": "^2.1.0", + "lazy-universal-dotenv": "^3.0.1", + "node-fetch": "^2.6.0", + "open": "^6.1.0", + "pnp-webpack-plugin": "1.4.3", + "postcss-flexbugs-fixes": "^4.1.0", + "postcss-loader": "^3.0.0", + "pretty-hrtime": "^1.0.3", + "qs": "^6.6.0", + "raw-loader": "^2.0.0", + "react-dev-utils": "^9.0.0", + "regenerator-runtime": "^0.12.1", + "resolve": "^1.11.0", + "resolve-from": "^5.0.0", + "semver": "^6.0.0", + "serve-favicon": "^2.5.0", + "shelljs": "^0.8.3", + "style-loader": "^0.23.1", + "terser-webpack-plugin": "^1.2.4", + "unfetch": "^4.1.0", + "url-loader": "^2.0.1", + "util-deprecate": "^1.0.2", + "webpack": "^4.33.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-hot-middleware": "^2.25.0" + }, + "peerDependencies": { + "babel-loader": "^7.0.0 || ^8.0.0", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@storybook/core-events": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^3.0.1" + } + }, + "node_modules/@storybook/core/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/core/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/html": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addons": "5.2.8", + "@storybook/core": "5.2.8", + "@types/webpack-env": "^1.13.9", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "global": "^4.3.2", + "html-loader": "^0.5.5", + "regenerator-runtime": "^0.12.1" + }, + "bin": { + "build-storybook": "bin/build.js", + "start-storybook": "bin/index.js", + "storybook-server": "bin/index.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "babel-loader": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/node-logger": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "core-js": "^3.0.1", + "npmlog": "^4.1.2", + "pretty-hrtime": "^1.0.3", + "regenerator-runtime": "^0.12.1" + } + }, + "node_modules/@storybook/router": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@reach/router": "^1.2.1", + "@types/reach__router": "^1.2.3", + "core-js": "^3.0.1", + "global": "^4.3.2", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3", + "qs": "^6.6.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@storybook/theming": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/core": "^10.0.14", + "@emotion/styled": "^10.0.14", + "@storybook/client-logger": "5.2.8", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.14", + "global": "^4.3.2", + "memoizerific": "^1.11.3", + "polished": "^3.3.1", + "prop-types": "^15.7.2", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@storybook/ui": { + "version": "5.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addons": "5.2.8", + "@storybook/api": "5.2.8", + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/components": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/router": "5.2.8", + "@storybook/theming": "5.2.8", + "copy-to-clipboard": "^3.0.8", + "core-js": "^3.0.1", + "core-js-pure": "^3.0.1", + "emotion-theming": "^10.0.14", + "fast-deep-equal": "^2.0.1", + "fuse.js": "^3.4.4", + "global": "^4.3.2", + "lodash": "^4.17.15", + "markdown-to-jsx": "^6.9.3", + "memoizerific": "^1.11.3", + "polished": "^3.3.1", + "prop-types": "^15.7.2", + "qs": "^6.6.0", + "react": "^16.8.3", + "react-dom": "^16.8.3", + "react-draggable": "^4.0.3", + "react-helmet-async": "^1.0.2", + "react-hotkeys": "2.0.0-pre4", + "react-sizeme": "^2.6.7", + "regenerator-runtime": "^0.13.2", + "resolve-from": "^5.0.0", + "semver": "^6.0.0", + "store2": "^2.7.1", + "telejson": "^3.0.2", + "util-deprecate": "^1.0.2" + } + }, + "node_modules/@storybook/ui/node_modules/regenerator-runtime": { + "version": "0.13.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/ui/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/is-function": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "27.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/jquery": { + "version": "3.3.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mustache": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "17.0.33", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node-fetch": { + "version": "2.5.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/reach__router": { + "version": "1.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react": { + "version": "18.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-textarea-autosize": { + "version": "4.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react/node_modules/csstype": { + "version": "3.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uglify-js": { + "version": "3.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-env": { + "version": "1.16.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-ssr": "3.2.37", + "@vue/reactivity-transform": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.2.37", + "@vue/shared": "3.2.37", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.2.37", + "@vue/shared": "3.2.37" + }, + "peerDependencies": { + "vue": "3.2.37" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.37", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/@vue/vue3-jest": { + "version": "27.0.0-alpha.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "extract-from-css": "^0.4.4", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "peerDependencies": { + "@babel/core": "7.x", + "babel-jest": "27.x", + "jest": "27.x", + "ts-jest": "27.x", + "typescript": ">= 3.x", + "vue": "^3.0.0-0" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/vue3-jest/node_modules/source-map": { + "version": "0.5.6", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@wikimedia/codex": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@wikimedia/codex/-/codex-0.4.2.tgz", + "integrity": "sha512-+J+3b3ItWJ75yHRMpZLuuwo6rX3FmgfsRp5KOZn69sOPom7LMhSk2dvuQTyJkFaCBy8y/DF+/8/ACuSuSzVChA==", + "dev": true, + "engines": { + "node": ">=16", + "npm": ">=7.21.0" + }, + "peerDependencies": { + "vue": "^3.2.37" + } + }, + "node_modules/@wikimedia/codex-icons": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@wikimedia/codex-icons/-/codex-icons-0.4.2.tgz", + "integrity": "sha512-PdPh+yOQm7NtkbRxkNWCyyQsrYGky+T+LRZM/4mj7VOyeoAf1xM/r+9zMFJQY+flgmD/+dTTjeIFYn+KFKFLbQ==", + "dev": true, + "engines": { + "node": ">=16", + "npm": ">=7.21.0" + } + }, + "node_modules/@wikimedia/codex-search": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@wikimedia/codex-search/-/codex-search-0.4.2.tgz", + "integrity": "sha512-+80dYkdc2VtQoqhVK65wkwiO0nlfWNpFI2GVnjpRfW2gJOWX0vflHGRAkO26dIySa8g6aOeS215tFLfF+0DpxA==", + "dev": true, + "engines": { + "node": ">=16", + "npm": ">=7.21.0" + }, + "peerDependencies": { + "vue": "^3.2.37" + } + }, + "node_modules/@wikimedia/mw-node-qunit": { + "version": "6.4.1", + "dev": true, + "license": "GPL-3.0", + "dependencies": { + "eslint-config-wikimedia": "0.21.0", + "glob": "7.2.0", + "jquery": "3.6.0", + "jsdom": "18.0.1", + "mustache": "4.2.0", + "oojs": "6.0.0", + "prettier": "2.4.1", + "qunit": "2.17.2", + "sinon": "12.0.1" + }, + "bin": { + "mw-node-qunit": "mw-node-qunit.js" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/@babel/code-frame": { + "version": "7.12.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/@mdn/browser-compat-data": { + "version": "3.3.14", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint": { + "version": "7.32.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint-config-wikimedia": { + "version": "0.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint": "^7.32.0", + "eslint-plugin-compat": "^3.13.0", + "eslint-plugin-es": "^4.1.0", + "eslint-plugin-jsdoc": "^37.0.3", + "eslint-plugin-json-es": "^1.5.4", + "eslint-plugin-mediawiki": "^0.3.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-jquery": "^2.7.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-qunit": "^7.0.0", + "eslint-plugin-unicorn": "^37.0.1", + "eslint-plugin-vue": "^8.0.2", + "eslint-plugin-wdio": "^7.4.2" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint-plugin-compat": { + "version": "3.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^3.3.14", + "ast-metadata-inferer": "^0.7.0", + "browserslist": "^4.16.8", + "caniuse-lite": "^1.0.30001251", + "core-js": "^3.16.2", + "find-up": "^5.0.0", + "lodash.memoize": "4.1.2", + "semver": "7.3.5" + }, + "engines": { + "node": ">=9.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint-plugin-compat/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint-plugin-unicorn": { + "version": "37.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "ci-info": "^3.2.0", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "4", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "safe-regex": "^2.1.1", + "semver": "^7.3.5", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=7.32.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/espree": { + "version": "7.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/globals": { + "version": "13.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/ignore": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/mustache": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wikimedia/mw-node-qunit/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@wikimedia/types-wikimedia": { + "version": "0.3.3", + "dev": true + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/airbnb-js-shims": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.13", + "es6-shim": "^0.35.5", + "function.prototype.name": "^1.1.0", + "globalthis": "^1.0.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0 || ^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.1.0", + "promise.allsettled": "^1.0.0", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^4.0.0 || ^3.0.1", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ajv/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-to-html": { + "version": "0.6.15", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^2.0.0" + }, + "bin": { + "ansi-to-html": "bin/ansi-to-html" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-dir": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/aproba": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-metadata-inferer": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^3.3.14" + } + }, + "node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": { + "version": "3.3.14", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ast-types": { + "version": "0.9.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/autoprefixer/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/axe-core": { + "version": "4.4.2", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-core": { + "version": "6.26.3", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-core/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-core/node_modules/json5": { + "version": "0.5.1", + "license": "MIT", + "peer": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-core/node_modules/ms": { + "version": "2.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-generator/node_modules/jsesc": { + "version": "1.3.0", + "license": "MIT", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/babel-helper-evaluate-path": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helper-flip-expressions": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helper-is-void-0": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helper-mark-eval-scopes": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helper-remove-or-void": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helper-to-multiple-sequence-expressions": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-add-react-displayname": { + "version": "0.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-emotion": { + "version": "10.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-minify-builtins": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-minify-constant-folding": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "node_modules/babel-plugin-minify-dead-code-elimination": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-mark-eval-scopes": "^0.4.3", + "babel-helper-remove-or-void": "^0.4.3", + "lodash": "^4.17.11" + } + }, + "node_modules/babel-plugin-minify-flip-comparisons": { + "version": "0.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "node_modules/babel-plugin-minify-guarded-expressions": { + "version": "0.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3" + } + }, + "node_modules/babel-plugin-minify-infinity": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-minify-mangle-names": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-mark-eval-scopes": "^0.4.3" + } + }, + "node_modules/babel-plugin-minify-numeric-literals": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-minify-replace": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-minify-simplify": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3", + "babel-helper-is-nodes-equiv": "^0.0.1", + "babel-helper-to-multiple-sequence-expressions": "^0.5.0" + } + }, + "node_modules/babel-plugin-minify-type-constructors": { + "version": "0.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-inline-consecutive-adds": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-member-expression-literals": { + "version": "6.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-merge-sibling-variables": { + "version": "6.9.5", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-minify-booleans": { + "version": "6.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-property-literals": { + "version": "6.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "esutils": "^2.0.2" + } + }, + "node_modules/babel-plugin-transform-regexp-constructors": { + "version": "0.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-remove-console": { + "version": "6.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-remove-debugger": { + "version": "6.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-remove-undefined": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "node_modules/babel-plugin-transform-simplify-comparison-operators": { + "version": "6.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-undefined-to-void": { + "version": "6.9.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-minify": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-minify-builtins": "^0.5.0", + "babel-plugin-minify-constant-folding": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.2", + "babel-plugin-minify-flip-comparisons": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.4", + "babel-plugin-minify-infinity": "^0.4.3", + "babel-plugin-minify-mangle-names": "^0.5.1", + "babel-plugin-minify-numeric-literals": "^0.4.3", + "babel-plugin-minify-replace": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.1", + "babel-plugin-minify-type-constructors": "^0.4.3", + "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", + "babel-plugin-transform-member-expression-literals": "^6.9.4", + "babel-plugin-transform-merge-sibling-variables": "^6.9.5", + "babel-plugin-transform-minify-booleans": "^6.9.4", + "babel-plugin-transform-property-literals": "^6.9.4", + "babel-plugin-transform-regexp-constructors": "^0.4.3", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-plugin-transform-remove-debugger": "^6.9.4", + "babel-plugin-transform-remove-undefined": "^0.5.0", + "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", + "babel-plugin-transform-undefined-to-void": "^6.9.4", + "lodash": "^4.17.11" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-register/node_modules/core-js": { + "version": "2.6.12", + "hasInstallScript": true, + "license": "MIT", + "peer": true + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "license": "MIT" + }, + "node_modules/babel-template": { + "version": "6.26.0", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "license": "MIT", + "peer": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "license": "MIT", + "peer": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/batch-processor": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bfj": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/boxen": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.20.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist-config-wikimedia": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/browserslist/node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/can-use-dom": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001341", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/catharsis": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/check-types": { + "version": "11.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "2.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/chokidar/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "1.2.13", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/upath": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/clipboard": { + "version": "2.0.11", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-regexp": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-regexp": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.2", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/comment-parser": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.22.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.20.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.22.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/corejs-upgrade-webpack-plugin": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0", + "webpack": "^4.38.0" + } + }, + "node_modules/cosmiconfig": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-react-context": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-functions-list": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/css-loader": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/css-loader/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-rule-stream": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tokenize": "^1.0.1", + "duplexer2": "0.0.2", + "ldjson-stream": "^1.2.1", + "through2": "^0.6.3" + }, + "bin": { + "css-rule-stream": "index.js" + } + }, + "node_modules/css-rule-stream/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/css-rule-stream/node_modules/readable-stream": { + "version": "1.0.34", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/css-rule-stream/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/css-rule-stream/node_modules/through2": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tokenize": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^1.0.33" + } + }, + "node_modules/css-tokenize/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tokenize/node_modules/readable-stream": { + "version": "1.1.14", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/css-tokenize/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "2.6.20", + "dev": true, + "license": "MIT" + }, + "node_modules/cyclist": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-object-diff": { + "version": "1.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-port": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-port/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.869402", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/diff": { + "version": "5.0.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/doiuse": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.16.1", + "caniuse-lite": "^1.0.30001179", + "css-rule-stream": "^1.1.0", + "duplexer2": "0.0.2", + "ldjson-stream": "^1.2.1", + "multimatch": "^5.0.0", + "postcss": "^8.2.4", + "source-map": "^0.7.3", + "through2": "^4.0.2", + "yargs": "^16.2.0" + }, + "bin": { + "doiuse": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/doiuse/node_modules/source-map": { + "version": "0.7.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domino": { + "version": "2.1.6", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.4.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/dotenv": { + "version": "6.2.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv-defaults": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "dotenv": "^6.2.0" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dotenv-webpack": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dotenv-defaults": "^1.0.2" + }, + "peerDependencies": { + "webpack": "^1 || ^2 || ^3 || ^4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "dev": true, + "license": "BSD", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "2.7.4", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.137", + "dev": true, + "license": "ISC" + }, + "node_modules/element-resize-detector": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "batch-processor": "1.0.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emittery": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emotion-theming": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/weak-memoize": "0.2.5", + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@emotion/core": "^10.0.27", + "react": ">=16.3.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-colors": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.1", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-shim": { + "version": "4.6.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/es6-shim": { + "version": "0.35.6", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-templates": { + "version": "0.2.3", + "dev": true, + "license": "Apache 2", + "dependencies": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/eslintrc": "^1.2.3", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-wikimedia": { + "version": "0.22.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint": "^8.6.0", + "eslint-plugin-compat": "^4.0.2", + "eslint-plugin-es": "^4.1.0", + "eslint-plugin-jsdoc": "^37.7.1", + "eslint-plugin-json-es": "^1.5.4", + "eslint-plugin-mediawiki": "^0.3.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-jquery": "^2.7.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-qunit": "^7.2.0", + "eslint-plugin-unicorn": "^40.1.0", + "eslint-plugin-vue": "^8.4.1", + "eslint-plugin-wdio": "^7.4.2", + "eslint-plugin-yml": "^0.13.0" + } + }, + "node_modules/eslint-plugin-compat": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdn/browser-compat-data": "^4.1.5", + "ast-metadata-inferer": "^0.7.0", + "browserslist": "^4.16.8", + "caniuse-lite": "^1.0.30001304", + "core-js": "^3.16.2", + "find-up": "^5.0.0", + "lodash.memoize": "4.1.2", + "semver": "7.3.5" + }, + "engines": { + "node": ">=9.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-compat/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-compat/node_modules/semver": { + "version": "7.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-compat/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "37.9.7", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.20.1", + "comment-parser": "1.3.0", + "debug": "^4.3.3", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": "^12 || ^14 || ^16 || ^17" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/eslint-plugin-json-es": { + "version": "1.5.7", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1" + }, + "peerDependencies": { + "eslint": ">= 7" + } + }, + "node_modules/eslint-plugin-mediawiki": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-vue": "^7.20.0", + "upath": "^2.0.1" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/eslint-plugin-vue": { + "version": "7.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + }, + "engines": { + "node": ">=8.10" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/espree": { + "version": "6.2.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-mediawiki/node_modules/vue-eslint-parser": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-mocha": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^3.0.0", + "ramda": "^0.27.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-no-jquery": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=2.3.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-node/node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-qunit": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^3.0.0", + "requireindex": "^1.2.0" + }, + "engines": { + "node": "12.x || 14.x || >=16.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "40.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "ci-info": "^3.3.0", + "clean-regexp": "^1.0.0", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "safe-regex": "^2.1.1", + "semver": "^7.3.5", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=7.32.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/eslint-plugin-vue": { + "version": "8.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^8.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/eslint-plugin-wdio": { + "version": "7.19.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/eslint-plugin-yml": { + "version": "0.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.2", + "lodash": "^4.17.21", + "natural-compare": "^1.4.0", + "yaml-eslint-parser": "^0.5.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-template-visitor": { + "version": "2.3.2", + "dev": true, + "license": "GPL-3.0-or-later OR MIT", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-template-visitor/node_modules/@babel/core": { + "version": "7.17.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.10", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.10", + "@babel/types": "^7.17.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/eslint-template-visitor/node_modules/@babel/eslint-parser": { + "version": "7.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-template-visitor/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-template-visitor/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-template-visitor/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-template-visitor/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.3.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execall": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-regexp": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/expect": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/expect/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/express": { + "version": "4.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-from-css": { + "version": "0.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "css": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0", + "npm": ">=2.0.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.13.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "dev": true, + "license": "ISC" + }, + "node_modules/figures": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-system-cache": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-extra": "^10.1.0", + "ramda": "^0.28.0" + } + }, + "node_modules/file-system-cache/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/file-system-cache/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/file-system-cache/node_modules/ramda": { + "version": "0.28.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/file-system-cache/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/filesize": { + "version": "3.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "dev": true, + "license": "ISC" + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/focus-lock": { + "version": "0.6.8", + "dev": true, + "license": "MIT" + }, + "node_modules/for-in": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "3.6.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6" + } + }, + "node_modules/gauge": { + "version": "2.7.4", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "dev": true, + "license": "BSD" + }, + "node_modules/global": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/globby": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "3.3.10", + "dev": true, + "license": "MIT" + }, + "node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/globrex": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/good-listener": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "license": "ISC" + }, + "node_modules/grunt-banana-checker": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "bin": { + "banana-checker": "src/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gud": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/has-value": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "9.12.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "dev": true, + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/hogan.js/node_modules/mkdirp": { + "version": "0.3.0", + "dev": true, + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/html_codesniffer": { + "version": "2.5.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-loader": { + "version": "0.5.5", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-minifier-terser/node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/html-minifier-terser/node_modules/tslib": { + "version": "2.4.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/icss-utils/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/icss-utils/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immer": { + "version": "1.10.0", + "dev": true, + "license": "MIT" + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "6.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/is-builtin-module": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/core": { + "version": "7.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest": { + "version": "27.4.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^27.4.7", + "import-local": "^3.0.2", + "jest-cli": "^27.4.7" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-changed-files/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-changed-files/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/cssom": { + "version": "0.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "16.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-encoding": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ws": { + "version": "7.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-node/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-fetch-mock": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-haste-map/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-mock/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-mock/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-mock/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve-dependencies/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-util": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jquery": { + "version": "3.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/jsdoc": { + "version": "3.6.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.9.4", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^4.0.1", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=8.15.0" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "2.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc-wmf-theme": { + "version": "0.0.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "domino": "^2.0.1", + "lunr": "2.3.0", + "taffydb": "^2.6.2" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdoc/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom": { + "version": "18.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)", + "optional": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json3": { + "version": "3.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14.0" + } + }, + "node_modules/kleur": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.24.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lazy-universal-dotenv": { + "version": "3.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.5.0", + "app-root-dir": "^1.0.2", + "core-js": "^3.0.4", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=6.0.0", + "yarn": ">=1.0.0" + } + }, + "node_modules/lazy-universal-dotenv/node_modules/dotenv": { + "version": "8.6.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/ldjson-stream": { + "version": "1.2.1", + "dev": true, + "license": "BSD", + "dependencies": { + "split2": "^0.2.1", + "through2": "^0.6.1" + } + }, + "node_modules/ldjson-stream/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ldjson-stream/node_modules/readable-stream": { + "version": "1.0.34", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ldjson-stream/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/ldjson-stream/node_modules/through2": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/less": { + "version": "3.8.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "clone": "^2.1.2" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "less": "^2.3.1 || ^3.0.0", + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/less-loader/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/lowlight": { + "version": "1.9.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^1.0.2", + "highlight.js": "~9.12.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/lunr": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.4", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-to-jsx": { + "version": "6.11.4", + "dev": true, + "license": "MIT", + "dependencies": { + "prop-types": "^15.6.2", + "unquote": "^1.1.0" + }, + "engines": { + "node": ">= 4" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/marked": { + "version": "4.0.16", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "license": "MIT" + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mississippi/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/multimap": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/multimatch/node_modules/arrify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mustache": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + }, + "engines": { + "npm": ">=1.4.0" + } + }, + "node_modules/mustache-jest": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hogan.js": "3.0.2" + } + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/nan": { + "version": "2.15.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/nise": { + "version": "5.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.2", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/node-watch": { + "version": "0.7.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node.extend": { + "version": "2.0.2", + "dev": true, + "license": "(MIT OR GPL-2.0)", + "dependencies": { + "has": "^1.0.3", + "is": "^3.2.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-selector": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oojs": { + "version": "6.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-shim": { + "version": "0.1.3", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pa11y": { + "version": "6.1.1", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "axe-core": "^4.0.2", + "bfj": "~7.0.2", + "commander": "~8.0.0", + "envinfo": "~7.8.1", + "hogan.js": "^3.0.2", + "html_codesniffer": "^2.5.1", + "kleur": "~4.1.4", + "node.extend": "~2.0.2", + "p-timeout": "~4.1.0", + "puppeteer": "~9.1.1", + "semver": "~7.3.5" + }, + "bin": { + "pa11y": "bin/pa11y.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pa11y/node_modules/commander": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/pa11y/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pa11y/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pa11y/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/pako": { + "version": "1.0.11", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-entities": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.4.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/picocolors": { + "version": "0.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-pnp": "^1.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/polished": { + "version": "3.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.3", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.26" + } + }, + "node_modules/postcss-flexbugs-fixes/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-flexbugs-fixes/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-less": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "postcss": "^8.3.5" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-loader/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-scope/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "7.0.39", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-values/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/pre-commit": { + "version": "1.2.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.28.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/private": { + "version": "0.1.8", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-polyfill": { + "version": "8.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/promise.allsettled": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.map": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/promise.prototype.finally": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "9.1.1", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.869402", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.1.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "7.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qs": { + "version": "6.10.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/qunit": { + "version": "2.17.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "7.2.0", + "node-watch": "0.7.2", + "tiny-glob": "0.2.9" + }, + "bin": { + "qunit": "bin/qunit.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/qunit/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/ramda": { + "version": "0.27.2", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.3.0" + } + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/react": { + "version": "16.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dev-utils": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.0", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.3", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "sockjs-client": "1.4.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=8.10" + } + }, + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.5.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/address": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/react-dev-utils/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/react-dev-utils/node_modules/emojis-list": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/inquirer": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/node-releases": { + "version": "1.1.77", + "dev": true, + "license": "MIT" + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/react-dom": { + "version": "16.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-draggable": { + "version": "4.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/react-focus-lock": { + "version": "1.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.6.3", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0" + } + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-hotkeys": { + "version": "2.0.0-pre4", + "dev": true, + "license": "ISC", + "dependencies": { + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "dev": true, + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/react-popper": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "peerDependencies": { + "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-popper-tooltip": { + "version": "2.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2", + "react-popper": "^1.3.7" + }, + "peerDependencies": { + "react": "^16.6.0", + "react-dom": "^16.6.0" + } + }, + "node_modules/react-sizeme": { + "version": "2.6.12", + "dev": true, + "license": "MIT", + "dependencies": { + "element-resize-detector": "^1.2.1", + "invariant": "^2.2.4", + "shallowequal": "^1.1.0", + "throttle-debounce": "^2.1.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0-0 || ^16.0.0" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.18.0", + "highlight.js": "~9.12.0", + "lowlight": "~1.9.1", + "prismjs": "^1.8.4", + "refractor": "^2.4.1" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-textarea-autosize": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": ">=0.14.0 <17.0.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recast": { + "version": "0.11.23", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/recast/node_modules/esprima": { + "version": "3.1.3", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/refractor": { + "version": "2.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hastscript": "^5.0.0", + "parse-entities": "^1.1.2", + "prismjs": "~1.17.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.17.1", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.12.1", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/safe-regex": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.24", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regextras": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.14" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/requizzle": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-favicon": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/node_modules/ms": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/set-value": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/shelljs": { + "version": "0.8.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simplebar": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "can-use-dom": "^0.1.0", + "core-js": "^3.0.1", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.throttle": "^4.1.1", + "resize-observer-polyfill": "^1.5.1" + } + }, + "node_modules/simplebar-react": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "prop-types": "^15.6.1", + "simplebar": "^4.2.3" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0", + "react-dom": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/sinon": { + "version": "12.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/sockjs-client": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "license": "MIT", + "peer": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "dev": true, + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spawn-sync": { + "version": "1.0.15", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/specificity": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "bin": { + "specificity": "bin/specificity" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "0.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "through2": "~0.6.1" + } + }, + "node_modules/split2/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "1.0.34", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/split2/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/split2/node_modules/through2": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/store2": { + "version": "2.13.2", + "dev": true, + "license": "(MIT OR GPL-3.0)" + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padstart": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "0.23.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/stylelint": { + "version": "14.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^2.0.0", + "colord": "^2.9.2", + "cosmiconfig": "^7.0.1", + "css-functions-list": "^3.0.1", + "debug": "^4.3.4", + "execall": "^2.0.0", + "fast-glob": "^3.2.11", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.0", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.24.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "normalize-selector": "^0.2.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.12", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.2.0", + "svg-tags": "^1.0.0", + "table": "^6.8.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "stylelint": "^14.4.0" + } + }, + "node_modules/stylelint-config-wikimedia": { + "version": "0.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist-config-wikimedia": "0.4.0", + "postcss-less": "6.0.0", + "stylelint": "14.8.1", + "stylelint-config-recommended": "7.0.0", + "stylelint-no-unsupported-browser-features": "5.0.3" + }, + "peerDependencies": { + "postcss-less": "^6.0.0" + } + }, + "node_modules/stylelint-no-unsupported-browser-features": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "doiuse": "^4.4.1", + "lodash": "^4.17.15", + "postcss": "^8.3.6" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "stylelint": ">=13.0.0" + } + }, + "node_modules/stylelint/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/stylelint/node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/fast-glob": { + "version": "3.2.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/stylelint/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stylelint/node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/stylelint/node_modules/postcss-safe-parser": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/stylelint/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "4.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/symbol.prototype.description": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-symbol-description": "^1.0.0", + "has-symbols": "^1.0.2", + "object.getownpropertydescriptors": "^2.1.2" + }, + "engines": { + "node": ">= 0.11.15" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.8.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/taffydb": { + "version": "2.6.2", + "dev": true + }, + "node_modules/tapable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/telejson": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.1", + "is-regex": "^1.0.4", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/cross-spawn": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/get-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/is-stream": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/is-wsl": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/throat": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/safe-regex": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-jest": { + "version": "27.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^27.0.0", + "babel-jest": ">=27.0.0 <28", + "esbuild": "~0.14.0", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.3.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-styles": { + "version": "0.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.5.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/underscore": { + "version": "1.13.3", + "dev": true, + "license": "MIT" + }, + "node_modules/unfetch": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/use": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-sfc": "3.2.37", + "@vue/runtime-dom": "3.2.37", + "@vue/server-renderer": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "node_modules/vue-eslint-parser": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/watchpack/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchpack/node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.25.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "querystring": "^0.2.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wmf-a11y": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/wmf-a11y/-/wmf-a11y-0.0.0.tgz", + "integrity": "sha512-To9ydZlihJEuA0H5yHSYYSFe4BHklXSYeoVt/hqj04RYvlMMlrrYYr9lW+zx6uRECU6inalqkZyNYV89ZbJ/1g==", + "dev": true, + "dependencies": { + "commander": "^9.1.0", + "mustache": "^3.0.1", + "node-fetch": "^2.6.7", + "pa11y": "^6.1.1" + }, + "bin": { + "wmf-a11y": "index.js" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.10", + "dev": true + }, + "@babel/core": { + "version": "7.8.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helpers": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.18.0", + "dev": true, + "requires": { + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.17.10", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.17.9", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "dev": true, + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.0", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "dev": true, + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.8", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helpers": { + "version": "7.18.0", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + } + }, + "@babel/highlight": { + "version": "7.17.9", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.0", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.17.9", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.17.10", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.17.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.17.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.17.9", + "dev": true, + "requires": { + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/preset-env": { + "version": "7.17.10", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.17.9", + "@babel/plugin-transform-modules-systemjs": "^7.17.8", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.17.9", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.17.10", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.17.9", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.9", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.16.7", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.18.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.0", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true + }, + "@emotion/cache": { + "version": "10.0.29", + "dev": true, + "requires": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + }, + "@emotion/core": { + "version": "10.3.1", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + } + }, + "@emotion/css": { + "version": "10.0.27", + "dev": true, + "requires": { + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "dev": true + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "dev": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "dev": true + }, + "@emotion/serialize": { + "version": "0.11.16", + "dev": true, + "requires": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "@emotion/sheet": { + "version": "0.9.4", + "dev": true + }, + "@emotion/styled": { + "version": "10.3.0", + "dev": true, + "requires": { + "@emotion/styled-base": "^10.3.0", + "babel-plugin-emotion": "^10.0.27" + } + }, + "@emotion/styled-base": { + "version": "10.3.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + } + }, + "@emotion/stylis": { + "version": "0.8.5", + "dev": true + }, + "@emotion/unitless": { + "version": "0.7.5", + "dev": true + }, + "@emotion/utils": { + "version": "0.11.3", + "dev": true + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "dev": true + }, + "@es-joy/jsdoccomment": { + "version": "0.20.1", + "dev": true, + "requires": { + "comment-parser": "1.3.0", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~2.2.3" + } + }, + "@eslint/eslintrc": { + "version": "1.2.3", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.15.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true + }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "dev": true, + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "dev": true + }, + "@jest/console": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "dev": true + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/globals": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/reporters": { + "version": "27.5.1", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "27.5.1", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "version": "27.5.1", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@mdn/browser-compat-data": { + "version": "4.1.20", + "dev": true + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true + } + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@reach/router": { + "version": "1.3.4", + "dev": true, + "requires": { + "create-react-context": "0.3.0", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4" + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.1", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "dev": true + }, + "@storybook/addons": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/api": "5.2.8", + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "core-js": "^3.0.1", + "global": "^4.3.2", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/api": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/router": "5.2.8", + "@storybook/theming": "5.2.8", + "core-js": "^3.0.1", + "fast-deep-equal": "^2.0.1", + "global": "^4.3.2", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3", + "prop-types": "^15.6.2", + "react": "^16.8.3", + "semver": "^6.0.0", + "shallow-equal": "^1.1.0", + "store2": "^2.7.1", + "telejson": "^3.0.2", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "@storybook/channel-postmessage": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "core-js": "^3.0.1", + "global": "^4.3.2", + "telejson": "^3.0.2" + } + }, + "@storybook/channels": { + "version": "5.2.8", + "dev": true, + "requires": { + "core-js": "^3.0.1" + } + }, + "@storybook/client-api": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/addons": "5.2.8", + "@storybook/channel-postmessage": "5.2.8", + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/router": "5.2.8", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "eventemitter3": "^4.0.0", + "global": "^4.3.2", + "is-plain-object": "^3.0.0", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3", + "qs": "^6.6.0", + "stable": "^0.1.8", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "5.2.8", + "dev": true, + "requires": { + "core-js": "^3.0.1" + } + }, + "@storybook/components": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/client-logger": "5.2.8", + "@storybook/theming": "5.2.8", + "@types/react-syntax-highlighter": "10.1.0", + "@types/react-textarea-autosize": "^4.3.3", + "core-js": "^3.0.1", + "global": "^4.3.2", + "markdown-to-jsx": "^6.9.1", + "memoizerific": "^1.11.3", + "polished": "^3.3.1", + "popper.js": "^1.14.7", + "prop-types": "^15.7.2", + "react": "^16.8.3", + "react-dom": "^16.8.3", + "react-focus-lock": "^1.18.3", + "react-helmet-async": "^1.0.2", + "react-popper-tooltip": "^2.8.3", + "react-syntax-highlighter": "^8.0.1", + "react-textarea-autosize": "^7.1.0", + "simplebar-react": "^1.0.0-alpha.6" + } + }, + "@storybook/core": { + "version": "5.2.8", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.7.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-transform-react-constant-elements": "^7.6.3", + "@babel/preset-env": "^7.7.1", + "@storybook/addons": "5.2.8", + "@storybook/channel-postmessage": "5.2.8", + "@storybook/client-api": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/node-logger": "5.2.8", + "@storybook/router": "5.2.8", + "@storybook/theming": "5.2.8", + "@storybook/ui": "5.2.8", + "airbnb-js-shims": "^1 || ^2", + "ansi-to-html": "^0.6.11", + "autoprefixer": "^9.4.9", + "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-emotion": "^10.0.14", + "babel-plugin-macros": "^2.4.5", + "babel-preset-minify": "^0.5.0 || 0.6.0-alpha.5", + "boxen": "^3.0.0", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "chalk": "^2.4.2", + "cli-table3": "0.5.1", + "commander": "^2.19.0", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "corejs-upgrade-webpack-plugin": "^2.2.0", + "css-loader": "^3.0.0", + "detect-port": "^1.3.0", + "dotenv-webpack": "^1.7.0", + "ejs": "^2.6.1", + "express": "^4.17.0", + "file-loader": "^3.0.1", + "file-system-cache": "^1.0.5", + "find-cache-dir": "^3.0.0", + "fs-extra": "^8.0.1", + "global": "^4.3.2", + "html-webpack-plugin": "^4.0.0-beta.2", + "inquirer": "^6.2.0", + "interpret": "^1.2.0", + "ip": "^1.1.5", + "json5": "^2.1.0", + "lazy-universal-dotenv": "^3.0.1", + "node-fetch": "^2.6.0", + "open": "^6.1.0", + "pnp-webpack-plugin": "1.4.3", + "postcss-flexbugs-fixes": "^4.1.0", + "postcss-loader": "^3.0.0", + "pretty-hrtime": "^1.0.3", + "qs": "^6.6.0", + "raw-loader": "^2.0.0", + "react-dev-utils": "^9.0.0", + "regenerator-runtime": "^0.12.1", + "resolve": "^1.11.0", + "resolve-from": "^5.0.0", + "semver": "^6.0.0", + "serve-favicon": "^2.5.0", + "shelljs": "^0.8.3", + "style-loader": "^0.23.1", + "terser-webpack-plugin": "^1.2.4", + "unfetch": "^4.1.0", + "url-loader": "^2.0.1", + "util-deprecate": "^1.0.2", + "webpack": "^4.33.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-hot-middleware": "^2.25.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "dev": true + }, + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "@storybook/core-events": { + "version": "5.2.8", + "dev": true, + "requires": { + "core-js": "^3.0.1" + } + }, + "@storybook/html": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/addons": "5.2.8", + "@storybook/core": "5.2.8", + "@types/webpack-env": "^1.13.9", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "global": "^4.3.2", + "html-loader": "^0.5.5", + "regenerator-runtime": "^0.12.1" + } + }, + "@storybook/node-logger": { + "version": "5.2.8", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "core-js": "^3.0.1", + "npmlog": "^4.1.2", + "pretty-hrtime": "^1.0.3", + "regenerator-runtime": "^0.12.1" + } + }, + "@storybook/router": { + "version": "5.2.8", + "dev": true, + "requires": { + "@reach/router": "^1.2.1", + "@types/reach__router": "^1.2.3", + "core-js": "^3.0.1", + "global": "^4.3.2", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3", + "qs": "^6.6.0" + } + }, + "@storybook/theming": { + "version": "5.2.8", + "dev": true, + "requires": { + "@emotion/core": "^10.0.14", + "@emotion/styled": "^10.0.14", + "@storybook/client-logger": "5.2.8", + "common-tags": "^1.8.0", + "core-js": "^3.0.1", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.14", + "global": "^4.3.2", + "memoizerific": "^1.11.3", + "polished": "^3.3.1", + "prop-types": "^15.7.2", + "resolve-from": "^5.0.0" + } + }, + "@storybook/ui": { + "version": "5.2.8", + "dev": true, + "requires": { + "@storybook/addons": "5.2.8", + "@storybook/api": "5.2.8", + "@storybook/channels": "5.2.8", + "@storybook/client-logger": "5.2.8", + "@storybook/components": "5.2.8", + "@storybook/core-events": "5.2.8", + "@storybook/router": "5.2.8", + "@storybook/theming": "5.2.8", + "copy-to-clipboard": "^3.0.8", + "core-js": "^3.0.1", + "core-js-pure": "^3.0.1", + "emotion-theming": "^10.0.14", + "fast-deep-equal": "^2.0.1", + "fuse.js": "^3.4.4", + "global": "^4.3.2", + "lodash": "^4.17.15", + "markdown-to-jsx": "^6.9.3", + "memoizerific": "^1.11.3", + "polished": "^3.3.1", + "prop-types": "^15.7.2", + "qs": "^6.6.0", + "react": "^16.8.3", + "react-dom": "^16.8.3", + "react-draggable": "^4.0.3", + "react-helmet-async": "^1.0.2", + "react-hotkeys": "2.0.0-pre4", + "react-sizeme": "^2.6.7", + "regenerator-runtime": "^0.13.2", + "resolve-from": "^5.0.0", + "semver": "^6.0.0", + "store2": "^2.7.1", + "telejson": "^3.0.2", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.9", + "dev": true + }, + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.19", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.17.1", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.2", + "dev": true + }, + "@types/is-function": { + "version": "1.0.1", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "27.0.0", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/jquery": { + "version": "3.3.33", + "dev": true, + "requires": { + "@types/sizzle": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "dev": true + }, + "@types/linkify-it": { + "version": "3.0.2", + "dev": true + }, + "@types/markdown-it": { + "version": "12.2.3", + "dev": true, + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.2", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "dev": true + }, + "@types/mustache": { + "version": "4.0.1", + "dev": true + }, + "@types/node": { + "version": "17.0.33", + "dev": true + }, + "@types/node-fetch": { + "version": "2.5.7", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "dev": true + }, + "@types/prettier": { + "version": "2.6.1", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "dev": true + }, + "@types/reach__router": { + "version": "1.3.10", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react": { + "version": "18.0.9", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.11", + "dev": true + } + } + }, + "@types/react-syntax-highlighter": { + "version": "10.1.0", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-textarea-autosize": { + "version": "4.3.6", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "dev": true + }, + "@types/strip-bom": { + "version": "3.0.0", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "dev": true + }, + "@types/tapable": { + "version": "1.0.8", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.2", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.32", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "@types/webpack-env": { + "version": "1.16.4", + "dev": true + }, + "@types/webpack-sources": { + "version": "3.2.0", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "dev": true + } + } + }, + "@types/yargs": { + "version": "15.0.14", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "dev": true + }, + "@types/yauzl": { + "version": "2.10.0", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@vue/compiler-core": { + "version": "3.2.37", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "@vue/compiler-dom": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.37", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-ssr": "3.2.37", + "@vue/reactivity-transform": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "@vue/compiler-ssr": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/reactivity": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/shared": "3.2.37" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.37", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/reactivity": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/runtime-dom": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/runtime-core": "3.2.37", + "@vue/shared": "3.2.37", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "@vue/shared": { + "version": "3.2.37", + "dev": true + }, + "@vue/test-utils": { + "version": "2.0.1", + "dev": true, + "requires": {} + }, + "@vue/vue3-jest": { + "version": "27.0.0-alpha.4", + "dev": true, + "requires": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "extract-from-css": "^0.4.4", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@wikimedia/codex": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@wikimedia/codex/-/codex-0.4.2.tgz", + "integrity": "sha512-+J+3b3ItWJ75yHRMpZLuuwo6rX3FmgfsRp5KOZn69sOPom7LMhSk2dvuQTyJkFaCBy8y/DF+/8/ACuSuSzVChA==", + "dev": true, + "requires": {} + }, + "@wikimedia/codex-icons": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@wikimedia/codex-icons/-/codex-icons-0.4.2.tgz", + "integrity": "sha512-PdPh+yOQm7NtkbRxkNWCyyQsrYGky+T+LRZM/4mj7VOyeoAf1xM/r+9zMFJQY+flgmD/+dTTjeIFYn+KFKFLbQ==", + "dev": true + }, + "@wikimedia/codex-search": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@wikimedia/codex-search/-/codex-search-0.4.2.tgz", + "integrity": "sha512-+80dYkdc2VtQoqhVK65wkwiO0nlfWNpFI2GVnjpRfW2gJOWX0vflHGRAkO26dIySa8g6aOeS215tFLfF+0DpxA==", + "dev": true, + "requires": {} + }, + "@wikimedia/mw-node-qunit": { + "version": "6.4.1", + "dev": true, + "requires": { + "eslint-config-wikimedia": "0.21.0", + "glob": "7.2.0", + "jquery": "3.6.0", + "jsdom": "18.0.1", + "mustache": "4.2.0", + "oojs": "6.0.0", + "prettier": "2.4.1", + "qunit": "2.17.2", + "sinon": "12.0.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@mdn/browser-compat-data": { + "version": "3.3.14", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + } + } + }, + "eslint-config-wikimedia": { + "version": "0.21.0", + "dev": true, + "requires": { + "eslint": "^7.32.0", + "eslint-plugin-compat": "^3.13.0", + "eslint-plugin-es": "^4.1.0", + "eslint-plugin-jsdoc": "^37.0.3", + "eslint-plugin-json-es": "^1.5.4", + "eslint-plugin-mediawiki": "^0.3.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-jquery": "^2.7.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-qunit": "^7.0.0", + "eslint-plugin-unicorn": "^37.0.1", + "eslint-plugin-vue": "^8.0.2", + "eslint-plugin-wdio": "^7.4.2" + } + }, + "eslint-plugin-compat": { + "version": "3.13.0", + "dev": true, + "requires": { + "@mdn/browser-compat-data": "^3.3.14", + "ast-metadata-inferer": "^0.7.0", + "browserslist": "^4.16.8", + "caniuse-lite": "^1.0.30001251", + "core-js": "^3.16.2", + "find-up": "^5.0.0", + "lodash.memoize": "4.1.2", + "semver": "7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-unicorn": { + "version": "37.0.1", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "ci-info": "^3.2.0", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "4", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "safe-regex": "^2.1.1", + "semver": "^7.3.5", + "strip-indent": "^3.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "dev": true + }, + "espree": { + "version": "7.3.1", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.15.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mustache": { + "version": "4.2.0", + "dev": true + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "@wikimedia/types-wikimedia": { + "version": "0.3.3", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "dev": true + }, + "abab": { + "version": "2.0.6", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.1", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.3.2", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "dev": true + }, + "address": { + "version": "1.2.0", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "dev": true, + "requires": { + "debug": "4" + } + }, + "airbnb-js-shims": { + "version": "2.2.1", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.13", + "es6-shim": "^0.35.5", + "function.prototype.name": "^1.1.0", + "globalthis": "^1.0.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0 || ^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.1.0", + "promise.allsettled": "^1.0.0", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^4.0.0 || ^3.0.1", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + } + } + }, + "ajv-errors": { + "version": "1.0.1", + "dev": true, + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "dev": true, + "requires": {} + }, + "ansi-align": { + "version": "3.0.1", + "dev": true, + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "dev": true + }, + "ansi-html-community": { + "version": "0.0.8", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-to-html": { + "version": "0.6.15", + "dev": true, + "requires": { + "entities": "^2.0.0" + } + }, + "anymatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-dir": { + "version": "1.0.2", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "2.0.1", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "dev": true + }, + "array-differ": { + "version": "3.0.0", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "dev": true + }, + "array-includes": { + "version": "3.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "1.0.2", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.map": { + "version": "1.0.4", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arrify": { + "version": "1.0.1", + "dev": true + }, + "asap": { + "version": "2.0.6", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.6", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "dev": true + }, + "util": { + "version": "0.10.3", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "dev": true, + "optional": true + }, + "assign-symbols": { + "version": "1.0.0", + "dev": true + }, + "ast-metadata-inferer": { + "version": "0.7.0", + "dev": true, + "requires": { + "@mdn/browser-compat-data": "^3.3.14" + }, + "dependencies": { + "@mdn/browser-compat-data": { + "version": "3.3.14", + "dev": true + } + } + }, + "ast-types": { + "version": "0.9.6", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "dev": true + }, + "atob": { + "version": "2.1.2", + "dev": true + }, + "autoprefixer": { + "version": "9.8.8", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.11.0", + "dev": true, + "optional": true + }, + "axe-core": { + "version": "4.4.2", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1" + }, + "ansi-styles": { + "version": "2.2.1" + }, + "chalk": { + "version": "1.1.3", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2" + }, + "strip-ansi": { + "version": "3.0.1", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0" + } + } + }, + "babel-core": { + "version": "6.26.3", + "peer": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "peer": true, + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "peer": true + }, + "ms": { + "version": "2.0.0", + "peer": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "peer": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "peer": true + } + } + }, + "babel-helper-evaluate-path": { + "version": "0.5.0", + "dev": true + }, + "babel-helper-flip-expressions": { + "version": "0.4.3", + "dev": true + }, + "babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "dev": true + }, + "babel-helper-is-void-0": { + "version": "0.4.3", + "dev": true + }, + "babel-helper-mark-eval-scopes": { + "version": "0.4.3", + "dev": true + }, + "babel-helper-remove-or-void": { + "version": "0.4.3", + "dev": true + }, + "babel-helper-to-multiple-sequence-expressions": { + "version": "0.5.0", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "peer": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.0.6", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "babel-messages": { + "version": "6.23.0", + "peer": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-add-react-displayname": { + "version": "0.0.5", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-emotion": { + "version": "10.2.2", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "babel-plugin-minify-builtins": { + "version": "0.5.0", + "dev": true + }, + "babel-plugin-minify-constant-folding": { + "version": "0.5.0", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "babel-plugin-minify-dead-code-elimination": { + "version": "0.5.2", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-mark-eval-scopes": "^0.4.3", + "babel-helper-remove-or-void": "^0.4.3", + "lodash": "^4.17.11" + } + }, + "babel-plugin-minify-flip-comparisons": { + "version": "0.4.3", + "dev": true, + "requires": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "babel-plugin-minify-guarded-expressions": { + "version": "0.4.4", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3" + } + }, + "babel-plugin-minify-infinity": { + "version": "0.4.3", + "dev": true + }, + "babel-plugin-minify-mangle-names": { + "version": "0.5.1", + "dev": true, + "requires": { + "babel-helper-mark-eval-scopes": "^0.4.3" + } + }, + "babel-plugin-minify-numeric-literals": { + "version": "0.4.3", + "dev": true + }, + "babel-plugin-minify-replace": { + "version": "0.5.0", + "dev": true + }, + "babel-plugin-minify-simplify": { + "version": "0.5.1", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3", + "babel-helper-is-nodes-equiv": "^0.0.1", + "babel-helper-to-multiple-sequence-expressions": "^0.5.0" + } + }, + "babel-plugin-minify-type-constructors": { + "version": "0.4.3", + "dev": true, + "requires": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "dev": true + }, + "babel-plugin-transform-inline-consecutive-adds": { + "version": "0.4.3", + "dev": true + }, + "babel-plugin-transform-member-expression-literals": { + "version": "6.9.4", + "dev": true + }, + "babel-plugin-transform-merge-sibling-variables": { + "version": "6.9.5", + "dev": true + }, + "babel-plugin-transform-minify-booleans": { + "version": "6.9.4", + "dev": true + }, + "babel-plugin-transform-property-literals": { + "version": "6.9.4", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "babel-plugin-transform-regexp-constructors": { + "version": "0.4.3", + "dev": true + }, + "babel-plugin-transform-remove-console": { + "version": "6.9.4", + "dev": true + }, + "babel-plugin-transform-remove-debugger": { + "version": "6.9.4", + "dev": true + }, + "babel-plugin-transform-remove-undefined": { + "version": "0.5.0", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "babel-plugin-transform-simplify-comparison-operators": { + "version": "6.9.4", + "dev": true + }, + "babel-plugin-transform-undefined-to-void": { + "version": "6.9.4", + "dev": true + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-minify": { + "version": "0.5.2", + "dev": true, + "requires": { + "babel-plugin-minify-builtins": "^0.5.0", + "babel-plugin-minify-constant-folding": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.2", + "babel-plugin-minify-flip-comparisons": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.4", + "babel-plugin-minify-infinity": "^0.4.3", + "babel-plugin-minify-mangle-names": "^0.5.1", + "babel-plugin-minify-numeric-literals": "^0.4.3", + "babel-plugin-minify-replace": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.1", + "babel-plugin-minify-type-constructors": "^0.4.3", + "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", + "babel-plugin-transform-member-expression-literals": "^6.9.4", + "babel-plugin-transform-merge-sibling-variables": "^6.9.5", + "babel-plugin-transform-minify-booleans": "^6.9.4", + "babel-plugin-transform-property-literals": "^6.9.4", + "babel-plugin-transform-regexp-constructors": "^0.4.3", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-plugin-transform-remove-debugger": "^6.9.4", + "babel-plugin-transform-remove-undefined": "^0.5.0", + "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", + "babel-plugin-transform-undefined-to-void": "^6.9.4", + "lodash": "^4.17.11" + } + }, + "babel-register": { + "version": "6.26.0", + "peer": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "peer": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12" + }, + "regenerator-runtime": { + "version": "0.11.1" + } + } + }, + "babel-template": { + "version": "6.26.0", + "peer": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "peer": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "peer": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "peer": true + }, + "ms": { + "version": "2.0.0", + "peer": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "peer": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "peer": true + } + } + }, + "babylon": { + "version": "6.18.0", + "peer": true + }, + "balanced-match": { + "version": "1.0.2" + }, + "base": { + "version": "0.11.2", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "base64-js": { + "version": "1.5.1", + "dev": true + }, + "batch-processor": { + "version": "1.0.0", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "7.0.2", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "dev": true + }, + "body-parser": { + "version": "1.20.0", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "dev": true + }, + "boxen": { + "version": "3.2.0", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.20.3", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "dev": true + } + } + }, + "browserslist-config-wikimedia": { + "version": "0.4.0", + "dev": true + }, + "bs-logger": { + "version": "0.2.6", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "dev": true + }, + "builtin-modules": { + "version": "3.3.0", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.1.1", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "can-use-dom": { + "version": "0.1.0", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001341", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "dev": true, + "optional": true + }, + "catharsis": { + "version": "0.9.0", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "chalk": { + "version": "2.4.2", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "dev": true + }, + "character-entities": { + "version": "1.2.4", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "dev": true + }, + "check-types": { + "version": "11.1.2", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "braces": { + "version": "2.3.2", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-number": { + "version": "3.0.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "upath": { + "version": "1.2.0", + "dev": true + } + } + }, + "chownr": { + "version": "1.1.4", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "dev": true + }, + "ci-info": { + "version": "3.3.1", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cjs-module-lexer": { + "version": "1.2.2", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "clean-css": { + "version": "4.2.4", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "clean-regexp": { + "version": "1.0.0", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "cli-boxes": { + "version": "2.2.1", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-table3": { + "version": "0.5.1", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.1", + "dev": true + }, + "clipboard": { + "version": "2.0.11", + "dev": true, + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "clone": { + "version": "2.1.2", + "dev": true + }, + "clone-regexp": { + "version": "2.2.0", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "dev": true + }, + "co": { + "version": "4.6.0", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "dev": true + }, + "colord": { + "version": "2.9.2", + "dev": true + }, + "colors": { + "version": "1.4.0", + "dev": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.8", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "dev": true + }, + "commander": { + "version": "9.1.0", + "dev": true + }, + "comment-parser": { + "version": "1.3.0", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "dev": true + }, + "concat-map": { + "version": "0.0.1" + }, + "concat-stream": { + "version": "1.6.2", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.5.0", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "dev": true + }, + "copy-to-clipboard": { + "version": "3.3.1", + "dev": true, + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-js": { + "version": "3.22.5", + "dev": true + }, + "core-js-compat": { + "version": "3.22.5", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.22.5", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "dev": true + }, + "corejs-upgrade-webpack-plugin": { + "version": "2.2.0", + "dev": true, + "requires": { + "resolve-from": "^5.0.0", + "webpack": "^4.38.0" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-ecdh": { + "version": "4.0.4", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "create-react-context": { + "version": "0.3.0", + "dev": true, + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "cross-fetch": { + "version": "3.1.5", + "dev": true, + "requires": { + "node-fetch": "2.6.7" + } + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "css-functions-list": { + "version": "3.0.1", + "dev": true + }, + "css-loader": { + "version": "3.6.0", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "semver": { + "version": "6.3.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "css-rule-stream": { + "version": "1.1.0", + "dev": true, + "requires": { + "css-tokenize": "^1.0.1", + "duplexer2": "0.0.2", + "ldjson-stream": "^1.2.1", + "through2": "^0.6.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "dev": true + }, + "through2": { + "version": "0.6.5", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "css-select": { + "version": "4.3.0", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tokenize": { + "version": "1.0.1", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^1.0.33" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "dev": true + } + } + }, + "css-tree": { + "version": "1.1.3", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "css-what": { + "version": "6.1.0", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "dev": true + }, + "csso": { + "version": "4.2.0", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "cssom": { + "version": "0.5.0", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "dev": true + } + } + }, + "csstype": { + "version": "2.6.20", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "3.0.2", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.3.1", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "dev": true + }, + "deep-object-diff": { + "version": "1.1.7", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "0.2.5", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "dev": true + }, + "depd": { + "version": "2.0.0", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.2.0", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "peer": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "3.1.0", + "dev": true + }, + "detect-port": { + "version": "1.3.0", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "detect-port-alt": { + "version": "1.1.6", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "devtools-protocol": { + "version": "0.0.869402", + "dev": true + }, + "diff": { + "version": "5.0.0", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.0.0", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "doiuse": { + "version": "4.4.1", + "dev": true, + "requires": { + "browserslist": "^4.16.1", + "caniuse-lite": "^1.0.30001179", + "css-rule-stream": "^1.1.0", + "duplexer2": "0.0.2", + "ldjson-stream": "^1.2.1", + "multimatch": "^5.0.0", + "postcss": "^8.2.4", + "source-map": "^0.7.3", + "through2": "^4.0.2", + "yargs": "^16.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "dev": true + } + } + }, + "dom-converter": { + "version": "0.2.0", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "dev": true + }, + "domelementtype": { + "version": "2.3.0", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domino": { + "version": "2.1.6", + "dev": true + }, + "domutils": { + "version": "2.8.0", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "lower-case": { + "version": "2.0.2", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.4.0", + "dev": true + } + } + }, + "dotenv": { + "version": "6.2.0", + "dev": true + }, + "dotenv-defaults": { + "version": "1.1.1", + "dev": true, + "requires": { + "dotenv": "^6.2.0" + } + }, + "dotenv-expand": { + "version": "5.1.0", + "dev": true + }, + "dotenv-webpack": { + "version": "1.8.0", + "dev": true, + "requires": { + "dotenv-defaults": "^1.0.2" + } + }, + "duplexer": { + "version": "0.1.2", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "dev": true + } + } + }, + "duplexify": { + "version": "3.7.1", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.137", + "dev": true + }, + "element-resize-detector": { + "version": "1.2.4", + "dev": true, + "requires": { + "batch-processor": "1.0.0" + } + }, + "elliptic": { + "version": "6.5.4", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "dev": true + } + } + }, + "emittery": { + "version": "0.8.1", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "dev": true + }, + "emotion-theming": { + "version": "10.3.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/weak-memoize": "0.2.5", + "hoist-non-react-statics": "^3.3.0" + } + }, + "encodeurl": { + "version": "1.0.2", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.2", + "dev": true + } + } + }, + "entities": { + "version": "2.2.0", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "dev": true + }, + "errno": { + "version": "0.1.8", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.1", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-shim": { + "version": "4.6.7", + "dev": true + }, + "es6-shim": { + "version": "0.35.6", + "dev": true + }, + "es6-templates": { + "version": "0.2.3", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "escalade": { + "version": "3.1.1", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5" + }, + "escodegen": { + "version": "2.0.0", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.15.0", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.2.3", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "globals": { + "version": "13.15.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + } + } + }, + "eslint-config-wikimedia": { + "version": "0.22.1", + "dev": true, + "requires": { + "eslint": "^8.6.0", + "eslint-plugin-compat": "^4.0.2", + "eslint-plugin-es": "^4.1.0", + "eslint-plugin-jsdoc": "^37.7.1", + "eslint-plugin-json-es": "^1.5.4", + "eslint-plugin-mediawiki": "^0.3.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-jquery": "^2.7.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-qunit": "^7.2.0", + "eslint-plugin-unicorn": "^40.1.0", + "eslint-plugin-vue": "^8.4.1", + "eslint-plugin-wdio": "^7.4.2", + "eslint-plugin-yml": "^0.13.0" + } + }, + "eslint-plugin-compat": { + "version": "4.0.2", + "dev": true, + "requires": { + "@mdn/browser-compat-data": "^4.1.5", + "ast-metadata-inferer": "^0.7.0", + "browserslist": "^4.16.8", + "caniuse-lite": "^1.0.30001304", + "core-js": "^3.16.2", + "find-up": "^5.0.0", + "lodash.memoize": "4.1.2", + "semver": "7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "4.1.0", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "eslint-plugin-jsdoc": { + "version": "37.9.7", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "~0.20.1", + "comment-parser": "1.3.0", + "debug": "^4.3.3", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "eslint-plugin-json-es": { + "version": "1.5.7", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1" + } + }, + "eslint-plugin-mediawiki": { + "version": "0.3.0", + "dev": true, + "requires": { + "eslint-plugin-vue": "^7.20.0", + "upath": "^2.0.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "dev": true + }, + "eslint-plugin-vue": { + "version": "7.20.0", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + }, + "espree": { + "version": "6.2.1", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "semver": { + "version": "6.3.0", + "dev": true + }, + "vue-eslint-parser": { + "version": "7.11.0", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + } + } + } + }, + "eslint-plugin-mocha": { + "version": "9.0.0", + "dev": true, + "requires": { + "eslint-utils": "^3.0.0", + "ramda": "^0.27.1" + } + }, + "eslint-plugin-no-jquery": { + "version": "2.7.0", + "dev": true, + "requires": {} + }, + "eslint-plugin-node": { + "version": "11.1.0", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "eslint-plugin-es": { + "version": "3.0.1", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + }, + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "eslint-plugin-qunit": { + "version": "7.2.0", + "dev": true, + "requires": { + "eslint-utils": "^3.0.0", + "requireindex": "^1.2.0" + } + }, + "eslint-plugin-unicorn": { + "version": "40.1.0", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "ci-info": "^3.3.0", + "clean-regexp": "^1.0.0", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "safe-regex": "^2.1.1", + "semver": "^7.3.5", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "eslint-plugin-vue": { + "version": "8.7.1", + "dev": true, + "requires": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^8.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "eslint-plugin-wdio": { + "version": "7.19.4", + "dev": true + }, + "eslint-plugin-yml": { + "version": "0.13.0", + "dev": true, + "requires": { + "debug": "^4.3.2", + "lodash": "^4.17.21", + "natural-compare": "^1.4.0", + "yaml-eslint-parser": "^0.5.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-template-visitor": { + "version": "2.3.2", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.17.10", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.10", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.10", + "@babel/types": "^7.17.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/eslint-parser": { + "version": "7.17.0", + "dev": true, + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "dev": true + }, + "espree": { + "version": "9.3.2", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "dev": true + }, + "esutils": { + "version": "2.0.3" + }, + "etag": { + "version": "1.8.1", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "dev": true + }, + "events": { + "version": "3.3.0", + "dev": true + }, + "eventsource": { + "version": "1.1.1", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.1.1", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "dev": true + } + } + }, + "execall": { + "version": "2.0.0", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, + "exit": { + "version": "0.1.2", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "expect": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "express": { + "version": "4.18.1", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "dev": true, + "optional": true + }, + "extend-shallow": { + "version": "2.0.1", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "3.1.0", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "extract-from-css": { + "version": "0.4.4", + "dev": true, + "requires": { + "css": "^2.1.0" + } + }, + "extract-zip": { + "version": "2.0.1", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "dev": true, + "optional": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-number": { + "version": "3.0.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fault": { + "version": "1.0.4", + "dev": true, + "requires": { + "format": "^0.2.0" + } + }, + "faye-websocket": { + "version": "0.11.4", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "dev": true + }, + "figures": { + "version": "2.0.0", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "3.0.1", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-system-cache": { + "version": "1.1.0", + "dev": true, + "requires": { + "fs-extra": "^10.1.0", + "ramda": "^0.28.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "ramda": { + "version": "0.28.0", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "dev": true + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "dev": true, + "optional": true + }, + "filesize": { + "version": "3.6.1", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "focus-lock": { + "version": "0.6.8", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "dev": true, + "optional": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-number": { + "version": "3.0.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "form-data": { + "version": "3.0.1", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "format": { + "version": "0.2.2", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "dev": true + }, + "from2": { + "version": "2.3.0", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "dev": true + }, + "fuse.js": { + "version": "3.6.1", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "dev": true + }, + "get-stdin": { + "version": "8.0.0", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.0", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "dev": true + }, + "global": { + "version": "4.4.0", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "dev": true + }, + "globalthis": { + "version": "1.0.3", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globalyzer": { + "version": "0.1.0", + "dev": true + }, + "globby": { + "version": "8.0.2", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "dev": true + }, + "pify": { + "version": "3.0.0", + "dev": true + } + } + }, + "globjoin": { + "version": "0.1.4", + "dev": true + }, + "globrex": { + "version": "0.1.2", + "dev": true + }, + "good-listener": { + "version": "1.2.2", + "dev": true, + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.10", + "dev": true + }, + "grunt-banana-checker": { + "version": "0.9.0", + "dev": true + }, + "gud": { + "version": "1.0.0", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "har-schema": { + "version": "2.0.0", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.1.5", + "dev": true, + "optional": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "dev": true + }, + "has": { + "version": "1.0.3", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1" + } + } + }, + "has-bigints": { + "version": "1.0.2", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "dev": true + }, + "hastscript": { + "version": "5.1.2", + "dev": true, + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "dev": true + }, + "highlight.js": { + "version": "9.12.0", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hogan.js": { + "version": "3.0.2", + "dev": true, + "requires": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "dev": true + } + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "dev": true, + "requires": { + "react-is": "^16.7.0" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "peer": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "dev": true + }, + "html_codesniffer": { + "version": "2.5.1", + "dev": true + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "dev": true + }, + "html-loader": { + "version": "0.5.5", + "dev": true, + "requires": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "html-minifier": { + "version": "3.5.21", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "dev": true + } + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "camel-case": { + "version": "4.1.2", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "commander": { + "version": "4.1.1", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.4.0", + "dev": true + } + } + }, + "html-tags": { + "version": "3.2.0", + "dev": true + }, + "html-webpack-plugin": { + "version": "4.5.2", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-errors": { + "version": "2.0.0", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.6", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-signature": { + "version": "1.2.0", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "ieee754": { + "version": "1.2.1", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "dev": true, + "optional": true + }, + "immer": { + "version": "1.10.0", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "dev": true + } + } + }, + "import-lazy": { + "version": "4.0.0", + "dev": true + }, + "import-local": { + "version": "3.1.0", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "dev": true + }, + "ini": { + "version": "1.3.8", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.3", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.8", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "dev": true + }, + "is": { + "version": "3.3.0", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-alphabetical": { + "version": "1.0.4", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "dev": true + }, + "is-builtin-module": { + "version": "3.1.0", + "dev": true, + "requires": { + "builtin-modules": "^3.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "dev": true + }, + "is-core-module": { + "version": "2.9.0", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.5", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "peer": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true + }, + "is-function": { + "version": "1.0.2", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "dev": true + }, + "is-map": { + "version": "2.0.2", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "dev": true + }, + "is-plain-object": { + "version": "3.0.1", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "2.1.0", + "dev": true + }, + "is-root": { + "version": "2.1.0", + "dev": true + }, + "is-set": { + "version": "2.0.2", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "isobject": { + "version": "4.0.0", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "dev": true, + "optional": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.18.0", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.4", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.2", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "jest": { + "version": "27.4.7", + "dev": true, + "requires": { + "@jest/core": "^27.4.7", + "import-local": "^3.0.2", + "jest-cli": "^27.4.7" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-circus": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "dev": true, + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "dev": true + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "dev": true + }, + "data-urls": { + "version": "2.0.0", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "domexception": { + "version": "2.0.1", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "dev": true + } + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "jsdom": { + "version": "16.7.0", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tr46": { + "version": "2.1.0", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "ws": { + "version": "7.5.7", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "dev": true + } + } + }, + "jest-environment-node": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-fetch-mock": { + "version": "3.0.3", + "dev": true, + "requires": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } + }, + "jest-get-type": { + "version": "26.3.0", + "dev": true + }, + "jest-haste-map": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "dev": true, + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + } + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-diff": { + "version": "27.5.1", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.5.1", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "27.5.1", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runner": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-diff": { + "version": "27.5.1", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "jest-util": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "27.5.1", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "dev": true + } + } + }, + "jest-worker": { + "version": "27.5.1", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jquery": { + "version": "3.6.0", + "dev": true + }, + "js-tokens": { + "version": "4.0.0" + }, + "js-yaml": { + "version": "4.1.0", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "js2xmlparser": { + "version": "4.0.2", + "dev": true, + "requires": { + "xmlcreate": "^2.0.4" + } + }, + "jsbn": { + "version": "0.1.1", + "dev": true, + "optional": true + }, + "jsdoc": { + "version": "3.6.10", + "dev": true, + "requires": { + "@babel/parser": "^7.9.4", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^4.0.1", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.13.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + } + } + }, + "jsdoc-type-pratt-parser": { + "version": "2.2.5", + "dev": true + }, + "jsdoc-wmf-theme": { + "version": "0.0.5", + "dev": true, + "requires": { + "domino": "^2.0.1", + "lunr": "2.3.0", + "taffydb": "^2.6.2" + } + }, + "jsdom": { + "version": "18.0.1", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "optional": true + }, + "json3": { + "version": "3.3.3", + "dev": true + }, + "json5": { + "version": "2.2.1", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.2", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "just-extend": { + "version": "4.2.1", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klaw": { + "version": "4.0.1", + "dev": true + }, + "kleur": { + "version": "4.1.4", + "dev": true + }, + "known-css-properties": { + "version": "0.24.0", + "dev": true + }, + "lazy-universal-dotenv": { + "version": "3.0.1", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.0", + "app-root-dir": "^1.0.2", + "core-js": "^3.0.4", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0" + }, + "dependencies": { + "dotenv": { + "version": "8.6.0", + "dev": true + } + } + }, + "ldjson-stream": { + "version": "1.2.1", + "dev": true, + "requires": { + "split2": "^0.2.1", + "through2": "^0.6.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "dev": true + }, + "through2": { + "version": "0.6.5", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "less": { + "version": "3.8.1", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "dev": true + } + } + }, + "leven": { + "version": "3.1.0", + "dev": true + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "dev": true + }, + "linkify-it": { + "version": "3.0.3", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "loader-runner": { + "version": "2.4.0", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21" + }, + "lodash.debounce": { + "version": "4.0.8", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "dev": true + }, + "lowlight": { + "version": "1.9.2", + "dev": true, + "requires": { + "fault": "^1.0.2", + "highlight.js": "~9.12.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lunr": { + "version": "2.3.0", + "dev": true + }, + "magic-string": { + "version": "0.25.9", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-cache": { + "version": "0.2.2", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "dev": true + }, + "map-or-similar": { + "version": "1.5.0", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "12.3.2", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.1.0", + "dev": true + } + } + }, + "markdown-it-anchor": { + "version": "8.6.4", + "dev": true, + "requires": {} + }, + "markdown-to-jsx": { + "version": "6.11.4", + "dev": true, + "requires": { + "prop-types": "^15.6.2", + "unquote": "^1.1.0" + } + }, + "marked": { + "version": "4.0.16", + "dev": true + }, + "mathml-tag-names": { + "version": "2.1.3", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.14", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "dev": true + }, + "memoizerific": { + "version": "1.11.3", + "dev": true, + "requires": { + "map-or-similar": "^1.5.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "9.0.0", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "hosted-git-info": { + "version": "4.1.0", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.18.1", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "dev": true + }, + "methods": { + "version": "1.1.2", + "dev": true + }, + "microevent.ts": { + "version": "0.1.1", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "miller-rabin": { + "version": "4.0.1", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "min-indent": { + "version": "1.0.1", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6" + }, + "minimist-options": { + "version": "4.1.0", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "mississippi": { + "version": "3.0.0", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.6", + "requires": { + "minimist": "^1.2.6" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "multimap": { + "version": "1.1.0", + "dev": true + }, + "multimatch": { + "version": "5.0.0", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "dev": true + } + } + }, + "mustache": { + "version": "3.0.1", + "dev": true + }, + "mustache-jest": { + "version": "1.1.1", + "dev": true, + "requires": { + "hogan.js": "3.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "dev": true + }, + "nan": { + "version": "2.15.0", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.3.4", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "dev": true + }, + "nise": { + "version": "5.1.1", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "no-case": { + "version": "2.3.2", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fetch": { + "version": "2.6.7", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-int64": { + "version": "0.4.0", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.4", + "dev": true + }, + "node-watch": { + "version": "0.7.2", + "dev": true + }, + "node.extend": { + "version": "2.0.2", + "dev": true, + "requires": { + "has": "^1.0.3", + "is": "^3.2.1" + } + }, + "nopt": { + "version": "1.0.10", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + } + }, + "object-inspect": { + "version": "1.12.0", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "object.values": { + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "on-finished": { + "version": "2.4.1", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "oojs": { + "version": "6.0.0", + "dev": true + }, + "open": { + "version": "6.4.0", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "dev": true + } + } + }, + "optionator": { + "version": "0.9.1", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "original": { + "version": "1.0.2", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "peer": true + }, + "os-shim": { + "version": "0.1.3", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2" + }, + "p-finally": { + "version": "1.0.0", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-timeout": { + "version": "4.1.0", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "dev": true + }, + "pa11y": { + "version": "6.1.1", + "dev": true, + "requires": { + "axe-core": "^4.0.2", + "bfj": "~7.0.2", + "commander": "~8.0.0", + "envinfo": "~7.8.1", + "hogan.js": "^3.0.2", + "html_codesniffer": "^2.5.1", + "kleur": "~4.1.4", + "node.extend": "~2.0.2", + "p-timeout": "~4.1.0", + "puppeteer": "~9.1.1", + "semver": "~7.3.5" + }, + "dependencies": { + "commander": { + "version": "8.0.0", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "1.2.2", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "lower-case": { + "version": "2.0.2", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.4.0", + "dev": true + } + } + }, + "pascalcase": { + "version": "0.1.1", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1" + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "dev": true, + "optional": true + }, + "picocolors": { + "version": "0.2.1", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "dev": true + }, + "pify": { + "version": "4.0.1", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-up": { + "version": "2.0.0", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "dev": true + } + } + }, + "pluralize": { + "version": "8.0.0", + "dev": true + }, + "pnp-webpack-plugin": { + "version": "1.4.3", + "dev": true, + "requires": { + "ts-pnp": "^1.1.2" + } + }, + "polished": { + "version": "3.7.2", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "popper.js": { + "version": "1.16.1", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "dev": true + }, + "postcss": { + "version": "8.4.13", + "dev": true, + "requires": { + "nanoid": "^3.3.3", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "dev": true + } + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.1", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "postcss-less": { + "version": "6.0.0", + "dev": true, + "requires": {} + }, + "postcss-load-config": { + "version": "2.1.2", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "dev": true + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "dev": true + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "dev": true + }, + "postcss-selector-parser": { + "version": "6.0.10", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "dev": true + }, + "pre-commit": { + "version": "1.2.2", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "shebang-command": { + "version": "1.2.0", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "dev": true + }, + "which": { + "version": "1.2.14", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "dev": true + }, + "pretty-error": { + "version": "2.1.2", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-format": { + "version": "26.6.2", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "dev": true + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "dev": true + }, + "prismjs": { + "version": "1.28.0", + "dev": true + }, + "private": { + "version": "0.1.8" + }, + "process": { + "version": "0.11.10", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "dev": true + }, + "progress": { + "version": "2.0.3", + "dev": true + }, + "promise": { + "version": "7.3.1", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "dev": true + }, + "promise-polyfill": { + "version": "8.2.3", + "dev": true + }, + "promise.allsettled": { + "version": "1.0.5", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "iterate-value": "^1.0.2" + } + }, + "promise.prototype.finally": { + "version": "3.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "prompts": { + "version": "2.4.2", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "dependencies": { + "kleur": { + "version": "3.0.3", + "dev": true + } + } + }, + "prop-types": { + "version": "15.8.1", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "property-information": { + "version": "5.6.0", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "dev": true + }, + "prr": { + "version": "1.0.1", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "dev": true + }, + "psl": { + "version": "1.8.0", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "dev": true + }, + "puppeteer": { + "version": "9.1.1", + "dev": true, + "requires": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.869402", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.1.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "dependencies": { + "ws": { + "version": "7.5.7", + "dev": true, + "requires": {} + } + } + }, + "qs": { + "version": "6.10.3", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.0", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "dev": true + }, + "qunit": { + "version": "2.17.2", + "dev": true, + "requires": { + "commander": "7.2.0", + "node-watch": "0.7.2", + "tiny-glob": "0.2.9" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "dev": true + } + } + }, + "ramda": { + "version": "0.27.2", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "2.0.0", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "react": { + "version": "16.14.0", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-clientside-effect": { + "version": "1.2.6", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.13" + } + }, + "react-dev-utils": { + "version": "9.1.0", + "dev": true, + "requires": { + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.0", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.3", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "sockjs-client": "1.4.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "address": { + "version": "1.1.2", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "dev": true + }, + "browserslist": { + "version": "4.7.0", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "cross-spawn": { + "version": "6.0.5", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "emojis-list": { + "version": "2.1.0", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "inquirer": { + "version": "6.5.0", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "json5": { + "version": "1.0.1", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "node-releases": { + "version": "1.1.77", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "react-dom": { + "version": "16.14.0", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-draggable": { + "version": "4.4.5", + "dev": true, + "requires": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + } + }, + "react-error-overlay": { + "version": "6.0.11", + "dev": true + }, + "react-fast-compare": { + "version": "3.2.0", + "dev": true + }, + "react-focus-lock": { + "version": "1.19.1", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.6.3", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.0" + } + }, + "react-helmet-async": { + "version": "1.3.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + } + }, + "react-hotkeys": { + "version": "2.0.0-pre4", + "dev": true, + "requires": { + "prop-types": "^15.6.1" + } + }, + "react-is": { + "version": "16.13.1", + "dev": true + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "dev": true + }, + "react-popper": { + "version": "1.3.11", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + }, + "react-popper-tooltip": { + "version": "2.11.1", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "react-popper": "^1.3.7" + } + }, + "react-sizeme": { + "version": "2.6.12", + "dev": true, + "requires": { + "element-resize-detector": "^1.2.1", + "invariant": "^2.2.4", + "shallowequal": "^1.1.0", + "throttle-debounce": "^2.1.0" + } + }, + "react-syntax-highlighter": { + "version": "8.1.0", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "highlight.js": "~9.12.0", + "lowlight": "~1.9.1", + "prismjs": "^1.8.4", + "refractor": "^2.4.1" + } + }, + "react-textarea-autosize": { + "version": "7.1.2", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "prop-types": "^15.6.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "type-fest": { + "version": "0.8.1", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-number": { + "version": "3.0.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "recast": { + "version": "0.11.23", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "dev": true, + "requires": { + "minimatch": "3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "redent": { + "version": "3.0.0", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "refractor": { + "version": "2.10.1", + "dev": true, + "requires": { + "hastscript": "^5.0.0", + "parse-entities": "^1.1.2", + "prismjs": "~1.17.0" + }, + "dependencies": { + "prismjs": { + "version": "1.17.1", + "dev": true, + "requires": { + "clipboard": "^2.0.0" + } + } + } + }, + "regenerate": { + "version": "1.4.2", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, + "regexp-tree": { + "version": "0.1.24", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "dev": true + }, + "regexpu-core": { + "version": "5.0.1", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regextras": { + "version": "0.8.0", + "dev": true + }, + "regjsgen": { + "version": "0.6.0", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "dev": true + }, + "renderkid": { + "version": "2.0.7", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "peer": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.3", + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.5.0", + "dev": true, + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "dev": true, + "optional": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "dev": true + }, + "requireindex": { + "version": "1.2.0", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "dev": true + }, + "requizzle": { + "version": "0.2.3", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + } + } + }, + "ret": { + "version": "0.1.15", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2" + }, + "safe-regex": { + "version": "2.1.1", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.19.1", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "select": { + "version": "1.1.2", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "dev": true + }, + "send": { + "version": "0.18.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-favicon": { + "version": "2.5.0", + "dev": true, + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "setimmediate": { + "version": "1.0.5", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-equal": { + "version": "1.2.1", + "dev": true + }, + "shallowequal": { + "version": "1.1.0", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "dev": true + }, + "shelljs": { + "version": "0.8.5", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "dev": true + }, + "simplebar": { + "version": "4.2.3", + "dev": true, + "requires": { + "can-use-dom": "^0.1.0", + "core-js": "^3.0.1", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.throttle": "^4.1.1", + "resize-observer-polyfill": "^1.5.1" + } + }, + "simplebar-react": { + "version": "1.2.3", + "dev": true, + "requires": { + "prop-types": "^15.6.1", + "simplebar": "^4.2.3" + } + }, + "sinon": { + "version": "12.0.1", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "sisteransi": { + "version": "1.0.5", + "dev": true + }, + "slash": { + "version": "1.0.0" + }, + "slice-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs-client": { + "version": "1.4.0", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "dev": true + }, + "source-map": { + "version": "0.5.7" + }, + "source-map-js": { + "version": "1.0.2", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "peer": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.1", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "dev": true + }, + "space-separated-tokens": { + "version": "1.1.5", + "dev": true + }, + "spawn-sync": { + "version": "1.0.15", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "spdx-correct": { + "version": "3.1.1", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "dev": true + }, + "specificity": { + "version": "0.4.1", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "split2": { + "version": "0.2.1", + "dev": true, + "requires": { + "through2": "~0.6.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "dev": true + }, + "through2": { + "version": "0.6.5", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.2", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + } + }, + "statuses": { + "version": "2.0.1", + "dev": true + }, + "store2": { + "version": "2.13.2", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-length": { + "version": "4.0.2", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.7", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.padend": { + "version": "3.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "string.prototype.padstart": { + "version": "3.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "dev": true + }, + "style-loader": { + "version": "0.23.1", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "style-search": { + "version": "0.1.0", + "dev": true + }, + "stylelint": { + "version": "14.8.1", + "dev": true, + "requires": { + "balanced-match": "^2.0.0", + "colord": "^2.9.2", + "cosmiconfig": "^7.0.1", + "css-functions-list": "^3.0.1", + "debug": "^4.3.4", + "execall": "^2.0.0", + "fast-glob": "^3.2.11", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.0", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.24.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "normalize-selector": "^0.2.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.12", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.2.0", + "svg-tags": "^1.0.0", + "table": "^6.8.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "dev": true + }, + "balanced-match": { + "version": "2.0.0", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "glob-parent": { + "version": "5.1.2", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "dev": true + }, + "postcss-safe-parser": { + "version": "6.0.0", + "dev": true, + "requires": {} + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "write-file-atomic": { + "version": "4.0.1", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } + } + }, + "stylelint-config-recommended": { + "version": "7.0.0", + "dev": true, + "requires": {} + }, + "stylelint-config-wikimedia": { + "version": "0.13.0", + "dev": true, + "requires": { + "browserslist-config-wikimedia": "0.4.0", + "postcss-less": "6.0.0", + "stylelint": "14.8.1", + "stylelint-config-recommended": "7.0.0", + "stylelint-no-unsupported-browser-features": "5.0.3" + } + }, + "stylelint-no-unsupported-browser-features": { + "version": "5.0.3", + "dev": true, + "requires": { + "doiuse": "^4.4.1", + "lodash": "^4.17.15", + "postcss": "^8.3.6" + } + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true + }, + "svg-tags": { + "version": "1.0.0", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "dev": true + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "dev": true + }, + "symbol.prototype.description": { + "version": "1.0.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-symbol-description": "^1.0.0", + "has-symbols": "^1.0.2", + "object.getownpropertydescriptors": "^2.1.2" + } + }, + "table": { + "version": "6.8.0", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "taffydb": { + "version": "2.6.2", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "dev": true + }, + "tar-fs": { + "version": "2.1.1", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "telejson": { + "version": "3.3.0", + "dev": true, + "requires": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.1", + "is-regex": "^1.0.4", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.15", + "memoizerific": "^1.11.3" + } + }, + "term-size": { + "version": "1.2.0", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "dev": true + }, + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "terminal-link": { + "version": "2.1.1", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "type-fest": { + "version": "0.21.3", + "dev": true + } + } + }, + "terser": { + "version": "4.8.0", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "test-exclude": { + "version": "6.0.0", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "throat": { + "version": "6.0.1", + "dev": true + }, + "throttle-debounce": { + "version": "2.3.0", + "dev": true + }, + "through": { + "version": "2.3.8", + "dev": true + }, + "through2": { + "version": "4.0.2", + "dev": true, + "requires": { + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "timers-browserify": { + "version": "2.0.12", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "dev": true, + "optional": true + }, + "tiny-glob": { + "version": "0.2.9", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "tmp": { + "version": "0.0.33", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "dev": true + }, + "tough-cookie": { + "version": "4.0.0", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "3.0.0", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "3.0.1", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "peer": true + }, + "tryer": { + "version": "1.0.1", + "dev": true + }, + "ts-jest": { + "version": "27.1.3", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "ts-pnp": { + "version": "1.2.0", + "dev": true + }, + "tsconfig": { + "version": "7.0.0", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-styles": { + "version": "0.0.7", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.5.5", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "underscore": { + "version": "1.13.3", + "dev": true + }, + "unfetch": { + "version": "4.2.0", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "dev": true + } + } + }, + "upath": { + "version": "2.0.1", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "dev": true + }, + "url": { + "version": "0.11.0", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "mime": { + "version": "2.6.0", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.10", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "dev": true + }, + "util": { + "version": "0.11.1", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.1.1", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "dev": true + }, + "verror": { + "version": "1.10.0", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "dev": true, + "optional": true + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "dev": true + }, + "vue": { + "version": "3.2.37", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-sfc": "3.2.37", + "@vue/runtime-dom": "3.2.37", + "@vue/server-renderer": "3.2.37", + "@vue/shared": "3.2.37" + } + }, + "vue-eslint-parser": { + "version": "8.3.0", + "dev": true, + "requires": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "walker": { + "version": "1.0.8", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "warning": { + "version": "4.0.3", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.7.5", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + }, + "dependencies": { + "binary-extensions": { + "version": "2.2.0", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "3.5.3", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "dev": true + }, + "webpack": { + "version": "4.46.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "dev": true + }, + "braces": { + "version": "2.3.2", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "define-property": { + "version": "2.0.2", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "eslint-scope": { + "version": "4.0.3", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-number": { + "version": "3.0.0", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + } + } + }, + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.6.0", + "dev": true + } + } + }, + "webpack-hot-middleware": { + "version": "2.25.1", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "querystring": "^0.2.0", + "strip-ansi": "^6.0.0" + } + }, + "webpack-log": { + "version": "2.0.0", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "dev": true + }, + "whatwg-url": { + "version": "10.0.0", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wide-align": { + "version": "1.1.5", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "widest-line": { + "version": "2.0.1", + "dev": true, + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wmf-a11y": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/wmf-a11y/-/wmf-a11y-0.0.0.tgz", + "integrity": "sha512-To9ydZlihJEuA0H5yHSYYSFe4BHklXSYeoVt/hqj04RYvlMMlrrYYr9lW+zx6uRECU6inalqkZyNYV89ZbJ/1g==", + "dev": true, + "requires": { + "commander": "^9.1.0", + "mustache": "^3.0.1", + "node-fetch": "^2.6.7", + "pa11y": "^6.1.1" + } + }, + "word-wrap": { + "version": "1.2.3", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "dev": true, + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "8.6.0", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "dev": true + }, + "xmlcreate": { + "version": "2.0.4", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "dev": true + }, + "yaml-eslint-parser": { + "version": "0.5.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^1.10.2" + } + }, + "yargs": { + "version": "16.2.0", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "y18n": { + "version": "5.0.8", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "dev": true + } + } +} diff --git a/Vector/package.json b/Vector/package.json new file mode 100644 index 0000000..78fbe9b --- /dev/null +++ b/Vector/package.json @@ -0,0 +1,61 @@ +{ + "name": "Vector", + "private": true, + "scripts": { + "start": "bash dev-scripts/setup-storybook.sh && start-storybook --quiet -p 6006 -s resources/skins.vector.styles", + "test": "npm -s run lint && tsc && npm run test:unit && npm -s run doc", + "test:unit": "jest --silent", + "test:unit:updateSnapshot": "jest --updateSnapshot", + "test:a11y": "wmf-a11y --config 'tests/a11y/a11y.config.js'", + "selenium-daily": "wmf-a11y --config 'tests/a11y/a11y.config.js' --logResults", + "lint": "npm -s run lint:js && npm -s run lint:styles && npm -s run lint:i18n", + "lint:fix:js": "npm -s run lint:js -- --fix", + "lint:fix:styles": "npm -s run lint:styles -- --fix", + "lint:js": "eslint --cache .", + "lint:styles": "stylelint \"**/*.{less,css}\"", + "lint:i18n": "banana-checker --requireLowerCase=0 i18n/", + "doc": "jsdoc -c jsdoc.json", + "build-storybook": "bash dev-scripts/setup-storybook.sh && build-storybook --quiet --loglevel warn -o docs/ui", + "minify-svg": "svgo --config=.svgo.config.js --quiet --recursive --folder resources/", + "pre-commit": "[ \"${PRE_COMMIT:-1}\" -eq 0 ] || npm -s t" + }, + "pre-commit": "pre-commit", + "peerDependencies": { + "babel-core": "6.26.3" + }, + "devDependencies": { + "@babel/core": "7.8.0", + "@storybook/html": "5.2.8", + "@types/jest": "27.0.0", + "@types/jquery": "3.3.33", + "@types/mustache": "4.0.1", + "@types/node-fetch": "2.5.7", + "@vue/test-utils": "2.0.1", + "@vue/vue3-jest": "27.0.0-alpha.4", + "@wikimedia/codex": "0.4.2", + "@wikimedia/codex-icons": "0.4.2", + "@wikimedia/codex-search": "0.4.2", + "@wikimedia/mw-node-qunit": "6.4.1", + "@wikimedia/types-wikimedia": "0.3.3", + "babel-loader": "8.0.6", + "eslint-config-wikimedia": "0.22.1", + "grunt-banana-checker": "0.9.0", + "jest": "27.4.7", + "jest-fetch-mock": "3.0.3", + "jsdoc": "3.6.10", + "jsdoc-wmf-theme": "0.0.5", + "less": "3.8.1", + "less-loader": "4.1.0", + "mustache": "3.0.1", + "mustache-jest": "1.1.1", + "node-fetch": "2.6.7", + "postcss-less": "6.0.0", + "pre-commit": "1.2.2", + "stylelint-config-wikimedia": "0.13.0", + "svgo": "2.8.0", + "ts-jest": "27.1.3", + "typescript": "4.5.5", + "vue": "3.2.37", + "wmf-a11y": "0.0.0" + } +} diff --git a/Vector/resources/CheckboxHack.d.ts b/Vector/resources/CheckboxHack.d.ts new file mode 100644 index 0000000..13c17bf --- /dev/null +++ b/Vector/resources/CheckboxHack.d.ts @@ -0,0 +1,17 @@ +interface CheckboxHack { + updateAriaExpanded(checkbox: HTMLInputElement, button: HTMLElement): void; + bindUpdateAriaExpandedOnInput(checkbox: HTMLInputElement, button: HTMLElement): CheckboxHackListeners; + bindToggleOnClick(checkbox: HTMLInputElement, button: HTMLElement): CheckboxHackListeners; + bindToggleOnSpaceEnter(checkbox:HTMLInputElement, button:HTMLElement): CheckboxHackListeners; + bindDismissOnClickOutside(window: Window, checkbox: HTMLInputElement, button: HTMLElement, target: Node): CheckboxHackListeners; + bindDismissOnFocusLoss(window: Window, checkbox: HTMLInputElement, button: HTMLElement, target: Node): CheckboxHackListeners; + bind(window: Window, checkbox: HTMLInputElement, button: HTMLElement, target: Node): CheckboxHackListeners; + unbind(window: Window, checkbox: HTMLInputElement, button: HTMLElement, listeners: CheckboxHackListeners): void; +} + +interface CheckboxHackListeners { + onUpdateAriaExpandedOnInput?: EventListenerOrEventListenerObject; + onToggleOnClick?: EventListenerOrEventListenerObject; + onDismissOnClickOutside?: EventListenerOrEventListenerObject; + onDismissOnFocusLoss?: EventListenerOrEventListenerObject; +} diff --git a/Vector/resources/CollapsibleTabsPlugin.d.ts b/Vector/resources/CollapsibleTabsPlugin.d.ts new file mode 100644 index 0000000..dd9b196 --- /dev/null +++ b/Vector/resources/CollapsibleTabsPlugin.d.ts @@ -0,0 +1,34 @@ +interface JQueryStatic { + collapsibleTabs: CollapsibleTabsStatic; +} + +interface JQuery { + collapsibleTabs(options: Partial): void; +} + +/** A jQuery plugin that makes collapsible tabs for the Vector skin. */ +interface CollapsibleTabsOptions { + /** Optional tab selector. Defaults to `#p-views ul`. */ + expandedContainer: string; + /** Optional menu item selector. Defaults to `#p-cactions ul`. */ + collapsedContainer: string; + /** Optional selector for tabs that are collapsible. Defaults to `li.collapsible`. */ + collapsible: string; + shifting: boolean; + expandedWidth: number; + expandCondition(eleWidth: number): boolean; + collapseCondition(): boolean; +} + +interface CollapsibleTabsStatic { + defaults: CollapsibleTabsOptions; + instances: JQuery[]; + addData($collapsible: JQuery): void; + getSettings($collapsible: JQuery): CollapsibleTabsOptions; + handleResize(): void; + moveToCollapsed($moving: JQuery): void; + moveToExpanded($moving: JQuery): void; + calculateTabDistance(): number; +} + +interface CollapsibleTabs extends CollapsibleTabsStatic, CollapsibleTabsOptions {} diff --git a/Vector/resources/MediaWikiPageReady.d.ts b/Vector/resources/MediaWikiPageReady.d.ts new file mode 100644 index 0000000..95fb117 --- /dev/null +++ b/Vector/resources/MediaWikiPageReady.d.ts @@ -0,0 +1,7 @@ +interface MediaWikiPageReadyModule { + /** + * Loads search module when search input is focused. + * @param {string} moduleName to load on input focus. + */ + loadSearchModule(moduleName: string): void +} diff --git a/Vector/resources/VectorResourceLoaderVirtualConfig.d.ts b/Vector/resources/VectorResourceLoaderVirtualConfig.d.ts new file mode 100644 index 0000000..7c3570f --- /dev/null +++ b/Vector/resources/VectorResourceLoaderVirtualConfig.d.ts @@ -0,0 +1,4 @@ +/** See Vector\Hooks::getVectorResourceLoaderConfig */ +interface VectorResourceLoaderVirtualConfig { + wgVectorSearchApiUrl: string; +} diff --git a/Vector/resources/common/common.less b/Vector/resources/common/common.less new file mode 100644 index 0000000..ad49674 --- /dev/null +++ b/Vector/resources/common/common.less @@ -0,0 +1,25 @@ +/** + * Common styles and components shared by both, + * Vector legacy and Vector modern. + */ + +@import './variables.less'; +@import 'mediawiki.mixins.less'; + +@media screen { + // Common styles + @import './normalize.less'; + @import './typography.less'; + + // Components + @import './components/Indicators.less'; + @import './components/SiteNotice.less'; + @import './components/MenuDropdownCheckbox.less'; + @import './components/SearchBox.less'; + @import './components/SidebarLogo.less'; + @import './components/Footer.less'; +} + +@media print { + @import './print.less'; +} diff --git a/Vector/resources/common/components/Footer.less b/Vector/resources/common/components/Footer.less new file mode 100644 index 0000000..1002111 --- /dev/null +++ b/Vector/resources/common/components/Footer.less @@ -0,0 +1,44 @@ +@import '../variables.less'; + +/* Footer */ +.mw-footer { + direction: ltr; + + ul { + list-style: none; + margin: 0; + padding: 0; + } + + li { + color: @color-base; + margin: 0; + padding: 0.5em 0; + font-size: @font-size-footer; + } +} + +#footer-icons { + float: right; + + li { + float: left; + margin-left: 0.5em; + line-height: @line-height-footer-buttons; + text-align: right; + } +} + +#footer-info { + li { + line-height: @line-height-footer-info; + } +} + +#footer-places { + li { + float: left; + margin-right: 1em; + line-height: @line-height-footer-buttons; + } +} diff --git a/Vector/resources/common/components/Indicators.less b/Vector/resources/common/components/Indicators.less new file mode 100644 index 0000000..ed85f9d --- /dev/null +++ b/Vector/resources/common/components/Indicators.less @@ -0,0 +1,12 @@ +@import '../variables.less'; + +.mw-indicators { + font-size: @font-size-base; + line-height: @line-height-base; + position: relative; + float: right; +} + +.mw-indicator { + display: inline-block; +} diff --git a/Vector/resources/common/components/MenuDropdownCheckbox.less b/Vector/resources/common/components/MenuDropdownCheckbox.less new file mode 100644 index 0000000..d1e9e71 --- /dev/null +++ b/Vector/resources/common/components/MenuDropdownCheckbox.less @@ -0,0 +1,85 @@ +@import '../variables.less'; + +/** + * Common styles responsible for hiding/showing the Vector dropdown. + */ + +/** + * Vector Dropdown. Contains the dropdown label, checkbox, and + * dropdown content. + */ +.vector-menu-dropdown { + position: relative; + + // Dropdown menu container. Hidden by default until checkbox is checked. + > .vector-menu-content { + position: absolute; + top: 100%; + left: -@border-width-base; + opacity: 0; + height: 0; + visibility: hidden; + overflow: hidden; + margin: 0; + padding: 0; + z-index: @z-index-menu; + } + + // Dropdown
      element. + > .vector-menu-content-list { + list-style: none; + } + + // dropdown list items. + .mw-list-item { + padding: 0; + margin: 0; + + a { + cursor: pointer; + } + } + + .selected a, + .selected a:visited { + color: @color-link-selected; + text-decoration: none; + } +} + +/** + * Invisible checkbox covering the dropdown menu handle. + */ +.vector-menu-checkbox { + cursor: pointer; + position: absolute; + top: 0; + left: 0; + z-index: @z-index-menu-checkbox; + opacity: 0; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + // Hide the checkbox completely in browsers that don't support :checked + display: none; + + // Hide and show menu content based off checked status. + &:checked ~ .vector-menu-content { + opacity: 1; + visibility: visible; + height: auto; + } + + :not( :checked ) > & { + // When the browser supports :checked, display it + display: block; + } + + // Add focus state to menu dropdown buttons (i.e. #p-variants, #p-cactions) + &:focus + .vector-menu-heading { + // Simulate browser focus ring + outline: dotted 1px; // Firefox style + outline: auto -webkit-focus-ring-color; // Webkit style + } +} diff --git a/Vector/resources/common/components/SearchBox.less b/Vector/resources/common/components/SearchBox.less new file mode 100644 index 0000000..94d03f2 --- /dev/null +++ b/Vector/resources/common/components/SearchBox.less @@ -0,0 +1,113 @@ +@import 'mediawiki.mixins.less'; +@import '../../common/variables.less'; + +// Defined as `div`. +// Provide extra element for gadgets due to `form` already carrying an `id`. +.vector-search-box-inner { + position: relative; + height: 100%; +} + +// The search input. +// Note that these rules only apply to the non-Vue enabled search input field. +// When Vue.js has loaded this element will no longer be in the page and substituted with +// a Codex element. +.vector-search-box-input { + background-color: rgba( 255, 255, 255, 0.5 ); + color: @color-base--emphasized; + width: 100%; + // Reduce height slightly from standard to match legacy Vector tabs. + height: unit( 28 / @font-size-browser / @font-size-search-input, em ); // Equals `2.15384615em`. + box-sizing: border-box; + border: @border-base; + border-radius: @border-radius-base; + // `padding-right` equals to `#searchbutton` width below. + padding: 5px @width-search-button 5px 0.4em; + box-shadow: @box-shadow-base; + // Match Codex. + font-family: inherit; + font-size: @font-size-search-input; + direction: ltr; + transition-property: border-color, box-shadow; + transition-duration: @transition-duration-medium; + + // Undo the proprietary styles, we provide our own. + // Support: Safari/iOS `none` needed, Chrome would accept `textfield` as well. See T247299. + // stylelint-disable-next-line plugin/no-unsupported-browser-features + -webkit-appearance: none; + // Support: Firefox. + // stylelint-disable-next-line plugin/no-unsupported-browser-features + -moz-appearance: textfield; + + .vector-search-box-inner:hover & { + border-color: @colorGray7; + } + + &:focus, + .vector-search-box-inner:hover &:focus { + outline: 0; + border-color: @border-color-base--focus; + box-shadow: @box-shadow-base--focus; + } + + .mixin-placeholder( { + color: @color-placeholder; + opacity: @opacity-base; + } ); + + &::-webkit-search-decoration, + &::-webkit-search-cancel-button, + &::-webkit-search-results-button, + &::-webkit-search-results-decoration { + display: none; + } +} + +// The search buttons. Fallback and search button are displayed in the same position, +// and if both are present the fulltext search one obscures the 'Go' one. +.searchButton { + background-color: transparent; + position: absolute; + top: @border-width-base; + bottom: @border-width-base; + // `@border-width-base * 2` is in regards to harmonize position start and end. + right: @border-width-base; + min-width: @min-width-search-button; + width: @width-search-button; + border: 0; + padding: 0; + cursor: pointer; + // Equal `font-size` to search input for `padding` calculation. + font-size: @font-size-search-input; + /* Opera 12 on RTL flips the text in a funny way without this. */ + /* @noflip */ + direction: ltr; + /* Hide button text and replace it with the image. */ + text-indent: -99999px; + white-space: nowrap; + overflow: hidden; + z-index: @z-index-search-button; +} + +.searchButton[ name='go' ] { + background: no-repeat center/unit( 16 / @font-size-browser / @font-size-search-input, em ) url( images/search.svg ); + opacity: 0.67; +} + +.search-toggle { + // At lower resolutions the search input is hidden and a toggle is shown + display: block; + float: right; + + @media ( min-width: @min-width-desktop ) { + display: none; + } +} + +.vector-search-box-collapses > div { + display: none; + + @media ( min-width: @min-width-desktop ) { + display: block; + } +} diff --git a/Vector/resources/common/components/SidebarLogo.less b/Vector/resources/common/components/SidebarLogo.less new file mode 100644 index 0000000..98a04db --- /dev/null +++ b/Vector/resources/common/components/SidebarLogo.less @@ -0,0 +1,17 @@ +@import '../variables.less'; + +/* Logo */ +#p-logo { + width: 10em; + height: 160px; + margin-bottom: 1em; + + a { + background-position: center center; + background-repeat: no-repeat; + display: block; + width: 10em; + height: 160px; + text-decoration: none; + } +} diff --git a/Vector/resources/common/components/SiteNotice.less b/Vector/resources/common/components/SiteNotice.less new file mode 100644 index 0000000..428556a --- /dev/null +++ b/Vector/resources/common/components/SiteNotice.less @@ -0,0 +1,14 @@ +@import '../variables.less'; + +/** element that wraps a notice that comes from wiki page */ +#localNotice { + margin-bottom: 0.9em; +} + +/* Site Notice (includes notices from CentralNotice extension) */ +#siteNotice { + font-size: @font-size-site-notice; + margin: @grid-row-gap 0; + position: relative; + text-align: center; +} diff --git a/Vector/resources/common/images/arrow-down-invert.svg b/Vector/resources/common/images/arrow-down-invert.svg new file mode 100644 index 0000000..64f13d0 --- /dev/null +++ b/Vector/resources/common/images/arrow-down-invert.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Vector/resources/common/images/arrow-down-progressive.svg b/Vector/resources/common/images/arrow-down-progressive.svg new file mode 100644 index 0000000..f1813e1 --- /dev/null +++ b/Vector/resources/common/images/arrow-down-progressive.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Vector/resources/common/images/arrow-down.svg b/Vector/resources/common/images/arrow-down.svg new file mode 100644 index 0000000..7bf356a --- /dev/null +++ b/Vector/resources/common/images/arrow-down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Vector/resources/common/images/bullet-icon.svg b/Vector/resources/common/images/bullet-icon.svg new file mode 100644 index 0000000..d047217 --- /dev/null +++ b/Vector/resources/common/images/bullet-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Vector/resources/common/images/link-external-small-ltr-progressive.svg b/Vector/resources/common/images/link-external-small-ltr-progressive.svg new file mode 100644 index 0000000..e17d710 --- /dev/null +++ b/Vector/resources/common/images/link-external-small-ltr-progressive.svg @@ -0,0 +1,7 @@ + + + + external link + + + diff --git a/Vector/resources/common/images/link-external-small-rtl-progressive.svg b/Vector/resources/common/images/link-external-small-rtl-progressive.svg new file mode 100644 index 0000000..4509784 --- /dev/null +++ b/Vector/resources/common/images/link-external-small-rtl-progressive.svg @@ -0,0 +1,7 @@ + + + + external link + + + diff --git a/Vector/resources/common/images/search.svg b/Vector/resources/common/images/search.svg new file mode 100644 index 0000000..689e60b --- /dev/null +++ b/Vector/resources/common/images/search.svg @@ -0,0 +1,7 @@ + + + + search + + + diff --git a/Vector/resources/common/images/unwatch-icon-hl.svg b/Vector/resources/common/images/unwatch-icon-hl.svg new file mode 100644 index 0000000..afaa457 --- /dev/null +++ b/Vector/resources/common/images/unwatch-icon-hl.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Vector/resources/common/images/unwatch-icon.svg b/Vector/resources/common/images/unwatch-icon.svg new file mode 100644 index 0000000..0afaff4 --- /dev/null +++ b/Vector/resources/common/images/unwatch-icon.svg @@ -0,0 +1,15 @@ + + + + unwatch + + + + + + + + + + + diff --git a/Vector/resources/common/images/unwatch-temp-icon-hl.svg b/Vector/resources/common/images/unwatch-temp-icon-hl.svg new file mode 100644 index 0000000..c5c8cc7 --- /dev/null +++ b/Vector/resources/common/images/unwatch-temp-icon-hl.svg @@ -0,0 +1,18 @@ + + + + unwatch temporary highlighted + + + + + + + + + + + + + + diff --git a/Vector/resources/common/images/unwatch-temp-icon.svg b/Vector/resources/common/images/unwatch-temp-icon.svg new file mode 100644 index 0000000..1a472cd --- /dev/null +++ b/Vector/resources/common/images/unwatch-temp-icon.svg @@ -0,0 +1,18 @@ + + + + unwatch temporary + + + + + + + + + + + + + + diff --git a/Vector/resources/common/images/watch-icon-hl.svg b/Vector/resources/common/images/watch-icon-hl.svg new file mode 100644 index 0000000..c26b54e --- /dev/null +++ b/Vector/resources/common/images/watch-icon-hl.svg @@ -0,0 +1,7 @@ + + + + watch highlighted + + + diff --git a/Vector/resources/common/images/watch-icon-loading.svg b/Vector/resources/common/images/watch-icon-loading.svg new file mode 100644 index 0000000..cdda4ee --- /dev/null +++ b/Vector/resources/common/images/watch-icon-loading.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Vector/resources/common/images/watch-icon.svg b/Vector/resources/common/images/watch-icon.svg new file mode 100644 index 0000000..9cb8506 --- /dev/null +++ b/Vector/resources/common/images/watch-icon.svg @@ -0,0 +1,7 @@ + + + + watch + + + diff --git a/Vector/resources/common/mixins.less b/Vector/resources/common/mixins.less new file mode 100644 index 0000000..6356d3f --- /dev/null +++ b/Vector/resources/common/mixins.less @@ -0,0 +1,75 @@ +/** + * Less mixins shared between both legacy and Vector 2022. + */ + +@import '../common/variables.less'; + +.mixin-vector-menu-heading() { + align-self: center; + color: @color-base--subtle; + font-weight: normal; + cursor: default; + // NOTE: Setting these values does not produce a visible border. + // That's handled elsewhere with either border-top-style or border-bottom-style. + border-color: @border-color-portal-heading; + border-width: @border-width-base; +} + +// Defines the arrow beside dropdown headings. +.mixin-vector-legacy-menu-heading-arrow { + content: ''; + background: url( ../common/images/arrow-down.svg ) 100% 50% no-repeat; + width: unit( 16 / @font-size-tabs / @font-size-browser, em ); + height: unit( 16 / @font-size-tabs / @font-size-browser, em ); +} + +.mixin-vector-menu-heading-arrow() { + content: ''; + background: url( ../common/images/arrow-down.svg ) 100% 50% no-repeat; + width: unit( 16 / @font-size-tabs / @font-size-browser, em ); + height: unit( 16 / @font-size-tabs / @font-size-browser, em ); + // https://phabricator.wikimedia.org/T319070#8284272 + margin-left: -1px; +} + +// Remove this mixin after VectorPageTools is enabled everywhere +.mixin-vector-dropdown-menu-item-deprecated() { + min-height: @height-dropdown-menu-item; + padding: @padding-dropdown-menu-item; +} + +.mixin-vector-dropdown-menu-item() { + display: flex; + align-items: center; + padding: @padding-vertical-dropdown-menu-item @padding-horizontal-dropdown-menu-item; + font-size: @font-size-dropdown; + + &:not( .mw-selflink ):visited { + color: @color-link; + } + + &.selected a, + &.selected a:visited { + color: @color-link-selected; + } +} + +// Scroll indicator used by TOC and page tools. +.mixin-vector-scroll-indicator() { + // Add extra padding for the fade scrollable indicator. + padding-bottom: @height-scroll-indicator - @padding-vertical-dropdown-menu-item; + + &:after { + content: ''; + display: block; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: @height-scroll-indicator; + background: linear-gradient( rgba( 255, 255, 255, 0 ), @background-color-page-container ); + background-repeat: no-repeat; + background-position: -12px; // T311436 Hacky way to prevent the fade from covering the scrollbar + pointer-events: none; // Make the link below the fade clickable + } +} diff --git a/Vector/resources/common/normalize.less b/Vector/resources/common/normalize.less new file mode 100644 index 0000000..3ee80e1 --- /dev/null +++ b/Vector/resources/common/normalize.less @@ -0,0 +1,18 @@ +/* + * Normalize styles across rendering engines. + * Ideally, these rules should live in core and be shared across skins. + * + */ + +@import './variables.less'; + +html, +body { + height: 100%; +} + +// Support Blink based browsers. +// They use `outline` for focus styles, we're only amending the color here, see T245887. +:focus { + outline-color: @outline-color-base--focus; +} diff --git a/Vector/resources/common/print.less b/Vector/resources/common/print.less new file mode 100644 index 0000000..aa31d6a --- /dev/null +++ b/Vector/resources/common/print.less @@ -0,0 +1,228 @@ +@wmui-color-base0: #000; + +@color-base: @wmui-color-base0; + +@border-color-base: @wmui-color-base0; +@border-color-footer: #eee; + +/* These styles retain the existing typography in skin.less +In future (when deploying these styles) we may want to refactor skins.vector.styles +to apply certain styles in print as well as screen mode. */ +.toc, +body { + padding: 10px; + font-family: @font-family-serif; +} + +// Tables, thumbs and lists are sans-serif in print mode (unlike screen mode) because these will render +// more legibly on print media in a smaller font sizes +.printfooter, +.mw-footer, +.thumb, +figure, +table, +ol, +dl, +ul, +h3, +h4, +h5, +h6 { + font-family: @font-family-sans; +} + +// Images, such as formulas, render best in serif. Math fallback images, for example, have an +// inline style attribute setting their dimensions in ex (x-height) units, which is relative the +// font size: +// +img { + font-family: @font-family-serif; +} + +// Normalize Blue links in the article +.mw-body a:not( .image ) { + border-bottom: 1px solid #aaa; +} + +.firstHeading { + font-size: 25pt; + line-height: 28pt; + margin-bottom: 20px; + padding-bottom: 5px; +} + +// Headings +.firstHeading, +h2 { + // To avoid the bottom border of section headings with floated elements + overflow: hidden; + border-bottom: 2px solid @border-color-base; +} + +h3, +h4, +h5, +h6 { + margin: 30px 0 0; +} + +h2, +h3, +h4, +h5, +h6 { + padding: 0; + position: relative; +} + +h2 { + font-size: 18pt; + line-height: 24pt; + margin-bottom: 0.25em; +} + +h3 { + font-size: 14pt; + line-height: 20pt; +} + +h4, +h5, +h6 { + font-size: 12pt; + line-height: 16pt; +} + +p { + font-size: 12pt; + line-height: 16pt; + margin-top: 5px; + text-align: justify; + + // T175008 + // When a paragraph is surrounded by floating elements from both + // sides, we want to make sure that there is at least some space + // before showing the text. Otherwise, small lengths of text may show + // between the surrounding elements, making the reading experience less + // enjoyable. If there is not enough space the following code will push + // the paragraph contents until after the floating element(s). + &:before { + content: ''; + display: block; + width: 120pt; + overflow: hidden; + } +} + +blockquote { + border-left: 2px solid @border-color-base; + padding-left: 20px; +} + +ol, +ul { + margin: 10px 0 0 1.6em; + padding: 0; + + li { + padding: 2px 0; + font-size: 12pt; + + // T178667: Inline lists in new print styles should not + // have a smaller font size than surrounding content + table & { + font-size: inherit; + } + } +} + +.toc { + page-break-before: avoid; + page-break-after: avoid; + background: none; + border: 0; + display: table; + + a { + border: 0; + font-weight: normal; + } + + > ul { + > li { + margin-bottom: 4px; + font-weight: bold; + } + } + + ul { + margin: 0; + list-style: none; + + ul { + padding-left: 30px; + } + } + + li.toclevel-1 { + > a { + font-size: 12pt; + font-weight: bold; + } + } +} + +#mw-navigation, +/* Used by a variety of templates and historically part of the Vector skin. */ +.noprint, +.mw-jump-link, +.mw-portlet-lang, +.toc .tocnumber, +.mw-checkbox-hack-checkbox, +.mw-checkbox-hack-button { + display: none; +} + +.printfooter { + margin-top: 10px; + border-top: 3px solid @border-color-base; + padding-top: 10px; + font-size: 10pt; + clear: both; +} + +.mw-footer { + margin-top: 12px; + border-top: 1px solid @border-color-footer; + padding-top: 5px; +} + +#footer-info { + margin: 0; + padding: 0; + + li { + color: #999; + list-style: none; + display: block; + padding-bottom: 10px; + font-size: 10pt; + + a { + // override default black print style. + color: #999 !important; /* stylelint-disable-line declaration-no-important */ + } + } +} + +// Last updated as primary info. +#footer-info-lastmod { + color: @color-base; + font-size: 12pt; + font-weight: bold; +} diff --git a/Vector/resources/common/typography.less b/Vector/resources/common/typography.less new file mode 100644 index 0000000..e028a6d --- /dev/null +++ b/Vector/resources/common/typography.less @@ -0,0 +1,170 @@ +/* + * Vector's common typography rules, + * including whitespace with `margin` & `padding` and list bullets + * as part of typographic styles. Iconography wouldn't belong here. + * + */ + +@import './variables.less'; + +html { + font-size: @font-size-root; +} + +html, +body { + font-family: @font-family-sans; +} + +ul { + // `list-style-image` sits on `ul` as it inherits and we don't need to worry about `ol`. + // No need for PNG fallback. Fallback is browser default (a smaller, also black, circle). + list-style-image: url( images/bullet-icon.svg ); +} + +pre, +.mw-code { + line-height: @line-height-code; +} + +.mw-jump-link:not( :focus ) { + .mixin-screen-reader-text; +} + +/* Use unscoped selector to allow edit sections outside of .mw-body-content and .vector-body (T160269) */ +.mw-editsection, +.mw-editsection-like { + font-family: @font-family-sans; +} + +/* Main content area, including siteNotice, indicators, categories, firstHeading and `.vector-body`. */ +.mw-body { + // h1's can exist outside of `.mw-body-content` so some heading styles + // therefore need to be defined in `.mw-body` as well. + & h1, + &-content h1, + &-content h2 { + margin-bottom: 0.25em; + padding: 0; + font-family: @font-family-serif; + line-height: @line-height-heading; + + // Fallback heading font for scripts which render poorly in `@font-family-serif`. + // See T73240 + &:lang( ja ), /* See T65817 */ + &:lang( he ), /* See T65843 and T65844 */ + &:lang( ko ) { /* See T65827 */ + font-family: @font-family-sans--fallback; + } + + &:lang( ckb ) { /* See T306317 */ + font-family: 'Scheherazade', @font-family-serif; + } + + /* Burmese (Myanmar) language headlines would be cropped with set `line-height` */ + /* See T193270 */ + &:lang( my ) { + line-height: normal; + } + } + + & h1, + &-content h1 { + font-size: @font-size-heading-1; + } +} + +.vector-body { + font-size: @font-size-base; + // Support IE 9-11, Trident cuts values 2 digits after decimal point. + // `calc` enables to set correct calculation in place again. See T102364. + font-size: @font-size-base--trident-hack; + line-height: @line-height-base; + + #siteSub { + font-size: 12.8px; // T311421 + } + + h1 { + margin-top: 1em; + } + + h2 { + margin-top: 1em; + font-size: @font-size-heading-2; + } + + h3, + h4, + h5, + h6 { + margin-top: 0.3em; + margin-bottom: 0; + padding-bottom: 0; + line-height: @line-height-base; + } + + h3 { + font-size: @font-size-heading-3; + } + + h3, + h4 { + font-weight: bold; + } + + h4, + h5, + h6 { + font-size: @font-size-reset; // Reset. + } + + .toc h2 { + font-family: @font-family-sans; + font-size: @font-size-reset; // Reset. + } + + p { + margin: 0.5em 0; + } + + blockquote { + border-left: @border-start-blockquote; + padding: @padding-blockquote; + + // Ensure not to inherit whitespace mashing margins on child elements. + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } + } +} + +// External links +// Use of `a` element selector for limiting generic class scope due to `.external` widespread usage. +.mw-parser-output { + a { + // Deal with long links (T327334, inspired by Minerva solution T62387) + word-wrap: break-word; + } + + a.external { + // Use copy of Codex/OOUI WikimediaUI theme's 'linkExternal' icon in progressive color. + // Note that CSSJanus is flipping the `ltr` in the URL to `rtl`. + // Therefore make sure that both icons are available and up-to-date. + background-image: url( images/link-external-small-ltr-progressive.svg ); + background-position: center right; + background-repeat: no-repeat; + // Equivalent of `12px` at calculation base of `14px` is `0.857em`. + background-size: 0.857em; + padding-right: 1em; + + // See T330712 for better understanding of this class and any future changes. + &.free { + word-break: break-all; + } + } +} diff --git a/Vector/resources/common/variables.less b/Vector/resources/common/variables.less new file mode 100644 index 0000000..f37bc48 --- /dev/null +++ b/Vector/resources/common/variables.less @@ -0,0 +1,233 @@ +@import 'mediawiki.skin.variables.less'; +@import 'mediawiki.ui/variables.less'; + +// +// == Media query breakpoints == +// +@min-width-mobile: @width-breakpoint-mobile; // Above 320px +@max-width-mobile: @width-breakpoint-tablet - 1px; // Below 719px +@min-width-tablet: @width-breakpoint-tablet; // Above 720px +@max-width-tablet: @width-breakpoint-desktop - 1px; // Below 999px +@min-width-desktop: @width-breakpoint-desktop; // Above 1000px +@max-width-desktop: @width-breakpoint-desktop-wide - 1px; // Below 1199px +@min-width-desktop-wide: @width-breakpoint-desktop-wide; // Above 1200px + +// Sizing calculation primitives. +@font-size-root: 100%; +@font-size-browser: 16; // Assumed browser default of `16px` + +// +// == Page content == +// + +@color-base--subtle: #54595d; +@color-link-selected: @color-base; + +@outline-color-base--focus: @color-primary; + +// +// == Typography == +// +// Typography in Wikimedia Design Style Guide:; +// https://design.wikimedia.org/style-guide/visual-style_typography.html +// Historic overview and background information of fonts in Wikimedia software: +// https://www.mediawiki.org/wiki/Wikimedia_User_Interface/Use_cases/Font_family_stack +// Source of this font stack definition in WikimediaUI Base: +// https://phabricator.wikimedia.org/source/wikimedia-ui-base/browse/master/wikimedia-ui-base.less$202 +@font-family-serif: 'Linux Libertine', 'Georgia', 'Times', serif; + +// Body content uses the user setting in browser / operating system default sans-serif font: +// For example, Arial on Windows, Roboto on Android. +// FIXME: Use WikimediaUI Base's OS specific default sans-serif fonts. +// @font-family-sans is set in mediawiki.variables/variables.less + +// Fallback for headings, language: ja,he,ko. See T73240, T65817, T65843, T65844, T65827. +@font-family-sans--fallback: sans-serif; + +@font-size-base: unit( 14 / @font-size-browser, em ); // Equals `0.875em`. +@font-size-base--trident-hack: calc( 1em ~'*' unit( @font-size-base ) ); +@font-size-reset: @font-size-root; +@font-size-heading-1: 1.8em; +@font-size-heading-2: 1.5em; +@font-size-heading-3: 1.2em; +@font-size-notification: 0.8em; +@font-size-site-notice: 0.8em; +@font-size-footer: unit( 12 / @font-size-browser, em ); + +@line-height-base: 1.6; +@line-height-heading: 1.3; +@line-height-code: 1.3; +@line-height-footer-info: 1.4; +@line-height-footer-buttons: 2; + +@size-sidebar-button: unit( 44 / @font-size-browser, em ); // Equals `2.75em`. + +@size-icon: unit( 20 / @font-size-browser, em ); +@size-indicator: unit( 12 / @font-size-browser, em ); + +@background-position-nav-personal-icon: left unit( 4 / @font-size-browser / @font-size-nav-personal, em ); +@background-size-nav-personal-icon: unit( 14 / @font-size-browser / @font-size-nav-personal, em ); + +// FIXME: Use global variable since Echo and CentralNotice use this variable +@border-color-content: #a7d7f9; +// Due to darker background gradient, border needs to be darkened for aligned visual perception. +@border-color-content--tabs-inactive: darken( @border-color-content, 10% ); +@border-color-portal-heading: #c8ccd1; +@border-color-pagetitle: #eaecf0; +// Use `rgba()` notation for better Safari support, see T254489. +@border-color-portal-heading-transparent: rgba( red( @border-color-portal-heading ), green( @border-color-portal-heading ), blue( @border-color-portal-heading ), 0 ); +@border-start-blockquote: 4px @border-style-base #eaecf0; +@padding-top-content: 0.5em; +@padding-blockquote: 8px 32px; +// T311311 Match VE toolbar styles +@border-bottom-tabs: @border-width-base @border-style-base @colorGray12; + +@background-color-secondary--modern: #f8f9fa; +@background-color-page-container: @background-color-base; + +// Navigation +@background-color-secondary: #f6f6f6; +@color-nav-subtle: #444; +// Navigation `line-height` has to be set in `em`s due to a rendering calculation issue. +@line-height-nav: 1.125em; + +// Navigation: Main +@font-size-nav-main: inherit; + +@font-size-nav-main-heading: unit( 12 / @font-size-browser, em ); // Equals `0.75em`. + +@font-size-nav-main-body: unit( 12 / @font-size-browser, em ); +@margin-start-nav-main-body: 0.5em; + +// Navigation: Portal +// Font size of the Portal links. +@font-size-portal-list-item: @font-size-nav-main-body; + +// Margin space from the start of the Portal (left edge in LTR +// languages). +@margin-start-portal: 0.7em; + +// Margin space from the end of the Portal (right edge in LTR +// languages). +@margin-end-portal: 0.6em; + +// Margin space from the start of the Portal body (left edge in LTR languages). +@margin-start-portal-body: @margin-start-nav-main-body; + +// Navigation: Personal tools +@background-position-nav-personal-icon: left unit( 4 / @font-size-browser / @font-size-nav-personal, em ); +@background-size-nav-personal-icon: unit( 14 / @font-size-browser / @font-size-nav-personal, em ); +@top-personal-tools: 6px; +@font-size-nav-personal: 0.75em; +// Using `unit()` without second parameter to achieve a unitless output for `line-height`. +@line-height-nav-personal: unit( 14 / @font-size-browser / @font-size-nav-personal ); // Equals `1.667`. + +// Tabs +@font-size-tabs: unit( 13 / @font-size-browser, em ); // Equals `0.8125em`. +@padding-horizontal-tabs: 8px; +@padding-top-tabs: 18px; +@padding-vertical-tabs: @padding-top-tabs 0 7px 0; + +// Dropdowns +@height-dropdown-menu-item: unit( 32 / @font-size-browser, rem ); +// Remove this variable after VectorPageTools is enabled everywhere +@padding-dropdown-menu-item: 0 12px; +@padding-vertical-dropdown-menu-item: 6px; +@padding-horizontal-dropdown-menu-item: 14px; +@font-size-dropdown: unit( @font-size-base, rem ); // Equals `0.875rem`. + +// Main menu +@selector-main-menu-open: ~'#mw-sidebar-checkbox:checked'; +@selector-main-menu-closed: ~'#mw-sidebar-checkbox:not( :checked )'; + +// Scroll Indicator +@height-scroll-indicator: 30px; +// The amount of space that should be between the bottom of the viewport and the +// bottom of the scroll indicator. +@max-height-bottom-spacing-scroll-indicator: 16px; + +// TOC and Page tools Pinned elements +@padding-top-pinned-element: unit( (30px - @padding-top-tabs) / @font-size-browser, em); + +// Page Tools +// 2.34 (height of #firstHeading) - the padding on the pinned element to allow +// for 30px of space between the top of the pinned element and the top of the viewport. +@margin-top-pinned-page-tools: (@font-size-heading-1 * @line-height-heading) - @padding-top-pinned-element; + +// TOC +@spacing-subsection-toggle: 22px; // @size-toc-subsection-toggle-icon @ 12 +@size-toc-subsection-toggle-icon: 1.834em; +// Add the top padding of .mw-body element to @margin-top-pinned-page-tools +// since it starts higher on the page. +@margin-top-pinned-toc: @margin-top-pinned-page-tools + @padding-top-content; + +// Search +@max-width-search: unit( 500px / @font-size-browser / @font-size-base, em ); // 35.71428571em @ 16 & 0.875em T270202 +@min-width-search-button: 28px; +@width-search-button: unit( 28 / @font-size-browser / @font-size-search-input, em ); +@font-size-search-input: unit( 13 / @font-size-browser, em ); // Equals `0.8125em`. +// Derived from @size-typeahead-search-focus-addition in Codex +// https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/typeahead-search/TypeaheadSearch.vue#703 +@size-search-expand: 24px; +@margin-end-search: 12px; + +// Language button +@height-button-lang: unit( 32 / @font-size-browser, em ); + +// T296321 For sticky header, set an explicit height. This is needed for scroll padding +// and for other sticky elements on the page. Setting the height in relative units enables +// the header's height to adapt to the browser's font size setting. Because +// this variable is used to determine top offsets for sticky elements where the +// font-size might not be 16px, using rem avoids the cascading effects of em units. +@height-sticky-header: unit( 50px / @font-size-browser, rem ); + +// Z-indices +// See skinStyles/jquery.ui/jquery.ui.datepicker.css. +// @z-index-ui-datepicker-cover: -1; +@z-index-base: 0; +// Header z-index-header higher than z-index-menu so that search results overlay variants and more menu +@z-index-header: 4; +@z-index-sidebar: 1; +@z-index-menu-checkbox: 1; +@z-index-search-button: 1; +@z-index-search-loader: 1; +// Ensure that this is displayed on top of .vector-body and clickable. +@z-index-indicators: 1; +// See skinStyles/jquery.ui/jquery.ui.slider.css. +// @z-index-ui-slider-range: 1; +// Menus must overlap indicators (@z-index-indicators) and VisualEditor toolbar (z-index: 2). +@z-index-menu: 3; +// See skinStyles/jquery.ui/jquery.ui.slider.css. +// @z-index-ui-slider-handle: 2; +// Display on top of page tabs (T39158, T50078). +@z-index-personal: 100; +@z-index-sidebar-button: 101; +// See skinStyles/jquery.ui/jquery.ui.selectable.css. +// @z-index-ui-selectable-helper: 100; +@z-index-overlay: 101; +// See skinStyles/jquery.ui/jquery.ui.tooltip.css. +// @z-index-ui-tooltip: 9999; + +// Transitions +// Sticky header hide/show transition +@transition-sticky-header: transform 250ms linear; + +// +// Layout +// +@max-width-page-container: unit( 1596px / @font-size-browser, em ); // T305069 - 99.75em @ 16 +@max-width-content-container: unit( 960px / @font-size-browser, em ); // T305069 - 60em @ 16 +@padding-horizontal-page-container: unit( 24px / @font-size-browser, em ); +@padding-horizontal-page-container-desktop: unit( 44px / @font-size-browser, em ); +@padding-horizontal-page-container-desktop-wide: unit( 52px / @font-size-browser, em ); +// T314419 - Scroll padding is modified primarily to bring section headings into a position that is +// easier to read, which is slightly lower than the very top of the page. The primary use-case is when +// navigating sections via the table of contents. When changing this value, also change the value in +// resources/skins.vector.es6/main.js +@scroll-padding-top: 75px; + +// Grid +@grid-row-gap: 24px; +@grid-column-gap: 36px; +@width-column-start-desktop: unit( 196px / @font-size-browser, em ); // Total width including gap is 232px +@width-column-start-desktop-wide: unit( 248px / @font-size-browser, em ); // Total width including gap is 284px diff --git a/Vector/resources/mediawiki.less.legacy/mediawiki.skin.variables.less b/Vector/resources/mediawiki.less.legacy/mediawiki.skin.variables.less new file mode 100644 index 0000000..52a79a1 --- /dev/null +++ b/Vector/resources/mediawiki.less.legacy/mediawiki.skin.variables.less @@ -0,0 +1,26 @@ +/** + * This file is a LESS import match for "mediawiki.skin.variables.less" + * when legacy Vector is the active skin. + */ + +@import 'mediawiki.skin.defaults.less'; + +// Set pre July 2022 colors for links (T213778). +@color-link: #0645ad; +@color-link--visited: #0b0080; +@color-link--active: #faa700; +@color-link-new: #ba0000; +@color-link-new--visited: #a55858; + +// Note these colors are different from Vector 2022 for historic reasons: +@color-link-external: #36b; +@color-link-external--visited: #636; +@color-link-external--active: #b63; + +// Body content uses the user setting in browser / the system default sans-serif font: +// Arial on Windows, Roboto on Android. +// FIXME: Use WikimediaUI Base's OS specific default sans-serif fonts. +@font-family-sans: sans-serif; + +// Matches WikimediaUI Base and Codex, OOUI/wikimedia +@border-radius-base: 2px; diff --git a/Vector/resources/mediawiki.less/mediawiki.skin.variables.less b/Vector/resources/mediawiki.less/mediawiki.skin.variables.less new file mode 100644 index 0000000..4b07826 --- /dev/null +++ b/Vector/resources/mediawiki.less/mediawiki.skin.variables.less @@ -0,0 +1,61 @@ +/** + * ###IMPORTANT:## + * If editing this file, please also edit the respective file in the MinervaNeue skin. + * #### + * + * This file is a LESS @import match for "mediawiki.skin.variables.less" + * when Vector 2022 is the active skin. + * Please note, that legacy Vector is handled by + * "mediwiki.less.legacy/mediawiki.skin.variables.less". + * + * Please also note, that both current Wikimedia Design Style Guide based skins, + * Vector 2022 and Minerva Neue are using the same variable values respectively in their + * repositories. + */ + +@import 'mediawiki.skin.defaults.less'; + +// == Colors == +@color-link: #36c; +@color-link--visited: #795cb2; +@color-link--active: #faa700; +// Link colors for new or missing articles, also known as “Red links”. +// https://www.wikidata.org/wiki/Q13417974#sitelinks-wikipedia +@color-link-new: #d33; +@color-link-new--visited: #a55858; +// Link colors for a power user feature to highlight links to other projects. +// In Vector 2022 we unify these colors by default for simpler orientation by average users. +// It's still possible to overwrite the styles per user. +@color-link-external: #36c; +@color-link-external--visited: #795cb2; +@color-link-external--active: #faa700; + +// Opacities +@opacity-base: 1; +@opacity-medium: 0.65; +@opacity-low: 0.3; +@opacity-transparent: 0; +// Legacy opacity for icon states in CSS-only component and non-Codex products. +@opacity-icon-base: 0.87; // = `#222` on `background-color: #fff`, closest to `#202122`. +// Legacy opacity for icon states in CSS-only component and non-Codex products. +@opacity-icon-base--hover: 0.74; // = `#424242` on `background-color: #fff`, closest to `#404244`. +// Legacy opacity for icon states in CSS-only component and non-Codex products. +@opacity-icon-base--selected: 1; +// Legacy opacity for icon states in CSS-only component and non-Codex products. +@opacity-icon-base--disabled: 0.51; // = `#7d7d7d` on `background-color: #fff`, closest to `#72777d`. +// Legacy opacity for icon states in CSS-only component and non-Codex products. +@opacity-icon-accessory: 0.67; // = `#555` on `background-color: `#fff`, closest to `#54595d`. + +// == Box Model properties == +// Border Styles +@border-style-base: solid; +// Border Widths +@border-width-base: 1px; +// Border Radius. Match WikimediaUI Base and Codex. +@border-radius-base: 2px; + +// == Typography == +// Body content uses the user setting in browser / the system default sans-serif font: +// Arial on Windows, Roboto on Android. +// FIXME: Use WikimediaUI Base's OS specific default sans-serif fonts. +@font-family-sans: sans-serif; diff --git a/Vector/resources/mw.d.ts b/Vector/resources/mw.d.ts new file mode 100644 index 0000000..6da5b29 --- /dev/null +++ b/Vector/resources/mw.d.ts @@ -0,0 +1 @@ +import '@wikimedia/types-wikimedia'; diff --git a/Vector/resources/skins.vector.es6/.eslintrc.json b/Vector/resources/skins.vector.es6/.eslintrc.json new file mode 100644 index 0000000..f7eaa24 --- /dev/null +++ b/Vector/resources/skins.vector.es6/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "../../.eslintrcEs6.json" + ] +} diff --git a/Vector/resources/skins.vector.es6/AB.js b/Vector/resources/skins.vector.es6/AB.js new file mode 100644 index 0000000..4254acc --- /dev/null +++ b/Vector/resources/skins.vector.es6/AB.js @@ -0,0 +1,203 @@ +/** @module WebABTest */ + +const EXCLUDED_BUCKET = 'unsampled'; +const TREATMENT_BUCKET_SUBSTRING = 'treatment'; +const WEB_AB_TEST_ENROLLMENT_HOOK = 'mediawiki.web_AB_test_enrollment'; +/** + * @typedef {Function} TreatmentBucketFunction + * @param {string} [a] + * @return {boolean} + */ + +/** + * @typedef {Object} WebABTest + * @property {string} name + * @property {function(): string} getBucket + * @property {function(string): boolean} isInBucket + * @property {function(): boolean} isInSample + * @property {TreatmentBucketFunction} isInTreatmentBucket + */ + +/** + * @typedef {Object} SamplingRate + * @property {number} samplingRate The desired sampling rate for the group in the range [0, 1]. + */ + +/** + * @typedef {Object} WebABTestProps + * @property {string} name The name of the experiment. + * @property {Object} buckets Dict with bucket name as key and SamplingRate + * object as value. There must be an `unsampled` bucket that represents a + * population excluded from the experiment. Additionally, the treatment + * bucket(s) must include a case-insensitive `treatment` substring in their name + * (e.g. `treatment`, `stickyHeaderTreatment`, `sticky-header-treatment`). + * @property {string} [token] Token that uniquely identifies the subject for the + * duration of the experiment. If bucketing/server occurs on the server and the + * bucket is a class on the body tag, this can be ignored. Otherwise, it is + * required. + */ + +/** + * Initializes an AB test experiment. + * + * Example props: + * + * webABTest({ + * name: 'nameOfExperiment', + * buckets: { + * unsampled: { + * samplingRate: 0.25 + * }, + * control: { + * samplingRate: 0.25 + * }, + * treatment1: { + * samplingRate: 0.25 + * }, + * treatment2: { + * samplingRate: 0.25 + * } + * }, + * token: 'token' + * }); + * + * @param {WebABTestProps} props + * @return {WebABTest} + */ +module.exports = function webABTest( props ) { + let /** @type {string} */ cachedBucket; + + /** + * Get the names of all the buckets from props.buckets. + * + * @return {string[]} + */ + function getBucketNames() { + return Object.keys( props.buckets ); + + } + + /** + * Get the name of the bucket from the class added to the body tag. + * + * @return {?string} + */ + function getBucketFromHTML() { + for ( const bucketName of getBucketNames() ) { + if ( document.body.classList.contains( `${props.name}-${bucketName}` ) ) { + return bucketName; + } + } + + return null; + } + + /** + * Get the name of the bucket the subject is assigned to for A/B testing. + * + * @throws {Error} Will throw an error if token is undefined and body tag has + * not been assigned a bucket. + * @return {string} the name of the bucket the subject is assigned. + */ + function getBucket() { + if ( cachedBucket ) { + // If we've already cached the bucket, return early. + return cachedBucket; + } + + const bucketFromHTML = getBucketFromHTML(); + // If bucketing/sampling already occurred on the server, return that bucket + // instead of trying to do it on the client. + if ( bucketFromHTML ) { + cachedBucket = bucketFromHTML; + + return bucketFromHTML; + } + + if ( props.token === undefined ) { + throw new Error( 'Tried to call `getBucket` with an undefined token' ); + } + + cachedBucket = mw.experiments.getBucket( { + name: props.name, + enabled: true, + // @ts-ignore + buckets: + getBucketNames().reduce( ( buckets, key ) => { + // @ts-ignore + buckets[ key ] = props.buckets[ key ].samplingRate; + + return buckets; + }, {} ) + }, props.token ); + + return cachedBucket; + } + + /** + * Whether or not the subject is included in the experiment. + * + * @return {boolean} + */ + function isInSample() { + return getBucket() !== EXCLUDED_BUCKET; + } + + /** + * Determine if subject is in a particular bucket. + * + * @param {string} targetBucket The target test bucket. + * @return {boolean} Whether the subject is in the test bucket. + */ + function isInBucket( targetBucket ) { + return getBucket() === targetBucket; + } + + /** + * Whether or not the subject has been bucketed in a treatment bucket as + * defined by the bucket name containing the case-insensitive 'treatment', + * 'treatment1', or 'treatment2' substring (e.g. 'treatment', 'treatment1', + * 'sticky-header-treatment1' and 'stickyHeaderTreatment2' are all assumed + * to be treatment buckets). + * + * @param {string|null} [treatmentBucketName] lowercase name of bucket. + * @return {boolean} + */ + function isInTreatmentBucket( treatmentBucketName = '' ) { + const bucket = getBucket(); + // eslint-disable-next-line no-restricted-syntax + return bucket.toLowerCase().includes( `${TREATMENT_BUCKET_SUBSTRING}${treatmentBucketName}` ); + } + + /** + * Initialize and fire hook to register A/B test enrollment if necessary. + */ + function init() { + // Send data to WikimediaEvents to log A/B test initialization if the subject + // has been sampled into the experiment. + if ( isInSample() ) { + mw.hook( WEB_AB_TEST_ENROLLMENT_HOOK ).fire( { + group: getBucket(), + experimentName: props.name + } ); + } + } + + init(); + + /** + * @typedef {Object} WebABTest + * @property {string} name + * @property {getBucket} getBucket + * @property {isInBucket} isInBucket + * @property {isInSample} isInSample + * @property {isInTreatmentBucket} isInTreatmentBucket + */ + return { + name: props.name, + getBucket, + isInBucket, + isInSample, + isInTreatmentBucket + }; +}; diff --git a/Vector/resources/skins.vector.es6/config.json b/Vector/resources/skins.vector.es6/config.json new file mode 100644 index 0000000..c308e6b --- /dev/null +++ b/Vector/resources/skins.vector.es6/config.json @@ -0,0 +1,4 @@ +{ + "@doc": "This file describes the shape of the AB config. It exists to support jest", + "wgVectorWebABTestEnrollment": {} +} diff --git a/Vector/resources/skins.vector.es6/deferUntilFrame.js b/Vector/resources/skins.vector.es6/deferUntilFrame.js new file mode 100644 index 0000000..eece438 --- /dev/null +++ b/Vector/resources/skins.vector.es6/deferUntilFrame.js @@ -0,0 +1,22 @@ +/** + * Helper method that calls a specified callback before the browser has + * performed a specified number of repaints. + * + * Uses `requestAnimationFrame` under the hood to determine the next repaint. + * + * @param {Function} callback + * @param {number} frameCount The number of frames to wait before calling the + * specified callback. + */ +function deferUntilFrame( callback, frameCount ) { + if ( frameCount === 0 ) { + callback(); + return; + } + + requestAnimationFrame( () => { + deferUntilFrame( callback, frameCount - 1 ); + } ); +} + +module.exports = deferUntilFrame; diff --git a/Vector/resources/skins.vector.es6/features.js b/Vector/resources/skins.vector.es6/features.js new file mode 100644 index 0000000..ff5260d --- /dev/null +++ b/Vector/resources/skins.vector.es6/features.js @@ -0,0 +1,96 @@ +/** @interface MwApi */ + +let /** @type {MwApi} */ api; +const debounce = require( /** @type {string} */ ( 'mediawiki.util' ) ).debounce; + +/** + * Saves preference to user preferences and/or cookies. + * + * @param {string} feature + * @param {boolean} enabled + */ +function save( feature, enabled ) { + if ( mw.user.isAnon() ) { + switch ( feature ) { + case 'limited-width': + if ( enabled ) { + // @ts-ignore + mw.cookie.set( 'mwclientprefs', null ); + } else { + // @ts-ignore + mw.cookie.set( 'mwclientprefs', 'vector-feature-limited-width' ); + } + break; + default: + // not a supported anonymous preference + break; + } + } else { + debounce( function () { + api = api || new mw.Api(); + api.saveOption( 'vector-' + feature, enabled ? 1 : 0 ); + }, 500 )(); + } +} + +/** + * + * @param {string} name feature name + * @param {boolean} [override] option to force enabled or disabled state. + * + * @return {boolean} The new feature state (false=disabled, true=enabled). + * @throws {Error} if unknown feature toggled. + */ +function toggleDocClasses( name, override ) { + const featureClassEnabled = `vector-feature-${name}-enabled`, + classList = document.documentElement.classList, + featureClassDisabled = `vector-feature-${name}-disabled`; + + if ( classList.contains( featureClassDisabled ) || override === true ) { + classList.remove( featureClassDisabled ); + classList.add( featureClassEnabled ); + return true; + } else if ( classList.contains( featureClassEnabled ) || override === false ) { + classList.add( featureClassDisabled ); + classList.remove( featureClassEnabled ); + return false; + } else { + throw new Error( `Attempt to toggle unknown feature: ${name}` ); + } +} + +/** + * @param {string} name + * @throws {Error} if unknown feature toggled. + */ +function toggle( name ) { + const featureState = toggleDocClasses( name ); + save( name, featureState ); +} + +/** + * Checks if the feature is enabled. + * + * @param {string} name + * @return {boolean} + */ +function isEnabled( name ) { + return document.documentElement.classList.contains( getClass( name, true ) ); +} + +/** + * Get name of feature class. + * + * @param {string} name + * @param {boolean} featureEnabled + * @return {string} + */ +function getClass( name, featureEnabled ) { + if ( featureEnabled ) { + return `vector-feature-${name}-enabled`; + } else { + return `vector-feature-${name}-disabled`; + } +} + +module.exports = { getClass, isEnabled, toggle, toggleDocClasses }; diff --git a/Vector/resources/skins.vector.es6/images/fullscreen-close.svg b/Vector/resources/skins.vector.es6/images/fullscreen-close.svg new file mode 100644 index 0000000..b1a1a5e --- /dev/null +++ b/Vector/resources/skins.vector.es6/images/fullscreen-close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Vector/resources/skins.vector.es6/images/fullscreen.svg b/Vector/resources/skins.vector.es6/images/fullscreen.svg new file mode 100644 index 0000000..371b53a --- /dev/null +++ b/Vector/resources/skins.vector.es6/images/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Vector/resources/skins.vector.es6/limitedWidthToggle.js b/Vector/resources/skins.vector.es6/limitedWidthToggle.js new file mode 100644 index 0000000..3267f2b --- /dev/null +++ b/Vector/resources/skins.vector.es6/limitedWidthToggle.js @@ -0,0 +1,40 @@ +const features = require( './features.js' ); +const LIMITED_WIDTH_FEATURE_NAME = 'limited-width'; + +/** + * Sets data attribute for click tracking purposes. + * + * @param {HTMLElement} toggleBtn + */ +function setDataAttribute( toggleBtn ) { + toggleBtn.dataset.eventName = features.isEnabled( LIMITED_WIDTH_FEATURE_NAME ) ? + 'limited-width-toggle-off' : 'limited-width-toggle-on'; +} +/** + * adds a toggle button + */ +function init() { + const toggle = document.createElement( 'button' ); + toggle.setAttribute( 'title', mw.msg( 'vector-limited-width-toggle' ) ); + toggle.setAttribute( 'aria-hidden', 'true' ); + toggle.textContent = mw.msg( 'vector-limited-width-toggle' ); + toggle.classList.add( 'mw-ui-icon', 'mw-ui-icon-element', 'mw-ui-button', 'vector-limited-width-toggle' ); + setDataAttribute( toggle ); + document.body.appendChild( toggle ); + toggle.addEventListener( 'click', function () { + features.toggle( LIMITED_WIDTH_FEATURE_NAME ); + setDataAttribute( toggle ); + // Fire a simulated window resize event (T328121) + let event; + if ( typeof Event === 'function' ) { + event = new Event( 'resize' ); + } else { + // IE11 + event = window.document.createEvent( 'UIEvents' ); + event.initUIEvent( 'resize', true, false, window, 0 ); + } + window.dispatchEvent( event ); + } ); +} + +module.exports = init; diff --git a/Vector/resources/skins.vector.es6/limitedWidthToggle.less b/Vector/resources/skins.vector.es6/limitedWidthToggle.less new file mode 100644 index 0000000..6dcd3af --- /dev/null +++ b/Vector/resources/skins.vector.es6/limitedWidthToggle.less @@ -0,0 +1,31 @@ +/** + * Limited width toggle - a button which lets users change the layout from + * a fixed-width content column to a layout where the content takes up the + * full window width. + */ + +// By default, toggle should be hidden unless the breakpoint below is reached. +.vector-limited-width-toggle { + display: none; +} + +// Note on certain pages the control will have no effect e.g. Special:RecentChanges +// Defining this at 1400px is a product decision so do not change it +// (more context at https://phabricator.wikimedia.org/T326887#8540889) +@media ( min-width: 1400px ) { + .vector-limited-width-toggle { + display: block; + position: fixed; + bottom: 8px; + right: 8px; + } + + //NOTE: enabled/disabled class on body. + .vector-feature-limited-width-disabled .vector-limited-width-toggle:before { + background-image: url( images/fullscreen-close.svg ); + } + + .vector-feature-limited-width-enabled .vector-limited-width-toggle:before { + background-image: url( images/fullscreen.svg ); + } +} diff --git a/Vector/resources/skins.vector.es6/main.js b/Vector/resources/skins.vector.es6/main.js new file mode 100644 index 0000000..160b2c5 --- /dev/null +++ b/Vector/resources/skins.vector.es6/main.js @@ -0,0 +1,392 @@ +// Enable Vector features limited to ES6 browse +const + limitedWidthToggle = require( './limitedWidthToggle.js' ), + searchToggle = require( './searchToggle.js' ), + stickyHeader = require( './stickyHeader.js' ), + scrollObserver = require( './scrollObserver.js' ), + initExperiment = require( './AB.js' ), + initSectionObserver = require( './sectionObserver.js' ), + initTableOfContents = require( './tableOfContents.js' ), + pinnableElement = require( './pinnableElement.js' ), + features = require( './features.js' ), + deferUntilFrame = require( './deferUntilFrame.js' ), + ABTestConfig = require( /** @type {string} */ ( './config.json' ) ).wgVectorWebABTestEnrollment || {}, + STICKY_HEADER_VISIBLE_CLASS = 'vector-sticky-header-visible', + TOC_ID = 'vector-toc', + BODY_CONTENT_ID = 'bodyContent', + HEADLINE_SELECTOR = '.mw-headline', + TOC_SECTION_ID_PREFIX = 'toc-', + PAGE_TITLE_INTERSECTION_CLASS = 'vector-below-page-title'; + +const belowDesktopMedia = window.matchMedia( '(max-width: 999px)' ); + +/** + * @callback OnIntersection + * @param {HTMLElement} element The section that triggered the new intersection change. + */ + +/** + * @ignore + * @param {Function} changeActiveSection + * @return {OnIntersection} + */ +const getHeadingIntersectionHandler = ( changeActiveSection ) => { + /** + * @param {HTMLElement} section + */ + return ( section ) => { + const headline = section.classList.contains( 'mw-body-content' ) ? + section : + section.querySelector( HEADLINE_SELECTOR ); + if ( headline ) { + changeActiveSection( `${TOC_SECTION_ID_PREFIX}${headline.id}` ); + } + }; +}; + +/** + * Initialize sticky header AB tests and determine whether to show the sticky header + * based on which buckets the user is in. + * + * @typedef {Object} InitStickyHeaderABTests + * @property {boolean} disableEditIcons - Should the sticky header have an edit icon + * @property {boolean} showStickyHeader - Should the sticky header be shown + * @param {ABTestConfig} abConfig + * @param {boolean} isStickyHeaderFeatureAllowed and the user is logged in + * @param {function(ABTestConfig): initExperiment.WebABTest} getEnabledExperiment + * @return {InitStickyHeaderABTests} + */ +function initStickyHeaderABTests( abConfig, isStickyHeaderFeatureAllowed, getEnabledExperiment ) { + let showStickyHeader = isStickyHeaderFeatureAllowed, + stickyHeaderExperiment, + disableEditIcons = true; + + // One of the sticky header AB tests is specified in the config + const abTestName = abConfig.name, + isStickyHeaderExperiment = abTestName === stickyHeader.STICKY_HEADER_EXPERIMENT_NAME || + abTestName === stickyHeader.STICKY_HEADER_EDIT_EXPERIMENT_NAME; + + // Determine if user is eligible for sticky header AB test + if ( + isStickyHeaderFeatureAllowed && // The sticky header can be shown on the page + abConfig.enabled && // An AB test config is enabled + isStickyHeaderExperiment // The AB test is one of the sticky header experiments + ) { + // If eligible, initialize the AB test + stickyHeaderExperiment = getEnabledExperiment( abConfig ); + disableEditIcons = true; + + // If running initial or edit AB test, show sticky header to treatment groups + // only. Unsampled and control buckets do not see sticky header. + if ( abTestName === stickyHeader.STICKY_HEADER_EXPERIMENT_NAME || + abTestName === stickyHeader.STICKY_HEADER_EDIT_EXPERIMENT_NAME + ) { + showStickyHeader = stickyHeaderExperiment.isInTreatmentBucket(); + } + + // If running edit-button AB test, the edit buttons in sticky header are shown + // to second treatment group only. + if ( abTestName === stickyHeader.STICKY_HEADER_EDIT_EXPERIMENT_NAME ) { + if ( stickyHeaderExperiment.isInTreatmentBucket( '1' ) ) { + disableEditIcons = true; + } + if ( stickyHeaderExperiment.isInTreatmentBucket( '2' ) ) { + disableEditIcons = false; + } + } + } + if ( !abConfig.enabled ) { + disableEditIcons = false; + } + + return { + showStickyHeader, + disableEditIcons + }; +} + +/* + * Updates TOC's location in the DOM (in sidebar or sticky header) + * depending on if the TOC is collapsed and if the sticky header is visible + * + * @return {void} + */ +const updateTocLocation = () => { + const isPinned = features.isEnabled( 'toc-pinned' ); + const isStickyHeaderVisible = document.body.classList.contains( STICKY_HEADER_VISIBLE_CLASS ); + const isBelowDesktop = belowDesktopMedia.matches; + + const pinnedContainerId = 'vector-toc-pinned-container'; + const stickyHeaderUnpinnedContainerId = 'vector-sticky-header-toc-unpinned-container'; + const pageTitlebarUnpinnedContainerId = 'vector-page-titlebar-toc-unpinned-container'; + + let newContainerId = ''; + if ( isPinned ) { + if ( isBelowDesktop ) { + // Automatically move the ToC into the page titlebar when pinned on smaller resolutions + newContainerId = pageTitlebarUnpinnedContainerId; + } else { + newContainerId = pinnedContainerId; + } + } else { + if ( isStickyHeaderVisible && !isBelowDesktop ) { + newContainerId = stickyHeaderUnpinnedContainerId; + } else { + newContainerId = pageTitlebarUnpinnedContainerId; + } + } + + pinnableElement.movePinnableElement( TOC_ID, newContainerId ); +}; + +/** + * Return the computed value of the `scroll-margin-top` CSS property of the document element + * which is also used for the scroll intersection threshold (T317661). + * + * @return {number} Value of scroll-margin-top OR 75 if falsy. + * 75 derived from @scroll-padding-top LESS variable + * https://gerrit.wikimedia.org/r/c/mediawiki/skins/Vector/+/894696/3/resources/common/variables.less ? + */ +function getDocumentScrollPaddingTop() { + const defaultScrollPaddingTop = 75; + const documentStyles = getComputedStyle( document.documentElement ); + const scrollPaddingTopString = documentStyles.getPropertyValue( 'scroll-padding-top' ); + return ( parseInt( scrollPaddingTopString, 10 ) || defaultScrollPaddingTop ); +} + +/** + * @param {HTMLElement|null} tocElement + * @param {HTMLElement|null} bodyContent + * @param {initSectionObserver} initSectionObserverFn + * @return {tableOfContents|null} + */ +const setupTableOfContents = ( tocElement, bodyContent, initSectionObserverFn ) => { + if ( !( + tocElement && + bodyContent + ) ) { + return null; + } + + const handleTocSectionChange = () => { + // eslint-disable-next-line no-use-before-define + sectionObserver.pause(); + + // T297614: We want the link that the user has clicked inside the TOC or the + // section that corresponds to the hashchange event to be "active" (e.g. + // bolded) regardless of whether the browser's scroll position corresponds + // to that section. Therefore, we need to temporarily ignore section + // observer until the browser has finished scrolling to the section (if + // needed). + // + // However, because the scroll event happens asynchronously after the user + // clicks on a link and may not even happen at all (e.g. the user has + // scrolled all the way to the bottom and clicks a section that is already + // in the viewport), determining when we should resume section observer is a + // bit tricky. + // + // Because a scroll event may not even be triggered after clicking the link, + // we instead allow the browser to perform a maximum number of repaints + // before resuming sectionObserver. Per T297614#7687656, Firefox 97.0 wasn't + // consistently activating the table of contents section that the user + // clicked even after waiting 2 frames. After further investigation, it + // sometimes waits up to 3 frames before painting the new scroll position so + // we have that as the limit. + deferUntilFrame( () => { + // eslint-disable-next-line no-use-before-define + sectionObserver.resume(); + }, 3 ); + }; + + const tableOfContents = initTableOfContents( { + container: tocElement, + onHeadingClick: handleTocSectionChange, + onHashChange: handleTocSectionChange, + onTogglePinned: () => { + updateTocLocation(); + pinnableElement.setFocusAfterToggle( TOC_ID ); + } + } ); + const headingSelector = [ + 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + ].map( ( tag ) => `.mw-parser-output ${tag}` ).join( ',' ); + const elements = () => bodyContent.querySelectorAll( `${headingSelector}, .mw-body-content` ); + + const sectionObserver = initSectionObserverFn( { + elements: elements(), + topMargin: getDocumentScrollPaddingTop(), + onIntersection: getHeadingIntersectionHandler( tableOfContents.changeActiveSection ) + } ); + const updateElements = () => { + sectionObserver.resume(); + sectionObserver.setElements( elements() ); + }; + mw.hook( 've.activationStart' ).add( () => { + sectionObserver.pause(); + } ); + // @ts-ignore + mw.hook( 'wikipage.tableOfContents' ).add( function ( sections ) { + tableOfContents.reloadTableOfContents( sections ).then( function () { + mw.hook( 'wikipage.tableOfContents.vector' ).fire( sections ); + updateElements(); + } ); + } ); + mw.hook( 've.deactivationComplete' ).add( updateElements ); + + const setInitialActiveSection = () => { + const hash = location.hash.slice( 1 ); + // If hash fragment is blank, determine the active section with section + // observer. + if ( hash === '' ) { + sectionObserver.calcIntersection(); + return; + } + + // T325086: If hash fragment is present and corresponds to a toc section, + // expand the section. + // @ts-ignore + const hashSection = /** @type {HTMLElement|null} */ ( mw.util.getTargetFromFragment( `${TOC_SECTION_ID_PREFIX}${hash}` ) ); + if ( hashSection ) { + tableOfContents.expandSection( hashSection.id ); + } + + // T325086: If hash fragment corresponds to a section AND the user is at + // bottom of page, activate the section. Otherwise, use section observer to + // calculate the active section. + // + // Note that even if a hash fragment is present, it's possible for the + // browser to scroll to a position that is different from the position of + // the section that corresponds to the hash fragment. This can happen when + // the browser remembers a prior scroll position after refreshing the page, + // for example. + if ( + hashSection && + Math.round( window.innerHeight + window.scrollY ) >= document.body.scrollHeight + ) { + tableOfContents.changeActiveSection( hashSection.id ); + } else { + // Fallback to section observer's calculation for the active section. + sectionObserver.calcIntersection(); + } + }; + + setInitialActiveSection(); + + return tableOfContents; +}; + +/** + * @return {void} + */ +const main = () => { + const isIntersectionObserverSupported = 'IntersectionObserver' in window; + + limitedWidthToggle(); + // Initialize the search toggle for the main header only. The sticky header + // toggle is initialized after Codex search loads. + const searchToggleElement = document.querySelector( '.mw-header .search-toggle' ); + if ( searchToggleElement ) { + searchToggle( searchToggleElement ); + } + + // + // Pinnable elements + // + pinnableElement.initPinnableElement(); + + // + // Table of contents + // + const tocElement = document.getElementById( TOC_ID ); + const bodyContent = document.getElementById( BODY_CONTENT_ID ); + + const isToCUpdatingAllowed = isIntersectionObserverSupported && + window.requestAnimationFrame; + const tableOfContents = isToCUpdatingAllowed ? + setupTableOfContents( tocElement, bodyContent, initSectionObserver ) : null; + + // + // Sticky header + // + const + stickyHeaderElement = document.getElementById( stickyHeader.STICKY_HEADER_ID ), + stickyIntersection = document.getElementById( stickyHeader.FIRST_HEADING_ID ), + userLinksDropdown = document.getElementById( stickyHeader.USER_LINKS_DROPDOWN_ID ), + allowedNamespace = stickyHeader.isAllowedNamespace( mw.config.get( 'wgNamespaceNumber' ) ), + allowedAction = stickyHeader.isAllowedAction( mw.config.get( 'wgAction' ) ); + + const isStickyHeaderAllowed = + !!stickyHeaderElement && + !!stickyIntersection && + !!userLinksDropdown && + allowedNamespace && + allowedAction && + isIntersectionObserverSupported; + + const { showStickyHeader, disableEditIcons } = initStickyHeaderABTests( + ABTestConfig, + isStickyHeaderAllowed && !mw.user.isAnon(), + ( config ) => initExperiment( + Object.assign( {}, config, { token: mw.user.getId() } ) + ) + ); + + // Set up intersection observer for page title + // Used to show/hide sticky header and add class used by collapsible TOC (T307900) + const observer = scrollObserver.initScrollObserver( + () => { + if ( isStickyHeaderAllowed && showStickyHeader ) { + stickyHeader.show(); + updateTocLocation(); + } + document.body.classList.add( PAGE_TITLE_INTERSECTION_CLASS ); + if ( tableOfContents ) { + tableOfContents.updateTocToggleStyles( true ); + } + scrollObserver.firePageTitleScrollHook( 'down' ); + }, + () => { + if ( isStickyHeaderAllowed && showStickyHeader ) { + stickyHeader.hide(); + updateTocLocation(); + } + document.body.classList.remove( PAGE_TITLE_INTERSECTION_CLASS ); + if ( tableOfContents ) { + tableOfContents.updateTocToggleStyles( false ); + } + scrollObserver.firePageTitleScrollHook( 'up' ); + } + ); + + // Handle toc location when sticky header is hidden on lower viewports + belowDesktopMedia.onchange = () => { + updateTocLocation(); + }; + + updateTocLocation(); + + if ( !showStickyHeader ) { + stickyHeader.hide(); + } + + if ( isStickyHeaderAllowed && showStickyHeader ) { + stickyHeader.initStickyHeader( { + header: stickyHeaderElement, + userLinksDropdown, + observer, + stickyIntersection, + disableEditIcons + } ); + } else if ( stickyIntersection ) { + observer.observe( stickyIntersection ); + } +}; + +module.exports = { + main, + test: { + setupTableOfContents, + initStickyHeaderABTests, + getHeadingIntersectionHandler + } +}; diff --git a/Vector/resources/skins.vector.es6/pinnableElement.js b/Vector/resources/skins.vector.es6/pinnableElement.js new file mode 100644 index 0000000..008adc6 --- /dev/null +++ b/Vector/resources/skins.vector.es6/pinnableElement.js @@ -0,0 +1,209 @@ +const features = require( './features.js' ); +const PINNED_HEADER_CLASS = 'vector-pinnable-header-pinned'; +const UNPINNED_HEADER_CLASS = 'vector-pinnable-header-unpinned'; + +/** + * Callback for matchMedia listener that overrides the pinnable header's stored state + * at a certain breakpoint and forces it to unpin. Also hides the pinnable button + * at that breakpoint to disable pinning. + * Usage of 'e.matches' assumes a `max-width` not `min-width` media query. + * + * @param {HTMLElement} header + * @param {MediaQueryList|MediaQueryListEvent} e + */ +function disablePinningAtBreakpoint( header, e ) { + const { + pinnableElementId, + pinnedContainerId, + unpinnedContainerId, + featureName + } = header.dataset; + const savedPinnedState = JSON.parse( header.dataset.savedPinnedState || 'false' ); + + // (typescript null check) + if ( !( pinnableElementId && unpinnedContainerId && pinnedContainerId && featureName ) ) { + return; + } + + // Hide the button at lower resolutions. + header.hidden = e.matches; + + if ( e.matches && savedPinnedState === true ) { + features.toggleDocClasses( featureName, false ); + movePinnableElement( pinnableElementId, unpinnedContainerId ); + } + + if ( !e.matches && savedPinnedState === true ) { + features.toggleDocClasses( featureName, true ); + movePinnableElement( pinnableElementId, pinnedContainerId ); + } +} + +/** + * Saves the persistent pinnable state in the element's dataset + * so that it can be overridden at lower resolutions and the + * reverted to at wider resolutions. + * + * This is not necessarily the elements current state, but it + * seeks to represent the state of the saved user preference. + * + * @param {HTMLElement} header + */ +function setSavedPinnableState( header ) { + header.dataset.savedPinnedState = String( isPinned( header ) ); +} + +/** + * Toggle classes on the body and pinnable element + * + * @param {HTMLElement} header pinnable element + */ +function togglePinnableClasses( header ) { + const featureName = /** @type {string} */ ( header.dataset.featureName ); + + // Leverage features.js to toggle the body classes and persist the state + // for logged-in users. + features.toggle( featureName ); + + // Toggle pinned class + header.classList.toggle( PINNED_HEADER_CLASS ); + header.classList.toggle( UNPINNED_HEADER_CLASS ); +} + +/** + * Event handler that toggles the pinnable elements pinned state. + * Also moves the pinned element when those params are provided + * (via data attributes). + * + * @param {HTMLElement} header PinnableHeader element. + */ +function pinnableElementClickHandler( header ) { + const { + pinnableElementId, + pinnedContainerId, + unpinnedContainerId + } = header.dataset; + + togglePinnableClasses( header ); + + // Optional functionality of moving the pinnable element in the DOM + // to different containers based on it's pinned status + if ( pinnableElementId && pinnedContainerId && unpinnedContainerId ) { + setSavedPinnableState( header ); + const newContainerId = isPinned( header ) ? pinnedContainerId : unpinnedContainerId; + movePinnableElement( pinnableElementId, newContainerId ); + setFocusAfterToggle( pinnableElementId ); + } +} + +/** + * Sets focus on the correct toggle button depending on the pinned state. + * Also opens the dropdown containing the unpinned element. + * + * @param {string} pinnableElementId + */ +function setFocusAfterToggle( pinnableElementId ) { + let focusElement; + const pinnableElement = document.getElementById( pinnableElementId ); + const header = /** @type {HTMLElement|null} */ ( pinnableElement && pinnableElement.querySelector( '.vector-pinnable-header' ) ); + if ( !pinnableElement || !header ) { + return; + } + if ( isPinned( header ) ) { + focusElement = /** @type {HTMLElement|null} */ ( pinnableElement.querySelector( '.vector-pinnable-header-unpin-button' ) ); + } else { + const dropdown = pinnableElement.closest( '.vector-dropdown' ); + focusElement = /** @type {HTMLInputElement|null} */ ( dropdown && dropdown.querySelector( '.vector-menu-checkbox' ) ); + } + if ( focusElement ) { + focusElement.focus(); + } +} + +/** + * Binds all the toggle buttons in a pinnableElement + * to the click handler that enables pinnability. + * + * @param {HTMLElement} header + */ +function bindPinnableToggleButtons( header ) { + const toggleButtons = header.querySelectorAll( '.vector-pinnable-header-toggle-button' ); + toggleButtons.forEach( function ( button ) { + button.addEventListener( 'click', pinnableElementClickHandler.bind( null, header ) ); + } ); +} + +/** + * Binds pinnable breakpoint to allow automatic unpinning + * of pinnable elements with pinnedContainerId and unpinnedContainerId defined + * + * @param {HTMLElement} header + */ +function bindPinnableBreakpoint( header ) { + const { pinnedContainerId, unpinnedContainerId } = header.dataset; + if ( !unpinnedContainerId || !pinnedContainerId ) { + return; + } + + const pinnableBreakpoint = window.matchMedia( '(max-width: 1000px)' ); + // Set saved pinned state for narrow breakpoint behaviour. + setSavedPinnableState( header ); + // Check the breakpoint in case an override is needed on pageload. + disablePinningAtBreakpoint( header, pinnableBreakpoint ); + + // Add match media handler. + if ( pinnableBreakpoint.addEventListener ) { + pinnableBreakpoint.addEventListener( 'change', disablePinningAtBreakpoint.bind( null, header ) ); + } else { + // Before Safari 14, MediaQueryList is based on EventTarget, + // so you must use addListener() and removeListener() to observe media query lists. + pinnableBreakpoint.addListener( disablePinningAtBreakpoint.bind( null, header ) ); + } +} + +/** + * @param {HTMLElement} header + * @return {boolean} Returns true if the element is pinned and false otherwise. + */ +function isPinned( header ) { + const featureName = /** @type {string} */ ( header.dataset.featureName ); + return features.isEnabled( featureName ); +} + +/** + * @param {string} pinnableElementId + * @param {string} newContainerId + */ +function movePinnableElement( pinnableElementId, newContainerId ) { + const pinnableElem = document.getElementById( pinnableElementId ); + const newContainer = document.getElementById( newContainerId ); + const currContainer = /** @type {HTMLElement} */ ( pinnableElem && pinnableElem.parentElement ); + + if ( !pinnableElem || !newContainer || !currContainer ) { + return; + } + + // Avoid moving element if unnecessary + if ( currContainer.id !== newContainerId ) { + newContainer.insertAdjacentElement( 'beforeend', pinnableElem ); + } +} + +function initPinnableElement() { + const pinnableHeader = /** @type {NodeListOf} */ ( document.querySelectorAll( '.vector-pinnable-header' ) ); + pinnableHeader.forEach( ( header ) => { + if ( header.dataset.featureName && header.dataset.pinnableElementId ) { + bindPinnableToggleButtons( header ); + bindPinnableBreakpoint( header ); + } + } ); +} + +module.exports = { + initPinnableElement, + movePinnableElement, + setFocusAfterToggle, + isPinned, + PINNED_HEADER_CLASS, + UNPINNED_HEADER_CLASS +}; diff --git a/Vector/resources/skins.vector.es6/scrollObserver.js b/Vector/resources/skins.vector.es6/scrollObserver.js new file mode 100644 index 0000000..ef28e8e --- /dev/null +++ b/Vector/resources/skins.vector.es6/scrollObserver.js @@ -0,0 +1,48 @@ +const + SCROLL_TITLE_HOOK = 'vector.page_title_scroll', + SCROLL_TITLE_CONTEXT_ABOVE = 'scrolled-above-page-title', + SCROLL_TITLE_CONTEXT_BELOW = 'scrolled-below-page-title', + SCROLL_TITLE_ACTION = 'scroll-to-top'; + +/** + * Fire a hook to be captured by WikimediaEvents for scroll event logging. + * + * @param {string} direction the scroll direction + */ +function firePageTitleScrollHook( direction ) { + if ( direction === 'down' ) { + mw.hook( SCROLL_TITLE_HOOK ).fire( { + context: SCROLL_TITLE_CONTEXT_BELOW + } ); + } else { + mw.hook( SCROLL_TITLE_HOOK ).fire( { + context: SCROLL_TITLE_CONTEXT_ABOVE, + action: SCROLL_TITLE_ACTION + } ); + } +} + +/** + * Create an observer for showing/hiding feature and for firing scroll event hooks. + * + * @param {Function} show functionality for when feature is visible + * @param {Function} hide functionality for when feature is hidden + * @return {IntersectionObserver} + */ +function initScrollObserver( show, hide ) { + /* eslint-disable-next-line compat/compat */ + return new IntersectionObserver( function ( entries ) { + if ( !entries[ 0 ].isIntersecting && entries[ 0 ].boundingClientRect.top < 0 ) { + // Viewport has crossed the bottom edge of the target element. + show(); + } else { + // Viewport is above the bottom edge of the target element. + hide(); + } + } ); +} + +module.exports = { + initScrollObserver, + firePageTitleScrollHook +}; diff --git a/Vector/resources/skins.vector.es6/searchToggle.js b/Vector/resources/skins.vector.es6/searchToggle.js new file mode 100644 index 0000000..6cb475d --- /dev/null +++ b/Vector/resources/skins.vector.es6/searchToggle.js @@ -0,0 +1,124 @@ +const + HEADER_SELECTOR = 'header', + SEARCH_BOX_SELECTOR = '.vector-search-box', + SEARCH_VISIBLE_CLASS = 'vector-header-search-toggled'; + +/** + * Binds event handlers necessary for the searchBox to disappear when the user + * clicks outside the searchBox. + * + * @param {HTMLElement} searchBox + * @param {HTMLElement} header + */ +function bindSearchBoxHandler( searchBox, header ) { + /** + * @param {Event} ev + * @ignore + */ + const clickHandler = ( ev ) => { + if ( + ev.target instanceof HTMLElement && + // Check if the click target was a suggestion link. Codex clears the + // suggestion elements from the DOM when a suggestion is clicked so we + // can't test if the suggestion is a child of the searchBox. + // + // Note: The .closest API is feature detected in `initSearchToggle`. + !ev.target.closest( '.cdx-typeahead-search .cdx-menu-item__content' ) && + !searchBox.contains( ev.target ) + ) { + header.classList.remove( SEARCH_VISIBLE_CLASS ); + + document.removeEventListener( 'click', clickHandler ); + } + }; + + document.addEventListener( 'click', clickHandler ); +} + +/** + * Binds event handlers necessary for the searchBox to show when the toggle is + * clicked. + * + * @param {HTMLElement} searchBox + * @param {HTMLElement} header + * @param {Element} searchToggle + */ +function bindToggleClickHandler( searchBox, header, searchToggle ) { + /** + * @param {Event} ev + * @ignore + */ + const handler = ( ev ) => { + // The toggle is an anchor element. Prevent the browser from navigating away + // from the page when clicked. + ev.preventDefault(); + + header.classList.add( SEARCH_VISIBLE_CLASS ); + + // Defer binding the search box handler until after the event bubbles to the + // top of the document so that the handler isn't called when the user clicks + // the search toggle. Event bubbled callbacks execute within the same task + // in the event loop. + // + // Also, defer focusing the input to another task in the event loop. At the time + // of this writing, Safari 14.0.3 has trouble changing the visibility of the + // element and focusing the input within the same task. + setTimeout( () => { + bindSearchBoxHandler( searchBox, header ); + + const searchInput = /** @type {HTMLInputElement|null} */ ( searchBox.querySelector( 'input[type="search"]' ) ); + + if ( searchInput ) { + const beforeScrollX = window.scrollX; + const beforeScrollY = window.scrollY; + searchInput.focus(); + // For some reason, Safari 14,15 tends to undesirably change the scroll + // position of `input` elements inside fixed position elements. + // While an Internet search suggests similar problems with mobile Safari + // it didn't yield any results for desktop Safari. + // This line resets any unexpected scrolling that occurred while the + // input received focus. + // If you are in the future with a modern version of Safari, where 14 and 15 + // receive a low amount of page views, please reference T297636 and test + // to see whether this line of code can be removed. + // Additionally, these lines might become unnecessary when/if Safari + // supports the `preventScroll` focus option [1] in the future: + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#parameters + if ( beforeScrollX !== undefined && beforeScrollY !== undefined ) { + window.scroll( beforeScrollX, beforeScrollY ); + } + } + } ); + }; + + searchToggle.addEventListener( 'click', handler ); +} + +/** + * Enables search toggling behavior in a header given a toggle element (e.g. + * search icon). When the toggle element is clicked, a class, + * `SEARCH_VISIBLE_CLASS`, will be applied to a header matching the selector + * `HEADER_SELECTOR` and the input inside the element, SEARCH_BOX_SELECTOR, will + * be focused. This class can be used in CSS to show/hide the necessary + * elements. When the user clicks outside of SEARCH_BOX_SELECTOR, the class will + * be removed. + * + * @param {HTMLElement|Element} searchToggle + */ +module.exports = function initSearchToggle( searchToggle ) { + const header = + /** @type {HTMLElement|null} */ ( searchToggle.closest( HEADER_SELECTOR ) ); + + if ( !header ) { + return; + } + + const searchBox = + /** @type {HTMLElement|null} */ ( header.querySelector( SEARCH_BOX_SELECTOR ) ); + + if ( !searchBox ) { + return; + } + + bindToggleClickHandler( searchBox, header, searchToggle ); +}; diff --git a/Vector/resources/skins.vector.es6/sectionObserver.js b/Vector/resources/skins.vector.es6/sectionObserver.js new file mode 100644 index 0000000..1f69f19 --- /dev/null +++ b/Vector/resources/skins.vector.es6/sectionObserver.js @@ -0,0 +1,195 @@ +/** @module SectionObserver */ + +/** + * @callback OnIntersection + * @param {HTMLElement} element The section that triggered the new intersection change. + */ + +/** + * @typedef {Object} SectionObserverProps + * @property {NodeList} elements A list of HTML elements to observe for + * intersection changes. This list can be updated through the `elements` setter. + * @property {OnIntersection} onIntersection Called when a new intersection is observed. + * @property {number} [topMargin] The number of pixels to shrink the top of + * the viewport's bounding box before calculating intersections. This is useful + * for sticky elements (e.g. sticky headers). Defaults to 0 pixels. + * @property {number} [throttleMs] The number of milliseconds that the scroll + * handler should be throttled. + */ + +/** + * @callback initSectionObserver + * @param {SectionObserverProps} props + * @return {SectionObserver} + */ + +/** + * Observe intersection changes with the viewport for one or more elements. This + * is intended to be used with the headings in the content so that the + * corresponding section(s) in the table of contents can be "activated" (e.g. + * bolded). + * + * When sectionObserver notices a new intersection change, the + * `props.onIntersection` callback will be fired with the corresponding section + * as a param. + * + * Because sectionObserver uses a scroll event listener (in combination with + * IntersectionObserver), the changes are throttled to a default maximum rate of + * 200ms so that the main thread is not excessively blocked. + * IntersectionObserver is used to asynchronously calculate the positions of the + * observed tags off the main thread and in a manner that does not cause + * expensive forced synchronous layouts. + * + * @param {SectionObserverProps} props + * @return {SectionObserver} + */ +module.exports = function sectionObserver( props ) { + props = Object.assign( { + topMargin: 0, + throttleMs: 200, + onIntersection: () => {} + }, props ); + + let /** @type {number | undefined} */ timeoutId; + let /** @type {HTMLElement | undefined} */ current; + + const observer = new IntersectionObserver( ( entries ) => { + let /** @type {IntersectionObserverEntry | undefined} */ closestNegativeEntry; + let /** @type {IntersectionObserverEntry | undefined} */ closestPositiveEntry; + const topMargin = /** @type {number} */ ( props.topMargin ); + + entries.forEach( ( entry ) => { + const top = + entry.boundingClientRect.top - topMargin; + if ( + top > 0 && + ( + closestPositiveEntry === undefined || + top < closestPositiveEntry.boundingClientRect.top - topMargin + ) + ) { + closestPositiveEntry = entry; + } + + if ( + top <= 0 && + ( + closestNegativeEntry === undefined || + top > closestNegativeEntry.boundingClientRect.top - topMargin + ) + ) { + closestNegativeEntry = entry; + } + } ); + + const closestTag = + /** @type {HTMLElement} */ ( closestNegativeEntry ? closestNegativeEntry.target : + /** @type {IntersectionObserverEntry} */ ( closestPositiveEntry ).target + ); + + // If the intersection is new, fire the `onIntersection` callback. + if ( current !== closestTag ) { + props.onIntersection( closestTag ); + } + current = closestTag; + + // When finished finding the intersecting element, stop observing all + // observed elements. The scroll event handler will be responsible for + // throttling and reobserving the elements again. Because we don't have a + // wrapper element around our content headings and their children, we can't + // rely on IntersectionObserver (which is optimized to detect intersecting + // elements *within* the viewport) to reliably fire this callback without + // this manual step. Instead, we offload the work of calculating the + // position of each element in an efficient manner to IntersectionObserver, + // but do not use it to detect when a new element has entered the viewport. + observer.disconnect(); + } ); + + /** + * Calculate the intersection of each observed element. + */ + function calcIntersection() { + // IntersectionObserver will asynchronously calculate the boundingClientRect + // of each observed element off the main thread after `observe` is called. + props.elements.forEach( ( element ) => { + if ( !element.parentNode ) { + // @ts-ignore + mw.log.warn( 'Element being observed is not in DOM', element ); + return; + } + observer.observe( /** @type {HTMLElement} */ ( element ) ); + } ); + } + + function handleScroll() { + // Throttle the scroll event handler to fire at a rate limited by `props.throttleMs`. + if ( !timeoutId ) { + timeoutId = window.setTimeout( () => { + calcIntersection(); + timeoutId = undefined; + }, props.throttleMs ); + } + } + + function bindScrollListener() { + window.addEventListener( 'scroll', handleScroll ); + } + + function unbindScrollListener() { + window.removeEventListener( 'scroll', handleScroll ); + } + + /** + * Pauses intersection observation until `resume` is called. + */ + function pause() { + unbindScrollListener(); + clearTimeout( timeoutId ); + timeoutId = undefined; + // Assume current is no longer valid while paused. + current = undefined; + } + + /** + * Resumes intersection observation. + */ + function resume() { + bindScrollListener(); + } + + /** + * Cleans up event listeners and intersection observer. Should be called when + * the observer is permanently no longer needed. + */ + function unmount() { + unbindScrollListener(); + observer.disconnect(); + } + + /** + * Set a list of HTML elements to observe for intersection changes. + * + * @param {NodeList} list + */ + function setElements( list ) { + props.elements = list; + } + + bindScrollListener(); + + /** + * @typedef {Object} SectionObserver + * @property {calcIntersection} calcIntersection + * @property {pause} pause + * @property {resume} resume + * @property {unmount} unmount + * @property {setElements} setElements + */ + return { + calcIntersection, + pause, + resume, + unmount, + setElements + }; +}; diff --git a/Vector/resources/skins.vector.es6/stickyHeader.js b/Vector/resources/skins.vector.es6/stickyHeader.js new file mode 100644 index 0000000..3321e73 --- /dev/null +++ b/Vector/resources/skins.vector.es6/stickyHeader.js @@ -0,0 +1,603 @@ +/** + * Functions and variables to implement sticky header. + */ +const + initSearchToggle = require( './searchToggle.js' ), + STICKY_HEADER_ID = 'vector-sticky-header', + STICKY_HEADER_APPENDED_ID = '-sticky-header', + STICKY_HEADER_APPENDED_PARAM = [ 'wvprov', 'sticky-header' ], + STICKY_HEADER_VISIBLE_CLASS = 'vector-sticky-header-visible', + STICKY_HEADER_USER_MENU_CONTAINER_CLASS = 'vector-sticky-header-icon-end', + FIRST_HEADING_ID = 'firstHeading', + USER_LINKS_DROPDOWN_ID = 'vector-user-links-dropdown', + ULS_STICKY_CLASS = 'uls-dialog-sticky', + ULS_HIDE_CLASS = 'uls-dialog-sticky-hide', + VECTOR_USER_LINKS_SELECTOR = '.vector-user-links', + SEARCH_TOGGLE_SELECTOR = '.vector-sticky-header-search-toggle', + STICKY_HEADER_EDIT_EXPERIMENT_NAME = 'vector.sticky_header_edit', + STICKY_HEADER_EXPERIMENT_NAME = 'vector.sticky_header'; + +/** + * Copies attribute from an element to another. + * + * @param {Element} from + * @param {Element} to + * @param {string} attribute + */ +function copyAttribute( from, to, attribute ) { + const fromAttr = from.getAttribute( attribute ); + if ( fromAttr ) { + to.setAttribute( attribute, fromAttr ); + } +} + +/** + * Show the sticky header. + */ +function show() { + document.body.classList.add( STICKY_HEADER_VISIBLE_CLASS ); + document.body.classList.remove( ULS_HIDE_CLASS ); +} + +/** + * Hide the sticky header. + */ +function hide() { + document.body.classList.remove( STICKY_HEADER_VISIBLE_CLASS ); + document.body.classList.add( ULS_HIDE_CLASS ); +} + +/** + * Copies attribute from an element to another. + * + * @param {Element} from + * @param {Element} to + */ +function copyButtonAttributes( from, to ) { + copyAttribute( from, to, 'href' ); + copyAttribute( from, to, 'title' ); +} + +/** + * Suffixes an attribute with a value that indicates it + * relates to the sticky header to support click tracking instrumentation. + * + * @param {Element} node + * @param {string} attribute + */ +function suffixStickyAttribute( node, attribute ) { + const value = node.getAttribute( attribute ); + if ( value ) { + node.setAttribute( attribute, value + STICKY_HEADER_APPENDED_ID ); + } +} + +/** + * Suffixes the href attribute of a node with a value that indicates it + * relates to the sticky header to support tracking instrumentation. + * + * Distinct from suffixStickyAttribute as it's intended to support followed + * links recording their origin. + * + * @param {Element} node + */ +function suffixStickyHref( node ) { + /* eslint-disable compat/compat */ + // @ts-ignore + const url = new URL( node.href ); + if ( url && !url.searchParams.has( STICKY_HEADER_APPENDED_PARAM[ 0 ] ) ) { + url.searchParams.append( + STICKY_HEADER_APPENDED_PARAM[ 0 ], STICKY_HEADER_APPENDED_PARAM[ 1 ] + ); + // @ts-ignore + node.href = url.toString(); + } + /* eslint-enable compat/compat */ +} + +/** + * Undoes the effect of suffixStickyHref + * + * @param {Element} node + */ +function unsuffixStickyHref( node ) { + /* eslint-disable compat/compat */ + // @ts-ignore + const url = new URL( node.href ); + url.searchParams.delete( STICKY_HEADER_APPENDED_PARAM[ 0 ] ); + // @ts-ignore + node.href = url.toString(); + /* eslint-enable compat/compat */ +} + +/** + * Makes a node trackable by our click tracking instrumentation. + * + * @param {Element} node + */ +function makeNodeTrackable( node ) { + suffixStickyAttribute( node, 'id' ); + suffixStickyAttribute( node, 'data-event-name' ); +} + +/** + * @param {Element} node + */ +function removeNode( node ) { + if ( node.parentNode ) { + node.parentNode.removeChild( node ); + } +} + +/** + * @param {NodeList} nodes + * @param {string} className + */ +function removeClassFromNodes( nodes, className ) { + Array.prototype.forEach.call( nodes, function ( node ) { + node.classList.remove( className ); + } ); +} + +/** + * @param {NodeList} nodes + */ +function removeNodes( nodes ) { + Array.prototype.forEach.call( nodes, function ( node ) { + node.parentNode.removeChild( node ); + } ); +} + +/** + * Ensures a sticky header button has the correct attributes + * + * @param {Element} watchSticky + * @param {string} status 'watched', 'unwatched', or 'temporary' + */ +function updateStickyWatchlink( watchSticky, status ) { + watchSticky.classList.toggle( 'mw-ui-icon-wikimedia-star', status === 'unwatched' ); + watchSticky.classList.toggle( 'mw-ui-icon-wikimedia-unStar', status === 'watched' ); + watchSticky.classList.toggle( 'mw-ui-icon-wikimedia-halfStar', status === 'temporary' ); + watchSticky.setAttribute( 'data-event-name', status === 'unwatched' ? 'watch-sticky-header' : 'unwatch-sticky-header' ); +} + +/** + * Callback for watchsar + * + * @param {jQuery} $link Watchstar link + * @param {boolean} isWatched The page is watched + * @param {string} [expiry] Optional expiry time + */ +function watchstarCallback( $link, isWatched, expiry ) { + updateStickyWatchlink( + // @ts-ignore + $link[ 0 ], + expiry !== 'infinity' ? 'temporary' : + isWatched ? 'watched' : 'unwatched' + ); +} + +/** + * Makes sticky header icons functional for modern Vector. + * + * @param {Element} header + * @param {Element|null} history + * @param {Element|null} talk + * @param {Element|null} subject + * @param {Element|null} watch + */ +function prepareIcons( header, history, talk, subject, watch ) { + const historySticky = header.querySelector( '#ca-history-sticky-header' ), + talkSticky = header.querySelector( '#ca-talk-sticky-header' ), + subjectSticky = header.querySelector( '#ca-subject-sticky-header' ), + watchSticky = header.querySelector( '#ca-watchstar-sticky-header' ); + + if ( !historySticky || !talkSticky || !subjectSticky || !watchSticky ) { + throw new Error( 'Sticky header has unexpected HTML' ); + } + + if ( history ) { + copyButtonAttributes( history, historySticky ); + } else { + removeNode( historySticky ); + } + + if ( talk ) { + copyButtonAttributes( talk, talkSticky ); + } else { + removeNode( talkSticky ); + } + + if ( subject ) { + copyButtonAttributes( subject, subjectSticky ); + } else { + removeNode( subjectSticky ); + } + + if ( watch && watch.parentNode instanceof Element ) { + const watchContainer = watch.parentNode; + copyButtonAttributes( watch, watchSticky ); + updateStickyWatchlink( + watchSticky, + watchContainer.classList.contains( 'mw-watchlink-temp' ) ? 'temporary' : + watchContainer.getAttribute( 'id' ) === 'ca-watch' ? 'unwatched' : 'watched' + ); + + const watchLib = require( /** @type {string} */( 'mediawiki.page.watch.ajax' ) ); + watchLib.watchstar( $( watchSticky ), mw.config.get( 'wgRelevantPageName' ), watchstarCallback ); + } else { + removeNode( watchSticky ); + } +} + +/** + * Render sticky header edit or protected page icons for modern Vector. + * + * @param {Element} header + * @param {Element|null} primaryEdit + * @param {boolean} isProtected + * @param {Element|null} secondaryEdit + * @param {Element|null} addSection + * @param {Function} disableStickyHeader function to call to disable the sticky + * header. + */ +function prepareEditIcons( + header, + primaryEdit, + isProtected, + secondaryEdit, + addSection, + disableStickyHeader +) { + const + primaryEditSticky = header.querySelector( + '#ca-ve-edit-sticky-header' + ), + protectedSticky = header.querySelector( + '#ca-viewsource-sticky-header' + ), + wikitextSticky = header.querySelector( + '#ca-edit-sticky-header' + ), + addSectionSticky = header.querySelector( + '#ca-addsection-sticky-header' + ); + + if ( addSectionSticky ) { + if ( addSection ) { + copyButtonAttributes( addSection, addSectionSticky ); + suffixStickyHref( addSectionSticky ); + } else { + removeNode( addSectionSticky ); + } + } + + // If no primary edit icon is present the feature is disabled. + if ( !primaryEditSticky || !wikitextSticky || !protectedSticky ) { + return; + } + + if ( !primaryEdit ) { + removeNode( protectedSticky ); + removeNode( wikitextSticky ); + removeNode( primaryEditSticky ); + return; + } else if ( isProtected ) { + removeNode( wikitextSticky ); + removeNode( primaryEditSticky ); + copyButtonAttributes( primaryEdit, protectedSticky ); + suffixStickyHref( protectedSticky ); + } else { + removeNode( protectedSticky ); + copyButtonAttributes( primaryEdit, primaryEditSticky ); + suffixStickyHref( primaryEditSticky ); + + primaryEditSticky.addEventListener( 'click', function ( ev ) { + const target = ev.target; + const $ve = $( primaryEdit ); + if ( target && $ve.length ) { + const event = $.Event( 'click' ); + suffixStickyHref( $ve[ 0 ] ); + $ve.trigger( event ); + unsuffixStickyHref( $ve[ 0 ] ); + // The link has been progressively enhanced. + if ( event.isDefaultPrevented() ) { + disableStickyHeader(); + ev.preventDefault(); + } + } + } ); + if ( secondaryEdit ) { + copyButtonAttributes( secondaryEdit, wikitextSticky ); + suffixStickyHref( wikitextSticky ); + wikitextSticky.addEventListener( 'click', function ( ev ) { + const target = ev.target; + if ( target ) { + const $edit = $( secondaryEdit ); + if ( $edit.length ) { + const event = $.Event( 'click' ); + suffixStickyHref( $edit[ 0 ] ); + $edit.trigger( event ); + unsuffixStickyHref( $edit[ 0 ] ); + // The link has been progressively enhanced. + if ( event.isDefaultPrevented() ) { + disableStickyHeader(); + ev.preventDefault(); + } + } + } + } ); + } else { + removeNode( wikitextSticky ); + } + } +} + +/** + * Check if element is in viewport. + * + * @param {Element} element + * @return {boolean} + */ +function isInViewport( element ) { + const rect = element.getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= ( window.innerHeight || document.documentElement.clientHeight ) && + rect.right <= ( window.innerWidth || document.documentElement.clientWidth ) + ); +} + +/** + * Add hooks for sticky header when Visual Editor is used. + * + * @param {Element} stickyIntersection intersection element + * @param {IntersectionObserver} observer + */ +function addVisualEditorHooks( stickyIntersection, observer ) { + // When Visual Editor is activated, hide the sticky header. + mw.hook( 've.activationStart' ).add( () => { + hide(); + observer.unobserve( stickyIntersection ); + } ); + + // When Visual Editor is deactivated (by clicking "Read" tab at top of page), show sticky header + // by re-triggering the observer. + mw.hook( 've.deactivationComplete' ).add( () => { + // Wait for the next repaint or we might calculate that + // sticky header should not be visible (T299114) + requestAnimationFrame( () => { + observer.observe( stickyIntersection ); + } ); + } ); + + // After saving edits, re-apply the sticky header if the target is not in the viewport. + mw.hook( 'postEdit.afterRemoval' ).add( () => { + if ( !isInViewport( stickyIntersection ) ) { + show(); + observer.observe( stickyIntersection ); + } + } ); +} + +/** + * Clones the existing user menu (excluding items added by gadgets) and adds to the sticky header + * ensuring it is not focusable and that elements are no longer collapsible (since the sticky header + * itself collapses at low resolutions) and updates click tracking event names. Also wires up the + * logout link so it works in a single click. + * + * @param {Element} userLinksDropdown + * @return {Element} cloned userLinksDropdown + */ +function prepareUserLinksDropdown( userLinksDropdown ) { + const + // Type declaration needed because of https://github.com/Microsoft/TypeScript/issues/3734#issuecomment-118934518 + userLinksDropdownClone = /** @type {Element} */( userLinksDropdown.cloneNode( true ) ), + userLinksDropdownStickyElementsWithIds = userLinksDropdownClone.querySelectorAll( '[ id ], [ data-event-name ]' ); + // Update all ids of the cloned user menu to make them unique. + makeNodeTrackable( userLinksDropdownClone ); + userLinksDropdownStickyElementsWithIds.forEach( makeNodeTrackable ); + // Remove portlet links added by gadgets using mw.util.addPortletLink, T291426 + removeNodes( userLinksDropdownClone.querySelectorAll( '.mw-list-item-js' ) ); + removeClassFromNodes( + userLinksDropdownClone.querySelectorAll( '.user-links-collapsible-item' ), + 'user-links-collapsible-item' + ); + // Prevents user menu from being focusable, T290201 + const userLinksDropdownCheckbox = userLinksDropdownClone.querySelector( 'input' ); + if ( userLinksDropdownCheckbox ) { + userLinksDropdownCheckbox.setAttribute( 'tabindex', '-1' ); + } + + // Make the logout go through the API (T324638) + const logoutLink = userLinksDropdownClone.querySelector( '#pt-logout-sticky-header a' ); + if ( logoutLink ) { + logoutLink.addEventListener( 'click', function ( ev ) { + ev.preventDefault(); + // @ts-ignore + mw.hook( 'skin.logout' ).fire( this.href ); + } ); + } + return userLinksDropdownClone; +} + +/** + * Makes sticky header functional for modern Vector. + * + * @param {Element} header + * @param {Element} userLinksDropdown + * @param {Element} userLinksDropdownStickyContainer + * @param {IntersectionObserver} stickyObserver + * @param {Element} stickyIntersection + * @param {boolean} disableEditIcons + */ +function makeStickyHeaderFunctional( + header, + userLinksDropdown, + userLinksDropdownStickyContainer, + stickyObserver, + stickyIntersection, + disableEditIcons +) { + const + userLinksDropdownStickyContainerInner = userLinksDropdownStickyContainer + .querySelector( VECTOR_USER_LINKS_SELECTOR ); + + // Clone the updated user menu to the sticky header. + if ( userLinksDropdownStickyContainerInner ) { + userLinksDropdownStickyContainerInner.appendChild( prepareUserLinksDropdown( userLinksDropdown ) ); + } + + let namespaceName = mw.config.get( 'wgCanonicalNamespace' ); + const namespaceNumber = mw.config.get( 'wgNamespaceNumber' ); + if ( namespaceNumber >= 0 && namespaceNumber % 2 === 1 ) { + // Remove '_talk' to get subject namespace + namespaceName = namespaceName.slice( 0, -5 ); + } + // Title::getNamespaceKey() + let namespaceKey = namespaceName.toLowerCase() || 'main'; + if ( namespaceKey === 'file' ) { + namespaceKey = 'image'; + } + const namespaceTabId = 'ca-nstab-' + namespaceKey; + + prepareIcons( header, + document.querySelector( '#ca-history a' ), + document.querySelector( '#ca-talk:not( .selected ) a' ), + document.querySelector( '#' + namespaceTabId + ':not( .selected ) a' ), + document.querySelector( '#ca-watch a, #ca-unwatch a' ) + ); + + const veEdit = document.querySelector( '#ca-ve-edit a' ); + const ceEdit = document.querySelector( '#ca-edit a' ); + const protectedEdit = document.querySelector( '#ca-viewsource a' ); + const isProtected = !!protectedEdit; + // For sticky header edit A/B test, conditionally remove the edit icon by setting null. + // Otherwise, use either protected, ve, or source edit (in that order). + const primaryEdit = disableEditIcons ? null : protectedEdit || veEdit || ceEdit; + const secondaryEdit = veEdit ? ceEdit : null; + const disableStickyHeader = () => { + document.body.classList.remove( STICKY_HEADER_VISIBLE_CLASS ); + stickyObserver.unobserve( stickyIntersection ); + }; + // When VectorPromoteAddTopic is set, #ca-addsection is the link itself + const addSection = document.querySelector( '#ca-addsection a' ) || document.querySelector( 'a#ca-addsection' ); + + prepareEditIcons( + header, + primaryEdit, + isProtected, + secondaryEdit, + addSection, + disableStickyHeader + ); + + stickyObserver.observe( stickyIntersection ); +} + +/** + * @param {Element} header + */ +function setupSearchIfNeeded( header ) { + const + searchToggle = header.querySelector( SEARCH_TOGGLE_SELECTOR ); + + if ( !document.body.classList.contains( 'skin-vector-search-vue' ) ) { + return; + } + + if ( searchToggle ) { + initSearchToggle( searchToggle ); + } +} + +/** + * Determines if sticky header should be visible for a given namespace. + * + * @param {number} namespaceNumber + * @return {boolean} + */ +function isAllowedNamespace( namespaceNumber ) { + // Corresponds to Main, User, Wikipedia, Template, Help, Category, Portal, Module. + const allowedNamespaceNumbers = [ 0, 2, 4, 10, 12, 14, 100, 828 ]; + // Also allow on all talk namespaces (compare NamespaceInfo::isTalk()). + const isAllowedTalk = namespaceNumber > 0 && namespaceNumber % 2 !== 0; + return isAllowedTalk || allowedNamespaceNumbers.indexOf( namespaceNumber ) > -1; +} + +/** + * Determines if sticky header should be visible for a given action. + * + * @param {string} action + * @return {boolean} + */ +function isAllowedAction( action ) { + const disallowedActions = [ 'history', 'edit' ], + hasDiffId = mw.config.get( 'wgDiffOldId' ); + return disallowedActions.indexOf( action ) < 0 && !hasDiffId; +} + +/** + * @typedef {Object} StickyHeaderProps + * @property {Element} header + * @property {Element} userLinksDropdown + * @property {IntersectionObserver} observer + * @property {Element} stickyIntersection + * @property {boolean} disableEditIcons + */ + +/** + * @param {StickyHeaderProps} props + */ +function initStickyHeader( props ) { + const userLinksDropdownStickyContainer = document.getElementsByClassName( + STICKY_HEADER_USER_MENU_CONTAINER_CLASS + )[ 0 ]; + + makeStickyHeaderFunctional( + props.header, + props.userLinksDropdown, + userLinksDropdownStickyContainer, + props.observer, + props.stickyIntersection, + props.disableEditIcons + ); + + setupSearchIfNeeded( props.header ); + addVisualEditorHooks( props.stickyIntersection, props.observer ); + + // Make sure ULS outside sticky header disables the sticky header behaviour. + // @ts-ignore + mw.hook( 'mw.uls.compact_language_links.open' ).add( function ( $trigger ) { + if ( $trigger.attr( 'id' ) !== 'p-lang-btn-sticky-header' ) { + const bodyClassList = document.body.classList; + bodyClassList.remove( ULS_HIDE_CLASS ); + bodyClassList.remove( ULS_STICKY_CLASS ); + } + } ); + + // Make sure ULS dialog is sticky. + const langBtn = props.header.querySelector( '#p-lang-btn-sticky-header' ); + if ( langBtn ) { + langBtn.addEventListener( 'click', function () { + const bodyClassList = document.body.classList; + bodyClassList.remove( ULS_HIDE_CLASS ); + bodyClassList.add( ULS_STICKY_CLASS ); + } ); + } +} + +module.exports = { + show, + hide, + prepareUserLinksDropdown, + isAllowedNamespace, + isAllowedAction, + initStickyHeader, + STICKY_HEADER_ID, + FIRST_HEADING_ID, + USER_LINKS_DROPDOWN_ID, + STICKY_HEADER_EDIT_EXPERIMENT_NAME, + STICKY_HEADER_EXPERIMENT_NAME +}; diff --git a/Vector/resources/skins.vector.es6/stickyHeaderAB.js b/Vector/resources/skins.vector.es6/stickyHeaderAB.js new file mode 100644 index 0000000..e69de29 diff --git a/Vector/resources/skins.vector.es6/tableOfContents.js b/Vector/resources/skins.vector.es6/tableOfContents.js new file mode 100644 index 0000000..31fa4cf --- /dev/null +++ b/Vector/resources/skins.vector.es6/tableOfContents.js @@ -0,0 +1,655 @@ +/** @module TableOfContents */ + +/** + * TableOfContents Mustache templates + */ +const templateTocContents = require( /** @type {string} */ ( './templates/TableOfContents__list.mustache' ) ); +const templateTocLine = require( /** @type {string} */ ( './templates/TableOfContents__line.mustache' ) ); +/** + * TableOfContents Config object for filling mustache templates + */ +const tableOfContentsConfig = require( /** @type {string} */ ( './tableOfContentsConfig.json' ) ); +const deferUntilFrame = require( './deferUntilFrame.js' ); + +const SECTION_ID_PREFIX = 'toc-'; +const SECTION_CLASS = 'vector-toc-list-item'; +const ACTIVE_SECTION_CLASS = 'vector-toc-list-item-active'; +const EXPANDED_SECTION_CLASS = 'vector-toc-list-item-expanded'; +const TOP_SECTION_CLASS = 'vector-toc-level-1'; +const ACTIVE_TOP_SECTION_CLASS = 'vector-toc-level-1-active'; +const LINK_CLASS = 'vector-toc-link'; +const TOGGLE_CLASS = 'vector-toc-toggle'; +const TOC_CONTENTS_ID = 'mw-panel-toc-list'; + +/** + * Fired when the user clicks a toc link. Note that this callback takes + * precedence over the onHashChange callback. The onHashChange callback will not + * be called when the user clicks a toc link. + * + * @callback onHeadingClick + * @param {string} id The id of the clicked list item. + */ + +/** + * Fired when the page's hash fragment has changed. Note that if the user clicks + * a link inside the TOC, the `onHeadingClick` callback will fire instead of the + * `onHashChange` callback to avoid redundant behavior. + * + * @callback onHashChange + * @param {string} id The id of the list item that corresponds to the hash change event. + */ + +/** + * @callback onToggleClick + * @param {string} id The id of the list item corresponding to the arrow. + */ + +/** + * @callback onTogglePinned + */ + +/** + * @callback tableOfContents + * @param {TableOfContentsProps} props + * @return {TableOfContents} + */ + +/** + * @typedef {Object} TableOfContentsProps + * @property {HTMLElement} container The container element for the table of contents. + * @property {onHeadingClick} onHeadingClick Called when an arrow is clicked. + * @property {onHashChange} onHashChange Called when a hash change event + * matches the id of a LINK_CLASS anchor element. + * @property {onToggleClick} [onToggleClick] Called when an arrow is clicked. + * @property {onTogglePinned} onTogglePinned Called when pinned toggle buttons are clicked. + */ + +/** + * @typedef {Object} Section + * @property {number} toclevel + * @property {string} anchor + * @property {string} line + * @property {string} number + * @property {string} index + * @property {number} byteoffset + * @property {string} fromtitle + * @property {boolean} is-parent-section + * @property {boolean} is-top-level-section + * @property {Section[]} array-sections + * @property {string} level + */ + +/** + * @typedef {Object} SectionsListData + * @property {boolean} is-vector-toc-beginning-enabled + * @property {Section[]} array-sections + * @property {boolean} vector-is-collapse-sections-enabled + * @property {string} msg-vector-toc-beginning + */ + +/** + * @typedef {Object} ArraySectionsData + * @property {number} number-section-count + * @property {Section[]} array-sections + */ + +/** + * Initializes the sidebar's Table of Contents. + * + * @param {TableOfContentsProps} props + * @return {TableOfContents} + */ +module.exports = function tableOfContents( props ) { + let /** @type {HTMLElement | undefined} */ activeTopSection; + let /** @type {HTMLElement | undefined} */ activeSubSection; + let /** @type {Array} */ expandedSections; + + /** + * @typedef {Object} activeSectionIds + * @property {string|undefined} parent - The active top level section ID + * @property {string|undefined} child - The active subsection ID + */ + + /** + * Get the ids of the active sections. + * + * @return {activeSectionIds} + */ + function getActiveSectionIds() { + return { + parent: ( activeTopSection ) ? activeTopSection.id : undefined, + child: ( activeSubSection ) ? activeSubSection.id : undefined + }; + } + + /** + * Does the user prefer reduced motion? + * + * @return {boolean} + */ + const prefersReducedMotion = () => { + return window.matchMedia( '(prefers-reduced-motion: reduce)' ).matches; + }; + + /** + * Sets an `ACTIVE_SECTION_CLASS` on the element with an id that matches `id`. + * Sets an `ACTIVE_TOP_SECTION_CLASS` on the top level heading (e.g. element with the + * `TOP_SECTION_CLASS`). + * If the element is a top level heading, the element will have both classes. + * + * @param {string} id The id of the element to be activated in the Table of Contents. + */ + function activateSection( id ) { + const selectedTocSection = document.getElementById( id ); + const { + parent: previousActiveTopId, + child: previousActiveSubSectionId + } = getActiveSectionIds(); + + if ( + !selectedTocSection || + ( previousActiveTopId === id ) || + ( previousActiveSubSectionId === id ) + ) { + return; + } + + // Assign the active top and sub sections, apply classes + activeTopSection = /** @type {HTMLElement|undefined} */ ( selectedTocSection.closest( `.${TOP_SECTION_CLASS}` ) ); + if ( activeTopSection ) { + // T328089 Sometimes activeTopSection is null + activeTopSection.classList.add( ACTIVE_TOP_SECTION_CLASS ); + } + activeSubSection = selectedTocSection; + activeSubSection.classList.add( ACTIVE_SECTION_CLASS ); + } + + /** + * Removes the `ACTIVE_SECTION_CLASS` from all ToC sections. + * + */ + function deactivateSections() { + if ( activeSubSection ) { + activeSubSection.classList.remove( ACTIVE_SECTION_CLASS ); + activeSubSection = undefined; + } + if ( activeTopSection ) { + activeTopSection.classList.remove( ACTIVE_TOP_SECTION_CLASS ); + activeTopSection = undefined; + } + } + + /** + * Scroll active section into view if necessary + * + * @param {string} id The id of the element to be scrolled to in the Table of Contents. + */ + function scrollToActiveSection( id ) { + const section = document.getElementById( id ); + if ( !section ) { + return; + } + + // Get currently visible active link + let link = section.firstElementChild; + // @ts-ignore + if ( link && !link.offsetParent ) { + // If active link is a hidden subsection, use active parent link + const { parent: activeTopId } = getActiveSectionIds(); + const parentSection = document.getElementById( activeTopId || '' ); + if ( parentSection ) { + link = parentSection.firstElementChild; + } else { + link = null; + } + } + + const isContainerScrollable = props.container.scrollHeight > props.container.clientHeight; + if ( link && isContainerScrollable ) { + const containerRect = props.container.getBoundingClientRect(); + const linkRect = link.getBoundingClientRect(); + + // Pixels above or below the TOC where we start scrolling the active section into view + const hiddenThreshold = 100; + const midpoint = ( containerRect.bottom - containerRect.top ) / 2; + const linkHiddenTopValue = containerRect.top - linkRect.top; + // Because the bottom of the TOC can extend below the viewport, + // min() is used to find the value where the active section first becomes hidden + const linkHiddenBottomValue = linkRect.bottom - + Math.min( containerRect.bottom, window.innerHeight ); + + // Respect 'prefers-reduced-motion' user preference + const scrollBehavior = prefersReducedMotion() ? 'smooth' : undefined; + + // Manually increment and decrement TOC scroll rather than using scrollToView + // in order to account for threshold + if ( linkHiddenTopValue + hiddenThreshold > 0 ) { + props.container.scrollTo( { + top: props.container.scrollTop - linkHiddenTopValue - midpoint, + behavior: scrollBehavior + } ); + } + if ( linkHiddenBottomValue + hiddenThreshold > 0 ) { + props.container.scrollTo( { + top: props.container.scrollTop + linkHiddenBottomValue + midpoint, + behavior: scrollBehavior + } ); + } + } + } + + /** + * Adds the `EXPANDED_SECTION_CLASS` CSS class name + * to a top level heading in the ToC. + * + * @param {string} id + */ + function expandSection( id ) { + const tocSection = document.getElementById( id ); + + if ( !tocSection ) { + return; + } + + const topSection = /** @type {HTMLElement} */ ( tocSection.closest( `.${TOP_SECTION_CLASS}` ) ); + const toggle = topSection.querySelector( `.${TOGGLE_CLASS}` ); + + if ( topSection && toggle && expandedSections.indexOf( topSection ) < 0 ) { + toggle.setAttribute( 'aria-expanded', 'true' ); + topSection.classList.add( EXPANDED_SECTION_CLASS ); + expandedSections.push( topSection ); + } + } + + /** + * Get the IDs of expanded sections. + * + * @return {Array} + */ + function getExpandedSectionIds() { + return expandedSections.map( ( s ) => s.id ); + } + + /** + * + * @param {string} id + */ + function changeActiveSection( id ) { + + const { parent: activeParentId, child: activeChildId } = getActiveSectionIds(); + + if ( id === activeParentId && id === activeChildId ) { + return; + } else { + deactivateSections(); + activateSection( id ); + scrollToActiveSection( id ); + } + } + + /** + * @param {string} id + * @return {boolean} + */ + function isTopLevelSection( id ) { + const section = document.getElementById( id ); + return !!section && section.classList.contains( TOP_SECTION_CLASS ); + } + + /** + * Removes all `EXPANDED_SECTION_CLASS` CSS class names + * from the top level sections in the ToC. + * + * @param {Array} [selectedIds] + */ + function collapseSections( selectedIds ) { + const sectionIdsToCollapse = selectedIds || getExpandedSectionIds(); + expandedSections = expandedSections.filter( function ( section ) { + const isSelected = sectionIdsToCollapse.indexOf( section.id ) > -1; + const toggle = isSelected ? section.getElementsByClassName( TOGGLE_CLASS ) : undefined; + if ( isSelected && toggle && toggle.length > 0 ) { + toggle[ 0 ].setAttribute( 'aria-expanded', 'false' ); + section.classList.remove( EXPANDED_SECTION_CLASS ); + return false; + } + return true; + } ); + } + + /** + * @param {string} id + */ + function toggleExpandSection( id ) { + const expandedSectionIds = getExpandedSectionIds(); + const indexOfExpandedSectionId = expandedSectionIds.indexOf( id ); + if ( isTopLevelSection( id ) ) { + if ( indexOfExpandedSectionId >= 0 ) { + collapseSections( [ id ] ); + } else { + expandSection( id ); + } + } + } + + /** + * Set aria-expanded attribute for all toggle buttons. + */ + function initializeExpandedStatus() { + const parentSections = props.container.querySelectorAll( `.${TOP_SECTION_CLASS}` ); + parentSections.forEach( ( section ) => { + const expanded = section.classList.contains( EXPANDED_SECTION_CLASS ); + const toggle = section.querySelector( `.${TOGGLE_CLASS}` ); + if ( toggle ) { + toggle.setAttribute( 'aria-expanded', expanded.toString() ); + } + } ); + } + + /** + * Event handler for hash change event. + */ + function handleHashChange() { + const hash = location.hash.slice( 1 ); + const listItem = + // @ts-ignore + /** @type {HTMLElement|null} */ ( mw.util.getTargetFromFragment( `${SECTION_ID_PREFIX}${hash}` ) ); + + if ( !listItem ) { + return; + } + + expandSection( listItem.id ); + changeActiveSection( listItem.id ); + + props.onHashChange( listItem.id ); + } + + /** + * Bind event listener for hash change events that match the hash of + * LINK_CLASS. + * + * Note that if the user clicks a link inside the TOC, the onHeadingClick + * callback will fire instead of the onHashChange callback, since it takes + * precedence. + */ + function bindHashChangeListener() { + window.addEventListener( 'hashchange', handleHashChange ); + } + + /** + * Unbinds event listener for hash change events. + */ + function unbindHashChangeListener() { + window.removeEventListener( 'hashchange', handleHashChange ); + } + + /** + * Bind event listener for clicking on show/hide Table of Contents links. + */ + function bindPinnedToggleListeners() { + const toggleButtons = document.querySelectorAll( '.vector-toc-pinnable-header button' ); + toggleButtons.forEach( function ( btn ) { + btn.addEventListener( 'click', () => { + props.onTogglePinned(); + } ); + } ); + } + + /** + * Bind event listeners for clicking on section headings and toggle buttons. + */ + function bindSubsectionToggleListeners() { + props.container.addEventListener( 'click', function ( e ) { + if ( + !( e.target instanceof HTMLElement ) + ) { + return; + } + + const tocSection = + /** @type {HTMLElement | null} */ ( e.target.closest( `.${SECTION_CLASS}` ) ); + + if ( tocSection && tocSection.id ) { + // In case section link contains HTML, + // test if click occurs on any child elements. + if ( e.target.closest( `.${LINK_CLASS}` ) ) { + // Temporarily unbind the hash change listener to avoid redundant + // behavior caused by firing both the onHeadingClick callback and the + // onHashChange callback. Instead, only fire the onHeadingClick + // callback. + unbindHashChangeListener(); + + expandSection( tocSection.id ); + changeActiveSection( tocSection.id ); + props.onHeadingClick( tocSection.id ); + + deferUntilFrame( () => { + bindHashChangeListener(); + }, 3 ); + } + // Toggle button does not contain child elements, + // so classList check will suffice. + if ( e.target.classList.contains( TOGGLE_CLASS ) ) { + toggleExpandSection( tocSection.id ); + if ( props.onToggleClick ) { + props.onToggleClick( tocSection.id ); + } + } + } + + } ); + } + + /** + * Binds event listeners and sets the default state of the component. + */ + function initialize() { + // Sync component state to the default rendered state of the table of contents. + expandedSections = Array.from( + props.container.querySelectorAll( `.${EXPANDED_SECTION_CLASS}` ) + ); + + // Initialize toggle buttons aria-expanded attribute. + initializeExpandedStatus(); + + // Bind event listeners. + bindSubsectionToggleListeners(); + bindPinnedToggleListeners(); + bindHashChangeListener(); + } + + /** + * Reexpands all sections that were expanded before the table of contents was reloaded. + * Edited Sections are not reexpanded, as the ID of the edited section is changed after reload. + */ + function reExpandSections() { + initializeExpandedStatus(); + const expandedSectionIds = getExpandedSectionIds(); + for ( const id of expandedSectionIds ) { + expandSection( id ); + } + } + + /** + * Updates button styling for the TOC toggle button when scrolled below the page title + * + * @param {boolean} scrollBelow + * + */ + function updateTocToggleStyles( scrollBelow ) { + const TOC_TITLEBAR_TOGGLE_ID = 'vector-page-titlebar-toc-label'; + const QUIET_BUTTON_CLASS = 'mw-ui-quiet'; + const tocToggle = document.getElementById( TOC_TITLEBAR_TOGGLE_ID ); + if ( tocToggle ) { + if ( scrollBelow ) { + tocToggle.classList.remove( QUIET_BUTTON_CLASS ); + } else { + tocToggle.classList.add( QUIET_BUTTON_CLASS ); + } + } + } + + /** + * Reloads the table of contents from saved data + * + * @param {Section[]} sections + * @return {Promise} + */ + function reloadTableOfContents( sections ) { + if ( sections.length < 1 ) { + reloadPartialHTML( TOC_CONTENTS_ID, '' ); + return Promise.resolve( [] ); + } + const load = () => mw.loader.using( 'mediawiki.template.mustache' ).then( () => { + const { parent: activeParentId, child: activeChildId } = getActiveSectionIds(); + reloadPartialHTML( TOC_CONTENTS_ID, getTableOfContentsHTML( sections ) ); + // Reexpand sections that were expanded before the table of contents was reloaded. + reExpandSections(); + // reActivate the active sections + deactivateSections(); + if ( activeParentId ) { + activateSection( activeParentId ); + } + if ( activeChildId ) { + activateSection( activeChildId ); + } + } ); + return new Promise( ( resolve ) => { + load().then( () => { + resolve( sections ); + } ); + } ); + } + + /** + * Replaces the contents of the given element with the given HTML + * + * @param {string} elementId + * @param {string} html + */ + function reloadPartialHTML( elementId, html ) { + const htmlElement = document.getElementById( elementId ); + if ( htmlElement && html ) { + htmlElement.innerHTML = html; + } + } + + /** + * Generates the HTML for the table of contents. + * + * @param {Section[]} sections + * @return {string} + */ + function getTableOfContentsHTML( sections ) { + return getTableOfContentsListHtml( getTableOfContentsData( sections ) ); + } + + /** + * Generates the table of contents List HTML from the templates + * + * @param {Object} data + * @return {string} + */ + function getTableOfContentsListHtml( data ) { + // @ts-ignore + const mustacheCompiler = mw.template.getCompiler( 'mustache' ); + const compiledTemplateTocContents = mustacheCompiler.compile( templateTocContents ); + + // Identifier 'TableOfContents__line' is not in camel case + // (template name is 'TableOfContents__line') + const partials = { + // eslint-disable-next-line camelcase + TableOfContents__line: mustacheCompiler.compile( templateTocLine ) + }; + + return compiledTemplateTocContents.render( data, partials ).html(); + } + + /** + * @param {Section[]} sections + * @return {SectionsListData} + */ + function getTableOfContentsData( sections ) { + return { + 'msg-vector-toc-beginning': mw.message( 'vector-toc-beginning' ).text(), + 'array-sections': getTableOfContentsSectionsData( sections, 1 ), + 'vector-is-collapse-sections-enabled': sections.length >= tableOfContentsConfig.VectorTableOfContentsCollapseAtCount, + 'is-vector-toc-beginning-enabled': tableOfContentsConfig.VectorTableOfContentsBeginning + }; + } + + /** + * Prepares the data for rendering the table of contents, + * nesting child sections within their parent sections. + * This should yield the same result as the php function + * VectorComponentTableOfContents::getTemplateData(), + * please make sure to keep them in sync. + * + * @param {Section[]} sections + * @param {number} toclevel + * @return {Section[]} + */ + function getTableOfContentsSectionsData( sections, toclevel = 1 ) { + const data = []; + for ( let i = 0; i < sections.length; i++ ) { + const section = sections[ i ]; + if ( section.toclevel === toclevel ) { + const childSections = getTableOfContentsSectionsData( + sections.slice( i + 1 ), + toclevel + 1 + ); + section[ 'array-sections' ] = childSections; + section[ 'is-top-level-section' ] = toclevel === 1; + section[ 'is-parent-section' ] = Object.keys( childSections ).length > 0; + data.push( section ); + } + // Child section belongs to a higher parent. + if ( section.toclevel < toclevel ) { + return data; + } + } + + return data; + } + + /** + * Cleans up the hash change event listener to prevent memory leaks. This + * should be called when the table of contents is permanently no longer + * needed. + * + * @ignore + */ + function unmount() { + unbindHashChangeListener(); + } + + initialize(); + + /** + * @typedef {Object} TableOfContents + * @property {reloadTableOfContents} reloadTableOfContents + * @property {changeActiveSection} changeActiveSection + * @property {expandSection} expandSection + * @property {toggleExpandSection} toggleExpandSection + * @property {updateTocToggleStyles} updateTocToggleStyles + * @property {unmount} unmount + * @property {string} ACTIVE_SECTION_CLASS + * @property {string} ACTIVE_TOP_SECTION_CLASS + * @property {string} EXPANDED_SECTION_CLASS + * @property {string} LINK_CLASS + * @property {string} TOGGLE_CLASS + */ + return { + reloadTableOfContents, + expandSection, + changeActiveSection, + toggleExpandSection, + updateTocToggleStyles, + unmount, + ACTIVE_SECTION_CLASS, + ACTIVE_TOP_SECTION_CLASS, + EXPANDED_SECTION_CLASS, + LINK_CLASS, + TOGGLE_CLASS + }; +}; diff --git a/Vector/resources/skins.vector.es6/tableOfContentsConfig.json b/Vector/resources/skins.vector.es6/tableOfContentsConfig.json new file mode 100644 index 0000000..93e6fc1 --- /dev/null +++ b/Vector/resources/skins.vector.es6/tableOfContentsConfig.json @@ -0,0 +1,5 @@ +{ + "@doc": "This is a virtual JSON generated by ResourceLoader. This file is used by Jest.", + "VectorTableOfContentsCollapseAtCount": 20, + "VectorTableOfContentsBeginning": true +} diff --git a/Vector/resources/skins.vector.js/checkbox.js b/Vector/resources/skins.vector.js/checkbox.js new file mode 100644 index 0000000..d7868c4 --- /dev/null +++ b/Vector/resources/skins.vector.js/checkbox.js @@ -0,0 +1,124 @@ +/** + * JavaScript enhancement for Vector specific checkbox hacks + * + * Most checkbox hacks use core JS for progressive enhancements (i.e. dropdownMenus.js), + * However the main menu and collapsible TOC use a variation of the checkbox hack + * that requires their own JS for enhancements. + * + */ + +/** @interface MwApiConstructor */ +/** @interface CheckboxHack */ + +var checkboxHack = /** @type {CheckboxHack} */ require( /** @type {string} */( 'mediawiki.page.ready' ) ).checkboxHack; + +/** + * Revise the button's `aria-expanded` state to match the checked state. + * + * @param {HTMLInputElement} checkbox + * @param {HTMLElement} button + * @return {void} + * @ignore + */ +function updateAriaExpanded( checkbox, button ) { + button.setAttribute( 'aria-expanded', checkbox.checked.toString() ); +} + +/** + * Update the `aria-expanded` attribute based on checkbox state (target visibility) changes. + * + * @param {HTMLInputElement} checkbox + * @param {HTMLElement} button + * @return {function(): void} Cleanup function that removes the added event listeners. + * @ignore + */ +function bindUpdateAriaExpandedOnInput( checkbox, button ) { + var listener = updateAriaExpanded.bind( undefined, checkbox, button ); + // Whenever the checkbox state changes, update the `aria-expanded` state. + checkbox.addEventListener( 'input', listener ); + + return function () { + checkbox.removeEventListener( 'input', listener ); + }; +} + +/** + * Manually change the checkbox state when the button is focused and SPACE is pressed. + * + * @param {HTMLElement} button + * @return {function(): void} Cleanup function that removes the added event listeners. + * @ignore + */ +function bindToggleOnSpaceEnter( button ) { + function isEnterOrSpace( /** @type {KeyboardEvent} */ event ) { + return event.key === ' ' || event.key === 'Enter'; + } + + function onKeydown( /** @type {KeyboardEvent} */ event ) { + // Only handle SPACE and ENTER. + if ( !isEnterOrSpace( event ) ) { + return; + } + // Prevent the browser from scrolling when pressing space. The browser will + // try to do this unless the "button" element is a button or a checkbox. + // Depending on the actual "button" element, this also possibly prevents a + // native click event from being triggered so we programatically trigger a + // click event in the keyup handler. + event.preventDefault(); + } + + function onKeyup( /** @type {KeyboardEvent} */ event ) { + // Only handle SPACE and ENTER. + if ( !isEnterOrSpace( event ) ) { + return; + } + + // A native button element triggers a click event when the space or enter + // keys are pressed. Since the passed in "button" may or may not be a + // button, programmatically trigger a click event to make it act like a + // button. + button.click(); + } + + button.addEventListener( 'keydown', onKeydown ); + button.addEventListener( 'keyup', onKeyup ); + + return function () { + button.removeEventListener( 'keydown', onKeydown ); + button.removeEventListener( 'keyup', onKeyup ); + }; +} + +/** + * Improve the interactivity of the main menu by binding checkbox hack enhancements. + * + * @param {HTMLElement|null} checkbox + * @param {HTMLElement|null} button + * @param {HTMLElement|null} target + * @return {void} + */ +function initMainMenu( checkbox, button, target ) { + if ( checkbox instanceof HTMLInputElement && button && target ) { + checkboxHack.bindToggleOnClick( checkbox, button ); + bindUpdateAriaExpandedOnInput( checkbox, button ); + updateAriaExpanded( checkbox, button ); + bindToggleOnSpaceEnter( button ); + } +} + +/** + * Initialize main menu and collapsed TOC enhancements. + * + * @param {Document} document + */ +function init( document ) { + initMainMenu( + document.getElementById( 'mw-sidebar-checkbox' ), + document.getElementById( 'mw-sidebar-button' ), + document.getElementById( 'mw-navigation' ) + ); +} + +module.exports = { + init: init +}; diff --git a/Vector/resources/skins.vector.js/dropdownMenus.js b/Vector/resources/skins.vector.js/dropdownMenus.js new file mode 100644 index 0000000..bbcce43 --- /dev/null +++ b/Vector/resources/skins.vector.js/dropdownMenus.js @@ -0,0 +1,171 @@ +/** @interface CheckboxHack */ + +var + checkboxHack = /** @type {CheckboxHack} */ require( /** @type {string} */( 'mediawiki.page.ready' ) ).checkboxHack, + CHECKBOX_HACK_CONTAINER_SELECTOR = '.vector-menu-dropdown', + CHECKBOX_HACK_CHECKBOX_SELECTOR = '.vector-menu-checkbox', + CHECKBOX_HACK_BUTTON_SELECTOR = '.vector-menu-heading', + CHECKBOX_HACK_TARGET_SELECTOR = '.vector-menu-content'; + +/** + * Enhance dropdownMenu functionality and accessibility using core's checkboxHack. + */ +function bind() { + // Search for all dropdown containers using the CHECKBOX_HACK_CONTAINER_SELECTOR. + var containers = document.querySelectorAll( CHECKBOX_HACK_CONTAINER_SELECTOR ); + + Array.prototype.forEach.call( containers, function ( container ) { + var + checkbox = container.querySelector( CHECKBOX_HACK_CHECKBOX_SELECTOR ), + button = container.querySelector( CHECKBOX_HACK_BUTTON_SELECTOR ), + target = container.querySelector( CHECKBOX_HACK_TARGET_SELECTOR ); + + if ( !( checkbox && button && target ) ) { + return; + } + + checkboxHack.bind( window, checkbox, button, target ); + } ); +} + +/** + * Create an icon element to be appended inside the anchor tag. + * + * @param {HTMLElement|null} menuElement + * @param {HTMLElement|null} parentElement + * @param {string|null} id + * + * @return {HTMLElement|undefined} + */ +function createIconElement( menuElement, parentElement, id ) { + // Only the p-personal menu in the user links dropdown supports icons + var isIconCapable = menuElement && + [ + 'p-personal', + 'p-personal-sticky-header' + ].indexOf( menuElement.getAttribute( 'id' ) || 'p-unknown' ) > -1; + + if ( !isIconCapable || !parentElement ) { + return; + } + + var iconElement = document.createElement( 'span' ); + iconElement.classList.add( 'mw-ui-icon' ); + + if ( id ) { + // The following class allows gadgets developers to style or hide an icon. + // * mw-ui-icon-vector-gadget- + // The class is considered stable and should not be removed without + // a #user-notice. + iconElement.classList.add( 'mw-ui-icon-vector-gadget-' + id ); + } + + return iconElement; +} + +/** + * Calculate the available width for adding links in the veiws menu, + * i.e. the remaining space in the toolbar between the right-navigation + * and left-navigation elements. + * + * @return {number} remaining available pixels in page toolbar or Zero + * if remaining space is negative. + */ +function getAvailableViewMenuWidth() { + var + // Vector toolbar containing namespace, views, more menu etc. + toolbar = document.querySelector( '.vector-page-toolbar-container' ), + // Assumes all left-side menus are wrapped in a single nav element. + // Need to get child width since this node is flex-grow: 1; + leftToolbarItems = document.querySelector( '#left-navigation > nav' ), + // Right side elements are flex-grow:0 so top-level width is sufficient. + rightToolbarItems = document.getElementById( 'right-navigation' ); + + // Views menu collapses into "more" menu at this resolution. + // Move the link from views to actions menu in this situation. + if ( window.innerWidth < 720 ) { + return 0; + } + + // If any of our assumption about the DOM are wrong, return 0 + // in order to place the link in a known menu instead. + if ( !( toolbar && leftToolbarItems && rightToolbarItems ) ) { + return 0; + } + + // returning zero instead of negative number makes boolean conversion easier. + return Math.max( 0, + toolbar.clientWidth - leftToolbarItems.clientWidth - rightToolbarItems.clientWidth + ); +} + +var /** @type {Array} */handledLinks = []; + +/** + * Adds icon placeholder for gadgets to use. + * + * @typedef {Object} PortletLinkData + * @property {string|null} id + */ +/** + * @param {HTMLElement} item + * @param {PortletLinkData} data + */ +function addPortletLinkHandler( item, data ) { + var + link, + $menu, + menuElement, + linkIsHandled = handledLinks.indexOf( item ), + iconElement; + + if ( linkIsHandled >= 0 ) { + return; + } else { + handledLinks.push( item ); + } + + // assign variables after early return. + link = item.querySelector( 'a' ); + $menu = $( item ).parents( '.vector-menu' ); + menuElement = $menu.length && $menu.get( 0 ) || null; + + if ( data.id ) { + iconElement = createIconElement( menuElement, link, data.id ); + } + + // The views menu has limited space so we need to decide whether there is space + // to accommodate the new item and if not to redirect to the more dropdown. + if ( $menu.prop( 'id' ) === 'p-views' ) { + var availableWidth = getAvailableViewMenuWidth(); + var moreDropdown = document.querySelector( '#p-cactions ul' ); + + if ( moreDropdown && !availableWidth ) { + moreDropdown.appendChild( item ); + // reveal if hidden + mw.util.showPortlet( 'p-cactions' ); + } + } + + // Check link.prepend exists for older browser since this is ES5 code + if ( link && iconElement && link.prepend ) { + link.prepend( iconElement ); + } +} + +// Enhance previously added items. +Array.prototype.forEach.call( + document.querySelectorAll( '.mw-list-item-js' ), + function ( item ) { + addPortletLinkHandler( item, { + id: item.getAttribute( 'id' ) + } ); + } +); + +mw.hook( 'util.addPortletLink' ).add( addPortletLinkHandler ); + +module.exports = { + dropdownMenus: function dropdownMenus() { bind(); }, + addPortletLinkHandler: addPortletLinkHandler +}; diff --git a/Vector/resources/skins.vector.js/echo.js b/Vector/resources/skins.vector.js/echo.js new file mode 100644 index 0000000..84d4149 --- /dev/null +++ b/Vector/resources/skins.vector.js/echo.js @@ -0,0 +1,26 @@ +/** + * Upgrades Echo for icon consistency. + * Undos work inside Echo to replace our button. + */ +function init() { + if ( document.querySelectorAll( '#pt-notifications-alert a, #pt-notifications-notice a' ).length !== 2 ) { + return; + } + + // @ts-ignore + mw.hook( 'ext.echo.NotificationBadgeWidget.onInitialize' ).add( function ( badge ) { + var $element = badge.$element; + $element.addClass( 'mw-list-item' ); + + var iconButtonClasses = 'mw-ui-button mw-ui-quiet mw-ui-icon mw-ui-icon-element '; + if ( $element.attr( 'id' ) === 'pt-notifications-alert' ) { + $element.children( 'a' ).addClass( iconButtonClasses + 'mw-ui-icon-bell' ); + $element.children( 'a' ).removeClass( 'oo-ui-icon-bell' ); + } + if ( $element.attr( 'id' ) === 'pt-notifications-notice' ) { + $element.children( 'a' ).addClass( iconButtonClasses + 'mw-ui-icon-tray' ); + $element.children( 'a' ).removeClass( 'oo-ui-icon-tray' ); + } + } ); +} +module.exports = init; diff --git a/Vector/resources/skins.vector.js/languageButton.js b/Vector/resources/skins.vector.js/languageButton.js new file mode 100644 index 0000000..a7c3a83 --- /dev/null +++ b/Vector/resources/skins.vector.js/languageButton.js @@ -0,0 +1,27 @@ +/** + * Copies interwiki links to main menu + * + * Temporary solution to T287206, can be removed when the new ULS built in Vue.js + * has been released and contains this + */ +function addInterwikiLinkToMainMenu() { + // eslint-disable-next-line no-jquery/no-global-selector + var $editLink = $( '#p-lang-btn .wbc-editpage' ); + if ( $editLink.length ) { + // Use title attribute for link text + $editLink.text( $editLink.attr( 'title' ) || '' ); + var $li = $( '
    • ' ) + // If the Wikibase code runs last, this class is required so it matches the selector @: + // https://gerrit.wikimedia.org/g/mediawiki/extensions/Wikibase/+/f2e96e1b08fc5ae2e2e92f05d5eda137dc6b1bc8/client/resources/wikibase.client.linkitem.init.js#82 + .addClass( 'wb-langlinks-link mw-list-item' ) + .append( $editLink ); + $li.appendTo( '#p-tb ul' ); + } +} + +/** + * Initialize the language button. + */ +module.exports = function () { + addInterwikiLinkToMainMenu(); +}; diff --git a/Vector/resources/skins.vector.js/menuTabs.js b/Vector/resources/skins.vector.js/menuTabs.js new file mode 100644 index 0000000..37dcd53 --- /dev/null +++ b/Vector/resources/skins.vector.js/menuTabs.js @@ -0,0 +1,40 @@ +var + TABS_SELECTOR = '.vector-menu-tabs', + LIST_ITEM_JS_SELECTOR = '.mw-list-item-js', + NO_ICON_CLASS = 'vector-tab-noicon'; + +/** + * T320691: Add a `.vector-tab-noicon` class to any tabbed menu item that is + * added by a gadget so that the menu item has the correct padding and margin. + * + * @param {HTMLElement} item + */ +function addNoIconClass( item ) { + item.classList.add( NO_ICON_CLASS ); +} + +function init() { + // Feature detect whether the `.closest` api is supported. If not, return early. + if ( !document.body.closest ) { + return; + } + + // Enhance previously added items. + Array.prototype.forEach.call( + document.querySelectorAll( TABS_SELECTOR + ' ' + LIST_ITEM_JS_SELECTOR ), + addNoIconClass + ); + + mw.hook( 'util.addPortletLink' ).add( + /** + * @param {HTMLElement} item + */ + function ( item ) { + // Check if this menu item belongs to a tabs menu. + if ( item.closest( TABS_SELECTOR ) ) { + addNoIconClass( item ); + } + } ); +} + +module.exports = init; diff --git a/Vector/resources/skins.vector.js/searchLoader.js b/Vector/resources/skins.vector.js/searchLoader.js new file mode 100644 index 0000000..ef05297 --- /dev/null +++ b/Vector/resources/skins.vector.js/searchLoader.js @@ -0,0 +1,197 @@ +/** + * Disabling this rule as it's only necessary for + * combining multiple class names and documenting the output. + * That doesn't happen in this file but the linter still throws an error. + * https://github.com/wikimedia/eslint-plugin-mediawiki/blob/master/docs/rules/class-doc.md + */ + +/** @interface VectorResourceLoaderVirtualConfig */ +/** @interface MediaWikiPageReadyModule */ + +var /** @type {VectorResourceLoaderVirtualConfig} */ + config = require( /** @type {string} */ ( './config.json' ) ), + // T251544: Collect search performance metrics to compare Vue search with + // mediawiki.searchSuggest performance. + CAN_TEST_SEARCH = !!( + window.performance && + /* eslint-disable compat/compat */ + // @ts-ignore + performance.mark && + // @ts-ignore + performance.measure && + performance.getEntriesByName ), + /* eslint-enable compat/compat */ + LOAD_START_MARK = 'mwVectorVueSearchLoadStart', + LOAD_END_MARK = 'mwVectorVueSearchLoadEnd', + LOAD_MEASURE = 'mwVectorVueSearchLoadStartToLoadEnd', + SEARCH_LOADING_CLASS = 'search-form__loader'; + +/** + * Loads the search module via `mw.loader.using` on the element's + * focus event. Or, if the element is already focused, loads the + * search module immediately. + * After the search module is loaded, executes a function to remove + * the loading indicator. + * + * @param {Element} element search input. + * @param {string} moduleName resourceLoader module to load. + * @param {string|null} startMarker + * @param {null|function(): void} afterLoadFn function to execute after search module loads. + */ +function loadSearchModule( element, moduleName, startMarker, afterLoadFn ) { + var SHOULD_TEST_SEARCH = CAN_TEST_SEARCH && + moduleName === 'skins.vector.search'; + + function requestSearchModule() { + if ( SHOULD_TEST_SEARCH && startMarker !== null && afterLoadFn !== null ) { + performance.mark( startMarker ); + mw.loader.using( moduleName, afterLoadFn ); + } else { + mw.loader.load( moduleName ); + } + element.removeEventListener( 'focus', requestSearchModule ); + } + + if ( document.activeElement === element ) { + requestSearchModule(); + } else { + element.addEventListener( 'focus', requestSearchModule ); + } +} + +/** + * Event callback that shows or hides the loading indicator based on the event type. + * The loading indicator states are: + * 1. Show on input event (while user is typing) + * 2. Hide on focusout event (when user removes focus from the input ) + * 3. Show when input is focused, if it contains a query. (in case user re-focuses on input) + * + * @param {Event} event + */ +function renderSearchLoadingIndicator( event ) { + + var form = /** @type {HTMLElement} */ ( event.currentTarget ), + input = /** @type {HTMLInputElement} */ ( event.target ); + + if ( + !( event.currentTarget instanceof HTMLElement ) || + !( event.target instanceof HTMLInputElement ) + ) { + return; + } + + if ( !form.dataset.loadingMsg ) { + form.dataset.loadingMsg = mw.msg( 'vector-search-loader' ); + } + + if ( event.type === 'input' ) { + form.classList.add( SEARCH_LOADING_CLASS ); + + } else if ( event.type === 'focusout' ) { + form.classList.remove( SEARCH_LOADING_CLASS ); + + } else if ( event.type === 'focusin' && input.value.trim() ) { + form.classList.add( SEARCH_LOADING_CLASS ); + } +} + +/** + * Attaches or detaches the event listeners responsible for activating + * the loading indicator. + * + * @param {Element} element + * @param {boolean} attach + * @param {function(Event): void} eventCallback + */ +function setLoadingIndicatorListeners( element, attach, eventCallback ) { + + /** @type { "addEventListener" | "removeEventListener" } */ + var addOrRemoveListener = ( attach ? 'addEventListener' : 'removeEventListener' ); + + [ 'input', 'focusin', 'focusout' ].forEach( function ( eventType ) { + element[ addOrRemoveListener ]( eventType, eventCallback ); + } ); + + if ( !attach ) { + element.classList.remove( SEARCH_LOADING_CLASS ); + } +} + +/** + * Marks when the lazy load has completed. + * + * @param {string} startMarker + * @param {string} endMarker + * @param {string} measureMarker + */ +function markLoadEnd( startMarker, endMarker, measureMarker ) { + if ( performance.getEntriesByName( startMarker ).length ) { + performance.mark( endMarker ); + performance.measure( measureMarker, startMarker, endMarker ); + } +} + +/** + * Initialize the loading of the search module as well as the loading indicator. + * Only initialize the loading indicator when not using the core search module. + * + * @param {Document} document + */ +function initSearchLoader( document ) { + var searchBoxes = document.querySelectorAll( '.vector-search-box' ); + + // Allow developers to defined $wgVectorSearchApiUrl in LocalSettings to target different APIs + if ( config.wgVectorSearchApiUrl ) { + mw.config.set( 'wgVectorSearchApiUrl', config.wgVectorSearchApiUrl ); + } + + if ( !searchBoxes.length ) { + return; + } + + /** + * If we are in a browser that doesn't support ES6 fall back to non-JS version. + */ + if ( mw.loader.getState( 'skins.vector.search' ) === null ) { + document.body.classList.remove( + 'skin-vector-search-vue' + ); + return; + } + + Array.prototype.forEach.call( searchBoxes, function ( searchBox ) { + var searchInner = searchBox.querySelector( 'form > div' ), + searchInput = searchBox.querySelector( 'input[name="search"]' ), + clearLoadingIndicators = function () { + setLoadingIndicatorListeners( + // @ts-ignore + searchInner, + false, + renderSearchLoadingIndicator + ); + }, + isPrimarySearch = searchInput && searchInput.getAttribute( 'id' ) === 'searchInput'; + + if ( !searchInput || !searchInner ) { + return; + } + // Remove tooltips while Vue search is still loading + searchInput.setAttribute( 'autocomplete', 'off' ); + setLoadingIndicatorListeners( searchInner, true, renderSearchLoadingIndicator ); + loadSearchModule( + searchInput, + 'skins.vector.search', + isPrimarySearch ? LOAD_START_MARK : null, + // Make sure we clearLoadingIndicators so that event listeners are removed. + // Note, loading Vue.js will remove the element from the DOM. + isPrimarySearch ? function () { + markLoadEnd( LOAD_START_MARK, LOAD_END_MARK, LOAD_MEASURE ); + clearLoadingIndicators(); + } : clearLoadingIndicators + ); + } ); +} + +module.exports = { + initSearchLoader: initSearchLoader +}; diff --git a/Vector/resources/skins.vector.js/sidebarPersistence.js b/Vector/resources/skins.vector.js/sidebarPersistence.js new file mode 100644 index 0000000..5c9a51a --- /dev/null +++ b/Vector/resources/skins.vector.js/sidebarPersistence.js @@ -0,0 +1,143 @@ +/** + * JavaScript enhancement to persist the sidebar state for logged-in users. + * + */ + +/** @interface MwApi */ + +var /** @type {MwApi} */api, + SIDEBAR_BUTTON_ID = 'mw-sidebar-button', + debounce = require( /** @type {string} */ ( 'mediawiki.util' ) ).debounce, + SIDEBAR_CHECKBOX_ID = 'mw-sidebar-checkbox', + SIDEBAR_PREFERENCE_NAME = 'VectorSidebarVisible'; + +/** + * Checks if persistent is enabled at current time. + * When a user is using a browser with a screen resolution of < 1000 it is assumed + * that it is preferred that the sidebar remains closed across page views, as otherwise + * it gets in the way of reading. More context at T316191. + * + * @return {boolean} + */ +function isPersistentEnabled() { + return window.innerWidth >= 1000; +} + +/** + * Execute a debounced API request to save the sidebar user preference. + * The request is meant to fire 1000 milliseconds after the last click on + * the sidebar button. + * + * @param {HTMLInputElement} checkbox + * @param {number} timeout duration + * @param {boolean} shouldTriggerResize whether a resize event is needed. + * @return {any} + */ +function saveSidebarState( checkbox, timeout, shouldTriggerResize ) { + return debounce( function () { + api = api || new mw.Api(); + api.saveOption( SIDEBAR_PREFERENCE_NAME, checkbox.checked ? 1 : 0 ); + + if ( !shouldTriggerResize ) { + return; + } + // Trigger a resize event so other parts of the page can adapt: + var event; + if ( typeof Event === 'function' ) { + event = new Event( 'resize' ); + } else { + // IE11 + event = window.document.createEvent( 'UIEvents' ); + event.initUIEvent( 'resize', true, false, window, 0 ); + } + window.dispatchEvent( event ); + }, timeout ); +} + +/** + * Bind the event handler that saves the sidebar state to the click event + * on the sidebar button. + * + * @param {HTMLElement|null} checkbox + * @param {HTMLElement|null} button + */ +function bindSidebarClickEvent( checkbox, button ) { + if ( checkbox instanceof HTMLInputElement && button ) { + var handler = saveSidebarState( checkbox, 1000, true ); + checkbox.addEventListener( 'input', function () { + if ( isPersistentEnabled() ) { + handler(); + } + } ); + } +} + +var /** @type {boolean} */ wasCollapsedDuringResize = false; + +/** + * Collapses the sidebar if screen resolution too small. + * + * @param {HTMLInputElement} checkbox + */ +function collapseSidebar( checkbox ) { + if ( checkbox.checked ) { + wasCollapsedDuringResize = true; + checkbox.checked = false; + saveSidebarState( checkbox, 0, false )(); + } +} + +/** + * Expands the sidebar when the window is resized if it was previously collapsed. + * + * @param {HTMLInputElement} checkbox + */ +function expandSidebar( checkbox ) { + if ( wasCollapsedDuringResize && !checkbox.checked ) { + wasCollapsedDuringResize = false; + checkbox.checked = true; + saveSidebarState( checkbox, 0, false )(); + } +} + +function init() { + var checkbox = /** @type {HTMLInputElement|null} */ ( + window.document.getElementById( SIDEBAR_CHECKBOX_ID ) + ), + button = window.document.getElementById( SIDEBAR_BUTTON_ID ); + + if ( mw.config.get( 'wgUserName' ) && !mw.config.get( 'wgVectorDisableSidebarPersistence' ) ) { + bindSidebarClickEvent( checkbox, button ); + } + + // If the user has resized their window, an open sidebar will be taking up lots of space + // so we should disable it. + // When this happens the user must expand it again manually, to avoid conflicts with multiple + // open windows (for example when an editor is viewing 2 articles side by side). + if ( checkbox ) { + var mediaQuery = window.matchMedia( '(max-width: 999px)' ); + var onMediaQueryChangeCollapse = function ( /** @type {MediaQueryListEvent} */ event ) { + if ( event.matches ) { + // @ts-ignore we checked it already. + collapseSidebar( checkbox ); + } else { + // @ts-ignore we checked it already. + expandSidebar( checkbox ); + } + }; + if ( mediaQuery.matches ) { + collapseSidebar( checkbox ); + } + if ( mediaQuery.addEventListener ) { + mediaQuery.addEventListener( 'change', onMediaQueryChangeCollapse ); + } else { + // Before Safari 14, MediaQueryList is based on EventTarget, + // so you must use addListener() and removeListener() to observe media query lists. + mediaQuery.addListener( onMediaQueryChangeCollapse ); + } + } +} + +module.exports = { + init: init +}; diff --git a/Vector/resources/skins.vector.js/skin.js b/Vector/resources/skins.vector.js/skin.js new file mode 100644 index 0000000..53ca702 --- /dev/null +++ b/Vector/resources/skins.vector.js/skin.js @@ -0,0 +1,148 @@ +var languageButton = require( './languageButton.js' ), + echo = require( './echo.js' ), + initSearchLoader = require( './searchLoader.js' ).initSearchLoader, + dropdownMenus = require( './dropdownMenus.js' ).dropdownMenus, + sidebarPersistence = require( './sidebarPersistence.js' ), + watchstar = require( './watchstar.js' ), + // @ts-ignore + menuTabs = require( './menuTabs.js' ), + checkbox = require( './checkbox.js' ); + +/** + * Wait for first paint before calling this function. That's its whole purpose. + * + * Some CSS animations and transitions are "disabled" by default as a workaround to this old Chrome + * bug, https://bugs.chromium.org/p/chromium/issues/detail?id=332189, which otherwise causes them to + * render in their terminal state on page load. By adding the `vector-animations-ready` class to the + * `html` root element **after** first paint, the animation selectors suddenly match causing the + * animations to become "enabled" when they will work properly. A similar pattern is used in Minerva + * (see T234570#5779890, T246419). + * + * Example usage in Less: + * + * ```less + * .foo { + * color: #f00; + * transform: translateX( -100% ); + * } + * + * // This transition will be disabled initially for JavaScript users. It will never be enabled for + * // non-JavaScript users. + * .vector-animations-ready .foo { + * transition: transform 100ms ease-out; + * } + * ``` + * + * @param {Document} document + * @return {void} + */ +function enableCssAnimations( document ) { + document.documentElement.classList.add( 'vector-animations-ready' ); +} + +/** + * In https://phabricator.wikimedia.org/T313409 #p-namespaces was renamed to #p-associatedPages + * This code maps items added by gadgets to the new menu. + * This code can be removed in MediaWiki 1.40. + */ +function addNamespacesGadgetSupport() { + // Set up hidden dummy portlet. + var dummyPortlet = document.createElement( 'div' ); + dummyPortlet.setAttribute( 'id', 'p-namespaces' ); + dummyPortlet.setAttribute( 'style', 'display: none;' ); + dummyPortlet.appendChild( document.createElement( 'ul' ) ); + document.body.appendChild( dummyPortlet ); + mw.hook( 'util.addPortletLink' ).add( function ( /** @type {Element} */ node ) { + // If it was added to p-namespaces, show warning and move. + // eslint-disable-next-line no-jquery/no-global-selector + if ( $( '#p-namespaces' ).find( node ).length ) { + // eslint-disable-next-line no-jquery/no-global-selector + $( '#p-associated-pages ul' ).append( node ); + // @ts-ignore + mw.log.warn( 'Please update call to mw.util.addPortletLink with ID p-namespaces. Use p-associatedPages instead.' ); + // in case it was empty before: + mw.util.showPortlet( 'p-associated-pages' ); + } + } ); +} + +/** + * @param {Window} window + * @return {void} + */ +function main( window ) { + enableCssAnimations( window.document ); + sidebarPersistence.init(); + checkbox.init( window.document ); + initSearchLoader( document ); + languageButton(); + echo(); + dropdownMenus(); + // menuTabs should follow `dropdownMenus` as that can move menu items from a + // tab menu to a dropdown. + menuTabs(); + addNamespacesGadgetSupport(); + watchstar(); +} + +/** + * @param {Window} window + * @return {void} + */ +function init( window ) { + var now = mw.now(); + // This is the earliest time we can run JS for users (and bucket anonymous + // users for A/B tests). + // Where the browser supports it, for a 10% sample of users + // we record a value to give us a sense of the expected delay in running A/B tests or + // disabling JS features. This will inform us on various things including what to expect + // with regards to delay while running A/B tests to anonymous users. + // When EventLogging is not available this will reject. + // This code can be removed by the end of the Desktop improvements project. + // https://www.mediawiki.org/wiki/Desktop_improvements + mw.loader.using( 'ext.eventLogging' ).then( function () { + if ( + mw.eventLog && + mw.eventLog.eventInSample( 100 /* 1 in 100 */ ) && + window.performance && + window.performance.timing && + window.performance.timing.navigationStart + ) { + mw.track( 'timing.Vector.ready', now - window.performance.timing.navigationStart ); // milliseconds + } + } ); +} + +init( window ); + +/** + * Because stickyHeader.js clones the user menu, it must initialize before + * dropdownMenus.js initializes in order for the sticky header's user menu to + * bind the necessary checkboxHack event listeners. This is solved by using + * mw.loader.using to ensure that the skins.vector.es6 module initializes first + * followed by initializing this module. If the es6 module loading fails (which + * can happen in browsers that don't support es6), continue to initialize this + * module. + */ +function initAfterEs6Module() { + mw.loader.using( 'skins.vector.es6' ).then( function () { + // Loading of the 'skins.vector.es6' module has succeeded. Initialize the + // `skins.vector.es6` module first. + require( /** @type {string} */ ( 'skins.vector.es6' ) ).main(); + // Initialize this module second. + main( window ); + }, function () { + // Loading of the 'skins.vector.es6' has failed (e.g. this will fail in + // browsers that don't support ES6) so only initialize this module. + main( window ); + } ); +} + +if ( document.readyState === 'interactive' || document.readyState === 'complete' ) { + initAfterEs6Module(); +} else { + // This is needed when document.readyState === 'loading'. + document.addEventListener( 'DOMContentLoaded', function () { + initAfterEs6Module(); + } ); +} diff --git a/Vector/resources/skins.vector.js/watchstar.js b/Vector/resources/skins.vector.js/watchstar.js new file mode 100644 index 0000000..77edc9d --- /dev/null +++ b/Vector/resources/skins.vector.js/watchstar.js @@ -0,0 +1,28 @@ +module.exports = function () { + mw.hook( 'wikipage.watchlistChange' ).add( + function ( /** @type {boolean} */ isWatched, /** @type {string} */ expiry ) { + var watchElement = document.querySelectorAll( '#ca-watch a, #ca-unwatch a' )[ 0 ]; + if ( !watchElement ) { + return; + } + watchElement.classList.remove( + // Vector attaches two icon classes to the element. + // Remove the mw-ui-icon one rather than managing both. + 'mw-ui-icon-star', + 'mw-ui-icon-unStar', + 'mw-ui-icon-wikimedia-unStar', + 'mw-ui-icon-wikimedia-star', + 'mw-ui-icon-wikimedia-halfStar' + ); + if ( isWatched ) { + if ( expiry === 'infinity' ) { + watchElement.classList.add( 'mw-ui-icon-wikimedia-unStar' ); + } else { + watchElement.classList.add( 'mw-ui-icon-wikimedia-halfStar' ); + } + } else { + watchElement.classList.add( 'mw-ui-icon-wikimedia-star' ); + } + } + ); +}; diff --git a/Vector/resources/skins.vector.legacy.js/collapsibleTabs.js b/Vector/resources/skins.vector.legacy.js/collapsibleTabs.js new file mode 100644 index 0000000..dc308e7 --- /dev/null +++ b/Vector/resources/skins.vector.legacy.js/collapsibleTabs.js @@ -0,0 +1,243 @@ +/** + * This adds behaviour to Vector's tabs in the bottom right so that at smaller + * displays they collapse under the more menu. + */ + +/** @interface CollapsibleTabsOptions */ +function init() { + /** @type {boolean|undefined} */ var boundEvent; + var isRTL = document.documentElement.dir === 'rtl'; + var rAF = window.requestAnimationFrame || setTimeout; + + // Mark the tabs which can be collapsed under the more menu + // eslint-disable-next-line no-jquery/no-global-selector + $( '#p-views li' ) + .not( '#ca-watch, #ca-unwatch' ).addClass( 'collapsible' ); + + $.fn.collapsibleTabs = function ( options ) { + // Merge options into the defaults + var settings = $.extend( {}, $.collapsibleTabs.defaults, options ); + + // return if the function is called on an empty jquery object + if ( !this.length ) { + return this; + } + + this.each( function () { + var $el = $( this ); + // add the element to our array of collapsible managers + $.collapsibleTabs.instances.push( $el ); + // attach the settings to the elements + $el.data( 'collapsibleTabsSettings', settings ); + // attach data to our collapsible elements + $el.children( settings.collapsible ).each( function () { + $.collapsibleTabs.addData( $( this ) ); + } ); + } ); + + // if we haven't already bound our resize handler, bind it now + if ( !boundEvent ) { + boundEvent = true; + $( window ).on( 'resize', mw.util.debounce( function () { + rAF( $.collapsibleTabs.handleResize ); + }, 10 ) ); + } + + // call our resize handler to setup the page + rAF( $.collapsibleTabs.handleResize ); + // When adding new links, a resize should be triggered (T139830). + mw.hook( 'util.addPortletLink' ).add( $.collapsibleTabs.handleResize ); + return this; + }; + $.collapsibleTabs = { + instances: [], + defaults: { + expandedContainer: '#p-views ul', + collapsedContainer: '#p-cactions ul', + collapsible: 'li.collapsible', + shifting: false, + expandedWidth: 0, + expandCondition: function ( eleWidth ) { + // If there are at least eleWidth + 1 pixels of free space, expand. + // We add 1 because .width() will truncate fractional values but .offset() will not. + return $.collapsibleTabs.calculateTabDistance() >= eleWidth + 1; + }, + collapseCondition: function () { + // If there's an overlap, collapse. + return $.collapsibleTabs.calculateTabDistance() < 0; + } + }, + addData: function ( $collapsible ) { + var settings = $collapsible.parent().data( 'collapsibleTabsSettings' ); + if ( settings ) { + $collapsible.data( 'collapsibleTabsSettings', { + expandedContainer: settings.expandedContainer, + collapsedContainer: settings.collapsedContainer, + expandedWidth: $collapsible.width() + } ); + } + }, + getSettings: function ( $collapsible ) { + var settings = $collapsible.data( 'collapsibleTabsSettings' ); + if ( !settings ) { + $.collapsibleTabs.addData( $collapsible ); + settings = $collapsible.data( 'collapsibleTabsSettings' ); + } + // it's possible for getSettings to return undefined + // if no data attributes have been set + // see T177108#6310908. + // In particular, a gadget may have added a collapsible link to the list: + // e.g. + // $('
    • my link').appendTo( $('#p-cactions ul') ) + return settings || {}; + }, + handleResize: function () { + $.collapsibleTabs.instances.forEach( function ( $el ) { + var $tab, + data = $.collapsibleTabs.getSettings( $el ); + + if ( $.isEmptyObject( data ) || data.shifting ) { + return; + } + + // if the two navigations are colliding + if ( $el.children( data.collapsible ).length && data.collapseCondition() ) { + /** + * Fired before tabs are moved to "collapsedContainer". + * + * @event beforeTabCollapse + * @memberof jQuery.plugin.collapsibleTabs + */ + $el.trigger( 'beforeTabCollapse' ); + // Move the element to the dropdown menu. + $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible ).last() ); + } + + $tab = $( data.collapsedContainer ).children( data.collapsible ).first(); + // if there are still moveable items in the dropdown menu, + // and there is sufficient space to place them in the tab container + if ( + $( data.collapsedContainer + ' ' + data.collapsible ).length && + data.expandCondition( + $.collapsibleTabs.getSettings( $tab ).expandedWidth + ) + ) { + /** + * Fired before tabs are moved to "expandedContainer". + * + * @event beforeTabExpand + * @memberof jQuery.plugin.collapsibleTabs + */ + $el.trigger( 'beforeTabExpand' ); + $.collapsibleTabs.moveToExpanded( $tab ); + } + } ); + }, + moveToCollapsed: function ( $moving ) { + /** @type {CollapsibleTabsOptions} */ var outerData; + /** @type {CollapsibleTabsOptions} */ var collapsedContainerSettings; + /** @type {string} */ var target; + + outerData = $.collapsibleTabs.getSettings( $moving ); + if ( !outerData ) { + return; + } + collapsedContainerSettings = $.collapsibleTabs.getSettings( + $( outerData.expandedContainer ) + ); + if ( !collapsedContainerSettings ) { + return; + } + collapsedContainerSettings.shifting = true; + + // Remove the element from where it's at and put it in the dropdown menu + target = outerData.collapsedContainer; + // eslint-disable-next-line no-jquery/no-animate + $moving.css( 'position', 'relative' ) + .css( ( isRTL ? 'left' : 'right' ), 0 ) + .animate( { width: '1px' }, 'normal', function () { + $( this ).hide(); + // add the placeholder + $( '' ).addClass( 'placeholder' ).css( 'display', 'none' ).insertAfter( this ); + $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData ); + $( this ).attr( 'style', 'display: list-item;' ); + collapsedContainerSettings.shifting = false; + rAF( $.collapsibleTabs.handleResize ); + } ); + }, + moveToExpanded: function ( $moving ) { + /** @type {CollapsibleTabsOptions} */ var data; + /** @type {CollapsibleTabsOptions} */ var expandedContainerSettings; + var $target; + var expandedWidth; + + data = $.collapsibleTabs.getSettings( $moving ); + if ( !data ) { + return; + } + expandedContainerSettings = + $.collapsibleTabs.getSettings( $( data.expandedContainer ) ); + if ( !expandedContainerSettings ) { + return; + } + expandedContainerSettings.shifting = true; + + // grab the next appearing placeholder so we can use it for replacing + $target = $( data.expandedContainer ).find( 'span.placeholder' ).first(); + expandedWidth = data.expandedWidth; + $moving.css( 'position', 'relative' ).css( ( isRTL ? 'right' : 'left' ), 0 ).css( 'width', '1px' ); + $target.replaceWith( + // eslint-disable-next-line no-jquery/no-animate + $moving + .detach() + .css( 'width', '1px' ) + .data( 'collapsibleTabsSettings', data ) + .animate( { width: expandedWidth + 'px' }, 'normal', function () { + $( this ).attr( 'style', 'display: block;' ); + rAF( function () { + // Update the 'expandedWidth' in case someone was brazen enough to + // change the tab's contents after the page load *gasp* (T71729). This + // doesn't prevent a tab from collapsing back and forth once, but at + // least it won't continue to do that forever. + data.expandedWidth = $moving.width() || 0; + $moving.data( 'collapsibleTabsSettings', data ); + expandedContainerSettings.shifting = false; + $.collapsibleTabs.handleResize(); + } ); + } ) + ); + }, + /** + * Get the amount of horizontal distance between the two tabs groups in pixels. + * + * Uses `#left-navigation` and `#right-navigation`. If negative, this + * means that the tabs overlap, and the value is the width of overlapping + * parts. + * + * Used in default `expandCondition` and `collapseCondition` options. + * + * @return {number} distance/overlap in pixels + */ + calculateTabDistance: function () { + var leftTab, rightTab, leftEnd, rightStart; + + // In RTL, #right-navigation is actually on the left and vice versa. + // Hooray for descriptive naming. + if ( !isRTL ) { + leftTab = document.getElementById( 'left-navigation' ); + rightTab = document.getElementById( 'right-navigation' ); + } else { + leftTab = document.getElementById( 'right-navigation' ); + rightTab = document.getElementById( 'left-navigation' ); + } + if ( leftTab && rightTab ) { + leftEnd = leftTab.getBoundingClientRect().right; + rightStart = rightTab.getBoundingClientRect().left; + return rightStart - leftEnd; + } + return 0; + } + }; +} + +module.exports = Object.freeze( { init: init } ); diff --git a/Vector/resources/skins.vector.legacy.js/skin-legacy.js b/Vector/resources/skins.vector.legacy.js/skin-legacy.js new file mode 100644 index 0000000..8907e02 --- /dev/null +++ b/Vector/resources/skins.vector.legacy.js/skin-legacy.js @@ -0,0 +1,14 @@ +/** @interface MediaWikiPageReadyModule */ +var + collapsibleTabs = require( './collapsibleTabs.js' ), + /** @type {MediaWikiPageReadyModule} */ + pageReady = require( /** @type {string} */( 'mediawiki.page.ready' ) ), + vector = require( './vector.js' ); + +function main() { + collapsibleTabs.init(); + $( vector.init ); + pageReady.loadSearchModule( 'mediawiki.searchSuggest' ); +} + +main(); diff --git a/Vector/resources/skins.vector.legacy.js/vector.js b/Vector/resources/skins.vector.legacy.js/vector.js new file mode 100644 index 0000000..810c391 --- /dev/null +++ b/Vector/resources/skins.vector.legacy.js/vector.js @@ -0,0 +1,116 @@ +/** + * Collapsible tabs for Vector + */ +function init() { + var cactionsId = 'p-cactions', + $cactions = $( '#' + cactionsId ), + // eslint-disable-next-line no-jquery/no-global-selector + $tabContainer = $( '#p-views ul' ), + initialCactionsWidth = function () { + // HACK: This depends on a discouraged feature of jQuery width(). + // The #p-cactions element is generally hidden by default, but + // the consumers of this function need to know the width that the + // "More" menu would consume if it were visible. This means it + // must not return 0 if hidden, but rather virtually render it + // and compute its width, then hide it again. jQuery width() does + // all that for us. + var width = $cactions.width() || 0; + initialCactionsWidth = function () { + return width; + }; + return width; + }; + + // Bind callback functions to animate our drop down menu in and out + // and then call the collapsibleTabs function on the menu + $tabContainer + .on( 'beforeTabCollapse', function () { + var expandedWidth; + // If the dropdown was hidden, show it + if ( !mw.util.isPortletVisible( cactionsId ) ) { + mw.util.showPortlet( cactionsId ); + // Now that it is visible, force-render it virtually + // to get its expanded width, then shrink it 1px before we + // yield from JS (which means the expansion won't be visible). + // Then animate from the 1px to the expanded width. + expandedWidth = $cactions.width(); + // eslint-disable-next-line no-jquery/no-animate + $cactions + .css( 'width', '1px' ) + .animate( { width: expandedWidth }, 'normal' ); + } + } ) + .on( 'beforeTabExpand', function () { + // If we're removing the last child node right now, hide the dropdown + if ( $cactions.find( 'li' ).length === 1 ) { + // eslint-disable-next-line no-jquery/no-animate + $cactions.animate( { width: '1px' }, 'normal', function () { + $( this ).attr( 'style', '' ); + mw.util.hidePortlet( cactionsId ); + } ); + } + } ) + .collapsibleTabs( { + expandCondition: function ( eleWidth ) { + // This looks a bit awkward because we're doing expensive queries as late + // as possible. + var distance = $.collapsibleTabs.calculateTabDistance(); + // If there are at least eleWidth + 1 pixels of free space, expand. + // We add 1 because .width() will truncate fractional values but .offset() will not. + if ( distance >= eleWidth + 1 ) { + return true; + } else { + // Maybe we can still expand? Account for the width of the "Actions" dropdown + // if the expansion would hide it. + if ( $cactions.find( 'li' ).length === 1 ) { + return distance >= eleWidth + 1 - initialCactionsWidth(); + } else { + return false; + } + } + }, + collapseCondition: function () { + var collapsibleWidth = 0, + doCollapse = false; + + // This looks a bit awkward because we're doing expensive queries as late + // as possible. + // TODO: The dropdown itself should probably "fold" to just the down-arrow + // (hiding the text) if it can't fit on the line? + + // Never collapse if there is no overlap. + if ( $.collapsibleTabs.calculateTabDistance() >= 0 ) { + return false; + } + + // Always collapse if the "More" button is already shown. + if ( mw.util.isPortletVisible( cactionsId ) ) { + return true; + } + + // If we reach here, this means: + // 1. #p-cactions is currently empty and invisible (e.g. when logged out), + // 2. and, there is at least one li.collapsible link in #p-views, as asserted + // by handleResize() before calling here. Such link exists e.g. as + // "View history" on articles, but generally not on special pages. + // 3. and, the left-navigation and right-navigation are overlapping + // each other, e.g. when making the window very narrow, or if a gadget + // added a lot of tabs. + $tabContainer.children( 'li.collapsible' ).each( function ( _index, element ) { + collapsibleWidth += $( element ).width() || 0; + if ( collapsibleWidth > initialCactionsWidth() ) { + // We've found one or more collapsible links that are wider + // than the "More" menu would be if it were made visible, + // which means it is worth doing a collapsing. + doCollapse = true; + // Stop this possibly expensive loop the moment the condition is met once. + return false; + } + return; + } ); + return doCollapse; + } + } ); +} + +module.exports = Object.freeze( { init: init } ); diff --git a/Vector/resources/skins.vector.search/.eslintrc.json b/Vector/resources/skins.vector.search/.eslintrc.json new file mode 100644 index 0000000..915524c --- /dev/null +++ b/Vector/resources/skins.vector.search/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "extends": [ + "../../.eslintrcEs6.json" + ], + "rules": { + "jsdoc/no-undefined-types": [ + "error", + { + "definedTypes": [ + "RequestInit", + "MwMap" + ] + } + ] + } +} diff --git a/Vector/resources/skins.vector.search/App.vue b/Vector/resources/skins.vector.search/App.vue new file mode 100644 index 0000000..c171f08 --- /dev/null +++ b/Vector/resources/skins.vector.search/App.vue @@ -0,0 +1,272 @@ + + + diff --git a/Vector/resources/skins.vector.search/config.json.d.ts b/Vector/resources/skins.vector.search/config.json.d.ts new file mode 100644 index 0000000..d937ce8 --- /dev/null +++ b/Vector/resources/skins.vector.search/config.json.d.ts @@ -0,0 +1,3 @@ +// Placeholder for ResourceLoader Virtual Config which is populated from the server. +// See `VectorWvuiSearchOptions` config in Vector/skin.json for the options that are included. +export {}; diff --git a/Vector/resources/skins.vector.search/fetch.js b/Vector/resources/skins.vector.search/fetch.js new file mode 100644 index 0000000..8619295 --- /dev/null +++ b/Vector/resources/skins.vector.search/fetch.js @@ -0,0 +1,53 @@ +/** + * @typedef {Object} AbortableFetch + * @property {Promise} fetch + * @property {Function} abort + */ + +/** + * @typedef {Object} NullableAbortController + * @property {AbortSignal | undefined} signal + * @property {Function} abort + */ +const nullAbortController = { + signal: undefined, + abort: () => {} // Do nothing (no-op) +}; + +/** + * A wrapper which combines native fetch() in browsers and the following json() call. + * + * @param {string} resource + * @param {RequestInit} [init] + * @return {AbortableFetch} + */ +function fetchJson( resource, init ) { + // As of 2020, browser support for AbortController is limited: + // https://caniuse.com/abortcontroller + // so replacing it with no-op if it doesn't exist. + /* eslint-disable compat/compat */ + const controller = window.AbortController ? + new AbortController() : + nullAbortController; + /* eslint-enable compat/compat */ + + const getJson = fetch( resource, $.extend( init, { + signal: controller.signal + } ) ).then( ( response ) => { + if ( !response.ok ) { + return Promise.reject( + 'Network request failed with HTTP code ' + response.status + ); + } + return response.json(); + } ); + + return { + fetch: getJson, + abort: () => { + controller.abort(); + } + }; +} + +module.exports = fetchJson; diff --git a/Vector/resources/skins.vector.search/instrumentation.js b/Vector/resources/skins.vector.search/instrumentation.js new file mode 100644 index 0000000..8f1128f --- /dev/null +++ b/Vector/resources/skins.vector.search/instrumentation.js @@ -0,0 +1,176 @@ +/* global FetchEndEvent, SuggestionClickEvent, SearchSubmitEvent */ +/** + * The value of the `inputLocation` property of any and all SearchSatisfaction events sent by the + * corresponding instrumentation. + * + * @see https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/skins/Vector/+/refs/heads/master/includes/Constants.php + */ +const INPUT_LOCATION_MOVED = 'header-moved', + // T251544: Collect search performance metrics to compare Vue search with + // mediawiki.searchSuggest performance. Marks and Measures will only be + // recorded on the Vector skin and only if browser supported. + shouldTestSearchPerformance = !!( window.performance && + // @ts-ignore + window.requestAnimationFrame && + /* eslint-disable compat/compat */ + // @ts-ignore + performance.mark && + // @ts-ignore + performance.measure && + // @ts-ignore + performance.getEntriesByName && + performance.clearMarks ), + /* eslint-enable compat/compat */ + loadStartMark = 'mwVectorVueSearchLoadStart', + queryMark = 'mwVectorVueSearchQuery', + renderMark = 'mwVectorVueSearchRender', + queryToRenderMeasure = 'mwVectorVueSearchQueryToRender', + loadStartToFirstRenderMeasure = 'mwVectorVueSearchLoadStartToFirstRender'; + +function onFetchStart() { + if ( !shouldTestSearchPerformance ) { + return; + } + + // Clear past marks that are no longer relevant. This likely means that the + // search request failed or was cancelled. Whatever the reason, the mark + // is no longer needed since we are only interested in collecting the time + // from query to render. + if ( performance.getEntriesByName( queryMark ).length ) { + performance.clearMarks( queryMark ); + } + + /* eslint-disable-next-line compat/compat */ + performance.mark( queryMark ); +} + +/** + * @param {FetchEndEvent} event + */ +function onFetchEnd( event ) { + mw.track( 'mediawiki.searchSuggest', { + action: 'impression-results', + numberOfResults: event.numberOfResults, + // resultSetType: '', + // searchId: '', + query: event.query, + inputLocation: INPUT_LOCATION_MOVED + } ); + + if ( shouldTestSearchPerformance ) { + // Schedule the mark after the search results have rendered and are + // visible to the user. Two rAF's are needed for this since rAF will + // execute before the rendering steps happen (e.g. layout and paint). A + // nested rAF will execute after these rendering steps have completed + // and ensure the search results are visible to the user. + requestAnimationFrame( () => { + requestAnimationFrame( () => { + if ( !performance.getEntriesByName( queryMark ).length ) { + return; + } + + performance.mark( renderMark ); + performance.measure( queryToRenderMeasure, queryMark, renderMark ); + + // Measure from the start of the lazy load to the first render if we + // haven't already captured that info. + if ( performance.getEntriesByName( loadStartMark ).length && + !performance.getEntriesByName( loadStartToFirstRenderMeasure ).length ) { + performance.measure( loadStartToFirstRenderMeasure, loadStartMark, renderMark ); + } + + // The measures are the most meaningful info so we remove the marks + // after we have the measure. + performance.clearMarks( queryMark ); + performance.clearMarks( renderMark ); + } ); + } ); + } +} + +/** + * @param {SuggestionClickEvent|SearchSubmitEvent} event + */ +function onSuggestionClick( event ) { + mw.track( 'mediawiki.searchSuggest', { + action: 'click-result', + numberOfResults: event.numberOfResults, + index: event.index + } ); +} + +/** + * Generates the value of the `wprov` parameter to be used in the URL of a search result and the + * `wprov` hidden input. + * + * See https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/WikimediaEvents/+/refs/heads/master/modules/ext.wikimediaEvents/searchSatisfaction.js + * and also the top of that file for additional detail about the shape of the parameter. + * + * @param {number} index + * @return {string} + */ +function getWprovFromResultIndex( index ) { + // result looks like: acrw1_0, acrw1_1, acrw1_2, etc.; + // or acrw1_-1 for index -1 (user did not highlight an autocomplete result) + return 'acrw1_' + index; +} + +/** + * @typedef {Object} SearchResultPartial + * @property {string} title + * @property {string} [url] + */ + +/** + * Return a new list of search results, + * with the `wprov` parameter added to each result's url (if any). + * + * @param {SearchResultPartial[]} results Not modified. + * @param {number} offset Offset to add to the index of each result. + * @return {SearchResultPartial[]} + */ +function addWprovToSearchResultUrls( results, offset ) { + return results.map( ( result, index ) => { + if ( result.url ) { + const uri = new mw.Uri( result.url ); + uri.query.wprov = getWprovFromResultIndex( index + offset ); + result = Object.assign( {}, result, { url: uri.toString() } ); + } + return result; + } ); +} + +/** + * @typedef {Object} Instrumentation + * @property {Object} listeners + * @property {Function} getWprovFromResultIndex + * @property {Function} addWprovToSearchResultUrls + */ + +/** + * @type {Instrumentation} + */ +module.exports = { + listeners: { + onFetchStart, + onFetchEnd, + onSuggestionClick, + + // As of writing (2020/12/08), both the "click-result" and "submit-form" kind of + // mediawiki.searchSuggestion events result in a "click" SearchSatisfaction event being + // logged [0]. However, when processing the "submit-form" kind of mediawiki.searchSuggestion + // event, the SearchSatisfaction instrument will modify the DOM, adding a hidden input + // element, in order to set the appropriate provenance parameter (see [1] for additional + // detail). + // + // In this implementation of the mediawiki.searchSuggestion protocol, we don't want to + // trigger the above behavior as we're using Vue.js, which doesn't expect the DOM to be + // modified underneath it. + // + // [0] https://gerrit.wikimedia.org/g/mediawiki/extensions/WikimediaEvents/+/df97aa9c9407507e8c48827666beeab492fd56a8/modules/ext.wikimediaEvents/searchSatisfaction.js#735 + // [1] https://phabricator.wikimedia.org/T257698#6416826 + onSubmit: onSuggestionClick + }, + getWprovFromResultIndex, + addWprovToSearchResultUrls +}; diff --git a/Vector/resources/skins.vector.search/restSearchClient.js b/Vector/resources/skins.vector.search/restSearchClient.js new file mode 100644 index 0000000..9549caf --- /dev/null +++ b/Vector/resources/skins.vector.search/restSearchClient.js @@ -0,0 +1,121 @@ +/* global RestResult, SearchResult */ +/** @module restSearchClient */ + +const fetchJson = require( './fetch.js' ); +const urlGenerator = require( './urlGenerator.js' ); + +/** + * @typedef {Object} RestResponse + * @property {RestResult[]} pages + */ + +/** + * @typedef {Object} SearchResponse + * @property {string} query + * @property {SearchResult[]} results + */ + +/** + * Nullish coalescing operator (??) helper + * + * @param {any} a + * @param {any} b + * @return {any} + */ +function nullish( a, b ) { + return ( a !== null && a !== undefined ) ? a : b; +} + +/** + * @param {MwMap} config + * @param {string} query + * @param {RestResponse} restResponse + * @param {boolean} showDescription + * @return {SearchResponse} + */ +function adaptApiResponse( config, query, restResponse, showDescription ) { + const urlGeneratorInstance = urlGenerator( config ); + return { + query, + results: restResponse.pages.map( ( page, index ) => { + const thumbnail = page.thumbnail; + return { + id: page.id, + value: page.id || -( index + 1 ), + label: page.title, + key: page.key, + title: page.title, + description: showDescription ? page.description : undefined, + url: urlGeneratorInstance.generateUrl( page ), + thumbnail: thumbnail ? { + url: thumbnail.url, + width: nullish( thumbnail.width, undefined ), + height: nullish( thumbnail.height, undefined ) + } : undefined + }; + } ) + }; +} + +/** + * @typedef {Object} AbortableSearchFetch + * @property {Promise} fetch + * @property {Function} abort + */ + +/** + * @callback fetchByTitle + * @param {string} query The search term. + * @param {number} [limit] Maximum number of results. + * @param {boolean} [showDescription] Whether descriptions should be added to the results. + * @return {AbortableSearchFetch} + */ + +/** + * @callback loadMore + * @param {string} query The search term. + * @param {number} offset The number of search results that were already loaded. + * @param {number} [limit] How many further search results to load (at most). + * @param {boolean} [showDescription] Whether descriptions should be added to the results. + * @return {AbortableSearchFetch} + */ + +/** + * @typedef {Object} SearchClient + * @property {fetchByTitle} fetchByTitle + * @property {loadMore} [loadMore] + */ + +/** + * @param {MwMap} config + * @return {SearchClient} + */ +function restSearchClient( config ) { + return config.get( 'wgVectorSearchClient', { + /** + * @type {fetchByTitle} + */ + fetchByTitle: ( q, limit = 10, showDescription = true ) => { + const searchApiUrl = config.get( 'wgVectorSearchApiUrl', + config.get( 'wgScriptPath' ) + '/rest.php' + ); + const params = { q, limit }; + const url = searchApiUrl + '/v1/search/title?' + $.param( params ); + const result = fetchJson( url, { + headers: { + accept: 'application/json' + } + } ); + const searchResponsePromise = result.fetch + .then( ( /** @type {RestResponse} */ res ) => { + return adaptApiResponse( config, q, res, showDescription ); + } ); + return { + abort: result.abort, + fetch: searchResponsePromise + }; + } + } ); +} + +module.exports = restSearchClient; diff --git a/Vector/resources/skins.vector.search/skins.vector.search.js b/Vector/resources/skins.vector.search/skins.vector.search.js new file mode 100644 index 0000000..7172682 --- /dev/null +++ b/Vector/resources/skins.vector.search/skins.vector.search.js @@ -0,0 +1,50 @@ +/** @module search */ + +const + Vue = require( 'vue' ), + App = require( './App.vue' ), + config = require( './config.json' ); + +/** + * @param {Element} searchBox + * @return {void} + */ +function initApp( searchBox ) { + const searchForm = searchBox.querySelector( '.vector-search-box-form' ), + titleInput = /** @type {HTMLInputElement|null} */ ( + searchBox.querySelector( 'input[name=title]' ) + ), + search = /** @type {HTMLInputElement|null} */ ( searchBox.querySelector( 'input[name=search]' ) ), + searchPageTitle = titleInput && titleInput.value; + + if ( !searchForm || !search || !titleInput ) { + throw new Error( 'Attempted to create Vue search element from an incompatible element.' ); + } + + // @ts-ignore + Vue.createMwApp( + App, $.extend( { + id: searchForm.id, + autocapitalizeValue: search.getAttribute( 'autocapitalize' ), + autofocusInput: search === document.activeElement, + action: searchForm.getAttribute( 'action' ), + searchAccessKey: search.getAttribute( 'accessKey' ), + searchPageTitle: searchPageTitle, + searchTitle: search.getAttribute( 'title' ), + searchPlaceholder: search.getAttribute( 'placeholder' ), + searchQuery: search.value, + autoExpandWidth: searchBox ? searchBox.classList.contains( 'vector-search-box-auto-expand-width' ) : false + // Pass additional config from server. + }, config ) + ) + .mount( searchForm.parentNode ); +} +/** + * @param {Document} document + * @return {void} + */ +function main( document ) { + document.querySelectorAll( '.vector-search-box' ) + .forEach( initApp ); +} +main( document ); diff --git a/Vector/resources/skins.vector.search/types.js b/Vector/resources/skins.vector.search/types.js new file mode 100644 index 0000000..bbcca92 --- /dev/null +++ b/Vector/resources/skins.vector.search/types.js @@ -0,0 +1,50 @@ +/** + * @typedef {Object} FetchEndEvent + * @property {number} numberOfResults + * @property {string} query + */ + +/** + * @typedef {Object} SuggestionClickEvent + * @property {number} numberOfResults + * @property {number} index + */ + +/** + * @typedef {SuggestionClickEvent} SearchSubmitEvent + */ + +/** + * @typedef {Object} RestResult + * @property {number} id + * @property {string} key + * @property {string} title + * @property {string} [description] + * @property {RestThumbnail | null} [thumbnail] + * + */ + +/** + * @typedef {Object} RestThumbnail + * @property {string} url + * @property {number | null} [width] + * @property {number | null} [height] + */ + +/** + * @typedef {Object} SearchResult + * @property {number} id + * @property {string} key + * @property {string} title + * @property {string} [description] + * @property {SearchResultThumbnail} [thumbnail] + */ + +/** + * @typedef {Object} SearchResultThumbnail + * @property {string} url + * @property {number} [width] + * @property {number} [height] + */ + +/* exported SuggestionClickEvent, SearchSubmitEvent, FetchEndEvent, RestResult, SearchResult */ diff --git a/Vector/resources/skins.vector.search/urlGenerator.js b/Vector/resources/skins.vector.search/urlGenerator.js new file mode 100644 index 0000000..dbfa7da --- /dev/null +++ b/Vector/resources/skins.vector.search/urlGenerator.js @@ -0,0 +1,58 @@ +/* global RestResult, SearchResult */ + +/** + * @typedef {Object} UrlParams + * @param {string} title + * @param {string} fulltext + */ + +/** + * @callback generateUrl + * @param {RestResult|SearchResult|string} searchResult + * @param {UrlParams} [params] + * @param {string} [articlePath] + * @return {string} + */ + +/** + * @typedef {Object} UrlGenerator + * @property {generateUrl} generateUrl + */ + +/** + * Generates URLs for suggestions like those in MediaWiki's mediawiki.searchSuggest implementation. + * + * @param {MwMap} config + * @return {UrlGenerator} + */ +function urlGenerator( config ) { + // TODO: This is a placeholder for enabling customization of the URL generator. + // wgVectorSearchUrlGenerator has not been defined as a config variable yet. + return config.get( 'wgVectorSearchUrlGenerator', { + /** + * @type {generateUrl} + */ + generateUrl( + suggestion, + params = { + title: 'Special:Search' + }, + articlePath = config.get( 'wgScript' ) + ) { + if ( typeof suggestion !== 'string' ) { + suggestion = suggestion.title; + } else { + // Add `fulltext` query param to search within pages and for navigation + // to the search results page (prevents being redirected to a certain + // article). + // @ts-ignore + params.fulltext = '1'; + } + + return articlePath + '?' + $.param( $.extend( {}, params, { search: suggestion } ) ); + } + } ); +} + +/** @module urlGenerator */ +module.exports = urlGenerator; diff --git a/Vector/resources/skins.vector.styles.legacy/components/LegacySidebar.less b/Vector/resources/skins.vector.styles.legacy/components/LegacySidebar.less new file mode 100644 index 0000000..4198a88 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/LegacySidebar.less @@ -0,0 +1,50 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; + +.vector-legacy-sidebar .vector-menu-portal { + margin: 0 @margin-end-portal 0 @margin-start-portal; + padding: 0.25em 0; + direction: ltr; + + .vector-menu-heading { + display: block; + color: @color-base--subtle; + margin: 0.5em 0 0 ( @margin-start-nav-main-body / @font-size-nav-main-heading ); + border: 0; + padding: 0.25em 0; + font-size: @font-size-nav-main-heading; + font-weight: normal; + cursor: default; + background-image: linear-gradient( to right, @border-color-portal-heading-transparent 0, @border-color-portal-heading 33%, @border-color-portal-heading 66%, @border-color-portal-heading-transparent 100% ); // Standard (Firefox 16+, IE 10+, Safari 6.1+, Chrome 26+) + background-position: center bottom; + background-repeat: no-repeat; + background-size: 100% @border-width-base; + } + + .vector-menu-content { + margin-left: @margin-start-portal-body; + padding-top: 0; + + ul { + list-style: none; + margin: 0; + padding-top: 0.3em; + } + + li { + margin: 0; + padding: 0.25em 0; + font-size: @font-size-portal-list-item; + line-height: @line-height-nav; + word-wrap: break-word; + + a { + color: @color-link; + + &:visited { + color: @color-link--visited; + } + } + } + } +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/Menu.less b/Vector/resources/skins.vector.styles.legacy/components/Menu.less new file mode 100644 index 0000000..d47fc77 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/Menu.less @@ -0,0 +1,12 @@ +.mw-portlet { + // Hidden by default, but displayed by certain menus + // e.g. MenuPortal + .vector-menu-heading { + display: none; + } + + ul { + list-style: none; + margin: 0; + } +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/MenuDropdown.less b/Vector/resources/skins.vector.styles.legacy/components/MenuDropdown.less new file mode 100644 index 0000000..4e9e09a --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/MenuDropdown.less @@ -0,0 +1,92 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; +@import '../../common/mixins.less'; + +// Flips the chevron so it points up when the dropdown is open. +.vector-menu-checkbox:checked + .vector-menu-heading:after { + transform: scaleY( -1 ); +} + +/** + * Dropdown menus that only appear in the tab bar in legacy Vector. + */ +.vector-menu-dropdown { + direction: ltr; + float: left; + cursor: pointer; + position: relative; + line-height: 1.125em; + + // menu label with chevron icon. + .vector-menu-heading { + display: flex; + color: @color-base--subtle; + font-size: @font-size-tabs; + // Tab separator: Outer end (right in LTR) border of "Actions" menu. + background-position: right bottom; + margin: 0 -@border-width-base 0 0; + // `padding-top` needs to scale with font-size. + padding: 1.25em 8px 6px; + font-weight: normal; + + &:after { + .mixin-vector-legacy-menu-heading-arrow(); + // Modify the color of the image from the default #202122 to approx. #404244 to match the text. + opacity: @opacity-icon-base; + } + + &:hover, + &:focus { + color: @color-base; + + &:after { + opacity: @opacity-icon-base--selected; + } + } + } + + /** + * Dropdown container. + */ + .vector-menu-content { + line-height: 1.125em; + background-color: @background-color-base; + border: @border-width-base @border-style-base @border-color-base; + border-top-width: 0; + box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 ); + transition-property: opacity; + transition-duration: @transition-duration-base; + // The menu content should not be narrower than the menu button. + min-width: 100%; + } + + // Open the dropdown container via hover. + &:hover .vector-menu-content { + opacity: @opacity-base; + visibility: visible; + height: auto; + } + + .mw-list-item { + text-align: left; + line-height: 1em; + + a:not( .mw-ui-icon ) { + font-size: @font-size-tabs; + } + + a { + // displays all links in a single column. + display: block; + white-space: nowrap; + padding: 0.625em; + color: @color-link; + } + + &.selected a, + &.selected a:visited { + color: @color-link-selected; + text-decoration: none; + } + } +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/MenuTabs.less b/Vector/resources/skins.vector.styles.legacy/components/MenuTabs.less new file mode 100644 index 0000000..f779de6 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/MenuTabs.less @@ -0,0 +1,102 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; + +/** + * Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions) + */ + +/* Namespaces and Views */ +.vector-menu-tabs-legacy { + // Tab separator: Outer start border (left in LTR) of tab row. + background-position: left bottom; + float: left; + height: 2.5em; + padding-left: @border-width-base; + + /* Navigation Labels */ + .vector-menu-heading { + display: none; + } + + ul { + float: left; + height: 100%; + list-style: none; + margin: 0; + padding: 0; + } + + li { + // Tab fade background: Fade inside from light grey to white. + background-image: linear-gradient( to top, @border-color-content--tabs-inactive 0, #e8f2f8 1px, #fff 100% ); // Support: Standard (Firefox 16+, IE 10+, Safari 6.1+, Chrome 26+) + background-position: left bottom; + background-repeat: repeat-x; + float: left; + display: block; + height: 100%; + margin: 0; + padding: 0; + line-height: @line-height-nav; + white-space: nowrap; + + a { + // Tab separator: Border between tabs and outer right border. + background-position: right bottom; + color: @color-link; + box-sizing: border-box; + display: block; + float: left; + height: unit( 40 / @font-size-tabs / @font-size-browser, em ); + position: relative; + padding-top: 1.25em; + padding-left: @padding-horizontal-tabs; + padding-right: @padding-horizontal-tabs; + font-size: @font-size-tabs; + cursor: pointer; + } + } + + .new { + a, + a:visited { + color: @color-link-new; + } + } + + .selected { + // Overwrite above in browsers that support `rgba()`. + background: rgba( 255, 255, 255, 1 ); + + a, + a:visited { + color: @color-link-selected; + text-decoration: none; + } + } + + .icon { + a { + background-position: right bottom; + background-repeat: no-repeat; + } + } +} + +// Tab Separators +// `.vector-menu-tabs`: Outer start border (left in LTR) of tab row. +// `.vector-menu-tabs a`: Border between tabs and outer end (right in LTR) border. +// `#mw-head .vector-menu-dropdown .vector-menu-heading`: // Outer end (right in LTR) border of "Actions" menu. +// #mw-head rule is legacy Vector only. +.vector-menu-tabs, +.vector-menu-tabs a, +#mw-head .vector-menu-dropdown .vector-menu-heading { + background-image: linear-gradient( to bottom, rgba( 167, 215, 249, 0 ) 0, @border-color-content 100% ); + background-repeat: no-repeat; + // Contain gradient to 1px × 100% size and draw from top to bottom-left or -right corner. + background-size: @border-width-base 100%; +} + +#mw-head .vector-menu-dropdown .vector-menu-heading { + // Tab separator: Outer end (right in LTR) border of "Actions" menu. + background-position: right bottom; +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/SearchBox.less b/Vector/resources/skins.vector.styles.legacy/components/SearchBox.less new file mode 100644 index 0000000..ee355eb --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/SearchBox.less @@ -0,0 +1,6 @@ +@import 'mediawiki.mixins.less'; + +// Search portlet. +.vector-search-box h3 { + .mixin-screen-reader-text(); +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/Sidebar.less b/Vector/resources/skins.vector.styles.legacy/components/Sidebar.less new file mode 100644 index 0000000..4dd8c4f --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/Sidebar.less @@ -0,0 +1,18 @@ +@import '../../common/variables.less'; + +/* Panel */ +#mw-panel { + font-size: @font-size-nav-main; + + nav:first-child { + background-image: none; + + .vector-menu-heading { + display: none; + } + + .vector-menu-content { + margin-left: @margin-start-nav-main-body; + } + } +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/TabWatchstarLink.less b/Vector/resources/skins.vector.styles.legacy/components/TabWatchstarLink.less new file mode 100644 index 0000000..f2e5107 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/TabWatchstarLink.less @@ -0,0 +1,72 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; +@import 'mediawiki.mixins.rotation.less'; + +/* Watch/Unwatch Icon Styling */ +/* Only use icon if the menu item is not collapsed into the "More" dropdown + * (in which case it is inside `.vector-menu-dropdown` instead of `.vector-menu-tabs`). */ +.vector-menu-tabs { + // `#ca-unwatch` & `#ca-watch` both carry `.mw-watchlink` as well. + @width-watchlink: unit( 28 / @font-size-tabs / @font-size-browser, em ); + @height-watchlink: unit( 40 / @font-size-tabs / @font-size-browser, em ); + @size-watchlink-icon: unit( 16 / @font-size-tabs / @font-size-browser, em ); + + .mw-watchlink.icon a { + width: @width-watchlink; + /* This hides the text but shows the background image */ + /* Must not exceed parent's height, otherwise the background disappears on Chrome (T196610) */ + height: 0; + padding: @height-watchlink 0 0 0; + overflow: hidden; + + &:before { + background-repeat: no-repeat; + background-position: 50% 50%; + content: ''; + display: block; + position: absolute; + top: unit( 14 / @font-size-tabs / @font-size-browser, em ); + left: unit( 5 / @font-size-tabs / @font-size-browser, em ); + width: @size-watchlink-icon; + height: @size-watchlink-icon; + } + } + + #ca-unwatch.icon a:before { + background-image: url( ../common/images/unwatch-icon.svg ); + } + + #ca-unwatch.mw-watchlink-temp.icon a:before { + background-image: url( ../common/images/unwatch-temp-icon.svg ); + } + + #ca-watch.icon a:before { + background-image: url( ../common/images/watch-icon.svg ); + } + + #ca-unwatch.icon a:hover:before, + #ca-unwatch.icon a:focus:before { + background-image: url( ../common/images/unwatch-icon-hl.svg ); + } + + #ca-unwatch.mw-watchlink-temp.icon a:hover:before, + #ca-unwatch.mw-watchlink-temp.icon a:focus:before { + background-image: url( ../common/images/unwatch-temp-icon-hl.svg ); + } + + #ca-watch.icon a:hover:before, + #ca-watch.icon a:focus:before { + background-image: url( ../common/images/watch-icon-hl.svg ); + } + + // Loading watchstar link class. + #ca-unwatch.icon .loading:before, + #ca-watch.icon .loading:before { + .rotation( 700ms ); + /* Suppress the hilarious rotating focus outline on Firefox */ + outline: 0; + cursor: default; + pointer-events: none; + transform-origin: 50% 50%; + } +} diff --git a/Vector/resources/skins.vector.styles.legacy/components/UserLinks.less b/Vector/resources/skins.vector.styles.legacy/components/UserLinks.less new file mode 100644 index 0000000..6745cde --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/components/UserLinks.less @@ -0,0 +1,52 @@ +@import '../../common/variables.less'; + +/* Personal Menu */ +.vector-user-menu-legacy { + li { + font-size: @font-size-nav-personal; + float: left; + margin-left: 0.75em; + // `padding-top` instead of `margin-top` necessary for + // anonymous user icon position below + padding-top: 0.5em; + line-height: @line-height-nav-personal; + } + + /* Icon for registered user names & anonymous message */ + #pt-anonuserpage, + #pt-userpage a { + background-position: @background-position-nav-personal-icon; + background-image: url( images/user-avatar.svg ); + background-repeat: no-repeat; + background-size: @background-size-nav-personal-icon @background-size-nav-personal-icon; + padding-top: 0.5em; + padding-left: 1.5em; + + &.mw-userpage-tmp { + font-weight: normal; + opacity: 0.67; + background-image: url( images/userAnonymous.svg ); + } + } + + #pt-userpage { + padding-top: 0; + + a { + display: inline-block; + } + } + + /* Show anonymous "Not logged in" text in gray */ + #pt-anonuserpage { + color: #54595d; + } + + .vector-menu-content-list { + display: flex; + flex-wrap: wrap; + flex-grow: 1; + justify-content: flex-end; + align-items: baseline; + } +} diff --git a/Vector/resources/skins.vector.styles.legacy/images/user-avatar.svg b/Vector/resources/skins.vector.styles.legacy/images/user-avatar.svg new file mode 100644 index 0000000..aa4ef95 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/images/user-avatar.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Vector/resources/skins.vector.styles.legacy/images/userAnonymous.svg b/Vector/resources/skins.vector.styles.legacy/images/userAnonymous.svg new file mode 100644 index 0000000..47f020e --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/images/userAnonymous.svg @@ -0,0 +1,4 @@ + + + anonynmous user + diff --git a/Vector/resources/skins.vector.styles.legacy/layouts/print.less b/Vector/resources/skins.vector.styles.legacy/layouts/print.less new file mode 100644 index 0000000..dba1870 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/layouts/print.less @@ -0,0 +1,37 @@ +/** + * Print styles previously provided by the deprecated `legacy` feature (T287410) + * Copied from mediawiki.skinning/commonPrint.less in Mediawiki 1.36 core + */ + +/** + * Hide all the elements irrelevant for printing + * Skins however can and should override. + */ +/* General hide-in-print class, please only use sparely */ +.noprint, +/* Various content classes, in alphabetical order */ +.mw-cite-backlink, +.mw-redirectedfrom, +.patrollink, +/* Various content ids, in alphabetical order */ +#column-one, +#footer-places, +#mw-navigation, +/* Deprecated, changed in core */ +#f-poweredbyico, +#f-copyrightico, +li#about, +li#disclaimer, +li#mobileview, +li#privacy { + display: none; +} + +#footer { + background: #fff; + color: #000; + margin-top: 1em; + border-top: 1pt solid #aaa; + padding-top: 5px; + direction: ltr; +} diff --git a/Vector/resources/skins.vector.styles.legacy/layouts/screen.less b/Vector/resources/skins.vector.styles.legacy/layouts/screen.less new file mode 100644 index 0000000..0b9747a --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/layouts/screen.less @@ -0,0 +1,195 @@ +/** + * Layout rules divide the page into sections and how VectorComponents should be arranged in the skin. + * The rules here should only define the layout, not color or typography. + * See '../../common/' folder for latter stylesheets. + */ + +@import 'mediawiki.mixins.less'; +@import '../../common/variables.less'; + +body { + background-color: @background-color-secondary; + overflow-y: scroll; +} + +.mw-body, +.parsoid-body { + // General background/foreground color definition as one exception to the rule. + background-color: @background-color-base; + color: @color-base; + direction: ltr; + padding: 1em; +} + +#p-personal { + position: absolute; + top: @top-personal-tools; + right: 0.75em; + z-index: @z-index-personal; + + ul { + padding-left: 10em; /* Keep from overlapping logo */ + } +} + +.mw-body, +#mw-data-after-content { + margin-left: 10em; +} + +.mw-body { + // Merge the border below with tabs' one (in their background image). + margin-top: -@border-width-base; + // Border on top, left, and bottom side. + border: @border-width-base @border-style-base @border-color-content; + border-right-width: 0; + + .firstHeading { + /* Change the default from mediawiki.skinning CSS to let indicators float into heading area */ + overflow: visible; + } +} + +.mw-indicators { + z-index: @z-index-indicators; +} + +.vector-body { + position: relative; + z-index: @z-index-base; +} + +/* Head */ +#mw-page-base { + .vertical-gradient( @background-color-base, @background-color-secondary, 50%, 100% ); + background-position: bottom left; + height: 5em; +} + +#mw-head-base { + margin-top: -5em; + margin-left: 10em; + height: 5em; +} + +/* Hide, but keep accessible for screen-readers */ +#mw-navigation h2 { + position: absolute; + top: -9999px; +} + +#mw-head { + position: absolute; + top: 0; + right: 0; + width: 100%; +} + +/* Navigation Containers */ +#left-navigation { + float: left; + margin-left: 10em; + margin-top: 2.5em; + /* When right nav would overlap left nav, it's placed below it + (normal CSS floats behavior). This rule ensures that no empty space + is shown between them due to right nav's margin-top. Page layout + is still broken, but at least the nav overlaps only the page title + instead of half the content. */ + margin-bottom: -2.5em; +} + +#right-navigation { + float: right; + margin-top: 2.5em; +} + +/* Search */ +.vector-search-box { + float: left; + margin-right: 0.5em; + margin-left: 0.5em; + + // FIXME: This selector requires knowledge of the internals of the search component + // and should not be used here. + form { + margin: 0.5em 0 0; + } +} + +// Defined as `div`. +// Provide extra element for gadgets due to `form` already carrying an `id`. +// FIXME: This selector requires knowledge of the internals of the search component +.vector-search-box-inner { + min-width: 5em; + // Support: IE 8, Firefox 18-, Chrome 19-, Safari 5.1-, Opera 19-, Android 4.4.4-. + width: 13.2em; + // Support: Modern browsers, responsive width. + width: 20vw; + max-width: 20em; +} + +/* Sidebar */ +#mw-panel { + position: absolute; + top: 0; + width: 10em; + left: 0; +} + +// hide the heading of the first menu +#p-logo + .mw-portlet .vector-menu-heading { + display: none; +} + +.mw-footer { + margin-left: 10em; + margin-top: 0; + padding: 0.75em; +} + +/* Vector screen styles for high definition displays. These rules cross the above components and are + grouped together here only for the sake of the media query common to each. */ +@media ( min-width: 982px ) { + .mw-body, + #mw-head-base, + #left-navigation, + #mw-data-after-content, + .mw-footer { + margin-left: 11em; + } + + .mw-body { + padding: 1.25em 1.5em 1.5em 1.5em; + } + + .mw-footer { + padding: 1.25em; + } + + #mw-panel { + padding-left: 0.5em; + } + + .vector-search-box { + margin-right: 1em; + } + + #p-personal { + right: 1em; + } +} + +// Directionality styles previously provided by the deprecated `legacy` feature (T287410) +// for HTML elements which do not carry dir HTML attributes. +// These have been copied across to legacy Vector to minimize disruption caused by T287701. +// If you are reading this comment in 2022, please consider checking usage in wikitext and +// removing them both. +.mw-content-ltr { + /* @noflip */ + direction: ltr; +} + +.mw-content-rtl { + /* @noflip */ + direction: rtl; +} diff --git a/Vector/resources/skins.vector.styles.legacy/skin-legacy.less b/Vector/resources/skins.vector.styles.legacy/skin-legacy.less new file mode 100644 index 0000000..2160db5 --- /dev/null +++ b/Vector/resources/skins.vector.styles.legacy/skin-legacy.less @@ -0,0 +1,23 @@ +/** + * Vector legacy stylesheets + * See '../common/common.less' for common screen and print Vector stylesheets. + */ + +@media screen { + // Layouts + @import './layouts/screen.less'; + + // Legacy specific components + @import './components/Menu.less'; + @import './components/MenuDropdown.less'; + @import './components/MenuTabs.less'; + @import './components/LegacySidebar.less'; + @import './components/SearchBox.less'; + @import './components/Sidebar.less'; + @import './components/TabWatchstarLink.less'; + @import './components/UserLinks.less'; +} + +@media print { + @import './layouts/print.less'; +} diff --git a/Vector/resources/skins.vector.styles/components/Dropdown.less b/Vector/resources/skins.vector.styles/components/Dropdown.less new file mode 100644 index 0000000..f987da2 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/Dropdown.less @@ -0,0 +1,80 @@ +@import '../../common/variables.less'; +@import '../../common/mixins.less'; +@import 'mediawiki.mixins.less'; + +/** + * Targets all dropdown labels. + * - language variants, Actions menus + * - more menu, user menu + * - ULS button in sticky header + */ +.vector-dropdown > .vector-menu-heading:not( .mw-ui-icon-element ) { + display: flex; + + &:after { + .mixin-vector-menu-heading-arrow(); + } +} + +/** + * Dropdown container + */ +.vector-dropdown { + .vector-dropdown-content, + > .vector-menu-content { + background-color: @background-color-base; + border: @border-width-base @border-style-base @border-color-base; + box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 ); + transition-property: opacity; + transition-duration: @transition-duration-base; + + .vector-feature-page-tools-disabled & { + // The menu content should not be narrower than the menu button. + min-width: 100%; + } + + .vector-feature-page-tools-enabled & { + padding: 4px 0; + // TODO Add consistent min/max values for dropdowns in T316055 + width: max-content; + max-width: 200px; + } + } +} + +.vector-feature-page-tools-enabled .vector-pinnable-element, +.vector-dropdown-content { + .vector-menu-heading { + .mixin-vector-dropdown-menu-item(); + .mixin-vector-menu-heading(); + } + + .mw-list-item a { + // Mirror styles from Dropdown.less + .mixin-vector-dropdown-menu-item(); + color: @color-link; + } + + > *:not( :last-child ) { + // Apply bottom border to every children of dropdown contents and pinnable elements except the last + border-bottom: @border-width-base @border-style-base @colorGray14; + } +} + +/** + * Dropdown menu items. + */ +.vector-dropdown .mw-list-item { + a { + .mixin-vector-dropdown-menu-item(); + + // The link is a mw-selflink in the case of temporary users. + &:not( .mw-selflink ) { + color: @color-link; + } + + .vector-feature-page-tools-disabled & { + .mixin-vector-dropdown-menu-item-deprecated(); + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/Footer.less b/Vector/resources/skins.vector.styles/components/Footer.less new file mode 100644 index 0000000..83b1566 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/Footer.less @@ -0,0 +1,9 @@ +.mw-footer { + border-top: @border-base; + padding: 0.75em 0; +} + +.mw-footer-container { + padding-top: 50px; + padding-bottom: 82px; +} diff --git a/Vector/resources/skins.vector.styles/components/Header.less b/Vector/resources/skins.vector.styles/components/Header.less new file mode 100644 index 0000000..00efd06 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/Header.less @@ -0,0 +1,95 @@ +@import '../../common/variables.less'; +@import '../../common/mixins.less'; +@import 'mediawiki.mixins.less'; + +// Header sizes defined in the description of T246170 and comment T246170#5957100 +@padding-vertical-header: 0.125em; +@margin-top-header: 0.5em; +@margin-bottom-header: 2em; + +// Logo sizes per specification in T245190. +@height-logo-icon: 3.125em; + +.mw-header { + // A min-height is set to account for projects where no icon is set. + min-height: @height-logo-icon; + padding: 8px 0; + // Vertical centering of header elements (IE>=11), requires Flexbox. + .flex-display(); + flex-wrap: nowrap; + // https://caniuse.com/#search=align-items + align-items: center; + + .vector-header-start, + .vector-header-end { + display: flex; + align-items: center; + } + + .vector-header-end { + flex-grow: 1; + } + + @media ( min-width: @min-width-desktop-wide ) { + // Ensure search box is aligned with content when search thumbnails or JS is off + .vector-feature-page-tools-disabled & .vector-search-box:not( .vector-search-box-auto-expand-width ), + .vector-feature-page-tools-disabled:not( .client-js ) & .vector-search-box { + padding-left: @size-search-expand; + } + + .client-js.vector-feature-page-tools-enabled & .vector-search-box.vector-search-box-auto-expand-width { + // Ensure search box is aligned with content when it autoexpands (i.e. search thumbnails) + margin-left: -@size-search-expand; + } + } + + @media ( min-width: @min-width-desktop ) { + .vector-search-box { + margin-right: @margin-end-search; + } + } + + @media ( max-width: @max-width-tablet ) { + /** + * Toggles the visibility of the search box at lower resolutions. + */ + &.vector-header-search-toggled { + .vector-header-start, + .search-toggle { + display: none; + } + + .vector-search-box-collapses > div { + display: block; + } + + .vector-search-box { + // T284242#7206507: Widen the suggestion results to the edge of the search + // button at small resolutions. + position: relative; + margin-right: @margin-end-search; + + // Override default max width at lower resolutions + > div { + max-width: none; + } + + .vector-feature-page-tools-disabled & { + margin-left: @padding-horizontal-tabs; + } + } + + // Make the menu below the search input wider, to match the width of the input+button + // rather than just the width of the input + .cdx-search-input__input-wrapper { + position: static; + } + + // Since the end button's corner is now right above the menu's corner, don't use a + // rounded corner here (T310525) + .cdx-typeahead-search--expanded .cdx-search-input__end-button { + border-bottom-right-radius: 0; + } + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/Icon.less b/Vector/resources/skins.vector.styles/components/Icon.less new file mode 100644 index 0000000..86a8a7c --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/Icon.less @@ -0,0 +1,5 @@ +// Make sure all icons are the correct color https://phabricator.wikimedia.org/T317800 +.mw-ui-icon:before { + // `@opacity-icon-base` equals to `#222` on `background-color: #fff`, closest to `#202122`. + opacity: @opacity-icon-base; +} diff --git a/Vector/resources/skins.vector.styles/components/LanguageDropdown.less b/Vector/resources/skins.vector.styles/components/LanguageDropdown.less new file mode 100644 index 0000000..14dbbce --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/LanguageDropdown.less @@ -0,0 +1,130 @@ +// The use of mixins.buttons requires @font-size-base to be defined for this to work in Storybook +@import '../../common/variables.less'; +@import '../../common/mixins.less'; +@import 'mediawiki.mixins.less'; + +// Note vector-feature-language-in-header-enabled class is not used here as that class +// only applies to main page. +// This must be limited to vector-page-titlebar as the mw-portlet-lang class is shared with +// the language portlet that can display in the sidebar. +.vector-page-titlebar .mw-portlet-lang { + // FIXME [review whether margin-top is needed] center vertically in heading. + // See also: `.vector-page-titlebar > .mw-ui-button` rule in PageTitlebar.less + margin-top: 2px; + box-sizing: border-box; + height: @height-button-lang; + flex-shrink: 0; + + // If there are no languages and JavaScript is not enabled there is no fallback so we hide + // the button altogether. + .mw-portlet-lang-heading-0 { + .client-nojs & { + display: none; + } + } + + .vector-menu-heading { + // Prevent select of span text "X languages" + user-select: none; + // Set opacity to `1` on language button (it applies to more menu because of label color). + opacity: @opacity-base; + + .vector-menu-heading-label { + // Special treatment for language button, based on Vector font-size + font-size: @font-size-base; + } + + // T291286: Temporarily use progressive ULS style + &.mw-ui-progressive.mw-ui-quiet { + .mw-ui-icon:before { + // Ensure inverted language icon is white + opacity: @opacity-base; + } + + &:after { + // Invert arrow color + background-image: url( ../common/images/arrow-down-progressive.svg ); + opacity: @opacity-base; + } + } + } + + input:active + .vector-menu-heading { + &.mw-ui-progressive.mw-ui-quiet { + .mw-ui-icon { + // stylelint-disable-next-line plugin/no-unsupported-browser-features + filter: brightness( 0 ) invert( 1 ); + } + + &:after { + background-image: url( ../common/images/arrow-down-invert.svg ); + } + } + } + + // The `vector-menu-content` class is present twice in current implementation of language switcher + // (see FIXME in Dropdown/Open.mustache) so it is important we target the direct child. + > .vector-menu-content { + top: auto; + left: -@border-width-base; + right: -@border-width-base; + // align borders of open menu align with button + box-sizing: border-box; + max-height: 65vh; + overflow: auto; + + // Adds to the show/hide technique in Dropdown.less with + // display to prevent rendering and long scrolling on Main page + display: none; + + li a { + font-size: inherit; + } + } + + .vector-menu-checkbox:checked ~ .vector-menu-content { + display: block; + } + + .after-portlet { + // ensure there is a visual separation between the language links and additional links. + margin-top: 10px; + } + + // styles for less prominent Language button (without label) to be used for non-content pages (see T316559) + .mw-portlet-lang-heading-empty + .vector-menu-content { + left: auto; + right: 0; + min-width: 300px; + + .mw-portlet-empty-language-selector-body { + padding: 20px; + border-bottom: @border-style-base @border-width-base @border-color-portal-heading; + color: @color-base--subtle; + } + } +} + +// Hides language button with CSS, ensures language button is in DOM for temporary JS hack for interwiki links +// Temporary solution to T287206, can be removed when ULS dialog includes interwiki links +#p-lang-btn.mw-portlet-empty { + display: none; +} + +.mw-interlanguage-selector { + display: flex; + + &:after { + .mixin-vector-menu-heading-arrow(); + } +} + +// Hide the "Add languages" on pages which are not action=view where there are 0 languages +.vector-dropdown > .vector-menu-heading.mw-portlet-lang-heading-0 { + display: none; +} + +// Show it on view pages where there are 0 languages so user can add languages (JavaScript required) +.client-js .action-view .vector-dropdown > .vector-menu-heading.mw-portlet-lang-heading-0 { + display: flex; +} diff --git a/Vector/resources/skins.vector.styles/components/Logo.less b/Vector/resources/skins.vector.styles/components/Logo.less new file mode 100644 index 0000000..9157689 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/Logo.less @@ -0,0 +1,81 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; + +.mw-logo { + .flex-display(); + // If icon is not configured, ensure that the logo still takes up available + // space allocated by layout. + height: 100%; + // Center vertically. + align-items: center; + // Hamburger menu icon with padding (22px + 12px = 46px) + right margin (12px) + logo (222px @ 16) + space between + // logo and searchbox (28px) = 296px which equals the sum of widths of sidebar elements (i.e. TOC) when toggled. + // 226px @ 16 provides correct spacing between the right edge of logo container + left edge of searchbox input. + min-width: 13.875em; // 222px @ 16 + + .vector-feature-page-tools-disabled & { + // The logo is 24px from the main menu button icon + margin-left: 24px; + } + + .vector-feature-page-tools-enabled.vector-feature-main-menu-pinned-disabled & { + // The logo is 40px from the page container. + // Main menu button width (20px) + 20px = 40px + margin-left: 20px; + } +} + +.mw-logo-icon { + // For browsers which do not support flexbox we float left. + // This will be ignored in flexbox browsers. + float: left; + margin-right: 10px; + // Hide mobile icon at lower resolutions and defer to wordmark + display: none; + @size-mw-logo-icon: unit( 50 / @font-size-browser, em ); + width: @size-mw-logo-icon; + height: @size-mw-logo-icon; + + @media ( min-width: @min-width-tablet ) { + display: block; + } +} + +.mw-logo-container { + // For browsers which do not support flexbox we float left. + // This will be ignored in flexbox browsers. + // The two children `div`s will lay out in a row. + float: left; + // At mobile resolutions restrict logo to 120px to optimize for a 340px display (@min-width-supported) + // (based on https://gs.statcounter.com/screen-resolution-stats/mobile/worldwide) + // This accounts for up to 5 icons + // (Echo notifications x 2, search, hamburger and personal menu) + // where the icons have 44px each (44x5 = 220px) + max-width: 120px; + + img { + width: 100%; + } + + @media ( min-width: @min-width-tablet ) { + max-width: none; + + img { + width: auto; + } + } +} + +// Note for 3rd parties where no wgLogos['wordmark'] is defined +// the site title is not clipped. We may need to revisit this later +// for projects with long site titles. +.mw-logo-wordmark { + display: block; + margin: 0 auto; +} + +.mw-logo-tagline { + // For browsers which do not support flexbox. + display: block; + margin: 5px auto 0; +} diff --git a/Vector/resources/skins.vector.styles/components/MainMenu.less b/Vector/resources/skins.vector.styles/components/MainMenu.less new file mode 100644 index 0000000..d4b0fe9 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/MainMenu.less @@ -0,0 +1,141 @@ +@import '../../common/variables.less'; +@import '../../common/mixins.less'; +@import 'mediawiki.mixins.less'; +@import '../layouts/screen.less'; +@import './checkboxHack.less'; + +// Ensure there is only 1 main menu landmark at anytime +.vector-main-menu-landmark { + .vector-feature-page-tools-enabled.vector-feature-main-menu-pinned-enabled .vector-header-start &, + .vector-feature-page-tools-enabled.vector-feature-main-menu-pinned-disabled .vector-main-menu-container & { + display: none; + } +} + +.vector-main-menu { + box-sizing: border-box; + + // Hide #p-navigation label + #p-navigation .vector-menu-heading { + display: none; + } +} + +.vector-feature-page-tools-enabled .vector-main-menu { + // Match styles of .mw-list-item a in PinnableElement.less + .vector-main-menu-action-opt-out a, + .vector-main-menu-action-lang-alert .vector-main-menu-action-content { + .mixin-vector-dropdown-menu-item(); + } + + .vector-main-menu-action-opt-out a { + font-weight: bold; + } + + .vector-main-menu-action-lang-alert .vector-main-menu-action-content { + padding-top: 0; + } + + .vector-language-sidebar-alert { + // Override default .mw-message-box styles + padding: 8px; + margin: 0; + } +} + +// Main menu when pinned in the sidebar +.vector-feature-page-tools-enabled #vector-main-menu-pinned-container .vector-main-menu { + // Align the left edge of the text with the page container + margin-left: -@padding-horizontal-dropdown-menu-item; + // Align border under pinnable header with border under page title + margin-top: 11px; + padding: @padding-vertical-dropdown-menu-item @padding-horizontal-dropdown-menu-item; + background-color: @background-color-secondary--modern; + + // Match styles of .mw-list-item a in PinnableElement.less + .vector-main-menu-action-opt-out a, + .vector-main-menu-action-lang-alert .vector-main-menu-action-content { + padding-left: 0; + padding-right: 0; + } +} + +// Main menu when unpinned in the dropdown +#vector-main-menu-unpinned-container .vector-main-menu { + .vector-language-sidebar-alert { + margin-bottom: 6px; + } +} + +.vector-feature-page-tools-disabled { + @media ( max-width: @max-width-tablet ) { + .vector-main-menu { + // Makes the sidebar full screen at lower resolutions. + width: 100%; + } + } + // Hide sidebar entirely when the checkbox is disabled + @{selector-main-menu-closed} ~ .vector-main-menu-container .vector-main-menu { + display: none; + } +} + +.vector-feature-page-tools-disabled .vector-main-menu { + // Temporary magic number, will be calculated after TOC specs are finalized + padding: 12px 19px 12px 9px; + background-color: @background-color-secondary--modern; + + @media ( min-width: @min-width-desktop ) { + // Magic number from the edge of the main menu to the start of the main menu text. + margin-left: -28px; + } +} + +.vector-feature-page-tools-disabled .vector-main-menu-action { + // Styles for MainMenuAction template. + .vector-main-menu-action-item { + // Align with the portal heading/links + // `.portal` + `.portal .body` + margin-top: 4px; + margin-bottom: 4px; + + .vector-main-menu-action-heading { + margin-bottom: 0.75em; + } + + .vector-main-menu-action-content { + > * { + font-size: @font-size-portal-list-item; + } + + > a { + font-weight: bold; + } + } + + // T295555 style overrides for temporary language switch alert (can be removed later ). + .vector-language-sidebar-alert { + padding: 0.75em; + } + } +} + +#mw-sidebar-button { + &:before { + /* @embed */ + .vector-feature-page-tools-disabled & { + background-image: url( images/chevronHorizontal-ltr.svg ); + } + + .vector-feature-page-tools-disabled @{selector-main-menu-closed} ~ .mw-header & { + /* @embed */ + background-image: url( images/menu.svg ); + } + } + + &:hover { + &:before { + opacity: 1; + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/MainMenuGroup.less b/Vector/resources/skins.vector.styles/components/MainMenuGroup.less new file mode 100644 index 0000000..7d8353c --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/MainMenuGroup.less @@ -0,0 +1,42 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; + +.vector-feature-page-tools-disabled .vector-main-menu-group, +.vector-feature-page-tools-disabled .vector-main-menu-action-item { + margin: 0 @margin-end-portal 0 @margin-start-portal; + padding: 0.25em 0; + direction: ltr; + + .vector-menu-heading { + .mixin-vector-menu-heading(); + font-size: @font-size-nav-main-heading; + margin: 0.5em 0 0 ( @margin-start-nav-main-body / @font-size-nav-main-heading ); + padding: 0.25em 0; + border-bottom-style: @border-style-base; + } + + .vector-menu-content { + margin-left: @margin-start-portal-body; + padding-top: 0; + + ul { + padding-top: 0.3em; + } + + li { + margin: 0; + padding: 0.25em 0; + font-size: @font-size-portal-list-item; + line-height: @line-height-nav; + word-wrap: break-word; + + a { + color: @color-link; + + &:visited { + color: @color-link--visited; + } + } + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/Menu.less b/Vector/resources/skins.vector.styles/components/Menu.less new file mode 100644 index 0000000..119cdab --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/Menu.less @@ -0,0 +1,6 @@ +.vector-menu { + ul { + list-style: none; + margin: 0; + } +} diff --git a/Vector/resources/skins.vector.styles/components/MenuTabs.less b/Vector/resources/skins.vector.styles/components/MenuTabs.less new file mode 100644 index 0000000..6e46019 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/MenuTabs.less @@ -0,0 +1,95 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; + +/** + * Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions) + */ + +/* Tab list items */ +.vector-menu-tabs { + float: left; + + // With mw-ui-icons, expand watchstar and wikilove links it to cover full touch area + .mw-list-item { + .mw-ui-icon { + // Align small icons with the bottom of the tabs. + // Height of tab is 38px, and small icon is 32px, + // With 2px border, 38 - 32 + 2 + margin: 8px 0 0 0; + } + } + + // T316574 Override visited link styles + .mw-list-item a { + color: @color-link; + } + + /* focus and hover have outlines. Text underline interferes with bottom border */ + .mw-list-item.vector-tab-noicon a:focus, + .mw-list-item.vector-tab-noicon a:hover { + text-decoration: none; + border-bottom: @border-width-base @border-style-base; + } + + .mw-list-item.new a, + .mw-list-item.new a:visited { + color: @color-link-new; + } + + .mw-list-item.selected a, + .mw-list-item.selected a:visited { + color: @color-link-selected; + border-bottom: @border-width-base @border-style-base; + } +} + +/** + * Tab list item appearance. Applies to both
    • 's inside .vector-menu-tabs + * and dropdown menus inside the article toolbar + */ +.vector-menu-tabs .mw-list-item.vector-tab-noicon, +.vector-page-toolbar-container .vector-menu-dropdown { + margin: 0 @padding-horizontal-tabs; +} + +.vector-menu-tabs .mw-list-item, +.vector-page-toolbar-container .vector-menu-dropdown > .vector-menu-heading { + // Only apply no wrap + white-space: nowrap; +} + +.vector-menu-tabs .mw-list-item, +.vector-page-toolbar-container .vector-menu-dropdown { + float: left; + margin-bottom: 0; /* overrides default `li` styling */ + + // target links inside of .vector-tab-menu + // and dropdown menu headings inside the article toolbar. + // NOTE: Consider adding a single selector to define both items, + // since they both appear beside each other in the article toolbar. + & > a, + > .vector-menu-heading { + display: inline-flex; + position: relative; + cursor: pointer; + // max-height & box-sizing to make link, watchstar & dropdown height consistent. + // NOTE: Was 40px instead of 41, but changed to avoid visual regressions. + max-height: unit( 41 / @font-size-tabs / @font-size-browser, em ); + box-sizing: border-box; + font-weight: normal; + } + + > .vector-menu-heading { + // For better compatibility with gadgets (like Twinkle) that append + //

      elements as dropdown headings (which was the convention in legacy Vector). + font-size: inherit; + } + + &.vector-tab-noicon > a, + > .vector-menu-heading { + // Top & bottom padding to increase clickable area. + padding: @padding-vertical-tabs; + // bottom margin to overlap border with toolbar border. + margin-bottom: -1px; + } +} diff --git a/Vector/resources/skins.vector.styles/components/PageTitlebar.less b/Vector/resources/skins.vector.styles/components/PageTitlebar.less new file mode 100644 index 0000000..af93c81 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/PageTitlebar.less @@ -0,0 +1,47 @@ +@import '../../common/variables.less'; + +.vector-page-titlebar { + display: flex; + + // Ensure language button or indicators are positioned to the right even when the title is hidden + justify-content: flex-end; + // Use box-shadow instead of border to allow border collapsing between titlebar and toolbar + box-shadow: 0 1px @border-color-base; + align-items: center; + + &-blank { + box-shadow: none; + } + + .firstHeading { + flex-grow: 1; + border: 0; + } + + .vector-page-titlebar-toc.ve-active { + display: none !important; /* stylelint-disable-line declaration-no-important */ + } + + > .mw-ui-button { + font-size: @font-size-base; + margin-top: 2px; + // When labels have multiple words e.g. "Add topic" make sure they do not wrap onto + // new line. This can happen when editing pages with long titles. e.g. F36867314 + white-space: nowrap; + + // At low resolutions, the rule in core for `.mw-ui-button:not(.mw-ui-icon-element)` + // interferes with add topic and makes it overlap the language button. e.g. F36867319 + &:not( .mw-ui-icon-element ) { + min-width: auto; + } + } + + > .mw-ui-button, + > .mw-portlet-lang { + &:last-child { + // This number should be synced with the value in: + // https://github.com/wikimedia/mediawiki/blob/master/resources/src/mediawiki.less/mediawiki.ui/mixins.buttons.less#L33 + margin-right: -12px; + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/PageToolbar.less b/Vector/resources/skins.vector.styles/components/PageToolbar.less new file mode 100644 index 0000000..f4b4cf4 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/PageToolbar.less @@ -0,0 +1,43 @@ +@import '../../common/variables.less'; + +@border-base-ems: unit( @border-width-base / @font-size-browser / @font-size-base, em ); + +.vector-page-toolbar-container { + display: flex; + font-size: @font-size-tabs; + // Use box-shadow instead of border to allow border collapsing between titlebar and toolbar + box-shadow: 0 1px @border-color-portal-heading; + // Add bottom margin to account for box-shadow + margin-bottom: 1px; + + .mw-portlet-views { + display: none; + + @media ( min-width: @min-width-tablet ) { + &:not( .emptyPortlet ) { + display: block; + } + } + } +} + +// ID Selectors outside of .vector-page-toolbar-container to avoid over-specificity. +#left-navigation { + // flex ensures all child elements align on one line. + display: flex; + margin-left: -@padding-horizontal-tabs; + // pushes #right-navigation to the end of the line. + flex-grow: 1; +} + +#right-navigation { + // flex ensures all child elements align on one line. + display: flex; + margin-right: -@padding-horizontal-tabs; + // Any dropdowns inside the right navigation in modern Vector (e.g. "more" menu). + // should be right-aligned to prevent horizontal scrolling. + .vector-menu-content { + left: auto; + right: -@border-width-base; + } +} diff --git a/Vector/resources/skins.vector.styles/components/PageTools.less b/Vector/resources/skins.vector.styles/components/PageTools.less new file mode 100644 index 0000000..095de81 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/PageTools.less @@ -0,0 +1,56 @@ +@import '../../common/variables.less'; +@import '../../common/mixins.less'; + +// Ensure there is only 1 page tools landmark at anytime +.vector-page-tools-landmark { + .vector-feature-page-tools-pinned-enabled .vector-page-toolbar-container &, + .vector-feature-page-tools-pinned-disabled .vector-column-end & { + display: none; + } +} + +.vector-column-end { + // T327460: Prevent subpixel rendering issues associated with the text and Chrome. + contain: paint; + + .vector-page-tools-landmark { + // stylelint-disable-next-line plugin/no-unsupported-browser-features + position: sticky; + top: 0; + margin-top: @margin-top-pinned-page-tools; + } +} + +.vector-page-tools { + #vector-page-tools-pinned-container & { + width: 140px; + // Match spacing of TOC and main menu + margin-left: @padding-horizontal-dropdown-menu-item; + max-height: ~'calc( 100vh - @{max-height-bottom-spacing-scroll-indicator} )'; + overflow-y: auto; + box-sizing: border-box; + padding-top: @padding-top-pinned-element; + // Add fade indicator. + .mixin-vector-scroll-indicator(); + } +} + +// FIXME: Remove the following selector when page tools feature is on by default, needed for LegacyMoreDropdown +.vector-feature-page-tools-disabled .vector-page-tools-landmark, +.vector-page-tools { + // Ensure collapsible items are visible on lower resolutions + .vector-more-collapsible-item { + display: block; + + @media ( min-width: @min-width-tablet ) { + display: none; + } + } + + // Make sure pcactions is displayed on lower resolutions (even if .emptyPortlet present) + .vector-has-collapsible-items { + @media ( max-width: @max-width-mobile ) { + display: block; + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/PinnableElement.less b/Vector/resources/skins.vector.styles/components/PinnableElement.less new file mode 100644 index 0000000..ba22c93 --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/PinnableElement.less @@ -0,0 +1,24 @@ +@import '../../common/variables.less'; + +.vector-pinned-container .vector-pinnable-element { + // Make the heading border line up with the edge of the text + // (Whereas in a dropdown, the border lines up with the edge of the dropdown container). + .vector-pinnable-header, + .vector-menu-heading, + .mw-list-item a { + padding-left: 0; + padding-right: 0; + } +} + +/** + * At lower resolutions, we want to hide the pinned containers since these + * elements collapse (become unpinned) at this resolution via PinnableElement.js. + * Although this is handled in JS, this rule prevents the pinned menu from + * appearing on pageload, at low resolutions, before the JS kicks in. + */ +@media ( max-width: @max-width-tablet ) { + .vector-pinned-container { + display: none; + } +} diff --git a/Vector/resources/skins.vector.styles/components/PinnableHeader.less b/Vector/resources/skins.vector.styles/components/PinnableHeader.less new file mode 100644 index 0000000..84a69bd --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/PinnableHeader.less @@ -0,0 +1,62 @@ +.vector-pinnable-header { + .vector-feature-page-tools-enabled & { + .mixin-vector-dropdown-menu-item(); + // Override display: flex applied by .mixin-vector-dropdown-menu-item() + display: block; + } +} + +.vector-pinnable-header[ hidden ] { + display: none; +} + +.vector-page-tools, +.vector-toc { + .vector-feature-page-tools-enabled .vector-pinned-container & .vector-pinnable-header { + // Match styles with tabs in page toolbar to ensure TOC and Page Tools pinnable headers + // align with page toolbar border + padding: @padding-vertical-tabs; + margin-bottom: -1px; + } +} + +.vector-pinnable-header-label { + display: inline-block; + color: @color-base--subtle; + font-size: unit( 14 / @font-size-browser, rem ); + margin: 0; + padding: 0; + border: 0; +} + +// Styles for the "move to sidebar/hide" buttons, hidden by default. +.vector-pinnable-header-toggle-button { + display: none; + border: 0; + padding: 0; + background-color: transparent; + color: @color-primary; + cursor: pointer; + + &:hover { + color: @color-primary--hover; + } + + &:before { + content: '@{msg-brackets-start}'; + color: @color-base--subtle; + } + + &:after { + content: '@{msg-brackets-end}'; + color: @color-base--subtle; + } +} + +.client-js { + // Pinnable behavior is only enabled when JS is on + .vector-pinnable-header-unpinned .vector-pinnable-header-pin-button, + .vector-pinnable-header-pinned .vector-pinnable-header-unpin-button { + display: inline-block; + } +} diff --git a/Vector/resources/skins.vector.styles/components/SearchBoxLoader.less b/Vector/resources/skins.vector.styles/components/SearchBoxLoader.less new file mode 100644 index 0000000..4177aaf --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/SearchBoxLoader.less @@ -0,0 +1,101 @@ +/** + * Loading indicator for search widget + * + * By adding a class on the parent search form + *
      + * A pseudo element is added via ':after' that mimics the appearance + * of the search suggestion and contains the text + * "Loading search suggestions" (message key: vector-search-loader). + * + * After appearing for more than a second, a progress-bar animation appears + * above the loading indicator. + * + **/ + +@import '../../common/variables.less'; + +// Derived from @size-search-figure in Codex. +// https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/typeahead-search/TypeaheadSearch.vue#676 +@size-search-figure: 40px; +// Derived from text input start icon padding in Codex. +// https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/text-input/TextInput.vue#257 +@padding-left-start-icon: 36px; +// Derived from @padding-vertical-menu-item: 8px in Codex. +// https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/typeahead-search/TypeaheadSearch.vue#678 +@padding-vertical-menu-item: 8px; + +.search-form__loader:after { + // Set the i18n message. + content: attr( data-loading-msg ); + // + // Position loader below the input. + display: flex; + flex-direction: column; + justify-content: center; + position: absolute; + top: 100%; + width: 100%; + // Compute the height of a Codex menu item: the height of the thumbnail + // + the padding around the thumbnail. Then also add our own border-bottom-width, because we're + // using box-sizing: border-box; + height: ~'calc( @{size-search-figure} + 2*@{padding-vertical-menu-item} + @{border-width-base} )'; + // + // Ensure the 100% width doesn't extend beyond the input. + box-sizing: border-box; + // + // Align loader style with input. + border: @border-base; + border-top-width: 0; // Hide the top border so it doesn't interfere with focus state. + border-radius: 0 0 @border-radius-base @border-radius-base; + box-shadow: @box-shadow-base; + padding-left: @padding-left-start-icon; + // + // Hide text in case it extends beyond the input. + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + // + // Prevent Vector tabs from overlapping T254695#6461044 + z-index: @z-index-search-loader; + // + // Add a progress-bar to the loading indicator, + // but only show it animating after 1 second of loading. + background: /*image*/ linear-gradient( 90deg, @colorProgressive 0%, @colorProgressive 100% ) + /* position / size*/ -10% 0 ~'/' 0 2px + /* repeat */ no-repeat,/*second bg, just color*/#fff; + // + // Animates the progress-bar. + animation: /* name */ search-loader-progress-bar + /* duration */ 1200ms + /* timing function */ linear + /* delay */ 500ms + /* iteration count */ infinite + /* fill direction */ alternate; + + .vector-search-box-show-thumbnail.vector-search-box-auto-expand-width & { + margin-left: @size-search-expand; + width: ~'calc( 100% - @{size-search-expand} )'; + } +} + +@keyframes search-loader-progress-bar { + 0% { + background-size: 0 2px; + background-position: -10% 0; + } + + 30% { + background-size: 30% 2px; + background-position: -10% 0; + } + + 70% { + background-size: 30% 2px; + background-position: 110% 0; + } + + 100% { + background-size: 0 2px; + background-position: 110% 0; + } +} diff --git a/Vector/resources/skins.vector.styles/components/StickyHeader.less b/Vector/resources/skins.vector.styles/components/StickyHeader.less new file mode 100644 index 0000000..073053c --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/StickyHeader.less @@ -0,0 +1,192 @@ +@import '../../common/variables.less'; +@import '../../common/mixins.less'; +@import 'mediawiki.mixins.less'; + +@spacing-search-title-divider: 30px; +@font-size-sticky-header-links: unit( 14 / @font-size-browser, em ); // Equals `0.875em`. + +.vector-sticky-header { + width: 100%; + max-width: @max-width-page-container; + height: @height-sticky-header; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: @z-index-header; + transition: @transition-sticky-header; + align-items: center; + margin: 0 auto; + background: @background-color-base; + background-color: #fffffff7; + border-bottom: @border-width-base @border-style-base @colorGray14; + justify-content: space-between; + box-sizing: border-box; + + .vector-feature-limited-width-disabled & { + max-width: none; + } + + // T317573 Account for page container. + padding: 6px @padding-horizontal-page-container-desktop; + + @media ( min-width: @min-width-desktop-wide ) { + padding: 6px @padding-horizontal-page-container-desktop-wide; + } + + // Hide sticky header until visible class is applied to the body + display: none; + transform: translateY( -100% ); + opacity: 0; + + // + // Layout + // + &-start, + &-end, + &-icons, + &-buttons, + &-context-bar { + display: flex; + align-items: center; + } + + &-start { + flex-grow: 1; + min-width: 0; + } + + // Apply nowrap to title and buttons + // Must apply to &-ccontext-bar-primary rather than &-context-bar or &-start + // to avoid applying nowrap to the collapsed TOC menu + &-context-bar-primary, + &-end { + white-space: nowrap; + } + + // + // Components + // + &-context-bar { + border-left: @border-width-base @border-style-base #c8c8c8; + padding-left: @spacing-search-title-divider; + min-width: 0; + margin-left: @spacing-search-title-divider; + } + + &-context-bar-primary { + overflow: hidden; + font-family: @font-family-serif; + // T296320 closest standardized option to 22px (24px) + font-size: @font-size-heading-2; + text-overflow: ellipsis; + + // T300134 Prevent text from wrapping in the sticky header. + wbr { + display: none; + } + } + + &-end { + font-size: @font-size-sticky-header-links; + } + + &-end, + &-icons, + &-buttons { + // Spacing between buttons + column-gap: 8px; + } + + &-buttons > .mw-ui-quiet { + // All quiet buttons, even those with labels, should have 5px horizontal padding + // TODO: Move this fix upstream? + padding: 5px; + } + + .vector-search-box { + // Hide the search box until the user toggles it. + display: none; + } + + &.vector-header-search-toggled { + // .vector-sticky-header-search-toggle left border (1px) + left padding (12px) + // - .cdx-text-input__start-icon left offset (9px [1]) = 4px + // [1] see https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/text-input/TextInput.vue#257 + @margin-start-search-box: 4px; + // .vector-sticky-header-search-toggle left border (1px) + left padding (12px) + // - .cdx-text-input__start-icon left offset (22px [2]) = -9px + // [2] see https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/typeahead-search/TypeaheadSearch.vue#708 + @margin-start-search-box-with-thumbnail: -9px; + + .vector-sticky-header-search-toggle, + .vector-sticky-header-context-bar { + display: none; + } + + .vector-search-box { + display: block; + margin-left: @margin-start-search-box; + } + + // T296318 Decrease the start margin of the search box to account for the + // icon's increased start position when the search component has thumbnails. + .vector-search-box-show-thumbnail { + margin-left: @margin-start-search-box-with-thumbnail; + + .cdx-text-input__start-icon { + color: @colorGray2; + } + } + } +} + +// T298836 Sticky header is only shown at higher resolutions +@media ( min-width: @min-width-desktop ) { + .client-js.vector-sticky-header-enabled { + // T290518: When the sticky header is enabled (feature flag is on, js is + // enabled, and viewport is at higher resolutions), add scroll padding to the + // root element. This is needed so that the sticky header does not overlap the + // top of an element when the URI has a hash fragment (e.g. when the user clicks + // a jump link) and when the user tabs through elements in reverse order. + // + // Please note that this class must be independent of the + // .vector-sticky-header-visible class to correctly handle situations where the + // sticky header isn't visible yet but we still need scroll padding applied + // (e.g. when the user navigates to a page with a hash fragment in the URI). + scroll-padding-top: ~'calc( @{height-sticky-header} + @{scroll-padding-top} )'; + + .vector-sticky-header { + // Sticky header is only enabled for js users and when feature flag is enabled + display: flex; + } + + .vector-sticky-header-visible { + .vector-sticky-header { + // Show sticky header with transition when visible class is applied to the body + opacity: @opacity-base; + transform: translateY( 0 ); + } + } + + // - T314330 `.vector-feature-toc-pinned-enabled #vector-toc-pinned-container` + // Prevent ToC from jumping when sticky header is enabled. + // - T289817 `.mw-sticky-header-element` provides an API for template developers + // to make their templates compatible with the Vector 2022 sticky header. + // @stable See the Integration notes for developers section at + // https://www.mediawiki.org/wiki/Reading/Web/Desktop_Improvements/Features/Sticky_Header + // - `.charts-stickyhead th` makes chart and table headers appear below the sticky header. + &.vector-feature-toc-pinned-enabled #vector-toc-pinned-container, + &.vector-feature-page-tools-pinned-enabled .vector-page-tools-landmark, + .mw-sticky-header-element, + .charts-stickyhead th { + /* stylelint-disable-next-line declaration-no-important */ + top: @height-sticky-header !important; + } + + #vector-toc-pinned-container .vector-toc, + #vector-page-tools-pinned-container .vector-page-tools { + max-height: ~'calc( 100vh - @{height-sticky-header} - @{max-height-bottom-spacing-scroll-indicator} )'; + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/TabWatchstarLink.less b/Vector/resources/skins.vector.styles/components/TabWatchstarLink.less new file mode 100644 index 0000000..98faa8d --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/TabWatchstarLink.less @@ -0,0 +1,25 @@ +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; +@import 'mediawiki.mixins.rotation.less'; + +/* Watch/Unwatch Icon Styling */ +/* Only use icon if the menu item is not collapsed into the "More" dropdown + * (in which case it is inside `.vector-menu-dropdown` instead of `.vector-menu-tabs`). */ +// Note: there's no watchstar for anon users so no need to worry about cached HTML when changing this class +// Loading watchstar link class. +.mw-watchlink a:before { + transition: transform 500ms; +} + +.mw-watchlink .loading:before { + /* Suppress the hilarious rotating focus outline on Firefox */ + outline: 0; + cursor: default; + pointer-events: none; + transform-origin: 50% 50%; +} + +.mw-ui-icon-wikimedia-unStar:before, +.mw-ui-icon-wikimedia-star.loading:before { + transform: rotate( 72deg ); +} diff --git a/Vector/resources/skins.vector.styles/components/TableOfContents.less b/Vector/resources/skins.vector.styles/components/TableOfContents.less new file mode 100644 index 0000000..95bc5da --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/TableOfContents.less @@ -0,0 +1,170 @@ +@import '../../common/variables.less'; + +.vector-toc { + max-height: 75vh; + box-sizing: border-box; + overflow-y: auto; + overflow-x: hidden; + background-color: @background-color-page-container; + + .vector-feature-page-tools-disabled & { + padding: @padding-top-tabs 12px 20px 27px; + + .vector-toc-pinnable-header { + // Override default pinnable header styles + padding: 0 0 12px 0; + border: 0; + line-height: initial; + } + } + + .vector-pinnable-header-label { + // Override heading element styles in elements.less + overflow: unset; + } + + .vector-toc-numb { + display: none; + } + + .vector-toc-toggle { + // For no-js users, toggling is disabled and icon is hidden + display: none; + position: absolute; + top: 1px; // visually center icon + left: ~'calc( -1 * @{size-toc-subsection-toggle-icon} - 1px )'; // leaves 6px between icon + text + width: @size-toc-subsection-toggle-icon; // ~22px @ 12 + height: @size-toc-subsection-toggle-icon; + font-size: 0.75em; // reduces size of toggle icon to 12px @ 16 + transition: @transition-duration-base; + color: transparent; + cursor: pointer; + + .vector-feature-page-tools-enabled & { + // Vertically center the icon with the text + margin-top: 2px; + } + } + + .vector-toc-link { + word-break: break-word; + color: @color-link; + display: block; + } + + // Highlight and bold active sections, active top sections that are unexpanded + // and active top sections that are the only active element. + .vector-toc-list-item-active, + .vector-toc-level-1-active:not( .vector-toc-list-item-expanded ), + .vector-toc-list-item-active.vector-toc-level-1-active { + > .vector-toc-link { + // Highlight active section + color: @color-base; + font-weight: bold; + + .vector-toc-text { + // Increase width to prevent line wrapping due to bold text + // Avoid applying on link element to avoid focus indicator changing size + width: ~'calc( 100% + @{padding-horizontal-dropdown-menu-item} )'; + } + } + } + + // Highlight active top sections that contain an active section + .vector-toc-level-1-active:not( .vector-toc-list-item-active ) > .vector-toc-link { + color: @color-base; + } + + .vector-toc-text { + .vector-feature-page-tools-disabled & { + padding: 4px 0; + } + + .vector-feature-page-tools-enabled & { + // Match .mixin-vector-dropdown-menu-item() vertical padding + padding: @padding-vertical-dropdown-menu-item 0; + } + } + + .vector-toc-contents, + .vector-toc-list { + margin: 0; + list-style: none; + + .vector-feature-page-tools-disabled & { + line-height: 18px; + } + } + + .vector-toc-list-item { + display: block; + position: relative; + list-style-type: none; + padding-left: 8px; + + .vector-feature-page-tools-enabled & { + margin: 0; + } + + &.vector-toc-level-1 { + padding-left: 0; + } + + a { + font-size: @font-size-base; + } + } +} + +// Collapse ToC sections by default, excluding no-js +.client-js .vector-toc { + .vector-toc-level-1 .vector-toc-list-item { + display: none; + } + + .vector-toc-level-1.vector-toc-list-item-expanded .vector-toc-list-item { + display: block; + } + + .vector-toc-toggle { + display: block; + } + + .vector-toc-level-1.vector-toc-list-item-expanded .vector-toc-toggle { + transform: rotate( 0deg ); + } +} + +.client-js body.ltr .vector-toc .vector-toc-toggle { + transform: rotate( -90deg ); +} + +.client-js body.rtl .vector-toc .vector-toc-toggle { + transform: rotate( 90deg ); +} + +// Ensure there is only 1 table of contents landmark at anytime +.vector-toc-landmark { + display: none; +} + +.client-js { + @media ( min-width: @min-width-desktop ) { + &.vector-feature-toc-pinned-disabled .vector-sticky-header-visible .vector-sticky-header .vector-toc-landmark, + &.vector-feature-toc-pinned-disabled body:not( .vector-sticky-header-visible ) .vector-page-titlebar .vector-toc-landmark, + &.vector-feature-toc-pinned-enabled .mw-table-of-contents-container.vector-toc-landmark { + display: block; + } + } + + @media ( max-width: @max-width-tablet ) { + // On lower resolutions the TOC will always be in the page titlebar regardless of the TOC pinned classes + .vector-page-titlebar .vector-toc-landmark { + display: block; + } + + .mw-table-of-contents-container.vector-toc-landmark { + display: none; + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/UserLinks.less b/Vector/resources/skins.vector.styles/components/UserLinks.less new file mode 100644 index 0000000..a37721a --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/UserLinks.less @@ -0,0 +1,133 @@ +@import '../../common/variables.less'; +@import '../../common/mixins.less'; +@import 'mediawiki.mixins.less'; +@import 'mediawiki.ui/variables.less'; + +@font-size-user-links: unit( 14 / @font-size-browser, em ); // Equals `0.875em`. +// Applies to links in the overflow menu that do not have the .mw-ui-button class. +@overflow-link-margin: 0 8px; + +/** + * Container that holds both the horizontal menu and dropdown menus. + */ +.vector-user-links { + display: flex; + align-items: center; + position: relative; + justify-content: flex-end; + flex-shrink: 1; + + .mw-ui-button { + // FIXME: Overrides mw-ui-button's `display: inline-block` property so that + // the text in the button is vertically centered. `.mw-ui-button` sets a + // min-height to the button, but should also vertically center the + // button's children. + display: flex; + align-items: center; + } + + .mw-list-item { + margin: 0; + } +} + +/** + * Both logged-in and logged-out dropdown menus. + */ +.vector-user-menu { + .vector-menu-content { + left: auto; + right: 0; + + .vector-feature-page-tools-disabled & { + min-width: 200px; + } + } + + // Used to hide collapsible items inside the dropdown menu + // as well as the dropdown menu itself when the menu is empty + &.user-links-collapsible-item, + .user-links-collapsible-item { + @media ( min-width: @min-width-tablet ) { + display: none; + } + } +} + +/** + * Horizontal links menu - logged in and logged out. + */ +.vector-user-links .mw-portlet-vector-user-menu-overflow { + font-size: @font-size-user-links; + + .vector-menu-content-list { + display: flex; + align-items: center; + } + + // TODO: Simplify button, icon button and link styling with T323244 + @media ( min-width: @min-width-desktop ) { + // Right margin to separate overflow menu from dropdown + margin-right: 8px; + + // Separate icon buttons inside the overflow menu + .vector-menu-content-list { + column-gap: 8px; + } + } + + // Add margin to links that don't have the .mw-ui-button or related icon classes. + a:not( .mw-ui-button ):not( .mw-echo-notifications-badge ) { + margin: 0 8px; + } + + .user-links-collapsible-item { + @media ( max-width: @max-width-mobile ) { + display: none; + } + } +} + +/** + * Logged-in dropdown menu + */ +.vector-user-menu-logged-in { + .vector-menu-heading:after { + .mixin-vector-menu-heading-arrow(); + } +} + +/** + * Dropdown menu items- Special treatment for special links. + */ +#p-user-menu-anon-editor .vector-menu-heading { + display: block; + + a:before { + content: '@{msg-parentheses-start}'; + } + + a:after { + content: '@{msg-parentheses-end}'; + } +} + +//User-page link in personal (overflow) menu. +#pt-userpage-2 { + max-width: unit( 155 / @font-size-browser / @font-size-user-links, em ); + + a:not( .mw-selflink ) { + // T312157 Override redlink (.new) color for non-existant userpage + color: @color-primary; + } + + span { + .text-overflow( @visible: false ); + } + + // T287522#7295558: Increase the max-width of the username when viewport + // allows for it. + @media ( min-width: @min-width-desktop-wide ) { + max-width: unit( 200 / @font-size-browser / @font-size-user-links, em ); + } +} diff --git a/Vector/resources/skins.vector.styles/components/VueEnhancedSearchBox.less b/Vector/resources/skins.vector.styles/components/VueEnhancedSearchBox.less new file mode 100644 index 0000000..a4f489f --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/VueEnhancedSearchBox.less @@ -0,0 +1,182 @@ +@import '../../common/variables.less'; + +/** + * Minimal styling for initial no-JS server-rendered + * search form, which gets replaced by Codex on focus. + * Most values are hard-coded since they aim to + * mimic Codex-specific variables and disable the + * ResourceLoader LESS transformation of `calc`. + */ + +// Derived from @size-base design token in Codex +@size-base: 32px; + +@min-size-search-button: 30px; +@background-size-x-search-button: 20px; + +// Search container +// We have to put those styles outside `.skin-vector-search-vue`, +// as we can't address no-JS modern and Vue enhanced otherwise. +.vector-search-box { + // Use Vector's base font-size, as this is a component outside of `.vector-body`. + font-size: @font-size-base; + // Support IE 9-11, Trident cuts values 2 digits after decimal point. + // `calc` enables to set correct calculation in place again. See T102364. + font-size: @font-size-base--trident-hack; + // If this is a flex item, make sure it grows into available space. + flex-grow: 1; + + > div { + max-width: @max-width-search; + } +} + +// Typeahead search elements +.vector-search-box-vue .vector-search-box-input, +.vector-search-box-vue .searchButton { + // Overrides #mw-searchButton in resources/skins.vector.styles/SearchBox.less + font-size: inherit; +} + +.vector-search-box-vue .vector-search-box-input { + height: auto; + // The following is copied directly from Codex. + min-height: @size-base; + line-height: 1.4285714; + padding-top: 4px; + padding-bottom: 4px; +} + +.vector-search-box-vue .searchButton { + background-size: @background-size-x-search-button auto; +} + +// Only apply the following Codex-related rules to clients who have js enabled. +.client-js .vector-search-box-vue { + // Derived from @size-search-figure in Codex. + // https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/typeahead-search/TypeaheadSearch.vue#676 + @size-search-figure: 40px; + // Derived from text input start icon padding in Codex. + // https://gerrit.wikimedia.org/r/plugins/gitiles/design/codex/+/refs/tags/v0.1.0-alpha.8/packages/codex/src/components/text-input/TextInput.vue#257 + @padding-left-start-icon: 36px; + // Derived from the @size-icon-medium token in Codex. 14px is the base font size in Vector. + @size-icon-medium: unit( 20 / 14, em ); + // Derived from icon positioning in Codex. This is essentially (@padding-left-start-icon - @size-icon-medium)/2 + @position-left-icon: 8px; + + .vector-typeahead-search { + // Hide the button, only show it on hover or when the input or the button itself is focused + .cdx-search-input__end-button { + opacity: 0; + // 250ms transition to match the border-color transition in CdxTextInput + transition: opacity 250ms; + + &:focus { + opacity: @opacity-base; + } + } + + // Hide the border between the input and the button + .cdx-text-input__input:not( :hover ):not( :focus ) { + border-right-color: transparent; + } + + &--active, + &:hover { + .cdx-search-input__end-button { + opacity: @opacity-base; + } + + // Make the text input's right border appear on top of the button's left border, + // otherwise the hover transition looks weird + .cdx-text-input { + z-index: 1; + } + + // Use straight corners instead of rounded corners for the border between the + // input and the button. Only apply this on hover, to reduce (but not eliminate) the + // tiny gap in the input's border when the button is hidden + .cdx-text-input__input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + .cdx-menu-item { + // Remove margin-bottom on li elements that is applied by + // mediawiki.skinning/elements.css. + margin-bottom: 0; + + a { + // Remove link underline on hover that is applied by + // mediawiki.skinning/elements.css. + text-decoration: none; + } + } + + // Reset Codex. Prevents the input border and the start icon from animating + // when the input gets inserted into the DOM while being focused. + &.vector-search-box-disable-transitions { + .cdx-text-input__input:enabled, + .cdx-text-input__start-icon { + transition: none; + } + } + } + + .vector-search-box-input { + padding-left: @padding-left-start-icon; + // Derived from @padding-input-text in Codex's TextInput component. + padding-right: 8px; + } + + // Move & resize search icon to match Codex. + .searchButton { + // T270202: Act like a an inert element instead of a submit button before + // Codex loads to discourage people clicking on it since it is a submit + // button styled to look like Codex's inert start icon. Note, ideally these + // submit buttons should be changed to inert elements like span to be + // semantically correct. + pointer-events: none; + // Override the default right & left position of the icon. + right: auto; + top: 0; + bottom: 0; + // Accounts for the 1px input border. + left: @border-width-base; + // Increase size to match Codex. + width: @padding-left-start-icon; + // Set opacity to match icon color from Codex (0.51 approximates #72777d) + opacity: @opacity-icon-base--disabled; + // Use relative sizing for the icon + background-size: @size-icon-medium auto; + // Make sure the icon is positioned consistently with Codex; if we don't do this, it'll + // be centered which will be different from Codex's positioning if the text size zoom + // is not 100% + background-position-x: @position-left-icon; + } + + .vector-search-box-input:focus ~ .searchButton { + // When the input is focused, change icon color to match Codex (0.87 approximates #202122) + opacity: @opacity-icon-base; + } + + &.vector-search-box-show-thumbnail { + > div { + // Ensure the input + search button = 500px when unfocused and `auto-expand-width` enabled (i.e. search in header) + // Also increases the width of the sticky header search, which has `auto-expand-width` disabled + max-width: @max-width-search + unit( @size-search-expand / @font-size-browser / @font-size-base, em ); // 37.42857143em @ 16 & 0.875em + } + + &.vector-search-box-auto-expand-width .searchButton { + // Accounts for the margin that allocates space for the input expanding and + // 1px input border. + left: @size-search-expand + @border-width-base; + } + + &.vector-search-box-auto-expand-width .vector-search-box-input { + margin-left: @size-search-expand; + width: ~'calc( 100% - @{size-search-expand} )'; + } + } +} diff --git a/Vector/resources/skins.vector.styles/components/checkboxHack.less b/Vector/resources/skins.vector.styles/components/checkboxHack.less new file mode 100644 index 0000000..f197bba --- /dev/null +++ b/Vector/resources/skins.vector.styles/components/checkboxHack.less @@ -0,0 +1,47 @@ +// This file is being considered for Core as part of T252774. + +// Notes: +// +// - Usage requires three elements: a hidden checkbox input, a button, and a show / hide target. +// - By convention, the checked state is considered expanded or visible. Unchecked is considered +// hidden. +// - Please see additional documentation in checkboxHack.js for example HTML and JavaScript +// integration. +// +// Example supplemental styles (to be added on a per use case basis): +// +// - Animate target in and out from start (left in LTR) to end (right in LTR): +// +// .mw-checkbox-hack-checkbox:not( :checked ) ~ .mw-checkbox-hack-target { +// // Turn off presentation so that screen readers get the same effect as visually +// // hiding. Visibility and opacity can be animated. If animation is unnecessary, all +// // of this can be replaced with `display: none` instead to avoid hidden rendering. +// visibility: hidden; +// opacity: 0; +// transition-property: transform, opacity, visibility; +// transition-duration: @transition-duration-base; +// transition-timing-function: ease-in-out; +// transform: translateX( -100% ); +// } +// +// - Show / hide the target instantly without animation: +// +// .mw-checkbox-hack-checkbox:not( :checked ) ~ .mw-checkbox-hack-target { +// display: none; +// } + +@import '../../common/variables.less'; + +.mw-checkbox-hack-checkbox { + // We don't want the browser to focus on the checkbox so we remove it from the + // accessibility tree. Instead, we want the label button to receive focus + // which has a tabindex of '0'. + display: none; +} + +.mw-checkbox-hack-button { + // Labels are inlined by default but are also an icon having width and height specified. + display: inline-block; + // Use the hand icon for the toggle button which is actually a checkbox label. + cursor: pointer; +} diff --git a/Vector/resources/skins.vector.styles/images/chevronHorizontal-ltr.svg b/Vector/resources/skins.vector.styles/images/chevronHorizontal-ltr.svg new file mode 100644 index 0000000..74f80dc --- /dev/null +++ b/Vector/resources/skins.vector.styles/images/chevronHorizontal-ltr.svg @@ -0,0 +1,7 @@ + + + + chevron + + + diff --git a/Vector/resources/skins.vector.styles/images/chevronHorizontal-rtl.svg b/Vector/resources/skins.vector.styles/images/chevronHorizontal-rtl.svg new file mode 100644 index 0000000..7f78719 --- /dev/null +++ b/Vector/resources/skins.vector.styles/images/chevronHorizontal-rtl.svg @@ -0,0 +1,7 @@ + + + + chevron + + + diff --git a/Vector/resources/skins.vector.styles/images/menu.svg b/Vector/resources/skins.vector.styles/images/menu.svg new file mode 100644 index 0000000..17bf7cd --- /dev/null +++ b/Vector/resources/skins.vector.styles/images/menu.svg @@ -0,0 +1,7 @@ + + + + menu + + + diff --git a/Vector/resources/skins.vector.styles/layouts/gradeC.less b/Vector/resources/skins.vector.styles/layouts/gradeC.less new file mode 100644 index 0000000..dbc5346 --- /dev/null +++ b/Vector/resources/skins.vector.styles/layouts/gradeC.less @@ -0,0 +1,17 @@ +// +// No grid support behaviour +// + +// If there is no display grid support we remove the table of contents +// On IE11 this leaves a clean single column grid. +// To be revisited when table of contents is collapsible in which situation we should be able to +// force it as sticky. +.vector-pinned-container { + display: none; +} + +@supports ( display: grid ) { + .vector-pinned-container { + display: block; + } +} diff --git a/Vector/resources/skins.vector.styles/layouts/grid.less b/Vector/resources/skins.vector.styles/layouts/grid.less new file mode 100644 index 0000000..86c642d --- /dev/null +++ b/Vector/resources/skins.vector.styles/layouts/grid.less @@ -0,0 +1,175 @@ +// +// Grid layout +// + +// Match styles between TOC and fade element to ensure the fade covers the correct area +// This is expressed in pixels to support different font sizes since our layout is currently +// expressed in pixels. See T313817. +.vector-feature-page-tools-disabled #vector-toc-pinned-container .vector-toc:after, +.vector-feature-page-tools-disabled #vector-toc-pinned-container .vector-toc, +.vector-feature-page-tools-disabled .vector-main-menu { + // T305069 Layout adjustments of sidebar elements + // Align the left edge of main menu with the main menu button. + width: 220px; + + // Align the left edge of main menu with the main menu button icon. + @media ( min-width: @min-width-desktop-wide ) { + width: 244px; + } +} + +/* Use of minmax is important to restrict the maximum grid column width more information: T314756 */ +@grid-template-column-desktop: ~'@{width-column-start-desktop} minmax(0, 1fr)'; +@grid-template-column-desktop-wide: ~'@{width-column-start-desktop-wide} minmax(0, 1fr)'; + +@media ( min-width: @min-width-desktop ) { + .mw-page-container-inner { + display: grid; + column-gap: @grid-column-gap; + grid-template: ~'min-content min-content min-content 1fr min-content / @{grid-template-column-desktop}'; + grid-template-areas: 'header header' + 'siteNotice siteNotice' + 'mainMenu pageContent' + 'toc pageContent' + 'footer footer'; + } + + .vector-feature-page-tools-disabled .mw-page-container-inner { + column-gap: @grid-column-gap + 8px; // 8px + 12px (.mw-body padding-left) = 20px total spacing + } + + .vector-sitenotice-container { + grid-area: siteNotice; + } + + .mw-table-of-contents-container { + grid-area: toc; + overflow-anchor: none; // T330108 + } + + .mw-header { + grid-area: header; + } + + .vector-main-menu-container { + grid-area: mainMenu; + overflow-anchor: none; // T330108 + } + + .mw-content-container { + grid-area: pageContent; + } + + .mw-footer-container { + grid-area: footer; + } +} + +@media ( min-width: @min-width-desktop-wide ) { + .mw-page-container-inner { + grid-template-columns: @grid-template-column-desktop-wide; + } + + .vector-feature-page-tools-enabled .mw-header { + display: grid; + column-gap: @grid-column-gap; + grid-template: ~'auto / @{grid-template-column-desktop-wide}'; + grid-template-areas: 'headerStart headerEnd'; + + .vector-header-start { + grid-area: headerStart; + } + + .vector-header-end { + grid-area: headerEnd; + } + } +} + +.mw-content-container, +.mw-table-of-contents-container { + .vector-feature-page-tools-disabled & { + max-width: @max-width-content-container; + } + + .vector-feature-limited-width-disabled &, + .vector-feature-limited-width-content-disabled & { + // Allow the max-width of content on history/special pages to be wider than + // the max-width of content on article pages. + // Note, we don't disable the max-width on .vector-page-toolbar-container intentionally + // to support easier navigation between tabs. + // See T293441 for further information on that. + // Both rules are !important as they are final. Max-width on a page should be restored by removing the `skin-vector-disable-max-width`, + // preferably by modification to the feature flag VectorMaxWidthOptions. Code should never attempt to override this rule. + /* stylelint-disable-next-line declaration-no-important */ + max-width: none !important; + /* stylelint-disable-next-line declaration-no-important */ + width: 100% !important; + } +} + +// Horizontally center content when column start is empty (i.e. no pinned ToC or pinned main menu) +.vector-feature-page-tools-disabled { + + @{selector-sidebar-no-toc-sidebar-closed}, + &.vector-feature-toc-pinned-disabled @{selector-main-menu-closed} { + & ~ .mw-content-container { + grid-column: mainMenu / pageContent; + margin-left: auto; + margin-right: auto; + width: 100%; + } + } +} + +// Horizontally center content when column start is empty (i.e. no pinned ToC or pinned main menu) +.vector-feature-page-tools-enabled { + &.vector-feature-main-menu-pinned-disabled .vector-sidebar-container-no-toc ~ .mw-content-container, + &.vector-feature-main-menu-pinned-disabled.vector-feature-toc-pinned-disabled .mw-content-container { + grid-column: mainMenu / pageContent; + margin-left: auto; + margin-right: auto; + } +} + +@media ( min-width: @min-width-desktop ) { + .vector-feature-page-tools-enabled .mw-body { + display: grid; + grid-template: ~'min-content min-content min-content 1fr / minmax(0, @{max-width-content-container}) min-content'; + /** + * NOTE: T327715 - 'titlebar-cx' grid area is a temporary workaround to accommodate + * the Content Translation extension and should not be used beyond that. + * FIXME: This can be removed when T322740 is resolved. + */ + grid-template-areas: 'titlebar-cx .' + 'titlebar columnEnd' + 'toolbar columnEnd' + 'content columnEnd'; + + .vector-feature-page-tools-pinned-enabled& { + column-gap: @grid-column-gap; + } + + .vector-feature-limited-width-disabled&, + .vector-feature-limited-width-content-disabled& { + grid-template-columns: ~'minmax(0, 1fr) min-content'; + } + + .vector-page-titlebar { + grid-area: titlebar; + } + + .vector-page-toolbar { + grid-area: toolbar; + } + + #bodyContent { + grid-area: content; + } + + .vector-column-end { + grid-area: columnEnd; + overflow-anchor: none; // T330108 + } + } +} diff --git a/Vector/resources/skins.vector.styles/layouts/print.less b/Vector/resources/skins.vector.styles/layouts/print.less new file mode 100644 index 0000000..dbb64af --- /dev/null +++ b/Vector/resources/skins.vector.styles/layouts/print.less @@ -0,0 +1,22 @@ +/* stylelint-disable no-invalid-double-slash-comments */ +@import 'mediawiki.mixins.less'; + +// Used to be under #mw-navigation, which is hidden in common/print.less +.vector-page-toolbar, +// Hide main menu checkbox +#mw-sidebar-checkbox, +// Hide all header content except the logo +.vector-header-start > *:not( .mw-logo ), +.vector-header-end, +// T300178, T306719 +#mw-panel-toc, +#vector-sticky-header, +#p-lang-btn, +.vector-menu-checkbox, +// Hide all navigation +nav, +#vector-page-titlebar-toc, +#footer { + /* stylelint-disable-next-line declaration-no-important */ + display: none !important; +} diff --git a/Vector/resources/skins.vector.styles/layouts/screen.less b/Vector/resources/skins.vector.styles/layouts/screen.less new file mode 100644 index 0000000..4aeb810 --- /dev/null +++ b/Vector/resources/skins.vector.styles/layouts/screen.less @@ -0,0 +1,158 @@ +/** + * Vector modern layout styles for screen + * + * Layout rules divide the page into sections and how VectorComponents should be arranged in the skin. + * The rules here should only define the layout, not color or typography. + */ + +@import '../../common/variables.less'; +@import 'mediawiki.mixins.less'; + +@selector-sidebar-no-toc-sidebar-closed: ~'@{selector-main-menu-closed} ~ .vector-sidebar-container-no-toc'; + +// Content container + +// Note this uses variables defined in mediawiki.skin.variables so that VisualEditor can read them +// see T259331. +@padding-content: @padding-top-content 0 1.5em; + +// Breakpoints + +// Defines the minimum viewport width, at which point the layout will not get any +// smaller and will start horizontal scrolling instead. +@min-width-supported: unit( 500px / @font-size-browser, em ); + +html { + scroll-padding-top: @scroll-padding-top; +} + +body { + background-color: @background-color-secondary--modern; + color: @color-base; + // Vertical scrollbar always visible. + overflow-y: scroll; +} + +.mw-body, +.parsoid-body { + direction: ltr; +} + +.mw-body { + // T315261 Remove horizontal padding, rely on .mw-page-container padding instead + padding: @padding-content; + + .firstHeading { + word-wrap: break-word; + margin-bottom: 0; + } +} + +.mw-header { + // allow z-index to apply so search results overlay article + position: relative; + z-index: @z-index-header; +} + +.mw-body-content { + margin-top: 16px; +} + +/* Main column */ +.mw-body, +#mw-data-after-content, +.mw-footer { + margin-left: 0; +} + +/* Content */ +.mw-indicators { + z-index: @z-index-indicators; +} + +.vector-page-titlebar { + .mixin-clearfix(); +} + +.vector-body-before-content { + // Contain the floating .mw-indicators, but don't use clearfix because of browser inconsistencies + // when combining 'clear' and 'margin-top' (T325391) + overflow: hidden; +} + +.mw-body .mw-portlet-lang { + float: right; +} + +.vector-body { + position: relative; + z-index: @z-index-base; +} + +#siteSub { + // By default its hidden as it was hidden in Vector legacy but site styles can reveal. + display: none; + margin-top: 8px; // T311564 +} + +// Styles only applied to non-empty #contentSub to avoid extra margins when both #contentSub and #contentSub2 +// are rendered. +#contentSub:not( :empty ), +#contentSub2 { + font-size: 84%; + line-height: 1.2em; + color: @color-base--subtle; + width: auto; + // Visually separate #contentSub and #contentSub2 (T315639) + margin: 8px 0 0; +} + +.parsoid-body { + padding: @padding-content; +} + +// Container logic. +.mw-page-container { + // Setting position and z-index is important as it allows overlays appended to the body tag + // to position themselves over the Vector interface. This forms another stacking context for + // elements placed inside this element + position: relative; + z-index: 0; + max-width: @max-width-page-container; + // Set a min-width to make explicit we do not support anything below this threshold. + // For devices too small, they should be more useable with horizontal scrolling. + // e.g. Portrait on an iPad + min-width: @min-width-supported; + // Fill the viewport even if the content height is small. This also helps + // mitigate a long sidebar overflowing the page container (T257518). + min-height: 100%; + margin-left: auto; + margin-right: auto; + // Use non-zero padding to disable margin collapse. + // Be careful not to use overflow-y: scroll here (see T270146 and T271868) + padding: 0.05px @padding-horizontal-page-container; + background-color: @background-color-page-container; + box-sizing: border-box; + + .vector-feature-limited-width-disabled & { + max-width: none; + } + + @media ( min-width: @min-width-desktop ) { + padding-left: @padding-horizontal-page-container-desktop; + padding-right: @padding-horizontal-page-container-desktop; + } + + @media ( min-width: @min-width-desktop-wide ) { + padding-left: @padding-horizontal-page-container-desktop-wide; + padding-right: @padding-horizontal-page-container-desktop-wide; + } +} + +.skin--responsive .mw-page-container { + min-width: auto; +} + +@import 'grid.less'; +@import 'toc/pinned.less'; +@import 'toc/unpinned.less'; diff --git a/Vector/resources/skins.vector.styles/layouts/toc/pinned.less b/Vector/resources/skins.vector.styles/layouts/toc/pinned.less new file mode 100644 index 0000000..bd928a2 --- /dev/null +++ b/Vector/resources/skins.vector.styles/layouts/toc/pinned.less @@ -0,0 +1,71 @@ +@import '../../../common/variables.less'; +@import '../../../common/mixins.less'; + +.mw-table-of-contents-container { + // Needed for Grid-based layout + align-self: start; + height: 100%; +} + +@media ( min-width: @min-width-desktop ) { + #mw-panel-toc { + .vector-feature-toc-pinned-enabled & { + // Support: Chrome + // Work around sticky-positioned layers disabling subpixel text rendering (T327460). + // NOTE: This property has an effect similar to 'overflow: hidden', and will prevent elements + // inside of the panel from being rendered outside of its bounding box, even when they would + // be positioned there using absolute positioning, negative margin, transforms, etc. + // That's why the negative margins have to be applied here, instead of on #vector-toc. + contain: paint; + } + + .vector-feature-page-tools-disabled.vector-feature-toc-pinned-enabled & { + // Align the left edge of the TOC text with the main menu button icon. + margin-left: -27px; + } + + .vector-feature-page-tools-enabled.vector-feature-toc-pinned-enabled & { + // Align the left edge of the TOC text with the page container + margin-left: -@spacing-subsection-toggle; + } + } + + #vector-toc-pinned-container { + // stylelint-disable-next-line plugin/no-unsupported-browser-features + position: sticky; + top: 0; + + .vector-feature-toc-pinned-enabled & { + // Default spacing separating the sidebar TOC from the main menu. + margin-top: 1.5em; + } + + .vector-feature-page-tools-disabled.vector-feature-toc-pinned-enabled @{selector-main-menu-closed} ~ .mw-table-of-contents-container & { + // Needed to align TOC with bottom of title. + margin-top: @margin-top-pinned-toc; + } + + .vector-feature-page-tools-enabled.vector-feature-main-menu-pinned-disabled.vector-feature-toc-pinned-enabled & { + // Align TOC with bottom of title when main menu is not pinned but the TOC is + margin-top: @margin-top-pinned-toc; + } + + // T302076: Add fade scrollable indicator when TOC is in sidebar + // Avoid showing indicator when the TOC is floating, or collapsed in the page title/sticky header + .vector-toc { + max-height: ~'calc( 100vh - @{max-height-bottom-spacing-scroll-indicator} )'; + + .mixin-vector-scroll-indicator(); + } + + .vector-feature-page-tools-disabled & .vector-toc { + padding-top: ~'calc( @{padding-top-pinned-element} + @{padding-top-tabs} )'; + } + + .vector-feature-page-tools-enabled & .vector-toc { + padding-top: @padding-top-pinned-element; + padding-left: @spacing-subsection-toggle; + padding-right: @padding-horizontal-dropdown-menu-item; + } + } +} diff --git a/Vector/resources/skins.vector.styles/layouts/toc/unpinned.less b/Vector/resources/skins.vector.styles/layouts/toc/unpinned.less new file mode 100644 index 0000000..b4274f0 --- /dev/null +++ b/Vector/resources/skins.vector.styles/layouts/toc/unpinned.less @@ -0,0 +1,167 @@ +@import '../../../common/variables.less'; +@import '../../../common/mixins.less'; + +@selector-nojs-collapsed-toc-open: ~'#vector-toc-collapsed-checkbox:checked'; + +// FIXME: Move into .mixin-toc-unpinned() when PageTools feature is enabled everywhere +.vector-feature-page-tools-enabled .vector-unpinned-container .vector-toc { + // Adjust TOC spacing when unpinned + .vector-pinnable-header { + padding-left: @padding-horizontal-dropdown-menu-item + @spacing-subsection-toggle; + } + + .vector-toc-contents { + padding-right: @padding-horizontal-dropdown-menu-item; + padding-left: @padding-horizontal-dropdown-menu-item + @spacing-subsection-toggle; + } +} + +// TOC dropdown styles +#vector-toc-collapsed-button, +.vector-sticky-header-toc, +.vector-page-titlebar-toc { + display: none; + margin-right: 8px; +} + +// TOC dropdown toggle styles +#vector-toc-collapsed-button, +body:not( .vector-below-page-title ) #vector-page-titlebar-toc-label { + @media ( max-width: @max-width-tablet ) { + // Override the default button styles so the ToC button in the page titlebar is slightly shorter on small viewports + padding: 7px 12px; + } +} + +// TOC styles when unpinned +.mixin-toc-unpinned() { + display: block; + + > .vector-menu-content { + // Override default dropdown max width + max-width: none; + } + + // Shared unpinned TOC styles, applies across all unpinned cases (page titlebar, sticky header, floating) + .vector-toc { + // T316056 Remove TOC menu fixed width and apply min/max-width + width: max-content; + min-width: 200px; + // Collapsed TOC should be smaller than 85% of the content container (51em) and 75vw + max-width: ~'min( 0.85 * @{max-width-content-container}, 75vw )'; // min( 51em, 75vw ) + } +} + +// TOC styles when below page title +.mixin-toc-below-page-title { + position: fixed; + top: 12px; + left: 12px; + margin: 0; + z-index: @z-index-menu; +} + +.vector-feature-page-tools-disabled .vector-unpinned-container .vector-toc { + box-sizing: content-box; +} + +.client-js { + @media ( max-width: @max-width-tablet ) { + // Prevent layout shift from the TOC being in the sidebar before JS loads and + // moves the TOC into the page titlebar on small screens + #vector-toc-pinned-container .vector-toc { + display: none; + } + + // Hide pin ToC toggles on smaller resolution + .vector-toc .vector-pinnable-header-toggle-button { + display: none; + } + + // + // TOC in page titlebar on narrow screens + // + .vector-page-titlebar-toc { + .mixin-toc-unpinned(); + } + + // + // TOC in page titlebar on narrow screens below page title + // + .vector-below-page-title .vector-page-titlebar-toc { + .mixin-toc-below-page-title(); + } + } + + @media ( min-width: @min-width-desktop ) { + // + // TOC in page titlebar + // + &.vector-feature-toc-pinned-disabled body:not( .vector-sticky-header-visible ) { + .vector-page-titlebar-toc { + .mixin-toc-unpinned(); + } + } + + // + // TOC in page titlebar below page title + // + &.vector-feature-toc-pinned-disabled body:not( .vector-sticky-header-visible ).vector-below-page-title { + .vector-page-titlebar-toc { + .mixin-toc-below-page-title(); + } + } + + // + // TOC in sticky header + // + &.vector-feature-toc-pinned-disabled .vector-sticky-header-visible { + .vector-sticky-header-toc { + .mixin-toc-unpinned(); + } + } + } +} + +// +// No-js TOC +// +@media ( max-width: @max-width-tablet ) { + .client-nojs { + #vector-toc-collapsed-button { + display: block; + } + + #vector-toc-pinned-container { + // Override TOC container's sticky positioning + position: relative; + .mixin-toc-unpinned(); + } + + .vector-toc { + display: none; + position: absolute; + top: 36px; // TOC button height + // FIXME: Don't use a magic number. This used to be tied to the private variable in core + // @icon-padding-md so perhaps this needs to make use of the flush classes? + left: -12px; + margin-top: @padding-top-content; // Account for padding-top from .mw-body + // FIXME: Collapsed TOC styles are not consistent with other vector dropdowns + border: @border-width-base @border-style-base @border-color-base; + z-index: @z-index-menu; + + .vector-pinnable-header, + .vector-toc-contents { + // FIXME: Remove !important after PageTools is enabled everywhere currently needed + // to deal with selector specificity, overrides padding applied in PinnableHeader.less + /* stylelint-disable-next-line declaration-no-important */ + padding-left: @padding-horizontal-dropdown-menu-item !important; + } + } + + @{selector-nojs-collapsed-toc-open} ~ .mw-table-of-contents-container .vector-toc { + // Hide the TOC when the button is not checked + display: block; + } + } +} diff --git a/Vector/resources/skins.vector.styles/skin.less b/Vector/resources/skins.vector.styles/skin.less new file mode 100644 index 0000000..13e0618 --- /dev/null +++ b/Vector/resources/skins.vector.styles/skin.less @@ -0,0 +1,49 @@ +/** + * Vector modern stylesheets + * See '../common/common.less' for common screen and print Vector stylesheets. + */ + +@import '../common/variables.less'; +@import 'mediawiki.mixins.less'; + +@media screen { + // Layouts + @import './layouts/screen.less'; + + // Components + @import './components/SearchBoxLoader.less'; + @import './components/VueEnhancedSearchBox.less'; + @import './components/LanguageDropdown.less'; + @import './components/UserLinks.less'; + @import './components/Header.less'; + @import './components/Footer.less'; + @import './components/Menu.less'; + @import './components/Dropdown.less'; + @import './components/MenuTabs.less'; + @import './components/MainMenu.less'; + @import './components/MainMenuGroup.less'; + @import './components/PageTitlebar.less'; + @import './components/PageToolbar.less'; + @import './components/PageTools.less'; + @import './components/PinnableHeader.less'; + @import './components/PinnableElement.less'; + @import './components/StickyHeader.less'; + @import './components/TabWatchstarLink.less'; + @import './components/TableOfContents.less'; + @import './components/Icon.less'; + + .vector-feature-page-tools-disabled { + @import './components/checkboxHack.less'; + } +} + +@media all { + // Component styles that should apply in all media. + @import './components/Logo.less'; +} + +@media print { + @import './layouts/print.less'; +} + +@import './layouts/gradeC.less'; diff --git a/Vector/resources/vue.d.ts b/Vector/resources/vue.d.ts new file mode 100644 index 0000000..8f3a240 --- /dev/null +++ b/Vector/resources/vue.d.ts @@ -0,0 +1,4 @@ +declare module "*.vue" { + import Vue from 'vue'; + export default Vue; +} diff --git a/Vector/screenshots/1280x800.png b/Vector/screenshots/1280x800.png new file mode 100644 index 0000000..4dde41d Binary files /dev/null and b/Vector/screenshots/1280x800.png differ diff --git a/Vector/skin.json b/Vector/skin.json new file mode 100644 index 0000000..3618303 --- /dev/null +++ b/Vector/skin.json @@ -0,0 +1,626 @@ +{ + "name": "Vector", + "version": "1.0.0", + "author": [ + "[https://www.mediawiki.org/wiki/Readers/Web/Team Readers Web Team]", + "Trevor Parscal", + "Roan Kattouw", + "Alex Hollender", + "Bernard Wang", + "Clare Ming", + "Jan Drewniak", + "Jon Robson", + "Nick Ray", + "Sam Smith", + "Stephen Niedzielski", + "Volker E." + ], + "url": "https://www.mediawiki.org/wiki/Skin:Vector", + "descriptionmsg": "vector-skin-desc", + "namemsg": "vector-specialversion-name", + "license-name": "GPL-2.0-or-later", + "type": "skin", + "requires": { + "MediaWiki": ">= 1.40.0" + }, + "ValidSkinNames": { + "vector-2022": { + "class": "MediaWiki\\Skins\\Vector\\SkinVector22", + "args": [ + { + "name": "vector-2022", + "templateDirectory": "includes/templates", + "template": "skin", + "responsive": true, + "toc": false, + "link": { + "text-wrapper": { + "tag": "span" + } + }, + "bodyClasses": [ + "skin-vector", + "skin-vector-search-vue" + ], + "menus": [ + "user-interface-preferences", + "user-page", + "user-menu", + "notifications", + "views", + "actions", + "variants", + "associated-pages" + ], + "scripts": [ + "skins.vector.user", + "skins.vector.js", + "skins.vector.es6" + ], + "styles": [ + "mediawiki.ui.button", + "skins.vector.styles", + "skins.vector.user.styles", + "skins.vector.icons", + "mediawiki.ui.icon" + ], + "messages": [ + "tooltip-p-logo", + "vector-opt-out-tooltip", + "vector-opt-out", + "vector-action-toggle-sidebar", + "vector-main-menu-tooltip", + "vector-jumptosearch", + "vector-jumptocontent", + "vector-toc-beginning", + "vector-toc-label", + "vector-toc-menu-tooltip", + "vector-toc-collapsible-button-label", + "vector-pin-element-label", + "vector-unpin-element-label", + "vector-site-nav-label", + "search", + "searchbutton", + "searcharticle", + "searchsuggest-search", + "sitesubtitle", + "sitetitle", + "tagline", + "personaltools", + "namespaces", + "views", + "tooltip-p-cactions", + "empty-language-selector-body" + ] + } + ] + }, + "vector": { + "class": "MediaWiki\\Skins\\Vector\\SkinVectorLegacy", + "@args": "See SkinVector::__construct for more detail.", + "args": [ + { + "name": "vector", + "template": "skin-legacy", + "templateDirectory": "includes/templates", + "responsive": false, + "link": { + "text-wrapper": { + "tag": "span" + } + }, + "bodyClasses": [ + "skin-vector-legacy" + ], + "scripts": [ + "skins.vector.legacy.js" + ], + "styles": [ + "skins.vector.styles.legacy" + ], + "messages": [ + "tooltip-p-logo", + "vector-opt-out-tooltip", + "vector-opt-out", + "navigation-heading", + "vector-action-toggle-sidebar", + "vector-main-menu-tooltip", + "vector-jumptonavigation", + "vector-jumptosearch", + "vector-jumptocontent", + "search", + "searchbutton", + "searcharticle", + "searchsuggest-search", + "sitesubtitle", + "sitetitle", + "tagline" + ] + } + ] + } + }, + "SkinLessImportPaths": { + "vector-2022": "resources/mediawiki.less", + "vector": "resources/mediawiki.less.legacy" + }, + "SkinCodexThemes": { + "vector-2022": "wikimedia-ui-legacy", + "vector": "wikimedia-ui-legacy" + }, + "MessagesDirs": { + "Vector": [ + "i18n" + ] + }, + "AutoloadNamespaces": { + "MediaWiki\\Skins\\Vector\\": "includes/" + }, + "TestAutoloadNamespaces": { + "MediaWiki\\Skins\\Vector\\": "includes/", + "MediaWiki\\Skins\\Vector\\Tests\\": "tests/phpunit/" + }, + "ConfigRegistry": { + "vector": "GlobalVarConfig::newInstance" + }, + "DefaultUserOptions": { + "vector-limited-width": 1, + "vector-page-tools-pinned": 1, + "vector-main-menu-pinned": 1, + "vector-toc-pinned": 1 + }, + "HookHandlers": { + "VectorHooks": { + "class": "MediaWiki\\Skins\\Vector\\Hooks" + } + }, + "Hooks": { + "RequestContextCreateSkin": "VectorHooks", + "GetPreferences": "VectorHooks", + "LocalUserCreated": "VectorHooks", + "MakeGlobalVariablesScript": "VectorHooks", + "ResourceLoaderSiteModulePages": "VectorHooks", + "ResourceLoaderSiteStylesModulePages": "VectorHooks", + "SkinPageReadyConfig": "VectorHooks" + }, + "@note": "When modifying skins.vector.styles definition, make sure the installer still works", + "ResourceModules": { + "skins.vector.user": { + "class": "MediaWiki\\Skins\\Vector\\ResourceLoader\\VectorResourceLoaderUserModule" + }, + "skins.vector.user.styles": { + "class": "MediaWiki\\Skins\\Vector\\ResourceLoader\\VectorResourceLoaderUserStylesModule" + }, + "skins.vector.search": { + "es6": true, + "dependencies": [ + "mediawiki.Uri", + "mediawiki.util", + "@wikimedia/codex-search" + ], + "packageFiles": [ + "resources/skins.vector.search/skins.vector.search.js", + "resources/skins.vector.search/instrumentation.js", + "resources/skins.vector.search/fetch.js", + "resources/skins.vector.search/restSearchClient.js", + "resources/skins.vector.search/urlGenerator.js", + "resources/skins.vector.search/App.vue", + { + "name": "resources/skins.vector.search/config.json", + "callback": "MediaWiki\\Skins\\Vector\\Hooks::getVectorSearchResourceLoaderConfig" + } + ], + "messages": [ + "searchbutton", + "searchresults", + "vector-searchsuggest-containing" + ] + }, + "skins.vector.styles.legacy": { + "class": "ResourceLoaderSkinModule", + "features": { + "normalize": true, + "elements": true, + "logo": true, + "content-media": true, + "content-links": true, + "content-links-external": false, + "interface": true, + "interface-message-box": true, + "interface-category": true, + "content-tables": true, + "i18n-ordered-lists": true, + "i18n-all-lists-margins": true, + "i18n-headings": true + }, + "styles": [ + "resources/common/common.less", + "resources/skins.vector.styles.legacy/skin-legacy.less" + ] + }, + "skins.vector.styles": { + "class": "ResourceLoaderSkinModule", + "features": { + "normalize": true, + "elements": true, + "content-links": true, + "content-links-external": false, + "content-media": true, + "content-tables": true, + "interface": false, + "interface-category": true, + "interface-edit-section-links": true, + "interface-indicators": false, + "interface-message-box": true, + "interface-site-notice": false, + "interface-subtitle": false, + "interface-user-message": true, + "i18n-ordered-lists": true, + "i18n-all-lists-margins": true, + "i18n-headings": true, + "toc": false + }, + "styles": [ + "resources/common/common.less", + "resources/skins.vector.styles/skin.less" + ], + "lessMessages": [ + "parentheses-start", + "parentheses-end", + "brackets-start", + "brackets-end" + ] + }, + "skins.vector.icons.js": { + "selectorWithVariant": ".mw-ui-icon-wikimedia-{name}-{variant}:before", + "selectorWithoutVariant": ".mw-ui-icon-wikimedia-{name}:before", + "useDataURI": false, + "defaultColor": "#000", + "class": "ResourceLoaderOOUIIconPackModule", + "variants": { + "progressive": { + "color": "#36c", + "global": true + } + }, + "icons": [ + "article", + "edit", + "editLock", + "halfStar", + "history", + "speechBubbles", + "speechBubbleAdd", + "star", + "unStar", + "wikiText" + ] + }, + "skins.vector.icons": { + "selectorWithVariant": ".mw-ui-icon-wikimedia-{name}-{variant}:before", + "selectorWithoutVariant": ".mw-ui-icon-wikimedia-{name}:before", + "useDataURI": false, + "defaultColor": "#000", + "class": "ResourceLoaderOOUIIconPackModule", + "variants": { + "progressive": { + "color": "#36c", + "global": true + } + }, + "icons": [ + "menu", + "heart", + "language", + "ellipsis", + "userAvatar", + "userAdd", + "userAnonymous", + "userTalk", + "sandbox", + "search", + "settings", + "labFlask", + "unStar", + "watchlist", + "userContributions", + "logIn", + "logOut", + "imageGallery", + "userGroup", + "expand", + "listBullet" + ] + }, + "skins.vector.es6": { + "es6": true, + "styles": [ + "resources/skins.vector.es6/limitedWidthToggle.less" + ], + "packageFiles": [ + "resources/skins.vector.es6/main.js", + "resources/skins.vector.es6/searchToggle.js", + "resources/skins.vector.es6/stickyHeader.js", + "resources/skins.vector.es6/scrollObserver.js", + "resources/skins.vector.es6/AB.js", + "resources/skins.vector.es6/tableOfContents.js", + "resources/skins.vector.es6/sectionObserver.js", + "resources/skins.vector.es6/deferUntilFrame.js", + "resources/skins.vector.es6/pinnableElement.js", + "resources/skins.vector.es6/features.js", + "resources/skins.vector.es6/limitedWidthToggle.js", + { + "name": "resources/skins.vector.es6/config.json", + "callback": "MediaWiki\\Skins\\Vector\\Hooks::getVectorResourceLoaderConfig" + }, + { + "name": "resources/skins.vector.es6/tableOfContentsConfig.json", + "config": [ + "VectorTableOfContentsCollapseAtCount", + "VectorTableOfContentsBeginning" + ] + }, + { + "name": "resources/skins.vector.es6/templates/TableOfContents__list.mustache", + "file": "includes/templates/TableOfContents__list.mustache", + "type": "text" + }, + { + "name": "resources/skins.vector.es6/templates/TableOfContents__line.mustache", + "file": "includes/templates/TableOfContents__line.mustache", + "type": "text" + } + ], + "dependencies": [ + "mediawiki.user", + "skins.vector.icons.js", + "mediawiki.page.ready", + "mediawiki.page.watch.ajax", + "mediawiki.util", + "mediawiki.storage", + "mediawiki.cookie", + "mediawiki.experiments" + ], + "messages": [ + "vector-limited-width-toggle", + "vector-toc-beginning", + "vector-toc-label", + "vector-pin-element-label", + "vector-unpin-element-label" + ] + }, + "skins.vector.js": { + "packageFiles": [ + "resources/skins.vector.js/skin.js", + { + "name": "resources/skins.vector.js/config.json", + "callback": "MediaWiki\\Skins\\Vector\\Hooks::getVectorResourceLoaderConfig" + }, + "resources/skins.vector.js/watchstar.js", + "resources/skins.vector.js/dropdownMenus.js", + "resources/skins.vector.js/checkbox.js", + "resources/skins.vector.js/sidebarPersistence.js", + "resources/skins.vector.js/languageButton.js", + "resources/skins.vector.js/echo.js", + "resources/skins.vector.js/searchLoader.js", + "resources/skins.vector.js/menuTabs.js" + ], + "dependencies": [ + "skins.vector.icons.js", + "mediawiki.page.ready", + "mediawiki.util" + ], + "messages": [ + "vector-search-loader" + ] + }, + "skins.vector.legacy.js": { + "packageFiles": [ + "resources/skins.vector.legacy.js/skin-legacy.js", + "resources/skins.vector.legacy.js/collapsibleTabs.js", + "resources/skins.vector.legacy.js/vector.js" + ], + "dependencies": [ + "mediawiki.page.ready", + "mediawiki.util" + ] + } + }, + "ResourceFileModulePaths": { + "localBasePath": "", + "remoteSkinPath": "Vector" + }, + "ResourceModuleSkinStyles": { + "vector-2022": { + "+ext.growthExperiments.StructuredTask.PreEdit": "skinStyles/ext.growthExperiments.StructuredTask.PreEdit.less", + "ext.echo.styles.badge": "skinStyles/ext.echo.styles.badge.less", + "+ext.echo.styles.alert": "skinStyles/ext.echo.styles.alert.less", + "+mediawiki.action.edit": "skinStyles/mediawiki.action.edit.less", + "+mediawiki.action.view.redirectPage": "skinStyles/mediawiki.action.view.redirectPage.less", + "+mediawiki.notification": "skinStyles/mediawiki.notification.less", + "+oojs-ui-core.styles": "skinStyles/ooui.less", + "mediawiki.special": "skinStyles/mediawiki.special.less", + "+ext.relatedArticles.readMore": "skinStyles/ext.relatedArticles.readMore.less", + "+ext.uls.compactlinks": "skinStyles/ext.uls.compactlinks.less", + "+ext.uls.interface": "skinStyles/ext.uls.interface.less", + "+ext.visualEditor.base": "skinStyles/ext.visualEditor.less", + "jquery.ui": [ + "skinStyles/jquery.ui/jquery.ui.core.css", + "skinStyles/jquery.ui/jquery.ui.theme.css", + "skinStyles/jquery.ui/jquery.ui.accordion.css", + "skinStyles/jquery.ui/jquery.ui.autocomplete.css", + "skinStyles/jquery.ui/jquery.ui.button.css", + "skinStyles/jquery.ui/jquery.ui.datepicker.css", + "skinStyles/jquery.ui/jquery.ui.dialog.css", + "skinStyles/jquery.ui/jquery.ui.menu.css", + "skinStyles/jquery.ui/jquery.ui.progressbar.css", + "skinStyles/jquery.ui/jquery.ui.resizable.css", + "skinStyles/jquery.ui/jquery.ui.selectable.css", + "skinStyles/jquery.ui/jquery.ui.slider.css", + "skinStyles/jquery.ui/jquery.ui.tabs.css", + "skinStyles/jquery.ui/jquery.ui.tooltip.css" + ] + }, + "vector": { + "ext.echo.styles.badge": "skinStyles/vector/ext.echo.styles.badge.less", + "+ext.echo.styles.alert": "skinStyles/ext.echo.styles.alert.less", + "jquery.tipsy": "skinStyles/jquery.tipsy.less", + "jquery.ui": [ + "skinStyles/jquery.ui/jquery.ui.core.css", + "skinStyles/jquery.ui/jquery.ui.theme.css", + "skinStyles/jquery.ui/jquery.ui.accordion.css", + "skinStyles/jquery.ui/jquery.ui.autocomplete.css", + "skinStyles/jquery.ui/jquery.ui.button.css", + "skinStyles/jquery.ui/jquery.ui.datepicker.css", + "skinStyles/jquery.ui/jquery.ui.dialog.css", + "skinStyles/jquery.ui/jquery.ui.menu.css", + "skinStyles/jquery.ui/jquery.ui.progressbar.css", + "skinStyles/jquery.ui/jquery.ui.resizable.css", + "skinStyles/jquery.ui/jquery.ui.selectable.css", + "skinStyles/jquery.ui/jquery.ui.slider.css", + "skinStyles/jquery.ui/jquery.ui.tabs.css", + "skinStyles/jquery.ui/jquery.ui.tooltip.css" + ], + "+mediawiki.action.view.redirectPage": "skinStyles/mediawiki.action.view.redirectPage.less", + "+mediawiki.notification": "skinStyles/vector/mediawiki.notification.less", + "+oojs-ui-core.styles": "skinStyles/ooui.less", + "mediawiki.special": "skinStyles/mediawiki.special.less", + "+ext.relatedArticles.readMore": "skinStyles/ext.relatedArticles.readMore.less", + "+ext.uls.compactlinks": "skinStyles/ext.uls.compactlinks.less", + "+ext.uls.interface": "skinStyles/ext.uls.interface.less" + } + }, + "config": { + "VectorShareUserScripts": { + "value": true, + "description": "Temporary configuration flag that determines whether Vector skins should share user scripts and styles." + }, + "Vector2022PreviewPages": { + "value": [], + "description": "Temporary configuration flag for allowing users to preview the new Vector skin." + }, + "VectorSearchApiUrl": { + "value": "", + "description": "To override the default search API, set this to the URL to rest.php on another wiki. Can be used with $wgDisableTextSearch and $wgSearchForwardUrl to mimic user experience on production." + }, + "VectorUseIconWatch": { + "value": true + }, + "VectorMaxWidthOptions": { + "value": { + "exclude": { + "mainpage": false, + "querystring": { + "action": "(history|edit|submit)", + "diff": ".+" + }, + "namespaces": [ + -1, + 14 + ] + }, + "include": [ + "Special:Preferences" + ] + }, + "description": "options for configuring where where max-width should and should not apply. More details can be found in Hooks::shouldDisableMaxWidth PHP documentation." + }, + "VectorResponsive": { + "value": false, + "description": "@var boolean turn Vector-2022 into a responsive skin by applying a view port and disabling the min-width" + }, + "VectorDefaultSkinVersionForExistingAccounts": { + "value": "1", + "description": "@var string:['2'|'1'] The version ('2' for latest, '1' for legacy) of the Vector skin to use when an existing user has not specified a preference. This configuration is not used for new accounts (see VectorDefaultSkinVersionForNewAccounts) and is impermanent. In the future, this field may contains versions such as \"beta\" which when specified and the BetaFeatures extension is installed, and the user is enrolled, the latest version is used otherwise legacy. The value is _not_ persisted." + }, + "VectorDefaultSkinVersionForNewAccounts": { + "value": null, + "description": "@var string|null The version ('2' for latest, '1' for legacy) of the Vector skin to **set** for newly created user accounts. **The value is persisted as a user preference.** This configuration is not used for preexisting accounts (see VectorDefaultSkinVersionForExistingAccounts) and only ever executed once at new account creation time. If it is null, no user preference will be set." + }, + "VectorWvuiSearchOptions": { + "value": { + "showThumbnail": true, + "showDescription": true + } + }, + "VectorDefaultSidebarVisibleForAuthorisedUser": { + "value": true + }, + "VectorDefaultSidebarVisibleForAnonymousUser": { + "value": false + }, + "VectorLanguageInHeader": { + "value": { + "logged_in": true, + "logged_out": true + }, + "description": "@var array Moves the language links from the sidebar into a menu beside the page title. Also moves the indicators to the line below, next to the tagline (siteSub)." + }, + "VectorLanguageInMainPageHeader": { + "value": { + "logged_in": false, + "logged_out": false + }, + "description": "@var When `VectorLanguageInHeader` is enabled, determines whether the Main Page's language button should be at the top or bottom of the content. The default position on the main page is at the bottom." + }, + "VectorLanguageAlertInSidebar": { + "value": { + "logged_in": true, + "logged_out": true + }, + "description": "@var When `VectorLanguageAlertInSidebar` is enabled, the language switch alert box is shown in the sidebar." + }, + "VectorStickyHeader": { + "value": { + "logged_in": true, + "logged_out": false + }, + "description": "@var array Enables a persistent header that allows quick access to user links, editing tools, search and other links while scrolling down a page" + }, + "VectorWebABTestEnrollment": { + "value": { + "name": "skin-vector-toc-experiment", + "enabled": false, + "buckets": { + "unsampled": { + "samplingRate": 0 + }, + "control": { + "samplingRate": 0.5 + }, + "treatment": { + "samplingRate": 0.5 + } + } + }, + "description": "An associative array of A/B test configs keyed by parameters noted in mediawiki.experiments.js. There must be an `unsampled` bucket that represents a population excluded from the experiment. Additionally, the treatment bucket(s) must include a case-insensitive `treatment` substring in their name (e.g. `treatment`, `stickyHeaderTreatment`, `sticky-header-treatment`)" + }, + "VectorPromoteAddTopic": { + "value": true, + "description": "@var boolean Temporary feature flag that promotes the 'Add topic' link in the views menu, to a button in the page title bar." + }, + "VectorDisableSidebarPersistence": { + "value": false, + "description": "@var boolean Temporary feature flag that disables saving the sidebar expanded/collapsed state as a user-preference (triggered via clicking the main menu icon). This is intended as a temporary kill-switch in the event that the DB is overloaded with writes to the user_options table." + }, + "VectorTableOfContentsBeginning": { + "value": true, + "description": "@var boolean Temporary feature flag that controls link to beginning of article." + }, + "VectorTableOfContentsCollapseAtCount": { + "value": 28, + "description": "@var The minimum number of headings required to collapse all headings in the sticky table of contents by default." + }, + "VectorPageTools": { + "value": { + "logged_in": true, + "logged_out": false + }, + "description": "@var array Moves the tools links from the main menu into a new menu in the page toolbar" + } + }, + "ServiceWiringFiles": [ + "includes/ServiceWiring.php" + ], + "manifest_version": 2 +} diff --git a/Vector/skinStyles/ext.echo.styles.alert.less b/Vector/skinStyles/ext.echo.styles.alert.less new file mode 100644 index 0000000..6b8f6d7 --- /dev/null +++ b/Vector/skinStyles/ext.echo.styles.alert.less @@ -0,0 +1,39 @@ +@import '../resources/common/variables.less'; + +/** Mixin for collapsing the Echo new messages alert */ +.echo-alert-collapse() { + font-size: 12px; + position: absolute; + top: 100%; + right: 0; +} + +.vector-user-links { + .vector-menu-content-list { + .mw-echo-alert { + padding: 0.2em 0.5em; + white-space: nowrap; + // Prevent alert message from pushing user links off screen + max-width: 270px; + overflow: hidden; + text-overflow: ellipsis; + + .mw-ui-icon.mw-ui-icon-before:before { + display: none; + } + } + + @media ( max-width: @min-width-desktop-wide ) { + .mw-echo-alert { + .echo-alert-collapse(); + } + } + } +} + +// If the user link is wide, always collapse +.vector-user-links-wide .vector-menu-content-list { + .mw-echo-alert { + .echo-alert-collapse(); + } +} diff --git a/Vector/skinStyles/ext.echo.styles.badge.less b/Vector/skinStyles/ext.echo.styles.badge.less new file mode 100644 index 0000000..10797b6 --- /dev/null +++ b/Vector/skinStyles/ext.echo.styles.badge.less @@ -0,0 +1,54 @@ +@import '../resources/common/variables.less'; + +.mixin-notification-badge() { + // When 99+ allow counter so spill outside icon + // Overrides mw-ui-icon default. + &.mw-ui-icon { + overflow: visible; + } + + &:after { + position: absolute; + left: 55%; + top: 43%; + font-size: unit( 12 / @font-size-browser, em ); + padding: 7px 0.3em; + border: 1px solid #fff; + border-radius: @border-radius-base; + background-color: @colorGray7; + content: attr( data-counter-text ); + color: #fff; + } + + // The number of notifications shouldn't show if there are none. + &[ data-counter-num='0' ]:after { + content: none; + } +} + +.mw-echo-notification-badge-nojs { + .mixin-notification-badge(); +} + +// Special colors for unseen notifications +#pt-notifications-alert .mw-echo-unseen-notifications:after { + background-color: @color-destructive; +} + +#pt-notifications-notice .mw-echo-unseen-notifications:after { + background-color: @color-primary; +} + +// Override ULS enhanced buttons +#pt-notifications-notice .mw-echo-notifications-badge, +#pt-notifications-alert .mw-echo-notifications-badge { + .mixin-notification-badge(); + margin: 0; + line-height: 0; + opacity: 1; + + &:focus { + // Copied from mixins.buttons.less, match button focus styles + box-shadow: @box-shadow-primary--focus; + } +} diff --git a/Vector/skinStyles/ext.growthExperiments.StructuredTask.PreEdit.less b/Vector/skinStyles/ext.growthExperiments.StructuredTask.PreEdit.less new file mode 100644 index 0000000..b51e7da --- /dev/null +++ b/Vector/skinStyles/ext.growthExperiments.StructuredTask.PreEdit.less @@ -0,0 +1,6 @@ +// When the help icon and limited toggle is on the same page, only the help icon should be shown. +// (T322597#8378539) +.vector-limited-width-toggle { + /* stylelint-disable-next-line declaration-no-important */ + display: none !important; +} diff --git a/Vector/skinStyles/ext.relatedArticles.readMore.less b/Vector/skinStyles/ext.relatedArticles.readMore.less new file mode 100644 index 0000000..269ddb8 --- /dev/null +++ b/Vector/skinStyles/ext.relatedArticles.readMore.less @@ -0,0 +1,3 @@ +.ext-related-articles-card-list { + margin-right: 1.5em; +} diff --git a/Vector/skinStyles/ext.uls.compactlinks.less b/Vector/skinStyles/ext.uls.compactlinks.less new file mode 100644 index 0000000..6d9da88 --- /dev/null +++ b/Vector/skinStyles/ext.uls.compactlinks.less @@ -0,0 +1,14 @@ +// Sticky header ULS behavior. + +.uls-dialog-sticky { + .uls-menu { + position: fixed; + } + + &.uls-dialog-sticky-hide { + .uls-menu { + /* stylelint-disable-next-line declaration-no-important */ + display: none !important; + } + } +} diff --git a/Vector/skinStyles/ext.uls.interface.less b/Vector/skinStyles/ext.uls.interface.less new file mode 100644 index 0000000..dd9c310 --- /dev/null +++ b/Vector/skinStyles/ext.uls.interface.less @@ -0,0 +1,3 @@ +.mw-interlanguage-selector-disabled #p-lang-btn-sticky-header { + display: none; +} diff --git a/Vector/skinStyles/ext.visualEditor.less b/Vector/skinStyles/ext.visualEditor.less new file mode 100644 index 0000000..f86a474 --- /dev/null +++ b/Vector/skinStyles/ext.visualEditor.less @@ -0,0 +1,7 @@ +.ve-activated { + // Temporarily disable TOC in edit mode until TOC works with both visual and source editors + // T294950 + .vector-toc { + display: none; + } +} diff --git a/Vector/skinStyles/images/edit.svg b/Vector/skinStyles/images/edit.svg new file mode 100644 index 0000000..62cfb37 --- /dev/null +++ b/Vector/skinStyles/images/edit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Vector/skinStyles/jquery.tipsy.less b/Vector/skinStyles/jquery.tipsy.less new file mode 100644 index 0000000..0e0c8ec --- /dev/null +++ b/Vector/skinStyles/jquery.tipsy.less @@ -0,0 +1,4 @@ +/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */ +.tipsy { + font-size: 0.8em; +} diff --git a/Vector/skinStyles/jquery.ui/DEPRECATED b/Vector/skinStyles/jquery.ui/DEPRECATED new file mode 100644 index 0000000..e616e78 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/DEPRECATED @@ -0,0 +1,6 @@ +The files in this folder are styling a deprecated module. In November 2022 after a discussion +between Growth, editing and web team (and others), it was agreed that these styles should apply +to both the Vector and Vector 2022 skins, but that these should be considered frozen and +not modified further. More context on this decision can be found on: +https://www.mediawiki.org/wiki/Readers/Web/Dev_notes/jQuery_UI + diff --git a/Vector/skinStyles/jquery.ui/PATCHES b/Vector/skinStyles/jquery.ui/PATCHES new file mode 100644 index 0000000..85f663e --- /dev/null +++ b/Vector/skinStyles/jquery.ui/PATCHES @@ -0,0 +1,25 @@ +jquery.ui.button.css +* Picked from jQuery UI 1.11.2-alpha instead of 1.9.2. +* Extra customizations. + +jquery.ui.datepicker.css +* Add @noflip to prevent CSSJanus flipping. + +jquery.ui.dialog.css +* Extra customizations. + +jquery.ui.resizable.css +* Add @noflip to prevent CSSJanus flipping. + +jquery.ui.theme.css +* Add @embed instructions for CSSMin. +* Change font-size from 1.0em to 0.8em. +* Join ".ui-icon", ".ui-widget-content .ui-icon" and ".ui-widget-header .ui-icon" rules + to optimise image embedding. +* Removed ".ui-widget-content a { color: #362b36; }" and + ".ui-widget-header a { color: #222222; }" due to bug T85857. + +images: +* Add close.png and titlebar-fade.png (used in customizations for + jquery.ui.dialog.css) +* Change chmod from 755 to 644. diff --git a/Vector/skinStyles/jquery.ui/images/close.png b/Vector/skinStyles/jquery.ui/images/close.png new file mode 100644 index 0000000..2c706ec Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/close.png differ diff --git a/Vector/skinStyles/jquery.ui/images/titlebar-fade.png b/Vector/skinStyles/jquery.ui/images/titlebar-fade.png new file mode 100644 index 0000000..29c7f9d Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/titlebar-fade.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_flat_100_000000_40x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_flat_100_000000_40x100.png new file mode 100644 index 0000000..cdddc6d Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_flat_100_000000_40x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png new file mode 100644 index 0000000..723b512 Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_flat_15_cd0a0a_40x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png new file mode 100644 index 0000000..cdddc6d Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_flat_70_000000_40x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png new file mode 100644 index 0000000..4438e29 Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png new file mode 100644 index 0000000..01e41da Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png new file mode 100644 index 0000000..a55e17e Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png new file mode 100644 index 0000000..d417752 Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_100_ffffff_1x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png new file mode 100644 index 0000000..a2b4575 Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png b/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png new file mode 100644 index 0000000..8203cd7 Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-bg_inset-hard_100_f0f0f0_1x100.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png b/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png new file mode 100644 index 0000000..742fe1b Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-icons_2694e8_256x240.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png b/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000..08957e9 Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-icons_2e83ff_256x240.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png b/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png new file mode 100644 index 0000000..63f823a Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-icons_3d80b3_256x240.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png b/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png new file mode 100644 index 0000000..bbbeaec Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-icons_666666_256x240.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png b/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png new file mode 100644 index 0000000..6920baf Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-icons_72a7cf_256x240.png differ diff --git a/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png b/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000..4ab379a Binary files /dev/null and b/Vector/skinStyles/jquery.ui/images/ui-icons_ffffff_256x240.png differ diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.accordion.css b/Vector/skinStyles/jquery.ui/jquery.ui.accordion.css new file mode 100644 index 0000000..d429fd2 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.accordion.css @@ -0,0 +1,16 @@ +/*! + * jQuery UI Accordion 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +.ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin-top: 2px; padding: .5em .5em .5em .7em; zoom: 1; } +.ui-accordion .ui-accordion-icons { padding-left: 2.2em; } +.ui-accordion .ui-accordion-noicons { padding-left: .7em; } +.ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; zoom: 1; } diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.autocomplete.css b/Vector/skinStyles/jquery.ui/jquery.ui.autocomplete.css new file mode 100644 index 0000000..6fdf0f1 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.autocomplete.css @@ -0,0 +1,16 @@ +/*! + * jQuery UI Autocomplete 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.button.css b/Vector/skinStyles/jquery.ui/jquery.ui.button.css new file mode 100644 index 0000000..8b9f334 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.button.css @@ -0,0 +1,310 @@ +/*! + * jQuery UI Button 1.11.2-alpha + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/button/#theming + */ +.ui-button { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + overflow: visible; /* removes extra width in IE */ +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2.2em; +} +/* button elements seem to need a little more width */ +button.ui-button-icon-only { + width: 2.4em; +} +.ui-button-icons-only { + width: 3.4em; +} +button.ui-button-icons-only { + width: 3.7em; +} + +/* button text element */ +.ui-button .ui-button-text { + display: block; + line-height: normal; +} +.ui-button-text-only .ui-button-text { + padding: .4em 1em; +} +.ui-button-icon-only .ui-button-text, +.ui-button-icons-only .ui-button-text { + padding: .4em; + text-indent: -9999999px; +} +.ui-button-text-icon-primary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 1em .4em 2.1em; +} +.ui-button-text-icon-secondary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 2.1em .4em 1em; +} +.ui-button-text-icons .ui-button-text { + padding-left: 2.1em; + padding-right: 2.1em; +} +/* no icon support for input elements, provide padding by default */ +input.ui-button { + padding: .4em 1em; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon, +.ui-button-text-icon-primary .ui-icon, +.ui-button-text-icon-secondary .ui-icon, +.ui-button-text-icons .ui-icon, +.ui-button-icons-only .ui-icon { + position: absolute; + top: 50%; + margin-top: -8px; +} +.ui-button-icon-only .ui-icon { + left: 50%; + margin-left: -8px; +} +.ui-button-text-icon-primary .ui-button-icon-primary, +.ui-button-text-icons .ui-button-icon-primary, +.ui-button-icons-only .ui-button-icon-primary { + left: .5em; +} +.ui-button-text-icon-secondary .ui-button-icon-secondary, +.ui-button-text-icons .ui-button-icon-secondary, +.ui-button-icons-only .ui-button-icon-secondary { + right: .5em; +} + +/* button sets */ +.ui-buttonset { + margin-right: 7px; +} +.ui-buttonset .ui-button { + margin-left: 0; + margin-right: -.3em; +} + +/* workarounds */ +/* reset extra padding in Firefox, see h5bp.com/l */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* Disables the annoying dashed border Firefox puts on active buttons */ +body button.ui-button::-moz-focus-inner { + border: 0; +} +/* Give large buttons some extra padding */ +body .ui-button-large { + padding: 5px; +} +/* Use white icons for colored buttons */ +.ui-button-green .ui-icon, +.ui-button-blue .ui-icon, +.ui-button-red .ui-icon, +.ui-button-orange .ui-icon { + /* @embed */ + background-image: url(images/ui-icons_ffffff_256x240.png) !important; +} + +/* Corner radius */ +/* This is normally handled in jquery.ui.theme.css, but in our case, the corner + styling of our buttons doesn't match our default widget corner styling */ +.ui-button.ui-corner-all, +.ui-button.ui-corner-top, +.ui-button.ui-corner-left, +.ui-button.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-button.ui-corner-all, +.ui-button.ui-corner-top, + +.ui-button.ui-corner-right, +.ui-button.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-button.ui-corner-all, +.ui-button.ui-corner-bottom, +.ui-button.ui-corner-left, +.ui-button.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-button.ui-corner-all, +.ui-button.ui-corner-bottom, +.ui-button.ui-corner-right, +.ui-button.ui-corner-br { + border-bottom-right-radius: 4px; +} + +body .ui-button { + color: #2779aa; + margin: 0.5em 0 0.5em 0.4em; + border: 1px solid #aaa !important; + background: #f0f0f0 !important; + background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important; + cursor: pointer; + font-size: 1em; + line-height: 1.4em; + width: auto; + overflow: visible; + box-shadow: 0 1px 3px rgba(0,0,0,.2); +} + +body .ui-button-icon-only { + width: 2.2em; +} + +body .ui-button-icons-only { + width: 3.4em; +} + +body .ui-button:hover { + color: #2779aa; + border-color: #bbb !important; + background: #fff !important; + background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,.1); +} +body .ui-button:active, +body .ui-button:focus { + border-color: #8ad !important; + box-shadow: 0 0 1px 1px rgba(167,215,249,.5); +} +body .ui-button:active { + background: #e0e0e0 !important; + background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important; +} + +/* Customizations for MediaWiki Vector */ + +/* Green buttons */ +body .ui-button-green, +body .ui-button-green .ui-button-text { + color: white; + text-shadow: 0 -1px 1px #072; +} +body .ui-button.ui-button-green { + border-color: #294 !important; + background: #295 !important; + background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,.3); +} +body .ui-button.ui-button-green:hover { + background: #33a055 !important; + background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,.25); +} +body .ui-button.ui-button-green:active, +body .ui-button.ui-button-green:focus { + border-color: #172 !important; + box-shadow: 0 0 2px 2px rgba(167,215,249,.75); +} +body .ui-button.ui-button-green:active { + background: #338855 !important; + background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important; +} + +/* Blue buttons */ +body .ui-button-blue, +body .ui-button-blue .ui-button-text { + color: white; + text-shadow: 0 -1px 1px #037; +} +body .ui-button.ui-button-blue { + border-color: #468 !important; + background: #36b !important; + background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,.35); +} +body .ui-button.ui-button-blue:hover { + background: #36c !important; + background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important; +} +body .ui-button.ui-button-blue:active, +body .ui-button.ui-button-blue:focus { + border-color: #357 !important; + box-shadow: 0 0 2px 2px rgba(167,215,249,.75); +} +body .ui-button.ui-button-blue:active { + background: #3060a0 !important; + background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important; +} + +/* Red buttons */ +body .ui-button-red, +body .ui-button-red .ui-button-text { + color: white; + text-shadow: 0 -1px 1px #700; +} +body .ui-button.ui-button-red { + border-color: #944 !important; + background: #a22 !important; + background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,.35); +} +body .ui-button.ui-button-red:hover { + border-color: #a44 !important; + background: #b03333 !important; + background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,.3); +} +body .ui-button.ui-button-red:active, +body .ui-button.ui-button-red:focus { + border-color: #747 !important; + box-shadow: 0 0 2px 2px rgba(167,215,249,.7); +} +body .ui-button.ui-button-red:active { + background: #952020 !important; + background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important; +} + +/* Disabled buttons */ +body .ui-button-green.disabled, +body .ui-button-green.disabled:hover, +body .ui-button-green.disabled:active, +body .ui-button-green.disabled:focus, +body .ui-button-blue.disabled, +body .ui-button-blue.disabled:hover, +body .ui-button-blue.disabled:active, +body .ui-button-blue.disabled:focus, +body .ui-button-red.disabled, +body .ui-button-red.disabled:hover, +body .ui-button-red.disabled:active, +body .ui-button-red.disabled:focus, +body .ui-button.disabled, +body .ui-button.disabled:hover { + color: #aaa; + border-color: #ccc !important; + background: #eee !important; + background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important; + box-shadow: 0 1px 3px rgba(0,0,0,0); +} +body .ui-button-green.disabled .ui-button-text, +body .ui-button-blue.disabled .ui-button-text, +body .ui-button-red.disabled .ui-button-text { + color: #aaa; + text-shadow: 0 1px 1px #fff; +} diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.core.css b/Vector/skinStyles/jquery.ui/jquery.ui.core.css new file mode 100644 index 0000000..d4f7db3 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.core.css @@ -0,0 +1,39 @@ +/*! + * jQuery UI CSS Framework 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.datepicker.css b/Vector/skinStyles/jquery.ui/jquery.ui.datepicker.css new file mode 100644 index 0000000..b28332f --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.datepicker.css @@ -0,0 +1,67 @@ +/*! + * jQuery UI Datepicker 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +/* @noflip */ .ui-datepicker-rtl { direction: rtl; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group { float:right; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.dialog.css b/Vector/skinStyles/jquery.ui/jquery.ui.dialog.css new file mode 100644 index 0000000..f7c47a7 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.dialog.css @@ -0,0 +1,48 @@ +/*! + * jQuery UI Dialog 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } + +/* Customizations for MediaWiki Vector */ + +body .ui-dialog .ui-dialog-titlebar-close:hover { + text-decoration: none; +} +body .ui-dialog .ui-dialog-content .status-invalid input { + border: 2px solid red; + padding: 2px 1px; +} +body .ui-dialog .ui-dialog-titlebar { + padding: 0.9em 1.4em 0.6em !important; +} +body .ui-dialog .ui-widget-header { + /* @embed */ + background: #f0f0f0 url(images/titlebar-fade.png) repeat-x scroll 50% 100% !important; +} +/* FIXME: Should just update the icon sprite if we're keeping this X */ +body .ui-dialog .ui-icon-closethick { + /* @embed */ + background: url(images/close.png) no-repeat 50% 50% !important; +} +body .ui-dialog .ui-dialog-buttonpane { + margin-top: 0 !important; + padding:0.3em 1.4em 0.5em 1.4em !important; +} diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.menu.css b/Vector/skinStyles/jquery.ui/jquery.ui.menu.css new file mode 100644 index 0000000..83fd84e --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.menu.css @@ -0,0 +1,30 @@ +/*! + * jQuery UI Menu 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; } +.ui-menu .ui-menu { margin-top: -3px; position: absolute; } +.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; } +.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } +.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; } +.ui-menu .ui-menu-item a.ui-state-focus, +.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } + +.ui-menu .ui-state-disabled { font-weight: normal; margin: .4em 0 .2em; line-height: 1.5; } +.ui-menu .ui-state-disabled a { cursor: default; } + +/* icon support */ +.ui-menu-icons { position: relative; } +.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; } + +/* left-aligned */ +.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; } + +/* right-aligned */ +.ui-menu .ui-menu-icon { position: static; float: right; } diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.progressbar.css b/Vector/skinStyles/jquery.ui/jquery.ui.progressbar.css new file mode 100644 index 0000000..bd7e403 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.progressbar.css @@ -0,0 +1,12 @@ +/*! + * jQuery UI Progressbar 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; overflow: hidden; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.resizable.css b/Vector/skinStyles/jquery.ui/jquery.ui.resizable.css new file mode 100644 index 0000000..f8822e8 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.resizable.css @@ -0,0 +1,27 @@ +/*! + * jQuery UI Resizable 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +/* @noflip */ +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +/* @noflip */ +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +/* @noflip */ +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +/* @noflip */ +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +/* @noflip */ +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +/* @noflip */ +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} \ No newline at end of file diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.selectable.css b/Vector/skinStyles/jquery.ui/jquery.ui.selectable.css new file mode 100644 index 0000000..5854c41 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.selectable.css @@ -0,0 +1,11 @@ +/*! + * jQuery UI Selectable 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.slider.css b/Vector/skinStyles/jquery.ui/jquery.ui.slider.css new file mode 100644 index 0000000..e579478 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.slider.css @@ -0,0 +1,25 @@ +/*! + * jQuery UI Slider 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.tabs.css b/Vector/skinStyles/jquery.ui/jquery.ui.tabs.css new file mode 100644 index 0000000..11a000f --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.tabs.css @@ -0,0 +1,18 @@ +/*! + * jQuery UI Tabs 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.theme.css b/Vector/skinStyles/jquery.ui/jquery.ui.theme.css new file mode 100644 index 0000000..c88554d --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.theme.css @@ -0,0 +1,247 @@ +/*! + * jQuery UI CSS Framework 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1.0em&cornerRadius=3px&bgColorHeader=ffffff&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=highlight_hard&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=highlight_soft&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=f0f0f0&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=cccccc&fcActive=000000&iconColorActive=666666&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=000000&bgTextureOverlay=flat&bgImgOpacityOverlay=100&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=70&opacityShadow=20&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: sans-serif; font-size: 0.8em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #cccccc; /* @embed */ background: #f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x; color: #362b36; } +.ui-widget-header { border: 1px solid #aed0ea; /* @embed */ background: #ffffff url("images/ui-bg_highlight-soft_100_ffffff_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; /* @embed */ background: #d7ebf9 url("images/ui-bg_highlight-hard_80_d7ebf9_1x100.png") 50% 50% repeat-x; font-weight: normal; color: #2779aa; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; /* @embed */ background: #e4f1fb url("images/ui-bg_highlight-soft_100_e4f1fb_1x100.png") 50% 50% repeat-x; font-weight: normal; color: #0070a3; } +.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #0070a3; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #cccccc; background: #f0f0f0 /* @embed */ url("images/ui-bg_inset-hard_100_f0f0f0_1x100.png") 50% 50% repeat-x; font-weight: normal; color: #000000; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #000000; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #f9dd34; background: #ffef8f /* @embed */ url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a /* @embed */ url("images/ui-bg_flat_15_cd0a0a_40x100.png") 50% 50% repeat-x; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; } +.ui-icon, +.ui-widget-content .ui-icon, +.ui-widget-header .ui-icon { /* @embed */ background-image: url("images/ui-icons_72a7cf_256x240.png"); } +.ui-state-default .ui-icon { /* @embed */ background-image: url("images/ui-icons_3d80b3_256x240.png"); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* @embed */ background-image: url("images/ui-icons_2694e8_256x240.png"); } +.ui-state-active .ui-icon { /* @embed */ background-image: url("images/ui-icons_666666_256x240.png"); } +.ui-state-highlight .ui-icon { /* @embed */ background-image: url("images/ui-icons_2e83ff_256x240.png"); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url("images/ui-icons_ffffff_256x240.png"); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 3px; -webkit-border-top-left-radius: 3px; -khtml-border-top-left-radius: 3px; border-top-left-radius: 3px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 3px; -khtml-border-top-right-radius: 3px; border-top-right-radius: 3px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 3px; -webkit-border-bottom-left-radius: 3px; -khtml-border-bottom-left-radius: 3px; border-bottom-left-radius: 3px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 3px; -webkit-border-bottom-right-radius: 3px; -khtml-border-bottom-right-radius: 3px; border-bottom-right-radius: 3px; } + +/* Overlays */ +.ui-widget-overlay { background: rgba(255, 255, 255, 0.5); opacity: 1; filter: none; } +.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url("images/ui-bg_flat_70_000000_40x100.png") 50% 50% repeat-x; opacity: .2;filter:Alpha(Opacity=20); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } +.ui-dialog { border: 1px solid #a2a9b1; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25); } \ No newline at end of file diff --git a/Vector/skinStyles/jquery.ui/jquery.ui.tooltip.css b/Vector/skinStyles/jquery.ui/jquery.ui.tooltip.css new file mode 100644 index 0000000..b561d32 --- /dev/null +++ b/Vector/skinStyles/jquery.ui/jquery.ui.tooltip.css @@ -0,0 +1,17 @@ +/*! + * jQuery UI Tooltip 1.9.2 + * http://jqueryui.com + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; + box-shadow: 0 0 5px #aaa; +} + +body .ui-tooltip { border-width: 2px; } diff --git a/Vector/skinStyles/mediawiki.action.edit.less b/Vector/skinStyles/mediawiki.action.edit.less new file mode 100644 index 0000000..ef47d1f --- /dev/null +++ b/Vector/skinStyles/mediawiki.action.edit.less @@ -0,0 +1,8 @@ +@import '../resources/common/variables.less'; + +.vector-feature-limited-width-enabled #wikiPreview { + // @max-width-content-container is defined in ems, so the final width depends on font-size, + // but this element is nested in an element with a different font-size. Divide by the + // current font-size to get the intended result (as if font-size wasn't changed). + max-width: @max-width-content-container / @font-size-base; +} diff --git a/Vector/skinStyles/mediawiki.action.view.redirectPage.less b/Vector/skinStyles/mediawiki.action.view.redirectPage.less new file mode 100644 index 0000000..21c76bd --- /dev/null +++ b/Vector/skinStyles/mediawiki.action.view.redirectPage.less @@ -0,0 +1,7 @@ +.redirectText { + font-size: 140%; +} + +.redirectMsg p { + margin: 0; +} diff --git a/Vector/skinStyles/mediawiki.notification.less b/Vector/skinStyles/mediawiki.notification.less new file mode 100644 index 0000000..56ee5b5 --- /dev/null +++ b/Vector/skinStyles/mediawiki.notification.less @@ -0,0 +1,30 @@ +@import '../resources/common/variables.less'; + +/* mediawiki.notification */ + +.mw-notification-area { + font-size: @font-size-notification; +} + +.mw-notification-area-layout { + top: 3.5em; +} + +.mw-notification { + border: @border-base; + border-radius: @border-radius-base; + box-shadow: 0 2px 2px 0 rgba( 0, 0, 0, 0.25 ); +} + +.vector-sticky-header-enabled .mw-notification-area { + transition: @transition-sticky-header; +} + +/** + * When the sticky header is open in modern Vector, + * and the notification bar is also open, the notification + * should be moved so that it doesn't obstruct the sticky header + */ +.vector-sticky-header-visible .mw-notification-area-overlay > .mw-notification-area-floating { + transform: translateY( @height-sticky-header ); +} diff --git a/Vector/skinStyles/mediawiki.special.less b/Vector/skinStyles/mediawiki.special.less new file mode 100644 index 0000000..6af4b1e --- /dev/null +++ b/Vector/skinStyles/mediawiki.special.less @@ -0,0 +1,7 @@ +/** + * Adjusts for decreased margin-bottom for h2 elements inside #content div + * introduced in March / April 2014 typography update. + */ +table.mw-specialpages-table { + margin-top: 0; +} diff --git a/Vector/skinStyles/ooui.less b/Vector/skinStyles/ooui.less new file mode 100644 index 0000000..6b2a398 --- /dev/null +++ b/Vector/skinStyles/ooui.less @@ -0,0 +1,12 @@ +@import '../resources/common/variables.less'; + +.oo-ui-defaultOverlay, +.skin-vector .oo-ui-windowManager-modal > .oo-ui-dialog, +.skin-vector .ve-ui-overlay-global { + z-index: @z-index-overlay; +} + +body > .oo-ui-windowManager, +.oo-ui-defaultOverlay { + font-size: @font-size-base; +} diff --git a/Vector/skinStyles/vector/ext.echo.styles.badge.less b/Vector/skinStyles/vector/ext.echo.styles.badge.less new file mode 100644 index 0000000..cc85a20 --- /dev/null +++ b/Vector/skinStyles/vector/ext.echo.styles.badge.less @@ -0,0 +1,11 @@ +.skin-vector-legacy { + #pt-notifications-notice .mw-echo-notifications-badge, + #pt-notifications-alert .mw-echo-notifications-badge { + top: -5px; + } + + #p-personal #pt-notifications-alert, + #p-personal #pt-notifications-notice { + margin-right: 0.4em; + } +} diff --git a/Vector/skinStyles/vector/mediawiki.notification.less b/Vector/skinStyles/vector/mediawiki.notification.less new file mode 100644 index 0000000..2e01caf --- /dev/null +++ b/Vector/skinStyles/vector/mediawiki.notification.less @@ -0,0 +1,17 @@ +@import '../../resources/common/variables.less'; + +/* mediawiki.notification */ + +.mw-notification-area { + font-size: @font-size-notification; +} + +.mw-notification-area-layout { + top: 7em; +} + +.mw-notification { + border: @border-base; + border-radius: @border-radius-base; + box-shadow: 0 2px 2px 0 rgba( 0, 0, 0, 0.25 ); +} diff --git a/Vector/stories/.eslintrc.json b/Vector/stories/.eslintrc.json new file mode 100644 index 0000000..846b3a2 --- /dev/null +++ b/Vector/stories/.eslintrc.json @@ -0,0 +1,28 @@ +{ + "root": true, + "extends": [ + "wikimedia", + "wikimedia/language/es6" + ], + "env": { + "browser": true + }, + "rules": { + "quotes": "off" + }, + "parserOptions": { + "sourceType": "module" + }, + "settings": { + "jsdoc": { + "preferredTypes": { + "Indicator": "Indicator", + "LogoOptions": "LogoOptions", + "LogoTemplateData": "LogoTemplateData", + "MenuDefinition": "MenuDefinition", + "SearchData": "SearchData", + "UserLinksDefinition": "UserLinksDefinition" + } + } + } +} diff --git a/Vector/stories/ButtonsAndIcons.stories.js b/Vector/stories/ButtonsAndIcons.stories.js new file mode 100644 index 0000000..cbdd908 --- /dev/null +++ b/Vector/stories/ButtonsAndIcons.stories.js @@ -0,0 +1,195 @@ +import { CdxIcon, CdxButton } from '@wikimedia/codex'; +import '../node_modules/@wikimedia/codex/dist/codex.style.css'; +import { h, createApp } from 'vue'; +import buttonTemplate from '!!raw-loader!../includes/templates/Button.mustache'; +import mustache from 'mustache'; +import { cdxIconAdd } from '@wikimedia/codex-icons'; + +export default { + title: 'Icon and Buttons' +}; + +/** + * + * @typedef {Object} ButtonProps + * @property {string} type + * @property {string} action + */ +/** + * @param {ButtonProps} props + * @param {string} label + * @return {string} + */ +function makeButtonLegacy( props, label ) { + let typeClass = ''; + let iconClass = 'mw-ui-icon-add'; + switch ( props.action ) { + case 'progressive': + typeClass += ' mw-ui-progressive'; + iconClass += '-progressive'; + break; + case 'destructive': + typeClass += ' mw-ui-destructive'; + iconClass += '-destructive'; + break; + } + if ( props.type === 'primary' ) { + iconClass = 'mw-ui-icon-add-invert'; + } + return mustache.render( buttonTemplate, { + label, + class: typeClass, + 'is-quiet': props.type === 'quiet', + 'html-vector-button-icon': `` + } ); +} + +/** + * @param {ButtonProps} props + * @param {string} text + * @param {string} icon + * @return {string} + */ +function makeButton( props, text, icon ) { + const el = document.createElement( 'div' ); + const vm = createApp( { + render: function () { + // @ts-ignore + return h( CdxButton, props, [ + h( CdxIcon, { icon } ), + text + ] ); + } + } ); + vm.mount( el ); + return ` + + ${makeButtonLegacy( props, text )} + ${el.outerHTML} + `; +} + +/** + * @return {string} + */ +function makeIcon() { + const el = document.createElement( 'div' ); + const vm = createApp( { + render: function () { + // @ts-ignore + return h( CdxButton, { + 'aria-label': 'add' + }, [ + h( CdxIcon, { icon: cdxIconAdd } ) + ] ); + } + } ); + vm.mount( el ); + const elQuiet = document.createElement( 'div' ); + const vmQuiet = createApp( { + render: function () { + // @ts-ignore + return h( CdxButton, { + type: 'quiet', + 'aria-label': 'add' + }, [ + h( CdxIcon, { icon: cdxIconAdd } ) + ] ); + } + } ); + vmQuiet.mount( elQuiet ); + return ` + + +

      Regular icon
      + ${ + mustache.render( buttonTemplate, { + label: 'Normal Icon button', + icon: 'add' + } ) +} + + +
      Regular icon
      + ${el.outerHTML} + + + + +
      Small icon button
      + ${ + mustache.render( buttonTemplate, { + label: 'Small icon button', + class: 'mw-ui-icon-small', + icon: 'add' + } ) +} + + +
      Small icon button
      + ${el.outerHTML} + + + +
      Quiet icon button
      + ${ + mustache.render( buttonTemplate, { + label: 'Quiet Icon', + 'is-quiet': true, + icon: 'add' + } ) +} + + +
      Quiet icon button
      + ${elQuiet.outerHTML} + `; +} + +/** + * + * @param {string[]} btns + * @return {string} + */ +function makeButtons( btns ) { + return ` + + + + + + ${btns.join( '\n' )} + +
      LegacyCodex
      `; +} + +/** + * @return {string} + */ +export const Button = () => makeButtons( [ + makeButton( { + action: 'default', + type: 'quiet' + }, 'Quiet button', cdxIconAdd ), + makeButton( { + action: 'progressive', + type: 'quiet' + }, 'Quiet progressive', cdxIconAdd ), + makeButton( { + action: 'destructive', + type: 'quiet' + }, 'Quiet destructive', cdxIconAdd ), + makeButton( { + action: 'default', + type: 'normal' + }, 'Normal', cdxIconAdd ), + makeButton( { + type: 'primary', + action: 'progressive' + }, 'Progressive primary', cdxIconAdd ), + makeButton( { + type: 'primary', + action: 'destructive' + }, 'Destructive primary', cdxIconAdd ), + makeIcon() +] ); diff --git a/Vector/stories/Footer.stories.data.js b/Vector/stories/Footer.stories.data.js new file mode 100644 index 0000000..67d1551 --- /dev/null +++ b/Vector/stories/Footer.stories.data.js @@ -0,0 +1,84 @@ +import { htmlUserLanguageAttributes } from './utils'; +import footerTemplate from '!!raw-loader!../includes/templates/Footer.mustache'; +import footerRowTemplate from '!!raw-loader!../includes/templates/Footer__row.mustache'; + +export const FOOTER_TEMPLATE_PARTIALS = { + // eslint-disable-next-line camelcase + Footer__row: footerRowTemplate +}; + +const + FOOTER_INFO = { + id: 'footer-info', + 'array-items': [ + { + id: 'footer-info-lastmod', + html: 'This page was last modified on 10 January 2020, at 21:24.' + }, + { + id: 'footer-info-copyright', + html: `This text is available under the Creative Commons Attribution-ShareAlike Licence; +additional terms may apply. See Terms of Use for details.` + + } + ] + }, + FOOTER_PLACES = { + id: 'footer-places', + 'array-items': [ + { + id: 'footer-places-privacy', + html: `Privacy policy` + }, + { + id: 'footer-places-about', + html: `About Wikipedia` + }, + { + id: 'footer-places-disclaimer', + html: `Disclaimers` + }, + { + id: 'footer-places-contact', + html: `Contact Wikipedia` + }, + { + id: 'footer-places-developers', + html: `Developers` + }, + { + id: 'footer-places-statslink', + html: `Statistics` + }, + { + id: 'footer-places-cookiestatement', + html: `Cookie statement` + }, + { + id: 'footer-places-mobileview', + html: `Mobile view` + } + ] + }, + FOOTER_ICONS = { + id: 'footer-icons', + 'array-items': [ + { + id: 'footer-copyrightico', + html: `Wikimedia Foundation` + }, + { + id: 'footer-poweredbyico', + html: `Powered by MediaWiki` + } + ] + }; + +export { footerTemplate }; + +export const FOOTER_TEMPLATE_DATA = { + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'data-info': FOOTER_INFO, + 'data-places': FOOTER_PLACES, + 'data-icons': FOOTER_ICONS +}; diff --git a/Vector/stories/Footer.stories.js b/Vector/stories/Footer.stories.js new file mode 100644 index 0000000..36ba498 --- /dev/null +++ b/Vector/stories/Footer.stories.js @@ -0,0 +1,14 @@ +import mustache from 'mustache'; +import { FOOTER_TEMPLATE_DATA, FOOTER_TEMPLATE_PARTIALS, + footerTemplate } from './Footer.stories.data'; +import '../resources/skins.vector.styles/Footer.less'; + +export default { + title: 'Footer' +}; + +export const footer = () => mustache.render( + footerTemplate, + FOOTER_TEMPLATE_DATA, + FOOTER_TEMPLATE_PARTIALS +); diff --git a/Vector/stories/Header.stories.data.js b/Vector/stories/Header.stories.data.js new file mode 100644 index 0000000..7da57a4 --- /dev/null +++ b/Vector/stories/Header.stories.data.js @@ -0,0 +1,23 @@ +import headerTemplate from '!!raw-loader!../includes/templates/Header.mustache'; +import { logoTemplate as Logo, LOGO_TEMPLATE_DATA } from './Logo.stories.data'; +import { searchBoxTemplate as SearchBox, + searchBoxDataWithCollapsing, + SEARCH_TEMPLATE_PARTIALS } from './SearchBox.stories.data'; +import { userLinksTemplate as UserLinks, + USER_LINKS_LOGGED_OUT_TEMPLATE_DATA, + USER_LINK_PARTIALS } from './UserLinks.stories.data'; + +export const HEADER_TEMPLATE_PARTIALS = Object.assign( { + SearchBox, + Logo, + UserLinks +}, SEARCH_TEMPLATE_PARTIALS, USER_LINK_PARTIALS ); + +export { headerTemplate }; + +export const HEADER_TEMPLATE_DATA = Object.assign( { + 'msg-vector-main-menu-tooltip': 'Tooltip', + 'msg-vector-action-toggle-sidebar': 'Toggle', + 'data-search-box': searchBoxDataWithCollapsing, + 'data-vector-user-links': USER_LINKS_LOGGED_OUT_TEMPLATE_DATA +}, LOGO_TEMPLATE_DATA.wordmarkTaglineIcon ); diff --git a/Vector/stories/Header.stories.js b/Vector/stories/Header.stories.js new file mode 100644 index 0000000..f4c33fb --- /dev/null +++ b/Vector/stories/Header.stories.js @@ -0,0 +1,14 @@ +import mustache from 'mustache'; +import { HEADER_TEMPLATE_DATA, HEADER_TEMPLATE_PARTIALS, + headerTemplate } from './Header.stories.data'; +import '../resources/skins.vector.styles/components/Header.less'; + +export default { + title: 'Header' +}; + +export const header = () => mustache.render( + headerTemplate, + HEADER_TEMPLATE_DATA, + HEADER_TEMPLATE_PARTIALS +); diff --git a/Vector/stories/LanguageButton.stories.data.js b/Vector/stories/LanguageButton.stories.data.js new file mode 100644 index 0000000..85f17ab --- /dev/null +++ b/Vector/stories/LanguageButton.stories.data.js @@ -0,0 +1,30 @@ +import { placeholder, htmlUserLanguageAttributes, + makeIcon, portletAfter } from './utils'; + +/** + * @type {MenuDefinition} + */ +export const languageData = { + id: 'p-lang-btn', + 'is-dropdown': true, + // both classes needed for this to render correctly + class: 'mw-portlet-lang vector-menu-dropdown', + // mw-interlanguage-selector must be present to operate in ULS mode. + // icon classes and button classes + 'checkbox-class': 'mw-interlanguage-selector', + 'html-vector-heading-icon': makeIcon( 'wikimedia-language' ), + 'heading-class': 'mw-ui-button mw-ui-quiet', + 'html-tooltip': 'A message tooltip-p-lang must exist for this to appear', + label: '10 languages', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': ` +
    • +`, + 'html-after-portal': portletAfter( + `Edit links
    +${placeholder( `

    Further hook output possible (lang)

    `, 60 )}` + ) +}; diff --git a/Vector/stories/LanguageButton.stories.js b/Vector/stories/LanguageButton.stories.js new file mode 100644 index 0000000..0d1ce38 --- /dev/null +++ b/Vector/stories/LanguageButton.stories.js @@ -0,0 +1,10 @@ +import mustache from 'mustache'; +import '../resources/skins.vector.styles/LanguageButton.less'; +import { vectorMenuTemplate } from './MenuDropdown.stories.data'; +import { languageData } from './LanguageButton.stories.data'; + +export default { + title: 'LanguageButton' +}; + +export const languageButton = () => mustache.render( vectorMenuTemplate, languageData ); diff --git a/Vector/stories/Logo.stories.data.js b/Vector/stories/Logo.stories.data.js new file mode 100644 index 0000000..0ddc430 --- /dev/null +++ b/Vector/stories/Logo.stories.data.js @@ -0,0 +1,81 @@ +import logoTemplate from '!!raw-loader!../includes/templates/Logo.mustache'; +import wordmarkSrc from '../.storybook/resolve-imports/assets/wordmark.svg'; +import tagelineScr from '../.storybook/resolve-imports/assets/tagline.svg'; +import iconSrc from '../.storybook/resolve-imports/assets/icon.png'; + +/** + * @type {LogoOptions} + */ +const wordmark = { + src: wordmarkSrc, + width: 116, + height: 18 +}; + +/** + * @type {LogoOptions} + */ +const tagline = { + src: tagelineScr, + width: 117, + height: 13 +}; + +/** + * @type {string} + */ +const icon = iconSrc; + +/** + * @type {LogoTemplateData} + */ +const wordmarkTaglineIcon = { + 'data-logos': { + wordmark, tagline, icon + }, + 'msg-sitetitle': 'Wikipedia', + 'msg-sitesubtitle': 'the free encyclopedia' +}; + +/** + * @type {LogoTemplateData} + */ +const wordmarkIcon = { + 'data-logos': { + wordmark, icon + }, + 'msg-sitetitle': 'Wikipedia', + 'msg-sitesubtitle': 'the free encyclopedia' +}; + +/** + * @type {LogoTemplateData} + */ +const wordmarkOnly = { + 'data-logos': { + wordmark + }, + 'msg-sitetitle': 'Wikipedia', + 'msg-sitesubtitle': 'the free encyclopedia' +}; + +/** + * @type {LogoTemplateData} + */ +const noLogo = { + 'data-logos': {}, + 'msg-sitetitle': 'Wikipedia', + 'msg-sitesubtitle': 'the free encyclopedia' +}; + +/** + * @type {Object.} + */ +const LOGO_TEMPLATE_DATA = { + wordmarkTaglineIcon, + wordmarkIcon, + wordmarkOnly, + noLogo +}; + +export { LOGO_TEMPLATE_DATA, logoTemplate }; diff --git a/Vector/stories/Logo.stories.js b/Vector/stories/Logo.stories.js new file mode 100644 index 0000000..9b2d4d3 --- /dev/null +++ b/Vector/stories/Logo.stories.js @@ -0,0 +1,27 @@ +import mustache from 'mustache'; +import { logoTemplate, LOGO_TEMPLATE_DATA } from './Logo.stories.data'; +import '../resources/skins.vector.styles/Logo.less'; + +export default { + title: 'Logo' +}; + +export const logo = () => mustache.render( + logoTemplate, + LOGO_TEMPLATE_DATA.wordmarkTaglineIcon[ 'data-logos' ] +); + +export const logoWordmarkIcon = () => mustache.render( + logoTemplate, + LOGO_TEMPLATE_DATA.wordmarkIcon[ 'data-logos' ] +); + +export const logoWordmark = () => mustache.render( + logoTemplate, + LOGO_TEMPLATE_DATA.wordmarkOnly[ 'data-logos' ] +); + +export const noLogo = () => mustache.render( + logoTemplate, + LOGO_TEMPLATE_DATA.noLogo +); diff --git a/Vector/stories/Menu.stories.data.js b/Vector/stories/Menu.stories.data.js new file mode 100644 index 0000000..321a9db --- /dev/null +++ b/Vector/stories/Menu.stories.data.js @@ -0,0 +1,15 @@ +import menuTemplate from '!!raw-loader!../includes/templates/Menu.mustache'; +import legacyMenuTemplate from '!!raw-loader!../includes/templates/LegacyMenu.mustache'; +import { helperMakeMenuData } from './utils'; + +/** + * @type {MenuDefinition} + */ +const defaultMenu = helperMakeMenuData( + 'generic', + `
  • Item 1
  • +
  • Item 2
  • +
  • Item 3
  • ` +); + +export { menuTemplate, legacyMenuTemplate, defaultMenu }; diff --git a/Vector/stories/Menu.stories.js b/Vector/stories/Menu.stories.js new file mode 100644 index 0000000..830d346 --- /dev/null +++ b/Vector/stories/Menu.stories.js @@ -0,0 +1,12 @@ +import mustache from 'mustache'; +import { menuTemplate, defaultMenu } from './Menu.stories.data'; +import '../resources/skins.vector.styles/Menu.less'; + +export default { + title: 'Menu' +}; + +export const menu = () => mustache.render( + menuTemplate, + defaultMenu +); diff --git a/Vector/stories/MenuDropdown.stories.data.js b/Vector/stories/MenuDropdown.stories.data.js new file mode 100644 index 0000000..7325e61 --- /dev/null +++ b/Vector/stories/MenuDropdown.stories.data.js @@ -0,0 +1,69 @@ +import vectorMenuTemplate from '!!raw-loader!../includes/templates/Menu.mustache'; +import { htmlUserLanguageAttributes } from './utils'; + +export { vectorMenuTemplate }; + +/** + * @type {MenuDefinition} + */ +export const moreData = { + 'is-dropdown': true, + class: 'vector-menu-dropdown', + label: 'More', + id: 'p-cactions', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': `
  • + Delete +
  • +
  • + Move +
  • +
  • + Protect +
  • ` +}; + +/** + * @type {MenuDefinition} + */ +export const variantsData = { + 'is-dropdown': true, + class: 'vector-menu-dropdown', + label: '新加坡简体', + id: 'p-variants', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': `
  • + 不转换
  • +
  • + 简体 +
  • +
  • + 繁體 +
  • +
  • + 大陆简体 +
  • +
  • + 香港繁體 +
  • +
  • + 澳門繁體 +
  • +
  • + 新加坡简体 +
  • +
  • + 臺灣正體 +
  • ` +}; diff --git a/Vector/stories/MenuDropdown.stories.js b/Vector/stories/MenuDropdown.stories.js new file mode 100644 index 0000000..deaedc0 --- /dev/null +++ b/Vector/stories/MenuDropdown.stories.js @@ -0,0 +1,10 @@ +import mustache from 'mustache'; +import { vectorMenuTemplate, moreData, variantsData } from './MenuDropdown.stories.data'; + +export default { + title: 'MenuDropdown' +}; + +export const more = () => mustache.render( vectorMenuTemplate, moreData ); + +export const variants = () => mustache.render( vectorMenuTemplate, variantsData ); diff --git a/Vector/stories/MenuPortal.stories.data.js b/Vector/stories/MenuPortal.stories.data.js new file mode 100644 index 0000000..6c10183 --- /dev/null +++ b/Vector/stories/MenuPortal.stories.data.js @@ -0,0 +1,86 @@ +import mustache from 'mustache'; +import { vectorMenuTemplate as portalTemplate } from './MenuDropdown.stories.data'; +import { placeholder, htmlUserLanguageAttributes, portletAfter } from './utils'; + +/** + * @param {MenuDefinition} data + * @return {HTMLElement} + */ +export const wrapPortlet = ( data ) => { + const node = document.createElement( 'div' ); + node.setAttribute( 'id', 'mw-panel' ); + node.innerHTML = mustache.render( portalTemplate, data ); + return node; +}; + +/** + * @type {Object.} + */ +export const PORTALS = { + example: { + id: 'p-example', + class: 'vector-menu-portal portal', + 'html-tooltip': 'Message tooltip-p-example acts as tooltip', + label: 'Portal title', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': ` +
  • A list of links
  • +
  • with ids
  • +
  • on each list item
  • +`, + 'html-after-portal': portletAfter( + placeholder( `

    Beware: The SkinAfterPortlet hook + can be used to inject arbitary HTML here for any portlet.

    `, 60 ) + ) + }, + navigation: { + id: 'p-navigation', + class: 'vector-menu-portal portal', + 'html-tooltip': 'A message tooltip-p-navigation must exist for this to appear', + label: 'Navigation', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': ` +
  • Main page
  • Contents
  • Featured content
  • Current events
  • Random page
  • Donate
  • +`, + 'html-after-portal': portletAfter( placeholder( 'Possible hook output (navigation)', 50 ) ) + }, + toolbox: { + id: 'p-tb', + class: 'vector-menu-portal portal', + 'html-tooltip': 'A message tooltip-p-tb must exist for this to appear', + label: 'Tools', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': ` +
  • What links here
  • Related changes
  • Upload file
  • Special pages
  • Page information
  • Wikidata item
  • Cite this page
  • +`, + 'html-after-portal': portletAfter( placeholder( 'Possible hook output (tb)', 50 ) ) + }, + langlinks: { + id: 'p-lang', + class: 'vector-menu-portal portal', + 'html-tooltip': 'A message tooltip-p-lang must exist for this to appear', + label: 'In other languages', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': ` +
    +${placeholder( `

    Further hook output possible (lang)

    `, 60 )}` + ) + }, + otherProjects: { + id: 'p-wikibase-otherprojects', + class: 'vector-menu-portal portal', + 'html-tooltip': 'A message tooltip-p-wikibase-otherprojects must exist for this to appear', + label: 'In other projects', + 'html-user-language-attributes': htmlUserLanguageAttributes, + + 'html-items': ` + `, + 'html-after-portal': '' + } +}; diff --git a/Vector/stories/MenuPortal.stories.js b/Vector/stories/MenuPortal.stories.js new file mode 100644 index 0000000..fc774f4 --- /dev/null +++ b/Vector/stories/MenuPortal.stories.js @@ -0,0 +1,11 @@ +import { PORTALS, wrapPortlet } from './MenuPortal.stories.data'; + +export default { + title: 'MenuPortal' +}; + +export const portal = () => wrapPortlet( PORTALS.example ); +export const navigationPortal = () => wrapPortlet( PORTALS.navigation ); +export const toolbox = () => wrapPortlet( PORTALS.toolbox ); +export const langlinks = () => wrapPortlet( PORTALS.langlinks ); +export const otherProjects = () => wrapPortlet( PORTALS.otherProjects ); diff --git a/Vector/stories/MenuTabs.stories.data.js b/Vector/stories/MenuTabs.stories.data.js new file mode 100644 index 0000000..ce8f7eb --- /dev/null +++ b/Vector/stories/MenuTabs.stories.data.js @@ -0,0 +1,34 @@ +import { htmlUserLanguageAttributes } from './utils'; + +/** + * @type {MenuDefinition} + */ +export const pageActionsData = { + id: 'p-views', + class: 'vector-menu-tabs', + label: 'Views', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': `
  • + Read +
  • +
  • + View source
  • +
  • + View history +
  • + +` +}; + +/** + * @type {MenuDefinition} + */ +export const namespaceTabsData = { + id: 'p-namespaces', + class: 'vector-menu-tabs', + label: 'Namespaces', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': `
  • Main page
  • +
  • Talk (3)
  • ` +}; diff --git a/Vector/stories/MenuTabs.stories.js b/Vector/stories/MenuTabs.stories.js new file mode 100644 index 0000000..c223196 --- /dev/null +++ b/Vector/stories/MenuTabs.stories.js @@ -0,0 +1,13 @@ +import mustache from 'mustache'; +import { menuTemplate as vectorTabsTemplate } from './Menu.stories.data'; +import { namespaceTabsData, pageActionsData } from './MenuTabs.stories.data'; +import '../resources/skins.vector.styles/components/MenuTabs.less'; +import '../resources/skins.vector.styles/components/TabWatchstarLink.less'; + +export default { + title: 'MenuTabs' +}; + +export const pageActionTabs = () => mustache.render( vectorTabsTemplate, pageActionsData ); + +export const namespaceTabs = () => mustache.render( vectorTabsTemplate, namespaceTabsData ); diff --git a/Vector/stories/PageToolbar.stories.data.js b/Vector/stories/PageToolbar.stories.data.js new file mode 100644 index 0000000..6e0d6ee --- /dev/null +++ b/Vector/stories/PageToolbar.stories.data.js @@ -0,0 +1,28 @@ +import pageToolbarTemplate from '!!raw-loader!../includes/templates/PageToolbar.mustache'; +import { namespaceTabsData, pageActionsData } from './MenuTabs.stories.data'; +import { menuTemplate } from './Menu.stories.data'; + +const PAGE_TOOLBAR_TEMPLATE_DATA = { + 'data-portlets': { + 'data-views': pageActionsData, + 'data-namespaces': namespaceTabsData + } +}; + +const PAGE_TOOLBAR_TEMPLATE_DATA_LEGACY = { + 'data-portlets': { + 'data-views': Object.assign( {}, pageActionsData, { + class: 'vector-menu-tabs-legacy' + } ), + 'data-namespaces': Object.assign( {}, namespaceTabsData, { + class: 'vector-menu-tabs-legacy' + } ) + } +}; + +const PAGE_TOOLBAR_PARTIALS = { + Menu: menuTemplate +}; + +export { pageToolbarTemplate, PAGE_TOOLBAR_TEMPLATE_DATA, + PAGE_TOOLBAR_TEMPLATE_DATA_LEGACY, PAGE_TOOLBAR_PARTIALS }; diff --git a/Vector/stories/PageToolbar.stories.js b/Vector/stories/PageToolbar.stories.js new file mode 100644 index 0000000..bb91287 --- /dev/null +++ b/Vector/stories/PageToolbar.stories.js @@ -0,0 +1,15 @@ +import mustache from 'mustache'; +import { pageToolbarTemplate, + PAGE_TOOLBAR_TEMPLATE_DATA, + PAGE_TOOLBAR_PARTIALS } from './PageToolbar.stories.data'; +import '../resources/skins.vector.styles/components/PageToolbar.less'; + +export default { + title: 'PageToolbar' +}; + +export const defaultState = () => mustache.render( + pageToolbarTemplate, + PAGE_TOOLBAR_TEMPLATE_DATA, + PAGE_TOOLBAR_PARTIALS +); diff --git a/Vector/stories/SearchBox.stories.data.js b/Vector/stories/SearchBox.stories.data.js new file mode 100644 index 0000000..7359813 --- /dev/null +++ b/Vector/stories/SearchBox.stories.data.js @@ -0,0 +1,54 @@ +import searchBoxTemplate from '!!raw-loader!../includes/templates/SearchBox.mustache'; +import Button from '!!raw-loader!../includes/templates/Button.mustache'; +import { htmlUserLanguageAttributes } from './utils'; + +const INPUT_ATTRIBUTES = 'type="search" name="search" placeholder="Search Wikipedia" title="Search Wikipedia [⌃⌥f]" accesskey="f" id="searchInput" autocomplete="off"'; +const FULL_TEXT_ATTRIBUTES = 'name="fulltext" title="Search pages for this text" id="mw-searchButton" class="searchButton mw-fallbackSearchButton"'; +const GO_ATTRIBUTES = 'name="go" title="Go to a page with this exact name if it exists" id="searchButton" class="searchButton"'; + +/** + * @type {SearchData} + */ +const searchBoxData = { + 'form-action': '/w/index.php', + 'form-id': 'searchform', + 'is-primary': false, + class: 'vector-search-show-thumbnail', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'msg-search': 'Search', + 'html-input': ``, + 'page-title': 'Special:Search', + 'html-input-attributes': INPUT_ATTRIBUTES, + 'html-button-fulltext-attributes': FULL_TEXT_ATTRIBUTES, + 'msg-searchbutton': 'Search', + 'msg-searcharticle': 'Go', + 'html-button-go-attributes': GO_ATTRIBUTES, + 'html-button-search-fallback': ``, + 'html-button-search': `` +}; + +/** + * @type {SearchData} + */ +const searchBoxDataWithCollapsing = Object.assign( {}, searchBoxData, { + class: `${searchBoxData.class} vector-search-box-collapses`, + 'is-collapsible': true, + 'data-collapse-icon': { + icon: 'wikimedia-search', + 'is-quiet': true, + class: 'search-toggle', + href: '/wiki/Special:Search', + label: 'Search' + } +} ); + +const SEARCH_TEMPLATE_PARTIALS = { + Button +}; + +export { + SEARCH_TEMPLATE_PARTIALS, + searchBoxTemplate, + searchBoxDataWithCollapsing, + searchBoxData +}; diff --git a/Vector/stories/SearchBox.stories.js b/Vector/stories/SearchBox.stories.js new file mode 100644 index 0000000..f3fe969 --- /dev/null +++ b/Vector/stories/SearchBox.stories.js @@ -0,0 +1,18 @@ +import mustache from 'mustache'; +import '../resources/skins.vector.styles/SearchBox.less'; + +import { searchBoxData, searchBoxDataWithCollapsing, searchBoxTemplate, + SEARCH_TEMPLATE_PARTIALS +} from './SearchBox.stories.data'; + +export default { + title: 'SearchBox' +}; + +export const searchBoxWithoutCollapsing = () => ` + ${mustache.render( searchBoxTemplate, searchBoxData, SEARCH_TEMPLATE_PARTIALS )} +`; + +export const searchBoxWithCollapsing = () => ` + ${mustache.render( searchBoxTemplate, searchBoxDataWithCollapsing, SEARCH_TEMPLATE_PARTIALS )} +`; diff --git a/Vector/stories/Sidebar.stories.data.js b/Vector/stories/Sidebar.stories.data.js new file mode 100644 index 0000000..ef21e0d --- /dev/null +++ b/Vector/stories/Sidebar.stories.data.js @@ -0,0 +1,52 @@ +import sidebarTemplate from '!!raw-loader!../includes/templates/MainMenu.mustache'; +import sidebarLegacyTemplate from '!!raw-loader!../includes/templates/LegacySidebar.mustache'; +import { vectorMenuTemplate } from './MenuDropdown.stories.data'; +import { PORTALS } from './MenuPortal.stories.data'; + +const SIDEBAR_BEFORE_OUTPUT_HOOKINFO = `Beware: Portals can be added, removed or reordered using +SidebarBeforeOutput hook as in this example.`; + +export { sidebarTemplate, sidebarLegacyTemplate }; + +export const SIDEBAR_TEMPLATE_PARTIALS = { + Menu: vectorMenuTemplate +}; + +export const OPT_OUT_DATA = { + 'data-main-menu-action': { + href: '#', + 'msg-vector-opt-out': 'Switch to old look', + 'msg-vector-opt-out-tooltip': 'Change your settings to go back to the old look of the skin (legacy Vector)' + } +}; + +export const SIDEBAR_DATA = { + withNoPortals: { + 'array-portlets-rest': [] + }, + withPortals: { + 'data-portlets-first': PORTALS.navigation, + 'array-portlets-rest': [ + PORTALS.toolbox, + PORTALS.otherProjects + ], + 'data-portals-languages': PORTALS.langlinks + }, + withoutLogo: { + 'data-portals-languages': PORTALS.langlinks, + 'array-portals-first': PORTALS.navigation, + 'array-portlets-rest': [ + PORTALS.toolbox, + PORTALS.otherProjects + ] + }, + thirdParty: { + 'array-portlets-rest': [ + PORTALS.toolbox, + PORTALS.navigation, + { + 'html-portal-content': SIDEBAR_BEFORE_OUTPUT_HOOKINFO + } + ] + } +}; diff --git a/Vector/stories/Sidebar.stories.js b/Vector/stories/Sidebar.stories.js new file mode 100644 index 0000000..e0a6857 --- /dev/null +++ b/Vector/stories/Sidebar.stories.js @@ -0,0 +1,30 @@ +import mustache from 'mustache'; +import '../resources/skins.vector.styles/MainMenu.less'; +import '../resources/skins.vector.styles/SidebarLogo.less'; + +import { sidebarTemplate, + sidebarLegacyTemplate, SIDEBAR_DATA, SIDEBAR_TEMPLATE_PARTIALS } from './Sidebar.stories.data'; + +export default { + title: 'Sidebar' +}; + +export const sidebarLegacyWithNoPortals = () => mustache.render( + sidebarLegacyTemplate, SIDEBAR_DATA.withNoPortals, SIDEBAR_TEMPLATE_PARTIALS +); + +export const sidebarLegacyWithPortals = () => mustache.render( + sidebarLegacyTemplate, SIDEBAR_DATA.withPortals, SIDEBAR_TEMPLATE_PARTIALS +); + +export const sidebarModernWithoutLogo = () => mustache.render( + sidebarTemplate, SIDEBAR_DATA.withoutLogo, SIDEBAR_TEMPLATE_PARTIALS +); + +export const sidebarModernWithPortals = () => mustache.render( + sidebarTemplate, SIDEBAR_DATA.withPortals, SIDEBAR_TEMPLATE_PARTIALS +); + +export const sidebarModernThirdParty = () => mustache.render( + sidebarTemplate, SIDEBAR_DATA.thirdParty, SIDEBAR_TEMPLATE_PARTIALS +); diff --git a/Vector/stories/StickyHeader.stories.data.js b/Vector/stories/StickyHeader.stories.data.js new file mode 100644 index 0000000..3d82dfc --- /dev/null +++ b/Vector/stories/StickyHeader.stories.data.js @@ -0,0 +1,50 @@ +import template from '!!raw-loader!../includes/templates/StickyHeader.mustache'; +import Button from '!!raw-loader!../includes/templates/Button.mustache'; +import { searchBoxData } from './SearchBox.stories.data'; + +const NO_ICON = { + icon: 'none', + 'is-quiet': true, + class: 'sticky-header-icon' +}; + +const TALK_ICON = { + icon: 'none', + 'is-quiet': true, + class: 'sticky-header-icon mw-ui-icon-wikimedia-speechBubbles' +}; + +const HISTORY_ICON = { + icon: 'none', + 'is-quiet': true, + class: 'sticky-header-icon mw-ui-icon-wikimedia-history' +}; + +const data = { + title: 'Audre Lorde', + heading: 'Introduction', + 'data-buttons': [ { + id: 'p-lang-btn-sticky-header', + class: 'mw-interlanguage-selector', + 'is-quiet': true, + label: '196 languages', + 'html-vector-button-icon': `` + } ], + 'data-search': searchBoxData, + 'data-button-start': { + icon: 'wikimedia-search', + class: 'vector-sticky-header-search-toggle', + 'is-quiet': true, + label: 'Search' + }, + 'data-button-end': NO_ICON, + 'data-icons': [ + TALK_ICON, HISTORY_ICON, NO_ICON, NO_ICON + ] +}; + +export const STICKY_HEADER_TEMPLATE_PARTIALS = { + Button +}; + +export { template, data }; diff --git a/Vector/stories/StickyHeader.stories.js b/Vector/stories/StickyHeader.stories.js new file mode 100644 index 0000000..48052b4 --- /dev/null +++ b/Vector/stories/StickyHeader.stories.js @@ -0,0 +1,13 @@ +import mustache from 'mustache'; +import '../resources/skins.vector.styles/components/StickyHeader.less'; + +import { template, data, + STICKY_HEADER_TEMPLATE_PARTIALS } from './StickyHeader.stories.data'; + +export default { + title: 'StickyHeader' +}; + +export const stickyHeader = () => mustache.render( + template, data, STICKY_HEADER_TEMPLATE_PARTIALS +); diff --git a/Vector/stories/UserLinks.stories.data.js b/Vector/stories/UserLinks.stories.data.js new file mode 100644 index 0000000..348d2e8 --- /dev/null +++ b/Vector/stories/UserLinks.stories.data.js @@ -0,0 +1,146 @@ +import msgs from '../i18n/en.json'; +import mustache from 'mustache'; +import { menuTemplate, legacyMenuTemplate } from './Menu.stories.data'; +import userLinksTemplateLegacy from '!!raw-loader!../includes/templates/LegacyUserLinks.mustache'; +import userLinksTemplate from '!!raw-loader!../includes/templates/UserLinks.mustache'; +import userLinksLogoutTemplate from '!!raw-loader!../includes/templates/UserLinks__logout.mustache'; +import userLinksLoginTemplate from '!!raw-loader!../includes/templates/UserLinks__login.mustache'; +import { helperClassName, helperMakeMenuData } from './utils'; + +/** + * Legacy User Links + */ + +const ECHO_ITEMS = `
  • Alerts (0)
  • Notices (3)
  • `; +const USERNAME_ITEM = `
  • WikiUser
  • `; +const REST_ITEMS = `
  • Talk
  • Sandbox
  • Preferences
  • Beta
  • Watchlist
  • Contributions
  • `; +const LOGOUT_ITEM = `
  • Log out
  • `; +const ULS_LANGUAGE_SELECTOR = '
  • English
  • '; + +/** + * @type {MenuDefinition} + */ +const loggedOut = helperMakeMenuData( + 'personal', + `
  • Not logged in
  • Talk
  • Contributions
  • Create account
  • Log in
  • `, + helperClassName( 'vector-user-menu-legacy' ) +); + +/** + * @type {MenuDefinition} + */ +const loggedInWithEcho = helperMakeMenuData( + 'personal', + `${USERNAME_ITEM}${ECHO_ITEMS}${REST_ITEMS}${LOGOUT_ITEM}`, + helperClassName( 'vector-user-menu-legacy' ) +); + +/** + * @type {MenuDefinition} + */ +const loggedInWithULS = helperMakeMenuData( + 'personal', + `${ULS_LANGUAGE_SELECTOR}${USERNAME_ITEM}${ECHO_ITEMS}${REST_ITEMS}${LOGOUT_ITEM}`, + helperClassName( 'vector-user-menu-legacy' ) +); + +/** + * @type {Object.} + */ +const PERSONAL_MENU_TEMPLATE_DATA = { + loggedOut, + loggedInWithEcho, + loggedInWithULS +}; + +/** + * Modern User Links + */ + +const LOGGED_IN_ITEMS = ` + +
  • Talk
  • +
  • Sandbox
  • +
  • Preferences
  • +
  • Beta
  • + +
  • Uploads
  • +
  • Contributions
  • +`; + +const LOGGED_OUT_ITEMS = ` +
  • Talk
  • +
  • Contributions
  • +`; + +const LOGGED_IN_OVERFLOW_ITEMS = ` + +
  • Alerts (0)
  • +
  • Notices (0)
  • + +`; + +const LOGGED_OUT_OVERFLOW_ITEMS = ` + +`; + +const loggedInData = { + class: 'vector-user-menu vector-menu-dropdown vector-user-menu-logged-in', + 'heading-class': 'mw-ui-button mw-ui-quiet mw-ui-icon mw-ui-icon-element mw-ui-icon-wikimedia-userAvatar', + 'html-after-portal': mustache.render( userLinksLogoutTemplate, { + htmlLogout: `Log out` + } ), + 'is-anon': false, + 'is-dropdown': true, + 'has-label': true +}; + +const loggedOutData = { + class: 'vector-user-menu vector-menu-dropdown vector-user-menu-logged-out', + 'heading-class': 'mw-ui-button mw-ui-quiet mw-ui-icon mw-ui-icon-element mw-ui-icon-wikimedia-ellipsis', + 'html-before-portal': mustache.render( userLinksLoginTemplate, { + htmlCreateAccount: `Create account`, + htmlLogin: ``, + msgLearnMore: msgs[ 'vector-anon-user-menu-pages' ], + htmlLearnMoreLink: `${msgs[ 'vector-anon-user-menu-pages-learn' ]}:` + } ), + 'is-anon': false, + 'is-dropdown': true, + 'has-label': true +}; + +const overflowData = { + class: 'vector-menu vector-user-menu-overflow', + 'heading-class': '', + 'is-dropdown': false +}; + +/** + * @type {UserLinksDefinition} + */ +const USER_LINKS_LOGGED_IN_TEMPLATE_DATA = { + 'data-user-menu-overflow': helperMakeMenuData( 'vector-user-menu-overflow', LOGGED_IN_OVERFLOW_ITEMS, overflowData ), + 'data-user-menu': helperMakeMenuData( 'personal-more', LOGGED_IN_ITEMS, loggedInData ) +}; + +/** + * @type {UserLinksDefinition} + */ +const USER_LINKS_LOGGED_OUT_TEMPLATE_DATA = { + 'data-user-menu-overflow': helperMakeMenuData( 'vector-user-menu-overflow', LOGGED_OUT_OVERFLOW_ITEMS, overflowData ), + 'data-user-menu': helperMakeMenuData( 'personal-more', LOGGED_OUT_ITEMS, loggedOutData ) +}; + +const USER_LINK_PARTIALS = { + Menu: menuTemplate, + LegacyMenu: legacyMenuTemplate +}; + +export { + PERSONAL_MENU_TEMPLATE_DATA, + USER_LINKS_LOGGED_IN_TEMPLATE_DATA, + USER_LINKS_LOGGED_OUT_TEMPLATE_DATA, + USER_LINK_PARTIALS, + userLinksTemplateLegacy, + userLinksTemplate +}; diff --git a/Vector/stories/UserLinks.stories.js b/Vector/stories/UserLinks.stories.js new file mode 100644 index 0000000..d00221e --- /dev/null +++ b/Vector/stories/UserLinks.stories.js @@ -0,0 +1,46 @@ +import mustache from 'mustache'; +import { PERSONAL_MENU_TEMPLATE_DATA, USER_LINKS_LOGGED_IN_TEMPLATE_DATA, USER_LINKS_LOGGED_OUT_TEMPLATE_DATA } from './UserLinks.stories.data'; +import { userLinksTemplateLegacy, userLinksTemplate, + USER_LINK_PARTIALS } from './UserLinks.stories.data'; +import '../resources/skins.vector.styles.legacy/components/UserLinks.less'; +import '../resources/skins.vector.styles/components/UserLinks.less'; + +export default { + title: 'UserLinks' +}; + +export const legacyLoggedOut = () => mustache.render( + userLinksTemplateLegacy, + { + 'data-personal': PERSONAL_MENU_TEMPLATE_DATA.loggedOut + }, + USER_LINK_PARTIALS +); + +export const legacyLoggedInWithEcho = () => mustache.render( + userLinksTemplateLegacy, + { + 'data-personal': PERSONAL_MENU_TEMPLATE_DATA.loggedInWithEcho + }, + USER_LINK_PARTIALS +); + +export const legacyLoggedInWithULS = () => mustache.render( + userLinksTemplateLegacy, + { + 'data-personal': PERSONAL_MENU_TEMPLATE_DATA.loggedInWithULS + }, + USER_LINK_PARTIALS +); + +export const loggedInUserLinks = () => mustache.render( + userLinksTemplate, + USER_LINKS_LOGGED_IN_TEMPLATE_DATA, + USER_LINK_PARTIALS +); + +export const loggedOutUserLinks = () => mustache.render( + userLinksTemplate, + USER_LINKS_LOGGED_OUT_TEMPLATE_DATA, + USER_LINK_PARTIALS +); diff --git a/Vector/stories/rawLoader.d.ts b/Vector/stories/rawLoader.d.ts new file mode 100644 index 0000000..f7443f6 --- /dev/null +++ b/Vector/stories/rawLoader.d.ts @@ -0,0 +1,14 @@ +declare module "!!raw-loader!*" { + const src: string; + export default src; +} + +declare module "*.svg" { + const src: string; + export default src; +} + +declare module "*.png" { + const src: string; + export default src; +} \ No newline at end of file diff --git a/Vector/stories/skin.less b/Vector/stories/skin.less new file mode 100644 index 0000000..4dd1e8d --- /dev/null +++ b/Vector/stories/skin.less @@ -0,0 +1,4 @@ +.skin-vector-legacy { + @import '../resources/skins.vector.styles.legacy/layouts/screen.less'; + @import '../resources/skins.vector.styles.legacy/components/MenuTabs.less'; +} diff --git a/Vector/stories/skin.stories.data.js b/Vector/stories/skin.stories.data.js new file mode 100644 index 0000000..63c36b9 --- /dev/null +++ b/Vector/stories/skin.stories.data.js @@ -0,0 +1,130 @@ +import { htmlUserLanguageAttributes } from './utils'; +import { placeholder } from './utils'; + +import { pageToolbarTemplate, PAGE_TOOLBAR_TEMPLATE_DATA_LEGACY } from './PageToolbar.stories.data'; +import { userLinksTemplateLegacy } from './UserLinks.stories.data'; +import { menuTemplate, legacyMenuTemplate } from './Menu.stories.data'; +import { PERSONAL_MENU_TEMPLATE_DATA } from './UserLinks.stories.data'; +import { vectorMenuTemplate, moreData, variantsData } from './MenuDropdown.stories.data'; +import { searchBoxData, searchBoxTemplate, SEARCH_TEMPLATE_PARTIALS } from './SearchBox.stories.data'; +import { SIDEBAR_DATA, SIDEBAR_TEMPLATE_PARTIALS, OPT_OUT_DATA, + sidebarLegacyTemplate, sidebarTemplate } from './Sidebar.stories.data'; +import { FOOTER_TEMPLATE_DATA, FOOTER_TEMPLATE_PARTIALS, + footerTemplate } from './Footer.stories.data'; +import { logoTemplate } from './Logo.stories.data'; + +export const NAVIGATION_TEMPLATE_DATA = { + loggedInWithVariantsAndOptOut: Object.assign( {}, { + 'data-portlets': Object.assign( {}, PAGE_TOOLBAR_TEMPLATE_DATA_LEGACY[ 'data-portlets' ], { + 'data-personal': PERSONAL_MENU_TEMPLATE_DATA.loggedInWithEcho, + 'data-variants': variantsData + } ), + 'data-search-box': searchBoxData, + 'data-portlets-main-menu': SIDEBAR_DATA.withPortals, + 'msg-navigation-heading': 'Navigation menu', + 'html-logo-attributes': `class="mw-wiki-logo" href="/wiki/Main_Page" title="Visit the main page"` + }, OPT_OUT_DATA ), + loggedOutWithVariants: { + 'data-portlets': Object.assign( {}, PAGE_TOOLBAR_TEMPLATE_DATA_LEGACY[ 'data-portlets' ], { + 'data-personal': PERSONAL_MENU_TEMPLATE_DATA.loggedOut, + 'data-variants': variantsData + } ), + 'data-search-box': searchBoxData, + 'data-portlets-main-menu': SIDEBAR_DATA.withPortals, + 'msg-navigation-heading': 'Navigation menu', + 'html-logo-attributes': `class="mw-wiki-logo" href="/wiki/Main_Page" title="Visit the main page"` + }, + loggedInWithMoreActions: { + 'data-portlets': Object.assign( {}, PAGE_TOOLBAR_TEMPLATE_DATA_LEGACY[ 'data-portlets' ], { + 'data-personal': PERSONAL_MENU_TEMPLATE_DATA.loggedInWithEcho, + 'data-actions': moreData + } ), + 'data-search-box': searchBoxData, + 'data-portlets-main-menu': SIDEBAR_DATA.withPortals, + 'msg-navigation-heading': 'Navigation menu', + 'html-logo-attributes': `class="mw-wiki-logo" href="/wiki/Main_Page" title="Visit the main page"` + } +}; + +export const TEMPLATE_PARTIALS = Object.assign( {}, SIDEBAR_TEMPLATE_PARTIALS, { + Logo: logoTemplate, + ArticleToolbar: pageToolbarTemplate, + SearchBox: searchBoxTemplate, + LegacySidebar: sidebarLegacyTemplate, + Sidebar: sidebarTemplate, + LegacyMenu: legacyMenuTemplate, + VectorMenu: vectorMenuTemplate, + Menu: menuTemplate, + LegacyUserLinks: userLinksTemplateLegacy, + Footer: footerTemplate +}, FOOTER_TEMPLATE_PARTIALS, SEARCH_TEMPLATE_PARTIALS ); + +/** + * @type {Indicator[]} + */ +const DATA_INDICATORS = [ { + id: 'mw-indicator-good-star', + class: 'mw-indicator', + html: ` + This is a good article. Follow the link for more information. + ` +}, +{ + id: 'mw-indicator-pp-autoreview', + class: 'mw-indicator', + html: ` + Page protected with pending changes + ` +} ]; + +export const LEGACY_TEMPLATE_DATA = { + 'html-title': 'Vector 2019', + 'html-title-heading': '

    Vector 2019

    ', + 'is-article': true, + 'msg-tagline': 'From Wikipedia, the free encyclopedia', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'msg-vector-jumptonavigation': 'Jump to navigation', + 'msg-vector-jumptosearch': 'Jump to search', + + // site specific + 'data-footer': FOOTER_TEMPLATE_DATA, + 'html-site-notice': placeholder( 'a site notice or central notice banner may go here', 70 ), + + // article dependent + 'html-body-content': `${placeholder( 'Article content goes here' )} + `, + 'html-categories': placeholder( 'Category links component from mediawiki core', 50 ), + + // extension dependent.. + 'html-after-content': placeholder( 'Extensions can add here e.g. Related Articles.', 100 ), + 'array-indicators': DATA_INDICATORS, + 'html-subtitle': placeholder( 'Extensions can configure subtitle', 20 ) +}; + +export const MODERN_TEMPLATE_DATA = { + 'html-title': 'Vector 2020', + 'page-isarticle': true, + 'msg-tagline': 'From Wikipedia, the free encyclopedia', + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'msg-vector-jumptonavigation': 'Jump to navigation', + 'msg-vector-jumptosearch': 'Jump to search', + + // site specific + 'data-footer': FOOTER_TEMPLATE_DATA, + 'html-site-notice': placeholder( 'a site notice or central notice banner may go here', 70 ), + + // article dependent + 'array-indicators': DATA_INDICATORS, + 'html-body-content': `${placeholder( 'Article content goes here' )} + `, + 'html-categories': placeholder( 'Category links component from mediawiki core', 50 ) +}; diff --git a/Vector/stories/skin.stories.js b/Vector/stories/skin.stories.js new file mode 100644 index 0000000..1001f92 --- /dev/null +++ b/Vector/stories/skin.stories.js @@ -0,0 +1,39 @@ +import mustache from 'mustache'; +import '../resources/common/common.less'; +import './skin.less'; +import legacySkinTemplate from '!!raw-loader!../includes/templates/skin-legacy.mustache'; +import { + LEGACY_TEMPLATE_DATA, + NAVIGATION_TEMPLATE_DATA, + TEMPLATE_PARTIALS +} from './skin.stories.data'; + +export default { + title: 'Skin' +}; + +const vectorLegacyLoggedOutBody = () => mustache.render( + legacySkinTemplate, + Object.assign( + {}, + LEGACY_TEMPLATE_DATA, + NAVIGATION_TEMPLATE_DATA.loggedOutWithVariants + ), + TEMPLATE_PARTIALS +); + +const vectorLegacyLoggedInBody = () => mustache.render( + legacySkinTemplate, + Object.assign( + {}, + LEGACY_TEMPLATE_DATA, + NAVIGATION_TEMPLATE_DATA.loggedInWithMoreActions + ), + TEMPLATE_PARTIALS +); + +export const vectorLegacyLoggedOut = () => + `
    ${vectorLegacyLoggedOutBody()}
    `; + +export const vectorLegacyLoggedIn = () => + `
    ${vectorLegacyLoggedInBody()}
    `; diff --git a/Vector/stories/types.js b/Vector/stories/types.js new file mode 100644 index 0000000..12f3b3e --- /dev/null +++ b/Vector/stories/types.js @@ -0,0 +1,86 @@ +/** + * @typedef {Object} Indicator + * @property {string} html of the indicator link. + * @property {string} id of the indicator. + * @property {string} class of the indicator + */ + +/** + * @typedef {Object} LogoOptions + * @property {string} src of logo. Can be relative, absolute or data uri. + * @property {string} [alt] text of logo. + * @property {number} width of asset + * @property {number} height of asset + */ + +/** + * @typedef {Object} ResourceLoaderSkinModuleLogos + * @property {string} [icon] e.g. Wikipedia globe + * @property {LogoOptions} [wordmark] e.g. Legacy Vector logo + * @property {LogoOptions} [tagline] e.g. Legacy Vector logo + */ + +/** + * @typedef {Object} LogoTemplateData + * @property {ResourceLoaderSkinModuleLogos} data-logos as configured, + * the return value of ResourceLoaderSkinModule::getAvailableLogos. + * @property {string} msg-sitetitle alternate text for wordmark + * href the url to navigate to on click. + * @property {string} msg-sitesubtitle alternate text for tagline. + */ + +/** + * @typedef {Object} SidebarData + * @property {MenuDefinition} data-portals-languages + * @property {MenuDefinition} data-portlets-first + * @property {MenuDefinition[]} array-portlets-rest + */ + +/** + * @typedef {Object} SearchData + * @property {string|null} msg-search + * @property {string|null} msg-searchbutton + * @property {string|null} msg-searcharticle + * @property {string} [html-user-language-attributes] + * @property {boolean} is-primary is this the primary method of search? + * @property {string} form-action URL + * @property {string} form-id + * @property {string|null} html-input + * @property {string|null} [class] of the menu + * @property {string|null} page-title the title of the search page + * @property {string} html-input-attributes + * @property {string} html-button-fulltext-attributes + * @property {string} html-button-go-attributes + * @property {string|null} html-button-search-fallback + * @property {string|null} html-button-search + * @property {string} [input-location] An identifier corresponding the position of the search + * widget on the page, e.g. "header-navigation" + * @property {boolean} [is-collapsible] + * @property {string} [href-search] + */ + +/** + * @typedef {Object} MenuDefinition + * @property {string} id + * @property {string} label + * @property {string} html-items + * @property {string} [checkbox-class] + * @property {string} [html-vector-heading-icon] + * @property {string} [heading-class] + * @property {string} [html-tooltip] + * @property {string} [class] of menu + * @property {string} [html-user-language-attributes] + * @property {boolean} [is-dropdown] + * @property {string} [html-before-portal] Additional HTML specific to portal menus. + * @property {string} [html-after-portal] Additional HTML specific to portal menus. + */ + +/** + * @typedef {Object.} MenuDefinitions + */ + +/** + * @typedef {Object} UserLinksDefinition + * @property {MenuDefinition} data-user-menu-overflow + * @property {MenuDefinition} data-user-menu + */ diff --git a/Vector/stories/utils.js b/Vector/stories/utils.js new file mode 100644 index 0000000..9299e35 --- /dev/null +++ b/Vector/stories/utils.js @@ -0,0 +1,77 @@ +/** + * @param {string} name + * @return {string} + */ +function makeIcon( name ) { + return ``; +} + +/** + * @param {string} msg + * @param {number} [height=200] + * @return {string} + */ +const placeholder = ( msg, height ) => { + return `
    ${msg}
    `; +}; + +/** + * @param {string} html + * @return {string} + */ +const portletAfter = ( html ) => { + return `
    ${html}
    `; +}; + +const htmlUserLanguageAttributes = `dir="ltr" lang="en-GB"`; + +/** + * @param {string} [additionalClassString] to add to the menu class + * @return {Object} + */ +function helperClassName( additionalClassString = '' ) { + return { class: additionalClassString }; +} + +/** + * @param {string} name of the menu + * @param {string} htmlItems + * @param {Object} [additionalData] to add to the menu template data + * @param {string} [additionalData.class] + * @return {MenuDefinition} + */ +function helperMakeMenuData( name, htmlItems, additionalData = {} ) { + let label; + switch ( name ) { + case 'personal': + label = 'Personal tools'; + break; + default: + label = 'Menu label'; + break; + } + + // Handle "class" property separately to ensure it is appended to existing classes + const additionalClassString = additionalData.class; + const additionalDataWithoutClass = Object.assign( {}, additionalData ); + delete additionalDataWithoutClass.class; + + return Object.assign( { + id: `p-${name}`, + class: `mw-portlet mw-portlet-${name} ${additionalClassString}`, + label, + 'html-user-language-attributes': htmlUserLanguageAttributes, + 'html-items': htmlItems + }, additionalDataWithoutClass ); +} + +export { + makeIcon, + placeholder, + htmlUserLanguageAttributes, + portletAfter, + helperClassName, + helperMakeMenuData +}; diff --git a/Vector/tests/.eslintrc.json b/Vector/tests/.eslintrc.json new file mode 100644 index 0000000..982337d --- /dev/null +++ b/Vector/tests/.eslintrc.json @@ -0,0 +1,17 @@ +{ + "root": true, + "extends": [ + "../.eslintrc.json" + ], + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + "es/no-object-assign": "off" + }, + "env": { + "es6": true, + "node": true, + "jest": true + } +} diff --git a/Vector/tests/a11y/.eslintrc.json b/Vector/tests/a11y/.eslintrc.json new file mode 100644 index 0000000..a1e7df5 --- /dev/null +++ b/Vector/tests/a11y/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "../../.eslintrcEs6.json" + ], + "parserOptions": { + "ecmaVersion": 2018 + }, + "env": { + "node": true + } +} diff --git a/Vector/tests/a11y/a11y.config.js b/Vector/tests/a11y/a11y.config.js new file mode 100644 index 0000000..b18ae7b --- /dev/null +++ b/Vector/tests/a11y/a11y.config.js @@ -0,0 +1,70 @@ +// @ts-nocheck +const path = require( 'path' ); + +const testData = { + baseUrl: process.env.MW_SERVER, + pageUrl: '/wiki/Polar_bear?useskin=vector-2022&tableofcontents=1', + loginUser: process.env.MEDIAWIKI_USER, + loginPassword: process.env.MEDIAWIKI_PASSWORD +}; + +module.exports = { + // LOG_DIR set in CI, used to make report files available in Jenkins + reportDir: process.env.LOG_DIR || path.join( process.cwd(), 'a11y/' ), + namespace: 'Vector', + defaults: { + viewport: { + width: 1200, + height: 1080 + }, + runners: [ + 'axe', + 'htmlcs' + ], + includeWarnings: true, + includeNotices: true, + ignore: [ + 'color-contrast', + 'WCAG2AA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchID' + ], + hideElements: '#bodyContent, #siteNotice, #mwe-pt-toolbar, #centralnotice, #centralnotice_testbanner', + chromeLaunchConfig: { + headless: false, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox' + ] + } + }, + tests: [ + { + name: 'default', + url: testData.baseUrl + testData.pageUrl, + actions: [] + }, + { + name: 'logged_in', + url: testData.baseUrl + testData.pageUrl, + wait: '500', + actions: [ + 'click #pt-login-2 a', + 'wait for #wpName1 to be visible', + 'set field #wpName1 to ' + testData.loginUser, + 'set field #wpPassword1 to ' + testData.loginPassword, + 'click #wpLoginAttempt', + 'wait for #pt-userpage-2 to be visible' // Confirm login was successful + ] + }, + { + name: 'search', + url: testData.baseUrl + testData.pageUrl, + rootElement: '#p-search', + wait: '500', + actions: [ + 'click #searchInput', + 'wait for .cdx-text-input__input to be added', + 'set field .cdx-text-input__input to Test' + ] + } + ] +}; diff --git a/Vector/tests/jest/AB.test.js b/Vector/tests/jest/AB.test.js new file mode 100644 index 0000000..4572477 --- /dev/null +++ b/Vector/tests/jest/AB.test.js @@ -0,0 +1,229 @@ +const AB = require( '../../resources/skins.vector.es6/AB.js' ); +const NAME_OF_EXPERIMENT = 'name-of-experiment'; +const TOKEN = 'token'; +const MW_EXPERIMENT_PARAM = { + name: NAME_OF_EXPERIMENT, + enabled: true, + buckets: { + unsampled: 0.5, + control: 0.25, + treatment: 0.25 + } +}; + +// eslint-disable-next-line jsdoc/require-returns +/** + * @param {Object} props + */ +function createInstance( props = {} ) { + const mergedProps = /** @type {AB.WebABTestProps} */ ( Object.assign( { + name: NAME_OF_EXPERIMENT, + buckets: { + unsampled: { + samplingRate: 0.5 + }, + control: { + samplingRate: 0.25 + }, + treatment: { + samplingRate: 0.25 + } + }, + token: TOKEN + }, props ) ); + + return AB( mergedProps ); +} + +describe( 'AB.js', () => { + const bucket = 'treatment'; + const getBucketMock = jest.fn().mockReturnValue( bucket ); + mw.experiments.getBucket = getBucketMock; + + afterEach( () => { + document.body.removeAttribute( 'class' ); + } ); + + describe( 'initialization when body tag does not contain bucket', () => { + let /** @type {jest.SpyInstance} */ hookMock; + + beforeEach( () => { + hookMock = jest.spyOn( mw, 'hook' ); + } ); + + it( 'sends data to WikimediaEvents when the bucket is part of sample (e.g. control)', () => { + getBucketMock.mockReturnValueOnce( 'control' ); + createInstance(); + expect( hookMock ).toHaveBeenCalled(); + } ); + it( 'sends data to WikimediaEvents when the bucket is part of sample (e.g. treatment)', () => { + getBucketMock.mockReturnValueOnce( 'treatment' ); + createInstance(); + expect( hookMock ).toHaveBeenCalled(); + } ); + it( 'does not send data to WikimediaEvents when the bucket is unsampled ', () => { + getBucketMock.mockReturnValueOnce( 'unsampled' ); + createInstance(); + expect( hookMock ).not.toHaveBeenCalled(); + } ); + } ); + + describe( 'initialization when body tag contains bucket', () => { + let /** @type {jest.SpyInstance} */ hookMock; + + beforeEach( () => { + hookMock = jest.spyOn( mw, 'hook' ); + } ); + + it( 'sends data to WikimediaEvents when the bucket is part of sample (e.g. control)', () => { + document.body.classList.add( 'name-of-experiment-control' ); + createInstance(); + expect( hookMock ).toHaveBeenCalled(); + } ); + it( 'sends data to WikimediaEvents when the bucket is part of sample (e.g. treatment)', () => { + document.body.classList.add( 'name-of-experiment-treatment' ); + createInstance(); + expect( hookMock ).toHaveBeenCalled(); + } ); + it( 'does not send data to WikimediaEvents when the bucket is unsampled ', () => { + document.body.classList.add( 'name-of-experiment-unsampled' ); + createInstance(); + expect( hookMock ).not.toHaveBeenCalled(); + } ); + } ); + + describe( 'initialization when token is undefined', () => { + it( 'throws an error', () => { + expect( () => { + createInstance( { token: undefined } ); + } ).toThrow( 'Tried to call `getBucket`' ); + } ); + } ); + + describe( 'getBucket when body tag does not contain AB class', () => { + it( 'calls mw.experiments.getBucket with config data', () => { + const experiment = createInstance(); + + expect( getBucketMock ).toBeCalledWith( MW_EXPERIMENT_PARAM, TOKEN ); + expect( experiment.getBucket() ).toBe( bucket ); + } ); + } ); + + describe( 'getBucket when body tag contains AB class that is in the sample', () => { + it( 'returns the bucket on the body tag', () => { + document.body.classList.add( 'name-of-experiment-control' ); + const experiment = createInstance(); + + expect( getBucketMock ).not.toHaveBeenCalled(); + expect( experiment.getBucket() ).toBe( 'control' ); + } ); + } ); + + describe( 'getBucket when body tag contains AB class that is not in the sample', () => { + it( 'returns the bucket on the body tag', () => { + document.body.classList.add( 'name-of-experiment-unsampled' ); + const experiment = createInstance(); + + expect( getBucketMock ).not.toHaveBeenCalled(); + expect( experiment.getBucket() ).toBe( 'unsampled' ); + } ); + } ); + + describe( 'isInBucket', () => { + it( 'compares assigned bucket with passed in bucket', () => { + const experiment = createInstance(); + + expect( experiment.isInBucket( 'treatment' ) ).toBe( true ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to unsampled bucket (from server)', () => { + it( 'returns false', () => { + document.body.classList.add( 'name-of-experiment-unsampled' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( false ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to control bucket (from server)', () => { + it( 'returns false', () => { + document.body.classList.add( 'name-of-experiment-control' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( false ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to treatment bucket (from server)', () => { + it( 'returns true', () => { + document.body.classList.add( 'name-of-experiment-treatment' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( true ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to unsampled bucket (from client)', () => { + it( 'returns false', () => { + getBucketMock.mockReturnValueOnce( 'unsampled' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( false ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to control bucket (from client)', () => { + it( 'returns false', () => { + getBucketMock.mockReturnValueOnce( 'control' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( false ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to treatment bucket (from client)', () => { + it( 'returns true', () => { + getBucketMock.mockReturnValueOnce( 'treatment' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( true ); + } ); + } ); + + describe( 'isInTreatmentBucket when assigned to treatment bucket (is case insensitive)', () => { + it( 'returns true', () => { + getBucketMock.mockReturnValueOnce( 'StickyHeaderVisibleTreatment' ); + const experiment = createInstance(); + + expect( experiment.isInTreatmentBucket() ).toBe( true ); + } ); + } ); + + describe( 'isInSample when in unsampled bucket', () => { + it( 'returns false', () => { + document.body.classList.add( 'name-of-experiment-unsampled' ); + const experiment = createInstance(); + + expect( experiment.isInSample() ).toBe( false ); + } ); + } ); + + describe( 'isInSample when in control bucket', () => { + it( 'returns true', () => { + document.body.classList.add( 'name-of-experiment-control' ); + const experiment = createInstance(); + + expect( experiment.isInSample() ).toBe( true ); + } ); + } ); + + describe( 'isInSample when in treatment bucket', () => { + it( 'returns true', () => { + document.body.classList.add( 'name-of-experiment-treatment' ); + const experiment = createInstance(); + + expect( experiment.isInSample() ).toBe( true ); + } ); + } ); +} ); diff --git a/Vector/tests/jest/App.test.js b/Vector/tests/jest/App.test.js new file mode 100644 index 0000000..2c32204 --- /dev/null +++ b/Vector/tests/jest/App.test.js @@ -0,0 +1,38 @@ +const VueTestUtils = require( '@vue/test-utils' ); +const App = require( '../../resources/skins.vector.search/App.vue' ); + +const defaultProps = { + id: 'searchform', + searchAccessKey: 'f', + searchTitle: 'search', + searchPlaceholder: 'Search MediaWiki', + searchQuery: '' +}; + +const mount = ( /** @type {Object} */ customProps ) => { + // @ts-ignore + return VueTestUtils.shallowMount( App, { + props: Object.assign( {}, defaultProps, customProps ), + global: { + mocks: { + $i18n: ( /** @type {string} */ str ) => ( { + text: () => str + } ) + }, + directives: { + 'i18n-html': ( el, binding ) => { + el.innerHTML = `${binding.arg} (${binding.value})`; + } + } + } + } ); +}; + +describe( 'App', () => { + it( 'renders a typeahead search component', () => { + const wrapper = mount(); + expect( + wrapper.element + ).toMatchSnapshot(); + } ); +} ); diff --git a/Vector/tests/jest/__mocks__/mediawiki.page.ready.js b/Vector/tests/jest/__mocks__/mediawiki.page.ready.js new file mode 100644 index 0000000..765a966 --- /dev/null +++ b/Vector/tests/jest/__mocks__/mediawiki.page.ready.js @@ -0,0 +1,3 @@ +module.exports = { + checkboxHack: () => {} +}; diff --git a/Vector/tests/jest/__mocks__/mediawiki.util.js b/Vector/tests/jest/__mocks__/mediawiki.util.js new file mode 100644 index 0000000..d708b80 --- /dev/null +++ b/Vector/tests/jest/__mocks__/mediawiki.util.js @@ -0,0 +1,3 @@ +module.exports = { + debounce: ( /** @type {Function} */fn ) => fn +}; diff --git a/Vector/tests/jest/__snapshots__/App.test.js.snap b/Vector/tests/jest/__snapshots__/App.test.js.snap new file mode 100644 index 0000000..86b0edc --- /dev/null +++ b/Vector/tests/jest/__snapshots__/App.test.js.snap @@ -0,0 +1,22 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`App renders a typeahead search component 1`] = ` + +`; diff --git a/Vector/tests/jest/__snapshots__/pinnableElement.test.js.snap b/Vector/tests/jest/__snapshots__/pinnableElement.test.js.snap new file mode 100644 index 0000000..32e2a59 --- /dev/null +++ b/Vector/tests/jest/__snapshots__/pinnableElement.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Pinnable header renders 1`] = ` +" +
    + +
    +
    + + +
    +
    +
    +
    simple pinnable element
    + + +
    +
    +
    +
    +
    + " +`; diff --git a/Vector/tests/jest/__snapshots__/stickyHeader.test.js.snap b/Vector/tests/jest/__snapshots__/stickyHeader.test.js.snap new file mode 100644 index 0000000..e9721ce --- /dev/null +++ b/Vector/tests/jest/__snapshots__/stickyHeader.test.js.snap @@ -0,0 +1,68 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Sticky header renders 1`] = ` +"
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +" +`; diff --git a/Vector/tests/jest/__snapshots__/tableOfContents.test.js.snap b/Vector/tests/jest/__snapshots__/tableOfContents.test.js.snap new file mode 100644 index 0000000..5d2a725 --- /dev/null +++ b/Vector/tests/jest/__snapshots__/tableOfContents.test.js.snap @@ -0,0 +1,261 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Table of contents reloadTableOfContents re-renders toc when wikipage.tableOfContents hook is fired with empty sections 1`] = ` +"
    +
    +

    Contents

    + + +
    + +
    +" +`; + +exports[`Table of contents reloadTableOfContents re-renders toc when wikipage.tableOfContents hook is fired with sections 1`] = ` +"
    +
    +

    Contents

    + + +
    + +
    +" +`; + +exports[`Table of contents renders when \`vector-is-collapse-sections-enabled\` is false 1`] = ` +"
    +
    +

    Contents

    + + +
    + +
    +" +`; + +exports[`Table of contents renders when \`vector-is-collapse-sections-enabled\` is true 1`] = ` +"
    +
    +

    Contents

    + + +
    + +
    +" +`; diff --git a/Vector/tests/jest/__snapshots__/userLinks.test.js.snap b/Vector/tests/jest/__snapshots__/userLinks.test.js.snap new file mode 100644 index 0000000..be337ac --- /dev/null +++ b/Vector/tests/jest/__snapshots__/userLinks.test.js.snap @@ -0,0 +1,57 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UserLinks renders 1`] = ` +" +" +`; diff --git a/Vector/tests/jest/deferUntilFrame.test.js b/Vector/tests/jest/deferUntilFrame.test.js new file mode 100644 index 0000000..86f162b --- /dev/null +++ b/Vector/tests/jest/deferUntilFrame.test.js @@ -0,0 +1,33 @@ +const deferUntilFrame = require( '../../resources/skins.vector.es6/deferUntilFrame.js' ); + +describe( 'deferUntilFrame.js', () => { + let /** @type {jest.SpyInstance} */ spy; + + beforeEach( () => { + spy = jest.spyOn( window, 'requestAnimationFrame' ).mockImplementation( ( cb ) => { + setTimeout( () => { + cb( 1 ); + } ); + + return 1; + } ); + } ); + + afterEach( () => { + spy.mockRestore(); + } ); + + it( 'does not fire rAF if `0` is passed', done => { + deferUntilFrame( () => { + expect( spy ).toHaveBeenCalledTimes( 0 ); + done(); + }, 0 ); + } ); + + it( 'fires rAF the specified number of times', done => { + deferUntilFrame( () => { + expect( spy ).toHaveBeenCalledTimes( 3 ); + done(); + }, 3 ); + } ); +} ); diff --git a/Vector/tests/jest/fetch.test.js b/Vector/tests/jest/fetch.test.js new file mode 100644 index 0000000..3e22f6b --- /dev/null +++ b/Vector/tests/jest/fetch.test.js @@ -0,0 +1,99 @@ +/* global fetchMock */ +const fetchJson = require( '../../resources/skins.vector.search/fetch.js' ); +const jestFetchMock = require( 'jest-fetch-mock' ); + +const mockedRequests = !process.env.TEST_LIVE_REQUESTS; +const url = '//en.wikipedia.org/w/rest.php/v1/search/title?q=jfgkdajgioj&limit=10'; + +describe( 'abort() using AbortController', () => { + test( 'Aborting an unfinished request throws an AbortError', async () => { + expect.assertions( 1 ); + + const { abort, fetch } = fetchJson( url ); + + abort(); + + return fetch.catch( ( e ) => { + expect( e.name ).toStrictEqual( 'AbortError' ); + } ); + } ); +} ); + +describe( 'fetch() using window.fetch', () => { + beforeAll( () => { + jestFetchMock.enableFetchMocks(); + } ); + + afterAll( () => { + jestFetchMock.disableFetchMocks(); + } ); + + beforeEach( () => { + fetchMock.resetMocks(); + if ( !mockedRequests ) { + fetchMock.disableMocks(); + } + fetchMock.mockIf( /^\/\/en.wikipedia.org\//, async ( req ) => { + if ( req.url === url ) { + return { + body: JSON.stringify( { pages: [] } ), + headers: { + 'Content-Type': 'application/json' + } + }; + } else { + return { + status: 404, + body: 'Page not found' + }; + } + } ); + } ); + + test( '200 without init param passed', async () => { + const { fetch } = fetchJson( url ); + const json = await fetch; + + // eslint-disable-next-line compat/compat + const controller = new AbortController(); + expect( json ).toStrictEqual( { pages: [] } ); + + if ( mockedRequests ) { + expect( fetchMock ).toHaveBeenCalledTimes( 1 ); + expect( fetchMock ).toHaveBeenCalledWith( url, { signal: controller.signal } ); + } + } ); + + test( '200 with init param passed', async () => { + const { fetch } = fetchJson( url, { mode: 'cors' } ); + const json = await fetch; + + expect( json ).toStrictEqual( { pages: [] } ); + + if ( mockedRequests ) { + expect( fetchMock ).toHaveBeenCalledTimes( 1 ); + expect( fetchMock ).toHaveBeenCalledWith( + url, + expect.objectContaining( { mode: 'cors' } ) + ); + } + } ); + + test( '404 response', async () => { + expect.assertions( 1 ); + const { fetch } = fetchJson( '//en.wikipedia.org/doesNotExist' ); + + await expect( fetch ) + .rejects.toStrictEqual( 'Network request failed with HTTP code 404' ); + + if ( mockedRequests ) { + const controller = new AbortController(); + expect.assertions( 3 ); + expect( fetchMock ).toHaveBeenCalledTimes( 1 ); + expect( fetchMock ).toHaveBeenCalledWith( + '//en.wikipedia.org/doesNotExist', { signal: controller.signal } + ); + } + } ); + +} ); diff --git a/Vector/tests/jest/instrumentation.test.js b/Vector/tests/jest/instrumentation.test.js new file mode 100644 index 0000000..0d4403f --- /dev/null +++ b/Vector/tests/jest/instrumentation.test.js @@ -0,0 +1,82 @@ +const instrumentation = require( '../../resources/skins.vector.search/instrumentation.js' ); + +describe( 'instrumentation', () => { + test.each( [ + [ 0, 'acrw1_0' ], + [ 1, 'acrw1_1' ], + [ -1, 'acrw1_-1' ] + ] )( 'getWprovFromResultIndex( %d ) = %s', ( index, expected ) => { + expect( instrumentation.getWprovFromResultIndex( index ) ) + .toBe( expected ); + } ); + + test( 'addWprovToSearchResultUrls without offset', () => { + const url1 = 'https://host/?title=Special%3ASearch&search=Aa', + url2Base = 'https://host/?title=Special%3ASearch&search=Ab', + url3 = 'https://host/Ac'; + const results = [ + { + title: 'Aa', + url: url1 + }, + { + title: 'Ab', + url: `${url2Base}&wprov=xyz` + }, + { + title: 'Ac', + url: url3 + }, + { + title: 'Ad' + } + ]; + + expect( instrumentation.addWprovToSearchResultUrls( results, 0 ) ) + .toStrictEqual( [ + { + title: 'Aa', + url: `${url1}&wprov=acrw1_0` + }, + { + title: 'Ab', + url: `${url2Base}&wprov=acrw1_1` + }, + { + title: 'Ac', + url: `${url3}?wprov=acrw1_2` + }, + { + title: 'Ad' + } + ] ); + expect( results[ 0 ].url ).toStrictEqual( url1 ); + } ); + + test( 'addWprovToSearchResultUrls with offset', () => { + const url1 = 'https://host/?title=Special%3ASearch&search=Ae', + url2 = 'https://host/?title=Special%3ASearch&search=Af'; + const results = [ + { + title: 'Ae', + url: url1 + }, + { + title: 'Af', + url: url2 + } + ]; + + expect( instrumentation.addWprovToSearchResultUrls( results, 4 ) ) + .toStrictEqual( [ + { + title: 'Ae', + url: `${url1}&wprov=acrw1_4` + }, + { + title: 'Af', + url: `${url2}&wprov=acrw1_5` + } + ] ); + } ); +} ); diff --git a/Vector/tests/jest/pinnableElement.test.js b/Vector/tests/jest/pinnableElement.test.js new file mode 100644 index 0000000..4337098 --- /dev/null +++ b/Vector/tests/jest/pinnableElement.test.js @@ -0,0 +1,170 @@ +jest.mock( '../../resources/skins.vector.es6/features.js' ); + +const features = require( '../../resources/skins.vector.es6/features.js' ); +const mustache = require( 'mustache' ); +const fs = require( 'fs' ); +const pinnableHeaderTemplate = fs.readFileSync( 'includes/templates/PinnableHeader.mustache', 'utf8' ); +const pinnableElement = require( '../../resources/skins.vector.es6/pinnableElement.js' ); + +/** + * Mock for matchMedia, which is not included in JSDOM. + * https://jestjs.io/docs/26.x/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom + */ +Object.defineProperty( window, 'matchMedia', { + writable: true, + value: jest.fn().mockImplementation( query => ( { + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // deprecated + removeListener: jest.fn(), // deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn() + } ) ) +} ); + +// Mock functionality of features.js +let pinnedStatus = false; +features.toggle = jest.fn( () => { + pinnedStatus = !pinnedStatus; +} ); +features.isEnabled = jest.fn( () => { + return pinnedStatus; +} ); + +const simpleData = { + 'is-pinned': false, + 'data-feature-name': 'pinned', + 'data-pinnable-element-id': 'pinnable-element', + label: 'simple pinnable element', + 'label-tag-name': 'div', + 'pin-label': 'pin', + 'unpin-label': 'unpin' +}; + +const movableData = { ...simpleData, ...{ + 'data-pinned-container-id': 'pinned-container', + 'data-unpinned-container-id': 'unpinned-container' +} }; + +// @ts-ignore +const initializeHTML = ( headerData ) => { + pinnedStatus = headerData[ 'is-pinned' ]; + const pinnableHeaderHTML = mustache.render( pinnableHeaderTemplate, headerData ); + const pinnableElementHTML = `
    ${ pinnableHeaderHTML }
    `; + document.body.innerHTML = ` +
    + ${ headerData[ 'is-pinned' ] ? pinnableElementHTML : '' } +
    +
    + + +
    +
    + ${ !headerData[ 'is-pinned' ] ? pinnableElementHTML : '' } +
    +
    +
    + `; +}; + +describe( 'Pinnable header', () => { + test( 'renders', () => { + initializeHTML( simpleData ); + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); + + test( 'updates pinnable header classes when toggle is pressed', () => { + initializeHTML( simpleData ); + pinnableElement.initPinnableElement(); + const pinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-pin-button' ) ); + const unpinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-unpin-button' ) ); + const header = /** @type {HTMLElement} */ ( document.querySelector( `.${simpleData[ 'data-pinnable-element-id' ]}-pinnable-header` ) ); + + expect( header.classList.contains( pinnableElement.PINNED_HEADER_CLASS ) ).toBe( false ); + expect( header.classList.contains( pinnableElement.UNPINNED_HEADER_CLASS ) ).toBe( true ); + pinButton.click(); + expect( header.classList.contains( pinnableElement.PINNED_HEADER_CLASS ) ).toBe( true ); + expect( header.classList.contains( pinnableElement.UNPINNED_HEADER_CLASS ) ).toBe( false ); + unpinButton.click(); + expect( header.classList.contains( pinnableElement.PINNED_HEADER_CLASS ) ).toBe( false ); + expect( header.classList.contains( pinnableElement.UNPINNED_HEADER_CLASS ) ).toBe( true ); + } ); + + test( 'doesnt move pinnable element when data attributes arent defined', () => { + initializeHTML( simpleData ); + pinnableElement.initPinnableElement(); + const pinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-pin-button' ) ); + const unpinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-unpin-button' ) ); + const pinnableElem = /** @type {HTMLElement} */ ( document.getElementById( simpleData[ 'data-pinnable-element-id' ] ) ); + + /* eslint-disable no-restricted-properties */ + expect( pinnableElem.parentElement && pinnableElem.parentElement.id ).toBe( 'unpinned-container' ); + pinButton.click(); + expect( pinnableElem.parentElement && pinnableElem.parentElement.id ).toBe( 'unpinned-container' ); + unpinButton.click(); + expect( pinnableElem.parentElement && pinnableElem.parentElement.id ).toBe( 'unpinned-container' ); + /* eslint-enable no-restricted-properties */ + } ); + + test( 'moves pinnable element when data attributes are defined', () => { + initializeHTML( movableData ); + pinnableElement.initPinnableElement(); + const pinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-pin-button' ) ); + const unpinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-unpin-button' ) ); + const pinnableElem = /** @type {HTMLElement} */ ( document.getElementById( movableData[ 'data-pinnable-element-id' ] ) ); + + /* eslint-disable no-restricted-properties */ + expect( pinnableElem.parentElement && pinnableElem.parentElement.id ).toBe( 'unpinned-container' ); + pinButton.click(); + expect( pinnableElem.parentElement && pinnableElem.parentElement.id ).toBe( 'pinned-container' ); + unpinButton.click(); + expect( pinnableElem.parentElement && pinnableElem.parentElement.id ).toBe( 'unpinned-container' ); + /* eslint-enable no-restricted-properties */ + } ); + + test( 'calls features.toggle() when toggle is pressed', () => { + initializeHTML( simpleData ); + pinnableElement.initPinnableElement(); + const pinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-pin-button' ) ); + const unpinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-unpin-button' ) ); + + pinButton.click(); + expect( features.toggle ).toHaveBeenCalledTimes( 1 ); + expect( features.toggle ).toHaveBeenCalledWith( simpleData[ 'data-feature-name' ] ); + + // @ts-ignore + features.toggle.mockClear(); + unpinButton.click(); + expect( features.toggle ).toHaveBeenCalledTimes( 1 ); + expect( features.toggle ).toHaveBeenCalledWith( simpleData[ 'data-feature-name' ] ); + } ); + + test( 'isPinned() calls features.isEnabled()', () => { + initializeHTML( simpleData ); + pinnableElement.initPinnableElement(); + const header = /** @type {HTMLElement} */ ( document.querySelector( `.${simpleData[ 'data-pinnable-element-id' ]}-pinnable-header` ) ); + + // @ts-ignore + features.isEnabled.mockClear(); + pinnableElement.isPinned( header ); + expect( features.isEnabled ).toHaveBeenCalledTimes( 1 ); + expect( features.isEnabled ).toHaveBeenCalledWith( simpleData[ 'data-feature-name' ] ); + } ); + + test( 'setFocusAfterToggle() sets focus on appropriate element after pinnableElement is toggled', () => { + initializeHTML( movableData ); + pinnableElement.initPinnableElement(); + const dropdownCheckbox = /** @type {HTMLElement} */ ( document.getElementById( 'checkbox' ) ); + const pinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-pin-button' ) ); + const unpinButton = /** @type {HTMLElement} */ ( document.querySelector( '.vector-pinnable-header-unpin-button' ) ); + + pinButton.click(); + expect( document.activeElement ).toBe( unpinButton ); + unpinButton.click(); + expect( document.activeElement ).toBe( dropdownCheckbox ); + } ); +} ); diff --git a/Vector/tests/jest/restSearchClient.test.js b/Vector/tests/jest/restSearchClient.test.js new file mode 100644 index 0000000..816e88e --- /dev/null +++ b/Vector/tests/jest/restSearchClient.test.js @@ -0,0 +1,130 @@ +/* global fetchMock */ +const restSearchClient = require( '../../resources/skins.vector.search/restSearchClient.js' ); +const jestFetchMock = require( 'jest-fetch-mock' ); + +const mockedRequests = !process.env.TEST_LIVE_REQUESTS; +const configMock = { + get: jest.fn().mockImplementation( ( key, fallback = null ) => { + if ( key === 'wgScriptPath' ) { + return '/w'; + } + if ( key === 'wgScript' ) { + return '/w/index.php'; + } + if ( key === 'wgVectorSearchApiUrl' ) { + return 'https://en.wikipedia.org/w/rest.php'; + } + return fallback; + } ), + set: jest.fn() +}; + +describe( 'restApiSearchClient', () => { + beforeAll( () => { + jestFetchMock.enableFetchMocks(); + } ); + + afterAll( () => { + jestFetchMock.disableFetchMocks(); + } ); + + beforeEach( () => { + fetchMock.resetMocks(); + if ( !mockedRequests ) { + fetchMock.disableMocks(); + } + } ); + + test( '2 results', async () => { + const thumbUrl = '//upload.wikimedia.org/wikipedia/commons/0/01/MediaWiki-smaller-logo.png'; + const restResponse = { + pages: [ + { + id: 37298, + key: 'Media', + label: 'Media', + title: 'Media', + description: 'Wikimedia disambiguation page', + thumbnail: null, + url: '/w/index.php?title=Special%3ASearch&search=Media', + value: 37298 + }, + { + id: 323710, + key: 'MediaWiki', + label: 'MediaWiki', + title: 'MediaWiki', + description: 'wiki software', + thumbnail: { + width: 200, + height: 189, + url: thumbUrl + }, + url: '/w/index.php?title=Special%3ASearch&search=MediaWiki', + value: 323710 + } + ] + }; + fetchMock.mockOnce( JSON.stringify( restResponse ) ); + + const searchResult = await restSearchClient( configMock ).fetchByTitle( + 'media', + 2 + ).fetch; + + /* eslint-disable-next-line compat/compat */ + const controller = new AbortController(); + + expect( searchResult.query ).toStrictEqual( 'media' ); + expect( searchResult.results ).toBeTruthy(); + expect( searchResult.results.length ).toBe( 2 ); + + expect( searchResult.results[ 0 ] ).toStrictEqual( + Object.assign( {}, restResponse.pages[ 0 ], { + // thumbnail: null -> thumbnail: undefined + thumbnail: undefined + } ) ); + expect( searchResult.results[ 1 ] ).toStrictEqual( restResponse.pages[ 1 ] ); + + if ( mockedRequests ) { + expect( fetchMock ).toHaveBeenCalledTimes( 1 ); + expect( fetchMock ).toHaveBeenCalledWith( + 'https://en.wikipedia.org/w/rest.php/v1/search/title?q=media&limit=2', + { headers: { accept: 'application/json' }, signal: controller.signal } + ); + } + } ); + + test( '0 results', async () => { + const restResponse = { pages: [] }; + fetchMock.mockOnce( JSON.stringify( restResponse ) ); + + const searchResult = await restSearchClient( configMock ).fetchByTitle( + 'thereIsNothingLikeThis' + ).fetch; + + /* eslint-disable-next-line compat/compat */ + const controller = new AbortController(); + expect( searchResult.query ).toStrictEqual( 'thereIsNothingLikeThis' ); + expect( searchResult.results ).toBeTruthy(); + expect( searchResult.results.length ).toBe( 0 ); + + if ( mockedRequests ) { + expect( fetchMock ).toHaveBeenCalledTimes( 1 ); + expect( fetchMock ).toHaveBeenCalledWith( + 'https://en.wikipedia.org/w/rest.php/v1/search/title?q=thereIsNothingLikeThis&limit=10', + { headers: { accept: 'application/json' }, signal: controller.signal } + ); + } + } ); + + if ( mockedRequests ) { + test( 'network error', async () => { + fetchMock.mockRejectOnce( new Error( 'failed' ) ); + + await expect( restSearchClient( configMock ).fetchByTitle( + 'anything' + ).fetch ).rejects.toThrow( 'failed' ); + } ); + } +} ); diff --git a/Vector/tests/jest/skins.vector.es6/features.test.js b/Vector/tests/jest/skins.vector.es6/features.test.js new file mode 100644 index 0000000..22a9dcf --- /dev/null +++ b/Vector/tests/jest/skins.vector.es6/features.test.js @@ -0,0 +1,34 @@ +const features = require( '../../../resources/skins.vector.es6/features.js' ); + +describe( 'features', () => { + beforeEach( () => { + document.documentElement.setAttribute( 'class', 'vector-feature-foo-disabled vector-feature-bar-enabled hello' ); + } ); + + test( 'toggle', () => { + features.toggle( 'foo' ); + features.toggle( 'bar' ); + + expect( + document.documentElement.classList.contains( 'vector-feature-foo-enabled' ) + ).toBe( true ); + expect( + document.documentElement.classList.contains( 'vector-feature-foo-disabled' ) + ).toBe( false ); + expect( + document.documentElement.classList.contains( 'vector-feature-bar-disabled' ) + ).toBe( true ); + expect( + document.documentElement.classList.contains( 'vector-feature-bar-enabled' ) + ).toBe( false ); + expect( + document.documentElement.classList.contains( 'hello' ) + ).toBe( true ); + } ); + + test( 'toggle unknown feature', () => { + expect( () => { + features.toggle( 'unknown' ); + } ).toThrow(); + } ); +} ); diff --git a/Vector/tests/jest/skins.vector.es6/main.test.js b/Vector/tests/jest/skins.vector.es6/main.test.js new file mode 100644 index 0000000..678625a --- /dev/null +++ b/Vector/tests/jest/skins.vector.es6/main.test.js @@ -0,0 +1,230 @@ +// @ts-ignore +window.matchMedia = window.matchMedia || function () { + return { + matches: false, + onchange: () => {} + }; +}; + +const { test } = require( '../../../resources/skins.vector.es6/main.js' ); +const { + STICKY_HEADER_EXPERIMENT_NAME, + STICKY_HEADER_EDIT_EXPERIMENT_NAME +} = require( '../../../resources/skins.vector.es6/stickyHeader.js' ); +describe( 'main.js', () => { + it( 'getHeadingIntersectionHandler', () => { + const section = document.createElement( 'div' ); + section.setAttribute( 'class', 'mw-body-content' ); + section.setAttribute( 'id', 'mw-content-text' ); + const heading = document.createElement( 'h2' ); + const headline = document.createElement( 'span' ); + headline.classList.add( 'mw-headline' ); + headline.setAttribute( 'id', 'headline' ); + heading.appendChild( headline ); + section.appendChild( + heading + ); + + [ + [ section, 'toc-mw-content-text' ], + [ heading, 'toc-headline' ] + ].forEach( ( testCase ) => { + const node = /** @type {HTMLElement} */ ( testCase[ 0 ] ); + const fn = jest.fn(); + const handler = test.getHeadingIntersectionHandler( fn ); + handler( node ); + expect( fn ).toHaveBeenCalledWith( testCase[ 1 ] ); + } ); + } ); + + it( 'initStickyHeaderABTests', () => { + const STICKY_HEADER_AB = { + name: STICKY_HEADER_EXPERIMENT_NAME, + enabled: true + }; + const STICKY_HEADER_AB_EDIT = { + name: STICKY_HEADER_EDIT_EXPERIMENT_NAME, + enabled: true + }; + const DISABLED_STICKY_HEADER_AB_EDIT = { + name: STICKY_HEADER_EDIT_EXPERIMENT_NAME, + enabled: false + }; + [ + { + abConfig: STICKY_HEADER_AB_EDIT, + isEnabled: false, + isUserInTreatmentBucket: false, + expectedResult: { + showStickyHeader: false, + disableEditIcons: true + } + }, + { + abConfig: STICKY_HEADER_AB_EDIT, + isEnabled: true, + isUserInTreatmentBucket: false, + expectedResult: { + showStickyHeader: false, + disableEditIcons: true + } + }, + { + abConfig: STICKY_HEADER_AB_EDIT, + isEnabled: true, + isUserInTreatmentBucket: true, + expectedResult: { + showStickyHeader: true, + disableEditIcons: false + } + }, + { + abConfig: STICKY_HEADER_AB, + isEnabled: false, // sticky header unavailable + isUserInTreatmentBucket: false, // not in treatment bucket + expectedResult: { + showStickyHeader: false, + disableEditIcons: true + } + }, + { + abConfig: STICKY_HEADER_AB, + isEnabled: true, // sticky header available + isUserInTreatmentBucket: false, // not in treatment bucket + expectedResult: { + showStickyHeader: false, + disableEditIcons: true + } + }, + { + abConfig: STICKY_HEADER_AB, + isEnabled: false, // sticky header is not available + isUserInTreatmentBucket: true, // but the user is in the treatment bucket + expectedResult: { + showStickyHeader: false, + disableEditIcons: true + } + }, + { + abConfig: STICKY_HEADER_AB, + isEnabled: true, + isUserInTreatmentBucket: true, + expectedResult: { + showStickyHeader: true, + disableEditIcons: true + } + }, + { + abConfig: DISABLED_STICKY_HEADER_AB_EDIT, + isEnabled: true, + isUserInTreatmentBucket: false, + expectedResult: { + showStickyHeader: true, + disableEditIcons: false + } + } + ].forEach( + ( { + abConfig, + isEnabled, + isUserInTreatmentBucket, + expectedResult + } ) => { + document.documentElement.classList.add( 'vector-sticky-header-enabled' ); + const result = test.initStickyHeaderABTests( + abConfig, + // isStickyHeaderFeatureAllowed + isEnabled, + ( experiment ) => ( { + name: experiment.name, + isInBucket: () => true, + isInSample: () => true, + getBucket: () => 'bucket', + isInTreatmentBucket: () => { + return isUserInTreatmentBucket; + } + } ) + ); + expect( result ).toMatchObject( expectedResult ); + // Check that there are no side effects + expect( + document.documentElement.classList.contains( 'vector-sticky-header-enabled' ) + ).toBe( true ); + } ); + } ); +} ); + +const sectionObserverFn = () => ( { + pause: () => {}, + resume: () => {}, + mount: () => {}, + unmount: () => {}, + setElements: () => {}, + calcIntersection: () => {} +} ); + +describe( 'Table of contents re-rendering', () => { + const mockMwHook = () => { + /** @type {Object.} */ + let callback = {}; + // @ts-ignore + jest.spyOn( mw, 'hook' ).mockImplementation( ( name ) => { + + return { + add: function ( fn ) { + callback[ name ] = fn; + + return this; + }, + fire: ( data ) => { + if ( callback[ name ] ) { + callback[ name ]( data ); + } + } + }; + } ); + }; + + afterEach( () => { + jest.restoreAllMocks(); + } ); + + it( 'listens to wikipage.tableOfContents hook when mounted', () => { + mockMwHook(); + const spy = jest.spyOn( mw, 'hook' ); + const tocElement = document.createElement( 'div' ); + const bodyContent = document.createElement( 'article' ); + const toc = test.setupTableOfContents( tocElement, bodyContent, sectionObserverFn ); + expect( toc ).not.toBe( null ); + expect( spy ).toHaveBeenCalledWith( 'wikipage.tableOfContents' ); + expect( spy ).not.toHaveBeenCalledWith( 'wikipage.tableOfContents.vector' ); + } ); + + it( 'Firing wikipage.tableOfContents triggers reloadTableOfContents', async () => { + mockMwHook(); + const tocElement = document.createElement( 'div' ); + const bodyContent = document.createElement( 'article' ); + const toc = test.setupTableOfContents( tocElement, bodyContent, sectionObserverFn ); + if ( !toc ) { + // something went wrong + expect( true ).toBe( false ); + return; + } + const spy = jest.spyOn( toc, 'reloadTableOfContents' ).mockImplementation( () => Promise.resolve() ); + + mw.hook( 'wikipage.tableOfContents' ).fire( [ + // Add new section to see how the re-render performs. + { + toclevel: 1, + number: '4', + line: 'bat', + anchor: 'bat', + 'is-top-level-section': true, + 'is-parent-section': false, + 'array-sections': null + } + ] ); + + expect( spy ).toHaveBeenCalled(); + } ); +} ); diff --git a/Vector/tests/jest/skins.vector.js/__snapshots__/dropdownMenus.test.js.snap b/Vector/tests/jest/skins.vector.js/__snapshots__/dropdownMenus.test.js.snap new file mode 100644 index 0000000..5382597 --- /dev/null +++ b/Vector/tests/jest/skins.vector.js/__snapshots__/dropdownMenus.test.js.snap @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`addPortletLinkHandler Adds a span with icon class to dropdown menus 1`] = ` +" + " +`; + +exports[`addPortletLinkHandler Does not add an icon when noicon class is present 1`] = ` +" + " +`; diff --git a/Vector/tests/jest/skins.vector.js/__snapshots__/menuTabs.test.js.snap b/Vector/tests/jest/skins.vector.js/__snapshots__/menuTabs.test.js.snap new file mode 100644 index 0000000..a109eeb --- /dev/null +++ b/Vector/tests/jest/skins.vector.js/__snapshots__/menuTabs.test.js.snap @@ -0,0 +1,37 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`menuTabs adds vector-tab-noicon class to li element when part of tabs 1`] = ` +" + + " +`; + +exports[`menuTabs does not add vector-tab-noicon class to li element when not part of tabs 1`] = ` +" + + " +`; diff --git a/Vector/tests/jest/skins.vector.js/dropdownMenus.test.js b/Vector/tests/jest/skins.vector.js/dropdownMenus.test.js new file mode 100644 index 0000000..72fe135 --- /dev/null +++ b/Vector/tests/jest/skins.vector.js/dropdownMenus.test.js @@ -0,0 +1,203 @@ +// @ts-nocheck + +const { addPortletLinkHandler } = require( '../../../resources/skins.vector.js/dropdownMenus.js' ); + +describe( 'addPortletLinkHandler', () => { + beforeEach( () => { + document.body.innerHTML = ` +
    +
    + +
    +
    + +
    +
    + +
    +
    `; + } ); + + afterEach( () => { + jest.restoreAllMocks(); + } ); + + test( 'Adds a span with icon class to dropdown menus', () => { + + //
  • element is the assumed HTML output of mw.util.addPortlet + document.body.innerHTML = ` + `; + + const mockPortletItem = document.getElementById( 'test-id' ); + addPortletLinkHandler( mockPortletItem, { id: 'test-id' } ); + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); + + test( 'Does not add an icon when noicon class is present', () => { + + //
  • element is the assumed HTML output of mw.util.addPortlet + document.body.innerHTML = ` + `; + + const mockPortletItem = document.getElementById( 'test-id' ); + addPortletLinkHandler( mockPortletItem, { id: 'test-id' } ); + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); + + test( 'JS portlet should be moved to more menu (#p-cactions) at narrow widths', () => { + + //
  • element is the assumed HTML output of mw.util.addPortlet + document.body.innerHTML = ` +
    + +
    + +
    + + +
    `; + + const mockPortletItem = document.getElementById( 'test-id' ); + addPortletLinkHandler( mockPortletItem, { id: 'test-id' } ); + + expect( mockPortletItem.closest( '#p-cactions' ) ).toBeTruthy(); + } ); + + test( 'addPortletLinkHandler only adds icon class to p-personal menu', () => { + + // Assumed output of mw.util.addPortletLink from core. + const portletLinkItem = new DOMParser().parseFromString( ` +
  • + + foo + +
  • `, 'text/html' ).body.firstElementChild; + + // simulating addPortletLink appending to DOM from core. + document + .querySelector( '#p-personal .vector-menu-content-list' ) + .appendChild( portletLinkItem ); + + // Running addPortletLink handler. + addPortletLinkHandler( portletLinkItem, { id: 'foo-id' } ); + + // Asserting that the icon classes were added. + expect( portletLinkItem.querySelectorAll( 'span.mw-ui-icon.mw-ui-icon-vector-gadget-foo-id' ) ).toHaveLength( 1 ); + } ); + + test( 'addPortletLinkHandler does not add icons to p-views menu', () => { + + // Assumed output of mw.util.addPortletLink from core. + const portletLinkItem = new DOMParser().parseFromString( ` +
  • + + foo + +
  • `, 'text/html' ).body.firstElementChild; + + // simulating addPortletLink appending to DOM from core. + document + .querySelector( '#p-views .vector-menu-content-list' ) + .appendChild( portletLinkItem ); + + // Running addPortletLink handler. + addPortletLinkHandler( portletLinkItem, { id: 'foo-id' } ); + + // Asserting that the icon classes were added. + expect( portletLinkItem.querySelectorAll( 'span.mw-ui-icon.mw-ui-icon-vector-gadget-foo-id' ) ).toHaveLength( 0 ); + } ); + + test( 'addPortletLinkHandler only adds one icon when an ID is specified - T327369', () => { + + // Assumed output of mw.util.addPortletLink from core. + const portletLinkItem1 = new DOMParser().parseFromString( ` +
  • + + foo + +
  • `, 'text/html' ).body.firstElementChild; + + const portletLinkItem2 = new DOMParser().parseFromString( ` +
  • + + bar + +
  • `, 'text/html' ).body.firstElementChild; + + const portletLinkItem3 = new DOMParser().parseFromString( ` +
  • + + baz + +
  • `, 'text/html' ).body.firstElementChild; + + // simulating addPortletLink appending to DOM from core. + const contentList = document.querySelector( '#p-personal .vector-menu-content-list' ); + + contentList.appendChild( portletLinkItem1 ); + contentList.appendChild( portletLinkItem2 ); + contentList.appendChild( portletLinkItem3 ); + + // Running addPortletLink handler. + addPortletLinkHandler( portletLinkItem1, { id: null } ); + addPortletLinkHandler( portletLinkItem2, { id: 'bar' } ); + addPortletLinkHandler( portletLinkItem3, { id: 'baz' } ); + // running portletLinkHandler on an item twice. Should be no-op. + addPortletLinkHandler( portletLinkItem3, { id: 'baz' } ); + + // Asserting that the icon classes were added where necessary + // and that only one icon class was added per item. + expect( portletLinkItem1.querySelectorAll( 'span.mw-ui-icon.mw-ui-icon-vector-gadget-foo' ) ).toHaveLength( 0 ); + expect( portletLinkItem2.querySelectorAll( 'span.mw-ui-icon.mw-ui-icon-vector-gadget-bar' ) ).toHaveLength( 1 ); + expect( portletLinkItem3.querySelectorAll( 'span.mw-ui-icon.mw-ui-icon-vector-gadget-baz' ) ).toHaveLength( 1 ); + } ); +} ); diff --git a/Vector/tests/jest/skins.vector.js/menuTabs.test.js b/Vector/tests/jest/skins.vector.js/menuTabs.test.js new file mode 100644 index 0000000..d5689a8 --- /dev/null +++ b/Vector/tests/jest/skins.vector.js/menuTabs.test.js @@ -0,0 +1,76 @@ +const menuTabs = require( '../../../resources/skins.vector.js/menuTabs.js' ); + +describe( 'menuTabs', () => { + beforeEach( () => { + /** @type {Function} */ + let callback; + // @ts-ignore + jest.spyOn( mw, 'hook' ).mockImplementation( () => { + return { + add: function ( fn ) { + callback = fn; + + return this; + }, + fire: ( data ) => { + if ( callback ) { + callback( data ); + } + } + }; + } ); + + } ); + + afterEach( () => { + jest.restoreAllMocks(); + } ); + + test( 'adds vector-tab-noicon class to li element when part of tabs', () => { + document.body.innerHTML = ` + + `; + const menuItem = document.getElementById( 'test-id' ); + menuTabs(); + // @ts-ignore + mw.hook( 'util' ).fire( menuItem, { id: 'test-id' } ); + + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); + + test( 'does not add vector-tab-noicon class to li element when not part of tabs', () => { + document.body.innerHTML = ` + + `; + const menuItem = document.getElementById( 'test-id' ); + menuTabs(); + // @ts-ignore + mw.hook( 'util' ).fire( menuItem, { id: 'test-id' } ); + + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); +} ); diff --git a/Vector/tests/jest/stickyHeader.test.js b/Vector/tests/jest/stickyHeader.test.js new file mode 100644 index 0000000..7a58df3 --- /dev/null +++ b/Vector/tests/jest/stickyHeader.test.js @@ -0,0 +1,119 @@ +const mustache = require( 'mustache' ); +const fs = require( 'fs' ); +const stickyHeaderTemplate = fs.readFileSync( 'includes/templates/StickyHeader.mustache', 'utf8' ); +const buttonTemplate = fs.readFileSync( 'includes/templates/Button.mustache', 'utf8' ); +const sticky = require( '../../resources/skins.vector.es6/stickyHeader.js' ); +const { userLinksHTML, dropdownPartials } = require( './userLinksData.js' ); + +const defaultButtonsTemplateData = [ { + href: '#', + id: 'ca-talk-sticky-header', + event: 'talk-sticky-header', + icon: 'wikimedia-speechBubbles', + 'is-quiet': true, + 'tab-index': '-1', + class: 'sticky-header-icon' +}, { + href: '#', + id: 'ca-history-sticky-header', + event: 'history-sticky-header', + icon: 'wikimedia-history', + 'is-quiet': true, + 'tab-index': '-1', + class: 'sticky-header-icon' +}, { + href: '#', + id: 'ca-watchstar-sticky-header', + event: 'watch-sticky-header', + icon: 'wikimedia-star', + 'is-quiet': true, + 'tab-index': '-1', + class: 'sticky-header-icon mw-watchlink' +} ]; + +const editButtonsTemplateData = [ { + href: '#', + id: 'ca-ve-edit-sticky-header', + event: 've-edit-sticky-header', + icon: 'wikimedia-edit', + 'is-quiet': true, + 'tab-index': '-1', + class: 'sticky-header-icon' +}, { + href: '#', + id: 'ca-edit-sticky-header', + event: 'wikitext-edit-sticky-header', + icon: 'wikimedia-wikiText', + 'is-quiet': true, + 'tab-index': '-1', + class: 'sticky-header-icon' +}, { + href: '#', + id: 'ca-viewsource-sticky-header', + event: 'wikimedia-editLock', + icon: 'wikimedia-star', + 'is-quiet': true, + 'tab-index': '-1', + class: 'sticky-header-icon' +} ]; + +const templateData = { + 'data-toc': { + 'array-sections': [] + }, + 'data-sticky-header-toc-dropdown': { + id: 'vector-sticky-header-toc', + class: 'mw-portlet mw-portlet-sticky-header-toc vector-sticky-header-toc', + 'html-items': '', + 'html-vector-menu-checkbox-attributes': 'tabindex="-1"', + 'html-vector-menu-heading-attributes': 'tabindex="-1"', + 'heading-class': 'mw-ui-button mw-ui-quiet mw-ui-icon mw-ui-icon-element mw-ui-icon-wikimedia-listBullet' + }, + 'data-buttons': [ { + id: 'p-lang-btn-sticky-header', + class: 'mw-interlanguage-selector', + 'is-quiet': true, + tabindex: '-1', + label: '0 languages', + 'html-vector-button-icon': '', + event: 'ui.dropdown-p-lang-btn-sticky-header' + } ], + 'data-button-start': { + label: 'search', + icon: 'wikimedia-search', + 'is-quiet': true, + tabindex: '-1', + class: 'vector-sticky-header-search-toggle', + event: 'ui.vector-sticky-search-form.icon' + }, + 'data-search': {}, + 'data-icons': defaultButtonsTemplateData.concat( editButtonsTemplateData ) +}; + +const renderedHTML = mustache.render( + stickyHeaderTemplate, templateData, Object.assign( {}, dropdownPartials, { + Button: buttonTemplate, + SearchBox: '
    ' // ignore SearchBox for this test + } ) ); + +beforeEach( () => { + document.body.innerHTML = renderedHTML; +} ); + +test( 'Sticky header renders', () => { + expect( document.body.innerHTML ).toMatchSnapshot(); +} ); + +describe( 'sticky header', () => { + test( 'prepareUserLinksDropdown removes gadgets from dropdown', async () => { + const menu = document.createElement( 'div' ); + menu.innerHTML = userLinksHTML; + const userLinksDropdown = /** @type {Element} */ ( menu.querySelector( '#' + sticky.USER_LINKS_DROPDOWN_ID ) ); + const newMenu = sticky.prepareUserLinksDropdown( userLinksDropdown ); + // check classes have been updated and removed. + expect( userLinksDropdown.querySelectorAll( '.user-links-collapsible-item' ).length > 0 ).toBeTruthy(); + expect( userLinksDropdown.querySelectorAll( '.mw-list-item-js' ).length > 0 ).toBeTruthy(); + expect( newMenu.querySelectorAll( '.user-links-collapsible-item' ).length ).toBe( 0 ); + expect( newMenu.querySelectorAll( '.mw-list-item-js' ).length ).toBe( 0 ); + } ); +} ); diff --git a/Vector/tests/jest/tableOfContents.test.js b/Vector/tests/jest/tableOfContents.test.js new file mode 100644 index 0000000..21805ad --- /dev/null +++ b/Vector/tests/jest/tableOfContents.test.js @@ -0,0 +1,400 @@ +const mustache = require( 'mustache' ); +const fs = require( 'fs' ); +const tableOfContentsTemplate = fs.readFileSync( 'includes/templates/TableOfContents.mustache', 'utf8' ); +const tableOfContentsContentsTemplate = fs.readFileSync( 'includes/templates/TableOfContents__list.mustache', 'utf8' ); +const tableOfContentsLineTemplate = fs.readFileSync( 'includes/templates/TableOfContents__line.mustache', 'utf8' ); +const pinnableElementOpenTemplate = fs.readFileSync( 'includes/templates/PinnableElement/Open.mustache', 'utf8' ); +const pinnableElementCloseTemplate = fs.readFileSync( 'includes/templates/PinnableElement/Close.mustache', 'utf8' ); +const pinnableHeaderTemplate = fs.readFileSync( 'includes/templates/PinnableHeader.mustache', 'utf8' ); +const initTableOfContents = require( '../../resources/skins.vector.es6/tableOfContents.js' ); + +let /** @type {HTMLElement} */ container, + /** @type {HTMLElement} */ fooSection, + /** @type {HTMLElement} */ barSection, + /** @type {HTMLElement} */ bazSection, + /** @type {HTMLElement} */ quxSection, + /** @type {HTMLElement} */ quuxSection; +const onHeadingClick = jest.fn(); +const onHashChange = jest.fn(); +const onToggleClick = jest.fn(); +const onTogglePinned = jest.fn(); + +const SECTIONS = [ + { + toclevel: 1, + number: '1', + line: 'foo', + anchor: 'foo', + 'is-top-level-section': true, + 'is-parent-section': false, + 'array-sections': null + }, { + toclevel: 1, + number: '2', + line: 'bar', + anchor: 'bar', + 'is-top-level-section': true, + 'is-parent-section': true, + 'vector-button-label': 'Toggle bar subsection', + 'array-sections': [ { + toclevel: 2, + number: '2.1', + line: 'baz', + anchor: 'baz', + 'is-top-level-section': false, + 'is-parent-section': true, + 'array-sections': [ { + toclevel: 3, + number: '2.1.1', + line: 'qux', + anchor: 'qux', + 'is-top-level-section': false, + 'is-parent-section': false, + 'array-sections': null + } ] + } ] + }, { + toclevel: 1, + number: '3', + line: 'quux', + anchor: 'quux', + 'is-top-level-section': true, + 'is-parent-section': false, + 'array-sections': null + } +]; + +/** + * @param {Object} templateProps + * @return {string} + */ +function render( templateProps = {} ) { + const templateData = Object.assign( { + 'is-vector-toc-beginning-enabled': true, + 'msg-vector-toc-beginning': 'Beginning', + 'vector-is-collapse-sections-enabled': false, + 'array-sections': SECTIONS, + id: 'vector-toc', + 'data-pinnable-header': { + 'is-pinned': true, + 'data-feature-name': 'pinned', + 'data-pinnable-element-id': 'vector-toc', + label: 'Contents', + 'label-tag-name': 'h2', + 'pin-label': 'move to sidebar', + 'unpin-label': 'hide' + } + }, templateProps ); + + return mustache.render( tableOfContentsTemplate, templateData, { + 'PinnableElement/Open': pinnableElementOpenTemplate, + 'PinnableElement/Close': pinnableElementCloseTemplate, + PinnableHeader: pinnableHeaderTemplate, + TableOfContents__list: tableOfContentsContentsTemplate, // eslint-disable-line camelcase + TableOfContents__line: tableOfContentsLineTemplate // eslint-disable-line camelcase + } ); +} + +/** + * @param {Object} templateProps + * @return {module:TableOfContents~TableOfContents} + */ +function mount( templateProps = {} ) { + document.body.innerHTML = render( templateProps ); + + container = /** @type {HTMLElement} */ ( document.getElementById( 'vector-toc' ) ); + fooSection = /** @type {HTMLElement} */ ( document.getElementById( 'toc-foo' ) ); + barSection = /** @type {HTMLElement} */ ( document.getElementById( 'toc-bar' ) ); + bazSection = /** @type {HTMLElement} */ ( document.getElementById( 'toc-baz' ) ); + quxSection = /** @type {HTMLElement} */ ( document.getElementById( 'toc-qux' ) ); + quuxSection = /** @type {HTMLElement} */ ( document.getElementById( 'toc-quux' ) ); + + return initTableOfContents( { + container, + onHeadingClick, + onHashChange, + onToggleClick, + onTogglePinned + } ); +} + +describe( 'Table of contents', () => { + /** + * @type {module:TableOfContents~TableOfContents} + */ + let toc; + + beforeEach( () => { + // @ts-ignore + global.window.matchMedia = jest.fn( () => ( {} ) ); + } ); + + afterEach( () => { + if ( toc ) { + toc.unmount(); + toc = undefined; + } + + // @ts-ignore + mw.util.getTargetFromFragment = undefined; + } ); + + describe( 'renders', () => { + test( 'when `vector-is-collapse-sections-enabled` is false', () => { + toc = mount(); + expect( document.body.innerHTML ).toMatchSnapshot(); + expect( barSection.classList.contains( toc.EXPANDED_SECTION_CLASS ) ).toEqual( true ); + } ); + test( 'when `vector-is-collapse-sections-enabled` is true', () => { + toc = mount( { 'vector-is-collapse-sections-enabled': true } ); + expect( document.body.innerHTML ).toMatchSnapshot(); + expect( barSection.classList.contains( toc.EXPANDED_SECTION_CLASS ) ).toEqual( false ); + } ); + test( 'toggles for top level parent sections', () => { + toc = mount(); + expect( fooSection.getElementsByClassName( toc.TOGGLE_CLASS ).length ).toEqual( 0 ); + expect( barSection.getElementsByClassName( toc.TOGGLE_CLASS ).length ).toEqual( 1 ); + expect( bazSection.getElementsByClassName( toc.TOGGLE_CLASS ).length ).toEqual( 0 ); + expect( quxSection.getElementsByClassName( toc.TOGGLE_CLASS ).length ).toEqual( 0 ); + expect( quuxSection.getElementsByClassName( toc.TOGGLE_CLASS ).length ).toEqual( 0 ); + } ); + } ); + + describe( 'binds event listeners', () => { + test( 'for onHeadingClick', () => { + toc = mount(); + const heading = /** @type {HTMLElement} */ ( document.querySelector( `#toc-foo .${toc.LINK_CLASS}` ) ); + heading.click(); + + expect( onToggleClick ).not.toBeCalled(); + expect( onHashChange ).not.toBeCalled(); + expect( onHeadingClick ).toBeCalled(); + } ); + test( 'for onToggleClick', () => { + toc = mount(); + const toggle = /** @type {HTMLElement} */ ( document.querySelector( `#toc-bar .${toc.TOGGLE_CLASS}` ) ); + toggle.click(); + + expect( onHeadingClick ).not.toBeCalled(); + expect( onHashChange ).not.toBeCalled(); + expect( onToggleClick ).toBeCalled(); + } ); + test( 'for onHashChange', () => { + // @ts-ignore + mw.util.getTargetFromFragment = jest.fn().mockImplementation( ( hash ) => { + return hash === 'toc-foo' ? fooSection : null; + } ); + mount(); + + // Jest doesn't trigger a hashchange event when setting a hash location. + location.hash = 'foo'; + window.dispatchEvent( new HashChangeEvent( 'hashchange', { + oldURL: 'http://example.com', + newURL: 'http://example.com#foo' + } ) ); + + expect( onHeadingClick ).not.toBeCalled(); + expect( onToggleClick ).not.toBeCalled(); + expect( onHashChange ).toBeCalled(); + } ); + } ); + + describe( 'applies correct classes', () => { + test( 'when changing active sections', () => { + toc = mount( { 'vector-is-collapse-sections-enabled': true } ); + let activeSections; + let activeTopSections; + + /** + * @param {string} id + * @param {HTMLElement} activeSection + * @param {HTMLElement} activeTopSection + */ + function testActiveClasses( id, activeSection, activeTopSection ) { + toc.changeActiveSection( id ); + activeSections = container.querySelectorAll( `.${toc.ACTIVE_SECTION_CLASS}` ); + activeTopSections = container.querySelectorAll( `.${toc.ACTIVE_TOP_SECTION_CLASS}` ); + expect( activeSections.length ).toEqual( 1 ); + expect( activeTopSections.length ).toEqual( 1 ); + expect( activeSections[ 0 ] ).toEqual( activeSection ); + expect( activeTopSections[ 0 ] ).toEqual( activeTopSection ); + } + + testActiveClasses( 'toc-foo', fooSection, fooSection ); + testActiveClasses( 'toc-bar', barSection, barSection ); + testActiveClasses( 'toc-baz', bazSection, barSection ); + testActiveClasses( 'toc-qux', quxSection, barSection ); + testActiveClasses( 'toc-quux', quuxSection, quuxSection ); + } ); + + test( 'when expanding sections', () => { + toc = mount(); + toc.expandSection( 'toc-bar' ); + expect( barSection.classList.contains( toc.EXPANDED_SECTION_CLASS ) ).toEqual( true ); + } ); + + test( 'when toggling sections', () => { + toc = mount(); + toc.toggleExpandSection( 'toc-bar' ); + expect( barSection.classList.contains( toc.EXPANDED_SECTION_CLASS ) ).toEqual( false ); + toc.toggleExpandSection( 'toc-bar' ); + expect( barSection.classList.contains( toc.EXPANDED_SECTION_CLASS ) ).toEqual( true ); + } ); + } ); + + describe( 'applies the correct aria attributes', () => { + test( 'when initialized', () => { + toc = mount(); + const toggleButton = /** @type {HTMLElement} */ ( barSection.querySelector( `.${toc.TOGGLE_CLASS}` ) ); + + expect( toggleButton.getAttribute( 'aria-expanded' ) ).toEqual( 'true' ); + } ); + + test( 'when expanding sections', () => { + toc = mount(); + const toggleButton = /** @type {HTMLElement} */ ( barSection.querySelector( `.${toc.TOGGLE_CLASS}` ) ); + + toc.expandSection( 'toc-bar' ); + expect( toggleButton.getAttribute( 'aria-expanded' ) ).toEqual( 'true' ); + } ); + + test( 'when toggling sections', () => { + toc = mount(); + const toggleButton = /** @type {HTMLElement} */ ( barSection.querySelector( `.${toc.TOGGLE_CLASS}` ) ); + + toc.toggleExpandSection( 'toc-bar' ); + expect( toggleButton.getAttribute( 'aria-expanded' ) ).toEqual( 'false' ); + + toc.toggleExpandSection( 'toc-bar' ); + expect( toggleButton.getAttribute( 'aria-expanded' ) ).toEqual( 'true' ); + } ); + } ); + + describe( 'when the hash fragment changes', () => { + test( 'expands and activates corresponding section', () => { + // @ts-ignore + mw.util.getTargetFromFragment = jest.fn().mockImplementation( ( hash ) => { + return hash === 'toc-qux' ? quxSection : null; + } ); + toc = mount( { 'vector-is-collapse-sections-enabled': true } ); + expect( + quxSection.classList.contains( toc.ACTIVE_SECTION_CLASS ) + ).toEqual( false ); + + // Jest doesn't trigger a hashchange event when setting a hash location. + location.hash = 'qux'; + window.dispatchEvent( new HashChangeEvent( 'hashchange', { + oldURL: 'http://example.com', + newURL: 'http://example.com#qux' + } ) ); + + const activeSections = container.querySelectorAll( `.${toc.ACTIVE_SECTION_CLASS}` ); + const activeTopSections = container.querySelectorAll( `.${toc.ACTIVE_TOP_SECTION_CLASS}` ); + expect( activeSections.length ).toEqual( 1 ); + expect( activeTopSections.length ).toEqual( 1 ); + expect( + barSection.classList.contains( toc.ACTIVE_TOP_SECTION_CLASS ) + ).toEqual( true ); + expect( + barSection.classList.contains( toc.EXPANDED_SECTION_CLASS ) + ).toEqual( true ); + expect( + quxSection.classList.contains( toc.ACTIVE_SECTION_CLASS ) + ).toEqual( true ); + } ); + } ); + + describe( 'reloadTableOfContents', () => { + test( 're-renders toc when wikipage.tableOfContents hook is fired with empty sections', async () => { + toc = mount(); + await toc.reloadTableOfContents( [] ); + + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); + + test( 're-renders toc when wikipage.tableOfContents hook is fired with sections', async () => { + // @ts-ignore + // eslint-disable-next-line compat/compat + jest.spyOn( mw.loader, 'using' ).mockImplementation( () => Promise.resolve() ); + // @ts-ignore + mw.template.getCompiler = () => {}; + jest.spyOn( mw, 'message' ).mockImplementation( ( msg ) => { + const msgFactory = ( /** @type {string} */ text ) => { + return { + parse: () => '', + plain: () => '', + escaped: () => '', + exists: () => true, + text: () => text + }; + }; + switch ( msg ) { + case 'vector-toc-beginning': + return msgFactory( 'Beginning' ); + default: + return msgFactory( '' ); + } + + } ); + // @ts-ignore + jest.spyOn( mw.template, 'getCompiler' ).mockImplementation( () => { + return { + compile: () => { + return { + render: ( /** @type {Object} */ data ) => { + return { + html: () => { + return render( data ); + } + }; + } + }; + } + }; + } ); + + toc = mount(); + + const toggleButton = /** @type {HTMLElement} */ ( barSection.querySelector( `.${toc.TOGGLE_CLASS}` ) ); + // Collapse section. + toc.toggleExpandSection( 'toc-bar' ); + expect( toggleButton.getAttribute( 'aria-expanded' ) ).toEqual( 'false' ); + + // wikipage.tableOfContents includes the nested sections in the top level + // of the array. + + await toc.reloadTableOfContents( [ + // foo + SECTIONS[ 0 ], + // bar + SECTIONS[ 1 ], + // baz + // @ts-ignore + SECTIONS[ 1 ][ 'array-sections' ][ 0 ], + // qux + // @ts-ignore + SECTIONS[ 1 ][ 'array-sections' ][ 0 ][ 'array-sections' ][ 0 ], + // quux + SECTIONS[ 2 ], + // Add new section to see how the re-render performs. + { + toclevel: 1, + number: '4', + line: 'bat', + anchor: 'bat', + 'is-top-level-section': true, + 'is-parent-section': false, + 'array-sections': null + } + ] ); + + const newToggleButton = /** @type {HTMLElement} */ ( document.querySelector( `#toc-bar .${toc.TOGGLE_CLASS}` ) ); + expect( newToggleButton ).not.toBeNull(); + // Check that the sections render in their expanded form. + expect( newToggleButton.getAttribute( 'aria-expanded' ) ).toEqual( 'true' ); + + // Verify newly rendered TOC html matches the expected html. + expect( document.body.innerHTML ).toMatchSnapshot(); + } ); + } ); +} ); diff --git a/Vector/tests/jest/urlGenerator.test.js b/Vector/tests/jest/urlGenerator.test.js new file mode 100644 index 0000000..013969a --- /dev/null +++ b/Vector/tests/jest/urlGenerator.test.js @@ -0,0 +1,53 @@ +const urlGenerator = require( '../../resources/skins.vector.search/urlGenerator.js' ); + +describe( 'urlGenerator', () => { + describe( 'default', () => { + test.each( [ + [ 'string', 'title', '&fulltext=1' ], + [ 'object', { title: 'title', id: 0, key: '' } ] + ] )( 'suggestion as %s', ( _name, suggestion, extraParams = '' ) => { + const config = { + get: jest.fn().mockImplementation( ( key, fallback ) => { + if ( key === 'wgScript' ) { + return '/w/index.php'; + } + return fallback; + } ), + set: jest.fn() + }; + + expect( urlGenerator( config ).generateUrl( suggestion ) ) + .toBe( `/w/index.php?title=Special%3ASearch${extraParams}&search=title` ); + } ); + + test( 'custom params, articlePath', () => { + const config = { + get: jest.fn().mockImplementation( ( _key, fallback ) => { + return fallback; + } ), + set: jest.fn() + }; + + expect( urlGenerator( config ).generateUrl( + { title: 'title', id: 0, key: '' }, + { TITLE: 'SPECIAL:SEARCH' }, + '/W/INDEX.PHP' + ) ).toBe( '/W/INDEX.PHP?TITLE=SPECIAL%3ASEARCH&search=title' ); + } ); + } ); + + test( 'custom', () => { + const customGenerator = {}; + const config = { + get: jest.fn().mockImplementation( ( key, fallback ) => { + if ( key === 'wgVectorSearchUrlGenerator' ) { + return customGenerator; + } + return fallback; + } ), + set: jest.fn() + }; + + expect( urlGenerator( config ) ).toBe( customGenerator ); + } ); +} ); diff --git a/Vector/tests/jest/userLinks.test.js b/Vector/tests/jest/userLinks.test.js new file mode 100644 index 0000000..dca77ea --- /dev/null +++ b/Vector/tests/jest/userLinks.test.js @@ -0,0 +1,9 @@ +const { userLinksHTML } = require( './userLinksData.js' ); + +beforeEach( () => { + document.body.innerHTML = userLinksHTML; +} ); + +test( 'UserLinks renders', () => { + expect( document.body.innerHTML ).toMatchSnapshot(); +} ); diff --git a/Vector/tests/jest/userLinksData.js b/Vector/tests/jest/userLinksData.js new file mode 100644 index 0000000..fa38bab --- /dev/null +++ b/Vector/tests/jest/userLinksData.js @@ -0,0 +1,79 @@ +const mustache = require( 'mustache' ); +const fs = require( 'fs' ); +const menuContents = fs.readFileSync( 'includes/templates/MenuContents.mustache', 'utf8' ); +const userLinksTemplate = fs.readFileSync( 'includes/templates/UserLinks.mustache', 'utf8' ); +const userLinksDropdownTemplate = fs.readFileSync( 'includes/templates/UserLinksDropdown.mustache', 'utf8' ); +const dropdownOpenTemplate = fs.readFileSync( 'includes/templates/Dropdown/Open.mustache', 'utf8' ); +const dropdownCloseTemplate = fs.readFileSync( 'includes/templates/Dropdown/Close.mustache', 'utf8' ); +const pinnedContainerOpenTemplate = fs.readFileSync( 'includes/templates/PinnableContainer/Pinned/Open.mustache', 'utf8' ); +const pinnedContainerCloseTemplate = fs.readFileSync( 'includes/templates/PinnableContainer/Close.mustache', 'utf8' ); +const unpinnedContainerOpenTemplate = fs.readFileSync( 'includes/templates/PinnableContainer/Unpinned/Open.mustache', 'utf8' ); +const pinnableElementOpenTemplate = fs.readFileSync( 'includes/templates/PinnableElement/Open.mustache', 'utf8' ); +const pinnableElementCloseTemplate = fs.readFileSync( 'includes/templates/PinnableElement/Close.mustache', 'utf8' ); +const pinnableHeaderTemplate = fs.readFileSync( 'includes/templates/PinnableHeader.mustache', 'utf8' ); +const menuTemplate = fs.readFileSync( 'includes/templates/Menu.mustache', 'utf8' ); +const linkTemplate = fs.readFileSync( 'includes/templates/Link.mustache', 'utf8' ); + +const templateData = { + 'is-wide': false, + 'data-user-links-overflow-menu': { + id: 'p-personal-more', + class: 'mw-portlet mw-portlet-vector-user-menu-overflow vector-user-menu-overflow', + label: 'Toggle sidebar', + 'html-items': ` + + +
  • Alerts (0)
  • +
  • Notices (0)
  • + + ` + }, + 'data-user-links-dropdown': { + id: 'vector-user-links-dropdown', + class: 'vector-user-menu vector-user-menu-logged-in vector-menu-dropdown', + label: 'Personal tools' + }, + 'data-user-links-dropdown-menus': [ { + class: 'mw-portlet mw-portlet-personal', + id: 'p-personal', + 'html-items': ` + +
  • Talk
  • +
  • Sandbox
  • +
  • Preferences
  • +
  • Beta
  • + +
  • Uploads
  • +
  • Contributions
  • +
  • Gadget added item
  • + ` + }, { + id: 'p-user-menu-logout', + class: 'mw-portlet mw-portlet-user-menu-logout', + 'html-items': ` +
  • Log out
  • + ` + } ] +}; + +const dropdownPartials = { + UserLinksDropdown: userLinksDropdownTemplate, + 'Dropdown/Open': dropdownOpenTemplate, + 'Dropdown/Close': dropdownCloseTemplate, + 'PinnableContainer/Pinned/Open': pinnedContainerOpenTemplate, + 'PinnableContainer/Close': pinnedContainerCloseTemplate, + 'PinnableContainer/Unpinned/Open': unpinnedContainerOpenTemplate, + 'PinnableElement/Open': pinnableElementOpenTemplate, + 'PinnableElement/Close': pinnableElementCloseTemplate, + PinnableHeader: pinnableHeaderTemplate, + Menu: menuTemplate, + MenuContents: menuContents, + Link: linkTemplate +}; + +const renderedHTML = mustache.render( userLinksTemplate, templateData, dropdownPartials ); + +module.exports = { + dropdownPartials, + userLinksHTML: renderedHTML +}; diff --git a/Vector/tests/phpunit/integration/ServiceWiringTest.php b/Vector/tests/phpunit/integration/ServiceWiringTest.php new file mode 100644 index 0000000..9e13c3f --- /dev/null +++ b/Vector/tests/phpunit/integration/ServiceWiringTest.php @@ -0,0 +1,35 @@ +get( $name ); + $this->addToAssertionCount( 1 ); + } + + public function provideService() { + $wiring = require __DIR__ . '/../../../includes/ServiceWiring.php'; + foreach ( $wiring as $name => $_ ) { + yield $name => [ $name ]; + } + } +} diff --git a/Vector/tests/phpunit/integration/SkinVectorTest.php b/Vector/tests/phpunit/integration/SkinVectorTest.php new file mode 100644 index 0000000..67c8b11 --- /dev/null +++ b/Vector/tests/phpunit/integration/SkinVectorTest.php @@ -0,0 +1,319 @@ +getSkinFactory(); + $template = $skinFactory->makeSkin( 'vector' ); + return $template; + } + + /** + * @param string $nodeString an HTML of the node we want to verify + * @param string $tag Tag of the element we want to check + * @param string $attribute Attribute of the element we want to check + * @param string $search Value of the attribute we want to verify + * @return bool + */ + private function expectNodeAttribute( $nodeString, $tag, $attribute, $search ) { + $node = new \DOMDocument(); + $node->loadHTML( $nodeString ); + $element = $node->getElementsByTagName( $tag )->item( 0 ); + if ( !$element ) { + return false; + } + + $values = explode( ' ', $element->getAttribute( $attribute ) ); + return in_array( $search, $values ); + } + + /** + * @covers \MediaWiki\Skins\Vector\SkinVectorLegacy::getTemplateData + */ + public function testGetTemplateData() { + $title = Title::newFromText( 'SkinVector' ); + $context = RequestContext::newExtraneousContext( $title ); + $context->setLanguage( 'fr' ); + $vectorTemplate = $this->provideVectorTemplateObject(); + $vectorTemplate->setContext( $context ); + $this->setTemporaryHook( 'SkinTemplateNavigation::Universal', [ + static function ( &$skinTemplate, &$content_navigation ) { + $content_navigation['actions'] = [ + 'action-1' => [] + ]; + $content_navigation['namespaces'] = [ + 'ns-1' => [] + ]; + $content_navigation['variants'] = [ + [ + 'class' => 'selected', + 'text' => 'Language variant', + 'href' => '/url/to/variant', + 'lang' => 'zh-hant', + 'hreflang' => 'zh-hant', + ] + ]; + $content_navigation['views'] = []; + $content_navigation['user-menu'] = [ + 'pt-1' => [ 'text' => 'pt1' ], + ]; + } + ] ); + $openVectorTemplate = TestingAccessWrapper::newFromObject( $vectorTemplate ); + + $props = $openVectorTemplate->getTemplateData()['data-portlets']; + $views = $props['data-views']; + $namespaces = $props['data-namespaces']; + + // The mediawiki core specification might change at any time + // so let's limit the values we test to those we are aware of. + $keysToTest = [ + 'id', 'class', 'html-tooltip', 'html-items', + 'html-after-portal', 'html-before-portal', + 'label', 'heading-class', 'is-dropdown' + ]; + foreach ( $views as $key => $value ) { + if ( !in_array( $key, $keysToTest ) ) { + unset( $views[ $key] ); + } + } + $this->assertSame( + [ + // Provided by core + 'id' => 'p-views', + 'class' => 'mw-portlet mw-portlet-views emptyPortlet ' . + 'vector-menu-tabs vector-menu-tabs-legacy', + 'html-tooltip' => '', + 'html-items' => '', + 'html-after-portal' => '', + 'html-before-portal' => '', + 'label' => $context->msg( 'views' )->text(), + 'heading-class' => '', + 'is-dropdown' => false, + ], + $views + ); + + $variants = $props['data-variants']; + $actions = $props['data-actions']; + $this->assertSame( + 'mw-portlet mw-portlet-namespaces vector-menu-tabs vector-menu-tabs-legacy', + $namespaces['class'] + ); + $this->assertSame( + 'mw-portlet mw-portlet-variants vector-menu-dropdown', + $variants['class'] + ); + $this->assertSame( + 'mw-portlet mw-portlet-cactions vector-menu-dropdown', + $actions['class'] + ); + $this->assertSame( + 'mw-portlet mw-portlet-personal vector-user-menu-legacy', + $props['data-personal']['class'] + ); + } + + /** + * Standard config for Language Alert in Sidebar + * @return array + */ + private function enableLanguageAlertFeatureConfig(): array { + return [ + 'VectorLanguageInHeader' => [ + 'logged_in' => true, + 'logged_out' => true + ], + 'VectorLanguageInMainPageHeader' => [ + 'logged_in' => false, + 'logged_out' => false + ], + 'VectorLanguageAlertInSidebar' => [ + 'logged_in' => true, + 'logged_out' => true + ], + ]; + } + + public function providerLanguageAlertRequirements() { + $testTitle = Title::makeTitle( NS_MAIN, 'Test' ); + $testTitleMainPage = Title::makeTitle( NS_MAIN, 'MAIN_PAGE' ); + return [ + 'When none of the requirements are present, do not show alert' => [ + // Configuration requirements for language in header and alert in sidebar + [], + // Title instance + $testTitle, + // Cached languages + [], + // Is the language selector at the top of the content? + false, + // Should the language button be hidden? + false, + // Expected + false + ], + 'When the feature is enabled and languages should be hidden, do not show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitle, + [], true, true, false + ], + 'When the language alert feature is disabled, do not show alert' => [ + [ + 'VectorLanguageInHeader' => [ + 'logged_in' => true, + 'logged_out' => true + ], + 'VectorLanguageAlertInSidebar' => [ + 'logged_in' => false, + 'logged_out' => false + ] + ], + $testTitle, + [ 'fr', 'en', 'ko' ], true, false, false + ], + 'When the language in header feature is disabled, do not show alert' => [ + [ + 'VectorLanguageInHeader' => [ + 'logged_in' => false, + 'logged_out' => false + ], + 'VectorLanguageAlertInSidebar' => [ + 'logged_in' => true, + 'logged_out' => true + ] + ], + $testTitle, + [ 'fr', 'en', 'ko' ], true, false, false + ], + 'When it is a main page, feature is enabled, and there are no languages, do not show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitleMainPage, + [], true, true, false + ], + 'When it is a non-main page, feature is enabled, and there are no languages, do not show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitle, + [], true, true, false + ], + 'When it is a main page, header feature is disabled, and there are languages, do not show alert' => [ + [ + 'VectorLanguageInHeader' => [ + 'logged_in' => false, + 'logged_out' => false + ], + 'VectorLanguageAlertInSidebar' => [ + 'logged_in' => true, + 'logged_out' => true + ] + ], + $testTitleMainPage, + [ 'fr', 'en', 'ko' ], true, true, false + ], + 'When it is a non-main page, alert feature is disabled, there are languages, do not show alert' => [ + [ + 'VectorLanguageInHeader' => [ + 'logged_in' => true, + 'logged_out' => true + ], + 'VectorLanguageAlertInSidebar' => [ + 'logged_in' => false, + 'logged_out' => false + ] + ], + $testTitle, + [ 'fr', 'en', 'ko' ], true, true, false + ], + 'When most requirements are present but languages are not at the top, do not show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitle, + [ 'fr', 'en', 'ko' ], false, false, false + ], + 'When most requirements are present but languages should be hidden, do not show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitle, + [ 'fr', 'en', 'ko' ], true, true, false + ], + 'When it is a main page, features are enabled, and there are languages, show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitleMainPage, + [ 'fr', 'en', 'ko' ], true, false, true + ], + 'When all the requirements are present on a non-main page, show alert' => [ + $this->enableLanguageAlertFeatureConfig(), + $testTitle, + [ 'fr', 'en', 'ko' ], true, false, true + ], + ]; + } + + /** + * @dataProvider providerLanguageAlertRequirements + * @covers \MediaWiki\Skins\Vector\SkinVector22::shouldLanguageAlertBeInSidebar + * @param array $requirements + * @param Title $title + * @param array $getLanguagesCached + * @param bool $isLanguagesInContentAt + * @param bool $shouldHideLanguages + * @param bool $expected + * @throws Exception + */ + public function testShouldLanguageAlertBeInSidebar( + array $requirements, + Title $title, + array $getLanguagesCached, + bool $isLanguagesInContentAt, + bool $shouldHideLanguages, + bool $expected + ) { + $this->overrideConfigValues( array_merge( $requirements, [ + 'DefaultSkin' => 'vector-2022', + 'VectorDefaultSkinVersion' => '2', + 'VectorSkinMigrationMode' => true, + ] ) ); + + $mockSkinVector = $this->getMockBuilder( SkinVector22::class ) + ->disableOriginalConstructor() + ->onlyMethods( [ 'getTitle', 'getLanguagesCached','isLanguagesInContentAt', 'shouldHideLanguages' ] ) + ->getMock(); + $mockSkinVector->method( 'getTitle' ) + ->willReturn( $title ); + $mockSkinVector->method( 'getLanguagesCached' ) + ->willReturn( $getLanguagesCached ); + $mockSkinVector->method( 'isLanguagesInContentAt' )->with( 'top' ) + ->willReturn( $isLanguagesInContentAt ); + $mockSkinVector->method( 'shouldHideLanguages' ) + ->willReturn( $shouldHideLanguages ); + + $shouldLanguageAlertBeInSidebarMethod = new ReflectionMethod( + SkinVector22::class, + 'shouldLanguageAlertBeInSidebar' + ); + $shouldLanguageAlertBeInSidebarMethod->setAccessible( true ); + + $this->assertSame( + $expected, + $shouldLanguageAlertBeInSidebarMethod->invoke( $mockSkinVector ) + ); + } +} diff --git a/Vector/tests/phpunit/integration/VectorHooksTest.php b/Vector/tests/phpunit/integration/VectorHooksTest.php new file mode 100644 index 0000000..2469a78 --- /dev/null +++ b/Vector/tests/phpunit/integration/VectorHooksTest.php @@ -0,0 +1,772 @@ + [ + 'mainpage' => $excludeMainPage, + 'namespaces' => $excludeNamespaces, + 'querystring' => $querystring, + ], + 'include' => $include + ]; + } + + public function provideGetVectorResourceLoaderConfig() { + return [ + [ + [ + 'VectorWebABTestEnrollment' => [], + 'VectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php' + ], + [ + 'wgVectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php', + 'wgVectorWebABTestEnrollment' => [], + ] + ], + [ + [ + 'VectorWebABTestEnrollment' => [ + 'name' => 'vector.sticky_header', + 'enabled' => true, + 'buckets' => [ + 'unsampled' => [ + 'samplingRate' => 1, + ], + 'control' => [ + 'samplingRate' => 0 + ], + 'stickyHeaderEnabled' => [ + 'samplingRate' => 0 + ], + 'stickyHeaderDisabled' => [ + 'samplingRate' => 0 + ], + ], + ], + 'VectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php' + ], + [ + 'wgVectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php', + 'wgVectorWebABTestEnrollment' => [ + 'name' => 'vector.sticky_header', + 'enabled' => true, + 'buckets' => [ + 'unsampled' => [ + 'samplingRate' => 1, + ], + 'control' => [ + 'samplingRate' => 0 + ], + 'stickyHeaderEnabled' => [ + 'samplingRate' => 0 + ], + 'stickyHeaderDisabled' => [ + 'samplingRate' => 0 + ], + ], + ], + ] + ], + ]; + } + + public function provideGetVectorResourceLoaderConfigWithExceptions() { + return [ + # Bad experiment (no buckets) + [ + [ + 'VectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php', + 'VectorWebABTestEnrollment' => [ + 'name' => 'vector.sticky_header', + 'enabled' => true, + ], + ] + ], + # Bad experiment (no unsampled bucket) + [ + [ + 'VectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php', + 'VectorWebABTestEnrollment' => [ + 'name' => 'vector.sticky_header', + 'enabled' => true, + 'buckets' => [ + 'a' => [ + 'samplingRate' => 0 + ], + ] + ], + ] + ], + # Bad experiment (wrong format) + [ + [ + 'VectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php', + 'VectorWebABTestEnrollment' => [ + 'name' => 'vector.sticky_header', + 'enabled' => true, + 'buckets' => [ + 'unsampled' => 1, + ] + ], + ] + ], + # Bad experiment (samplingRate defined as string) + [ + [ + 'VectorSearchApiUrl' => 'https://en.wikipedia.org/w/rest.php', + 'VectorWebABTestEnrollment' => [ + 'name' => 'vector.sticky_header', + 'enabled' => true, + 'buckets' => [ + 'unsampled' => [ + 'samplingRate' => '1' + ], + ] + ], + ] + ], + ]; + } + + /** + * @covers ::shouldDisableMaxWidth + */ + public function providerShouldDisableMaxWidth() { + $excludeTalkFooConfig = self::makeMaxWidthConfig( + false, + [ NS_TALK ], + [ 'Talk:Foo' ], + [] + ); + + return [ + [ + 'No options, nothing disables max width', + [], + Title::makeTitle( NS_MAIN, 'Foo' ), + [], + false + ], + [ + 'Main page disables max width if exclude.mainpage set', + self::makeMaxWidthConfig( true ), + Title::newMainPage(), + [], + true + ], + [ + 'Namespaces can be excluded', + self::makeMaxWidthConfig( false, [ NS_CATEGORY ] ), + Title::makeTitle( NS_CATEGORY, 'Category' ), + [], + true + ], + [ + 'Namespaces are included if not excluded', + self::makeMaxWidthConfig( false, [ NS_CATEGORY ] ), + Title::makeTitle( NS_SPECIAL, 'SpecialPages' ), + [], + false + ], + [ + 'More than one namespace can be included', + self::makeMaxWidthConfig( false, [ NS_CATEGORY, NS_SPECIAL ] ), + Title::makeTitle( NS_SPECIAL, 'Specialpages' ), + [], + true + ], + [ + 'Can be disabled on history page', + self::makeMaxWidthConfig( + false, + [ + /* no namespaces excluded */ + ], + [ + /* no includes */ + ], + [ 'action' => 'history' ] + ), + Title::makeTitle( NS_MAIN, 'History page' ), + [ 'action' => 'history' ], + true + ], + [ + 'Can be disabled with a regex match.', + self::makeMaxWidthConfig( + false, + [ + /* no namespaces excluded */ + ], + [ + /* no includes */ + ], + [ 'foo' => '[0-9]+' ] + ), + Title::makeTitle( NS_MAIN, 'Test' ), + [ 'foo' => '1234' ], + true + ], + [ + 'Can be disabled with a regex match, also for falsy 0.', + self::makeMaxWidthConfig( + false, + [ + /* no namespaces excluded */ + ], + [ + /* no includes */ + ], + [ 'foo' => '[0-9]+' ] + ), + Title::makeTitle( NS_MAIN, 'Test' ), + [ 'foo' => '0' ], + true + ], + [ + 'Can be disabled with a non-regex wildcard (for backwards compatibility).', + self::makeMaxWidthConfig( + false, + [ + /* no namespaces excluded */ + ], + [ + /* no includes */ + ], + [ 'foo' => '*' ] + ), + Title::makeTitle( NS_MAIN, 'Test' ), + [ 'foo' => 'bar' ], + true + ], + [ + 'Include can override exclusions', + self::makeMaxWidthConfig( + false, + [ NS_CATEGORY, NS_SPECIAL ], + [ 'Special:Specialpages' ], + [ 'action' => 'history' ] + ), + Title::makeTitle( NS_SPECIAL, 'Specialpages' ), + [ 'action' => 'history' ], + false + ], + [ + 'Max width can be disabled on talk pages', + $excludeTalkFooConfig, + Title::makeTitle( NS_TALK, 'A talk page' ), + [], + true + ], + [ + 'includes can be used to override any page in a disabled namespace', + $excludeTalkFooConfig, + Title::makeTitle( NS_TALK, 'Foo' ), + [], + false + ], + [ + 'Excludes/includes are based on root title so should apply to subpages', + $excludeTalkFooConfig, + Title::makeTitle( NS_TALK, 'Foo/subpage' ), + [], + false + ] + ]; + } + + /** + * @todo move into MediaWiki\Skins\Vector\FeatureManagement\Requirements\LimitedWidthContentRequirement + * test in future. + * @covers MediaWiki\Skins\Vector\FeatureManagement\Requirements\LimitedWidthContentRequirement::isMet + * @dataProvider providerShouldDisableMaxWidth + */ + public function testShouldDisableMaxWidth( + $msg, + $options, + $title, + $requestValues, + $shouldDisableMaxWidth + ) { + $requirement = new LimitedWidthContentRequirement( + new HashConfig( [ 'VectorMaxWidthOptions' => $options ] ), + new FauxRequest( $requestValues ), + $title + ); + $this->assertSame( + !$shouldDisableMaxWidth, + $requirement->isMet(), + $msg + ); + } + + /** + * @covers ::getVectorResourceLoaderConfig + * @dataProvider provideGetVectorResourceLoaderConfig + */ + public function testGetVectorResourceLoaderConfig( $configData, $expected ) { + $config = new HashConfig( $configData ); + $vectorConfig = Hooks::getVectorResourceLoaderConfig( + $this->createMock( ResourceLoaderContext::class ), + $config + ); + + $this->assertSame( + $expected, + $vectorConfig + ); + } + + /** + * @covers ::getVectorResourceLoaderConfig + * @dataProvider provideGetVectorResourceLoaderConfigWithExceptions + */ + public function testGetVectorResourceLoaderConfigWithExceptions( $configData ) { + $config = new HashConfig( $configData ); + $this->expectException( RuntimeException::class ); + Hooks::getVectorResourceLoaderConfig( + $this->createMock( ResourceLoaderContext::class ), + $config + ); + } + + /** + * @covers ::onLocalUserCreated + */ + public function testOnLocalUserCreatedLegacy() { + $this->setMwGlobals( [ + 'wgVectorDefaultSkinVersionForNewAccounts' => Constants::SKIN_VERSION_LEGACY, + ] ); + + $user = $this->createMock( User::class ); + $userOptionsManager = $this->createMock( UserOptionsManager::class ); + $userOptionsManager->expects( $this->once() ) + ->method( 'setOption' ) + ->with( $user, 'skin', Constants::SKIN_NAME_LEGACY ); + $this->setService( 'UserOptionsManager', $userOptionsManager ); + + // NOTE: Using $this->getServiceContainer()->getHookContainer()->run( ... ) + // will instead call Echo's legacy hook as that is already registered which + // will break this test. Use Vector's hook handler instead. + ( new Hooks() )->onLocalUserCreated( $user, false ); + } + + /** + * @covers ::onLocalUserCreated + */ + public function testOnLocalUserCreatedLatest() { + $this->setMwGlobals( [ + 'wgVectorDefaultSkinVersionForNewAccounts' => Constants::SKIN_VERSION_LATEST, + ] ); + + $user = $this->createMock( User::class ); + $userOptionsManager = $this->createMock( UserOptionsManager::class ); + $userOptionsManager->expects( $this->once() ) + ->method( 'setOption' ) + ->with( $user, 'skin', Constants::SKIN_NAME_MODERN ); + $this->setService( 'UserOptionsManager', $userOptionsManager ); + + // NOTE: Using $this->getServiceContainer()->getHookContainer()->run( ... ) + // will instead call Echo's legacy hook as that is already registered which + // will break this test. Use Vector's hook handler instead. + ( new Hooks() )->onLocalUserCreated( $user, false ); + } + + /** + * @covers ::onSkinTemplateNavigation + */ + public function testOnSkinTemplateNavigation() { + $this->setMwGlobals( [ + 'wgVectorUseIconWatch' => true, + ] ); + $skin = new SkinVector22( [ 'name' => 'vector' ] ); + $skin->getContext()->setTitle( Title::newFromText( 'Foo' ) ); + $contentNavWatch = [ + 'associated-pages' => [], + 'views' => [], + 'actions' => [ + 'watch' => [ 'class' => [ 'watch' ], 'icon' => 'star' ], + ] + ]; + $contentNavUnWatch = [ + 'associated-pages' => [], + 'views' => [], + 'actions' => [ + 'move' => [ 'class' => [ 'move' ] ], + 'unwatch' => [ 'icon' => 'unStar' ], + ], + ]; + + Hooks::onSkinTemplateNavigation( $skin, $contentNavUnWatch ); + Hooks::onSkinTemplateNavigation( $skin, $contentNavWatch ); + + $this->assertContains( + 'icon', $contentNavWatch['views']['watch']['class'], + 'Watch list items require an "icon" class' + ); + $this->assertContains( + 'icon', $contentNavUnWatch['views']['unwatch']['class'], + 'Unwatch list items require an "icon" class' + ); + $this->assertNotContains( + 'icon', $contentNavUnWatch['actions']['move']['class'], + 'List item other than watch or unwatch should not have an "icon" class' + ); + } + + /** + * @covers ::updateUserLinksItems + */ + public function testUpdateUserLinksItems() { + $vector2022Skin = new SkinVector22( [ 'name' => 'vector-2022' ] ); + $contentNav = [ + 'associated-pages' => [], + 'views' => [], + 'user-page' => [ + 'userpage' => [ 'class' => [], 'icon' => 'userpage' ], + ], + 'user-menu' => [ + 'login' => [ 'class' => [], 'icon' => 'login' ], + ] + ]; + $vectorLegacySkin = new SkinVectorLegacy( [ 'name' => 'vector' ] ); + $contentNavLegacy = [ + 'associated-pages' => [], + 'views' => [], + 'user-page' => [ + 'userpage' => [ 'class' => [], 'icon' => 'userpage' ], + ] + ]; + + Hooks::onSkinTemplateNavigation( $vector2022Skin, $contentNav ); + $this->assertFalse( isset( $contentNav['user-page']['login'] ), + 'updateUserLinksDropdownItems is called when not legacy' + ); + Hooks::onSkinTemplateNavigation( $vectorLegacySkin, $contentNavLegacy ); + $this->assertFalse( isset( $contentNavLegacy['user-page'] ), + 'user-page is unset for legacy vector' + ); + } + + /** + * @covers ::updateUserLinksDropdownItems + */ + public function testUpdateUserLinksDropdownItems() { + $updateUserLinksDropdownItems = new ReflectionMethod( + Hooks::class, + 'updateUserLinksDropdownItems' + ); + $updateUserLinksDropdownItems->setAccessible( true ); + + // Anon users + $skin = new SkinVector22( [ 'name' => 'vector-2022' ] ); + $contentAnon = [ + 'user-menu' => [ + 'anonuserpage' => [ 'class' => [], 'icon' => 'anonuserpage' ], + 'createaccount' => [ 'class' => [], 'icon' => 'createaccount' ], + 'login' => [ 'class' => [], 'icon' => 'login' ], + 'anontalk' => [ 'class' => [], 'icon' => 'anontalk' ], + 'anoncontribs' => [ 'class' => [], 'icon' => 'anoncontribs' ], + ], + ]; + $updateUserLinksDropdownItems->invokeArgs( null, [ $skin, &$contentAnon ] ); + $this->assertTrue( + count( $contentAnon['user-menu'] ) === 2 && + isset( $contentAnon['user-menu']['createaccount'] ) && + isset( $contentAnon['user-menu']['login'] ), + 'Anon user page, anon talk, anon contribs links are removed from user-menu' + ); + + $this->assertTrue( + count( $contentAnon['user-menu'] ) === 2 && + isset( $contentAnon['user-menu-anon-editor']['anontalk'] ) && + isset( $contentAnon['user-menu-anon-editor']['anoncontribs'] ), + 'Anon talk, anon contribs links are moved to user-menu-anon-editor' + ); + + // Registered user + $registeredUser = $this->createMock( User::class ); + $registeredUser->method( 'isRegistered' )->willReturn( true ); + $context = new RequestContext(); + $context->setUser( $registeredUser ); + $skin->setContext( $context ); + $contentRegistered = [ + 'user-menu' => [ + 'userpage' => [ 'class' => [], 'icon' => 'userpage' ], + 'watchlist' => [ 'class' => [], 'icon' => 'watchlist' ], + 'logout' => [ 'class' => [], 'icon' => 'logout' ], + ], + ]; + $updateUserLinksDropdownItems->invokeArgs( null, [ $skin, &$contentRegistered ] ); + $this->assertContains( 'user-links-collapsible-item', $contentRegistered['user-menu']['userpage']['class'], + 'User page link in user links dropdown requires collapsible class' + ); + $this->assertEquals( + '', + $contentRegistered['user-menu']['userpage']['link-html'], + 'User page link in user links dropdown has link-html' + ); + $this->assertContains( 'user-links-collapsible-item', $contentRegistered['user-menu']['watchlist']['class'], + 'Watchlist link in user links dropdown requires collapsible class' + ); + $this->assertEquals( + '', + $contentRegistered['user-menu']['watchlist']['link-html'], + 'Watchlist link in user links dropdown has link-html' + ); + $this->assertFalse( isset( $contentRegistered['user-menu']['logout'] ), + 'Logout link in user links dropdown is not set' + ); + $this->assertTrue( isset( $contentRegistered['user-menu-logout']['logout'] ), + 'Logout link in user links dropdown is not set' + ); + } + + /** + * @covers ::updateUserLinksOverflowItems + */ + public function testUpdateUserLinksOverflowItems() { + $updateUserLinksOverflowItems = new ReflectionMethod( + Hooks::class, + 'updateUserLinksOverflowItems' + ); + $updateUserLinksOverflowItems->setAccessible( true ); + $skin = new SkinVector22( [ 'name' => 'vector-2022' ] ); + + // Registered user + $registeredUser = $this->createMock( User::class ); + $registeredUser->method( 'isRegistered' )->willReturn( true ); + $context = new RequestContext(); + $context->setUser( $registeredUser ); + $skin->setContext( $context ); + $content = [ + 'notifications' => [ + 'alert' => [ 'class' => [], 'icon' => 'alert' ], + ], + 'user-interface-preferences' => [ + 'uls' => [ 'class' => [], 'icon' => 'uls' ], + ], + 'user-page' => [ + 'userpage' => [ 'class' => [], 'icon' => 'userpage' ], + 'watchlist' => [ 'class' => [], 'icon' => 'watchlist' ], + ], + 'user-menu' => [ + 'watchlist' => [ 'class' => [], 'icon' => 'watchlist' ], + ], + ]; + $updateUserLinksOverflowItems->invokeArgs( null, [ $skin, &$content ] ); + $this->assertContains( 'user-links-collapsible-item', + $content['vector-user-menu-overflow']['uls']['class'], + 'ULS link in user links overflow requires collapsible class' + ); + $this->assertContains( 'user-links-collapsible-item', + $content['vector-user-menu-overflow']['userpage']['class'], + 'User page link in user links overflow requires collapsible class' + ); + $this->assertNotContains( 'mw-ui-icon', + $content['vector-user-menu-overflow']['userpage']['class'], + 'User page link in user links overflow does not have icon classes' + ); + $this->assertContains( 'user-links-collapsible-item', + $content['vector-user-menu-overflow']['watchlist']['class'], + 'Watchlist link in user links overflow requires collapsible class' + ); + $this->assertContains( 'mw-ui-button', + $content['vector-user-menu-overflow']['watchlist']['link-class'], + 'Watchlist link in user links overflow requires button classes' + ); + $this->assertContains( 'mw-ui-quiet', + $content['vector-user-menu-overflow']['watchlist']['link-class'], + 'Watchlist link in user links overflow requires quiet button classes' + ); + $this->assertContains( 'mw-ui-icon-element', + $content['vector-user-menu-overflow']['watchlist']['link-class'], + 'Watchlist link in user links overflow hides text' + ); + $this->assertTrue( + $content['vector-user-menu-overflow']['watchlist']['id'] === 'pt-watchlist-2', + 'Watchlist link in user links has unique id' + ); + } + + public function provideAppendClassToItem() { + return [ + // Add array class to array + [ + [], + [ 'array1', 'array2' ], + [ 'array1', 'array2' ], + ], + // Add string class to array + [ + [], + 'array1 array2', + [ 'array1 array2' ], + ], + // Add array class to string + [ + '', + [ 'array1', 'array2' ], + 'array1 array2', + ], + // Add string class to string + [ + '', + 'array1 array2', + 'array1 array2', + ], + // Add string class to undefined + [ + null, + 'array1 array2', + 'array1 array2', + ], + // Add array class to undefined + [ + null, + [ 'array1', 'array2' ], + [ 'array1', 'array2' ], + ], + ]; + } + + /** + * @covers ::appendClassToItem + * @dataProvider provideAppendClassToItem + */ + public function testAppendClassToItem( + $item, + $classes, + $expected + ) { + $appendClassToItem = new ReflectionMethod( + Hooks::class, + 'appendClassToItem' + ); + $appendClassToItem->setAccessible( true ); + $appendClassToItem->invokeArgs( null, [ &$item, $classes ] ); + $this->assertEquals( $expected, $item ); + } + + public function provideUpdateItemData() { + return [ + // Removes extra attributes + [ + [ 'class' => [], 'icon' => '', 'button' => false, 'text-hidden' => false, 'collapsible' => false ], + 'link-class', + 'link-html', + [ 'class' => [] ], + ], + // Adds icon html + [ + [ 'class' => [], 'icon' => 'userpage' ], + 'link-class', + 'link-html', + [ + 'class' => [], + 'link-html' => + '' + ], + ], + // Adds collapsible class + [ + [ 'class' => [], 'collapsible' => true ], + 'link-class', + 'link-html', + [ 'class' => [ 'user-links-collapsible-item' ] ], + ], + // Adds button classes + [ + [ 'class' => [], 'button' => true ], + 'link-class', + 'link-html', + [ 'class' => [], 'link-class' => [ 'mw-ui-button', 'mw-ui-quiet' ] ], + ], + // Adds text hidden classes + [ + [ 'class' => [], 'text-hidden' => true, 'icon' => 'userpage' ], + 'link-class', + 'link-html', + [ 'class' => [], 'link-class' => [ + 'mw-ui-icon', + 'mw-ui-icon-element', + 'mw-ui-icon-userpage', + 'mw-ui-icon-wikimedia-userpage' + ] ], + ], + // Adds button and icon classes + [ + [ 'class' => [], 'button' => true, 'icon' => 'userpage' ], + 'class', + 'link-html', + [ 'class' => [ + 'mw-ui-button', + 'mw-ui-quiet' + ], 'link-html' => + '' + ], + ] + ]; + } + + /** + * @covers ::updateItemData + * @dataProvider provideUpdateItemData + */ + public function testUpdateItemData( + array $item, + string $buttonClassProp, + string $iconHtmlProp, + array $expected + ) { + $updateItemData = new ReflectionMethod( + Hooks::class, + 'updateItemData' + ); + $updateItemData->setAccessible( true ); + $data = $updateItemData->invokeArgs( null, [ $item, $buttonClassProp, $iconHtmlProp ] ); + $this->assertArraySubmapSame( $expected, $data ); + } +} diff --git a/Vector/tests/phpunit/structure/BundleSizeTest.php b/Vector/tests/phpunit/structure/BundleSizeTest.php new file mode 100644 index 0000000..65832e3 --- /dev/null +++ b/Vector/tests/phpunit/structure/BundleSizeTest.php @@ -0,0 +1,11 @@ +expectException( \LogicException::class ); + + $featureManager = new FeatureManager(); + $featureManager->registerSimpleRequirement( 'requirementA', true ); + $featureManager->registerSimpleRequirement( 'requirementA', true ); + } + + public static function provideInvalidFeatureConfig() { + return [ + + // ::registerFeature( string, int[] ) will throw an exception. + [ + \Wikimedia\Assert\ParameterAssertionException::class, + [ 1 ], + ], + + // The "bar" requirement hasn't been registered. + [ + \InvalidArgumentException::class, + [ + 'bar', + ], + ], + ]; + } + + /** + * @covers ::getFeatureBodyClass + */ + public function testGetFeatureBodyClass() { + $featureManager = new FeatureManager(); + $featureManager->registerSimpleRequirement( 'requirement', true ); + $featureManager->registerSimpleRequirement( 'disabled', false ); + $featureManager->registerFeature( 'sticky-header', [ 'requirement' ] ); + $featureManager->registerFeature( 'TableOfContents', [ 'requirement' ] ); + $featureManager->registerFeature( 'Test', [ 'disabled' ] ); + $this->assertEquals( + [ + 'vector-feature-sticky-header-enabled', + 'vector-feature-table-of-contents-enabled', + 'vector-feature-test-disabled' + ], + $featureManager->getFeatureBodyClass() + ); + } + + /** + * @dataProvider provideInvalidFeatureConfig + * @covers ::registerFeature + */ + public function testRegisterFeatureValidatesConfig( $expectedExceptionType, $config ) { + $this->expectException( $expectedExceptionType ); + + $featureManager = new FeatureManager(); + $featureManager->registerSimpleRequirement( 'requirement', true ); + $featureManager->registerFeature( 'feature', $config ); + } + + /** + * @covers ::isRequirementMet + */ + public function testIsRequirementMet() { + $featureManager = new FeatureManager(); + $featureManager->registerSimpleRequirement( 'enabled', true ); + $featureManager->registerSimpleRequirement( 'disabled', false ); + + $this->assertTrue( $featureManager->isRequirementMet( 'enabled' ) ); + $this->assertFalse( $featureManager->isRequirementMet( 'disabled' ) ); + } + + /** + * @covers ::isRequirementMet + */ + public function testIsRequirementMetThrowsExceptionWhenRequirementIsntRegistered() { + $this->expectException( \InvalidArgumentException::class ); + + $featureManager = new FeatureManager(); + $featureManager->isRequirementMet( 'foo' ); + } + + /** + * @covers ::registerFeature + */ + public function testRegisterFeatureThrowsExceptionWhenFeatureIsRegisteredTwice() { + $this->expectException( \LogicException::class ); + + $featureManager = new FeatureManager(); + $featureManager->registerFeature( 'featureA', [] ); + $featureManager->registerFeature( 'featureA', [] ); + } + + /** + * @covers ::isFeatureEnabled + */ + public function testIsFeatureEnabled() { + $featureManager = new FeatureManager(); + $featureManager->registerSimpleRequirement( 'foo', false ); + $featureManager->registerFeature( 'requiresFoo', 'foo' ); + + $this->assertFalse( + $featureManager->isFeatureEnabled( 'requiresFoo' ), + 'A feature is disabled when the requirement that it requires is disabled.' + ); + + // --- + + $featureManager->registerSimpleRequirement( 'bar', true ); + $featureManager->registerSimpleRequirement( 'baz', true ); + + $featureManager->registerFeature( 'requiresFooBar', [ 'foo', 'bar' ] ); + $featureManager->registerFeature( 'requiresBarBaz', [ 'bar', 'baz' ] ); + + $this->assertFalse( + $featureManager->isFeatureEnabled( 'requiresFooBar' ), + 'A feature is disabled when at least one requirement that it requires is disabled.' + ); + + $this->assertTrue( $featureManager->isFeatureEnabled( 'requiresBarBaz' ) ); + } + + /** + * @covers ::isFeatureEnabled + */ + public function testIsFeatureEnabledThrowsExceptionWhenFeatureIsntRegistered() { + $this->expectException( \InvalidArgumentException::class ); + + $featureManager = new FeatureManager(); + $featureManager->isFeatureEnabled( 'foo' ); + } +} diff --git a/Vector/tests/phpunit/unit/FeatureManagement/Requirements/DynamicConfigRequirementTest.php b/Vector/tests/phpunit/unit/FeatureManagement/Requirements/DynamicConfigRequirementTest.php new file mode 100644 index 0000000..9e6c208 --- /dev/null +++ b/Vector/tests/phpunit/unit/FeatureManagement/Requirements/DynamicConfigRequirementTest.php @@ -0,0 +1,77 @@ + $configValue, + ] ); + + $requirement = new DynamicConfigRequirement( $config, 'Foo', 'Bar' ); + + $this->assertEquals( $requirement->isMet(), $configValue ); + } + + /** + * @covers ::isMet + */ + public function testItCastsConfigValue() { + $config = new \HashConfig( [ + 'Foo' => new \stdClass(), + ] ); + + $requirement = new DynamicConfigRequirement( $config, 'Foo', 'Bar' ); + + $this->assertTrue( $requirement->isMet() ); + } + + /** + * @covers ::getName + */ + public function testItReturnsName() { + $requirement = new DynamicConfigRequirement( + new \HashConfig(), + 'Foo', + 'Bar' + ); + + $this->assertEquals( 'Bar', $requirement->getName() ); + } +} diff --git a/Vector/tests/phpunit/unit/FeatureManagement/Requirements/OverridableConfigRequirementTest.php b/Vector/tests/phpunit/unit/FeatureManagement/Requirements/OverridableConfigRequirementTest.php new file mode 100644 index 0000000..27ce946 --- /dev/null +++ b/Vector/tests/phpunit/unit/FeatureManagement/Requirements/OverridableConfigRequirementTest.php @@ -0,0 +1,353 @@ + false, + 'logged_out' => false, + ], + // is A-B test enabled + false, + // note 0 = anon user + 0, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + null, + false, + 'If nothing enabled, nobody gets new treatment' + ], + [ + // Is language enabled + [ + 'logged_in' => false, + 'logged_out' => true, + ], + // is A-B test enabled + false, + // note 0 = anon user + 0, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + 'Anon users should get new treatment if enabled when A/B test disabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + false, + 2, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + 'Logged in users should get new treatment if enabled when A/B test disabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + false, + 1, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + 'All odd logged in users should get new treatent when A/B test disabled' + ], + [ + // Is language enabled + [ + 'logged_in' => false, + 'logged_out' => true, + ], + // is A-B test enabled + true, + // note 0 = anon user + 0, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + // Ab test is only for logged in users + 'Anon users with a/b test enabled should see new treatment when config enabled' + ], + [ + // Is language enabled + [ + 'logged_in' => false, + 'logged_out' => false, + ], + // is A-B test enabled + true, + // + // note 0 = anon user + 0, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + false, + // Ab test is only for logged in users + 'Anon users with a/b test enabled should see old treatment when config disabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + true, + 2, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + 'Even logged in users get new treatment when A/B test enabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + true, + 1, + // use central id lookup? + false, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + false, + 'Odd logged in users do not get new treatment when A/B test enabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + true, + 2, + // use central id lookup? + true, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + 'With CentralIdLookup, even logged in users get new treatment when A/B test enabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + true, + 1, + // use central id lookup? + true, + // `languageinheader` query param + null, + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + false, + 'With CentralIdLookup, odd logged in users do not get new treatment when A/B test enabled' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + true, + 1, + // use central id lookup? + false, + // `languageinheader` query param + "1", + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + true, + 'Odd logged in users get new treatment when A/B test enabled and query param set to "1"' + ], + [ + // Is language enabled + [ + 'logged_in' => true, + 'logged_out' => false, + ], + // is A-B test enabled + true, + 1, + // use central id lookup? + false, + // `languageinheader` query param + "0", + // AB test name + 'VectorLanguageInHeaderTreatmentABTest', + false, + 'Even logged in users get old treatment when A/B test enabled and query param set to "0"' + ], + [ + // Is language enabled + [ + 'logged_in' => false, + 'logged_out' => false, + ], + // is A-B test enabled + false, + 1, + // use central id lookup? + false, + // `languageinheader` query param + "1", + // AB test name + null, + true, + 'Users get new treatment when query param set to "1" regardless of state of A/B test or config flags' + ], + [ + // Is language enabled + [ + 'logged_in' => false, + 'logged_out' => false, + ], + // is A-B test enabled + false, + 1, + // use central id lookup? + false, + // `languageinheader` query param + "0", + // AB test name + null, + false, + 'Users get old treatment when query param set to "0" regardless of state of A/B test or config flags' + ], + ]; + } + + /** + * @covers ::isMet + * @dataProvider providerLanguageInHeaderTreatmentRequirement + * @param bool $configValue + * @param bool $abValue + * @param int $userId + * @param bool $useCentralIdLookup + * @param string|null $queryParam + * @param string|null $testName + * @param bool $expected + * @param string $msg + */ + public function testLanguageInHeaderTreatmentRequirement( + $configValue, + $abValue, + $userId, + $useCentralIdLookup, + $queryParam, + $testName, + $expected, + $msg + ) { + $config = new HashConfig( [ + Constants::CONFIG_KEY_LANGUAGE_IN_HEADER => $configValue, + $testName => $abValue, + ] ); + + $user = $this->createMock( User::class ); + $user->method( 'isRegistered' )->willReturn( $userId !== 0 ); + $user->method( 'getID' )->willReturn( $userId ); + + $request = $this->createMock( WebRequest::class ); + $request->method( 'getCheck' )->willReturn( $queryParam !== null ); + $request->method( 'getBool' )->willReturn( (bool)$queryParam ); + + $centralIdLookup = $this->createMock( CentralIdLookup::class ); + $centralIdLookup->method( 'centralIdFromLocalUser' )->willReturn( $userId ); + + $requirement = new OverridableConfigRequirement( + $config, + $user, + $request, + $useCentralIdLookup ? $centralIdLookup : null, + 'VectorLanguageInHeader', + 'LanguageInHeader', + 'languageinheader', + $testName ?? null + ); + + $this->assertSame( $expected, $requirement->isMet(), $msg ); + } + +} diff --git a/Vector/tests/phpunit/unit/FeatureManagement/Requirements/UserPreferenceRequirementTest.php b/Vector/tests/phpunit/unit/FeatureManagement/Requirements/UserPreferenceRequirementTest.php new file mode 100644 index 0000000..a646a9b --- /dev/null +++ b/Vector/tests/phpunit/unit/FeatureManagement/Requirements/UserPreferenceRequirementTest.php @@ -0,0 +1,79 @@ +createMock( User::class ); + $title = $isTitlePresent ? $this->createMock( Title::class ) : null; + + $userOptionsLookup = $this->createMock( UserOptionsLookup::class ); + $userOptionsLookup->method( 'getOption' )->willReturn( $isEnabled ); + $userOptionsLookup->method( 'getBoolOption' )->willReturn( $isEnabled ); + + $requirement = new UserPreferenceRequirement( + $user, + $userOptionsLookup, + 'userOption', + 'userRequirement', + $title + ); + + $this->assertSame( $expected, $requirement->isMet(), $msg ); + } +} diff --git a/Vector/tests/phpunit/unit/SkinVector22Test.php b/Vector/tests/phpunit/unit/SkinVector22Test.php new file mode 100644 index 0000000..981b7ab --- /dev/null +++ b/Vector/tests/phpunit/unit/SkinVector22Test.php @@ -0,0 +1,100 @@ + 'p-navigation', + ]; + private const SUPPORT = [ + 'id' => 'p-support', + ]; + private const TOOLBOX = [ + 'id' => 'p-tb', + ]; + private const WIKIBASE = [ + 'id' => 'p-wikibase-otherprojects', + ]; + + public function provideExtractPageToolsFromSidebar() { + return [ + [ + [], + [], [], + 'No change if sidebar is missing keys' + ], + [ + [ + 'data-portlets-first' => self::MAIN, + 'array-portlets-rest' => [ + self::SUPPORT + ], + ], + [ + 'data-portlets-first' => self::MAIN, + 'array-portlets-rest' => [ + self::SUPPORT + ], + ], + [], + 'No change if no toolbox found' + ], + [ + [ + 'data-portlets-first' => self::TOOLBOX, + 'array-portlets-rest' => [ self::SUPPORT ], + ], + [ + 'data-portlets-first' => self::TOOLBOX, + 'array-portlets-rest' => [ self::SUPPORT ], + ], + [], + 'A toolbox in first part of sidebar is ignored.' + ], + + [ + [ + 'data-portlets-first' => self::MAIN, + 'array-portlets-rest' => [ self::SUPPORT, self::TOOLBOX, self::WIKIBASE ], + ], + // new expected sidebar + [ + 'data-portlets-first' => self::MAIN, + 'array-portlets-rest' => [ + self::SUPPORT + ], + ], + // new expected page tools menu + [ + self::TOOLBOX, self::WIKIBASE + ], + 'Toolbox and any items after it are pulled out.' + ], + ]; + } + + /** + * @covers ::extractPageToolsFromSidebar + * @dataProvider provideExtractPageToolsFromSidebar + */ + public function testExtractPageToolsFromSidebar( $sidebar, $expectedSidebar, $expectedPageTools, $msg ) { + $pageTools = []; + $extractPageToolsFromSidebar = new ReflectionMethod( + SkinVector22::class, + 'extractPageToolsFromSidebar' + ); + $extractPageToolsFromSidebar->setAccessible( true ); + $extractPageToolsFromSidebar->invokeArgs( null, [ &$sidebar, &$pageTools ] ); + $this->assertEquals( $expectedSidebar, $sidebar ); + $this->assertEquals( $expectedPageTools, $pageTools, $msg ); + } +} diff --git a/Vector/tests/phpunit/unit/components/VectorComponentPageToolsTest.php b/Vector/tests/phpunit/unit/components/VectorComponentPageToolsTest.php new file mode 100644 index 0000000..ad3433c --- /dev/null +++ b/Vector/tests/phpunit/unit/components/VectorComponentPageToolsTest.php @@ -0,0 +1,138 @@ + false, + 'label' => 'vector-page-tools-label', + 'label-tag-name' => 'div', + 'pin-label' => 'vector-pin-element-label', + 'unpin-label' => 'vector-unpin-element-label', + 'data-feature-name' => 'page-tools-pinned', + 'data-pinnable-element-id' => 'vector-page-tools', + 'data-unpinned-container-id' => 'vector-page-tools-unpinned-container', + 'data-pinned-container-id' => 'vector-page-tools-pinned-container', + ], $data ); + } + + public function provideConstructorData() { + $menus = [ [ + 'id' => 'p-cactions', + 'array-items' => [ [ + 'id' => 'ca-delete', + 'html-item' => "
  • Delete
  • " + ] ] + ], [ + 'id' => 'p-tb', + 'array-items' => [ [ + 'id' => 't-whatlinkshere', + 'html-item' => "
  • What links here
  • " + ] ] + ] ]; + + $expectedMenus = $menus; + $expectedMenus[ 0 ][ 'label' ] = 'vector-page-tools-actions-label'; + $expectedMenus[ 1 ][ 'label' ] = 'vector-page-tools-general-label'; + + return [ + [ + $menus, + false, + false, + [ + 'id' => 'vector-page-tools', + 'is-pinned' => false, + 'data-pinnable-header' => $this->getPinnableHeaderData(), + 'data-menus' => $expectedMenus + ] + ], + [ + $menus, + false, + true, + [ + 'id' => 'vector-page-tools', + 'is-pinned' => true, + 'data-pinnable-header' => $this->getPinnableHeaderData( [ + 'is-pinned' => true, + ] ), + 'data-menus' => $expectedMenus + ] + ], + [ + $menus, + true, + false, + [ + 'id' => 'vector-page-tools', + 'is-pinned' => false, + 'data-pinnable-header' => $this->getPinnableHeaderData(), + 'data-menus' => $expectedMenus + ] + ] + ]; + } + + /** + * @covers ::getTemplateData + * @dataProvider provideConstructorData + */ + public function testGetTemplateData( + array $menus, + bool $isRegistered, + bool $isPinned, + array $expected + ) { + $localizer = $this->createMock( MessageLocalizer::class ); + $localizer->method( 'msg' )->willReturnCallback( function ( $key, ...$params ) { + $msg = $this->createMock( Message::class ); + $msg->method( '__toString' )->willReturn( $key ); + $msg->method( 'text' )->willReturn( $key ); + return $msg; + } ); + $user = $this->createMock( User::class ); + $user->method( 'isRegistered' )->willReturn( $isRegistered ); + $featureManager = $this->createMock( FeatureManager::class ); + $featureManager->method( 'isFeatureEnabled' )->willReturn( $isPinned ); + + $pageTools = new VectorComponentPageTools( + $menus, + $localizer, + $user, + $featureManager + ); + $this->assertEquals( $expected, $pageTools->getTemplateData() ); + } +} diff --git a/Vector/tests/phpunit/unit/components/VectorComponentTableOfContentsTest.php b/Vector/tests/phpunit/unit/components/VectorComponentTableOfContentsTest.php new file mode 100644 index 0000000..bd15f54 --- /dev/null +++ b/Vector/tests/phpunit/unit/components/VectorComponentTableOfContentsTest.php @@ -0,0 +1,203 @@ + true, + 'VectorTableOfContentsCollapseAtCount' => 1 + ]; + $tocData = [ + 'number-section-count' => 2, + 'array-sections' => [ + [ + 'toclevel' => 1, + 'level' => '2', + 'line' => 'A', + 'number' => '1', + 'index' => '1', + 'fromtitle' => 'Test', + 'byteoffset' => 231, + 'anchor' => 'A', + 'linkAnchor' => 'A', + 'array-sections' => [], + 'is-top-level-section' => true, + 'is-parent-section' => false, + ], + [ + 'toclevel' => 1, + 'level' => '4', + 'line' => 'B', + 'number' => '2', + 'index' => '2', + 'fromtitle' => 'Test', + 'byteoffset' => 245, + 'anchor' => 'B', + 'linkAnchor' => 'B', + 'array-sections' => [], + 'is-top-level-section' => true, + 'is-parent-section' => false, + ] + ] + ]; + $nestedTocData = [ + 'number-section-count' => 2, + 'array-sections' => [ + [ + 'toclevel' => 1, + 'level' => '2', + 'line' => 'A', + 'number' => '1', + 'index' => '1', + 'fromtitle' => 'Test', + 'byteoffset' => 231, + 'anchor' => 'A', + 'linkAnchor' => 'A', + 'vector-button-label' => 'vector-toc-toggle-button-label', + 'array-sections' => [ + 'toclevel' => 2, + 'level' => '4', + 'line' => 'A1', + 'number' => '1.1', + 'index' => '2', + 'fromtitle' => 'Test', + 'byteoffset' => 245, + 'anchor' => 'A1', + 'linkAnchor' => 'A1', + 'array-sections' => [], + 'is-top-level-section' => false, + 'is-parent-section' => false, + ], + 'is-top-level-section' => true, + 'is-parent-section' => true, + ], + ] + ]; + + $expectedConfigData = [ + 'is-vector-toc-beginning-enabled' => $config[ 'VectorTableOfContentsBeginning' ], + 'vector-is-collapse-sections-enabled' => + $tocData[ 'number-section-count' ] >= $config[ 'VectorTableOfContentsCollapseAtCount' ], + 'id' => 'vector-toc', + 'data-pinnable-header' => [ + 'is-pinned' => true, + 'data-pinnable-element-id' => 'vector-toc', + 'data-feature-name' => 'toc-pinned', + 'label' => 'vector-toc-label', + 'unpin-label' => 'vector-unpin-element-label', + 'pin-label' => 'vector-pin-element-label', + 'label-tag-name' => 'h2' + ] + ]; + $expectedNestedTocData = array_merge( $nestedTocData, $expectedConfigData ); + + return [ + // When zero sections + [ + [], + $config, + // TOC data is empty when given an empty array + [] + ], + // When number of multiple sections is lower than configured value + [ + $tocData, + array_merge( $config, [ 'VectorTableOfContentsCollapseAtCount' => 3 ] ), + // 'vector-is-collapse-sections-enabled' value is false + array_merge( $tocData, $expectedConfigData, [ + 'vector-is-collapse-sections-enabled' => false + ] ) + ], + // When number of multiple sections is equal to the configured value + [ + $tocData, + array_merge( $config, [ 'VectorTableOfContentsCollapseAtCount' => 2 ] ), + // 'vector-is-collapse-sections-enabled' value is true + array_merge( $tocData, $expectedConfigData ) + ], + // When number of multiple sections is higher than configured value + [ + $tocData, + array_merge( $config, [ 'VectorTableOfContentsCollapseAtCount' => 1 ] ), + // 'vector-is-collapse-sections-enabled' value is true + array_merge( $tocData, $expectedConfigData ) + ], + // When "Beginning" TOC section is configured to be turned off + [ + $tocData, + array_merge( $config, [ 'VectorTableOfContentsBeginning' => false ] ), + // 'is-vector-toc-beginning-enabled' value is false + array_merge( $tocData, $expectedConfigData, [ + 'is-vector-toc-beginning-enabled' => false + ] ) + ], + // When TOC has sections with top level parent sections + [ + $nestedTocData, + $config, + // 'vector-button-label' is provided for top level parent sections + $expectedNestedTocData + ], + ]; + } + + /** + * @covers ::getTemplateData + * @dataProvider provideGetTOCData + */ + public function testGetTemplateData( + array $tocData, + array $config, + array $expected + ) { + $localizer = $this->createMock( MessageLocalizer::class ); + $localizer->method( 'msg' )->willReturnCallback( function ( $key, ...$params ) { + $msg = $this->createMock( Message::class ); + $msg->method( '__toString' )->willReturn( $key ); + $msg->method( 'text' )->willReturn( $key ); + return $msg; + } ); + $featureManager = $this->createMock( FeatureManager::class ); + $featureManager->method( 'isFeatureEnabled' )->willReturn( true ); + + $toc = new VectorComponentTableOfContents( + $tocData, + $localizer, + new HashConfig( $config ), + $featureManager + ); + $this->assertEquals( $expected, $toc->getTemplateData() ); + } +} diff --git a/Vector/tsconfig.json b/Vector/tsconfig.json new file mode 100644 index 0000000..4304ecf --- /dev/null +++ b/Vector/tsconfig.json @@ -0,0 +1,24 @@ +{ + "exclude": [ + "docs", + "vendor", + "coverage" + ], + "compilerOptions": { + "resolveJsonModule": true, + "esModuleInterop": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "newLine": "lf", + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "pretty": true, + "target": "es5", + "lib": [ "dom" ], + "allowJs": true, + "checkJs": true, + "noEmit": true + } +} diff --git a/Vector/version b/Vector/version new file mode 100644 index 0000000..220bd14 --- /dev/null +++ b/Vector/version @@ -0,0 +1,4 @@ +Vector: REL1_40 +2023-08-31T07:31:14 + +c81a141 diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..f61c94e --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,41 @@ +# MediaWiki with MariaDB +# +# Access via "http://localhost:8080" +# (or "http://$(docker-machine ip):8080" if using docker-machine) +version: '3' +services: + mediawiki: + image: mediawiki + # restart: always + ports: + - 8080:80 + links: + - database + build: . + volumes: + - images:/var/www/html/images + # After initial setup, download LocalSettings.php to the same directory as + # this yaml and uncomment the following line and use compose to restart + # the mediawiki service + - ./LocalSettings.php:/var/www/html/LocalSettings.php + - ./languages/i18n/en.json:/var/www/html/languages/i18n/en.json + - ./Vector:/var/www/html/skins/Vector + - ./resources/assets:/var/www/html/resources/assets + # This key also defines the name of the database host used during setup instead of the default "localhost" + # https://phabricator.wikimedia.org/T254405 + # https://stackoverflow.com/questions/57312109/mediawiki-docker-official-image-connection-refused-by-mysql + database: + image: mariadb + # restart: always + environment: + # @see https://phabricator.wikimedia.org/source/mediawiki/browse/master/includes/DefaultSettings.php + MYSQL_DATABASE: wiki + MYSQL_USER: admin + MYSQL_PASSWORD: 610BnHyDFXz + MYSQL_RANDOM_ROOT_PASSWORD: 'yes' + volumes: + - db:/var/lib/mysql + +volumes: + images: + db: diff --git a/languages/i18n/en.json b/languages/i18n/en.json new file mode 100644 index 0000000..7f156c3 --- /dev/null +++ b/languages/i18n/en.json @@ -0,0 +1,4472 @@ +{ + "@metadata": { + "authors": [] + }, + "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help-mediawiki\n* SEARCH\n* TOOLBOX\n* LANGUAGES", + "tog-underline": "Link underlining:", + "tog-hideminor": "Hide minor edits from recent changes", + "tog-hidepatrolled": "Hide patrolled edits from recent changes", + "tog-newpageshidepatrolled": "Hide patrolled pages from new page list", + "tog-hidecategorization": "Hide categorization of pages", + "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent", + "tog-usenewrc": "Group changes by page in recent changes and watchlist", + "tog-editondblclick": "Edit pages on double click", + "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles", + "tog-watchcreations": "Add pages I create and files I upload to my watchlist", + "tog-watchdefault": "Add pages and files I edit to my watchlist", + "tog-watchmoves": "Add pages and files I move to my watchlist", + "tog-watchdeletion": "Add pages and files I delete to my watchlist", + "tog-watchuploads": "Add new files I upload to my watchlist", + "tog-watchrollback": "Add pages where I have performed a rollback to my watchlist", + "tog-minordefault": "Mark all edits minor by default", + "tog-previewontop": "Show preview before edit box", + "tog-previewonfirst": "Show preview when starting to edit", + "tog-enotifwatchlistpages": "Email me when a page or a file on my watchlist is changed", + "tog-enotifusertalkpages": "Email me when my user talk page is changed", + "tog-enotifminoredits": "Email me also for minor edits of pages and files", + "tog-enotifrevealaddr": "Reveal my email address in notification emails", + "tog-shownumberswatching": "Show the number of watching users", + "tog-oldsig": "Your existing signature:", + "tog-fancysig": "Treat signature as wikitext (without an automatic link to your user page)", + "tog-uselivepreview": "Show preview without reloading the page", + "tog-forceeditsummary": "Prompt me when entering a blank edit summary (or the default undo summary)", + "tog-watchlisthideown": "Hide my edits from the watchlist", + "tog-watchlisthidebots": "Hide bot edits from the watchlist", + "tog-watchlisthideminor": "Hide minor edits from the watchlist", + "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist", + "tog-watchlistreloadautomatically": "Reload the watchlist automatically whenever a filter is changed (JavaScript required)", + "tog-watchlistunwatchlinks": "Add direct unwatch/watch markers ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) to watched pages with changes (JavaScript required for toggle functionality)", + "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist", + "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist", + "tog-watchlisthidecategorization": "Hide categorization of pages", + "tog-ccmeonemails": "Send me copies of emails I send to other users", + "tog-diffonly": "Do not show page content below diffs", + "tog-showhiddencats": "Show hidden categories", + "tog-norollbackdiff": "Don't show diff after performing a rollback", + "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes", + "tog-prefershttps": "Always use a secure connection while logged in", + "tog-showrollbackconfirmation": "Show a confirmation prompt when clicking on a rollback link", + "tog-requireemail": "Send password reset emails only when both email address and username are provided.", + "underline-always": "Always", + "underline-never": "Never", + "underline-default": "Skin or browser default", + "editfont-style": "Edit area font style:", + "editfont-monospace": "Monospaced font", + "editfont-sansserif": "Sans-serif font", + "editfont-serif": "Serif font", + "sunday": "Sunday", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sun": "Sun", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "january": "January", + "february": "February", + "march": "March", + "april": "April", + "may_long": "May", + "june": "June", + "july": "July", + "august": "August", + "september": "September", + "october": "October", + "november": "November", + "december": "December", + "january-gen": "January", + "february-gen": "February", + "march-gen": "March", + "april-gen": "April", + "may-gen": "May", + "june-gen": "June", + "july-gen": "July", + "august-gen": "August", + "september-gen": "September", + "october-gen": "October", + "november-gen": "November", + "december-gen": "December", + "jan": "Jan", + "feb": "Feb", + "mar": "Mar", + "apr": "Apr", + "may": "May", + "jun": "Jun", + "jul": "Jul", + "aug": "Aug", + "sep": "Sep", + "oct": "Oct", + "nov": "Nov", + "dec": "Dec", + "period-am": "AM", + "period-pm": "PM", + "pagecategories": "{{PLURAL:$1|Category|Categories}}", + "pagecategorieslink": "Special:Categories", + "category_header": "Pages in category \"$1\"", + "subcategories": "Subcategories", + "category-media-header": "Media in category \"$1\"", + "category-empty": "This category currently contains no pages or media.", + "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}", + "hidden-category-category": "Hidden categories", + "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}", + "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.", + "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}", + "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.", + "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}", + "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.", + "index-category": "Indexed pages", + "noindex-category": "Noindexed pages", + "broken-file-category": "Pages with broken file links", + "categoryviewer-pagedlinks": "($1) ($2)", + "category-header-numerals": "$1–$2", + "about": "About", + "article": "Content page", + "newwindow": "(opens in new window)", + "cancel": "Cancel", + "moredotdotdot": "More...", + "morenotlisted": "This list may be incomplete.", + "mypage": "Page", + "mytalk": "Talk", + "anontalk": "Talk", + "navigation": "Navigation", + "and": " and", + "faq": "FAQ", + "sitetitle": "{{SITENAME}}", + "sitesubtitle": "", + "actions": "Actions", + "namespaces": "Namespaces", + "variants": "Variants", + "navigation-heading": "Navigation menu", + "errorpagetitle": "Error", + "returnto": "Return to $1.", + "tagline": "From {{SITENAME}}", + "help": "Help", + "help-mediawiki": "Help about MediaWiki", + "search": "Search", + "search-ignored-headings": " #
    \n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #
    ", + "searchbutton": "Search", + "go": "Go", + "searcharticle": "Go", + "skin-view-history": "View history", + "history": "Page history", + "history_short": "History", + "history_small": "history", + "updatedmarker": "updated since your last visit", + "printableversion": "Printable version", + "printableversion-deprecated-warning": "The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.", + "permalink": "Permanent link", + "print": "Print", + "view": "View", + "skin-view-view": "Read", + "skin-view-foreign": "View on $1", + "edit": "Edit", + "skin-view-edit": "Edit", + "edit-local": "Edit local description", + "create": "Create", + "skin-view-create": "Create", + "create-local": "Add local description", + "delete": "Delete", + "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}", + "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}", + "protect": "Protect", + "protect_change": "change", + "skin-action-unprotect": "Change protection", + "unprotect": "Change protection", + "newpage": "New page", + "talkpagelinktext": "talk", + "specialpage": "Special page", + "personaltools": "Personal tools", + "addsection": "+", + "talk": "Discussion", + "views": "Views", + "toolbox": "Tools", + "cactions": "More", + "tool-link-userrights": "Change {{GENDER:$1|user}} groups", + "tool-link-userrights-readonly": "View {{GENDER:$1|user}} groups", + "tool-link-emailuser": "Email this {{GENDER:$1|user}}", + "imagepage": "View file page", + "mediawikipage": "View message page", + "templatepage": "View template page", + "viewhelppage": "View help page", + "categorypage": "View category page", + "viewtalkpage": "View discussion", + "otherlanguages": "In other languages", + "redirectedfrom": "(Redirected from $1)", + "redirectpagesub": "Redirect page", + "redirectto": "Redirect to:", + "talkpageheader": "-", + "lastmodifiedat": "This page was last edited on $1, at $2.", + "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.", + "protectedpage": "Protected page", + "jumpto": "Jump to:", + "jumptonavigation": "navigation", + "jumptosearch": "search", + "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1", + "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.", + "pool-timeout": "Timeout waiting for the lock", + "pool-queuefull": "Pool queue is full", + "pool-errorunknown": "Unknown error", + "pool-servererror": "The pool counter service is not available ($1).", + "poolcounter-usage-error": "Usage error: $1", + "view-pool-dirty-output": "parser cache is expired", + "view-pool-contention": "pool contention", + "view-pool-timeout": "pool overload", + "aboutsite": "About {{SITENAME}}", + "aboutpage": "Project:About", + "copyright": "Content is available under $1 unless otherwise noted.", + "copyrightpage": "{{ns:project}}:Copyrights", + "currentevents": "Current events", + "currentevents-url": "Project:Current events", + "disclaimers": "Disclaimers", + "disclaimerpage": "Project:General disclaimer", + "edithelp": "Editing help", + "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages", + "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents", + "helppage-top-gethelp": "Help", + "mainpage": "Main Page", + "mainpage-title": "-", + "mainpage-title-loggedin": "-", + "mainpage-description": "Main page", + "policy-url": "Project:Policy", + "portal": "Community portal", + "portal-url": "Project:Community portal", + "privacy": "Privacy policy", + "privacypage": "Project:Privacy policy", + "badaccess": "Permission error", + "badaccess-group0": "You are not allowed to execute the action you have requested.", + "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.", + "versionrequired": "Version $1 of MediaWiki required", + "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].", + "ok": "OK", + "pagetitle": "$1 - {{SITENAME}}", + "pagetitle-view-mainpage": "{{SITENAME}}", + "backlinksubtitle": "← $1", + "retrievedfrom": "Retrieved from \"$1\"", + "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).", + "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).", + "youhavenewmessagesmanyusers": "You have $1 from many users ($2).", + "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}", + "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}", + "editsection": "edit", + "editold": "edit", + "viewsourceold": "view source", + "editlink": "edit", + "viewsourcelink": "view source", + "editsectionhint": "Edit section: $1", + "toc": "Contents", + "showtoc": "show", + "hidetoc": "hide", + "collapsible-collapse": "Collapse", + "collapsible-expand": "Expand", + "confirmable-confirm": "Are {{GENDER:$1|you}} sure?", + "confirmable-yes": "Yes", + "confirmable-no": "No", + "thisisdeleted": "View or undelete $1?", + "viewdeleted": "View $1?", + "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}", + "feed-invalid": "Invalid subscription feed type.", + "feed-unavailable": "Syndication feeds are not available", + "site-rss-feed": "$1 RSS feed", + "site-atom-feed": "$1 Atom feed", + "page-rss-feed": "\"$1\" RSS feed", + "page-atom-feed": "\"$1\" Atom feed", + "feed-atom": "Atom", + "feed-rss": "RSS", + "sitenotice": "-", + "anonnotice": "-", + "newsectionheaderdefaultlevel": "== $1 ==", + "red-link-title": "$1 (page does not exist)", + "sort-descending": "Sort descending", + "sort-ascending": "Sort ascending", + "sort-initial": "Sort initial", + "sort-rowspan-error": "This page contains a table with a rowspan attribute that spans more rows than the table actually has. You can fix this by editing the page.", + "nstab-main": "Page", + "nstab-talk": "", + "nstab-user": "{{GENDER:$1|User page}}", + "nstab-media": "Media page", + "nstab-special": "Special page", + "nstab-project": "Project page", + "nstab-image": "File", + "nstab-mediawiki": "Message", + "nstab-template": "Template", + "nstab-help": "Help page", + "nstab-category": "Category", + "mainpage-nstab": "Main page", + "nosuchaction": "No such action", + "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.", + "nosuchspecialpage": "No such special page", + "nospecialpagetext": "You have requested an invalid special page.\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].", + "error": "Error", + "databaseerror": "Database error", + "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.", + "databaseerror-textcl": "A database query error has occurred.", + "databaseerror-query": "Query: $1", + "databaseerror-function": "Function: $1", + "databaseerror-error": "Error: $1", + "transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.", + "transaction-max-statement-time-exceeded": "To avoid creating high database load, this query was aborted because the duration exceeded the limit.\nIf you are reading many items at once, try doing multiple smaller operations instead.", + "laggedreplicamode": "Warning: Page may not contain recent updates.", + "readonly": "Database locked", + "enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released", + "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe system administrator who locked it offered this explanation: $1", + "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.", + "missingarticle-rev": "(revision#: $1)", + "missingarticle-diff": "(Diff: $1, $2)", + "readonly_lag": "The database has been automatically locked while the replica database servers catch up to the primary", + "nonwrite-api-promise-error": "The 'Promise-Non-Write-API-Action' HTTP header was sent but the request was not an API request.", + "timeouterror": "Server timed out", + "timeouterror-text": "The maximum request time of $1 {{PLURAL:$1|second|seconds}} was exceeded.", + "internalerror": "Internal error", + "internalerror_info": "Internal error: $1", + "internalerror-fatal-exception": "Fatal exception of type \"$1\"", + "filecopyerror": "Could not copy file \"$1\" to \"$2\".", + "filerenameerror": "Could not rename file \"$1\" to \"$2\".", + "filedeleteerror": "Could not delete file \"$1\".", + "directorycreateerror": "Could not create directory \"$1\".", + "directoryreadonlyerror": "Directory \"$1\" is read-only.", + "filenotfound": "Could not find file \"$1\".", + "unexpected": "Unexpected value: \"$1\"=\"$2\".", + "formerror": "Error: Could not submit form.", + "badarticleerror": "This action cannot be performed on this page.", + "cannotdelete": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.", + "cannotdelete-title": "Cannot delete page \"$1\"", + "delete-scheduled": "The page \"$1\" is scheduled for deletion.\nPlease be patient.", + "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.", + "no-null-revision": "Could not create new null revision for page \"$1\"", + "badtitle": "Bad title", + "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.", + "title-invalid": "The requested page title is invalid", + "title-invalid-empty": "The requested page title is empty or contains only the name of a namespace.", + "title-invalid-utf8": "The requested page title contains an invalid UTF-8 sequence.", + "title-invalid-interwiki": "The requested page title contains an interwiki link which cannot be used in titles.", + "title-invalid-talk-namespace": "The requested page title refers to a talk page that cannot exist.", + "title-invalid-characters": "The requested page title contains invalid characters: \"$1\".", + "title-invalid-relative": "Title has relative path. Relative page titles (./, ../) are invalid, because they will often be unreachable when handled by user's browser.", + "title-invalid-magic-tilde": "The requested page title contains invalid magic tilde sequence (~~~).", + "title-invalid-too-long": "The requested page title is too long. It must be no longer than $1 {{PLURAL:$1|byte|bytes}} in UTF-8 encoding.", + "title-invalid-leading-colon": "The requested page title contains an invalid colon at the beginning.", + "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.", + "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.", + "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.", + "querypage-updates-periodical": "Updates for this page are run periodically.", + "viewsource": "View source", + "skin-action-viewsource": "View source", + "viewsource-title": "View source for $1", + "actionthrottled": "Action throttled", + "actionthrottledtext": "As an anti-abuse measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.", + "protectedpagetext": "This page has been protected to prevent editing or other actions.", + "viewsourcetext": "You can view and copy the source of this page.", + "viewyourtext": "You can view and copy the source of your edits to this page.", + "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.", + "editinginterface": "Warning: You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.", + "translateinterface": "To add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.", + "cascadeprotected": "This page has been protected from editing because it is transcluded in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2", + "namespaceprotected": "You do not have permission to edit pages in the $1 namespace.", + "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.", + "customjsonprotected": "You do not have permission to edit this JSON page because it contains another user's personal settings.", + "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.", + "sitecssprotected": "You do not have permission to edit this CSS page because it may affect all visitors.", + "sitejsonprotected": "You do not have permission to edit this JSON page because it may affect all visitors.", + "sitejsprotected": "You do not have permission to edit this JavaScript page because it may affect all visitors.", + "siterawhtmlprotected": "You do not have permission to edit this page because it contains raw HTML which can be modified to affect all visitors.", + "mycustomcssprotected": "You do not have permission to edit this CSS page.", + "mycustomjsonprotected": "You do not have permission to edit this JSON page.", + "mycustomjsprotected": "You do not have permission to edit this JavaScript page.", + "myprivateinfoprotected": "You do not have permission to edit your private information.", + "mypreferencesprotected": "You do not have permission to edit your preferences.", + "ns-specialprotected": "Special pages cannot be edited.", + "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is $2.", + "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe system administrator who locked it offered this explanation: \"$3\".", + "invalidtitle": "Invalid title", + "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"", + "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"", + "exception-nologin": "Not logged in", + "exception-nologin-text": "Please log in to be able to access this page or action.", + "exception-nologin-text-manual": "Please $1 to be able to access this page or action.", + "virus-badscanner": "Bad configuration: Unknown virus scanner: $1", + "virus-scanfailed": "scan failed (code $1)", + "virus-unknownscanner": "unknown antivirus:", + "logouttext": "You are now logged out.\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.", + "logging-out-notify": "You are being logged out, please wait.", + "logout-failed": "Cannot log out now: $1", + "cannotlogoutnow-title": "Cannot log out now", + "cannotlogoutnow-text": "Logging out is not possible when using $1.", + "welcomeuser": "Welcome, $1!", + "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.", + "yourname": "Username:", + "userlogin-yourname": "Username", + "userlogin-yourname-ph": "Enter your username", + "createacct-another-username-ph": "Enter the username", + "createacct-helpusername": "", + "createacct-username-help": "", + "yourpassword": "Password:", + "prefs-help-yourpassword": "Account recovery is enabled. See $1 for more settings.", + "userlogin-yourpassword": "Password", + "userlogin-yourpassword-ph": "Enter your password", + "createacct-yourpassword-ph": "Enter a password", + "yourpasswordagain": "Retype password:", + "createacct-useuniquepass": "It is recommended to use a unique password that you are not using on any other website.", + "createacct-yourpasswordagain": "Confirm password", + "createacct-yourpasswordagain-ph": "Enter password again", + "userlogin-remembermypassword": "Keep me logged in", + "userlogin-signwithsecure": "Use secure connection", + "cannotlogin-title": "Cannot log in", + "cannotlogin-text": "Logging in is not possible.", + "cannotloginnow-title": "Cannot log in now", + "cannotloginnow-text": "Logging in is not possible when using $1.", + "cannotcreateaccount-title": "Cannot create accounts", + "cannotcreateaccount-text": "Direct account creation is not enabled on this wiki.", + "yourdomainname": "Your domain:", + "password-change-forbidden": "You cannot change passwords on this wiki.", + "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.", + "login": "Log in", + "login-security": "Verify your identity", + "nav-login-createaccount": "Log in / create account", + "loginprompt": "", + "logout": "Log out", + "userlogout": "Log out", + "userlogout-summary": "", + "notloggedin": "Not logged in", + "userlogin-noaccount": "Don't have an account?", + "userlogin-joinproject": "Join {{SITENAME}}", + "createaccount": "Create account", + "userlogin-resetpassword-link": "Forgot your password?", + "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in", + "userlogin-helplink2": "Help with logging in", + "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.", + "userlogin-reauth": "You must log in again to verify that you are {{GENDER:$1|$1}}.", + "userlogin-createanother": "Create another account", + "createacct-emailrequired": "Email address", + "createacct-emailoptional": "Email address (optional)", + "createacct-email-ph": "Enter your email address", + "createacct-another-email-ph": "Enter email address", + "createaccountmail": "Use a temporary random password and send it to the specified email address", + "createaccountmail-help": "Can be used to create account for another person without learning the password.", + "createacct-realname": "Real name (optional)", + "createacct-reason": "Reason (publicly logged)", + "createacct-reason-ph": "Why you are creating another account", + "createacct-reason-help": "Message shown in the account creation log", + "createacct-reason-confirm": "The reason you entered was an email address. If this is intended, please click \"create account\" again", + "createacct-imgcaptcha-help": "", + "createacct-submit": "Create your account", + "createacct-another-submit": "Create account", + "createacct-continue-submit": "Continue account creation", + "createacct-another-continue-submit": "Continue account creation", + "createacct-benefit-heading": "{{SITENAME}} is made by people like you.", + "createacct-benefit-icon1": "icon-edits", + "createacct-benefit-head1": "{{NUMBEROFEDITS}}", + "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}", + "createacct-benefit-icon2": "icon-pages", + "createacct-benefit-head2": "{{NUMBEROFARTICLES}}", + "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}", + "createacct-benefit-icon3": "icon-contributors", + "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}", + "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}", + "badretype": "The passwords you entered do not match.", + "usernameinprogress": "An account creation for this username is already in progress.\nPlease wait.", + "userexists": "Username entered already in use.\nPlease choose a different name.", + "createacct-normalization": "Your username will be adjusted to \"$2\" due to technical restrictions.", + "loginerror": "Login error", + "createacct-error": "Account creation error", + "createaccounterror": "Could not create account: $1", + "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.", + "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.", + "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.", + "nocookiesforlogin": "{{int:nocookieslogin}}", + "createacct-loginerror": "The account was successfully created but you could not be logged in automatically. Please proceed to [[Special:UserLogin|manual login]].", + "createacct-temp-warning": "The edits you made with your temporary account will not be carried over to your permanent one.", + "noname": "You have not specified a valid username.", + "loginsuccesstitle": "Logged in", + "loginsuccess": "You are now logged in to {{SITENAME}} as \"$1\".", + "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case-sensitive.\nCheck your spelling, or [[Special:CreateAccount|create a new account]].", + "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.", + "nouserspecified": "You have to specify a username.", + "login-userblocked": "This user is blocked. Login not allowed.", + "wrongpassword": "Incorrect username or password entered.\nPlease try again.", + "wrongpasswordempty": "Password entered was blank.\nPlease try again.", + "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.", + "passwordtoolong": "Passwords cannot be longer than {{PLURAL:$1|1 character|$1 characters}}.", + "passwordincommonlist": "The password entered is in a list of very commonly used passwords. Please choose a more unique password.", + "password-name-match": "Your password must be different from your username.", + "password-substring-username-match": "Your password must not appear within your username.", + "password-login-forbidden": "The use of this username and password has been forbidden.", + "mailmypassword": "Reset password", + "passwordremindertitle": "New temporary password for {{SITENAME}}", + "passwordremindertext": "Someone (from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.", + "noemail": "There is no email address recorded for user \"$1\".", + "noemailcreate": "You need to provide a valid email address.", + "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.", + "blocked-mailpassword": "Your IP address is blocked from editing. To prevent abuse, it is not allowed to use password recovery from this IP address.", + "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.", + "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.", + "signupstart": "", + "signupend": "", + "signupend-https": "", + "mailerror": "Error sending mail: $1", + "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last $2, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.", + "emailauthenticated": "Your email address was confirmed on $2 at $3.", + "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.", + "noemailprefs": "Specify an email address in your preferences for these features to work.", + "emailconfirmlink": "Confirm your email address", + "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.", + "cannotchangeemail": "Account email addresses cannot be changed on this wiki.", + "emaildisabled": "This site cannot send emails.", + "emailsender": "{{SITENAME}}", + "accountcreated": "Account created", + "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.", + "createaccount-title": "Account creation for {{SITENAME}}", + "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.", + "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.", + "login-abort-generic": "Your login failed - Aborted", + "login-migrated-generic": "Your account has been migrated, and your username no longer exist on this wiki.", + "loginlanguagelabel": "Language: $1", + "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl", + "suspicious-userlogout": "Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.", + "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.", + "pt-login": "Log in", + "pt-login-button": "Log in", + "pt-login-continue-button": "Continue login", + "pt-createaccount": "Create account", + "pt-userlogout": "Log out", + "pear-mail-error": "$1", + "php-mail-error": "$1", + "php-mail-error-unknown": "Unknown error in PHP's mail() function.", + "user-mail-no-addy": "Tried to send email without an email address.", + "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.", + "changepassword": "Change password", + "changepassword-summary": "", + "resetpass_announce": "To finish logging in, you must set a new password.", + "resetpass_text": "", + "resetpass_header": "Change account password", + "oldpassword": "Old password:", + "newpassword": "New password:", + "retypenew": "Retype new password:", + "resetpass_submit": "Set password and log in", + "changepassword-success": "Your password has been changed!", + "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.", + "botpasswords": "Bot passwords", + "botpasswords-summary": "Bot passwords allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.", + "botpasswords-disabled": "Bot passwords are disabled.", + "botpasswords-no-central-id": "To use bot passwords, you must be logged in to a centralized account.", + "botpasswords-existing": "Existing bot passwords", + "botpasswords-createnew": "Create a new bot password", + "botpasswords-editexisting": "Edit an existing bot password", + "botpasswords-label-needsreset": "(password needs reset)", + "botpasswords-label-appid": "Bot name:", + "botpasswords-label-create": "Create", + "botpasswords-label-update": "Update", + "botpasswords-label-cancel": "Cancel", + "botpasswords-label-delete": "Delete", + "botpasswords-label-resetpassword": "Reset the password", + "botpasswords-label-grants": "Applicable grants:", + "botpasswords-help-grants": "Grants allow access to rights already held by your user account. Enabling a grant here does not provide access to any rights that your user account would not otherwise have. See the [[Special:ListGrants|table of grants]] for more information.", + "botpasswords-label-grants-column": "Granted", + "botpasswords-bad-appid": "The bot name \"$1\" is not valid.", + "botpasswords-toolong-restrictions": "There are too many IP addresses or ranges entered.", + "botpasswords-toolong-grants": "There are too many grants selected.", + "botpasswords-insert-failed": "Failed to add bot name \"$1\". Was it already added?", + "botpasswords-update-failed": "Failed to update bot name \"$1\". Was it deleted?", + "botpasswords-created-title": "Bot password created", + "botpasswords-created-body": "The bot password for bot name \"$1\" of {{GENDER:$2|user}} \"$2\" was created.", + "botpasswords-updated-title": "Bot password updated", + "botpasswords-updated-body": "The bot password for bot name \"$1\" of {{GENDER:$2|user}} \"$2\" was updated.", + "botpasswords-deleted-title": "Bot password deleted", + "botpasswords-deleted-body": "The bot password for bot name \"$1\" of {{GENDER:$2|user}} \"$2\" was deleted.", + "botpasswords-newpassword": "The new password to log in with $1 is $2. Please record this for future reference.
    (For old bots which require the login name to be the same as the eventual username, you can also use $3 as username and $4 as password.)", + "botpasswords-no-provider": "BotPasswordsSessionProvider is not available.", + "botpasswords-restriction-failed": "Bot password restrictions prevent this login.", + "botpasswords-invalid-name": "The username specified does not contain the bot password separator (\"$1\").", + "botpasswords-not-exist": "User \"$1\" does not have a bot password named \"$2\".", + "botpasswords-needs-reset": "The bot password for bot name \"$2\" of {{GENDER:$1|user}} \"$1\" must be reset.", + "botpasswords-locked": "You cannot login with a bot password as your account is locked.", + "resetpass_forbidden": "Passwords cannot be changed", + "resetpass_forbidden-reason": "Passwords cannot be changed: $1", + "resetpass-no-info": "You must be logged in to access this page directly.", + "resetpass-submit-loggedin": "Change password", + "resetpass-submit-cancel": "Cancel", + "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already changed your password or requested a new temporary password.", + "resetpass-recycled": "Please change your password to something other than your current password.", + "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:", + "resetpass-temp-password": "Temporary password:", + "resetpass-abort-generic": "Password change has been aborted by an extension.", + "resetpass-expired": "Your password has expired. Please set a new password to log in.", + "resetpass-expired-soft": "Your password has expired and needs to be changed. Please choose a new password now, or click \"{{int:authprovider-resetpass-skip-label}}\" to change it later.", + "resetpass-validity": "Your password is not valid: $1\n\nPlease set a new password to log in.", + "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:authprovider-resetpass-skip-label}}\" to change it later.", + "passwordreset": "Reset password", + "passwordreset-text-one": "Complete this form to receive a temporary password via email.", + "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}", + "passwordreset-disabled": "Password resets have been disabled on this wiki.", + "passwordreset-emaildisabled": "Email features have been disabled on this wiki.", + "passwordreset-username": "Username:", + "passwordreset-domain": "Domain:", + "passwordreset-email": "Email address:", + "passwordreset-emailtitle": "Account details on {{SITENAME}}", + "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.", + "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.", + "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2", + "passwordreset-success": "You have requested a password reset.", + "passwordreset-success-details-generic": "If the information submitted is valid, a password reset email will be sent. If you haven't received an email, we recommend that you visit the [[mw:Special:MyLanguage/Help:Reset_password|reset password help page]] or try again later. You can only request a limited number of password resets within a short period of time. Only one password reset email will be sent per valid account every {{PLURAL:$1|hour|$1 hours}} in order to prevent abuse.", + "passwordreset-success-info": "The details you submitted are: $1", + "passwordreset-emailtext-require-email": "However, if you did not generate this request and want to prevent unsolicited\nemails, you may want to update your email options at\n$1.\nYou can require both username and email address to generate password reset\nemails. This may reduce the number of such incidents.", + "passwordreset-nocaller": "A caller must be provided", + "passwordreset-nosuchcaller": "Caller does not exist: $1", + "passwordreset-ignored": "The password reset was not handled. Maybe no provider was configured?", + "passwordreset-nodata": "Neither a username nor an email address was supplied", + "changeemail": "Change or remove email address", + "changeemail-summary": "", + "changeemail-header": "Complete this form to change your email address. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.", + "changeemail-no-info": "You must be logged in to access this page directly.", + "changeemail-oldemail": "Current email address:", + "changeemail-newemail": "New email address:", + "changeemail-newemail-help": "This field should be left blank if you want to remove your email address. You will not be able to reset a forgotten password and will not receive emails from this wiki if the email address is removed.", + "changeemail-none": "(none)", + "changeemail-password": "Your {{SITENAME}} password:", + "changeemail-submit": "Change email", + "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.", + "changeemail-nochange": "Please enter a different new email address.", + "changeemail-maxlength": "Your email address should have at most 255 characters.", + "resettokens": "Reset tokens", + "resettokens-summary": "", + "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.", + "resettokens-no-tokens": "There are no tokens to reset.", + "resettokens-tokens": "Tokens:", + "resettokens-token-label": "$1 (current value: $2)", + "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]", + "resettokens-done": "Tokens reset.", + "resettokens-resetbutton": "Reset selected tokens", + "sig-text": "--$1", + "summary": "Summary:", + "subject": "Subject:", + "minoredit": "This is a minor edit", + "watchthis": "Watch this page", + "savearticle": "Save page", + "savechanges": "Save changes", + "publishpage": "Publish page", + "publishchanges": "Publish changes", + "savearticle-start": "Save page…", + "savechanges-start": "Save changes…", + "publishpage-start": "Publish page…", + "publishchanges-start": "Publish changes…", + "preview": "Preview", + "showpreview": "Show preview", + "showdiff": "Show changes", + "blankarticle": "Warning: The page you are creating is blank.\nIf you click \"$1\" again, the page will be created without any content.", + "anoneditwarning": "Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you [$1 log in] or [$2 create an account], your edits will be attributed to your username, along with other benefits.", + "autocreate-edit-warning": "Warning: You are not logged in. Your edit will be attributed to an auto-generated name by adding a cookie to your browser. Your IP address will be visible to trusted users. If you [$1 log in] or [$2 create an account], your edits will be attributed to a name you choose, along with other benefits.", + "anonpreviewwarning": "You are not logged in. Publishing will record your IP address in this page's edit history.", + "autocreate-preview-warning": "You are not logged in. Your edit will be attributed to an auto-generated name and your IP address will be visible to administrators.", + "missingsummary": "Reminder: You have not provided an edit summary.\nIf you click \"$1\" again, your edit will be published without one.", + "selfredirect": "Warning: You are redirecting this page to itself.\nYou may have specified the wrong target for the redirect, or you may be editing the wrong page.\nIf you click \"$1\" again, the redirect will be created anyway.", + "missingcommenttext": "Please enter a comment.", + "missingcommentheader": "Reminder: You have not provided a subject for this comment.\nIf you click \"$1\" again, your edit will be published without one.", + "summary-preview": "Preview of edit summary:", + "previewerrortext": "An error occurred while attempting to preview your changes.", + "blockedtitle": "User is blocked", + "blockedtext-partial": "Your username or IP address is blocked from doing this. You may still be able to do other things on this site, such as editing certain pages. You can view the full block details at [[Special:MyContributions|account contributions]].\n\nThe block was made by $1.\n\nThe reason given is $2.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n* Block ID #$5", + "blockedtext": "Your username or IP address has been blocked.\n\nThe block was made by $1.\nThe reason given is $2.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou can use the \"{{int:emailuser}}\" feature if a valid email address is specified in your [[Special:Preferences|preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.", + "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:$2\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nYou can use the \"{{int:emailuser}}\" feature if a valid email address is specified in your [[Special:Preferences|preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.", + "systemblockedtext": "Your username or IP address has been automatically blocked by MediaWiki.\nThe reason given is:\n\n:$2\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.", + "blockednoreason": "no reason given", + "blockedtext-composite": "Your username or IP address has been blocked.\n\nThe reason given is:\n\n:$2.\n\n* Start of block: $8\n* Expiration of longest block: $6\n\n* $5\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.", + "blockedtext-composite-ids": "Relevant block IDs: $1 (your IP address may also appear in a blocklist)", + "blockedtext-composite-no-ids": "Your IP address appears in multiple blocklists", + "blockedtext-composite-reason": "There are multiple blocks against your account and/or IP address", + "whitelistedittext": "Please $1 to edit pages.", + "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].", + "nosuchsectiontitle": "Cannot find section", + "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.", + "loginreqtitle": "Login required", + "loginreqlink": "log in", + "loginreqpagetext": "Please $1 to view other pages.", + "accmailtitle": "Password sent", + "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the [[Special:ChangePassword|change password]] page upon logging in.", + "newarticle": "(New)", + "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's back button.", + "newarticletextanon": "{{int:newarticletext|$1}}", + "talkpagetext": "", + "anontalkpagetext": "----\nThis is the discussion page for an anonymous user who has not created an account yet, or who does not use it.\nWe therefore have to use the numerical IP address to identify them.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:CreateAccount|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.", + "noarticletext": "Logos Wiki Demo.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page].", + "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], but you do not have permission to create this page.", + "noarticletextanon": "{{int:noarticletext}}", + "missing-revision-permission": "The revision #$1 belongs to a deleted page. You can [{{fullurl:{{#Special:Undelete}}|target=$3×tamp=$2&diff=prev}} view it]; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page=$3}} deletion log].", + "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].", + "missing-revision-content": "The content of revision #$1 of the page named \"$2\" could not be loaded.", + "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.", + "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.", + "blocked-notice-logextract": "This {{GENDER:$1|user}} is currently blocked.\nThe latest block log entry is provided below for reference:", + "clearyourcache": "Note: After publishing, you may have to bypass your browser's cache to see the changes.\n* Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)\n* Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)\n* Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5\n* Opera: Press Ctrl-F5.", + "usercssyoucanpreview": "Tip: Use the \"{{int:showpreview}}\" button to test your new CSS before publishing.", + "userjsonyoucanpreview": "Tip: Use the \"{{int:showpreview}}\" button to test your new JSON before publishing.", + "userjsyoucanpreview": "Tip: Use the \"{{int:showpreview}}\" button to test your new JavaScript before publishing.", + "usercsspreview": "Remember that you are only previewing your user CSS.\nIt has not yet been published!", + "userjsonpreview": "Remember that you are only testing/previewing your user JSON config.\nIt has not yet been published!", + "userjspreview": "Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been published!", + "sitecsspreview": "Remember that you are only previewing this CSS.\nIt has not yet been published!", + "sitejsonpreview": "Remember that you are only previewing this JSON config.\nIt has not yet been published!", + "sitejspreview": "Remember that you are only previewing this JavaScript code.\nIt has not yet been published!", + "userinvalidconfigtitle": "Warning: There is no skin \"$1\".\nCustom .css, .json, and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.", + "updated": "(Updated)", + "note": "Note:", + "previewnote": "Remember that this is only a preview.\nYour changes have not yet been published!", + "continue-editing": "Go to editing area", + "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to publish it.", + "session_fail_preview": "Sorry! We could not process your edit due to a loss of session data.\n\nYou might have been logged out. Please verify that you're still logged in and try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.", + "session_fail_preview_html": "Sorry! We could not process your edit due to a loss of session data.\n\nBecause {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.\n\nIf this is a legitimate edit attempt, please try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.", + "edit_form_incomplete": "Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.", + "editing": "Editing $1", + "edit-textarea-aria-label": "Wikitext source editor", + "creating": "Creating $1", + "editingsection": "Editing $1 (section)", + "editingcomment": "Editing $1 (new section)", + "editconflict": "Edit conflict: $1", + "editnotice-notext": "-", + "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\nOnly the text in the upper text area will be published when you press \"$1\".", + "yourtext": "Your text", + "storedversion": "Stored revision", + "editingold": "Warning: You are editing an out-of-date revision of this page.\nIf you publish it, any changes made since this revision will be lost.", + "unicode-support-fail": "It appears that your browser does not support Unicode. It is required to edit pages, so your edit was not published.", + "yourdiff": "Differences", + "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
    \nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\nDo not submit copyrighted work without permission!", + "copyrightwarning2": "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.
    \nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\nDo not submit copyrighted work without permission!", + "editpage-head-copy-warn": "-", + "editpage-tos-summary": "-", + "editpage-cannot-use-custom-model": "The content model of this page cannot be changed.", + "longpage-hint": "-", + "longpageerror": "Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.\nIt cannot be published.", + "readonlywarning": "Warning: The database has been locked for maintenance, so you will not be able to publish your edits right now.\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe system administrator who locked it offered this explanation: $1", + "protectedpagewarning": "Warning: This page has been protected so that only users with administrator privileges can edit it.\nThe latest log entry is provided below for reference:", + "semiprotectedpagewarning": "Note: This page has been protected so that only autoconfirmed users can edit it.\nThe latest log entry is provided below for reference:", + "cascadeprotectedwarning": "Warning: This page has been protected so that only users with [[Special:ListGroupRights|specific rights]] can edit it because it is transcluded in the following cascade-protected {{PLURAL:$1|page|pages}}:", + "titleprotectedwarning": "Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.\nThe latest log entry is provided below for reference:", + "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:", + "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:", + "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:", + "template-protected": "(protected)", + "template-semiprotected": "(semi-protected)", + "hiddencategories": "This page is a member of {{PLURAL:$1|a hidden category|$1 hidden categories}}:", + "edittools": "", + "edittools-upload": "-", + "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].", + "nocreate-loggedin": "You do not have permission to create new pages.", + "sectioneditnotsupported-title": "Section editing not supported", + "sectioneditnotsupported-text": "Section editing is not supported in this page or is disabled for this view.", + "modeleditnotsupported-title": "Editing not supported", + "modeleditnotsupported-text": "Editing is not supported for content model $1.", + "permissionserrors": "Permission error", + "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:", + "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:", + "contentmodelediterror": "You cannot edit this revision because its content model is $1, which differs from the current content model of the page $2.", + "recreate-moveddeleted-warn": "Warning: You are recreating a page that was previously deleted.\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:", + "moveddeleted-notice": "This page does not exist.\nThe deletion, protection, and move log for the page are provided below for reference.", + "moveddeleted-notice-recent": "Sorry, this page was recently deleted (within the last 24 hours).\nThe deletion, protection, and move log for the page are provided below for reference.", + "log-fulllog": "View full log", + "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.", + "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.", + "edit-conflict": "Edit conflict.", + "edit-no-change": "Your edit was ignored because no change was made to the text.", + "edit-slots-cannot-add": "The following {{PLURAL:$1|slot is|slots are}} not supported here: $2.", + "edit-slots-cannot-remove": "The following {{PLURAL:$1|slot is|slots are}} required and cannot be removed: $2.", + "edit-slots-missing": "The following {{PLURAL:$1|slot is|slots are}} missing: $2.", + "postedit-confirmation-created": "The page has been created.", + "postedit-confirmation-restored": "The page has been restored.", + "postedit-confirmation-saved": "Your edit was saved.", + "postedit-confirmation-published": "Your edit was published.", + "postedit-temp-created-label": "Temporary account", + "postedit-temp-created": "An auto-generated account has been created for you by adding a cookie to your browser. To pick a name of your choice and get more features, consider [$1 creating an account].", + "edit-already-exists": "Could not create a new page.\nIt already exists.", + "addsection-preload": "", + "addsection-editintro": "", + "defaultmessagetext": "Default message text", + "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3", + "invalid-content-data": "Invalid content data", + "invalid-json-data": "Invalid JSON: $1", + "content-not-allowed-here": "\"$1\" content is not allowed on page [[:$2]] in slot \"$3\"", + "confirmleave-warning": "Leaving this page may cause you to lose any changes you have made.", + "editpage-invalidcontentmodel-title": "Content model not supported", + "editpage-invalidcontentmodel-text": "The content model \"$1\" is not supported.", + "editpage-notsupportedcontentformat-title": "Content format not supported", + "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.", + "slot-name-main": "Main", + "content-model-wikitext": "wikitext", + "content-model-text": "plain text", + "content-model-javascript": "JavaScript", + "content-model-css": "CSS", + "content-model-json": "JSON", + "content-json-empty-object": "Empty object", + "content-json-empty-array": "Empty array", + "unsupported-content-model": "Warning: Content model $1 is not supported on this wiki.", + "unsupported-content-diff": "Diffs are not supported for content model $1.", + "unsupported-content-diff2": "Diffs between the content models $1 and $2 are not supported on this wiki.", + "duplicate-args-warning": "Warning: [[:$1]] is calling [[:$2]] with more than one value for the \"$3\" parameter. Only the last value provided will be used.", + "duplicate-args-category": "Pages using duplicate arguments in template calls", + "duplicate-args-category-desc": "The page contains template calls that use duplicates of arguments, such as {{foo|bar=1|bar=2}} or {{foo|bar|1=baz}}.", + "expensive-parserfunction-warning": "Warning: This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.", + "expensive-parserfunction-category": "Pages with too many expensive parser function calls", + "post-expand-template-inclusion-warning": "Warning: Template include size is too large.\nSome templates will not be included.", + "post-expand-template-inclusion-category": "Pages where template include size is exceeded", + "post-expand-template-argument-warning": "Warning: This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.", + "post-expand-template-argument-category": "Pages containing omitted template arguments", + "template-equals-category": "Pages which use = as a template", + "template-equals-category-desc": "The page contains {{=}} but on this wiki that does not expand to =. This usage is deprecated; a future MediaWiki version will implement {{=}} as a parser function.", + "template-equals-warning": "Warning: This page uses {{=}} but on this wiki that does not expand to =. This usage is deprecated; a future MediaWiki version will implement {{=}} as a parser function.", + "parser-template-loop-warning": "Template loop detected: [[$1]]", + "template-loop-category": "Pages with template loops", + "template-loop-category-desc": "The page contains a template loop, ie. a template which calls itself recursively.", + "template-loop-warning": "Warning: This page calls [[:$1]] which causes a template loop (an infinite recursive call).", + "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)", + "language-converter-depth-warning": "Language converter depth limit exceeded ($1)", + "node-count-exceeded-category": "Pages where node count is exceeded", + "node-count-exceeded-category-desc": "The page exceeds the maximum node count.", + "node-count-exceeded-warning": "Page exceeded the node count", + "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded", + "expansion-depth-exceeded-category-desc": "The page exceeds the maximum expansion depth.", + "expansion-depth-exceeded-warning": "Page exceeded the expansion depth", + "parser-unstrip-loop-warning": "Unstrip loop detected", + "unstrip-depth-warning": "Unstrip depth limit exceeded ($1)", + "unstrip-depth-category": "Pages where the unstrip depth limit is exceeded", + "unstrip-depth-category-desc": "The page exceeds the unstrip depth limit.", + "unstrip-size-warning": "Unstrip size limit exceeded ($1)", + "unstrip-size-category": "Pages where the unstrip size limit is exceeded", + "unstrip-size-category-desc": "The page exceeds the unstrip size limit.", + "converter-manual-rule-error": "Error detected in manual language conversion rule", + "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.", + "undo-failure": "The edit could not be undone due to conflicting intermediate edits.", + "undo-main-slot-only": "The edit could not be undone because it involves content outside the main slot.", + "undo-norev": "The edit could not be undone because it does not exist or was deleted.", + "undo-nochange": "The edit appears to have already been undone.", + "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])", + "undo-summary-anon": "Undo revision $1 by [[Special:Contributions/$2|$2]]", + "undo-summary-import": "Undo imported revision $1 by user [[:$2|$3]]", + "undo-summary-import2": "Undo imported revision $1 by user $2", + "undo-summary-username-hidden": "Undo revision $1 by a hidden user", + "createaccount-hook-aborted": "$1", + "viewpagelogs": "View logs for this page", + "viewpagelogs-lowercase": "view logs for this page", + "nohistory": "There is no edit history for this page.", + "currentrev": "Latest revision", + "currentrev-asof": "Latest revision as of $1", + "revisionasof": "Revision as of $1", + "revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7", + "revision-info-current": "-", + "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)", + "previousrevision": "← Older revision", + "nextrevision": "Newer revision →", + "currentrevisionlink": "Latest revision", + "cur": "cur", + "tooltip-cur": "Difference with latest revision", + "next": "next", + "last": "prev", + "tooltip-last": "Difference with preceding revision", + "page_first": "first", + "page_last": "last", + "histlegend": "Diff selection: Mark the radio buttons of the revisions to compare and hit enter or the button at the bottom.
    \nLegend: ({{int:cur}}) = difference with latest revision, ({{int:last}}) = difference with preceding revision, {{int:minoreditletter}} = minor edit.", + "history-fieldset-title": "Filter revisions", + "history-show-deleted": "Revision deleted only", + "history_copyright": "-", + "histfirst": "oldest", + "histlast": "newest", + "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})", + "historyempty": "empty", + "history-feed-title": "Revision history", + "history-feed-description": "Revision history for this page on the wiki", + "history-feed-item-nocomment": "$1 at $2", + "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.", + "history-edit-tags": "Edit tags of selected revisions", + "history-empty": "No matching revisions were found.", + "rev-deleted-comment": "(edit summary removed)", + "rev-deleted-user": "(username removed)", + "rev-deleted-event": "(log details removed)", + "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]", + "rev-deleted-text-permission": "This page revision has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page=$1}} deletion log].", + "rev-suppressed-text": "This page revision has been suppressed.", + "rev-suppressed-text-permission": "This page revision has been suppressed.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page=$1}} suppression log].", + "rev-deleted-text-unhide": "This page revision has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.", + "rev-suppressed-text-unhide": "This page revision has been suppressed.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.", + "rev-deleted-text-view": "This page revision has been deleted.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page=$1}} deletion log].", + "rev-suppressed-text-view": "This page revision has been suppressed.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page=$1}} suppression log].", + "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].", + "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been suppressed.", + "rev-deleted-unhide-diff": "One of the revisions of this diff has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.", + "rev-suppressed-unhide-diff": "One of the revisions of this diff has been suppressed.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.", + "rev-deleted-diff-view": "One of the revisions of this diff has been deleted.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].", + "rev-suppressed-diff-view": "One of the revisions of this diff has been suppressed.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].", + "rev-delundel": "change visibility", + "rev-showdeleted": "show", + "revisiondelete": "Delete/undelete revisions", + "revdelete-nooldid-title": "Invalid target revision", + "revdelete-nooldid-text": "You have either not specified any target revision on which to perform this function, or the specified revision does not exist, or you are attempting to hide the current revision.", + "revdelete-no-file": "The file specified does not exist.", + "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"$1\" from $2 at $3?", + "revdelete-show-file-submit": "Yes", + "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:", + "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:", + "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:", + "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.", + "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.", + "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.", + "revdelete-text-others": "Other administrators will still be able to access the hidden content and to undelete it, unless additional restrictions are set.", + "revdelete-confirm": "Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].", + "revdelete-suppress-text": "Suppression should only be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: home addresses and telephone numbers, national identification numbers, etc.", + "revdelete-legend": "Set visibility restrictions", + "revdelete-hide-text": "Revision text", + "revdelete-hide-image": "Hide file content", + "revdelete-hide-name": "Hide target and parameters", + "revdelete-hide-comment": "Edit summary", + "revdelete-hide-user": "Editor's username/IP address", + "revdelete-hide-restricted": "Suppress data from administrators as well as others", + "revdelete-radio-same": "(do not change)", + "revdelete-radio-set": "Hidden", + "revdelete-radio-unset": "Visible", + "revdelete-suppress": "Suppress data from administrators as well as others", + "revdelete-unsuppress": "Remove restrictions on undeleted revisions", + "revdelete-log": "Reason:", + "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}", + "revdelete-success": "Revision visibility updated.", + "revdelete-failure": "Revision visibility could not be updated:\n$1", + "logdelete-success": "Log visibility set.", + "logdelete-failure": "Log visibility could not be set:\n$1", + "revdel-restore": "change visibility", + "pagehist": "Page history", + "deletedhist": "Deleted history", + "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.", + "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.", + "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.", + "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!", + "revdelete-no-change": "Warning: The item dated $2, $1 already had the requested visibility settings.", + "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease check the logs.", + "revdelete-only-restricted": "Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.", + "revdelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Inappropriate comment\n** Inappropriate username\n** Potentially libelous information", + "revdelete-reason-dropdown-suppress": "*Common suppress reasons\n** Inappropriate personal information", + "revdelete-otherreason": "Other/additional reason:", + "revdelete-reasonotherlist": "Other reason", + "revdelete-edit-reasonlist": "Edit delete reasons", + "revdelete-edit-reasonlist-suppress": "Edit suppress reasons", + "revdelete-offender": "Revision author:", + "suppressionlog": "Suppression log", + "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.", + "mergehistory": "Merge page histories", + "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.", + "mergehistory-box": "Merge revisions of two pages:", + "mergehistory-from": "Source page:", + "mergehistory-into": "Destination page:", + "mergehistory-list": "Mergeable edit history", + "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.", + "mergehistory-go": "Show mergeable edits", + "mergehistory-submit": "Merge revisions", + "mergehistory-empty": "No revisions can be merged.", + "mergehistory-done": "$4 {{PLURAL:$4|revision|revisions}} of $1 {{PLURAL:$4|was|were}} merged into [[:$2]].\n$3.", + "mergehistory-fail": "Unable to perform history merge. Please recheck the page and time parameters.", + "mergehistory-fail-bad-timestamp": "Timestamp is invalid.", + "mergehistory-fail-invalid-source": "Source page is invalid.", + "mergehistory-fail-invalid-dest": "Destination page is invalid.", + "mergehistory-fail-no-change": "History merge did not merge any revisions. Please recheck the page and time parameters.", + "mergehistory-fail-permission": "Insufficient permissions to merge history.", + "mergehistory-fail-self-merge": "Source and destination pages are the same.", + "mergehistory-fail-timestamps-overlap": "Source revisions overlap or come after destination revisions.", + "mergehistory-fail-toobig": "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.", + "mergehistory-warning-redirect-not-created": "", + "mergehistory-no-source": "Source page $1 does not exist.", + "mergehistory-no-destination": "Destination page $1 does not exist.", + "mergehistory-invalid-source": "Source page must be a valid title.", + "mergehistory-invalid-destination": "Destination page must be a valid title.", + "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]", + "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3", + "mergehistory-same-destination": "Source and destination pages cannot be the same", + "mergehistory-reason": "Reason:", + "mergehistory-source-deleted-reason": "Source page automatically deleted after history merge because its content model does not support redirects and no remaining revisions", + "mergehistory-source-deleted": "Additionally, [[:$1]] has been deleted because it no longer has any visible revisions and its content model does not support leaving redirects.", + "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6 $7", + "mergehistory-redirect-text": "", + "mergelog": "Merge log", + "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)", + "revertmerge": "Unmerge", + "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.", + "history-title": "$1: Revision history", + "difference-title": "$1: Difference between revisions", + "difference-title-multipage": "$1 and $2: Difference between pages", + "difference-multipage": "(Difference between pages)", + "lineno": "Line $1:", + "compareselectedversions": "Compare selected revisions", + "showhideselectedversions": "Change visibility of selected revisions", + "editundo": "undo", + "diff-empty": "(No difference)", + "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)", + "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)", + "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)", + "diff-paragraph-moved-tonew": "Paragraph was moved. Click to jump to new location.", + "diff-paragraph-moved-toold": "Paragraph was moved. Click to jump to old location.", + "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].", + "search-summary": "", + "searchresults": "Search results", + "search-filter-title-prefix": "Only searching in pages whose title starts with \"$1\"", + "search-filter-title-prefix-reset": "Search all pages", + "searchresults-title": "Search results for \"$1\"", + "titlematches": "Page title matches", + "textmatches": "Page text matches", + "notextmatches": "No page text matches", + "prevn": "previous {{PLURAL:$1|$1}}", + "nextn": "next {{PLURAL:$1|$1}}", + "prev-page": "previous page", + "next-page": "next page", + "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}", + "nextn-title": "Next $1 {{PLURAL:$1|result|results}}", + "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page", + "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)", + "searchmenu-exists": "There is a page named \"[[:$1]]\" on {{SITENAME}}. {{PLURAL:$2|0=|See also the other search results found.}}", + "searchmenu-new": "Create the page \"[[:$1]]\" on this wiki! {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}", + "searchmenu-new-nocreate": "", + "searchprofile-articles": "Content pages", + "searchprofile-images": "Multimedia", + "searchprofile-everything": "Everything", + "searchprofile-advanced": "Advanced", + "searchprofile-articles-tooltip": "Search in $1", + "searchprofile-images-tooltip": "Search for files", + "searchprofile-everything-tooltip": "Search all of content (including talk pages)", + "searchprofile-advanced-tooltip": "Search in custom namespaces", + "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})", + "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})", + "search-redirect": "(redirect from $1)", + "search-section": "(section $1)", + "search-category": "(category $1)", + "search-file-match": "(matches file content)", + "search-suggest": "Did you mean: $1", + "search-rewritten": "Showing results for $1. No results found for $2.", + "search-interwiki-resultset-link": "See all results", + "search-interwiki-custom": "", + "search-interwiki-more": "(more)", + "search-interwiki-more-results": "more results", + "search-relatedarticle": "Related", + "search-invalid-sort-order": "Sort order of $1 is unrecognized, default sorting will be applied. Valid sort orders are: $2", + "search-unknown-profile": "Search profile of $1 is unrecognized, default search profile will be applied.", + "searchrelated": "related", + "searchall": "all", + "showingresults": "Showing below up to {{PLURAL:$1|1 result|$1 results}} starting with #$2.", + "showingresultsinrange": "Showing below up to {{PLURAL:$1|1 result|$1 results}} in range #$2 to #$3.", + "search-showingresults": "{{PLURAL:$4|Result $1 of $3|Results $1 – $2 of $3}}", + "search-nonefound": "There were no results matching the query.", + "search-nonefound-thiswiki": "There were no results matching the query in this site.", + "powersearch-legend": "Advanced search", + "powersearch-ns": "Search in namespaces:", + "powersearch-togglelabel": "Check:", + "powersearch-toggleall": "All", + "powersearch-togglenone": "None", + "powersearch-remember": "Remember selection for future searches", + "search-external": "External search", + "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.", + "googlesearch": "
    \n\t\n\t\n\t\n\t\n\n\t\n\t\n
    \n\t\n\t\n
    \n
    ", + "search-error": "An error has occurred while searching: $1", + "search-warning": "A warning has occurred while searching: $1", + "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})", + "preferences": "Preferences", + "preferences-summary": "", + "mypreferences": "Preferences", + "prefs-edits": "Number of edits:", + "prefsnologintext2": "Please log in to change your preferences.", + "prefs-skin": "Skin", + "prefs-skin-prefs": "Skin preferences", + "prefs-skin-responsive": "Enable responsive mode", + "prefs-help-skin-responsive": "Adapt layout to screen size on mobile.", + "skin-preview": "Preview", + "datedefault": "No preference", + "prefs-labs": "Labs features", + "prefs-user-pages": "User pages", + "prefs-personal": "User profile", + "prefs-rc": "Recent changes", + "prefs-watchlist": "Watchlist", + "prefs-editwatchlist": "Edit watchlist", + "prefs-editwatchlist-label": "Edit entries on your watchlist:", + "prefs-editwatchlist-edit": "View and remove titles on your watchlist", + "prefs-editwatchlist-raw": "Edit raw watchlist", + "prefs-editwatchlist-clear": "Clear your watchlist", + "prefs-watchlist-days": "Days to show in watchlist:", + "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}", + "prefs-watchlist-edits": "Maximum number of changes to show in watchlist:", + "prefs-watchlist-edits-max": "Maximum number: 1000", + "prefs-watchlist-token": "Watchlist token:", + "prefs-watchlist-managetokens": "Manage tokens", + "prefs-misc": "Misc", + "prefs-resetpass": "Change password", + "prefs-changeemail": "Change or remove email address", + "prefs-setemail": "Set an email address", + "prefs-email": "Email options", + "prefs-rendering": "Appearance", + "prefs-searchmisc": "General", + "saveprefs": "Save", + "restoreprefs": "Restore all default settings", + "prefs-editing": "Editing", + "searchresultshead": "Search", + "recentchangesdays": "Days to show in recent changes:", + "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}", + "recentchangescount": "Number of edits to show in recent changes, page histories, and in logs, by default:", + "prefs-help-recentchangescount": "Maximum number: 1000", + "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].", + "prefs-help-tokenmanagement": "You can see and reset the secret key for your account that can access the Web feed of your watchlist. Anyone who knows the key will be able to read your watchlist, so do not share it.", + "prefs-user-downloaddata-label": "Access account data:", + "prefs-user-downloaddata-info": "My account data from this project", + "prefs-user-downloaddata-help-message": "", + "prefs-user-restoreprefs-label": "Reset settings:", + "prefs-user-restoreprefs-info": "Restore all default preferences (in all sections)", + "savedprefs": "Your preferences have been saved.", + "savedrights": "The user groups of {{GENDER:$1|$1}} have been saved.", + "timezonelegend": "Time zone:", + "localtime": "Local time:", + "timezoneuseserverdefault": "Use wiki default ($1)", + "timezoneuseoffset": "Other (time offset from UTC)", + "timezone-useoffset-placeholder": "Example values: \"-07:00\" or \"01:00\"", + "servertime": "Server time:", + "guesstimezone": "Fill in from browser", + "timezoneregion-africa": "Africa", + "timezoneregion-america": "America", + "timezoneregion-antarctica": "Antarctica", + "timezoneregion-arctic": "Arctic", + "timezoneregion-asia": "Asia", + "timezoneregion-atlantic": "Atlantic Ocean", + "timezoneregion-australia": "Australia", + "timezoneregion-europe": "Europe", + "timezoneregion-indian": "Indian Ocean", + "timezoneregion-pacific": "Pacific Ocean", + "allowemail": "Allow other users to email me", + "email-allow-new-users-label": "Allow emails from brand-new users", + "email-mutelist-label": "Prohibit these users from emailing me:", + "prefs-searchoptions": "Search", + "prefs-namespaces": "Namespaces", + "default": "default", + "prefs-files": "Files", + "prefs-custom-css": "Custom CSS", + "prefs-custom-json": "Custom JSON", + "prefs-custom-js": "Custom JavaScript", + "prefs-common-config": "Shared CSS/JSON/JavaScript for all skins:", + "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.", + "prefs-reset-confirm": "Yes, I want to reset my preferences.", + "prefs-emailconfirm-label": "Email confirmation:", + "youremail": "Email:", + "username": "{{GENDER:$1|Username}}:", + "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:", + "prefs-memberingroups-type": "$1", + "group-membership-link-with-expiry": "$1 (until $2)", + "prefs-registration": "Registration time:", + "prefs-registration-date-time": "$1", + "yourrealname": "Real name:", + "yourlanguage": "Language:", + "yourvariant": "Content language variant:", + "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.", + "yournick": "New signature:", + "prefs-help-signature": "Comments on talk pages should be signed with \"~~~~\", which will be converted into your signature and a timestamp.", + "badsig": "Invalid raw signature.\nCheck HTML tags.", + "badsightml": "Your signature contains invalid or deprecated HTML syntax:", + "badsiglinks": "Your signature must include a link to your user page, talk page or contributions on this wiki. Please add it, for example: $1.", + "badsigsubst": "Your signature contains nested substitution (e.g. subst: or ~~~~).", + "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.", + "badsiglinebreak": "Your signature must consist of a single line of wikitext.", + "linterror-bogus-image-options": "Bogus file option", + "linterror-deletable-table-tag": "Table tag that should be deleted", + "linterror-html5-misnesting": "Misnesting (now broken)", + "linterror-misc-tidy-replacement-issues": "Miscellaneous markup errors", + "linterror-misnested-tag": "Misnested tag which should be properly nested", + "linterror-missing-end-tag": "Missing end tag", + "linterror-multi-colon-escape": "Multi colon escape", + "linterror-multiline-html-table-in-list": "Multiline HTML5 table inside a list", + "linterror-multiple-unclosed-formatting-tags": "Multiple unclosed formatting tags on the page", + "linterror-obsolete-tag": "Obsolete HTML tag", + "linterror-pwrap-bug-workaround": "Paragraph wrapping bug workaround", + "linterror-self-closed-tag": "Self-closed tag", + "linterror-stripped-tag": "Stripped tag", + "linterror-tidy-font-bug": "Font tag tries to change link color", + "linterror-tidy-whitespace-bug": "Whitespace parsing bug", + "linterror-unclosed-quotes-in-heading": "Unclosed quote which leaks out of the table of contents", + "yourgender": "How do you prefer to be described?", + "gender-unknown": "When mentioning you, the software will use gender neutral words whenever possible", + "gender-notknown": "They edit wiki pages", + "gender-male": "He edits wiki pages", + "gender-female": "She edits wiki pages", + "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.", + "email": "Email", + "prefs-help-realname": "Real name is optional.\nIf provided, it may be used to give you attribution for your work.", + "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.", + "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.", + "prefs-help-email-required": "Email address is required.", + "prefs-help-requireemail": "This improves privacy and helps prevent unsolicited emails.", + "prefs-info": "Basic information", + "prefs-i18n": "Internationalisation", + "prefs-signature": "Signature", + "prefs-signature-invalid-warning": "Your signature may cause problems with some tools.", + "prefs-signature-invalid-new": "Your current signature is invalid. Although you can still use it, you won't be able to change it until you correct it.", + "prefs-signature-invalid-disallow": "Your current signature is invalid. Until you correct it, the default signature will be used when signing your comments.", + "prefs-signature-highlight-error": "Show error location", + "prefs-signature-error-details": "Learn more", + "prefs-dateformat": "Date format", + "prefs-timeoffset": "Time offset", + "prefs-advancedediting": "General options", + "prefs-developertools": "Developer tools", + "prefs-editor": "Editor", + "prefs-discussion": "Discussion pages", + "prefs-preview": "Preview", + "prefs-advancedrc": "Advanced options", + "prefs-advancedrendering": "Advanced options", + "prefs-advancedsearchoptions": "Advanced options", + "prefs-advancedwatchlist": "Advanced options", + "prefs-displayrc": "Display options", + "prefs-displaywatchlist": "Display options", + "prefs-changesrc": "Changes shown", + "prefs-changeswatchlist": "Changes shown", + "prefs-pageswatchlist": "Watched pages", + "prefs-tokenwatchlist": "Token", + "prefs-diffs": "Diffs", + "prefs-help-prefershttps": "This preference will take effect on your next login.", + "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.", + "userrights": "User rights", + "userrights-summary": "", + "userrights-lookup-user": "Select a user", + "userrights-user-editname": "Enter a username:", + "editusergroup": "Load user groups", + "editinguser": "Changing user groups of {{GENDER:$1|user}} [[User:$1|$1]] $2", + "viewinguserrights": "Viewing user groups of {{GENDER:$1|user}} [[User:$1|$1]] $2", + "userrights-editusergroup": "Edit {{GENDER:$1|user}} groups", + "userrights-viewusergroup": "View {{GENDER:$1|user}} groups", + "saveusergroups": "Save {{GENDER:$1|user}} groups", + "userrights-groupsmember": "Member of:", + "userrights-groupsmember-auto": "Implicit member of:", + "userrights-groupsmember-type": "$1", + "userrights-systemuser": "{{GENDER:$1|This user}} is a system user", + "userrights-groups-help": "You may alter the groups {{GENDER:$1|this user}} is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.\n* A # indicates that you can only put back the expiration time of this group membership; you cannot bring it forward.", + "userrights-reason": "Reason:", + "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.", + "userrights-nodatabase": "Database $1 does not exist or is not local.", + "userrights-changeable-col": "Groups you can change", + "userrights-unchangeable-col": "Groups you cannot change", + "userrights-irreversible-marker": "$1*", + "userrights-no-shorten-expiry-marker": "$1#", + "userrights-expiry-current": "Expires $1", + "userrights-expiry-none": "Does not expire", + "userrights-expiry": "Expires:", + "userrights-expiry-existing": "Existing expiration time: $3, $2", + "userrights-expiry-othertime": "Other time:", + "userrights-expiry-options": "1 day:1 day,1 week:1 week,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year", + "userrights-invalid-expiry": "The expiry time for group \"$1\" is invalid.", + "userrights-expiry-in-past": "The expiry time for group \"$1\" is in the past.", + "userrights-cannot-shorten-expiry": "You cannot bring forward the expiry of membership in group \"$1\". Only users with permission to add and remove this group can bring forward expiry times.", + "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.", + "group": "Group:", + "group-user": "Users", + "group-named": "Registered users", + "group-autoconfirmed": "Autoconfirmed users", + "group-bot": "Bots", + "group-sysop": "Administrators", + "group-interface-admin": "Interface administrators", + "group-bureaucrat": "Bureaucrats", + "group-suppress": "Suppressors", + "group-all": "(all)", + "group-user-member": "{{GENDER:$1|user}}", + "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}", + "group-bot-member": "{{GENDER:$1|bot}}", + "group-sysop-member": "{{GENDER:$1|administrator}}", + "group-interface-admin-member": "{{GENDER:$1|interface administrator}}", + "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}", + "group-suppress-member": "{{GENDER:$1|suppressor}}", + "grouppage-user": "{{ns:project}}:Users", + "grouppage-named": "{{ns:project}}:Registered users", + "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users", + "grouppage-bot": "{{ns:project}}:Bots", + "grouppage-sysop": "{{ns:project}}:Administrators", + "grouppage-interface-admin": "{{ns:project}}:Interface administrators", + "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats", + "grouppage-suppress": "{{ns:project}}:Suppress", + "right-read": "Read pages", + "right-edit": "Edit pages", + "right-createpage": "Create pages (which are not discussion pages)", + "right-createtalk": "Create discussion pages", + "right-createaccount": "Create new user accounts", + "right-autocreateaccount": "Automatically log in with an external user account", + "right-minoredit": "Mark edits as minor", + "right-move": "Move pages", + "right-move-subpages": "Move pages with their subpages", + "right-move-rootuserpages": "Move root user pages", + "right-move-categorypages": "Move category pages", + "right-movefile": "Move files", + "right-suppressredirect": "Not create redirects from source pages when moving pages", + "right-upload": "Upload files", + "right-reupload": "Overwrite existing files", + "right-reupload-own": "Overwrite existing files uploaded by oneself", + "right-reupload-shared": "Override files on the shared media repository locally", + "right-upload_by_url": "Upload files from a URL", + "right-purge": "Purge the cache for a page", + "right-autoconfirmed": "Not be affected by IP-based rate limits", + "right-bot": "Be treated as an automated process", + "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt", + "right-apihighlimits": "Use higher limits in API queries", + "right-writeapi": "Use of the write API", + "right-delete": "Delete pages", + "right-delete-redirect": "Delete single revision redirects", + "right-bigdelete": "Delete pages with large histories", + "right-deletelogentry": "Delete and undelete specific log entries", + "right-deleterevision": "Delete and undelete specific revisions of pages", + "right-deletedhistory": "View deleted history entries, without their associated text", + "right-deletedtext": "View deleted text and changes between deleted revisions", + "right-browsearchive": "Search deleted pages", + "right-undelete": "Undelete a page", + "right-suppressrevision": "View, hide and unhide specific revisions of pages from any user", + "right-viewsuppressed": "View revisions hidden from any user", + "right-suppressionlog": "View private logs", + "right-block": "Block other users from editing", + "right-blockemail": "Block a user from sending email", + "right-hideuser": "Block a username, hiding it from the public", + "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks", + "right-unblockself": "Unblock oneself", + "right-protect": "Change protection settings and edit cascade-protected pages", + "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"", + "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"", + "right-editcontentmodel": "Edit the content model of a page", + "right-editinterface": "Edit the user interface", + "right-editusercss": "Edit other users' CSS files", + "right-edituserjson": "Edit other users' JSON files", + "right-edituserjs": "Edit other users' JavaScript files", + "right-editsitecss": "Edit sitewide CSS", + "right-editsitejson": "Edit sitewide JSON", + "right-editsitejs": "Edit sitewide JavaScript", + "right-editmyusercss": "Edit your own user CSS files", + "right-editmyuserjson": "Edit your own user JSON files", + "right-editmyuserjs": "Edit your own user JavaScript files", + "right-editmyuserjsredirect": "Edit your own user JavaScript files that are redirects", + "right-viewmywatchlist": "View your own watchlist", + "right-editmywatchlist": "Edit your own watchlist (note that some actions will still add pages even without this right)", + "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)", + "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)", + "right-editmyoptions": "Edit your own preferences", + "right-rollback": "Quickly rollback the edits of the last user who edited a particular page", + "right-markbotedits": "Mark rolled-back edits as bot edits", + "right-noratelimit": "Not be affected by rate limits", + "right-import": "Import pages from other wikis", + "right-importupload": "Import pages from a file upload", + "right-patrol": "Mark others' edits as patrolled", + "right-autopatrol": "Have one's own edits automatically marked as patrolled", + "right-patrolmarks": "View recent changes patrol marks", + "right-unwatchedpages": "View a list of unwatched pages", + "right-mergehistory": "Merge the history of pages", + "right-userrights": "Edit all user rights", + "right-userrights-interwiki": "Edit user rights of users on other wikis", + "right-siteadmin": "Lock and unlock the database", + "right-override-export-depth": "Export pages including linked pages up to a depth of 5", + "right-sendemail": "Send email to other users", + "right-managechangetags": "Create and (de)activate [[Special:Tags|tags]]", + "right-applychangetags": "Apply [[Special:Tags|tags]] along with one's changes", + "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries", + "right-deletechangetags": "Delete [[Special:Tags|tags]] from the database", + "grant-generic": "\"$1\" rights bundle", + "grant-group-page-interaction": "Interact with pages", + "grant-group-file-interaction": "Interact with media", + "grant-group-watchlist-interaction": "Interact with your watchlist", + "grant-group-email": "Send email", + "grant-group-high-volume": "Perform high volume activity", + "grant-group-customization": "Customization and preferences", + "grant-group-administration": "Perform administrative actions", + "grant-group-private-information": "Access private data about you", + "grant-group-other": "Miscellaneous activity", + "grant-blockusers": "Block and unblock users", + "grant-createaccount": "Create accounts", + "grant-createeditmovepage": "Create, edit, and move pages", + "grant-delete": "Delete pages, revisions, and log entries", + "grant-editinterface": "Edit the MediaWiki namespace and sitewide/user JSON", + "grant-editmycssjs": "Edit your user CSS/JSON/JavaScript", + "grant-editmyoptions": "Edit your user preferences and JSON configuration", + "grant-editmywatchlist": "Edit your watchlist", + "grant-editsiteconfig": "Edit sitewide and user CSS/JS", + "grant-editpage": "Edit existing pages", + "grant-editprotected": "Edit protected pages", + "grant-highvolume": "High-volume editing", + "grant-import": "Import revisions", + "grant-mergehistory": "Merge page histories", + "grant-oversight": "Hide users and suppress revisions", + "grant-patrol": "Patrol changes to pages", + "grant-privateinfo": "Access private information", + "grant-protect": "Protect and unprotect pages", + "grant-rollback": "Rollback changes to pages", + "grant-sendemail": "Send email to other users", + "grant-uploadeditmovefile": "Upload, replace, and move files", + "grant-uploadfile": "Upload new files", + "grant-basic": "Basic rights", + "grant-viewdeleted": "View deleted files and pages", + "grant-viewmywatchlist": "View your watchlist", + "grant-viewrestrictedlogs": "View restricted log entries", + "newuserlogpage": "User creation log", + "newuserlogpagetext": "This is a log of user creations.", + "rightslog": "User rights log", + "rightslogtext": "This is a log of changes to user rights.", + "action-read": "read this page", + "skin-action-addsection": "Add topic", + "action-edit": "edit this page", + "action-createpage": "create this page", + "action-createtalk": "create this discussion page", + "action-createaccount": "create this user account", + "action-autocreateaccount": "automatically create this external user account", + "action-history": "view the history of this page", + "action-minoredit": "mark this edit as minor", + "action-move": "move this page", + "action-move-subpages": "move this page, and its subpages", + "action-move-rootuserpages": "move root user pages", + "action-move-categorypages": "move category pages", + "action-movefile": "move this file", + "action-upload": "upload this file", + "action-reupload": "overwrite this existing file", + "action-reupload-shared": "override this file on a shared repository", + "action-upload_by_url": "upload this file from a URL", + "action-writeapi": "use the write API", + "action-delete": "delete this page", + "action-delete-redirect": "overwrite single revision redirects", + "action-deleterevision": "delete revisions", + "action-deletelogentry": "delete log entries", + "action-deletedhistory": "view a page's deleted history", + "action-deletedtext": "view deleted revision text", + "action-browsearchive": "search deleted pages", + "action-undelete": "undelete pages", + "action-suppressrevision": "review and undelete hidden revisions", + "action-suppressionlog": "view this private log", + "action-block": "block this user from editing", + "action-protect": "change protection settings for this page", + "action-rollback": "quickly rollback the edits of the last user who edited a particular page", + "action-import": "import pages from another wiki", + "action-importupload": "import pages from a file upload", + "action-patrol": "mark others' edits as patrolled", + "action-autopatrol": "have your edit marked as patrolled", + "action-unwatchedpages": "view the list of unwatched pages", + "action-mergehistory": "merge the history of this page", + "action-userrights": "edit all user rights", + "action-userrights-interwiki": "edit user rights of users on other wikis", + "action-siteadmin": "lock or unlock the database", + "action-sendemail": "send emails", + "action-editmyoptions": "edit your preferences", + "action-editmywatchlist": "edit your watchlist", + "action-viewmywatchlist": "view your watchlist", + "action-viewmyprivateinfo": "view your private information", + "action-editmyprivateinfo": "edit your private information", + "action-editcontentmodel": "edit the content model of a page", + "action-managechangetags": "create and (de)activate tags", + "action-applychangetags": "apply tags along with your changes", + "action-changetags": "add and remove arbitrary tags on individual revisions and log entries", + "action-deletechangetags": "delete tags from the database", + "action-purge": "purge this page", + "action-apihighlimits": "use higher limits in API queries", + "action-autoconfirmed": "not be affected by IP-based rate limits", + "action-bigdelete": "delete pages with large histories", + "action-blockemail": "block a user from sending email", + "action-bot": "be treated as an automated process", + "action-editprotected": "edit pages protected as \"{{int:protect-level-sysop}}\"", + "action-editsemiprotected": "edit pages protected as \"{{int:protect-level-autoconfirmed}}\"", + "action-editinterface": "edit the user interface", + "action-editusercss": "edit other users' CSS files", + "action-edituserjson": "edit other users' JSON files", + "action-edituserjs": "edit other users' JavaScript files", + "action-editsitecss": "edit sitewide CSS", + "action-editsitejson": "edit sitewide JSON", + "action-editsitejs": "edit sitewide JavaScript", + "action-editmyusercss": "edit your own user CSS files", + "action-editmyuserjson": "edit your own user JSON files", + "action-editmyuserjs": "edit your own user JavaScript files", + "action-editmyuserjsredirect": "edit your own user JavaScript files that are redirects", + "action-viewsuppressed": "view revisions hidden from any user", + "action-hideuser": "block a username, hiding it from the public", + "action-ipblock-exempt": "bypass IP blocks, auto-blocks and range blocks", + "action-unblockself": "unblock oneself", + "action-noratelimit": "not be affected by rate limits", + "action-reupload-own": "overwrite existing files uploaded by oneself", + "action-nominornewtalk": "not have minor edits to discussion pages trigger the new messages prompt", + "action-markbotedits": "mark rolled-back edits as bot edits", + "action-patrolmarks": "view recent changes patrol marks", + "action-override-export-depth": "export pages including linked pages up to a depth of 5", + "action-suppressredirect": "not create redirects from source pages when moving pages", + "nchanges": "$1 {{PLURAL:$1|change|changes}}", + "ntimes": "$1×", + "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}", + "enhancedrc-history": "history", + "recentchanges": "Recent changes", + "recentchanges-url": "Special:RecentChanges", + "recentchanges-legend": "Recent changes options", + "recentchanges-summary": "Track the most recent changes to the wiki on this page.", + "recentchangestext": "-", + "recentchanges-noresult": "No changes during the given period match these criteria.", + "recentchanges-timeout": "This search has timed out. You may wish to try different search parameters.", + "recentchanges-network": "Due to a technical error, no results could be loaded. Please try refreshing the page.", + "recentchanges-notargetpage": "Enter a page name above to see changes related to that page.", + "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.", + "recentchanges-label-newpage": "This edit created a new page", + "recentchanges-label-minor": "This is a minor edit", + "recentchanges-label-bot": "This edit was performed by a bot", + "recentchanges-label-unpatrolled": "This edit has not yet been patrolled", + "recentchanges-label-plusminus": "The page size changed by this number of bytes", + "recentchanges-legend-heading": "Legend:", + "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])", + "recentchanges-legend-minor": "{{int:recentchanges-label-minor}}", + "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}", + "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}", + "recentchanges-legend-plusminus": "(±123)", + "recentchanges-legend-watchlistexpiry": "Temporarily watched page", + "recentchanges-submit": "Show", + "rcfilters-tag-remove": "Remove '$1'", + "rcfilters-legend-heading": "List of abbreviations:", + "rcfilters-other-review-tools": "Other review tools", + "rcfilters-group-results-by-page": "Group results by page", + "rcfilters-activefilters": "Active filters", + "rcfilters-activefilters-hide": "Hide", + "rcfilters-activefilters-show": "Show", + "rcfilters-activefilters-hide-tooltip": "Hide Active filters area", + "rcfilters-activefilters-show-tooltip": "Show Active filters area", + "rcfilters-advancedfilters": "Advanced filters", + "rcfilters-limit-title": "Results to show", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|change|changes}}, $2", + "rcfilters-limit-and-date-popup-dialog-aria-label": "Filter results by number of changes and time period", + "rcfilters-date-popup-title": "Time period to search", + "rcfilters-days-title": "Recent days", + "rcfilters-hours-title": "Recent hours", + "rcfilters-days-show-days": "$1 {{PLURAL:$1|day|days}}", + "rcfilters-days-show-hours": "$1 {{PLURAL:$1|hour|hours}}", + "rcfilters-highlighted-filters-list": "Highlighted: $1", + "rcfilters-quickfilters": "Saved filters", + "rcfilters-quickfilters-placeholder-title": "No filters saved yet", + "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active filters area, below.", + "rcfilters-savedqueries-defaultlabel": "Saved filters", + "rcfilters-savedqueries-rename": "Rename", + "rcfilters-savedqueries-setdefault": "Set as default", + "rcfilters-savedqueries-unsetdefault": "Remove as default", + "rcfilters-savedqueries-remove": "Delete", + "rcfilters-savedqueries-new-name-label": "Name", + "rcfilters-savedqueries-new-name-placeholder": "Describe the purpose of the filter", + "rcfilters-savedqueries-apply-label": "Create filter", + "rcfilters-savedqueries-apply-and-setdefault-label": "Create default filter", + "rcfilters-savedqueries-cancel-label": "Cancel", + "rcfilters-savedqueries-add-new-title": "Save current filter settings", + "rcfilters-savedqueries-already-saved": "These filters are already saved. Change your settings to create a new Saved Filter.", + "rcfilters-restore-default-filters": "Restore default filters", + "rcfilters-clear-all-filters": "Clear all filters", + "rcfilters-show-new-changes": "View new changes since $1", + "rcfilters-search-placeholder": "Filter changes (use menu or search for filter name)", + "rcfilters-search-placeholder-mobile": "Filters", + "rcfilters-invalid-filter": "Invalid filter", + "rcfilters-empty-filter": "No active filters. All contributions are shown.", + "rcfilters-filterlist-title": "Filters", + "rcfilters-filterlist-whatsthis": "How do these work?", + "rcfilters-highlightbutton-title": "Highlight results", + "rcfilters-highlightmenu-title": "Select a color", + "rcfilters-highlightmenu-help": "Select a color to highlight this property", + "rcfilters-filterlist-noresults": "No filters found", + "rcfilters-noresults-conflict": "No results found because the search criteria are in conflict", + "rcfilters-state-message-subset": "This filter has no effect because its results are included with those of the following, broader {{PLURAL:$2|filter|filters}} (try highlighting to distinguish it): $1", + "rcfilters-state-message-fullcoverage": "Selecting all filters in this group is the same as selecting none, so this filter has no effect. Group includes: $1", + "rcfilters-filtergroup-authorship": "Contribution authorship", + "rcfilters-filter-editsbyself-label": "Changes by you", + "rcfilters-filter-editsbyself-description": "Your own contributions.", + "rcfilters-filter-editsbyother-label": "Changes by others", + "rcfilters-filter-editsbyother-description": "All changes except your own.", + "rcfilters-filtergroup-user-experience-level": "User registration and experience", + "rcfilters-filter-user-experience-level-registered-label": "Registered", + "rcfilters-filter-user-experience-level-registered-description": "Logged-in editors.", + "rcfilters-filter-user-experience-level-unregistered-label": "Unregistered", + "rcfilters-filter-user-experience-level-unregistered-description": "Editors who aren't logged-in.", + "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers", + "rcfilters-filter-user-experience-level-newcomer-description": "Registered editors who have fewer than 10 edits or 4 days of activity.", + "rcfilters-filter-user-experience-level-learner-label": "Learners", + "rcfilters-filter-user-experience-level-learner-description": "Registered editors whose experience falls between \"Newcomers\" and \"Experienced users.\"", + "rcfilters-filter-user-experience-level-experienced-label": "Experienced users", + "rcfilters-filter-user-experience-level-experienced-description": "Registered editors with more than 500 edits and 30 days of activity.", + "rcfilters-filtergroup-automated": "Automated contributions", + "rcfilters-filter-bots-label": "Bot", + "rcfilters-filter-bots-description": "Edits made by automated tools.", + "rcfilters-filter-humans-label": "Human (not bot)", + "rcfilters-filter-humans-description": "Edits made by human editors.", + "rcfilters-filtergroup-reviewstatus": "Review status", + "rcfilters-filter-reviewstatus-unpatrolled-description": "Edits not manually or automatically marked as patrolled.", + "rcfilters-filter-reviewstatus-unpatrolled-label": "Unpatrolled", + "rcfilters-filter-reviewstatus-manual-description": "Edits manually marked as patrolled.", + "rcfilters-filter-reviewstatus-manual-label": "Manually patrolled", + "rcfilters-filter-reviewstatus-auto-description": "Edits by advanced users whose work is automatically marked as patrolled.", + "rcfilters-filter-reviewstatus-auto-label": "Autopatrolled", + "rcfilters-filtergroup-significance": "Significance", + "rcfilters-filter-minor-label": "Minor edits", + "rcfilters-filter-minor-description": "Edits the author labeled as minor.", + "rcfilters-filter-major-label": "Non-minor edits", + "rcfilters-filter-major-description": "Edits not labeled as minor.", + "rcfilters-filtergroup-watchlist": "Watchlisted pages", + "rcfilters-filter-watchlist-watched-label": "On Watchlist", + "rcfilters-filter-watchlist-watched-description": "Changes to pages on your Watchlist.", + "rcfilters-filter-watchlist-watchednew-label": "New Watchlist changes", + "rcfilters-filter-watchlist-watchednew-description": "Changes to Watchlisted pages you haven't visited since the changes occurred.", + "rcfilters-filter-watchlist-notwatched-label": "Not on Watchlist", + "rcfilters-filter-watchlist-notwatched-description": "Everything except changes to your Watchlisted pages.", + "rcfilters-filtergroup-watchlistactivity": "Watchlist activity", + "rcfilters-filter-watchlistactivity-unseen-label": "Unseen changes", + "rcfilters-filter-watchlistactivity-unseen-description": "Changes to pages you haven't visited since the changes occurred.", + "rcfilters-filter-watchlistactivity-seen-label": "Seen changes", + "rcfilters-filter-watchlistactivity-seen-description": "Changes to pages you have visited since the changes occurred.", + "rcfilters-filtergroup-changetype": "Type of change", + "rcfilters-filter-pageedits-label": "Page edits", + "rcfilters-filter-pageedits-description": "Edits to wiki content, discussions, category descriptions…", + "rcfilters-filter-newpages-label": "Page creations", + "rcfilters-filter-newpages-description": "Edits that make new pages.", + "rcfilters-filter-categorization-label": "Category changes", + "rcfilters-filter-categorization-description": "Records of pages being added or removed from categories.", + "rcfilters-filter-logactions-label": "Logged actions", + "rcfilters-filter-logactions-description": "Administrative actions, account creations, page deletions, uploads…", + "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter conflicts with one or more Type of change filters, because certain types of change cannot be designated as \"minor\". The conflicting filters are marked in the Active filters area, above.", + "rcfilters-hideminor-conflicts-typeofchange": "Certain types of change cannot be designated as \"minor\", so this filter conflicts with the following Type of Change filters: $1", + "rcfilters-typeofchange-conflicts-hideminor": "This Type of change filter conflicts with the \"Minor edits\" filter. Certain types of change cannot be designated as \"minor\".", + "rcfilters-filtergroup-lastrevision": "Latest revisions", + "rcfilters-filter-lastrevision-label": "Latest revision", + "rcfilters-filter-lastrevision-description": "Only the most recent change to a page.", + "rcfilters-filter-previousrevision-label": "Not the latest revision", + "rcfilters-filter-previousrevision-description": "All changes that are not the \"latest revision\".", + "rcfilters-filter-excluded": "Excluded", + "rcfilters-tag-prefix-namespace": ":$1", + "rcfilters-tag-prefix-namespace-inverted": ":not $1", + "rcfilters-tag-prefix-tags": "#$1", + "rcfilters-exclude-button-off": "Exclude selected", + "rcfilters-exclude-button-on": "Excluding selected", + "rcfilters-view-tags": "Tagged edits", + "rcfilters-view-namespaces-tooltip": "Filter results by namespace", + "rcfilters-view-tags-tooltip": "Filter results using edit tags", + "rcfilters-view-return-to-default-tooltip": "Return to main filter menu", + "rcfilters-view-tags-help-icon-tooltip": "Learn more about Tagged edits", + "rcfilters-liveupdates-button": "Live updates", + "rcfilters-liveupdates-button-title-on": "Turn off live updates", + "rcfilters-liveupdates-button-title-off": "Display new changes as they happen", + "rcfilters-watchlist-markseen-button": "Mark all changes as seen", + "rcfilters-watchlist-edit-watchlist-button": "Edit your list of watched pages", + "rcfilters-watchlist-showupdated": "Changes to pages you haven't visited since the changes occurred are in bold, with solid markers.", + "rcfilters-preference-label": "Use non-JavaScript interface", + "rcfilters-preference-help": "Loads [[{{#special:RecentChanges}}|recent changes]] and [[{{#special:RecentChangesLinked}}|related changes]] without the filtered search or the highlighting functionality.", + "rcfilters-watchlist-preference-label": "Use non-JavaScript interface", + "rcfilters-watchlist-preference-help": "Loads [[{{#special:Watchlist}}|watchlist]] without filters search or highlighting functionality.", + "rcfilters-filter-showlinkedfrom-label": "Show changes on pages linked from", + "rcfilters-filter-showlinkedfrom-option-label": "Pages linked from the selected page", + "rcfilters-filter-showlinkedto-label": "Show changes on pages linking to", + "rcfilters-filter-showlinkedto-option-label": "Pages linking to the selected page", + "rcfilters-target-page-placeholder": "Enter a page name (or category)", + "rcfilters-allcontents-label": "All contents", + "rcfilters-alldiscussions-label": "All discussions", + "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since $3, $4 (up to $1 shown).", + "rclistfromreset": "Reset date selection", + "rclistfrom": "Show new changes starting from $2, $3", + "rcshowhideminor": "$1 minor edits", + "rcshowhideminor-show": "Show", + "rcshowhideminor-hide": "Hide", + "rcshowhidebots": "$1 bots", + "rcshowhidebots-show": "Show", + "rcshowhidebots-hide": "Hide", + "rcshowhideliu": "$1 registered users", + "rcshowhideliu-show": "Show", + "rcshowhideliu-hide": "Hide", + "rcshowhideanons": "$1 anonymous users", + "rcshowhideanons-show": "Show", + "rcshowhideanons-hide": "Hide", + "rcshowhidepatr": "$1 patrolled edits", + "rcshowhidepatr-show": "Show", + "rcshowhidepatr-hide": "Hide", + "rcshowhidemine": "$1 my edits", + "rcshowhidemine-show": "Show", + "rcshowhidemine-hide": "Hide", + "rcshowhidecategorization": "$1 page categorization", + "rcshowhidecategorization-show": "Show", + "rcshowhidecategorization-hide": "Hide", + "rclinks": "Show last $1 changes in last $2 days", + "diff": "diff", + "hist": "hist", + "hide": "Hide", + "show": "Show", + "minoreditletter": "m", + "newpageletter": "N", + "boteditletter": "b", + "unpatrolledletter": "!", + "number-of-watching-users-for-recent-changes": "[$1]", + "rc-change-size": "$1", + "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change", + "newsectionsummary": "/* $1 */ new section", + "rc-old-title": "originally created as \"$1\"", + "recentchangeslinked": "Related changes", + "recentchangeslinked-feed": "Related changes", + "recentchangeslinked-toolbox": "Related changes", + "recentchangeslinked-title": "Changes related to \"$1\"", + "recentchangeslinked-summary": "Enter a page name to see changes on pages linked to or from that page. (To see members of a category, enter {{ns:category}}:Name of category). Changes to pages on [[Special:Watchlist|your Watchlist]] are in bold.", + "recentchangeslinked-page": "Page name:", + "recentchangeslinked-to": "Show changes to pages linked to the given page instead", + "recentchanges-page-added-to-category": "[[:$1]] added to category", + "recentchanges-page-added-to-category-bundled": "[[:$1]] added to category, [[Special:WhatLinksHere/$1|this page is included within other pages]]", + "recentchanges-page-removed-from-category": "[[:$1]] removed from category", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] removed from category, [[Special:WhatLinksHere/$1|this page is included within other pages]]", + "autochange-username": "MediaWiki automatic change", + "upload": "Upload file", + "uploadbtn": "Upload file", + "reuploaddesc": "Cancel upload and return to the upload form", + "upload-tryagain": "Submit modified file description", + "upload-tryagain-nostash": "Submit re-uploaded file and modified description", + "uploadnologin": "Not logged in", + "uploadnologintext": "Please $1 to upload files.", + "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.", + "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.", + "uploaderror": "Upload error", + "upload-summary": "", + "upload-recreate-warning": "Warning: A file by that name has been deleted or moved.\n\nThe deletion and move log for this page are provided here for convenience:", + "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]]. Uploads and reuploads are also logged in the [[Special:Log/upload|upload log]]. Deletions are logged in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* [[{{ns:file}}:File.jpg]] to use the full version of the file\n* [[{{ns:file}}:File.png|200px|thumb|left|Caption]] to use a 200-pixel-wide rendition in a box in the left margin with the text \"Caption\" below\n* [[{{ns:media}}:File.ogg]] for directly linking to the file without displaying the file", + "upload-permitted": "Permitted file {{PLURAL:$2|type|types}}: $1.", + "upload-preferred": "Preferred file {{PLURAL:$2|type|types}}: $1.", + "upload-prohibited": "Prohibited file {{PLURAL:$2|type|types}}: $1.", + "uploadfooter": "-", + "upload-default-description": "-", + "uploadlogpage": "Upload log", + "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.", + "filename": "Filename", + "filedesc": "Summary", + "fileuploadsummary": "Summary:", + "filereuploadsummary": "File changes:", + "filestatus": "Copyright status:", + "filesource": "Source:", + "ignorewarning": "Ignore warning and save file anyway", + "ignorewarnings": "Ignore any warnings", + "minlength1": "Filenames must be at least one letter.", + "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.", + "filename-toolong": "Filenames may not be longer than 240 bytes.", + "badfilename": "Filename has been changed to \"$1\".", + "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).", + "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.", + "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.", + "filetype-unwanted-type": "\".$1\" is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.", + "filetype-banned-type": "\".$1\" {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.", + "filetype-missing": "The file has no extension (like \".jpg\").", + "empty-file": "The file you submitted was empty.", + "file-too-large": "The file you submitted was too large.", + "filename-tooshort": "The filename is too short.", + "filetype-banned": "This type of file is banned.", + "verification-error": "This file did not pass file verification.", + "hookaborted": "The modification you tried to make was aborted by an extension.", + "illegal-filename": "The filename is not allowed.", + "overwrite": "Overwriting an existing file is not allowed.", + "unknown-error": "An unknown error occurred.", + "tmp-create-error": "Could not create temporary file.", + "tmp-write-error": "Error writing temporary file.", + "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.", + "largefileserver": "This file is bigger than the server is configured to allow.", + "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.", + "windows-nonascii-filename": "This wiki does not support filenames with special characters.", + "fileexists": "A file with this name exists already, please check [[:$1]] if {{GENDER:|you}} are not sure if you want to overwrite it.\n[[$1|thumb]]", + "filepageexists": "The description page for this file has already been created at [[:$1]], but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]", + "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: [[:$1]]\n* Name of the existing file: [[:$2]]\nDo you perhaps want to use a more distinctive name?", + "fileexists-thumbnail-yes": "The file seems to be an image of reduced size (thumbnail).\n[[$1|thumb]]\nPlease check the file [[:$1]].\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.", + "file-thumbnail-no": "The filename begins with $1.\nIt seems to be an image of reduced size (thumbnail).\nIf you have this image in full resolution upload this one, otherwise change the filename please.", + "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]", + "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]", + "fileexists-no-change": "The upload is an exact duplicate of the current version of [[:$1]].", + "fileexists-duplicate-version": "The upload is an exact duplicate of {{PLURAL:$2|an older version|older versions}} of [[:$1]].", + "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:", + "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.", + "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.", + "uploadwarning": "Upload warning", + "uploadwarning-text": "Please modify the file description below and try again.", + "uploadwarning-text-nostash": "Please re-upload the file, modify the description below and try again.", + "savefile": "Save file", + "uploadedimage": "uploaded \"[[$1]]\"", + "overwroteimage": "uploaded a new version of \"[[$1]]\"", + "uploaddisabled": "Uploads disabled.", + "copyuploaddisabled": "Upload by URL disabled.", + "uploaddisabledtext": "File uploads are disabled.", + "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.", + "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.", + "upload-scripted-pi-callback": "Cannot upload a file that contains XML-stylesheet processing instruction.", + "upload-scripted-dtd": "Cannot upload SVG files that contain a non-standard DTD declaration.", + "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.", + "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.", + "uploaded-event-handler-on-svg": "Setting event-handler attributes $1=\"$2\" is not allowed in SVG files.", + "uploaded-href-attribute-svg": " elements can only link (href) to data: (embedded file), http:// or https://, or fragment (#, same-document) targets. For other elements, such as , only data: and fragment are allowed. Try embedding images when exporting your SVG. Found <$1 $2=\"$3\">.", + "uploaded-href-unsafe-target-svg": "Found href to unsafe data: URI target <$1 $2=\"$3\"> in the uploaded SVG file.", + "uploaded-animate-svg": "Found \"animate\" tag that might be changing href, using the \"from\" attribute <$1 $2=\"$3\"> in the uploaded SVG file.", + "uploaded-setting-event-handler-svg": "Setting event-handler attributes is blocked, found <$1 $2=\"$3\"> in the uploaded SVG file.", + "uploaded-setting-href-svg": "Using the \"set\" tag to add \"href\" attribute to parent element is blocked.", + "uploaded-wrong-setting-svg": "Using the \"set\" tag to add a remote/data/script target to any attribute is blocked. Found <set to=\"$1\"> in the uploaded SVG file.", + "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found $1=\"$2\" in the uploaded SVG file.", + "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found $1=\"$2\" in the uploaded SVG file.", + "uploaded-image-filter-svg": "Found image filter with URL: <$1 $2=\"$3\"> in the uploaded SVG file.", + "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".", + "uploadinvalidxml": "The XML in the uploaded file could not be parsed.", + "uploadvirus": "The file contains a virus!\nDetails: $1", + "upload-source": "Source file", + "sourcefilename": "Source filename:", + "sourceurl": "Source URL:", + "destfilename": "Destination filename:", + "upload-maxfilesize": "Maximum file size: $1", + "upload-description": "File description", + "upload-options": "Upload options", + "watchthisupload": "Watch this file", + "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.", + "filename-thumb-name": "This looks like a thumbnail title. Please do not upload thumbnails back to the same wiki. Otherwise, please fix the filename so it is more meaningful, and does not have the thumbnail prefix.", + "filename-bad-prefix": "The name of the file you are uploading begins with \"$1\", which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.", + "filename-prefix-blacklist": " #
    \n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #
    ", + "upload-proto-error": "Incorrect protocol", + "upload-proto-error-text": "Remote upload requires URLs beginning with http:// or ftp://.", + "upload-file-error": "Internal error", + "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].", + "upload-misc-error": "Unknown upload error", + "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].", + "upload-too-many-redirects": "The URL contained too many redirects", + "upload-http-error": "An HTTP error occurred: $1", + "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.", + "upload-foreign-cant-upload": "This wiki is not configured to upload files to the requested foreign file repository.", + "upload-foreign-cant-load-config": "Failed to load the configuration for file uploads to the foreign file repository.", + "upload-dialog-disabled": "File uploads using this dialog are disabled on this wiki.", + "upload-dialog-title": "Upload file", + "upload-dialog-button-cancel": "Cancel", + "upload-dialog-button-back": "Back", + "upload-dialog-button-done": "Done", + "upload-dialog-button-save": "Save", + "upload-dialog-button-upload": "Upload", + "upload-form-label-infoform-title": "Details", + "upload-form-label-infoform-name": "Name", + "upload-form-label-infoform-name-tooltip": "A unique descriptive title for the file, which will serve as a filename. You may use plain language with spaces. Do not include the file extension.", + "upload-form-label-infoform-description": "Description", + "upload-form-label-infoform-description-tooltip": "Briefly describe everything notable about the work.\nFor a photo, mention the main things that are depicted, the occasion, or the place.", + "upload-form-label-usage-title": "Usage", + "upload-form-label-usage-filename": "File name", + "upload-form-label-own-work": "This is my own work", + "upload-form-label-infoform-categories": "Categories", + "upload-form-label-infoform-date": "Date", + "upload-form-label-own-work-message-generic-local": "I confirm that I am uploading this file following the terms of service and licensing policies on {{SITENAME}}.", + "upload-form-label-not-own-work-message-generic-local": "If you are not able to upload this file under the policies of {{SITENAME}}, please close this dialog and try another method.", + "upload-form-label-not-own-work-local-generic-local": "You may also want to try [[Special:Upload|the default upload page]].", + "upload-form-label-own-work-message-generic-foreign": "I understand that I am uploading this file to a shared repository. I confirm that I am doing so following the terms of service and licensing policies there.", + "upload-form-label-not-own-work-message-generic-foreign": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.", + "upload-form-label-not-own-work-local-generic-foreign": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.", + "backend-fail-stream": "Could not stream file \"$1\".", + "backend-fail-backup": "Could not backup file \"$1\".", + "backend-fail-notexists": "The file $1 does not exist.", + "backend-fail-hashes": "Could not get file hashes for comparison.", + "backend-fail-sizes": "Could not get file sizes for comparison.", + "backend-fail-notsame": "A non-identical file already exists at \"$1\".", + "backend-fail-invalidpath": "\"$1\" is not a valid storage path.", + "backend-fail-delete": "Could not delete file \"$1\".", + "backend-fail-describe": "Could not change metadata for file \"$1\".", + "backend-fail-alreadyexists": "The file \"$1\" already exists.", + "backend-fail-store": "Could not store file \"$1\" at \"$2\".", + "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".", + "backend-fail-move": "Could not move file \"$1\" to \"$2\".", + "backend-fail-opentemp": "Could not open temporary file.", + "backend-fail-writetemp": "Could not write to temporary file.", + "backend-fail-closetemp": "Could not close temporary file.", + "backend-fail-read": "Could not read file \"$1\".", + "backend-fail-create": "Could not write file \"$1\".", + "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.", + "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: $2", + "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends", + "backend-fail-connect": "Could not connect to storage backend \"$1\".", + "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".", + "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".", + "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.", + "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.", + "backend-fail-stat": "Could not read the status of file \"$1\".", + "backend-fail-hash": "Could not determine the cryptographic hash of file \"$1\".", + "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.", + "lockmanager-fail-closelock": "Could not close lock file for \"$1\".", + "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".", + "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".", + "lockmanager-fail-openlock": "Could not open lock file for \"$1\". Make sure your upload directory is configured correctly and your web server has permission to write to that directory. See https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory for more information.", + "lockmanager-fail-releaselock": "Could not release lock for \"$1\".", + "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.", + "lockmanager-fail-db-release": "Could not release locks on database $1.", + "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.", + "lockmanager-fail-svr-release": "Could not release locks on server $1.", + "lockmanager-fail-conflict": "Could not acquire lock. Somebody else is doing something to this file.", + "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.", + "zip-wrong-format": "The specified file was not a ZIP file.", + "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.", + "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.", + "uploadstash": "Upload stash", + "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.", + "uploadstash-clear": "Clear stashed files", + "uploadstash-nofiles": "You have no stashed files.", + "uploadstash-badtoken": "Performing that action failed, perhaps because your editing credentials expired. Please try again.", + "uploadstash-errclear": "Clearing the files failed.", + "uploadstash-refresh": "Refresh the list of files", + "uploadstash-thumbnail": "view thumbnail", + "uploadstash-exception": "Could not store upload in the stash ($1): \"$2\".", + "uploadstash-bad-path": "Path doesn't exist.", + "uploadstash-bad-path-invalid": "Path is not valid.", + "uploadstash-bad-path-unknown-type": "Unknown type \"$1\".", + "uploadstash-bad-path-unrecognized-thumb-name": "Unrecognized thumb name.", + "uploadstash-bad-path-no-handler": "No handler found for mime $1 of file $2.", + "uploadstash-bad-path-bad-format": "Key \"$1\" is not in a proper format.", + "uploadstash-file-not-found": "Key \"$1\" not found in stash.", + "uploadstash-file-not-found-no-thumb": "Could not obtain thumbnail.", + "uploadstash-file-not-found-no-local-path": "No local path for scaled item.", + "uploadstash-file-not-found-no-remote-thumb": "Fetching thumbnail failed: $1\nURL = $2", + "uploadstash-file-not-found-missing-content-type": "Missing content-type header.", + "uploadstash-file-not-found-not-exists": "Cannot find path, or not a plain file.", + "uploadstash-file-too-large": "Cannot serve a file larger than $1 bytes.", + "uploadstash-not-logged-in": "No user is logged in, files must belong to users.", + "uploadstash-wrong-owner": "This file ($1) doesn't belong to the current user.", + "uploadstash-no-such-key": "No such key ($1), cannot remove.", + "uploadstash-zero-length": "File is zero length.", + "invalid-chunk-offset": "Invalid chunk offset", + "img-auth-accessdenied": "Access denied", + "img-auth-notindir": "Requested path is not in the configured upload directory.", + "img-auth-badtitle": "Unable to construct a valid title from \"$1\".", + "img-auth-nofile": "File \"$1\" does not exist.", + "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.", + "img-auth-streaming": "Streaming \"$1\".", + "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.", + "img-auth-noread": "User does not have access to read \"$1\".", + "http-invalid-url": "Invalid URL: $1", + "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.", + "http-request-error": "HTTP request failed due to unknown error.", + "http-read-error": "HTTP read error.", + "http-timed-out": "HTTP request timed out.", + "http-curl-error": "Error fetching URL: $1", + "http-bad-status": "There was a problem during the HTTP request: $1 $2", + "http-internal-error": "HTTP internal error.", + "upload-curl-error6": "Could not reach URL", + "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.", + "upload-curl-error28": "Upload timeout", + "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.", + "license": "Licensing:", + "license-header": "Licensing", + "nolicense": "None selected", + "licenses": "-", + "licenses-edit": "Edit license options", + "license-nopreview": "(Preview not available)", + "upload_source_url": "(your chosen file from a valid, publicly accessible URL)", + "upload_source_file": "(your chosen file from your computer)", + "listfiles-delete": "delete", + "listfiles-summary": "This special page shows all uploaded files.", + "listfiles-userdoesnotexist": "User account \"$1\" is not registered.", + "imgfile": "file", + "listfiles": "File list", + "listfiles_subpage": "Uploads by $1", + "listfiles_thumb": "Thumbnail", + "listfiles_date": "Date", + "listfiles_name": "Name", + "listfiles_user": "User", + "listfiles_size": "Size", + "listfiles_description": "Description", + "listfiles_count": "Versions", + "listfiles-show-all": "Include old versions of files", + "listfiles-latestversion": "Current version", + "listfiles-latestversion-yes": "Yes", + "listfiles-latestversion-no": "No", + "file-anchor-link": "File", + "filehist": "File history", + "filehist-help": "Click on a date/time to view the file as it appeared at that time.", + "filehist-deleteall": "delete all", + "filehist-deleteone": "delete", + "filehist-revert": "revert", + "filehist-current": "current", + "filehist-datetime": "Date/Time", + "filehist-thumb": "Thumbnail", + "filehist-thumbtext": "Thumbnail for version as of $1", + "filehist-nothumb": "No thumbnail", + "filehist-user": "User", + "filehist-dimensions": "Dimensions", + "filehist-filesize": "File size", + "filehist-comment": "Comment", + "imagelinks": "File usage", + "linkstoimage": "The following {{PLURAL:$1|page uses|$1 pages use}} this file:", + "linkstoimage-more": "More than $1 {{PLURAL:$1|page uses|pages use}} this file.\nThe following list shows the {{PLURAL:$1|first page|first $1 pages}} that use this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.", + "nolinkstoimage": "There are no pages that use this file.", + "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.", + "linkstoimage-redirect": "$1 (file redirect) $2", + "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):", + "sharedupload": "This file is from $1 and may be used by other projects.", + "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.", + "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.", + "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.", + "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.", + "shareddescriptionfollows": "-", + "filepage-nofile": "No file by this name exists.", + "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].", + "uploadnewversion-linktext": "Upload a new version of this file", + "shared-repo-from": "from $1", + "shared-repo": "a shared repository", + "shared-repo-name-wikimediacommons": "Wikimedia Commons", + "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */", + "upload-disallowed-here": "You cannot overwrite this file.", + "filerevert": "Revert $1", + "filerevert-legend": "Revert file", + "filerevert-intro": "You are about to revert the file [[Media:$1|$1]] to the [$4 version as of $3, $2].", + "filerevert-comment": "Reason:", + "filerevert-defaultcomment": "Reverted to version as of $2, $1 ($3)", + "filerevert-submit": "Revert", + "filerevert-success": "[[Media:$1|$1]] has been reverted to the [$4 version as of $3, $2].", + "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.", + "filerevert-identical": "The current version of the file is already identical to the selected one.", + "filedelete": "Delete $1", + "filedelete-legend": "Delete file", + "filedelete-intro": "You are about to delete the file [[Media:$1|$1]] along with all of its history.", + "filedelete-intro-old": "You are deleting the version of [[Media:$1|$1]] as of [$4 $3, $2].", + "filedelete-comment": "Reason:", + "filedelete-submit": "Delete", + "filedelete-success": "$1 has been deleted.", + "filedelete-success-old": "The version of [[Media:$1|$1]] as of $3, $2 has been deleted.", + "filedelete-nofile": "$1 does not exist.", + "filedelete-nofile-old": "There is no archived version of $1 with the specified attributes.", + "filedelete-otherreason": "Other/additional reason:", + "filedelete-reason-otherlist": "Other reason", + "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file", + "filedelete-reason-dropdown-suppress": "", + "filedelete-edit-reasonlist": "Edit delete reasons", + "filedelete-edit-reasonlist-suppress": "Edit suppress reasons", + "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.", + "filedelete-maintenance-title": "Cannot delete file", + "mimesearch": "MIME search", + "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype or contenttype/*, e.g. image/jpeg.", + "mimetype": "MIME type:", + "download": "download", + "unwatchedpages": "Unwatched pages", + "unwatchedpages-summary": "", + "listredirects": "List of redirects", + "listredirects-summary": "", + "listduplicatedfiles": "List of files with duplicates", + "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.", + "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].", + "unusedtemplates": "Unused templates", + "unusedtemplates-summary": "", + "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.", + "unusedtemplateswlh": "other links", + "randompage": "Random page", + "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.", + "randompage-url": "Special:Random", + "randomincategory": "Random page in category", + "randomincategory-invalidcategory": "\"$1\" is not a valid category name.", + "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.", + "randomincategory-category": "Category:", + "randomincategory-legend": "Random page in category", + "randomincategory-submit": "Go", + "randomredirect": "Random redirect", + "randomredirect-nopages": "There are no redirects in the namespace \"$1\".", + "statistics": "Statistics", + "statistics-summary": "", + "statistics-header-pages": "Page statistics", + "statistics-header-edits": "Edit statistics", + "statistics-header-users": "User statistics", + "statistics-header-hooks": "Other statistics", + "statistics-articles": "Content pages", + "statistics-articles-desc": "", + "statistics-pages": "Pages", + "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.", + "statistics-files": "Uploaded files", + "statistics-files-desc": "", + "statistics-edits": "Page edits since {{SITENAME}} was set up", + "statistics-edits-average": "Average edits per page", + "statistics-users": "Registered users", + "statistics-users-active": "Active users", + "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}", + "statistics-footer": "", + "pageswithprop": "Pages with a page property", + "pageswithprop-summary": "", + "pageswithprop-legend": "Pages with a page property", + "pageswithprop-text": "This page lists pages that use a particular page property.", + "pageswithprop-prop": "Property name:", + "pageswithprop-reverse": "Sort in reverse order", + "pageswithprop-sortbyvalue": "Sort by property value", + "pageswithprop-submit": "Go", + "pageswithprop-prophidden-long": "long text property value hidden ($1)", + "pageswithprop-prophidden-binary": "binary property value hidden ($1)", + "doubleredirects": "Double redirects", + "doubleredirects-summary": "", + "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\nCrossed out entries have been solved.", + "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].", + "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job", + "double-redirect-fixer": "Redirect fixer", + "brokenredirects": "Broken redirects", + "brokenredirects-summary": "", + "brokenredirectstext": "The following redirects link to non-existent pages:", + "brokenredirects-edit": "edit", + "brokenredirects-delete": "delete", + "brokenredirects-delete-reason": "", + "withoutinterwiki": "Pages without language links", + "withoutinterwiki-summary": "The following pages do not link to other language versions.", + "withoutinterwiki-legend": "Prefix", + "withoutinterwiki-submit": "Show", + "fewestrevisions": "Pages with the fewest revisions", + "fewestrevisions-summary": "", + "nbytes": "$1 {{PLURAL:$1|byte|bytes}}", + "ncategories": "$1 {{PLURAL:$1|category|categories}}", + "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}", + "nlinks": "$1 {{PLURAL:$1|link|links}}", + "nmembers": "$1 {{PLURAL:$1|member|members}}", + "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}", + "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}", + "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}", + "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}", + "specialpage-empty": "There are no results for this report.", + "lonelypages": "Orphaned pages", + "lonelypages-summary": "", + "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.", + "uncategorizedpages": "Uncategorized pages", + "uncategorizedpages-summary": "", + "uncategorizedcategories": "Uncategorized categories", + "uncategorizedcategories-summary": "", + "uncategorizedimages": "Uncategorized files", + "uncategorizedimages-summary": "", + "uncategorizedtemplates": "Uncategorized templates", + "uncategorizedtemplates-summary": "", + "uncategorized-categories-exceptionlist": " # Contains a list of categories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.", + "unusedcategories": "Unused categories", + "unusedcategories-summary": "", + "unusedimages": "Unused files", + "unusedimages-summary": "", + "wantedcategories": "Wanted categories", + "wantedcategories-summary": "", + "wantedpages": "Wanted pages", + "wantedpages-summary": "List of non-existing pages with the most links to them, excluding pages which only have redirects linking to them. For a list of non-existent pages that have redirects linking to them, see [[{{#special:BrokenRedirects}}|the list of broken redirects]].", + "wantedpages-badtitle": "Invalid title in result set: $1", + "wantedfiles": "Wanted files", + "wantedfiles-summary": "", + "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be struck out. Additionally, pages that embed files that do not exist are listed in [[:$1]].", + "wantedfiletext-cat-noforeign": "The following files are used but do not exist. Additionally, pages that embed files that do not exist are listed in [[:$1]].", + "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be struck out.", + "wantedfiletext-nocat-noforeign": "The following files are used but do not exist.", + "wantedtemplates": "Wanted templates", + "wantedtemplates-summary": "", + "mostlinked": "Most linked-to pages", + "mostlinked-summary": "", + "mostlinkedcategories": "Most linked-to categories", + "mostlinkedcategories-summary": "", + "mostlinkedtemplates": "Most transcluded pages", + "mostlinkedtemplates-summary": "", + "mostcategories": "Pages with the most categories", + "mostcategories-summary": "", + "mostimages": "Most linked-to files", + "mostimages-summary": "", + "mostinterwikis": "Pages with the most interwikis", + "mostinterwikis-summary": "", + "mostrevisions": "Pages with the most revisions", + "mostrevisions-summary": "", + "prefixindex": "All pages with prefix", + "prefixindex-namespace": "All pages with prefix ($1 namespace)", + "prefixindex-summary": "", + "prefixindex-submit": "Show", + "prefixindex-strip": "Hide the prefix in results", + "shortpages": "Short pages", + "shortpages-summary": "", + "longpages": "Long pages", + "longpages-summary": "", + "deadendpages": "Dead-end pages", + "deadendpages-summary": "", + "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.", + "protectedpages": "Protected pages", + "protectedpages-filters": "Filters:", + "protectedpages-indef": "Indefinite protections only", + "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].", + "protectedpages-cascade": "Cascading protections only", + "protectedpages-noredirect": "Hide redirects", + "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.", + "protectedpagesempty": "No pages are currently protected with these parameters.", + "protectedpages-timestamp": "Timestamp", + "protectedpages-page": "Page", + "protectedpages-expiry": "Expires", + "protectedpages-performer": "Protecting user", + "protectedpages-params": "Protection parameters", + "protectedpages-reason": "Reason", + "protectedpages-submit": "Display pages", + "protectedpages-unknown-timestamp": "Unknown", + "protectedpages-unknown-performer": "Unknown user", + "protectedpages-unknown-reason": "—", + "protectedtitles": "Protected titles", + "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", + "protectedtitlesempty": "No titles are currently protected with these parameters.", + "protectedtitles-submit": "Display titles", + "listusers": "User list", + "listusers-summary": "", + "listusers-editsonly": "Show only users with edits", + "listusers-temporarygroupsonly": "Show only users in temporary user groups", + "listusers-creationsort": "Sort by creation date", + "listusers-desc": "Sort in descending order", + "usereditcount": "$1 {{PLURAL:$1|edit|edits}}", + "usercreated": "{{GENDER:$3|Created}} on $1 at $2", + "newpages": "New pages", + "newpages-summary": "", + "newpages-submit": "Show", + "newpages-username": "Username:", + "ancientpages": "Oldest pages", + "ancientpages-summary": "", + "move": "Move", + "movethispage": "Move this page", + "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.", + "unusedimagestext-categorizedimgisused": "The following files exist but are not embedded in any page. Categorized images are considered as used despite that they are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.", + "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.", + "notargettitle": "No target", + "notargettext": "You have not specified a target page or user to perform this function on.", + "nopagetitle": "No such target page", + "nopagetext": "The target page you have specified does not exist.", + "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}", + "pager-older-n": "{{PLURAL:$1|older 1|older $1}}", + "suppress": "Suppress", + "querypage-disabled": "This special page is disabled for performance reasons.", + "apihelp": "API help", + "apihelp-summary": "", + "apihelp-no-such-module": "Module \"$1\" not found.", + "apihelp-link": "[[Special:ApiHelp/$1|$2]]", + "apisandbox": "API sandbox", + "apisandbox-summary": "", + "apisandbox-jsonly": "JavaScript is required to use the API sandbox.", + "apisandbox-intro": "Use this page to experiment with the MediaWiki web service API.\nRefer to [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page the API documentation] for further details of API usage. Example: [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tutorial#A_simple_query search for page titles matching a certain keyword]. Select an action to see more examples.\n\nNote that, although this is a sandbox, actions you carry out on this page may modify the wiki.", + "apisandbox-submit": "Make request", + "apisandbox-reset": "Clear", + "apisandbox-retry": "Retry", + "apisandbox-loading": "Loading information for API module \"$1\"...", + "apisandbox-load-error": "An error occurred while loading information for API module \"$1\": $2", + "apisandbox-no-parameters": "This API module has no parameters.", + "apisandbox-helpurls": "Help links", + "apisandbox-examples": "Examples", + "apisandbox-dynamic-parameters": "Additional parameters", + "apisandbox-dynamic-parameters-add-label": "Add parameter:", + "apisandbox-dynamic-parameters-add-placeholder": "Parameter name", + "apisandbox-dynamic-error-exists": "A parameter named \"$1\" already exists.", + "apisandbox-templated-parameter-reason": "This [[Special:ApiHelp/main#main/templatedparams|templated parameter]] is offered based on the {{PLURAL:$1|value|values}} of $2.", + "apisandbox-deprecated-parameters": "Deprecated parameters", + "apisandbox-fetch-token": "Auto-fill the token", + "apisandbox-add-multi": "Add", + "apisandbox-submit-invalid-fields-title": "Some fields are invalid", + "apisandbox-submit-invalid-fields-message": "Please correct the marked fields and try again.", + "apisandbox-results": "Results", + "apisandbox-sending-request": "Sending API request...", + "apisandbox-loading-results": "Receiving API results...", + "apisandbox-results-error": "An error occurred while loading the API query response: $1.", + "apisandbox-results-login-suppressed": "This request has been processed as a logged-out user as it could be used to bypass browser Same-Origin security. Note that the API sandbox's automatic token handling does not work properly with such requests, please fill them in manually.", + "apisandbox-request-selectformat-label": "Show request data as:", + "apisandbox-request-format-url-label": "URL query string", + "apisandbox-request-url-label": "Request URL:", + "apisandbox-request-format-json-label": "JSON", + "apisandbox-request-json-label": "Request JSON:", + "apisandbox-request-format-php-label": "PHP array", + "apisandbox-request-php-label": "Request PHP array:", + "apisandbox-request-time": "Request time: {{PLURAL:$1|$1 ms}}", + "apisandbox-results-fixtoken": "Correct token and resubmit", + "apisandbox-results-fixtoken-fail": "Failed to fetch \"$1\" token.", + "apisandbox-alert-page": "Fields on this page are not valid.", + "apisandbox-alert-field": "The value of this field is not valid.", + "apisandbox-continue": "Continue", + "apisandbox-continue-clear": "Clear", + "apisandbox-continue-help": "{{int:apisandbox-continue}} will [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Query#Continuing_queries continue] the last request; {{int:apisandbox-continue-clear}} will clear continuation-related parameters.", + "apisandbox-param-limit": "Enter max to use the maximum limit.", + "apisandbox-multivalue-all-namespaces": "$1 (All namespaces)", + "apisandbox-multivalue-all-values": "$1 (All values)", + "booksources": "Book sources", + "booksources-summary": "", + "booksources-search-legend": "Search for book sources", + "booksources-isbn": "ISBN:", + "booksources-search": "Search", + "booksources-text": "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:", + "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.", + "magiclink-tracking-rfc": "Pages using RFC magic links", + "magiclink-tracking-rfc-desc": "This page uses RFC magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.", + "magiclink-tracking-pmid": "Pages using PMID magic links", + "magiclink-tracking-pmid-desc": "This page uses PMID magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.", + "magiclink-tracking-isbn": "Pages using ISBN magic links", + "magiclink-tracking-isbn-desc": "This page uses ISBN magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.", + "rfcurl": "https://tools.ietf.org/html/rfc$1", + "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract", + "specialloguserlabel": "Performer:", + "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):", + "log": "Logs", + "logeventslist-submit": "Show", + "logeventslist-more-filters": "Show additional logs:", + "logeventslist-patrol-log": "Patrol log", + "logeventslist-tag-log": "Tag log", + "logeventslist-newusers-log": "User creation log", + "all-logs-page": "All public logs", + "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).", + "logempty": "No matching items in log.", + "log-title-wildcard": "Search titles starting with this text", + "showhideselectedlogentries": "Change visibility of selected log entries", + "log-edit-tags": "Edit tags of selected log entries", + "checkbox-select": "Select: $1", + "checkbox-all": "All", + "checkbox-none": "None", + "checkbox-invert": "Invert", + "allpages": "All pages", + "allpages-summary": "", + "nextpage": "Next page ($1)", + "prevpage": "Previous page ($1)", + "allpagesfrom": "Display pages starting at:", + "allpagesto": "Display pages ending at:", + "allarticles": "All pages", + "allinnamespace": "All pages ($1 namespace)", + "allpagessubmit": "Go", + "allpagesprefix": "Display pages with prefix:", + "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.", + "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".", + "allpages-hide-redirects": "Hide redirects", + "categories": "Categories", + "categories-summary": "", + "categories-submit": "Show", + "categoriespagetext": "The following {{PLURAL:$1|category exists|categories exist}} on the wiki, and may or may not be unused.\nAlso see [[Special:WantedCategories|wanted categories]].", + "categoriesfrom": "Display categories starting at:", + "deletedcontributions": "Deleted user contributions", + "deletedcontributions-summary": "", + "deletedcontributions-title": "Deleted user contributions for $1", + "sp-deletedcontributions-contribs": "contributions", + "linksearch": "External links search", + "linksearch-summary": "", + "linksearch-pat": "Search pattern:", + "linksearch-ns": "Namespace:", + "linksearch-ok": "Search", + "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.
    \nSupported {{PLURAL:$2|protocol|protocols}}: $1 (defaults to http:// if no protocol is specified).", + "linksearch-line": "$1 is linked from $2", + "linksearch-error": "Wildcards may appear only at the start of the hostname.", + "listusersfrom": "Display users starting at:", + "listusers-submit": "Show", + "listusers-noresult": "No user found.", + "listusers-blocked": "(blocked)", + "activeusers": "Active users list", + "activeusers-summary": "", + "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.", + "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}", + "activeusers-from": "Display users starting at:", + "activeusers-groups": "Display users belonging to groups:", + "activeusers-excludegroups": "Exclude users belonging to groups:", + "activeusers-noresult": "No users found.", + "activeusers-submit": "Display active users", + "listgrouprights": "User group rights", + "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.", + "listgrouprights-key": "Legend:\n* Granted right\n* Revoked right", + "listgrouprights-group": "Group", + "listgrouprights-rights": "Rights", + "listgrouprights-helppage": "Help:Group rights", + "listgrouprights-members": "(list of members)", + "listgrouprights-right-display": "$1 ($2)", + "listgrouprights-right-revoked": "$1 ($2)", + "listgrouprights-addgroup": "Add {{PLURAL:$2|group|groups}}: $1", + "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1", + "listgrouprights-addgroup-all": "Add all groups", + "listgrouprights-removegroup-all": "Remove all groups", + "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1", + "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1", + "listgrouprights-addgroup-self-all": "Add all groups to own account", + "listgrouprights-removegroup-self-all": "Remove all groups from own account", + "listgrouprights-namespaceprotection-header": "Namespace restrictions", + "listgrouprights-namespaceprotection-namespace": "Namespace", + "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit", + "listgrants": "Grants", + "listgrants-summary": "The following is a list of grants with their associated access to user rights. Users can authorize applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.", + "listgrants-grant": "Grant", + "listgrants-rights": "Rights", + "listgrants-grant-display": "$1 ($2)", + "trackingcategories": "Tracking categories", + "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.", + "trackingcategories-msg": "Tracking category", + "trackingcategories-name": "Message name", + "trackingcategories-desc": "Category inclusion criteria", + "restricted-displaytitle-ignored": "Pages with ignored display titles", + "restricted-displaytitle-ignored-desc": "The page has an ignored {{DISPLAYTITLE}} because it is not equivalent to the page's actual title.", + "nonnumeric-formatnum": "Pages with non-numeric formatnum arguments", + "nonnumeric-formatnum-desc": "The page contains a non-numeric argument to the formatnum parser function.", + "noindex-category-desc": "The page is not indexed by robots because it has the magic word __NOINDEX__ on it and is in a namespace where that flag is allowed.", + "index-category-desc": "The page has a __INDEX__ on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.", + "post-expand-template-inclusion-category-desc": "The page size is bigger than $wgMaxArticleSize after expanding all the templates, so some templates were not expanded.", + "post-expand-template-argument-category-desc": "The page is bigger than $wgMaxArticleSize after expanding a template argument (something in triple braces, like {{{Foo}}}).", + "expensive-parserfunction-category-desc": "The page uses too many expensive parser functions (like #ifexist). See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", + "broken-file-category-desc": "The page contains a broken file link (a link to embed a file when the file does not exist).", + "hidden-category-category-desc": "The category contains __HIDDENCAT__ in its page content, which prevents it from showing up in the category links box on pages by default.", + "trackingcategories-nodesc": "No description available.", + "trackingcategories-disabled": "Category is disabled", + "mailnologin": "No send address", + "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.", + "emailuser": "Email this user", + "emailuser-title-target": "Email this {{GENDER:$1|user}}", + "emailuser-title-notarget": "Email user", + "emailuser-summary": "", + "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.", + "defemailsubject": "{{SITENAME}} email from user \"$1\"", + "usermaildisabled": "User email disabled", + "usermaildisabledtext": "You cannot send email to other users on this wiki", + "noemailtitle": "No email address", + "noemailtext": "This user has not specified a valid email address.", + "nowikiemailtext": "This user has chosen not to receive email from other users.", + "emailnotarget": "Non-existent or invalid username for recipient.", + "emailtarget": "Enter username of recipient", + "emailusername": "Username:", + "emailusernamesubmit": "Submit", + "email-legend": "Send an email to another {{SITENAME}} user", + "emailfrom": "From:", + "emailto": "To:", + "emailsubject": "Subject:", + "emailmessage": "Message:", + "emailsend": "Send", + "emailccme": "Email me a copy of my message.", + "emailccsubject": "Copy of your message to $1: $2", + "emailsent": "Email sent", + "emailsenttext": "Your email message has been sent.", + "emailuserfooter": "This email was {{GENDER:$1|sent}} by $1 to {{GENDER:$2|$2}} by the \"{{int:emailuser}}\" function at {{SITENAME}}. If {{GENDER:$2|you}} reply to this email, {{GENDER:$2|your}} email will be sent directly to the {{GENDER:$1|original sender}}, revealing {{GENDER:$2|your}} email address to {{GENDER:$1|them}}.", + "usermessage-summary": "Leaving system message.", + "usermessage-editor": "System messenger", + "usermessage-template": "MediaWiki:UserMessage", + "watchlist": "Watchlist", + "watchlist-summary": "", + "mywatchlist": "Watchlist", + "watchlistfor2": "For $1", + "nowatchlist": "You have no items on your watchlist.", + "watchlistanontext": "Please log in to view or edit items on your watchlist.", + "watchnologin": "Not logged in", + "watchlistnotwatchable": "Page is not watchable.", + "addwatch": "Add to watchlist", + "updatewatchlist": "Update watchlist", + "addedwatchtext": "\"[[:$1]]\" and its discussion page have been added to your [[Special:Watchlist|watchlist]].", + "addedwatchtext-talk": "\"[[:$1]]\" and its associated page have been added to your [[Special:Watchlist|watchlist]].", + "addedwatchtext-short": "The page \"$1\" has been added to your watchlist.", + "addedwatchexpiry-options-label": "Watchlist time period:", + "addedwatchexpiryhours": "\"[[:$1]]\" and its discussion page have been added to your [[Special:Watchlist|watchlist]] for a few hours.", + "addedwatchexpiryhours-talk": "\"[[:$1]]\" and its associated page have been added to your [[Special:Watchlist|watchlist]] for a few hours.", + "addedwatchexpirytext": "\"[[:$1]]\" and its discussion page have been added to your [[Special:Watchlist|watchlist]] for $2.", + "addedwatchexpirytext-talk": "\"[[:$1]]\" and its associated page have been added to your [[Special:Watchlist|watchlist]] for $2.", + "addedwatchindefinitelytext": "\"[[:$1]]\" and its discussion page have been added to your [[Special:Watchlist|watchlist]] permanently.", + "addedwatchindefinitelytext-talk": "\"[[:$1]]\" and its associated page have been added to your [[Special:Watchlist|watchlist]] permanently.", + "removewatch": "Remove from watchlist", + "removedwatchtext": "\"[[:$1]]\" and its discussion page have been removed from your [[Special:Watchlist|watchlist]].", + "removedwatchtext-talk": "\"[[:$1]]\" and its associated page have been removed from your [[Special:Watchlist|watchlist]].", + "removedwatchtext-short": "The page \"$1\" has been removed from your watchlist.", + "watch": "Watch", + "watchthispage": "Watch this page", + "unwatch": "Unwatch", + "unwatchthispage": "Stop watching", + "notanarticle": "Not a content page", + "notvisiblerev": "The last revision by a different user has been deleted", + "watchlist-details": "{{PLURAL:$1|$1 page is|$1 pages are}} on your Watchlist (plus talk pages).", + "watchlist-expiry-days-left": "{{PLURAL:$1|$1 day|$1 days}} left", + "watchlist-expiring-days-full-text": "{{PLURAL:$1|1 day|$1 days}} left in your watchlist", + "watchlist-expiry-hours-left": "A few hours left", + "watchlist-expiring-hours-full-text": "A few hours left in your watchlist", + "wlheader-enotif": "Email notification is enabled.", + "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in bold.", + "wlnote": "Below {{PLURAL:$1|is the last change|are the last $1 changes}} in the last {{PLURAL:$2|hour|$2 hours}}, as of $3, $4.", + "watchlist-hide": "Hide", + "watchlist-submit": "Show", + "wlshowtime": "Period of time to display:", + "wlshowhideminor": "minor edits", + "wlshowhidebots": "bots", + "wlshowhideliu": "registered users", + "wlshowhideanons": "anonymous users", + "wlshowhidepatr": "patrolled edits", + "wlshowhidemine": "my edits", + "wlshowhidecategorization": "page categorization", + "watchlist-options": "Watchlist options", + "watching": "Watching...", + "unwatching": "Unwatching...", + "watchlist-unwatch": "×", + "watchlist-unwatch-undo": "+", + "enotif_reset": "Mark all pages visited", + "enotif_impersonal_salutation": "{{SITENAME}} user", + "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2", + "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2", + "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2", + "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|undeleted}} by $2", + "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2", + "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.", + "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.", + "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.", + "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|undeleted}} on $PAGEEDITDATE by $2, see $3 for the current revision.", + "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.", + "enotif_lastvisited": "For all changes since your last visit, see $1", + "enotif_lastdiff": "To view this change, see $1", + "enotif_anon_editor": "anonymous user $1", + "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE", + "enotif_minoredit": "This is a minor edit", + "created": "created", + "changed": "changed", + "deletepage-deletetalk": "Delete associated talk page", + "deletepage-submit": "Delete page", + "confirm": "Confirm", + "excontent": "content was: \"$1\"", + "excontentauthor": "content was: \"$1\", and the only contributor was \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])", + "exbeforeblank": "content before blanking was: \"$1\"", + "delete-confirm": "Delete \"$1\"", + "delete-legend": "Delete", + "delete-talk-summary-prefix": "Deleted together with the associated page with reason: $1", + "historywarning": "Warning: The page you are about to delete has a history with $1 {{PLURAL:$1|revision|revisions}}:", + "historyaction-submit": "Show revisions", + "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].", + "actioncomplete": "Action complete", + "actionfailed": "Action failed", + "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.", + "deleted-page-and-talkpage": "\"$1\" and \"$2\" have been deleted.\nSee $3 for a record of recent deletions.", + "dellogpage": "Deletion log", + "dellogpagetext": "Below is a list of the most recent deletions.", + "deletionlog": "deletion log", + "log-name-create": "Page creation log", + "log-description-create": "Below is a list of the most recent page creations.", + "logentry-create-create": "$1 {{GENDER:$2|created}} page $3", + "reverted": "Reverted to earlier revision", + "deletecomment": "Reason:", + "deleteotherreason": "Other/additional reason:", + "deletereasonotherlist": "Other reason", + "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect", + "deletereason-dropdown-suppress": "", + "delete-edit-reasonlist": "Edit deletion reasons", + "delete-edit-reasonlist-suppress": "Edit suppress reasons", + "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.", + "delete-toomanyrevisions": "You are trying to delete more than $1 {{PLURAL:$1|revision|revisions}} at a time.\nSuch an operation has been restricted to prevent accidental disruption of {{SITENAME}}.", + "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.", + "delete-error-associated-alreadytalk": "Cannot delete associated talk page of a talk page.", + "delete-error-associated-doesnotexist": "Cannot delete a non-existing associated talk page.", + "deleteprotected": "You cannot delete this page because it has been protected.", + "deleting-backlinks-warning": "Warning: [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.", + "deleting-subpages-warning": "Warning: The page you are about to delete has [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|a subpage|$1 subpages|51=over 50 subpages}}]].", + "deleting-talkpage-subpages-warning": "Warning: The associated talk page of the page you are about to delete has [[Special:PrefixIndex/{{TALKPAGENAME}}/|{{PLURAL:$1|a subpage|$1 subpages|51=over 50 subpages}}]].", + "rollback": "Roll back edits", + "rollback-confirmation-confirm": "Please confirm:", + "rollback-confirmation-yes": "Rollback", + "rollback-confirmation-no": "Cancel", + "rollbacklink": "rollback", + "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}", + "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}", + "rollbackfailed": "Rollback failed", + "rollback-missingparam": "Missing required parameters on request.", + "rollback-missingrevision": "Unable to load revision data.", + "cantrollback": "Cannot revert the edit.\nThe last contributor is the only author of this page.", + "alreadyrolled": "Cannot rollback the last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nSomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", + "editcomment": "The edit summary was: $1.", + "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]", + "revertpage-anon": "Reverted edits by [[Special:Contributions/$2|$2]] to last revision by [[User:$1|$1]]", + "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}", + "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.", + "sessionfailure-title": "Session failure", + "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nPlease resubmit the form.", + "changecontentmodel": "Change content model of a page", + "changecontentmodel-legend": "Change content model", + "changecontentmodel-title-label": "Page title:", + "changecontentmodel-current-label": "Current content model:", + "changecontentmodel-model-label": "New content model:", + "changecontentmodel-reason-label": "Reason:", + "changecontentmodel-submit": "Change", + "changecontentmodel-success-title": "The content model was changed", + "changecontentmodel-success-text": "The content type of [[:$1]] has been changed.", + "changecontentmodel-cannot-convert": "The content on [[:$1]] cannot be converted to a type of $2.", + "changecontentmodel-nodirectediting": "The $1 content model does not support direct editing", + "changecontentmodel-emptymodels-title": "No content models available", + "changecontentmodel-emptymodels-text": "The content on [[:$1]] cannot be converted to any type.", + "log-name-contentmodel": "Content model change log", + "log-description-contentmodel": "This page lists changes to the content model of pages, and pages that were created with a content model other than the default.", + "logentry-contentmodel-new": "$1 {{GENDER:$2|created}} the page $3 using a non-default content model \"$5\"", + "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"", + "logentry-contentmodel-change-revertlink": "revert", + "logentry-contentmodel-change-revert": "revert", + "protectlogpage": "Protection log", + "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.", + "protectedarticle": "protected \"[[$1]]\"", + "modifiedarticleprotection": "changed protection settings for \"[[$1]]\"", + "unprotectedarticle": "removed protection from \"[[$1]]\"", + "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"", + "protectedarticle-comment": "{{GENDER:$2|Protected}} \"[[$1]]\"", + "modifiedarticleprotection-comment": "{{GENDER:$2|Changed}} protection settings for \"[[$1]]\"", + "unprotectedarticle-comment": "{{GENDER:$2|Removed protection}} from \"[[$1]]\"", + "protect-title": "Change protection settings for \"$1\"", + "protect-title-notallowed": "View protection settings of \"$1\"", + "prot_1movedto2": "[[$1]] moved to [[$2]]", + "protect-badnamespace-title": "Non-protectable namespace", + "protect-badnamespace-text": "Pages in this namespace cannot be protected.", + "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.", + "protect-norestrictiontypes-title": "Non-protectable page", + "protect-legend": "Confirm protection", + "protectcomment": "Reason:", + "protectexpiry": "Expires:", + "protect_expiry_invalid": "Expiration time is invalid.", + "protect_expiry_old": "Expiration time is in the past.", + "protect-unchain-permissions": "Unlock further protect options", + "protect-text": "Here you may view and change the protection settings for the page $1.", + "protect-locked-blocked": "You cannot change protection settings while blocked.\nHere are the current settings for the page $1:", + "protect-locked-dblock": "Protection settings cannot be changed due to an active database lock.\nHere are the current settings for the page $1:", + "protect-locked-access": "Your account does not have permission to change page protection settings.\nHere are the current settings for the page $1:", + "protect-cascadeon": "This page is currently protected because it is transcluded in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection settings will not affect the cascading protection.", + "protect-default": "Allow all users", + "protect-fallback": "Allow only users with \"$1\" permission", + "protect-level-autoconfirmed": "Allow only autoconfirmed users", + "protect-level-sysop": "Allow only administrators", + "protect-summary-desc": "[$1=$2] ($3)", + "protect-summary-cascade": "cascading", + "protect-expiring": "expires $1 (UTC)", + "protect-expiring-local": "expires $1", + "protect-expiry-indefinite": "indefinite", + "protect-cascade": "Protect pages included in this page (cascading protection)", + "protect-cantedit": "You cannot change the protection settings of this page because you do not have permission to edit it.", + "protect-othertime": "Other time:", + "protect-othertime-op": "other time", + "protect-existing-expiry": "Existing expiration time: $3, $2", + "protect-existing-expiry-infinity": "Existing expiration time: infinite", + "protect-otherreason": "Other/additional reason:", + "protect-otherreason-op": "Other reason", + "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Edit warring\n** High traffic page", + "protect-edit-reasonlist": "Edit protection reasons", + "protect-expiry-options": "1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite", + "restriction-type": "Permission:", + "restriction-level": "Restriction level:", + "minimum-size": "Min size", + "maximum-size": "Max size:", + "pagesize": "(bytes)", + "restriction-edit": "Edit", + "restriction-move": "Move", + "restriction-create": "Create", + "restriction-upload": "Upload", + "restriction-blank": "", + "restriction-level-sysop": "fully protected", + "restriction-level-autoconfirmed": "semi protected", + "restriction-level-all": "any level", + "undelete": "View deleted pages", + "undelete-summary": "", + "undeletepage": "View and undelete deleted pages", + "undeletepagetitle": "The following consists of deleted revisions of [[:$1|$1]].", + "viewdeletedpage": "View deleted pages", + "skin-action-viewdeleted": "View $1?", + "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be undeleted.\nThe archive may be periodically cleaned out.", + "undelete-fieldset-title": "Undelete revisions", + "undeleteextrahelp": "To undelete the page's entire history, leave all checkboxes deselected and click {{int:undeletebtn}}.\nTo perform a selective undeletion, check the boxes corresponding to the revisions to be undeleted, and click {{int:undeletebtn}}.", + "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} deleted", + "undeletehistory": "If you undelete the page, all revisions will be undeleted to the history.\nIf a new page with the same name has been created since the deletion, the undeleted revisions will appear in the prior history.", + "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.", + "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe text of these deleted revisions is only available to administrators.", + "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:", + "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been undeleted or removed from the archive.", + "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revision|$1 revisions}} could not be undeleted, because {{PLURAL:$1|its|their}} rev_id was already in use.", + "undelete-nodiff": "No previous revision found.", + "undeletebtn": "Undelete", + "undeletelink": "view/undelete", + "undeleteviewlink": "view", + "undelete-undeletetalk": "Undelete all revisions of the associated talk page", + "undeleteinvert": "Invert selection", + "undeletecomment": "Reason:", + "cannotundelete": "Some or all of the undeletion failed:\n$1", + "undeletedpage": "$1 has been undeleted\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.", + "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.", + "undelete-search-title": "Search deleted pages", + "undelete-search-box": "Search deleted pages", + "undelete-search-prefix": "Show pages starting with:", + "undelete-search-full": "Show page titles containing:", + "undelete-search-submit": "Search", + "undelete-no-results": "No matching pages found in the deletion archive.", + "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.", + "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.", + "undelete-cleanup-error": "Error deleting unused archive file \"$1\".", + "undelete-missing-filearchive": "Unable to undelete file archive ID $1 because it is not in the database.\nIt may have already been undeleted.", + "undelete-talk-summary-prefix": "Undeleted together with the associated page with reason: $1", + "undelete-error": "Error undeleting page", + "undelete-error-associated-alreadytalk": "Cannot undelete associated talk page of a talk page.", + "undelete-error-associated-notdeleted": "The associated talk page has no revisions that can be undeleted.", + "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"$1\" from $2 at $3?", + "undelete-show-file-submit": "Yes", + "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8", + "undelete-back-to-list": "View all deleted revisions", + "namespace": "Namespace:", + "invert": "Invert selection", + "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)", + "tooltip-whatlinkshere-invert": "Check this box to hide links from pages within the selected namespace.", + "namespace_association": "Associated namespace", + "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace", + "blanknamespace": "(Main)", + "contributions": "User contributions", + "tool-link-contributions": "{{GENDER:$1|User}} contributions", + "contributions-summary": "", + "contributions-title": "User contributions for $1", + "mycontris": "Contributions", + "anoncontribs": "Contributions", + "contribsub2": "For {{GENDER:$3|$1}} ($2)", + "contributions-subtitle": "For {{GENDER:$3|$1}}", + "contributions-userdoesnotexist": "User account \"$1\" is not registered.", + "negative-namespace-not-supported": "Namespaces with negative values are not supported.", + "nocontribs": "No changes were found matching these criteria.", + "uctop": "current", + "month": "From month (and earlier):", + "year": "From year (and earlier):", + "date": "From date (and earlier):", + "sp-contributions-blocklog": "block log", + "sp-contributions-suppresslog": "suppressed {{GENDER:$1|user}} contributions", + "sp-contributions-deleted": "deleted {{GENDER:$1|user}} contributions", + "sp-contributions-uploads": "uploads", + "sp-contributions-logs": "logs", + "sp-contributions-talk": "talk", + "sp-contributions-userrights": "{{GENDER:$1|user}} rights management", + "sp-contributions-blocked-notice": "This {{GENDER:$1|user}} is currently blocked.\nThe latest block log entry is provided below for reference:", + "sp-contributions-blocked-notice-partial": "This user is currently partially blocked.\nThe latest block log entry is provided below for reference:", + "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:", + "sp-contributions-blocked-notice-anon-partial": "This IP address is currently partially blocked.\nThe latest block log entry is provided below for reference:", + "sp-contributions-search": "Search for contributions", + "sp-contributions-username": "IP address or username:", + "sp-contributions-toponly": "Only show edits that are latest revisions", + "sp-contributions-newonly": "Only show edits that are page creations", + "sp-contributions-hideminor": "Hide minor edits", + "sp-contributions-submit": "Search", + "sp-contributions-explain": "", + "sp-contributions-footer": "-", + "sp-contributions-footer-anon": "-", + "sp-contributions-footer-anon-range": "-", + "sp-contributions-outofrange": "Unable to show any results. The requested IP range is larger than the CIDR limit of /$1.", + "sp-contributions-concurrency-user": "Sorry, too many requests are being made from your user account. Please try again later.", + "sp-contributions-concurrency-ip": "Sorry, too many requests are being made from your IP address. Please try again later.", + "whatlinkshere": "What links here", + "whatlinkshere-count": "Displayed $1 {{PLURAL:$1|item|items}}.", + "whatlinkshere-title": "Pages that link to \"$1\"", + "whatlinkshere-summary": "", + "whatlinkshere-page": "Page:", + "linkshere": "The following pages link to $2:", + "nolinkshere": "No pages link to $2.", + "nolinkshere-ns": "No pages link to $2 in the chosen namespace.", + "isredirect": "redirect page", + "istemplate": "transclusion", + "isimage": "file link", + "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}", + "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}", + "whatlinkshere-links": "← links", + "whatlinkshere-hideredirs": "Hide redirects", + "whatlinkshere-hidetrans": "Hide transclusions", + "whatlinkshere-hidelinks": "Hide links", + "whatlinkshere-hideimages": "Hide file links", + "whatlinkshere-sectionredir": "redirect to section \"$1\"", + "whatlinkshere-submit": "Go", + "autoblockid": "Autoblock #$1", + "block": "Block user", + "unblock": "Unblock user", + "unblock-summary": "", + "changeblockip": "Change block", + "blockip": "Block {{GENDER:$1|user}}", + "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).\nYou can block IP address ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.", + "ipaddressorusername": "IP address, username or block ID:", + "ipbreason": "Reason:", + "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username", + "ipb-hardblock": "Apply block to logged-in users from this IP address", + "ipbcreateaccount": "Account creation", + "ipbemailban": "Sending email", + "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from, for a period of $1", + "ipbsubmit": "Block this user", + "ipbother": "Other time:", + "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite", + "ipbhidename": "Hide username from edits and lists", + "ipbwatchuser": "Watch this user's user and talk pages", + "ipb-disableusertalk": "Editing their own talk page", + "ipb-change-block": "Re-block the user with these settings", + "ipb-confirm": "Confirm block", + "ipb-sitewide": "Sitewide", + "ipb-partial": "Partial", + "ipb-sitewide-help": "Blocks editing on all pages and namespaces. Also blocks default actions ([https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Blocking_users See help])", + "ipb-partial-help": "Allows you to select pages and namespaces to block. Doesn’t block default actions but lets you block certain specific actions.", + "ipb-action-create": "Creating new pages", + "ipb-action-move": "Renaming pages", + "ipb-action-upload": "Uploading files", + "ipb-pages-label": "Pages", + "ipb-namespaces-label": "Namespaces", + "badipaddress": "Invalid IP address", + "blockipsuccesssub": "Block succeeded", + "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.
    \nSee the [[Special:BlockList|block list]] to review blocks.", + "ipb-empty-block": "The block submitted has no restrictions enabled.", + "ipb-block-not-found": "The block could not be made, but no existing block was found for \"$1\". If this problem persists, please [https://www.mediawiki.org/wiki/Special:MyLanguage/Help_talk:Blocking_users report it].", + "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?", + "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?", + "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.", + "ipb-edit-dropdown": "Edit block reasons", + "ipb-unblock-addr": "Unblock $1", + "ipb-unblock": "Unblock a username or IP address", + "ipb-blocklist": "View existing blocks", + "ipb-blocklist-contribs": "Contributions for {{GENDER:$1|$1}}", + "ipb-blocklist-duration-left": "$1 left", + "block-actions": "Block type", + "block-details": "Block details", + "block-expiry": "Expiration:", + "block-options": "Additional options:", + "block-reason": "Reason:", + "block-target": "Username, IP address, or IP range:", + "block-target-placeholder": "UserName, 1.1.1.42, or 1.1.1.42/16", + "unblockip": "Unblock user", + "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.", + "ipusubmit": "Remove this block", + "unblocked": "[[User:$1|$1]] has been unblocked.", + "unblocked-range": "$1 has been unblocked.", + "unblocked-id": "Block $1 has been removed.", + "unblocked-ip": "[[Special:Contributions/$1|$1]] has been unblocked.", + "blocklist": "Blocked users", + "autoblocklist": "Autoblocks", + "autoblocklist-submit": "Search", + "autoblocklist-legend": "List autoblocks", + "autoblocklist-localblocks": "Local {{PLURAL:$1|autoblock|autoblocks}}", + "autoblocklist-total-autoblocks": "Total number of autoblocks: $1", + "autoblocklist-empty": "The autoblock list is empty.", + "autoblocklist-otherblocks": "Other {{PLURAL:$1|autoblock|autoblocks}}", + "ipblocklist": "Blocked users", + "ipblocklist-legend": "Find a blocked user", + "blocklist-autoblocks": "Hide autoblocks", + "blocklist-userblocks": "Hide account blocks", + "blocklist-tempblocks": "Hide temporary blocks", + "blocklist-indefblocks": "Hide indefinite blocks", + "blocklist-addressblocks": "Hide single IP blocks", + "blocklist-type": "Type:", + "blocklist-type-opt-all": "All", + "blocklist-type-opt-sitewide": "Sitewide", + "blocklist-type-opt-partial": "Partial", + "blocklist-rangeblocks": "Hide range blocks", + "blocklist-timestamp": "Timestamp", + "blocklist-target": "Target", + "blocklist-expiry": "Expires", + "blocklist-by": "Blocking admin", + "blocklist-params": "Block parameters", + "blocklist-reason": "Reason", + "blocklist-summary": "", + "ipblocklist-submit": "Search", + "ipblocklist-localblock": "Local block", + "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}", + "infiniteblock": "infinite", + "anononlyblock": "anon. only", + "noautoblockblock": "autoblock disabled", + "createaccountblock": "account creation disabled", + "emailblock": "email disabled", + "blocklist-nousertalk": "cannot edit own talk page", + "blocklist-editing": "editing", + "blocklist-editing-sitewide": "editing (sitewide)", + "blocklist-editing-page": "pages", + "blocklist-editing-ns": "namespaces", + "blocklist-editing-action": "actions", + "ipblocklist-empty": "The block list is empty.", + "ipblocklist-no-results": "No matching blocks found for the requested IP address or username.", + "blocklink": "block", + "unblocklink": "unblock", + "change-blocklink": "change block", + "empty-username": "(no username available)", + "contribslink": "contribs", + "emaillink": "send email", + "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"", + "blocklogpage": "Block log", + "blocklog-showlog": "This {{GENDER:$1|user}} has been blocked previously.\nThe block log is provided below for reference:", + "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:", + "blocklogentry": "blocked [[$1]] with an expiration time of $2 $3", + "reblock-logentry": "changed block settings for [[$1]] with an expiration time of $2 $3", + "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.", + "unblocklogentry": "unblocked $1", + "block-log-flags-anononly": "anonymous users only", + "block-log-flags-nocreate": "account creation disabled", + "block-log-flags-noautoblock": "autoblock disabled", + "block-log-flags-noemail": "email disabled", + "block-log-flags-nousertalk": "cannot edit own talk page", + "block-log-flags-angry-autoblock": "enhanced autoblock enabled", + "block-log-flags-hiddenname": "username hidden", + "range_block_disabled": "The administrator ability to create range blocks is disabled.", + "ipb-prevent-user-talk-edit": "Editing their own talk page must be allowed for a partial block, unless it includes a restriction on the User Talk namespace.", + "ipb_expiry_invalid": "Expiry time invalid.", + "ipb_expiry_old": "Expiry time is in the past.", + "ipb_expiry_temp": "Hidden username blocks must be indefinite.", + "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.", + "ipb_hide_partial": "Hidden username blocks must be sitewide blocks.", + "ipb_already_blocked": "\"$1\" is already blocked.", + "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?", + "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}", + "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.", + "ipb_cant_unblock": "Error: Block for $1 not found. It may have been removed already.", + "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.", + "ip_range_invalid": "Invalid IP address range.", + "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.", + "ip_range_exceeded": "The IP range exceeds its maximum range. Allowed range: /$1.", + "ip_range_toolow": "IP ranges are effectively not allowed.", + "proxyblocker": "Proxy blocker", + "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.", + "sorbs": "DNSBL", + "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.", + "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.", + "softblockrangesreason": "Anonymous contributions are not allowed from your IP address ($1). Please log in.", + "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1", + "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.", + "cant-block-nonexistent-page": "You cannot block a user from $1 because the page does not exist", + "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.", + "ipbnounblockself": "You are not allowed to unblock yourself.", + "ipb-default-expiry": "", + "ipb-default-expiry-ip": "", + "lockdb": "Lock database", + "unlockdb": "Unlock database", + "lockdbtext": "Locking the database will suspend the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do, and that you will unlock the database when your maintenance is done.", + "unlockdbtext": "Unlocking the database will restore the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do.", + "lockconfirm": "Yes, I really want to lock the database.", + "unlockconfirm": "Yes, I really want to unlock the database.", + "lockbtn": "Lock database", + "unlockbtn": "Unlock database", + "locknoconfirm": "You did not check the confirmation box.", + "lockdbsuccesssub": "Database lock succeeded", + "unlockdbsuccesssub": "Database lock removed", + "lockdbsuccesstext": "The database has been locked.
    \nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.", + "unlockdbsuccesstext": "The database has been unlocked.", + "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.", + "databaselocked": "The database is already locked.", + "databasenotlocked": "The database is not locked.", + "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)", + "move-page": "Move $1", + "movepage-summary": "", + "move-page-legend": "Move page", + "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will not be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\nNote:\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.", + "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will not be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\nNote:\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.", + "movepagetext-noredirectsupport": "Using the form below will rename a page, moving all of its history to the new name.\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will not be moved if there is already a page at the new title.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\nNote:\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.", + "movepagetalktext": "If you check this box, the associated talk page will be automatically moved to new title, unless a non-empty talk page already exists there.\n\nIn this case, you will have to move or merge the page manually if desired.", + "moveuserpage-warning": "Warning: You are about to move a user page. Please note that only the page will be moved and the user will not be renamed.", + "movecategorypage-warning": "Warning: You are about to move a category page. Please note that only the page will be moved and any pages in the old category will not be recategorized into the new one.", + "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.", + "movenotallowed": "You do not have permission to move pages.", + "movenotallowedfile": "You do not have permission to move files.", + "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).", + "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).", + "cant-move-category-page": "You do not have permission to move category pages.", + "cant-move-to-category-page": "You do not have permission to move a page to a category page.", + "cant-move-subpages": "You do not have permission to move subpages.", + "namespace-nosubpages": "Namespace \"$1\" does not allow subpages.", + "newtitle": "New title:", + "move-watch": "Watch source page and target page", + "movepagebtn": "Move page", + "pagemovedsub": "Move succeeded", + "cannotmove": "The page could not be moved, for the following {{PLURAL:$1|reason|reasons}}:", + "movepage-moved": "\"$1\" has been moved to \"$2\"", + "movepage-moved-redirect": "A redirect has been created.", + "movepage-moved-noredirect": "The creation of a redirect has been suppressed.", + "movepage-delete-first": "The target page has too many revisions to delete as part of a page move. Please first delete the page manually, then try again.", + "articleexists": "A page already exists at [[:$1]], or the page name you have chosen is not valid.\nPlease choose another name.", + "redirectexists": "A redirect already exists at [[:$1]], and it cannot be deleted automatically.\nPlease choose another name.", + "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation.", + "movetalk": "Move associated talk page", + "move-subpages": "Move subpages (up to $1)", + "move-talk-subpages": "Move subpages of talk page (up to $1)", + "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.", + "movepage-source-doesnt-exist": "The page $1 doesn't exist and cannot be moved.", + "movepage-page-moved": "The page $1 has been moved to $2.", + "movepage-page-unmoved": "The page $1 could not be moved to $2.", + "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.", + "movelogpage": "Move log", + "movelogpagetext": "Below is a list of all page moves.", + "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}", + "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.", + "movesubpagetalktext": "The corresponding talk page has $1 {{PLURAL:$1|subpage|subpages}} shown below.", + "movenosubpage": "This page has no subpages.", + "movereason": "Reason:", + "move-redirect-text": "", + "category-move-redirect-override": "-", + "revertmove": "revert", + "delete_and_move_text": "The destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?", + "delete_redirect_and_move_text": "The destination page \"[[:$1]]\" already exists as a redirect.\nDo you want to delete it to make way for the move?", + "delete_and_move_confirm": "Yes, delete the page", + "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"", + "selfmove": "The title is the same;\ncannot move a page over itself.", + "immobile-source-namespace": "Cannot move pages in namespace \"$1\".", + "immobile-source-namespace-iw": "Pages on other wikis cannot be moved from this wiki.", + "immobile-target-namespace": "Cannot move pages into namespace \"$1\".", + "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.", + "immobile-source-page": "This page is not movable.", + "immobile-target-page": "Cannot move to that destination title.", + "movepage-invalid-target-title": "The requested name is invalid.", + "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.", + "imagenocrossnamespace": "Cannot move file to non-file namespace.", + "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace.", + "imagetypemismatch": "The new file extension does not match its type.", + "imageinvalidfilename": "The target filename is invalid.", + "fix-double-redirects": "Update any redirects that point to the original title", + "move-leave-redirect": "Leave a redirect behind", + "protectedpagemovewarning": "Warning: This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:", + "semiprotectedpagemovewarning": "Note: This page has been protected so that only autoconfirmed users can move it.\nThe latest log entry is provided below for reference:", + "move-over-sharedrepo": "[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.", + "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.", + "export": "Export pages", + "export-summary": "", + "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".", + "exportall": "Export all pages", + "exportcuronly": "Include only the current revision, not the full history", + "exportnohistory": "----\nNote: Exporting the full history of pages through this form has been disabled due to performance reasons.", + "exportlistauthors": "Include a full list of contributors for each page", + "export-submit": "Export", + "export-addcattext": "Add pages from category:", + "export-addcat": "Add", + "export-addnstext": "Add pages from namespace:", + "export-addns": "Add", + "export-download": "Save as file", + "export-templates": "Include templates", + "export-pagelinks": "Include linked pages to a depth of:", + "export-manual": "Add pages manually:", + "allmessages": "System messages", + "allmessagesname": "Name", + "allmessagesdefault": "Default message text", + "allmessagescurrent": "Current message text", + "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [https://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.", + "allmessages-not-supported-database": "This page cannot be used because $wgUseDatabaseMessages has been disabled.", + "allmessages-filter-legend": "Filter", + "allmessages-filter": "Filter by customization state:", + "allmessages-filter-unmodified": "Unmodified", + "allmessages-filter-all": "All", + "allmessages-filter-modified": "Modified", + "allmessages-prefix": "Filter by prefix:", + "allmessages-language": "Language:", + "allmessages-filter-submit": "Filter", + "allmessages-filter-translate": "Translate", + "thumbnail-more": "Enlarge", + "filemissing": "File missing", + "thumbnail_error": "Error creating thumbnail: $1", + "thumbnail_error_remote": "Error message from $1:\n$2", + "djvu_page_error": "DjVu page out of range", + "thumbnail-temp-create": "Unable to create temporary thumbnail file", + "thumbnail-dest-create": "Unable to save thumbnail to destination", + "thumbnail_invalid_params": "Invalid thumbnail parameters", + "thumbnail_toobigimagearea": "File with dimensions greater than $1", + "thumbnail_dest_directory": "Unable to create destination directory", + "thumbnail_image-type": "Image type not supported", + "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1", + "thumbnail_image-size-zero": "Image file size seems to be zero.", + "thumbnail_image-missing": "File seems to be missing: $1", + "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.", + "import": "Import pages", + "import-summary": "", + "importinterwiki": "Import from another wiki", + "import-interwiki-text": "Select a wiki and page title to import.\nRevision dates and editors' names will be preserved.\nAll imports from other wikis are logged at the [[Special:Log/import|import log]].", + "import-interwiki-sourcewiki": "Source wiki:", + "import-interwiki-sourcepage": "Source page:", + "import-interwiki-history": "Copy all the revisions for this page", + "import-interwiki-templates": "Include all templates and transcluded pages", + "import-interwiki-submit": "Import", + "import-mapping-default": "Import to original namespace", + "import-mapping-namespace": "Import to a namespace:", + "import-mapping-subpage": "Import as subpages of the following page:", + "import-upload-filename": "Filename:", + "import-upload-username-prefix": "Interwiki prefix:", + "import-assign-known-users": "Assign edits to local users where the named user exists locally", + "import-comment": "Comment:", + "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.", + "importstart": "Importing pages...", + "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}", + "importnopages": "No pages to import.", + "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.", + "importfailed": "Import failed: $1", + "importunknownsource": "Unknown import source type", + "importnoprefix": "No interwiki prefix was supplied", + "importcantopen": "Could not open import file", + "importbadinterwiki": "Bad interwiki link", + "importsuccess": "Import finished!", + "importnosources": "No wikis from which to import have been defined and direct history uploads are disabled.", + "importnofile": "No import file was uploaded.", + "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.", + "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.", + "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.", + "import-parse-failure": "XML import parse failure", + "import-noarticle": "No page to import!", + "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).", + "xml-error-string": "$1 at line $2, col $3 (byte $4): $5", + "import-upload": "Upload XML data", + "import-token-mismatch": "Loss of session data.\n\nYou might have been logged out. '''Please verify that you're still logged in and try again'''.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.", + "import-invalid-interwiki": "Cannot import from the specified wiki.", + "import-error-edit": "Page \"$1\" was not imported because you are not allowed to edit it.", + "import-error-interwiki": "Page \"$1\" was not imported because its name is reserved for external linking (interwiki).", + "import-error-special": "Page \"$1\" was not imported because it belongs to a special namespace that does not allow pages.", + "import-error-invalid": "Page \"$1\" was not imported because the name to which it would be imported is invalid on this wiki.", + "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.", + "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.", + "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: $1", + "import-rootpage-invalid": "Given root page is an invalid title.", + "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.", + "importlogpage": "Import log", + "importlogpagetext": "Administrative imports of pages with edit history from other wikis.", + "import-logentry-upload": "imported [[$1]] by file upload", + "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}} imported", + "import-logentry-interwiki": "transwikied $1", + "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} imported from $2", + "javascripttest": "JavaScript testing", + "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.", + "accesskey-pt-userpage": ".", + "accesskey-pt-anonuserpage": ".", + "accesskey-pt-mytalk": "n", + "accesskey-pt-anontalk": "n", + "accesskey-pt-preferences": "", + "accesskey-pt-watchlist": "l", + "accesskey-pt-mycontris": "y", + "accesskey-pt-anoncontribs": "y", + "accesskey-pt-login": "o", + "accesskey-pt-login-private": "o", + "accesskey-pt-logout": "", + "accesskey-pt-createaccount": "", + "accesskey-ca-view": "", + "accesskey-ca-talk": "t", + "accesskey-ca-edit": "e", + "accesskey-ca-addsection": "+", + "accesskey-ca-viewsource": "e", + "accesskey-ca-history": "h", + "accesskey-ca-protect": "=", + "accesskey-ca-unprotect": "=", + "accesskey-ca-delete": "d", + "accesskey-ca-undelete": "d", + "accesskey-ca-move": "m", + "accesskey-ca-watch": "w", + "accesskey-ca-unwatch": "w", + "accesskey-search": "f", + "accesskey-search-go": "", + "accesskey-search-fulltext": "", + "accesskey-p-logo": "", + "accesskey-n-help-mediawiki": "", + "accesskey-n-mainpage": "z", + "accesskey-n-mainpage-description": "z", + "accesskey-n-portal": "", + "accesskey-n-currentevents": "", + "accesskey-n-recentchanges": "r", + "accesskey-n-randompage": "x", + "accesskey-n-help": "", + "accesskey-t-whatlinkshere": "j", + "accesskey-t-recentchangeslinked": "k", + "accesskey-feed-rss": "", + "accesskey-feed-atom": "", + "accesskey-t-contributions": "", + "accesskey-t-emailuser": "", + "accesskey-t-info": "", + "accesskey-t-permalink": "", + "accesskey-t-print": "p", + "accesskey-t-upload": "u", + "accesskey-t-specialpages": "q", + "accesskey-ca-nstab-main": "c", + "accesskey-ca-nstab-user": "c", + "accesskey-ca-nstab-media": "c", + "accesskey-ca-nstab-special": "", + "accesskey-ca-nstab-project": "a", + "accesskey-ca-nstab-image": "c", + "accesskey-ca-nstab-mediawiki": "c", + "accesskey-ca-nstab-template": "c", + "accesskey-ca-nstab-help": "c", + "accesskey-ca-nstab-category": "c", + "accesskey-minoredit": "i", + "accesskey-save": "s", + "accesskey-publish": "s", + "accesskey-preview": "p", + "accesskey-diff": "v", + "accesskey-compareselectedversions": "v", + "accesskey-watch": "w", + "accesskey-watchlist-expiry": "", + "accesskey-upload": "s", + "accesskey-preferences-save": "s", + "accesskey-summary": "b", + "accesskey-userrights-set": "s", + "accesskey-blockip-block": "s", + "accesskey-export": "s", + "accesskey-import": "s", + "accesskey-watchlistedit-normal-submit": "s", + "accesskey-watchlistedit-raw-submit": "s", + "tooltip-pt-userpage": "{{GENDER:|Your user}} page", + "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as", + "tooltip-pt-tmpuserpage": "Your auto-generated temporary user name", + "tooltip-pt-mytalk": "{{GENDER:|Your}} talk page", + "tooltip-pt-anontalk": "Discussion about edits from this IP address", + "tooltip-pt-preferences": "{{GENDER:|Your}} preferences", + "tooltip-pt-watchlist": "A list of pages you are monitoring for changes", + "tooltip-pt-mycontris": "A list of {{GENDER:|your}} contributions", + "tooltip-pt-anoncontribs": "A list of edits made from this IP address", + "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory", + "tooltip-pt-login-private": "You need to log in to use this wiki", + "tooltip-pt-logout": "Log out", + "tooltip-pt-createaccount": "You are encouraged to create an account and log in; however, it is not mandatory", + "tooltip-ca-view": "", + "tooltip-ca-talk": "Discussion about the content page", + "tooltip-ca-edit": "Edit this page", + "tooltip-ca-addsection": "Start a new section", + "tooltip-ca-viewsource": "This page is protected.\nYou can view its source", + "tooltip-ca-history": "Past revisions of this page", + "tooltip-ca-protect": "Protect this page", + "tooltip-ca-unprotect": "Change protection of this page", + "tooltip-ca-delete": "Delete this page", + "tooltip-ca-undelete": "Undelete the edits done to this page before it was deleted", + "tooltip-ca-move": "Move this page", + "tooltip-ca-watch": "Add this page to your watchlist", + "tooltip-ca-unwatch": "Remove this page from your watchlist", + "tooltip-ca-unwatch-expiring": "{{PLURAL:$1|1 day|$1 days}} left in your watchlist. Click to remove it.", + "tooltip-ca-unwatch-expiring-hours": "A few hours left in your watchlist. Click to remove it.", + "tooltip-search": "Search {{SITENAME}}", + "tooltip-search-go": "Go to a page with this exact name if it exists", + "tooltip-search-fulltext": "Search the pages for this text", + "tooltip-p-cactions": "More options", + "tooltip-p-lang": "", + "tooltip-p-logo": "Visit the main page", + "tooltip-p-navigation": "", + "tooltip-p-personal": "User menu", + "tooltip-p-namespaces": "", + "tooltip-p-tb": "", + "tooltip-p-variants": "", + "tooltip-p-views": "", + "tooltip-p-user-interface-preferences": "", + "tooltip-p-user-page": "", + "tooltip-n-help-mediawiki": "", + "tooltip-n-mainpage": "Visit the main page", + "tooltip-n-mainpage-description": "Visit the main page", + "tooltip-n-portal": "About the project, what you can do, where to find things", + "tooltip-n-currentevents": "Find background information on current events", + "tooltip-n-recentchanges": "A list of recent changes in the wiki", + "tooltip-n-randompage": "Load a random page", + "tooltip-n-help": "The place to find out", + "tooltip-t-whatlinkshere": "A list of all wiki pages that link here", + "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page", + "tooltip-feed-rss": "RSS feed for this page", + "tooltip-feed-atom": "Atom feed for this page", + "tooltip-t-contributions": "A list of contributions by {{GENDER:$1|this user}}", + "tooltip-t-emailuser": "Send an email to {{GENDER:$1|this user}}", + "tooltip-t-info": "More information about this page", + "tooltip-t-upload": "Upload files", + "tooltip-t-specialpages": "A list of all special pages", + "tooltip-t-print": "Printable version of this page", + "tooltip-t-permalink": "Permanent link to this revision of this page", + "tooltip-ca-nstab-main": "View the content page", + "tooltip-ca-nstab-user": "View the user page", + "tooltip-ca-nstab-media": "View the media page", + "tooltip-ca-nstab-special": "This is a special page, and it cannot be edited", + "tooltip-ca-nstab-project": "View the project page", + "tooltip-ca-nstab-image": "View the file page", + "tooltip-ca-nstab-mediawiki": "View the system message", + "tooltip-ca-nstab-template": "View the template", + "tooltip-ca-nstab-help": "View the help page", + "tooltip-ca-nstab-category": "View the category page", + "tooltip-minoredit": "Mark this as a minor edit", + "tooltip-save": "Save your changes", + "tooltip-publish": "Publish your changes", + "tooltip-preview": "Preview your changes. Please use this before publishing.", + "tooltip-diff": "Show which changes you made to the text", + "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page", + "tooltip-watch": "Add this page to your watchlist", + "tooltip-watchlist-expiry": "Temporarily add this page to your watchlist", + "tooltip-watchlistedit-normal-submit": "Remove titles", + "tooltip-watchlistedit-raw-submit": "Update watchlist", + "tooltip-recreate": "Recreate the page even though it has been deleted", + "tooltip-upload": "Start upload", + "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click", + "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.", + "tooltip-preferences-save": "Save preferences", + "tooltip-summary": "Enter a short summary", + "interlanguage-link-title": "$1 – $2", + "interlanguage-link-title-langonly": "$1", + "interlanguage-link-title-nonlang": "$1 – $2", + "interlanguage-link-title-nonlangonly": "$1", + "common.css": "/* CSS placed here will be applied to all skins */", + "print.css": "/* CSS placed here will affect the print output */", + "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */", + "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */", + "group-user.css": "/* CSS placed here will affect registered users only */", + "group-bot.css": "/* CSS placed here will affect bots only */", + "group-sysop.css": "/* CSS placed here will affect sysops only */", + "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */", + "common.json": "/* Any JSON here will be loaded for all users on every page load. */", + "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */", + "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */", + "group-user.js": "/* Any JavaScript here will be loaded for registered users only */", + "group-bot.js": "/* Any JavaScript here will be loaded for bots only */", + "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */", + "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */", + "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}", + "siteuser": "{{SITENAME}} user $1", + "anonuser": "{{SITENAME}} anonymous user $1", + "lastmodifiedatby": "This page was last edited $2, $1 by $3.", + "othercontribs": "Based on work by $1.", + "others": "others", + "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|user}}|users}} $1", + "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1", + "creditspage": "Page credits", + "nocredits": "There is no credits info available for this page.", + "spamprotectiontitle": "Spam protection filter", + "spamprotectiontext": "The text you wanted to publish was blocked by the spam filter.\nThis is probably caused by a link to a forbidden external site.", + "spamprotectionmatch": "The following text is what triggered our spam filter: $1", + "spambot_username": "MediaWiki spam cleanup", + "spam_reverting": "Reverting to last revision not containing links to $1", + "spam_blanking": "All revisions contained links to $1, blanking", + "spam_deleting": "All revisions contained links to $1, deleting", + "simpleantispam-label": "Anti-spam check.\nDo not fill this in!", + "pageinfo-header": "-", + "pageinfo-title": "Information for \"$1\"", + "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.", + "pageinfo-header-basic": "Basic information", + "pageinfo-header-edits": "Edit history", + "pageinfo-header-restrictions": "Page protection", + "pageinfo-header-properties": "Page properties", + "pageinfo-display-title": "Display title", + "pageinfo-default-sort": "Default sort key", + "pageinfo-length": "Page length (in bytes)", + "pageinfo-namespace": "Namespace", + "pageinfo-article-id": "Page ID", + "pageinfo-language": "Page content language", + "pageinfo-language-change": "change", + "pageinfo-content-model": "Page content model", + "pageinfo-content-model-change": "change", + "pageinfo-robot-policy": "Indexing by robots", + "pageinfo-robot-index": "Allowed", + "pageinfo-robot-noindex": "Disallowed", + "pageinfo-watchers": "Number of page watchers", + "pageinfo-visiting-watchers": "Number of page watchers who visited recent edits", + "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}", + "pageinfo-few-visiting-watchers": "There may or may not be a watching user visiting recent edits", + "pageinfo-redirects-name": "Number of redirects to this page", + "pageinfo-redirects-value": "$1", + "pageinfo-subpages-name": "Number of subpages of this page", + "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})", + "pageinfo-firstuser": "Page creator", + "pageinfo-firsttime": "Date of page creation", + "pageinfo-lastuser": "Latest editor", + "pageinfo-lasttime": "Date of latest edit", + "pageinfo-edits": "Total number of edits", + "pageinfo-authors": "Total number of distinct authors", + "pageinfo-recent-edits": "Recent number of edits (within past $1)", + "pageinfo-recent-authors": "Recent number of distinct authors", + "pageinfo-magic-words": "Magic {{PLURAL:$1|word|words}} ($1)", + "pageinfo-hidden-categories": "Hidden {{PLURAL:$1|category|categories}} ($1)", + "pageinfo-templates": "Transcluded {{PLURAL:$1|template|templates}} ($1)", + "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)", + "pageinfo-footer": "-", + "pageinfo-toolboxlink": "Page information", + "pageinfo-redirectsto": "Redirects to", + "pageinfo-redirectsto-info": "info", + "pageinfo-contentpage": "Counted as a content page", + "pageinfo-contentpage-yes": "Yes", + "pageinfo-protect-cascading": "Protections are cascading from here", + "pageinfo-protect-cascading-yes": "Yes", + "pageinfo-protect-cascading-from": "Protections are cascading from", + "pageinfo-category-info": "Category information", + "pageinfo-category-total": "Total number of members", + "pageinfo-category-pages": "Number of pages", + "pageinfo-category-subcats": "Number of subcategories", + "pageinfo-category-files": "Number of files", + "pageinfo-user-id": "User ID", + "pageinfo-file-hash": "Hash value", + "pageinfo-view-protect-log": "View the protection log for this page.", + "markaspatrolleddiff": "Mark as patrolled", + "markaspatrolledlink": "[$1]", + "markaspatrolledtext": "Mark this page as patrolled", + "markaspatrolledtext-file": "Mark this file version as patrolled", + "markedaspatrolled": "Marked as patrolled", + "markedaspatrolledtext": "The selected revision of [[:$1]] has been marked as patrolled.", + "rcpatroldisabled": "Recent changes patrol disabled", + "rcpatroldisabledtext": "The recent changes patrol feature is currently disabled.", + "markedaspatrollederror": "Cannot mark as patrolled", + "markedaspatrollederrortext": "You need to specify a revision to mark as patrolled.", + "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.", + "markedaspatrollednotify": "This change to $1 has been marked as patrolled.", + "patrol-log-page": "Patrol log", + "patrol-log-header": "This is a log of patrolled revisions.", + "confirm-markpatrolled-button": "OK", + "confirm-markpatrolled-top": "Mark revision $3 of $2 as patrolled?", + "deletedrevision": "Deleted old revision $1", + "filedeleteerror-short": "Error deleting file: $1", + "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1", + "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.", + "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.", + "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.", + "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.", + "previousdiff": "← Older edit", + "nextdiff": "Newer edit →", + "mediawarning": "Warning: This file type may contain malicious code.\nBy executing it, your system may be compromised.", + "imagemaxsize": "Image size limit on file description pages:", + "thumbsize": "Thumbnail size:", + "widthheight": "$1 × $2", + "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}", + "file-info": "file size: $1, MIME type: $2", + "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4", + "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}", + "file-nohires": "No higher resolution available.", + "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3", + "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3", + "svg-long-error": "Invalid SVG file: $1", + "show-big-image": "Original file", + "show-big-image-preview": "Size of this preview: $1.", + "show-big-image-preview-differ": "Size of this $3 preview of this $2 file: $1.", + "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.", + "show-big-image-size": "$1 × $2 pixels", + "file-info-gif-looped": "looped", + "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}", + "file-info-png-looped": "looped", + "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}", + "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}", + "file-no-thumb-animation": "Note: Due to technical limitations, thumbnails of this file will not be animated.", + "file-no-thumb-animation-gif": "Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.", + "newimages": "Gallery of new files", + "newimagestext": "-", + "imagelisttext": "Below is a list of $1 {{PLURAL:$1|file|files}} sorted $2.", + "newimages-summary": "This special page shows the last uploaded files.", + "newimages-legend": "Filter", + "newimages-user": "IP address or username", + "newimages-showbots": "Show uploads by bots", + "newimages-hidepatrolled": "Hide patrolled uploads", + "newimages-mediatype": "Media type:", + "noimages": "Nothing to see.", + "gallery-slideshow-toggle": "Toggle thumbnails", + "ilsubmit": "Search", + "bydate": "by date", + "sp-newimages-showfrom": "Show new files starting from $2, $1", + "video-dims": "$1, $2 × $3", + "seconds-abbrev": "$1 s", + "minutes-abbrev": "$1 min", + "hours-abbrev": "$1 h", + "days-abbrev": "$1 d", + "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}", + "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}", + "hours": "{{PLURAL:$1|$1 hour|$1 hours}}", + "days": "{{PLURAL:$1|$1 day|$1 days}}", + "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}", + "months": "{{PLURAL:$1|$1 month|$1 months}}", + "years": "{{PLURAL:$1|$1 year|$1 years}}", + "ago": "$1 ago", + "just-now": "just now", + "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago", + "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago", + "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago", + "monday-at": "Monday at $1", + "tuesday-at": "Tuesday at $1", + "wednesday-at": "Wednesday at $1", + "thursday-at": "Thursday at $1", + "friday-at": "Friday at $1", + "saturday-at": "Saturday at $1", + "sunday-at": "Sunday at $1", + "today-at": "$1", + "yesterday-at": "Yesterday at $1", + "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.", + "variantname-zh-hans": "Hans", + "variantname-zh-hant": "Hant", + "variantname-zh-cn": "CN", + "variantname-zh-tw": "TW", + "variantname-zh-hk": "HK", + "variantname-zh-mo": "MO", + "variantname-zh-sg": "SG", + "variantname-zh-my": "MY", + "variantname-zh": "zh", + "variantname-gan-hans": "Hans", + "variantname-gan-hant": "Hant", + "variantname-gan": "gan", + "variantname-sr-cyrl": "sr-Cyrl", + "variantname-sr-ec": "sr-Cyrl", + "variantname-sr-el": "sr-Latn", + "variantname-sr-latn": "sr-Latn", + "variantname-sr": "sr", + "variantname-kk-kz": "kk-KZ", + "variantname-kk-tr": "kk-TR", + "variantname-kk-cn": "kk-CN", + "variantname-kk-cyrl": "kk-Cyrl", + "variantname-kk-latn": "kk-Latn", + "variantname-kk-arab": "kk-Arab", + "variantname-kk": "kk", + "variantname-ku-arab": "ku-Arab", + "variantname-ku-latn": "ku-Latn", + "variantname-ku": "ku", + "variantname-tg-cyrl": "tg-Cyrl", + "variantname-tg-latn": "tg-Latn", + "variantname-tg": "tg", + "variantname-tly-cyrl": "tly-Cyrl", + "variantname-tly": "tly", + "variantname-ike-cans": "ike-Cans", + "variantname-ike-latn": "ike-Latn", + "variantname-iu": "iu", + "variantname-shi-tfng": "shi-Tfng", + "variantname-shi-latn": "shi-Latn", + "variantname-shi": "shi", + "variantname-uz": "uz", + "variantname-uz-latn": "uz-Latn", + "variantname-uz-cyrl": "uz-Cyrl", + "variantname-crh": "crh", + "variantname-crh-latn": "crh-Latn", + "variantname-crh-cyrl": "crh-Cyrl", + "metadata": "Metadata", + "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.", + "metadata-expand": "Show extended details", + "metadata-collapse": "Hide extended details", + "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", + "metadata-langitem": "$2: $1", + "metadata-langitem-default": "$1", + "namespacesall": "all", + "monthsall": "all", + "confirmemail": "Confirm email address", + "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].", + "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.", + "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.", + "confirmemail_send": "Mail a confirmation code", + "confirmemail_sent": "Confirmation email sent.", + "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.", + "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1", + "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.", + "confirmemail_needlogin": "Please $1 to confirm your email address.", + "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.", + "confirmemail_loggedin": "Your email address has now been confirmed.", + "confirmemail_subject": "{{SITENAME}} email address confirmation", + "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.", + "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.", + "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.", + "confirmemail_invalidated": "Email address confirmation canceled", + "invalidateemail": "Cancel email confirmation", + "notificationemail_subject_changed": "{{SITENAME}} registered email address has been changed", + "notificationemail_subject_removed": "{{SITENAME}} registered email address has been removed", + "notificationemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to \"$3\" on {{SITENAME}}.\n\nIf this was not you, contact a site administrator immediately.", + "notificationemail_body_removed": "Someone, probably you, from IP address $1,\nhas removed the email address of the account \"$2\" on {{SITENAME}}.\n\nIf this was not you, contact a site administrator immediately.", + "scarytranscludedisabled": "[Interwiki transcluding is disabled]", + "scarytranscludefailed": "[Template fetch failed for $1]", + "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]", + "scarytranscludetoolong": "[URL is too long]", + "deletedwhileediting": "Warning: This page was deleted after you started editing!", + "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|deleted}} this page after you started editing with reason:\n: $2\nPlease confirm that you really want to recreate this page.", + "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|deleted}} this page after you started editing. Please confirm that you really want to recreate this page.", + "recreate": "Recreate", + "unit-pixel": "px", + "confirm-purge-title": "Purge this page", + "confirm_purge_button": "OK", + "confirm-purge-top": "Purge the cache of this page?", + "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.", + "confirm-watch-button": "OK", + "confirm-watch-top": "Add this page to your watchlist?", + "confirm-watch-label": "Watchlist time period:", + "watchlist-expiry-options": "Permanent:infinite,1 week:1 week,1 month:1 month,3 months:3 months,6 months:6 months", + "watchlist-expires-in-aria-label": "Expiring watchlist item", + "confirm-watch-button-expiry": "Watch", + "confirm-unwatch-button": "OK", + "confirm-unwatch-top": "Remove this page from your watchlist?", + "confirm-rollback-button": "OK", + "confirm-rollback-top": "Revert edits to this page?", + "confirm-rollback-bottom": "This action will instantly rollback the selected changes to this page.", + "confirm-mcrrestore-title": "Restore a revision", + "confirm-mcrundo-title": "Undo a change", + "mcrundofailed": "Undo failed", + "mcrundo-missingparam": "Missing required parameters on request.", + "mcrundo-changed": "The page has been changed since you viewed the diff. Please review the new change.", + "mcrundo-parse-failed": "Failed to parse the new revision: $1", + "semicolon-separator": "; ", + "comma-separator": ", ", + "colon-separator": ": ", + "autocomment-prefix": "", + "pipe-separator": " | ", + "word-separator": " ", + "ellipsis": "...", + "percent": "$1%", + "parentheses": "($1)", + "parentheses-start": "(", + "parentheses-end": ")", + "brackets": "[$1]", + "brackets-start": "[", + "brackets-end": "]", + "quotation-marks": "\"$1\"", + "formatnum-nan": "Not a Number", + "imgmultipageprev": "← previous page", + "imgmultipagenext": "next page →", + "imgmultigo": "Go!", + "imgmultigoto": "Go to page $1", + "img-lang-opt": "$2 ($1)", + "img-lang-default": "(default language)", + "img-lang-info": "Render this image in $1. $2", + "img-lang-go": "Go", + "table_pager_next": "Next page", + "table_pager_prev": "Previous page", + "table_pager_first": "First page", + "table_pager_last": "Last page", + "table_pager_limit": "Show $1 items per page", + "table_pager_limit_label": "Items per page:", + "table_pager_limit_submit": "Go", + "table_pager_empty": "No results", + "autosumm-blank": "Blanked the page", + "autosumm-replace": "Replaced content with \"$1\"", + "autoredircomment": "Redirected page to [[$1]]", + "autosumm-removed-redirect": "Removed redirect to [[$1]]", + "autosumm-changed-redirect-target": "Changed redirect target from [[$1]] to [[$2]]", + "autosumm-new": "Created page with \"$1\"", + "autosumm-newblank": "Created blank page", + "block-autoblock-exemptionlist": "", + "size-bytes": "$1 {{PLURAL:$1|byte|bytes}}", + "size-kilobytes": "$1 KB", + "size-megabytes": "$1 MB", + "size-gigabytes": "$1 GB", + "size-terabytes": "$1 TB", + "size-petabytes": "$1 PB", + "size-exabytes": "$1 EB", + "size-zettabytes": "$1 ZB", + "size-yottabytes": "$1 YB", + "size-ronnabytes": "$1 RB", + "size-quettabytes": "$1 QB", + "size-pixel": "$1 {{PLURAL:$1|pixel|pixels}}", + "size-kilopixel": "$1 KP", + "size-megapixel": "$1 MP", + "size-gigapixel": "$1 GP", + "size-terapixel": "$1 TP", + "size-petapixel": "$1 PP", + "size-exapixel": "$1 EP", + "size-zettapixel": "$1 ZP", + "size-yottapixel": "$1 YP", + "size-ronnapixel": "$1 RP", + "size-quettapixel": "$1 QP", + "bitrate-bits": "$1 bps", + "bitrate-kilobits": "$1 kbps", + "bitrate-megabits": "$1 Mbps", + "bitrate-gigabits": "$1 Gbps", + "bitrate-terabits": "$1 Tbps", + "bitrate-petabits": "$1 Pbps", + "bitrate-exabits": "$1 Ebps", + "bitrate-zettabits": "$1 Zbps", + "bitrate-yottabits": "$1 Ybps", + "bitrate-ronnabits": "$1 Rbps", + "bitrate-quettabits": "$1 Qbps", + "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.", + "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.", + "editwatchlist-summary": "", + "watchlistedit-normal-title": "Edit watchlist", + "watchlistedit-normal-legend": "Remove titles from watchlist", + "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].", + "watchlistedit-normal-submit": "Remove titles", + "watchlistedit-normal-done": "{{PLURAL:$1|A single title was|$1 titles were}} removed from your watchlist:", + "watchlistedit-raw-title": "Edit raw watchlist", + "watchlistedit-raw-legend": "Edit raw watchlist", + "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].", + "watchlistedit-raw-titles": "Titles:", + "watchlistedit-raw-submit": "Update watchlist", + "watchlistedit-raw-done": "Your watchlist has been updated.", + "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:", + "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:", + "watchlistedit-clear-title": "Clear watchlist", + "watchlistedit-clear-legend": "Clear watchlist", + "watchlistedit-clear-explain": "All of the titles will be removed from your watchlist", + "watchlistedit-clear-titles": "Titles:", + "watchlistedit-clear-submit": "Clear the watchlist (This is permanent!)", + "watchlistedit-clear-done": "Your watchlist has been cleared.", + "watchlistedit-clear-jobqueue": "Your watchlist is being cleared. This may take some time!", + "watchlistedit-clear-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:", + "watchlistedit-too-many": "Your watchlist has been updated. There are too many pages to display here.", + "watchlisttools-clear": "Clear the watchlist", + "watchlisttools-view": "View relevant changes", + "watchlisttools-edit": "View and edit watchlist", + "watchlisttools-raw": "Edit raw watchlist", + "iranian-calendar-m1": "Farvardin", + "iranian-calendar-m2": "Ordibehesht", + "iranian-calendar-m3": "Khordad", + "iranian-calendar-m4": "Tir", + "iranian-calendar-m5": "Mordad", + "iranian-calendar-m6": "Shahrivar", + "iranian-calendar-m7": "Mehr", + "iranian-calendar-m8": "Aban", + "iranian-calendar-m9": "Azar", + "iranian-calendar-m10": "Dey", + "iranian-calendar-m11": "Bahman", + "iranian-calendar-m12": "Esfand", + "hijri-calendar-m1": "Muharram", + "hijri-calendar-m2": "Safar", + "hijri-calendar-m3": "Rabi' al-awwal", + "hijri-calendar-m4": "Rabi' al-thani", + "hijri-calendar-m5": "Jumada al-awwal", + "hijri-calendar-m6": "Jumada al-thani", + "hijri-calendar-m7": "Rajab", + "hijri-calendar-m8": "Sha'aban", + "hijri-calendar-m9": "Ramadan", + "hijri-calendar-m10": "Shawwal", + "hijri-calendar-m11": "Dhu al-Qi'dah", + "hijri-calendar-m12": "Dhu al-Hijjah", + "hebrew-calendar-m1": "Tishrei", + "hebrew-calendar-m2": "Cheshvan", + "hebrew-calendar-m3": "Kislev", + "hebrew-calendar-m4": "Tevet", + "hebrew-calendar-m5": "Shevat", + "hebrew-calendar-m6": "Adar", + "hebrew-calendar-m6a": "Adar I", + "hebrew-calendar-m6b": "Adar II", + "hebrew-calendar-m7": "Nisan", + "hebrew-calendar-m8": "Iyar", + "hebrew-calendar-m9": "Sivan", + "hebrew-calendar-m10": "Tamuz", + "hebrew-calendar-m11": "Av", + "hebrew-calendar-m12": "Elul", + "hebrew-calendar-m1-gen": "Tishrei", + "hebrew-calendar-m2-gen": "Cheshvan", + "hebrew-calendar-m3-gen": "Kislev", + "hebrew-calendar-m4-gen": "Tevet", + "hebrew-calendar-m5-gen": "Shevat", + "hebrew-calendar-m6-gen": "Adar", + "hebrew-calendar-m6a-gen": "Adar I", + "hebrew-calendar-m6b-gen": "Adar II", + "hebrew-calendar-m7-gen": "Nisan", + "hebrew-calendar-m8-gen": "Iyar", + "hebrew-calendar-m9-gen": "Sivan", + "hebrew-calendar-m10-gen": "Tamuz", + "hebrew-calendar-m11-gen": "Av", + "hebrew-calendar-m12-gen": "Elul", + "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])", + "signature-anon": "[[{{#special:Contributions}}/$1|$2]]", + "signature-temp": "[[{{#special:Contributions}}/$1|$2]] ([[{{ns:user_talk}}:$1|talk]])", + "timezone-utc": "UTC", + "timezone-local": "Local", + "duplicate-defaultsort": "Warning: Default sort key \"$2\" overrides earlier default sort key \"$1\".", + "duplicate-displaytitle": "Warning: Display title \"$2\" overrides earlier display title \"$1\".", + "restricted-displaytitle": "Warning: Display title \"$1\" was ignored since it is not equivalent to the page's actual title.", + "invalid-indicator-name": "Error: Page status indicators' name attribute must not be empty.", + "invalid-langconvert-attrs": "Error: Langconvert tag's from and to attributes must not be empty and must contain BCP 47 codes for convertible variants of the same language.", + "version": "Version", + "version-summary": "", + "version-extensions": "Installed extensions", + "version-skins": "Installed skins", + "version-specialpages": "Special pages", + "version-parserhooks": "Parser hooks", + "version-variables": "Variables", + "version-editors": "Editors", + "version-antispam": "Spam prevention", + "version-api": "API", + "version-other": "Other", + "version-mediahandlers": "Media handlers", + "version-hooks": "Hooks", + "version-parser-extensiontags": "Parser extension tags", + "version-parser-function-hooks": "Parser function hooks", + "version-hook-name": "Hook name", + "version-hook-subscribedby": "Subscribed by", + "version-version": "($1)", + "version-no-ext-name": "[no name]", + "version-license": "MediaWiki License", + "version-ext-license": "License", + "version-ext-colheader-name": "Extension", + "version-skin-colheader-name": "Skin", + "version-ext-colheader-version": "Version", + "version-ext-colheader-license": "License", + "version-ext-colheader-description": "Description", + "version-ext-colheader-credits": "Authors", + "version-license-title": "License for $1", + "version-license-not-found": "No detailed license information was found for this extension.", + "version-credits-title": "Credits for $1", + "version-credits-not-found": "No detailed credits information was found for this extension.", + "version-poweredby-credits": "This wiki is powered by [https://www.mediawiki.org/ MediaWiki], copyright © 2001-$1 $2.", + "version-poweredby-others": "others", + "version-poweredby-translators": "translatewiki.net translators", + "version-poweredby-various": "Various authors", + "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].", + "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nMediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].", + "version-software": "Installed software", + "version-software-product": "Product", + "version-software-version": "Version", + "version-db-mysql-url": "https://www.mysql.com/", + "version-db-mariadb-url": "https://mariadb.org/", + "version-db-percona-url": "http://www.percona.com/software/percona-server", + "version-db-postgres-url": "http://www.postgresql.org/", + "version-db-sqlite-url": "https://www.sqlite.org/", + "version-entrypoints": "Entry point URLs", + "version-entrypoints-header-entrypoint": "Entry point", + "version-entrypoints-header-url": "URL", + "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]", + "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]", + "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]", + "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]", + "version-entrypoints-rest-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:rest.php rest.php]", + "version-libraries": "Installed libraries", + "version-libraries-library": "Library", + "version-libraries-version": "Version", + "version-libraries-license": "License", + "version-libraries-description": "Description", + "version-libraries-authors": "Authors", + "redirect": "Redirect by file, user, page, revision, or log ID", + "redirect-text": "", + "redirect-summary": "This special page redirects to a file (given the filename), a page (given a revision ID or page ID), a user page (given a numeric user ID), or a log entry (given the log ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].", + "redirect-submit": "Go", + "redirect-lookup": "Lookup:", + "redirect-value": "Value:", + "redirect-user": "User ID", + "redirect-page": "Page ID", + "redirect-revision": "Page revision", + "redirect-file": "Filename", + "redirect-logid": "Log ID", + "redirect-not-exists": "Value not found", + "redirect-not-numeric": "Value not numeric", + "fileduplicatesearch": "Search for duplicate files", + "fileduplicatesearch-summary": "Search for duplicate files based on hash values.", + "fileduplicatesearch-filename": "Filename:", + "fileduplicatesearch-submit": "Search", + "fileduplicatesearch-info": "$1 × $2 pixel
    File size: $3
    MIME type: $4", + "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.", + "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.", + "fileduplicatesearch-noresults": "No file named \"$1\" found.", + "specialpages": "Special pages", + "specialpages-summary": "", + "specialpages-note-top": "Legend", + "specialpages-note-restricted": "* Normal special pages.\n* Restricted special pages.", + "specialpages-note-cached": "-", + "specialpages-group-maintenance": "Maintenance reports", + "specialpages-group-other": "Other special pages", + "specialpages-group-login": "Login / create account", + "specialpages-group-changes": "Recent changes and logs", + "specialpages-group-media": "Media reports and uploads", + "specialpages-group-users": "Users and rights", + "specialpages-group-highuse": "High use pages", + "specialpages-group-pages": "Lists of pages", + "specialpages-group-pagetools": "Page tools", + "specialpages-group-wiki": "Data and tools", + "specialpages-group-redirects": "Redirecting special pages", + "specialpages-group-spam": "Spam tools", + "specialpages-group-developer": "Developer tools", + "blankpage": "Blank page", + "intentionallyblankpage": "This page is intentionally left blank.", + "disabledspecialpage-disabled": "This page has been disabled by a system administrator.", + "external_image_whitelist": " #Leave this line exactly as it is
    \n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is
    ", + "tags": "Valid change tags", + "tags-summary": "", + "tag-filter": "[[Special:Tags|Tag]] filter:", + "tag-filter-submit": "Filter", + "tag-hidden": "$1 (hidden tag)", + "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2", + "tag-mw-contentmodelchange": "content model change", + "tag-mw-contentmodelchange-description": "Edits that [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] of a page", + "tag-mw-new-redirect": "New redirect", + "tag-mw-new-redirect-description": "Edits that create a new redirect or change a page to a redirect", + "tag-mw-removed-redirect": "Removed redirect", + "tag-mw-removed-redirect-description": "Edits that change an existing redirect to a non-redirect", + "tag-mw-changed-redirect-target": "Redirect target changed", + "tag-mw-changed-redirect-target-description": "Edits that change the target of a redirect", + "tag-mw-blank": "Blanking", + "tag-mw-blank-description": "Edits that blank a page", + "tag-mw-replace": "Replaced", + "tag-mw-replace-description": "Edits that remove more than 90% of the content of a page", + "tag-mw-rollback": "Rollback", + "tag-mw-rollback-description": "Edits that roll back previous edits using the rollback link", + "tag-mw-undo": "Undo", + "tag-mw-undo-description": "Edits that undo previous edits using the undo link", + "tag-mw-manual-revert": "Manual revert", + "tag-mw-manual-revert-description": "Edits that manually restore the page to an exact previous state", + "tag-mw-reverted": "Reverted", + "tag-mw-reverted-description": "Edits that were later reverted by a different edit", + "tag-mw-server-side-upload": "Server-side upload", + "tag-mw-server-side-upload-description": "Media files that were uploaded via a maintenance script", + "tags-title": "Tags", + "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.", + "tags-tag": "Tag name", + "tags-display-header": "Appearance on change lists", + "tags-description-header": "Full description of meaning", + "tags-source-header": "Source", + "tags-active-header": "Active?", + "tags-hitcount-header": "Tagged changes", + "tags-actions-header": "Actions", + "tags-active-yes": "Yes", + "tags-active-no": "No", + "tags-source-extension": "Defined by the software", + "tags-source-manual": "Applied manually by users and bots", + "tags-source-none": "No longer in use", + "tags-hidden": "(hidden)", + "tags-edit": "edit", + "tags-delete": "delete", + "tags-activate": "activate", + "tags-deactivate": "deactivate", + "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}", + "tags-manage-no-permission": "You do not have permission to manage change tags.", + "tags-manage-blocked": "You cannot manage change tags while {{GENDER:$1|you}} are blocked.", + "tags-create-heading": "Create a new tag", + "tags-create-explanation": "By default, newly created tags will be made available for use by users and bots.", + "tags-create-tag-name": "Tag name:", + "tags-create-reason": "Reason:", + "tags-create-submit": "Create", + "tags-create-no-name": "You must specify a tag name.", + "tags-create-invalid-chars": "Tag names must not contain commas (,), pipes (|), or forward slashes (/).", + "tags-create-invalid-title-chars": "Tag names must not contain characters that cannot be used in page titles.", + "tags-create-already-exists": "The tag \"$1\" already exists.", + "tags-create-warnings-above": "The following {{PLURAL:$2|warning was|warnings were}} encountered when attempting to create the tag \"$1\":", + "tags-create-warnings-below": "Do you wish to continue creating the tag?", + "tags-delete-title": "Delete tag", + "tags-delete-explanation-initial": "You are about to delete the tag \"$1\" from the database.", + "tags-delete-explanation-in-use": "It will be removed from {{PLURAL:$2|$2 revision or log entry|all $2 revisions and/or log entries}} to which it is currently applied.", + "tags-delete-explanation-warning": "This action is irreversible and cannot be undone, not even by database administrators. Be certain this is the tag you mean to delete.", + "tags-delete-explanation-active": "The tag \"$1\" is still active, and will continue to be applied in the future. To stop this from happening, go to the place(s) where the tag is set to be applied, and disable it there.", + "tags-delete-reason": "Reason:", + "tags-delete-submit": "Irreversibly delete this tag", + "tags-delete-not-allowed": "Tags defined by an extension cannot be deleted unless the extension specifically allows it.", + "tags-delete-not-found": "The tag \"$1\" does not exist.", + "tags-delete-too-many-uses": "The tag \"$1\" is applied to more than $2 {{PLURAL:$2|revision|revisions}}, which means it cannot be deleted.", + "tags-delete-warnings-after-delete": "The tag \"$1\" was deleted, but the following {{PLURAL:$2|warning was|warnings were}} encountered:", + "tags-delete-no-permission": "You do not have permission to delete change tags.", + "tags-activate-title": "Activate tag", + "tags-activate-question": "You are about to activate the tag \"$1\".", + "tags-activate-reason": "Reason:", + "tags-activate-not-allowed": "It is not possible to activate the tag \"$1\".", + "tags-activate-not-found": "The tag \"$1\" does not exist.", + "tags-activate-submit": "Activate", + "tags-deactivate-title": "Deactivate tag", + "tags-deactivate-question": "You are about to deactivate the tag \"$1\".", + "tags-deactivate-reason": "Reason:", + "tags-deactivate-not-allowed": "It is not possible to deactivate the tag \"$1\".", + "tags-deactivate-submit": "Deactivate", + "tags-apply-no-permission": "You do not have permission to apply change tags along with your changes.", + "tags-apply-blocked": "You cannot apply change tags along with your changes while {{GENDER:$1|you}} are blocked.", + "tags-apply-not-allowed-one": "The tag \"$1\" is not allowed to be manually applied.", + "tags-apply-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually applied: $1", + "tags-update-no-permission": "You do not have permission to add or remove change tags from individual revisions or log entries.", + "tags-update-blocked": "You cannot add or remove change tags while {{GENDER:$1|you}} are blocked.", + "tags-update-add-not-allowed-one": "The tag \"$1\" is not allowed to be manually added.", + "tags-update-add-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually added: $1", + "tags-update-remove-not-allowed-one": "The tag \"$1\" is not allowed to be removed.", + "tags-update-remove-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually removed: $1", + "tags-edit-title": "Edit tags", + "tags-edit-manage-link": "Manage tags", + "tags-edit-revision-selected": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:", + "tags-edit-logentry-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:", + "tags-edit-revision-explanation": "", + "tags-edit-logentry-explanation": "", + "tags-edit-revision-legend": "Add or remove tags from {{PLURAL:$1|this revision|all $1 revisions}}", + "tags-edit-logentry-legend": "Add or remove tags from {{PLURAL:$1|this log entry|all $1 log entries}}", + "tags-edit-existing-tags": "Existing tags:", + "tags-edit-existing-tags-none": "None", + "tags-edit-new-tags": "New tags:", + "tags-edit-add": "Add these tags:", + "tags-edit-remove": "Remove these tags:", + "tags-edit-remove-all-tags": "(remove all tags)", + "tags-edit-chosen-placeholder": "Select some tags", + "tags-edit-chosen-no-results": "No tags found that match", + "tags-edit-reason": "Reason:", + "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|this revision|$1 revisions}}", + "tags-edit-logentry-submit": "Apply changes to {{PLURAL:$1|this log entry|$1 log entries}}", + "tags-edit-success": "The changes were applied.", + "tags-edit-failure": "The changes could not be applied:\n$1", + "tags-edit-nooldid-title": "Invalid target revision", + "tags-edit-nooldid-text": "You have either not specified any target revision on which to perform this function, or the specified revision does not exist.", + "tags-edit-none-selected": "Please select at least one tag to add or remove.", + "comparepages": "Compare pages", + "comparepages-summary": "", + "compare-page1": "Page 1", + "compare-page2": "Page 2", + "compare-rev1": "Revision 1", + "compare-rev2": "Revision 2", + "compare-submit": "Compare", + "compare-revision-not-exists": "The revision you specified does not exist.", + "diff-form": "Differences", + "diff-form-oldid": "Old revision ID (optional)", + "diff-form-revid": "Revision ID of difference", + "diff-form-submit": "Show differences", + "diff-form-summary": "", + "diff-form-other-revid": "Revision ID", + "diff-form-error-revid": "Input numeric revision ID", + "permanentlink": "Permanent link", + "permanentlink-revid": "Revision ID", + "permanentlink-submit": "Go to revision", + "permanentlink-summary": "", + "newsection": "New section", + "newsection-page": "Target page", + "newsection-submit": "Go to page", + "newsection-summary": "", + "editpage": "Edit a page", + "specialeditpage-page": "Target page", + "specialeditpage-submit": "Go to page", + "editpage-summary": "", + "deletepage": "Delete a page", + "speciallogospage-page": "Logos", + "speciallogospage-submit": "Go to page", + "specialdeletepage-page": "Target page", + "specialdeletepage-submit": "Go to page", + "deletepage-summary": "", + "pageinfo": "Page info", + "specialpageinfo-page": "Target page", + "specialpageinfo-submit": "Go to page", + "pageinfo-summary": "", + "pagehistory": "Page history", + "specialpagehistory-page": "Target page", + "specialpagehistory-submit": "Go to page", + "pagehistory-summary": "", + "protectpage": "Protect a page", + "specialprotectpage-page": "Target page", + "specialprotectpage-submit": "Go to page", + "protectpage-summary": "", + "purge": "Purge", + "specialpurge-page": "Target page", + "specialpurge-submit": "Go to page", + "purge-summary": "", + "dberr-problems": "Sorry! This site is experiencing technical difficulties.", + "dberr-again": "Try waiting a few minutes and reloading.", + "dberr-info": "(Cannot access the database: $1)", + "dberr-info-hidden": "(Cannot access the database)", + "htmlform-invalid-input": "There are problems with some of your input.", + "htmlform-select-badoption": "The value you specified is not a valid option.", + "htmlform-int-invalid": "The value you specified is not an integer.", + "htmlform-float-invalid": "The value you specified is not a number.", + "htmlform-int-toolow": "The value you specified is below the minimum of $1.", + "htmlform-int-toohigh": "The value you specified is above the maximum of $1.", + "htmlform-multiselect-toomany": "The number of items you specified is above the maximum of $1.", + "htmlform-required": "This value is required.", + "htmlform-submit": "Submit", + "htmlform-reset": "Undo changes", + "htmlform-selectorother-other": "Other", + "htmlform-no": "No", + "htmlform-yes": "Yes", + "htmlform-chosen-placeholder": "Select an option", + "htmlform-cloner-create": "Add more", + "htmlform-cloner-delete": "Remove", + "htmlform-cloner-required": "At least one value is required.", + "htmlform-date-placeholder": "YYYY-MM-DD", + "htmlform-time-placeholder": "HH:MM:SS", + "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS", + "htmlform-date-invalid": "The value you specified is not a recognized date. Try using YYYY-MM-DD format.", + "htmlform-time-invalid": "The value you specified is not a recognized time. Try using HH:MM:SS format.", + "htmlform-datetime-invalid": "The value you specified is not a recognized date and time. Try using YYYY-MM-DD HH:MM:SS format.", + "htmlform-date-toolow": "The value you specified is before the earliest allowed date of $1.", + "htmlform-date-toohigh": "The value you specified is after the latest allowed date of $1.", + "htmlform-time-toolow": "The value you specified is before the earliest allowed time of $1.", + "htmlform-time-toohigh": "The value you specified is after the latest allowed time of $1.", + "htmlform-datetime-toolow": "The value you specified is before the earliest allowed date and time of $1.", + "htmlform-datetime-toohigh": "The value you specified is after the latest allowed date and time of $1.", + "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.", + "htmlform-title-not-creatable": "\"$1\" is not a creatable page title", + "htmlform-title-not-exists": "$1 does not exist.", + "htmlform-title-interwiki": "$1 is an interwiki title, should be local.", + "htmlform-user-not-exists": "$1 does not exist.", + "htmlform-user-not-valid": "$1 isn't a valid username.", + "htmlform-tag-not-allowed": "$1 is not an allowed tag", + "rawmessage": "$1", + "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3", + "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting", + "logentry-delete-delete_redir2": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting", + "logentry-delete-restore": "$1 {{GENDER:$2|undeleted}} page $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|undeleted}} page $3", + "restore-count-revisions": "{{PLURAL:$1|1 revision|$1 revisions}}", + "restore-count-files": "{{PLURAL:$1|1 file|$1 files}}", + "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4", + "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4", + "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3", + "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3", + "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3", + "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4", + "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4", + "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3", + "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3", + "revdelete-content-hid": "content hidden", + "revdelete-summary-hid": "edit summary hidden", + "revdelete-uname-hid": "username hidden", + "revdelete-content-unhid": "content unhidden", + "revdelete-summary-unhid": "edit summary unhidden", + "revdelete-uname-unhid": "username unhidden", + "revdelete-restricted": "applied restrictions to administrators", + "revdelete-unrestricted": "removed restrictions for administrators", + "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6", + "logentry-block-unblock": "$1 {{GENDER:$2|unblocked}} {{GENDER:$4|$3}}", + "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6", + "logentry-partialblock-block-page": "the {{PLURAL:$1|page|pages}} $2", + "logentry-partialblock-block-ns": "the {{PLURAL:$1|namespace|namespaces}} $2", + "logentry-partialblock-block-action": "the {{PLURAL:$1|action|actions}} $2", + "logentry-partialblock-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} from $7 with an expiration time of $5 $6", + "logentry-partialblock-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} blocking $7 with an expiration time of $5 $6", + "logentry-non-editing-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} from specified non-editing actions with an expiration time of $5 $6", + "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} for specified non-editing actions with an expiration time of $5 $6", + "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6", + "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6", + "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload", + "logentry-import-upload-details": "$1 {{GENDER:$2|imported}} $3 by file upload ($4 {{PLURAL:$4|revision|revisions}})", + "logentry-import-interwiki": "$1 {{GENDER:$2|imported}} $3 from another wiki", + "logentry-import-interwiki-details": "$1 {{GENDER:$2|imported}} $3 from $5 ($4 {{PLURAL:$4|revision|revisions}})", + "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)", + "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4", + "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect", + "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect", + "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect", + "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled", + "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled", + "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}", + "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}", + "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1", + "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email", + "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically", + "logentry-protect-move_prot": "$1 {{GENDER:$2|moved}} protection settings from $4 to $3", + "logentry-protect-unprotect": "$1 {{GENDER:$2|removed}} protection from $3", + "logentry-protect-protect": "$1 {{GENDER:$2|protected}} $3 $4", + "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]", + "logentry-protect-modify": "$1 {{GENDER:$2|changed}} protection settings for $3 $4", + "logentry-protect-modify-cascade": "$1 {{GENDER:$2|changed}} protection settings for $3 $4 [cascading]", + "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for {{GENDER:$6|$3}} from $4 to $5", + "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3", + "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5", + "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3", + "logentry-upload-revert": "$1 {{GENDER:$2|reverted}} $3 to an old version", + "log-name-managetags": "Tag management log", + "log-description-managetags": "This page lists management tasks related to [[Special:Tags|tags]]. The log contains only actions carried out manually by an administrator; tags may be created or deleted by the wiki software without an entry being recorded in this log.", + "logentry-managetags-create": "$1 {{GENDER:$2|created}} the tag \"$4\"", + "logentry-managetags-delete": "$1 {{GENDER:$2|deleted}} the tag \"$4\" (removed from $5 {{PLURAL:$5|revision or log entry|revisions and/or log entries}})", + "logentry-managetags-activate": "$1 {{GENDER:$2|activated}} the tag \"$4\" for use by users and bots", + "logentry-managetags-deactivate": "$1 {{GENDER:$2|deactivated}} the tag \"$4\" for use by users and bots", + "log-name-tag": "Tag log", + "log-description-tag": "This page shows when users have added or removed [[Special:Tags|tags]] from individual revisions or log entries. The log does not list tagging actions when they occur as part of an edit, deletion, or similar action.", + "logentry-tag-update-add-revision": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to revision $4 of page $3", + "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to log entry $5 of page $3", + "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from revision $4 of page $3", + "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from log entry $5 of page $3", + "logentry-tag-update-revision": "$1 {{GENDER:$2|updated}} tags on revision $4 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)", + "logentry-tag-update-logentry": "$1 {{GENDER:$2|updated}} tags on log entry $5 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)", + "rightsnone": "(none)", + "deletedarticle": "deleted \"[[$1]]\"", + "undeletedarticle": "undeleted \"[[$1]]\"", + "patrol-log-line": "marked $1 of $2 patrolled $3", + "patrol-log-auto": "(automatic)", + "patrol-log-diff": "revision $1", + "1movedto2": "moved [[$1]] to [[$2]]", + "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect", + "newuserlog-create-entry": "New user account", + "newuserlog-create2-entry": "created new account $1", + "newuserlog-autocreate-entry": "Account created automatically", + "rightslogentry": "changed group membership for $1 from $2 to $3", + "rightslogentry-autopromote": "was automatically promoted from $2 to $3", + "rightslogentry-temporary-group": "$1 (temporary, until $2)", + "feedback-adding": "Adding feedback to page...", + "feedback-back": "Back", + "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].", + "feedback-bugnew": "I checked. Report a new bug", + "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.", + "feedback-cancel": "Cancel", + "feedback-close": "Done", + "feedback-external-bug-report-button": "File a technical task", + "feedback-dialog-title": "Submit feedback", + "feedback-dialog-intro": "You can use the easy form below to submit your feedback. Your comment will be added to the page \"$1\", along with your username.", + "feedback-error1": "Error: Unrecognized result from API", + "feedback-error4": "Error: Unable to post to given feedback title", + "feedback-message": "Message:", + "feedback-subject": "Subject:", + "feedback-submit": "Submit", + "feedback-terms": "I understand that my user agent information includes information about my exact browser and operating system version and will be shared publicly alongside my feedback.", + "feedback-termsofuse": "I agree to provide feedback in accordance with the Terms of Use.", + "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".", + "feedback-thanks-title": "Thank you!", + "feedback-useragent": "User agent:", + "searchsuggest-search": "Search {{SITENAME}}", + "searchsuggest-containing": "Search for pages containing", + "search-match-redirect-label": "Redirect to exact matches when searching", + "search-match-redirect-help": "Select to get redirected to a page when that page title matches what you have searched for", + "searchlimit-label": "Number of search results to show on each page:", + "searchlimit-help": "Maximum number: $1", + "api-clientside-error-noconnect": "Could not connect to the server. Make sure you have a working internet connection and try again.", + "api-clientside-error-http": "Server returned error: HTTP $1.", + "api-clientside-error-timeout": "The server did not respond within the expected time.", + "api-clientside-error-aborted": "The request was aborted.", + "api-clientside-error-invalidresponse": "Invalid response from server.", + "api-error-badtoken": "Internal error: Bad token.", + "api-error-emptypage": "Creating new, empty pages is not allowed.", + "api-error-publishfailed": "Internal error: Server failed to publish temporary file.", + "api-error-stashfailed": "Internal error: Server failed to store temporary file.", + "api-error-unknown-warning": "Unknown warning: \"$1\".", + "api-error-unknownerror": "Unknown error: \"$1\".", + "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}", + "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}", + "duration-hours": "$1 {{PLURAL:$1|hour|hours}}", + "duration-days": "$1 {{PLURAL:$1|day|days}}", + "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}", + "duration-years": "$1 {{PLURAL:$1|year|years}}", + "duration-decades": "$1 {{PLURAL:$1|decade|decades}}", + "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}", + "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}", + "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise", + "limitreport-title": "Parser profiling data:", + "limitreport-cputime": "CPU time usage", + "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}", + "limitreport-walltime": "Real time usage", + "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}", + "limitreport-ppvisitednodes": "Preprocessor visited node count", + "limitreport-ppvisitednodes-value": "$1/$2", + "limitreport-postexpandincludesize": "Post-expand include size", + "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}", + "limitreport-templateargumentsize": "Template argument size", + "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}", + "limitreport-expansiondepth": "Highest expansion depth", + "limitreport-expansiondepth-value": "$1/$2", + "limitreport-expensivefunctioncount": "Expensive parser function count", + "limitreport-expensivefunctioncount-value": "$1/$2", + "limitreport-unstrip-depth": "Unstrip recursion depth", + "limitreport-unstrip-depth-value": "$1/$2", + "limitreport-unstrip-size": "Unstrip post-expand size", + "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}", + "expandtemplates": "Expand templates", + "expand_templates_intro": "This special page takes wikitext and expands all templates in it recursively.\nIt also expands supported parser functions like\n{{#language:…}} and variables like\n{{CURRENTDAY}}.\nIn fact, it expands pretty much everything in double-braces.", + "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:", + "expand_templates_input": "Input wikitext:", + "expand_templates_output": "Result", + "expand_templates_xml_output": "XML output", + "expand_templates_html_output": "Raw HTML output", + "expand_templates_ok": "OK", + "expand_templates_remove_comments": "Remove comments", + "expand_templates_remove_nowiki": "Suppress tags in result", + "expand_templates_generate_xml": "Show XML parse tree", + "expand_templates_generate_rawhtml": "Show raw HTML", + "expand_templates_preview": "Preview", + "expand_templates_preview_fail_html": "Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.\n\nIf this is a legitimate preview attempt, please try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.", + "expand_templates_preview_fail_html_anon": "Because {{SITENAME}} has raw HTML enabled and you are not logged in, the preview is hidden as a precaution against JavaScript attacks.\n\nIf this is a legitimate preview attempt, please [[Special:UserLogin|log in]] and try again.", + "expand_templates_input_missing": "You need to provide at least some input wikitext.", + "pagelanguage": "Change page language", + "pagelang-name": "Page", + "pagelang-language": "Language", + "pagelang-use-default": "Use default language", + "pagelang-select-lang": "Select language", + "pagelang-reason": "Reason", + "pagelang-submit": "Submit", + "pagelang-nonexistent-page": "The page $1 does not exist.", + "pagelang-unchanged-language": "The page $1 is already set to language $2.", + "pagelang-unchanged-language-default": "The page $1 is already set to the wiki's default content language.", + "pagelang-db-failed": "The database failed to change the page language.", + "right-pagelang": "Change page language", + "action-pagelang": "change the page language", + "log-name-pagelang": "Language change log", + "log-description-pagelang": "This is a log of changes in page languages.", + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} the language of $3 from $4 to $5", + "default-skin-not-found": "Whoops! The default skin for your wiki, defined in $wgDefaultSkin as $1, is not available.\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball installer], which comes with several skins and extensions. You can copy and paste the skins/ directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Special:MyLanguage/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into LocalSettings.php to enable {{PLURAL:$5|the|all}} installed {{PLURAL:$5|skin|skins}}:\n\n
    $3
    \n\n; If you have just modified LocalSettings.php:\n: Double-check the skin names for typos.", + "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki, defined in $wgDefaultSkin as $1, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball installer], which comes with several skins and extensions. You can copy and paste the skins/ directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Special:MyLanguage/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.", + "default-skin-not-found-row-enabled": "* $1 / $2 (enabled)", + "default-skin-not-found-row-disabled": "* $1 / $2 (disabled)", + "mediastatistics": "Media statistics", + "mediastatistics-summary": "Statistics about uploaded file types. This only includes the most recent version of a file. Old or deleted versions of files are excluded.", + "mediastatistics-nfiles": "$1 ($2%)", + "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)", + "mediastatistics-bytespertype": "Total file size for this section of {{PLURAL:$4|$4 file|$4 files}} ($5%): {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).", + "mediastatistics-allbytes": "Total file size for all {{PLURAL:$3|$3 file|$3 files}}: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).", + "mediastatistics-table-mimetype": "MIME type", + "mediastatistics-table-extensions": "Possible extensions", + "mediastatistics-table-count": "Number of files", + "mediastatistics-table-totalbytes": "Combined size", + "mediastatistics-header-unknown": "Unknown", + "mediastatistics-header-bitmap": "Bitmap images", + "mediastatistics-header-drawing": "Drawings (vector images)", + "mediastatistics-header-audio": "Audio", + "mediastatistics-header-video": "Videos", + "mediastatistics-header-multimedia": "Rich media", + "mediastatistics-header-office": "Office", + "mediastatistics-header-text": "Textual", + "mediastatistics-header-executable": "Executables", + "mediastatistics-header-archive": "Compressed formats", + "mediastatistics-header-3d": "3D", + "mediastatistics-header-total": "All files", + "json-warn-trailing-comma": "$1 trailing {{PLURAL:$1|comma was|commas were}} removed from JSON", + "json-error-unknown": "There was a problem with the JSON. Error: $1", + "json-error-depth": "The maximum stack depth has been exceeded", + "json-error-state-mismatch": "Invalid or malformed JSON", + "json-error-ctrl-char": "Control character error, possibly incorrectly encoded", + "json-error-syntax": "Syntax error", + "json-error-utf8": "Malformed UTF-8 characters, possibly incorrectly encoded", + "json-error-invalid-property-name": "The decoded property name is invalid", + "json-error-utf16": "Malformed UTF-16 characters, possibly incorrectly encoded", + "headline-anchor-title": "Link to this section", + "special-characters-group-latin": "Latin", + "special-characters-group-latinextended": "Latin extended", + "special-characters-group-ipa": "IPA", + "special-characters-group-symbols": "Symbols", + "special-characters-group-greek": "Greek", + "special-characters-group-greekextended": "Greek extended", + "special-characters-group-cyrillic": "Cyrillic", + "special-characters-group-arabic": "Arabic", + "special-characters-group-arabicextended": "Arabic extended", + "special-characters-group-persian": "Persian", + "special-characters-group-hebrew": "Hebrew", + "special-characters-group-bangla": "Bangla", + "special-characters-group-tamil": "Tamil", + "special-characters-group-telugu": "Telugu", + "special-characters-group-sinhala": "Sinhala", + "special-characters-group-gujarati": "Gujarati", + "special-characters-group-devanagari": "Devanagari", + "special-characters-group-thai": "Thai", + "special-characters-group-lao": "Lao", + "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Canadian Aboriginal", + "special-characters-group-runes": "Runes", + "special-characters-title-endash": "en dash", + "special-characters-title-emdash": "em dash", + "special-characters-title-minus": "minus sign", + "mw-widgets-abandonedit": "Are you sure you want to leave editing mode without publishing first?", + "mw-widgets-abandonedit-discard": "Discard edits", + "mw-widgets-abandonedit-keep": "Continue editing", + "mw-widgets-abandonedit-title": "Are you sure?", + "mw-widgets-copytextlayout-copy": "Copy", + "mw-widgets-copytextlayout-copy-fail": "Failed to copy to clipboard.", + "mw-widgets-copytextlayout-copy-success": "Copied to clipboard.", + "mw-widgets-dateinput-no-date": "No date selected", + "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD", + "mw-widgets-dateinput-placeholder-month": "YYYY-MM", + "mw-widgets-mediasearch-input-placeholder": "Search for media", + "mw-widgets-mediasearch-recent-uploads": "{{GENDER:$1|Your}} recent uploads", + "mw-widgets-mediasearch-noresults": "No results found.", + "mw-widgets-mediasearch-results-aria-label": "Media search results", + "mw-widgets-table-row-delete": "Delete row", + "mw-widgets-titleinput-description-new-page": "page does not exist yet", + "mw-widgets-titleinput-description-redirect": "redirect to $1", + "mw-widgets-categoryselector-add-category-placeholder": "Add a category...", + "mw-widgets-usersmultiselect-placeholder": "Add more...", + "mw-widgets-tagmultiselect-placeholder": "Add more...", + "mw-widgets-titlesmultiselect-placeholder": "Add more...", + "date-range-from": "From date:", + "date-range-to": "To date:", + "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.", + "sessionprovider-generic": "$1 sessions", + "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions", + "sessionprovider-nocookies": "Cookies may be disabled. Ensure you have cookies enabled and start again.", + "randomrootpage": "Random root page", + "log-action-filter-block": "Type of block:", + "log-action-filter-contentmodel": "Type of content model change:", + "log-action-filter-delete": "Type of deletion:", + "log-action-filter-import": "Type of import:", + "log-action-filter-managetags": "Type of tag management action:", + "log-action-filter-move": "Type of move:", + "log-action-filter-newusers": "Type of account creation:", + "log-action-filter-patrol": "Type of patrol:", + "log-action-filter-protect": "Type of protection:", + "log-action-filter-rights": "Type of right change:", + "log-action-filter-suppress": "Type of suppression:", + "log-action-filter-upload": "Type of upload:", + "log-action-filter-all": "All", + "log-action-filter-block-block": "Block", + "log-action-filter-block-reblock": "Block modification", + "log-action-filter-block-unblock": "Unblock", + "log-action-filter-contentmodel-change": "Change of content model", + "log-action-filter-contentmodel-new": "Creation of page with non-default content model", + "log-action-filter-delete-delete": "Page deletion", + "log-action-filter-delete-delete_redir": "Redirect overwrite", + "log-action-filter-delete-delete_redir2": "Redirect overwrite", + "log-action-filter-delete-restore": "Page undeletion", + "log-action-filter-delete-event": "Log deletion", + "log-action-filter-delete-revision": "Revision deletion", + "log-action-filter-import-interwiki": "Transwiki import", + "log-action-filter-import-upload": "Import by XML upload", + "log-action-filter-managetags-create": "Tag creation", + "log-action-filter-managetags-delete": "Tag deletion", + "log-action-filter-managetags-activate": "Tag activation", + "log-action-filter-managetags-deactivate": "Tag deactivation", + "log-action-filter-move-move": "Move without overwriting of redirects", + "log-action-filter-move-move_redir": "Move with overwriting of redirects", + "log-action-filter-newusers-create": "Creation by anonymous user", + "log-action-filter-newusers-create2": "Creation by registered user", + "log-action-filter-newusers-autocreate": "Automatic creation", + "log-action-filter-newusers-byemail": "Creation with password sent by email", + "log-action-filter-patrol-patrol": "Manual patrol", + "log-action-filter-patrol-autopatrol": "Automatic patrol", + "log-action-filter-protect-protect": "Protection", + "log-action-filter-protect-modify": "Protection modification", + "log-action-filter-protect-unprotect": "Unprotection", + "log-action-filter-protect-move_prot": "Moved protection", + "log-action-filter-rights-rights": "Manual change", + "log-action-filter-rights-autopromote": "Automatic change", + "log-action-filter-suppress-event": "Log suppression", + "log-action-filter-suppress-revision": "Revision suppression", + "log-action-filter-suppress-delete": "Page suppression", + "log-action-filter-suppress-block": "User suppression by block", + "log-action-filter-suppress-reblock": "User suppression by reblock", + "log-action-filter-upload-upload": "New upload", + "log-action-filter-upload-overwrite": "Reupload", + "log-action-filter-upload-revert": "Revert", + "authmanager-authn-not-in-progress": "Authentication is not in progress or session data has been lost. Please start again from the beginning.", + "authmanager-authn-no-primary": "The supplied credentials could not be authenticated.", + "authmanager-authn-no-local-user": "The supplied credentials are not associated with any user on this wiki.", + "authmanager-authn-no-local-user-link": "The supplied credentials are valid but are not associated with any user on this wiki. Login in a different way, or create a new user, and you will have an option to link your previous credentials to that account.", + "authmanager-authn-autocreate-failed": "Auto-creation of a local account failed: $1", + "authmanager-change-not-supported": "The supplied credentials cannot be changed, as nothing would use them.", + "authmanager-create-disabled": "Account creation is disabled.", + "authmanager-create-from-login": "To create your account, please fill in the fields.", + "authmanager-create-not-in-progress": "Account creation is not in progress or session data has been lost. Please start again from the beginning.", + "authmanager-create-no-primary": "The supplied credentials could not be used for account creation.", + "authmanager-link-no-primary": "The supplied credentials could not be used for account linking.", + "authmanager-link-not-in-progress": "Account linking is not in progress or session data has been lost. Please start again from the beginning.", + "authmanager-autocreate-noperm": "Automatic account creation is not allowed.", + "authmanager-autocreate-exception": "Automatic account creation temporarily disabled due to prior errors.", + "authmanager-userdoesnotexist": "User account \"$1\" is not registered.", + "authmanager-userlogin-remembermypassword-help": "Whether the password should be remembered for longer than the length of the session.", + "authmanager-username-help": "Username for authentication.", + "authmanager-password-help": "Password for authentication.", + "authmanager-domain-help": "Domain for external authentication.", + "authmanager-retype-help": "Password again to confirm.", + "authmanager-email-label": "Email", + "authmanager-email-help": "Email address", + "authmanager-realname-label": "Real name", + "authmanager-realname-help": "Real name of the user", + "authmanager-provider-password": "Password-based authentication", + "authmanager-provider-password-domain": "Password- and domain-based authentication", + "authmanager-account-password-domain": "$1@$2", + "authmanager-provider-temporarypassword": "Temporary password", + "authprovider-confirmlink-message": "Based on your recent login attempts, the following accounts can be linked to your wiki account. Linking them enables logging in via those accounts. Please select which ones should be linked.", + "authprovider-confirmlink-option": "$1 ($2)", + "authprovider-confirmlink-request-label": "Accounts which should be linked", + "authprovider-confirmlink-request-help": "", + "authprovider-confirmlink-success-line": "$1: Linked successfully.", + "authprovider-confirmlink-failed-line": "$1: $2", + "authprovider-confirmlink-failed": "Account linking did not fully succeed: $1", + "authprovider-confirmlink-ok-help": "Continue after displaying linking failure messages.", + "authprovider-resetpass-skip-label": "Skip", + "authprovider-resetpass-skip-help": "Skip resetting the password.", + "authform-nosession-login": "The authentication was successful, but your browser cannot \"remember\" being logged in.\n\n$1", + "authform-nosession-signup": "The account was created, but your browser cannot \"remember\" being logged in.\n\n$1", + "authform-newtoken": "Missing token. $1", + "authform-notoken": "Missing token", + "authform-wrongtoken": "Wrong token", + "specialpage-securitylevel-not-allowed-title": "Not allowed", + "specialpage-securitylevel-not-allowed": "Sorry, you are not allowed to use this page because your identity could not be verified.", + "authpage-cannot-login": "Unable to start login.", + "authpage-cannot-login-continue": "Unable to continue login. Your session most likely timed out.", + "authpage-cannot-create": "Unable to start account creation.", + "authpage-cannot-create-continue": "Unable to continue account creation. Your session most likely timed out.", + "authpage-cannot-link": "Unable to start account linking.", + "authpage-cannot-link-continue": "Unable to continue account linking. Your session most likely timed out.", + "cannotauth-not-allowed-title": "Permission denied", + "cannotauth-not-allowed": "You are not allowed to use this page", + "changecredentials": "Change credentials", + "changecredentials-submit": "Change credentials", + "changecredentials-invalidsubpage": "$1 is not a valid credential type.", + "changecredentials-success": "Your credentials have been changed.", + "removecredentials": "Remove credentials", + "removecredentials-submit": "Remove credentials", + "removecredentials-invalidsubpage": "$1 is not a valid credential type.", + "removecredentials-success": "Your credentials have been removed.", + "credentialsform-provider": "Credentials type:", + "credentialsform-account": "Account name:", + "cannotlink-no-provider-title": "There are no linkable accounts", + "cannotlink-no-provider": "There are no linkable accounts.", + "linkaccounts": "Link accounts", + "linkaccounts-success-text": "The account was linked.", + "linkaccounts-submit": "Link accounts", + "cannotunlink-no-provider-title": "There are no linked accounts to unlink", + "cannotunlink-no-provider": "There are no linked accounts that can be unlinked.", + "unlinkaccounts": "Unlink accounts", + "unlinkaccounts-success": "The account was unlinked.", + "authenticationdatachange-ignored": "The authentication data change was not handled. Maybe no provider was configured?", + "userjsispublic": "Please note: JavaScript subpages should not contain confidential data as they are viewable by other users.", + "userjsonispublic": "Please note: JSON subpages should not contain confidential data as they are viewable by other users.", + "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.", + "userjsdangerous": "Please note: Scripts included on this page will be run any time you load a page. Malicious code added here could result in account compromise. The code will be executed when you preview your changes to this page.", + "restrictionsfield-badip": "Invalid IP address or range: $1", + "restrictionsfield-label": "Allowed IP ranges:", + "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:
    0.0.0.0/0\n::/0
    ", + "specialmute": "Mute", + "specialmute-success": "Your mute preferences have been updated. See all muted users in [[Special:Preferences|your preferences]].", + "specialmute-submit": "Confirm", + "specialmute-label-mute-email": "Mute emails from this {{GENDER:$1|user}}", + "specialmute-header": "Please select your mute preferences for user {{BIDI:[[User:$1|$1]]}}.", + "specialmute-error-invalid-user": "The username requested could not be found.", + "specialmute-error-no-options": "Mute features are unavailable. This might be because you haven't confirmed your email address, or because the wiki administrator has disabled email features or email mutelist for this wiki.", + "specialmute-email-footer": "To manage email preferences for user {{BIDI:$2}} please visit <$1>.", + "specialmute-login-required": "Please log in to change your mute preferences.", + "mute-preferences": "Mute preferences", + "revid": "revision $1", + "pageid": "page ID $1", + "rawhtml-notallowed": "<html> tags cannot be used outside of normal pages.", + "gotointerwiki": "Leaving {{SITENAME}}", + "gotointerwiki-invalid": "The specified title is invalid.", + "gotointerwiki-external": "You are about to leave {{SITENAME}} to visit [[$2]], which is a separate website.\n\n'''[$1 Continue to $1]'''", + "undelete-cantedit": "You cannot undelete this page as you are not allowed to edit this page.", + "undelete-cantcreate": "You cannot undelete this page as there is no existing page with this name and you are not allowed to create this page.", + "pagedata-title": "Page data", + "pagedata-text": "This page provides a data interface to pages. Please provide the page title in the URL, using subpage syntax.\n* Content negotiation applies based on your client's Accept header. This means that the page data will be provided in the format preferred by your client.", + "pagedata-not-acceptable": "No matching format found. Supported MIME types: $1", + "pagedata-bad-title": "Invalid title: $1.", + "unregistered-user-config": "For security reasons JavaScript, CSS and JSON user subpages cannot be loaded for unregistered users.", + "passwordpolicies": "Password policies", + "passwordpolicies-summary": "This is a list of the effective password policies for the user groups defined in this wiki.", + "passwordpolicies-group": "Group", + "passwordpolicies-policies": "Policies", + "passwordpolicies-policy-display": "$1 ($2)", + "passwordpolicies-policy-displaywithflags": "$1 ($2) ($3)", + "passwordpolicies-policy-minimalpasswordlength": "Password must be at least $1 {{PLURAL:$1|character|characters}} long", + "passwordpolicies-policy-minimumpasswordlengthtologin": "Password must be at least $1 {{PLURAL:$1|character|characters}} long to be able to login", + "passwordpolicies-policy-passwordcannotbesubstringinusername": "Password cannot be a substring within the username", + "passwordpolicies-policy-passwordcannotmatchdefaults": "Password cannot match a specific list of default passwords", + "passwordpolicies-policy-maximalpasswordlength": "Password must be less than $1 {{PLURAL:$1|character|characters}} long", + "passwordpolicies-policy-passwordnotincommonlist": "Password cannot be in the list of 100,000 most commonly used passwords.", + "passwordpolicies-policyflag-forcechange": "must change on login", + "passwordpolicies-policyflag-suggestchangeonlogin": "suggest change on login", + "mycustomjsredirectprotected": "You do not have permission to edit this JavaScript page because it is a redirect and it does not point inside your userspace.", + "deflate-invaliddeflate": "Content provided is not properly deflated", + "unprotected-js": "For security reasons JavaScript cannot be loaded from unprotected pages. Please only create javascript in the MediaWiki: namespace or as a User subpage", + "userlogout-continue": "Do you want to log out?", + "userlogout-temp": "Are you sure you want to log out? There will be no way to log back in to your temporary account.", + "paramvalidator-baduser": "Invalid value \"$2\" for user parameter $1.", + "paramvalidator-help-type-user": "Type: {{PLURAL:$1|1=user|2=list of users}}, {{PLURAL:$3|by|by any of}} $2", + "paramvalidator-help-type-user-subtype-name": "username", + "paramvalidator-help-type-user-subtype-ip": "IP", + "paramvalidator-help-type-user-subtype-cidr": "IP range", + "paramvalidator-help-type-user-subtype-interwiki": "interwiki name (e.g. \"prefix>ExampleName\")", + "paramvalidator-help-type-user-subtype-id": "user ID (e.g. \"#12345\")", + "paramvalidator-badtitle": "Invalid value \"$2\" for title parameter $1: not a valid title string.", + "paramvalidator-missingtitle": "Invalid value \"$2\" for title parameter $1: the page does not exist.", + "paramvalidator-help-type-title": "Type: page title", + "paramvalidator-help-type-title-must-exist": "Only accepts pages that exist.", + "paramvalidator-help-type-title-no-must-exist": "Accepts non-existent pages.", + "nonmain-slot-differences-therefore-readonly": "You cannot edit the wikitext on this revision of the page, as there have been changes to the data on the page since this revision that are not wikitext-based. [$1 To restore this revision click here.]", + "config-missing-key": "Missing MediaWiki configuration parameter \"$1\"", + "config-invalid-key": "Invalid MediaWiki configuration parameter \"$1\": $2", + "changeslist-nocomment": "No edit summary", + "skin-view-create-local": "Add local description", + "nstab-mainpage": "Main Page", + "skin-view-edit-local": "Edit local description", + "skin-action-protect": "Protect", + "skin-action-undelete": "Undelete", + "skin-action-delete": "Delete", + "skin-action-move": "Move", + "copyupload-allowed-domains": "", + "parsoid-stash-rate-limit-error": "Stashing failed because rate limit was exceeded. Please try again later.", + "parsoid-resource-limit-exceeded": "Parsoid resources limit exceeded: $1", + "parsoid-client-error": "Invalid input Parsoid: $1", + "newpages-showhide-bots": "$1 bots", + "newpages-showhide-patrolled": "$1 patrolled edits", + "newpages-showhide-redirect": "$1 redirects", + "newpages-showhide-registered": "$1 registered users" +} diff --git a/resources/Resources.php b/resources/Resources.php new file mode 100644 index 0000000..9ebbefd --- /dev/null +++ b/resources/Resources.php @@ -0,0 +1,3182 @@ + [ 'class' => SiteModule::class ], + 'site.styles' => [ 'class' => SiteStylesModule::class ], + 'noscript' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'class' => WikiModule::class, + 'styles' => [ 'MediaWiki:Noscript.css' ], + 'group' => Module::GROUP_NOSCRIPT, + ], + 'filepage' => [ + 'class' => WikiModule::class, + 'styles' => [ 'MediaWiki:Filepage.css' ], + ], + + // Scripts managed by the current user (stored in their user space) + 'user' => [ 'class' => UserModule::class ], + 'user.styles' => [ 'class' => UserStylesModule::class ], + + 'user.options' => [ 'class' => UserOptionsModule::class ], + + 'mediawiki.skinning.interface' => [ + 'class' => SkinModule::class, + 'features' => [ + 'elements' => true, + 'content' => true, + 'interface' => true, + 'logo' => true, + 'legacy' => true, + ], + ], + 'jquery.makeCollapsible.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'class' => LessVarFileModule::class, + 'lessMessages' => [ + 'collapsible-collapse', + 'collapsible-expand', + ], + 'styles' => [ + 'resources/src/jquery/jquery.makeCollapsible.styles.less', + ], + ], + + 'mediawiki.skinning.content.parsoid' => [ + // Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser + // with the interface.css styles; skinStyles should be used if your + // skin over-rides common content styling. + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.skinning/content.parsoid.less', + 'resources/src/mediawiki.skinning/content.media-common.less', + 'resources/src/mediawiki.skinning/content.media-screen.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* Base modules */ + // These modules' dependencies MUST also be included in StartUpModule::getBaseModules(). + // These modules' dependencies MUST be dependency-free (having dependencies would cause recursion). + + 'jquery' => [ + 'scripts' => [ + 'resources/lib/jquery/jquery.js' + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'es6-polyfills' => [ + 'scripts' => [ + 'resources/lib/promise-polyfill/promise-polyfill.js', + 'resources/src/es6-polyfills/array-find-polyfill.js', + 'resources/src/es6-polyfills/array-findIndex-polyfill.js', + 'resources/src/es6-polyfills/array-from-polyfill.js', + 'resources/src/es6-polyfills/array-includes-polyfill.js', + ], + 'skipFunction' => 'resources/src/skip-es6-polyfills.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'web2017-polyfills' => [ + 'scripts' => [ + 'resources/lib/intersection-observer/intersection-observer.js', + 'resources/lib/fetch-polyfill/fetch.umd.js', + // The URL polyfill depends on the following in addition to the ES5 baseline + // https://github.com/Financial-Times/polyfill-library/blob/v3.110.1/polyfills/URL/config.toml#L10 + // - ES6 Array.from (via es6-polyfills) + // - ES6 Symbol.iterator (no fill needed, used conditionally) + 'resources/lib/url/URL.js', + 'resources/lib/url/URL-toJSON.js', + ], + 'skipFunction' => 'resources/src/skip-web2017-polyfills.js', + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => [ 'es6-polyfills' ] + ], + 'mediawiki.base' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.base", + 'packageFiles' => [ + // This MUST be kept in sync with maintenance/jsduck/eg-iframe.html + 'mediawiki.base.js', + 'log.js', + 'errorLogger.js', + + // (not this though) + [ 'name' => 'config.json', 'callback' => [ ResourceLoader::class, 'getSiteConfigSettings' ] ], + [ + 'name' => 'user.json', + 'callback' => static function ( Context $context ) { + $services = MediaWikiServices::getInstance(); + + return ResourceLoader::getUserDefaults( + $context, + $services->getHookContainer(), + $services->getUserOptionsLookup() + ); + } + ], + ], + 'dependencies' => 'jquery', + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* jQuery Plugins */ + + 'jquery.chosen' => [ + 'scripts' => 'resources/lib/jquery.chosen/chosen.jquery.js', + 'styles' => 'resources/lib/jquery.chosen/chosen.css', + ], + 'jquery.client' => [ + 'scripts' => 'resources/lib/jquery.client/jquery.client.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.color' => [ + 'scripts' => [ + 'resources/src/jquery.color/jquery.colorUtil.js', + 'resources/src/jquery.color/jquery.color.js', + ], + ], + 'jquery.confirmable' => [ + 'scripts' => [ + 'resources/src/jquery/jquery.confirmable.js', + 'resources/src/jquery/jquery.confirmable.mediawiki.js', + ], + 'messages' => [ + 'confirmable-confirm', + 'confirmable-yes', + 'confirmable-no', + 'word-separator', + ], + 'styles' => 'resources/src/jquery/jquery.confirmable.css', + 'dependencies' => 'mediawiki.jqueryMsg', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.cookie' => [ + 'scripts' => 'resources/lib/jquery.cookie/jquery.cookie.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.form' => [ + 'scripts' => 'resources/lib/jquery.form/jquery.form.js', + ], + 'jquery.fullscreen' => [ + 'scripts' => 'resources/lib/jquery.fullscreen/jquery.fullscreen.js', + ], + 'jquery.highlightText' => [ + 'scripts' => 'resources/src/jquery/jquery.highlightText.js', + 'dependencies' => [ + 'mediawiki.util', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.hoverIntent' => [ + 'deprecated' => 'Will be removed soon, see T311194', + 'scripts' => 'resources/lib/jquery.hoverIntent/jquery.hoverIntent.js', + ], + 'jquery.i18n' => [ + 'scripts' => [ + 'resources/lib/jquery.i18n/src/jquery.i18n.js', + 'resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js', + 'resources/lib/jquery.i18n/src/jquery.i18n.parser.js', + 'resources/lib/jquery.i18n/src/jquery.i18n.emitter.js', + 'resources/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js', + 'resources/lib/jquery.i18n/src/jquery.i18n.language.js', + 'resources/lib/jquery.i18n/src/jquery.i18n.fallbacks.js', + ], + 'dependencies' => 'mediawiki.libs.pluralruleparser', + 'languageScripts' => [ + 'bs' => 'resources/lib/jquery.i18n/src/languages/bs.js', + 'dsb' => 'resources/lib/jquery.i18n/src/languages/dsb.js', + 'fi' => 'resources/lib/jquery.i18n/src/languages/fi.js', + 'ga' => 'resources/lib/jquery.i18n/src/languages/ga.js', + 'he' => 'resources/lib/jquery.i18n/src/languages/he.js', + 'hsb' => 'resources/lib/jquery.i18n/src/languages/hsb.js', + 'hu' => 'resources/lib/jquery.i18n/src/languages/hu.js', + 'hy' => 'resources/lib/jquery.i18n/src/languages/hy.js', + 'la' => 'resources/lib/jquery.i18n/src/languages/la.js', + 'ml' => 'resources/lib/jquery.i18n/src/languages/ml.js', + 'os' => 'resources/lib/jquery.i18n/src/languages/os.js', + 'ru' => 'resources/lib/jquery.i18n/src/languages/ru.js', + 'sl' => 'resources/lib/jquery.i18n/src/languages/sl.js', + 'uk' => 'resources/lib/jquery.i18n/src/languages/uk.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.lengthLimit' => [ + 'scripts' => 'resources/src/jquery.lengthLimit.js', + 'dependencies' => 'mediawiki.String', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.makeCollapsible' => [ + 'dependencies' => [ + 'jquery.makeCollapsible.styles', + 'mediawiki.util', + ], + 'scripts' => 'resources/src/jquery/jquery.makeCollapsible.js', + 'styles' => 'resources/src/jquery/jquery.makeCollapsible.css', + 'messages' => [ 'collapsible-expand', 'collapsible-collapse' ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.spinner' => [ + 'scripts' => 'resources/src/jquery.spinner/spinner.js', + 'dependencies' => [ 'jquery.spinner.styles' ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.spinner.styles' => [ + 'styles' => 'resources/src/jquery.spinner/spinner.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'jquery.suggestions' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => 'resources/src/jquery/jquery.suggestions.js', + 'styles' => 'resources/src/jquery/jquery.suggestions.css', + 'dependencies' => 'jquery.highlightText', + ], + 'jquery.tablesorter' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => 'resources/src/jquery.tablesorter/jquery.tablesorter.js', + 'messages' => [ 'sort-descending', 'sort-ascending', 'sort-initial', 'sort-rowspan-error' ], + 'dependencies' => [ + 'jquery.tablesorter.styles', + 'mediawiki.util', + 'mediawiki.language.months', + ], + ], + 'jquery.tablesorter.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => 'resources/src/jquery.tablesorter.styles/jquery.tablesorter.styles.less', + ], + 'jquery.textSelection' => [ + 'scripts' => 'resources/src/jquery/jquery.textSelection.js', + 'dependencies' => 'jquery.client', + 'targets' => [ 'mobile', 'desktop' ], + ], + 'jquery.throttle-debounce' => [ + 'deprecated' => 'Please use OO.ui.throttle/debounce instead. See ' + . 'https://phabricator.wikimedia.org/T213426', + 'scripts' => 'resources/lib/jquery.throttle-debounce/jquery.ba-throttle-debounce.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* jQuery Tipsy */ + + 'jquery.tipsy' => [ + 'deprecated' => true, + 'scripts' => 'resources/src/jquery.tipsy/jquery.tipsy.js', + 'styles' => 'resources/src/jquery.tipsy/jquery.tipsy.css', + ], + + /* jQuery UI */ + + 'jquery.ui' => [ + 'deprecated' => 'Please use OOUI instead.', + 'targets' => [ 'mobile', 'desktop' ], + 'scripts' => [ + 'resources/lib/jquery.ui/jquery.ui.core.js', + 'resources/lib/jquery.ui/jquery.ui.widget.js', + 'resources/lib/jquery.ui/jquery.ui.mouse.js', + 'resources/lib/jquery.ui/jquery.ui.draggable.js', + 'resources/lib/jquery.ui/jquery.ui.droppable.js', + 'resources/lib/jquery.ui/jquery.ui.resizable.js', + 'resources/lib/jquery.ui/jquery.ui.selectable.js', + 'resources/lib/jquery.ui/jquery.ui.sortable.js', + 'resources/lib/jquery.ui/jquery.ui.effect.js', + 'resources/lib/jquery.ui/jquery.ui.accordion.js', + 'resources/lib/jquery.ui/jquery.ui.autocomplete.js', + 'resources/lib/jquery.ui/jquery.ui.button.js', + 'resources/lib/jquery.ui/jquery.ui.datepicker.js', + 'resources/lib/jquery.ui/jquery.ui.dialog.js', + 'resources/lib/jquery.ui/jquery.ui.effect-blind.js', + 'resources/lib/jquery.ui/jquery.ui.effect-clip.js', + 'resources/lib/jquery.ui/jquery.ui.effect-drop.js', + 'resources/lib/jquery.ui/jquery.ui.effect-highlight.js', + 'resources/lib/jquery.ui/jquery.ui.effect-scale.js', + 'resources/lib/jquery.ui/jquery.ui.effect-shake.js', + 'resources/lib/jquery.ui/jquery.ui.menu.js', + 'resources/lib/jquery.ui/jquery.ui.position.js', + 'resources/lib/jquery.ui/jquery.ui.progressbar.js', + 'resources/lib/jquery.ui/jquery.ui.slider.js', + 'resources/lib/jquery.ui/jquery.ui.tabs.js', + 'resources/lib/jquery.ui/jquery.ui.tooltip.js', + ], + 'languageScripts' => [ + 'af' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js', + 'ar' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js', + 'ar-dz' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js', + 'az' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js', + 'bg' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js', + 'bs' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js', + 'ca' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js', + 'cs' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js', + 'da' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js', + 'de-at' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de-AT.js', + 'de-ch' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de-CH.js', + 'de' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js', + 'el' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js', + 'en-au' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js', + 'en-gb' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js', + 'en-nz' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js', + 'eo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js', + 'es' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js', + 'et' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js', + 'eu' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js', + 'fa' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js', + 'fi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js', + 'fo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js', + 'fr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js', + 'fr-ch' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js', + 'gl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js', + 'he' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js', + 'hi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js', + 'hr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js', + 'hu' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hu.js', + 'hy' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js', + 'id' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js', + 'is' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js', + 'it' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js', + 'ja' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js', + 'ka' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ka.js', + 'kk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js', + 'km' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-km.js', + 'ko' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js', + 'lb' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lb.js', + 'lt' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js', + 'lv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js', + 'mk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-mk.js', + 'ml' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js', + 'ms' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js', + 'nl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js', + 'nl-be' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js', + 'no' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js', + 'pl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js', + 'pt' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js', + 'pt-br' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js', + 'rm' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js', + 'ro' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js', + 'ru' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js', + 'sk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js', + 'sl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js', + 'sq' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js', + 'sr-ec' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js', + 'sr-el' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js', + 'sv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js', + 'ta' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js', + 'th' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js', + 'tj' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js', + 'tr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js', + 'uk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js', + 'vi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js', + 'zh-cn' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js', + 'zh-hk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js', + 'zh-tw' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js', + ], + 'skinStyles' => [ + 'default' => [ + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css', + 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css', + ], + ], + ], + + /* Moment.js */ + + 'moment' => [ + 'scripts' => [ + 'resources/lib/moment/moment.js', + 'resources/src/moment/moment-module.js', + ], + 'languageScripts' => [ + 'aeb-arab' => 'resources/lib/moment/locale/ar-tn.js', + 'af' => 'resources/lib/moment/locale/af.js', + 'ar' => 'resources/lib/moment/locale/ar.js', + 'ar-ma' => 'resources/lib/moment/locale/ar-ma.js', + 'ar-sa' => 'resources/lib/moment/locale/ar-sa.js', + 'az' => 'resources/lib/moment/locale/az.js', + 'be' => 'resources/lib/moment/locale/be.js', + 'bg' => 'resources/lib/moment/locale/bg.js', + 'bm' => 'resources/lib/moment/locale/bm.js', + 'bn' => 'resources/lib/moment/locale/bn.js', + 'bo' => 'resources/lib/moment/locale/bo.js', + 'br' => 'resources/lib/moment/locale/br.js', + 'bs' => 'resources/lib/moment/locale/bs.js', + 'ca' => 'resources/lib/moment/locale/ca.js', + 'cs' => 'resources/lib/moment/locale/cs.js', + 'cv' => 'resources/lib/moment/locale/cv.js', + 'cy' => 'resources/lib/moment/locale/cy.js', + 'da' => 'resources/lib/moment/locale/da.js', + 'de' => 'resources/lib/moment/locale/de.js', + 'de-at' => 'resources/lib/moment/locale/de-at.js', + 'de-ch' => 'resources/lib/moment/locale/de-ch.js', + 'dv' => 'resources/lib/moment/locale/dv.js', + 'el' => 'resources/lib/moment/locale/el.js', + 'en' => 'resources/src/moment/moment-dmy.js', + 'en-au' => 'resources/lib/moment/locale/en-au.js', + 'en-ca' => 'resources/lib/moment/locale/en-ca.js', + 'en-gb' => 'resources/lib/moment/locale/en-gb.js', + 'eo' => 'resources/lib/moment/locale/eo.js', + 'es' => 'resources/lib/moment/locale/es.js', + 'et' => 'resources/lib/moment/locale/et.js', + 'eu' => 'resources/lib/moment/locale/eu.js', + 'fa' => 'resources/lib/moment/locale/fa.js', + 'fi' => 'resources/lib/moment/locale/fi.js', + 'fo' => 'resources/lib/moment/locale/fo.js', + 'fr' => 'resources/lib/moment/locale/fr.js', + 'fr-ca' => 'resources/lib/moment/locale/fr-ca.js', + 'fy' => 'resources/lib/moment/locale/fy.js', + 'gd' => 'resources/lib/moment/locale/gd.js', + 'gl' => 'resources/lib/moment/locale/gl.js', + 'gom' => 'resources/lib/moment/locale/gom-latn.js', + 'gom-deva' => 'resources/lib/moment/locale/gom-deva.js', + 'gom-latn' => 'resources/lib/moment/locale/gom-latn.js', + 'gu' => 'resources/lib/moment/locale/gu.js', + 'he' => 'resources/lib/moment/locale/he.js', + 'hi' => 'resources/lib/moment/locale/hi.js', + 'hr' => 'resources/lib/moment/locale/hr.js', + 'hu' => 'resources/lib/moment/locale/hu.js', + 'hy-am' => 'resources/lib/moment/locale/hy-am.js', + 'id' => 'resources/lib/moment/locale/id.js', + 'is' => 'resources/lib/moment/locale/is.js', + 'it' => 'resources/lib/moment/locale/it.js', + 'ja' => 'resources/lib/moment/locale/ja.js', + 'jv' => 'resources/lib/moment/locale/jv.js', + 'ka' => 'resources/lib/moment/locale/ka.js', + 'kk-cyrl' => 'resources/lib/moment/locale/kk.js', + 'kn' => 'resources/lib/moment/locale/kn.js', + 'ko' => 'resources/lib/moment/locale/ko.js', + 'ky' => 'resources/lib/moment/locale/ky.js', + 'lo' => 'resources/lib/moment/locale/lo.js', + 'lt' => 'resources/lib/moment/locale/lt.js', + 'lv' => 'resources/lib/moment/locale/lv.js', + 'mi' => 'resources/lib/moment/locale/mi.js', + 'mk' => 'resources/lib/moment/locale/mk.js', + 'ml' => 'resources/lib/moment/locale/ml.js', + 'mr' => 'resources/lib/moment/locale/mr.js', + 'ms-my' => 'resources/lib/moment/locale/ms-my.js', + 'ms' => 'resources/lib/moment/locale/ms.js', + 'my' => 'resources/lib/moment/locale/my.js', + 'nb' => 'resources/lib/moment/locale/nb.js', + 'ne' => 'resources/lib/moment/locale/ne.js', + 'nl' => 'resources/lib/moment/locale/nl.js', + 'nn' => 'resources/lib/moment/locale/nn.js', + 'pa' => 'resources/lib/moment/locale/pa-in.js', + 'pl' => 'resources/lib/moment/locale/pl.js', + 'pt' => 'resources/lib/moment/locale/pt.js', + 'pt-br' => 'resources/lib/moment/locale/pt-br.js', + 'ro' => 'resources/lib/moment/locale/ro.js', + 'ru' => 'resources/lib/moment/locale/ru.js', + 'sd' => 'resources/lib/moment/locale/sd.js', + 'se' => 'resources/lib/moment/locale/se.js', + 'si' => 'resources/lib/moment/locale/si.js', + 'sk' => 'resources/lib/moment/locale/sk.js', + 'sl' => 'resources/lib/moment/locale/sl.js', + 'sq' => 'resources/lib/moment/locale/sq.js', + 'sr-ec' => 'resources/lib/moment/locale/sr-cyrl.js', + 'sr-el' => 'resources/lib/moment/locale/sr.js', + 'ss' => 'resources/lib/moment/locale/ss.js', + 'sv' => 'resources/lib/moment/locale/sv.js', + 'sw' => 'resources/lib/moment/locale/sw.js', + 'ta' => 'resources/lib/moment/locale/ta.js', + 'te' => 'resources/lib/moment/locale/te.js', + 'tet' => 'resources/lib/moment/locale/tet.js', + 'th' => 'resources/lib/moment/locale/th.js', + 'tl' => 'resources/lib/moment/locale/tl-ph.js', + 'tr' => 'resources/lib/moment/locale/tr.js', + 'tzm' => 'resources/lib/moment/locale/tzm.js', + 'tzm-latn' => 'resources/lib/moment/locale/tzm-latn.js', + 'uk' => 'resources/lib/moment/locale/uk.js', + 'ur' => 'resources/lib/moment/locale/ur.js', + 'uz' => 'resources/lib/moment/locale/uz-latn.js', # https://phabricator.wikimedia.org/T308123 + 'uz-latn' => 'resources/lib/moment/locale/uz-latn.js', + 'vi' => 'resources/lib/moment/locale/vi.js', + 'yo' => 'resources/lib/moment/locale/yo.js', + 'zh-hans' => 'resources/lib/moment/locale/zh-cn.js', + 'zh-hant' => 'resources/lib/moment/locale/zh-tw.js', + 'zh-cn' => 'resources/lib/moment/locale/zh-cn.js', + 'zh-hk' => 'resources/lib/moment/locale/zh-hk.js', + 'zh-mo' => 'resources/lib/moment/locale/zh-mo.js', + 'zh-tw' => 'resources/lib/moment/locale/zh-tw.js', + ], + // HACK: skinScripts come after languageScripts, and we need locale overrides to come + // after locale definitions + 'skinScripts' => [ + 'default' => [ + 'resources/src/moment/moment-locale-overrides.js', + ], + ], + 'dependencies' => [ + 'mediawiki.language', + 'mediawiki.util', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* Vue */ + + 'vue' => [ + 'packageFiles' => [ + 'resources/src/vue/index.js', + 'resources/src/vue/errorLogger.js', + 'resources/src/vue/i18n.js', + [ + 'name' => 'resources/lib/vue/vue.js', + 'callback' => static function ( Context $context, Config $config ) { + $baseDir = $config->get( MainConfigNames::BaseDirectory ); + // Use the development version if development mode is enabled, or if we're in debug mode + $file = $config->get( MainConfigNames::VueDevelopmentMode ) || $context->getDebug() ? + 'resources/lib/vue/vue.global.js' : + 'resources/lib/vue/vue.global.prod.js'; + // The file shipped by Vue does var Vue = ...;, but doesn't export it + // Add module.exports = Vue; programmatically + return file_get_contents( "$baseDir/$file" ) . + ';module.exports=Vue;'; + }, + 'versionCallback' => static function ( Context $context, Config $config ) { + $file = $config->get( MainConfigNames::VueDevelopmentMode ) || $context->getDebug() ? + 'resources/lib/vue/vue.global.js' : + 'resources/lib/vue/vue.global.prod.js'; + return new FilePath( $file ); + } + ], + + ], + 'es6' => true, + 'targets' => [ 'desktop', 'mobile' ], + ], + + // Alias for 'vue', for backwards compatibility + '@vue/composition-api' => [ + 'packageFiles' => [ + 'resources/src/vue/composition-api.js' + ], + 'dependencies' => [ + 'vue' + ], + 'es6' => true, + 'targets' => [ 'desktop', 'mobile' ] + ], + + 'vuex' => [ + 'packageFiles' => [ + [ + 'name' => 'resources/lib/vuex/vuex.js', + 'callback' => static function ( Context $context, Config $config ) { + $baseDir = $config->get( MainConfigNames::BaseDirectory ); + // Use the development version if development mode is enabled, or if we're in debug mode + $file = $config->get( MainConfigNames::VueDevelopmentMode ) || $context->getDebug() ? + 'resources/lib/vuex/vuex.global.js' : + 'resources/lib/vuex/vuex.global.prod.js'; + // The file shipped by Vuex does var Vuex = ...;, but doesn't export it + // Add module.exports = Vuex; programmatically, and import Vue + return "var Vue=require('vue');" . + file_get_contents( "$baseDir/$file" ) . + ';module.exports=Vuex;'; + }, + 'versionCallback' => static function ( Context $context, Config $config ) { + $file = $config->get( MainConfigNames::VueDevelopmentMode ) || $context->getDebug() ? + 'resources/lib/vuex/vuex.global.js' : + 'resources/lib/vuex/vuex.global.prod.js'; + return new FilePath( $file ); + } + ], + ], + 'dependencies' => [ + 'vue', + ], + 'es6' => true, + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'wvui' => [ + 'deprecated' => 'Deprecated in 1.39. Use `@wikimedia/codex` instead.', + 'packageFiles' => [ + 'resources/src/wvui/wvui.js', + 'resources/lib/wvui/wvui.commonjs2.js', + ], + 'styles' => [ + 'resources/lib/wvui/wvui.css', + ], + 'dependencies' => [ + 'vue', + '@vue/composition-api', + ], + 'es6' => true, + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'wvui-search' => [ + 'deprecated' => 'Deprecated in 1.39. Use `@wikimedia/codex-search` instead.', + 'packageFiles' => [ + 'resources/src/wvui/wvui-search.js', + 'resources/lib/wvui/wvui-search.commonjs2.js', + ], + 'styles' => [ + 'resources/lib/wvui/wvui-search.css', + ], + 'dependencies' => [ + 'vue' + ], + 'es6' => true, + 'targets' => [ 'desktop', 'mobile' ], + ], + + '@wikimedia/codex' => [ + 'class' => CodexModule::class, + 'targets' => [ 'desktop', 'mobile' ], + 'packageFiles' => [ + 'resources/src/codex/codex.js', + 'resources/lib/codex/codex.umd.js', + ], + 'dirSpecificStyles' => [ + // Special syntax supported by CodexModule + 'ltr' => 'resources/lib/codex/codex.style.css', + 'rtl' => 'resources/lib/codex/codex.style-rtl.css' + ], + // Do not flip styles in RTL contexts, because we're already providing RTL-specific styles + 'noflip' => true, + 'dependencies' => [ + 'vue' + ], + 'es6' => true + ], + + '@wikimedia/codex-search' => [ + 'class' => CodexModule::class, + 'targets' => [ 'desktop', 'mobile' ], + 'packageFiles' => [ + 'resources/src/codex-search/codex-search.js', + 'resources/lib/codex-search/codex-search.umd.js', + ], + 'dirSpecificStyles' => [ + // Special syntax supported by CodexModule + 'ltr' => 'resources/lib/codex-search/codex-search.style.css', + 'rtl' => 'resources/lib/codex-search/codex-search.style-rtl.css' + ], + // Do not flip styles in RTL contexts, because we're already providing RTL-specific styles + 'noflip' => true, + 'dependencies' => [ + 'vue' + ], + 'es6' => true + ], + + /* MediaWiki */ + 'mediawiki.template' => [ + 'scripts' => 'resources/src/mediawiki.template.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.template.mustache' => [ + 'scripts' => [ + 'resources/lib/mustache/mustache.js', + 'resources/src/mediawiki.template.mustache.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => 'mediawiki.template', + ], + 'mediawiki.apipretty' => [ + 'styles' => [ + 'resources/src/mediawiki.apipretty/apipretty.css', + 'resources/src/mediawiki.apipretty/apihelp.css', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.api' => [ + 'scripts' => [ + 'resources/src/mediawiki.api/index.js', + 'resources/src/mediawiki.api/rest.js', + 'resources/src/mediawiki.api/category.js', + 'resources/src/mediawiki.api/edit.js', + 'resources/src/mediawiki.api/login.js', + 'resources/src/mediawiki.api/messages.js', + 'resources/src/mediawiki.api/options.js', + 'resources/src/mediawiki.api/parse.js', + 'resources/src/mediawiki.api/rollback.js', + 'resources/src/mediawiki.api/upload.js', + 'resources/src/mediawiki.api/user.js', + 'resources/src/mediawiki.api/watch.js', + ], + 'dependencies' => [ + 'mediawiki.Title', + 'mediawiki.util', + 'mediawiki.jqueryMsg', + 'user.options', + ], + 'messages' => [ + 'api-clientside-error-noconnect', + 'api-clientside-error-http', + 'api-clientside-error-timeout', + 'api-clientside-error-aborted', + 'api-clientside-error-invalidresponse', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.content.json' => [ + 'styles' => 'resources/src/mediawiki.content.json.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.confirmCloseWindow' => [ + 'scripts' => [ + 'resources/src/mediawiki.confirmCloseWindow.js', + ], + 'messages' => [ + 'confirmleave-warning', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.debug' => [ + 'scripts' => [ + 'resources/src/mediawiki.debug/jquery.footHovzer.js', + 'resources/src/mediawiki.debug/debug.js', + ], + 'styles' => [ + 'resources/src/mediawiki.debug/jquery.footHovzer.css', + 'resources/src/mediawiki.debug/debug.less', + ], + 'dependencies' => [ + 'oojs-ui-core', + ], + ], + 'mediawiki.diff' => [ + 'scripts' => [ + 'resources/src/mediawiki.diff.styles/diff.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.diff.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.diff.styles/diff.less', + 'resources/src/mediawiki.diff.styles/print.css' => [ + 'media' => 'print' + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.feedback' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.feedback", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.feedback", + 'packageFiles' => [ + 'feedback.js', + 'FeedbackDialog.js', + ], + 'styles' => 'feedback.less', + 'dependencies' => [ + 'mediawiki.messagePoster', + 'mediawiki.Title', + 'oojs-ui-core', + 'oojs-ui-windows', + ], + 'messages' => [ + 'feedback-adding', + 'feedback-back', + 'feedback-bugcheck', + 'feedback-dialog-intro', + 'feedback-external-bug-report-button', + 'feedback-bugnew', + 'feedback-bugornote', + 'feedback-cancel', + 'feedback-close', + 'feedback-dialog-title', + 'feedback-error1', + 'feedback-error4', + 'feedback-message', + 'feedback-subject', + 'feedback-submit', + 'feedback-terms', + 'feedback-termsofuse', + 'feedback-thanks', + 'feedback-thanks-title', + 'feedback-useragent' + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.feedlink' => [ + 'styles' => 'resources/src/mediawiki.feedlink/feedlink.css', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.filewarning' => [ + 'scripts' => 'resources/src/mediawiki.filewarning/filewarning.js', + 'styles' => 'resources/src/mediawiki.filewarning/filewarning.less', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui.styles.icons-alerts', + ], + ], + 'mediawiki.ForeignApi' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'class' => ForeignApiModule::class, + // Additional dependencies generated dynamically + 'dependencies' => 'mediawiki.ForeignApi.core', + ], + 'mediawiki.ForeignApi.core' => [ + 'packageFiles' => [ + 'resources/src/mediawiki.ForeignApi/index.js', + 'resources/src/mediawiki.ForeignApi/mediawiki.ForeignApi.core.js', + 'resources/src/mediawiki.ForeignApi/mediawiki.ForeignRest.core.js' + ], + 'dependencies' => [ + 'mediawiki.api', + 'oojs', + 'mediawiki.Uri', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.helplink' => [ + 'styles' => [ + 'resources/src/mediawiki.helplink/helplink.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.hlist' => [ + 'class' => LessVarFileModule::class, + 'lessMessages' => [ + 'colon-separator', + 'parentheses-start', + 'parentheses-end', + ], + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => [ + 'resources/src/mediawiki.hlist/hlist.less', + ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.hlist/default.less', + ], + ], + 'mediawiki.htmlform' => [ + 'scripts' => [ + 'resources/src/mediawiki.htmlform/htmlform.js', + 'resources/src/mediawiki.htmlform/autocomplete.js', + 'resources/src/mediawiki.htmlform/autoinfuse.js', + 'resources/src/mediawiki.htmlform/checkmatrix.js', + 'resources/src/mediawiki.htmlform/cloner.js', + 'resources/src/mediawiki.htmlform/cond-state.js', + 'resources/src/mediawiki.htmlform/multiselect.js', + 'resources/src/mediawiki.htmlform/selectandother.js', + 'resources/src/mediawiki.htmlform/selectorother.js', + ], + 'dependencies' => [ + 'mediawiki.util', + 'jquery.lengthLimit', + ], + 'messages' => [ + 'htmlform-chosen-placeholder', + // @todo Load this message in content language + 'colon-separator', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.htmlform.ooui' => [ + 'scripts' => [ + 'resources/src/mediawiki.htmlform.ooui/Element.js', + ], + 'dependencies' => [ + 'oojs-ui-core', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.htmlform.styles' => [ + 'styles' => 'resources/src/mediawiki.htmlform.styles/styles.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.htmlform.ooui.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.collapsiblefieldsetlayout.styles.less', + 'resources/src/mediawiki.htmlform.ooui.styles.less' + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.icon' => [ + 'styles' => 'resources/src/mediawiki.icon/icon.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.inspect' => [ + 'scripts' => 'resources/src/mediawiki.inspect.js', + 'dependencies' => [ + 'mediawiki.String', + 'mediawiki.util', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.notification' => [ + 'styles' => [ + 'resources/src/mediawiki.notification/common.css', + 'resources/src/mediawiki.notification/print.css' + => [ 'media' => 'print' ], + ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.notification/default.css', + ], + 'scripts' => 'resources/src/mediawiki.notification/notification.js', + 'dependencies' => [ + 'mediawiki.util', + 'mediawiki.visibleTimeout', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.notification.convertmessagebox' => [ + 'scripts' => 'resources/src/mediawiki.notification.convertmessagebox.js', + 'dependencies' => [ + 'mediawiki.notification', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.notification.convertmessagebox.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.notification.convertmessagebox.styles.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.String' => [ + 'scripts' => 'resources/src/mediawiki.String.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.pager.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => [ + 'resources/src/mediawiki.pager.styles/TablePager.less', + 'resources/src/mediawiki.pager.styles/DataTable.less', + ], + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.pager.styles/IndexPager.less', + ] + ], + ], + 'mediawiki.pager.tablePager' => [ + 'deprecated' => 'Deprecated in 1.38. Use `mediawiki.pager.styles`', + 'styles' => [ + 'resources/src/mediawiki.pager.styles/TablePager.less', + 'resources/src/mediawiki.pager.styles/DataTable.less', + ], + ], + 'mediawiki.pulsatingdot' => [ + 'styles' => [ + 'resources/src/mediawiki.pulsatingdot/mediawiki.pulsatingdot.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.searchSuggest' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => 'resources/src/mediawiki.searchSuggest/searchSuggest.js', + 'styles' => 'resources/src/mediawiki.searchSuggest/searchSuggest.css', + 'messages' => [ + 'searchsuggest-search', + 'searchsuggest-containing', + ], + 'dependencies' => [ + 'jquery.suggestions', + 'mediawiki.api', + 'user.options', + ], + ], + 'mediawiki.storage' => [ + 'scripts' => 'resources/src/mediawiki.storage.js', + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => [ + 'mediawiki.util', + ], + ], + 'mediawiki.Title' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.Title", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.Title", + 'packageFiles' => [ + 'Title.js', + 'phpCharToUpper.json' + ], + 'dependencies' => [ + 'mediawiki.String', + 'mediawiki.util', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.Upload' => [ + 'scripts' => 'resources/src/mediawiki.Upload.js', + 'dependencies' => [ + 'mediawiki.api', + ], + ], + 'mediawiki.ForeignUpload' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src", + 'remoteBasePath' => "$wgResourceBasePath/resources/src", + 'packageFiles' => [ + 'mediawiki.ForeignUpload.js', + [ + 'name' => 'config.json', + 'config' => [ MainConfigNames::ForeignUploadTargets, MainConfigNames::EnableUploads ], + ], + ], + 'dependencies' => [ + 'mediawiki.ForeignApi', + 'mediawiki.Upload', + 'oojs', + ], + 'messages' => [ + 'uploaddisabledtext', + 'upload-dialog-disabled', + 'upload-foreign-cant-upload', + ] + ], + 'mediawiki.Upload.Dialog' => [ + 'scripts' => [ + 'resources/src/mediawiki.Upload.Dialog.js', + ], + 'dependencies' => [ + 'mediawiki.Upload.BookletLayout', + ], + 'messages' => [ + 'upload-dialog-title', + 'upload-dialog-button-cancel', + 'upload-dialog-button-back', + 'upload-dialog-button-done', + 'upload-dialog-button-save', + 'upload-dialog-button-upload', + ], + ], + 'mediawiki.Upload.BookletLayout' => [ + 'scripts' => [ + 'resources/src/mediawiki.Upload.BookletLayout/mw.widgets.StashedFileWidget.js', + 'resources/src/mediawiki.Upload.BookletLayout/BookletLayout.js', + ], + 'styles' => [ + 'resources/src/mediawiki.Upload.BookletLayout/BookletLayout.css', + ], + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.Upload.BookletLayout/mw.widgets.StashedFileWidget.less', + ], + ], + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-widgets', + 'oojs-ui-windows', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-editing-advanced', + 'moment', + 'mediawiki.Title', + 'mediawiki.api', + 'mediawiki.user', + 'mediawiki.Upload', + 'mediawiki.jqueryMsg', + ], + 'messages' => [ + 'upload-form-label-infoform-title', + 'upload-form-label-infoform-name', + 'upload-form-label-infoform-name-tooltip', + 'upload-form-label-infoform-description', + 'upload-form-label-infoform-description-tooltip', + 'upload-form-label-usage-title', + 'upload-form-label-usage-filename', + 'action-upload', + 'apierror-mustbeloggedin', + 'apierror-permissiondenied', + 'badaccess-groups', + 'api-error-unknown-warning', + 'fileexists', + 'filepageexists', + 'file-exists-duplicate', + 'file-deleted-duplicate', + 'filename-bad-prefix', + 'filename-thumb-name', + 'filewasdeleted', + 'badfilename', + 'protectedpagetext', + ], + ], + 'mediawiki.ForeignStructuredUpload.BookletLayout' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.ForeignStructuredUpload.BookletLayout", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.ForeignStructuredUpload.BookletLayout", + 'packageFiles' => [ + "index.js", + 'ForeignStructuredUpload.js', + [ 'name' => 'config.json', 'config' => [ MainConfigNames::UploadDialog ] ], + "BookletLayout.js", + ], + 'dependencies' => [ + 'mediawiki.ForeignUpload', + 'mediawiki.Upload.BookletLayout', + 'mediawiki.widgets.CategoryMultiselectWidget', + 'mediawiki.widgets.DateInputWidget', + 'mediawiki.jqueryMsg', + 'mediawiki.api', + 'moment', + 'mediawiki.libs.jpegmeta', + ], + 'messages' => [ + 'upload-foreign-cant-load-config', + 'upload-form-label-own-work', + 'upload-form-label-infoform-categories', + 'upload-form-label-infoform-date', + 'upload-form-label-own-work-message-generic-local', + 'upload-form-label-not-own-work-message-generic-local', + 'upload-form-label-not-own-work-local-generic-local', + 'upload-form-label-own-work-message-generic-foreign', + 'upload-form-label-not-own-work-message-generic-foreign', + 'upload-form-label-not-own-work-local-generic-foreign', + ], + ], + 'mediawiki.toc' => [ + 'scripts' => 'resources/src/mediawiki.toc/toc.js', + 'styles' => [ + 'resources/src/mediawiki.toc/toc.css' + => [ 'media' => 'screen' ], + ], + 'dependencies' => [ + 'mediawiki.cookie', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.Uri' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.Uri", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.Uri", + 'packageFiles' => [ + 'Uri.js', + [ 'name' => 'loose.regexp.js', + 'callback' => static function ( Context $context, Config $config ) { + $baseDir = $config->get( MainConfigNames::BaseDirectory ); + return MwUrlModule::makeJsFromExtendedRegExp( + file_get_contents( "$baseDir/resources/src/mediawiki.Uri/loose.regexp" ) + ); + }, + 'versionCallback' => static function () { + return new FilePath( 'loose.regexp' ); + }, + ], + [ 'name' => 'strict.regexp.js', + 'callback' => static function ( Context $context, Config $config ) { + $baseDir = $config->get( MainConfigNames::BaseDirectory ); + return MwUrlModule::makeJsFromExtendedRegExp( + file_get_contents( "$baseDir/resources/src/mediawiki.Uri/strict.regexp" ) + ); + }, + 'versionCallback' => static function () { + return new FilePath( 'strict.regexp' ); + }, + ], + ], + 'dependencies' => 'mediawiki.util', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.user' => [ + 'scripts' => 'resources/src/mediawiki.user.js', + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.cookie', + // user.options is not directly used in mediawiki.user, but it + // provides part of the mw.user API that consumers expect + 'user.options', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.userSuggest' => [ + 'scripts' => 'resources/src/mediawiki.userSuggest.js', + 'dependencies' => [ + 'jquery.suggestions', + 'mediawiki.api' + ] + ], + 'mediawiki.util' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.util", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.util", + 'packageFiles' => [ + 'util.js', + 'jquery.accessKeyLabel.js', + [ 'name' => 'config.json', 'config' => [ + MainConfigNames::FragmentMode, + MainConfigNames::GenerateThumbnailOnParse, + MainConfigNames::LoadScript, + ] ], + [ 'name' => 'portletLinkOptions.json', 'callback' => [ Skin::class, 'getPortletLinkOptions' ] ], + ], + 'dependencies' => [ + 'jquery.client', + 'web2017-polyfills', + ], + 'messages' => [ 'brackets', 'word-separator' ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.checkboxtoggle' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => 'resources/src/mediawiki.checkboxtoggle.js', + ], + 'mediawiki.checkboxtoggle.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => 'resources/src/mediawiki.checkboxtoggle.styles.css', + ], + 'mediawiki.cookie' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.cookie", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.cookie", + 'packageFiles' => [ + 'index.js', + [ 'name' => 'config.json', 'config' => [ + 'prefix' => MainConfigNames::CookiePrefix, + 'domain' => MainConfigNames::CookieDomain, + 'path' => MainConfigNames::CookiePath, + 'expires' => MainConfigNames::CookieExpiration, + 'sameSiteLegacy' => MainConfigNames::UseSameSiteLegacyCookies, + ] ], + ], + 'dependencies' => 'jquery.cookie', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.experiments' => [ + 'scripts' => 'resources/src/mediawiki.experiments.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.editfont.styles' => [ + 'styles' => 'resources/src/mediawiki.editfont.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.visibleTimeout' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.visibleTimeout", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.visibleTimeout", + 'packageFiles' => [ + 'visibleTimeout.js' + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* MediaWiki Action */ + + 'mediawiki.action.delete' => [ + 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.delete.js', + 'dependencies' => [ + 'oojs-ui-core', + 'jquery.lengthLimit', + ], + 'messages' => [ + // @todo Load this message in content language + 'colon-separator', + ], + ], + 'mediawiki.action.edit' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.action.edit", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.action.edit", + 'packageFiles' => [ + 'edit.js', + 'stash.js', + 'watchlistExpiry.js', + ], + 'styles' => 'edit.css', + 'dependencies' => [ + 'mediawiki.action.edit.styles', + 'mediawiki.editfont.styles', + 'jquery.textSelection', + 'oojs-ui-core', + 'mediawiki.widgets.visibleLengthLimit', + 'mediawiki.api', + 'mediawiki.util', + ], + ], + 'mediawiki.action.edit.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => [ + 'resources/src/mediawiki.action/mediawiki.action.edit.styles.less', + 'resources/src/mediawiki.action/mediawiki.action.edit.checkboxes.less', + ] + ], + 'mediawiki.action.edit.collapsibleFooter' => [ + 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js', + 'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css', + 'dependencies' => [ + 'jquery.makeCollapsible', + 'mediawiki.storage', + 'mediawiki.icon', + ], + ], + 'mediawiki.action.edit.preview' => [ + 'packageFiles' => [ + 'resources/src/mediawiki.action/mediawiki.action.edit.preview.js', + [ + 'name' => 'resources/src/mediawiki.action/mediawiki.action.edit.preview.parsedMessages.json', + 'callback' => static function ( MessageLocalizer $messageLocalizer ) { + return [ + 'previewnote' => $messageLocalizer->msg( 'previewnote' )->parse(), + ]; + }, + // Use versionCallback to avoid calling the parser from version invalidation code. + 'versionCallback' => static function ( MessageLocalizer $messageLocalizer ) { + return [ + 'previewnote' => [ + // Include the text of the message, in case the canonical translation changes + $messageLocalizer->msg( 'previewnote' )->plain(), + // Include the page touched time, in case the on-wiki override is invalidated + Title::makeTitle( NS_MEDIAWIKI, 'Previewnote' )->getTouched(), + ], + ]; + }, + ] + ], + 'dependencies' => [ + 'jquery.spinner', + 'mediawiki.api', + 'mediawiki.diff', + 'mediawiki.diff.styles', + 'mediawiki.user', + 'mediawiki.page.preview', + ], + 'messages' => [ + 'continue-editing', + 'currentrev', + 'otherlanguages', + 'preview', + 'previewerrortext', + 'yourtext', + ], + ], + 'mediawiki.action.history' => [ + 'dependencies' => [ 'jquery.makeCollapsible' ], + 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js', + 'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css', + 'targets' => [ 'desktop', 'mobile' ] + ], + 'mediawiki.action.history.styles' => [ + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.action/mediawiki.action.history.styles.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.action.protect' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.action", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.action", + 'packageFiles' => [ + 'mediawiki.action.protect.js', + [ 'name' => 'config.json', 'config' => [ MainConfigNames::CascadingRestrictionLevels ] ], + ], + 'dependencies' => [ + 'oojs-ui-core', + 'jquery.lengthLimit' + ], + 'messages' => [ 'protect-unchain-permissions' ] + ], + 'mediawiki.action.view.metadata' => [ + 'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.css', + 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.metadata.js', + 'messages' => [ + 'metadata-expand', + 'metadata-collapse', + ], + 'dependencies' => 'mediawiki.action.view.filepage', + ], + + // @deprecated To be removed one week after If406ce2ae38eb165 is merged. + 'mediawiki.action.view.categoryPage.styles' => [ + 'styles' => 'resources/src/mediawiki.action.styles/categoryPage.less', + 'targets' => [ 'desktop', 'mobile' ] + ], + 'mediawiki.action.view.postEdit' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.action", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.action", + 'packageFiles' => [ + 'mediawiki.action.view.postEdit.js', + [ 'name' => 'config.json', 'config' => [ MainConfigNames::EditSubmitButtonLabelPublish ] ], + ], + 'dependencies' => [ + 'mediawiki.jqueryMsg', + 'mediawiki.notification', + 'oojs-ui-core', + 'oojs-ui.styles.icons-interactions', + ], + 'messages' => [ + 'postedit-confirmation-created', + 'postedit-confirmation-restored', + 'postedit-confirmation-saved', + 'postedit-confirmation-published', + 'postedit-temp-created-label', + 'postedit-temp-created', + ], + ], + 'mediawiki.action.view.redirect' => [ + 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.redirect.js', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.action.view.redirectPage' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css', + ], + 'mediawiki.action.edit.editWarning' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js', + 'dependencies' => [ + 'jquery.textSelection', + 'mediawiki.jqueryMsg', + 'mediawiki.confirmCloseWindow', + 'user.options', + ], + ], + 'mediawiki.action.view.filepage' => [ + 'styles' => [ + 'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.less' => + [ 'media' => 'print' ], + 'resources/src/mediawiki.action/mediawiki.action.view.filepage.css', + ], + ], + + // This bundles small stylesheets (<2KB) that: + // - .. are not loaded when viewing or editing content pages. + // - .. style the rendering of other wikipage actions and/or other namespaces. + 'mediawiki.action.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => [ + 'resources/src/mediawiki.action.styles/styles.less', + 'resources/src/mediawiki.action.styles/categoryPage.less', + ], + ], + + /* MediaWiki Language */ + + 'mediawiki.language' => [ + 'class' => LanguageDataModule::class, + 'scripts' => [ + 'resources/src/mediawiki.language/mediawiki.language.init.js', + 'resources/src/mediawiki.language/mediawiki.language.js', + 'resources/src/mediawiki.language/mediawiki.language.numbers.js', + 'resources/src/mediawiki.language/mediawiki.language.fallback.js', + ], + 'languageScripts' => [ + 'bs' => 'resources/src/mediawiki.language/languages/bs.js', + 'dsb' => 'resources/src/mediawiki.language/languages/dsb.js', + 'fi' => 'resources/src/mediawiki.language/languages/fi.js', + 'ga' => 'resources/src/mediawiki.language/languages/ga.js', + 'hsb' => 'resources/src/mediawiki.language/languages/hsb.js', + 'hu' => 'resources/src/mediawiki.language/languages/hu.js', + 'hy' => 'resources/src/mediawiki.language/languages/hy.js', + 'la' => 'resources/src/mediawiki.language/languages/la.js', + 'os' => 'resources/src/mediawiki.language/languages/os.js', + 'sl' => 'resources/src/mediawiki.language/languages/sl.js', + ], + 'dependencies' => [ + 'mediawiki.cldr', + ], + 'messages' => [ + 'and', + 'comma-separator', + 'word-separator' + ], + ], + + 'mediawiki.cldr' => [ + 'scripts' => 'resources/src/mediawiki.cldr/index.js', + 'dependencies' => [ + 'mediawiki.libs.pluralruleparser', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.libs.pluralruleparser' => [ + 'scripts' => [ + 'resources/lib/CLDRPluralRuleParser/CLDRPluralRuleParser.js', + 'resources/src/mediawiki.libs.pluralruleparser/export.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.jqueryMsg' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.jqueryMsg", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.jqueryMsg", + 'packageFiles' => [ + 'mediawiki.jqueryMsg.js', + [ 'name' => 'parserDefaults.json', 'callback' => static function ( + Context $context, Config $config + ) { + $tagData = Sanitizer::getRecognizedTagData(); + $allowedHtmlElements = array_merge( + array_keys( $tagData['htmlpairs'] ), + array_diff( + array_keys( $tagData['htmlsingle'] ), + array_keys( $tagData['htmlsingleonly'] ) + ) + ); + + $magicWords = [ + 'SITENAME' => $config->get( MainConfigNames::Sitename ), + ]; + Hooks::runner()->onResourceLoaderJqueryMsgModuleMagicWords( $context, $magicWords ); + + return [ + 'allowedHtmlElements' => $allowedHtmlElements, + 'magic' => $magicWords, + ]; + } ], + ], + 'dependencies' => [ + 'mediawiki.util', + 'mediawiki.language', + 'mediawiki.String', + 'user.options', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.language.months' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => 'resources/src/mediawiki.language/mediawiki.language.months.js', + 'dependencies' => 'mediawiki.language', + 'messages' => array_merge( + Language::MONTH_MESSAGES, + Language::MONTH_GENITIVE_MESSAGES, + Language::MONTH_ABBREVIATED_MESSAGES + ) + ], + + 'mediawiki.language.names' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.language", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.language", + 'packageFiles' => [ + 'mediawiki.language.names.js', + [ 'name' => 'names.json', 'callback' => static function ( Context $context ) { + return MediaWikiServices::getInstance() + ->getLanguageNameUtils() + ->getLanguageNames( $context->getLanguage(), 'all' ); + } ], + ], + 'dependencies' => 'mediawiki.language', + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.language.specialCharacters' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.language", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.language", + 'packageFiles' => [ + 'mediawiki.language.specialCharacters.js', + 'specialcharacters.json' + ], + 'dependencies' => 'mediawiki.language', + 'targets' => [ 'desktop', 'mobile' ], + 'messages' => [ + 'special-characters-group-latin', + 'special-characters-group-latinextended', + 'special-characters-group-ipa', + 'special-characters-group-symbols', + 'special-characters-group-greek', + 'special-characters-group-greekextended', + 'special-characters-group-cyrillic', + 'special-characters-group-arabic', + 'special-characters-group-arabicextended', + 'special-characters-group-persian', + 'special-characters-group-hebrew', + 'special-characters-group-bangla', + 'special-characters-group-tamil', + 'special-characters-group-telugu', + 'special-characters-group-sinhala', + 'special-characters-group-devanagari', + 'special-characters-group-gujarati', + 'special-characters-group-thai', + 'special-characters-group-lao', + 'special-characters-group-khmer', + 'special-characters-group-canadianaboriginal', + 'special-characters-group-runes', + 'special-characters-title-endash', + 'special-characters-title-emdash', + 'special-characters-title-minus' + ] + ], + + /* MediaWiki Libs */ + + 'mediawiki.libs.jpegmeta' => [ + 'scripts' => [ + 'resources/src/mediawiki.libs.jpegmeta/jpegmeta.js', + 'resources/src/mediawiki.libs.jpegmeta/export.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* MediaWiki Page */ + + 'mediawiki.page.gallery' => [ + 'scripts' => 'resources/src/mediawiki.page.gallery.js', + 'dependencies' => [ + 'mediawiki.page.gallery.styles', + 'mediawiki.util' + ] + ], + 'mediawiki.page.gallery.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.page.gallery.styles/gallery.less', + 'resources/src/mediawiki.page.gallery.styles/print.less' => [ 'media' => 'print' ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.page.gallery.slideshow' => [ + 'scripts' => 'resources/src/mediawiki.page.gallery.slideshow.js', + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.Title', + 'oojs', + 'oojs-ui-core', + 'oojs-ui-widgets', + 'oojs-ui.styles.icons-media', + 'oojs-ui.styles.icons-movement' + ], + 'messages' => [ + 'gallery-slideshow-toggle' + ] + ], + 'mediawiki.page.ready' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.page.ready", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.page.ready", + 'packageFiles' => [ + 'ready.js', + 'checkboxShift.js', + 'checkboxHack.js', + [ 'name' => 'config.json', 'callback' => static function ( + Context $context, + Config $config + ) { + $readyConfig = [ + 'search' => true, + 'collapsible' => true, + 'sortable' => true, + 'selectorLogoutLink' => '#pt-logout a[data-mw="interface"]' + ]; + + Hooks::runner()->onSkinPageReadyConfig( $context, $readyConfig ); + return $readyConfig; + } ], + ], + 'dependencies' => [ + 'mediawiki.util', + 'mediawiki.api' + ], + 'targets' => [ 'desktop', 'mobile' ], + 'messages' => [ + 'logging-out-notify' + ] + ], + 'mediawiki.page.watch.ajax' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src", + 'remoteBasePath' => "$wgResourceBasePath/resources/src", + 'targets' => [ 'desktop', 'mobile' ], + 'packageFiles' => [ + 'mediawiki.page.watch.ajax.js', + [ 'name' => 'config.json', 'config' => [ MainConfigNames::WatchlistExpiry ] ], + ], + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.util', + 'mediawiki.Title', + 'mediawiki.jqueryMsg', + ], + 'messages' => [ + 'watch', + 'unwatch', + 'watching', + 'unwatching', + 'tooltip-ca-watch', + 'tooltip-ca-unwatch', + 'tooltip-ca-unwatch-expiring', + 'tooltip-ca-unwatch-expiring-hours', + 'addedwatchtext', + 'addedwatchtext-talk', + 'removedwatchtext', + 'removedwatchtext-talk', + ], + ], + 'mediawiki.page.preview' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src", + 'remoteBasePath' => "$wgResourceBasePath/resources/src", + 'targets' => [ 'desktop', 'mobile' ], + 'packageFiles' => [ + 'mediawiki.page.preview.js', + ], + 'styles' => 'mediawiki.page.preview.css', + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.diff', + 'mediawiki.diff.styles', + 'mediawiki.jqueryMsg', + 'mediawiki.language', + 'mediawiki.util', + 'jquery.makeCollapsible', + 'jquery.textSelection', + 'oojs-ui-core', + ], + 'messages' => [ + 'summary-preview', + 'parentheses', + 'templatesusedpreview', + 'diff-empty', + ] + ], + 'mediawiki.page.image.pagination' => [ + 'scripts' => 'resources/src/mediawiki.page.image.pagination.js', + 'dependencies' => [ + 'mediawiki.util', + 'jquery.spinner', + ], + ], + + /* MediaWiki Special pages */ + + 'mediawiki.rcfilters.filters.base.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less', + ], + ], + 'mediawiki.rcfilters.highlightCircles.seenunseen.styles' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.rcfilters/' . + 'styles/mw.rcfilters.ui.ChangesListWrapperWidget.highlightCircles.seenunseen.less', + ], + ], + ], + // TODO consider renaming to mediawiki.rcfilters.filters following merge of + // mediawiki.rcfilters.filters.dm into mediawiki.rcfilters.filters.ui, see T256836 + 'mediawiki.rcfilters.filters.ui' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.rcfilters", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.rcfilters", + 'packageFiles' => [ + 'mw.rcfilters.js', + 'Controller.js', + 'UriProcessor.js', + 'dm/ChangesListViewModel.js', + 'dm/FilterGroup.js', + 'dm/FilterItem.js', + 'dm/FiltersViewModel.js', + 'dm/ItemModel.js', + 'dm/SavedQueriesModel.js', + 'dm/SavedQueryItemModel.js', + // TODO consider merging this with the config.json for the ui code + [ 'name' => 'dmConfig.json', 'config' => + [ MainConfigNames::StructuredChangeFiltersLiveUpdatePollingRate ] ], + 'HighlightColors.js', + 'ui/CheckboxInputWidget.js', + 'ui/FilterTagMultiselectWidget.js', + 'ui/ItemMenuOptionWidget.js', + 'ui/FilterMenuOptionWidget.js', + 'ui/FilterMenuSectionOptionWidget.js', + 'ui/TagItemWidget.js', + 'ui/FilterTagItemWidget.js', + 'ui/FilterMenuHeaderWidget.js', + 'ui/MenuSelectWidget.js', + 'ui/MainWrapperWidget.js', + 'ui/ViewSwitchWidget.js', + 'ui/ValuePickerWidget.js', + 'ui/ChangesLimitPopupWidget.js', + 'ui/ChangesLimitAndDateButtonWidget.js', + 'ui/DatePopupWidget.js', + 'ui/FilterWrapperWidget.js', + 'ui/ChangesListWrapperWidget.js', + 'ui/SavedLinksListWidget.js', + 'ui/SavedLinksListItemWidget.js', + 'ui/SaveFiltersPopupButtonWidget.js', + 'ui/FormWrapperWidget.js', + 'ui/FilterItemHighlightButton.js', + 'ui/HighlightPopupWidget.js', + 'ui/HighlightColorPickerWidget.js', + 'ui/LiveUpdateButtonWidget.js', + 'ui/MarkSeenButtonWidget.js', + 'ui/RcTopSectionWidget.js', + 'ui/RclTopSectionWidget.js', + 'ui/RclTargetPageWidget.js', + 'ui/RclToOrFromWidget.js', + 'ui/WatchlistTopSectionWidget.js', + [ 'name' => 'config.json', + 'versionCallback' => [ ChangesListSpecialPage::class, 'getRcFiltersConfigSummary' ], + 'callback' => [ ChangesListSpecialPage::class, 'getRcFiltersConfigVars' ], + ], + ], + 'styles' => [ + 'styles/mw.rcfilters.mixins.less', + 'styles/mw.rcfilters.variables.less', + 'styles/mw.rcfilters.ui.less', + 'styles/mw.rcfilters.ui.Overlay.less', + 'styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less', + 'styles/mw.rcfilters.ui.ItemMenuOptionWidget.less', + 'styles/mw.rcfilters.ui.FilterMenuOptionWidget.less', + 'styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less', + 'styles/mw.rcfilters.ui.TagItemWidget.less', + 'styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less', + 'styles/mw.rcfilters.ui.MenuSelectWidget.less', + 'styles/mw.rcfilters.ui.ViewSwitchWidget.less', + 'styles/mw.rcfilters.ui.ValuePickerWidget.less', + 'styles/mw.rcfilters.ui.ChangesLimitPopupWidget.less', + 'styles/mw.rcfilters.ui.DatePopupWidget.less', + 'styles/mw.rcfilters.ui.FilterWrapperWidget.less', + 'styles/mw.rcfilters.ui.ChangesListWrapperWidget.less', + 'styles/mw.rcfilters.ui.HighlightColorPickerWidget.less', + 'styles/mw.rcfilters.ui.FilterItemHighlightButton.less', + 'styles/mw.rcfilters.ui.SavedLinksListWidget.less', + 'styles/mw.rcfilters.ui.SavedLinksListItemWidget.less', + 'styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less', + 'styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less', + 'styles/mw.rcfilters.ui.RcTopSectionWidget.less', + 'styles/mw.rcfilters.ui.RclToOrFromWidget.less', + 'styles/mw.rcfilters.ui.RclTargetPageWidget.less', + 'styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less', + 'styles/mw.rcfilters.ui.FilterTagMultiselectWidgetMobile.less' + ], + 'skinStyles' => [ + 'monobook' => [ + 'styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less', + 'styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less', + ], + ], + 'messages' => [ + 'rcfilters-tag-remove', + 'rcfilters-activefilters', + 'rcfilters-activefilters-hide', + 'rcfilters-activefilters-show', + 'rcfilters-activefilters-hide-tooltip', + 'rcfilters-activefilters-show-tooltip', + 'rcfilters-advancedfilters', + 'rcfilters-group-results-by-page', + 'rcfilters-limit-title', + 'rcfilters-limit-and-date-label', + 'rcfilters-limit-and-date-popup-dialog-aria-label', + 'rcfilters-date-popup-title', + 'rcfilters-days-title', + 'rcfilters-hours-title', + 'rcfilters-days-show-days', + 'rcfilters-days-show-hours', + 'rcfilters-highlighted-filters-list', + 'rcfilters-quickfilters', + 'rcfilters-quickfilters-placeholder-title', + 'rcfilters-quickfilters-placeholder-description', + 'rcfilters-savedqueries-defaultlabel', + 'rcfilters-savedqueries-rename', + 'rcfilters-savedqueries-setdefault', + 'rcfilters-savedqueries-unsetdefault', + 'rcfilters-savedqueries-remove', + 'rcfilters-savedqueries-new-name-label', + 'rcfilters-savedqueries-new-name-placeholder', + 'rcfilters-savedqueries-add-new-title', + 'rcfilters-savedqueries-already-saved', + 'rcfilters-savedqueries-apply-label', + 'rcfilters-savedqueries-apply-and-setdefault-label', + 'rcfilters-savedqueries-cancel-label', + 'rcfilters-restore-default-filters', + 'rcfilters-clear-all-filters', + 'rcfilters-show-new-changes', + 'rcfilters-search-placeholder', + 'rcfilters-search-placeholder-mobile', + 'rcfilters-invalid-filter', + 'rcfilters-empty-filter', + 'rcfilters-filterlist-title', + 'rcfilters-filterlist-noresults', + 'rcfilters-filterlist-whatsthis', + 'rcfilters-highlightbutton-title', + 'rcfilters-highlightmenu-title', + 'rcfilters-highlightmenu-help', + 'rcfilters-noresults-conflict', + 'rcfilters-state-message-subset', + 'rcfilters-state-message-fullcoverage', + 'rcfilters-filter-excluded', + 'rcfilters-tag-prefix-namespace', + 'rcfilters-tag-prefix-namespace-inverted', + 'rcfilters-tag-prefix-tags', + 'rcfilters-exclude-button-off', + 'rcfilters-exclude-button-on', + 'rcfilters-view-tags', + 'rcfilters-view-namespaces-tooltip', + 'rcfilters-view-tags-tooltip', + 'rcfilters-view-return-to-default-tooltip', + 'rcfilters-view-tags-help-icon-tooltip', + 'rcfilters-liveupdates-button', + 'rcfilters-liveupdates-button-title-on', + 'rcfilters-liveupdates-button-title-off', + 'rcfilters-watchlist-markseen-button', + 'rcfilters-watchlist-edit-watchlist-button', + 'rcfilters-other-review-tools', + 'rcfilters-filter-showlinkedfrom-label', + 'rcfilters-filter-showlinkedfrom-option-label', + 'rcfilters-filter-showlinkedto-label', + 'rcfilters-filter-showlinkedto-option-label', + 'rcfilters-target-page-placeholder', + 'rcfilters-allcontents-label', + 'rcfilters-alldiscussions-label', + 'blanknamespace', + 'namespaces', + 'tags-title', + 'invert', + 'recentchanges-noresult', + 'recentchanges-timeout', + 'recentchanges-network', + 'recentchanges-notargetpage', + 'allpagesbadtitle', + 'quotation-marks', + ], + 'dependencies' => [ + 'jquery.makeCollapsible', + 'mediawiki.String', + 'mediawiki.api', + 'mediawiki.jqueryMsg', + 'mediawiki.language', + 'mediawiki.Uri', + 'mediawiki.user', + 'mediawiki.util', + 'mediawiki.widgets', + 'oojs', + 'oojs-ui-widgets', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-moderation', + 'oojs-ui.styles.icons-editing-core', + 'oojs-ui.styles.icons-editing-styling', + 'oojs-ui.styles.icons-interactions', + 'oojs-ui.styles.icons-layout', + 'oojs-ui.styles.icons-media', + 'oojs-ui-windows.icons', + 'user.options', + ], + ], + 'mediawiki.interface.helpers.styles' => [ + 'class' => LessVarFileModule::class, + 'lessMessages' => [ + 'comma-separator', + 'parentheses-start', + 'parentheses-end', + 'semicolon-separator', + 'brackets-start', + 'brackets-end', + 'pipe-separator' + ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.interface.helpers.styles.less', + ], + 'targets' => [ + 'desktop', 'mobile' + ], + ], + 'mediawiki.special' => [ + 'styles' => [ + 'resources/src/mediawiki.special/special.less', + 'resources/src/mediawiki.special/apisandbox.css', + 'resources/src/mediawiki.special/comparepages.less', + 'resources/src/mediawiki.special/contributions.less', + 'resources/src/mediawiki.special/edittags.css', + 'resources/src/mediawiki.special/movePage.css', + 'resources/src/mediawiki.special/newpages.less', + 'resources/src/mediawiki.special/pagesWithProp.css', + 'resources/src/mediawiki.special/upload.css', + 'resources/src/mediawiki.special/userrights.css', + 'resources/src/mediawiki.special/watchlist.css', + 'resources/src/mediawiki.special/whatlinkshere.less', + 'resources/src/mediawiki.special/block.less', + 'resources/src/mediawiki.special/listFiles.less', + 'resources/src/mediawiki.special/blocklist.less', + 'resources/src/mediawiki.special/version.css', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.apisandbox' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.special.apisandbox", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.special.apisandbox", + 'styles' => 'apisandbox.less', + 'packageFiles' => [ + 'apisandbox.js', + 'OptionalParamWidget.js', + 'ParamLabelWidget.js', + 'BooleanToggleSwitchParamWidget.js', + 'DateTimeParamWidget.js', + 'IntegerParamWidget.js', + 'LimitParamWidget.js', + 'PasswordParamWidget.js', + 'UploadSelectFileParamWidget.js', + 'TextParamMixin.js', + 'UtilMixin.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => [ + 'mediawiki.Uri', + 'mediawiki.api', + 'mediawiki.jqueryMsg', + 'mediawiki.util', + 'oojs-ui', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-editing-advanced', + 'oojs-ui.styles.icons-interactions', + 'oojs-ui.styles.icons-moderation', + 'mediawiki.widgets', + 'mediawiki.widgets.datetime', + 'mediawiki.widgets.TitlesMultiselectWidget', + 'jquery.makeCollapsible', + ], + 'messages' => [ + 'apisandbox-intro', + 'apisandbox-submit', + 'apisandbox-reset', + 'apisandbox-retry', + 'apisandbox-loading', + 'apisandbox-load-error', + 'apisandbox-fetch-token', + 'apisandbox-add-multi', + 'apisandbox-helpurls', + 'apisandbox-examples', + 'apisandbox-dynamic-parameters', + 'apisandbox-dynamic-parameters-add-label', + 'apisandbox-dynamic-parameters-add-placeholder', + 'apisandbox-dynamic-error-exists', + 'apisandbox-templated-parameter-reason', + 'apisandbox-deprecated-parameters', + 'apisandbox-no-parameters', + 'paramvalidator-help-type-number-min', + 'paramvalidator-help-type-number-max', + 'paramvalidator-help-type-number-minmax', + 'api-help-param-deprecated', + 'api-help-param-deprecated-label', + 'api-help-param-internal', + 'api-help-param-internal-label', + 'api-help-param-multi-separate', + 'paramvalidator-help-multi-max', + 'paramvalidator-help-type-string-maxbytes', + 'paramvalidator-help-type-string-maxchars', + 'apisandbox-submit-invalid-fields-title', + 'apisandbox-submit-invalid-fields-message', + 'apisandbox-results', + 'apisandbox-sending-request', + 'apisandbox-loading-results', + 'apisandbox-results-error', + 'apisandbox-results-login-suppressed', + 'apisandbox-request-selectformat-label', + 'apisandbox-request-format-url-label', + 'apisandbox-request-url-label', + 'apisandbox-request-format-json-label', + 'apisandbox-request-json-label', + 'apisandbox-request-format-php-label', + 'apisandbox-request-php-label', + 'apisandbox-request-time', + 'apisandbox-results-fixtoken', + 'apisandbox-results-fixtoken-fail', + 'apisandbox-alert-page', + 'apisandbox-alert-field', + 'apisandbox-continue', + 'apisandbox-continue-clear', + 'apisandbox-continue-help', + 'apisandbox-param-limit', + 'apisandbox-multivalue-all-namespaces', + 'apisandbox-multivalue-all-values', + 'api-format-prettyprint-status', + 'blanknamespace', + 'comma-separator', + 'word-separator', + 'and' + ], + ], + 'mediawiki.special.block' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src", + 'remoteBasePath' => "$wgResourceBasePath/resources/src", + 'packageFiles' => [ + 'mediawiki.special.block.js', + [ 'name' => 'config.json', 'config' => [ + MainConfigNames::BlockAllowsUTEdit, + ] ], + ], + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui.styles.icons-editing-core', + 'oojs-ui.styles.icons-editing-advanced', + 'mediawiki.widgets.DateInputWidget', + 'mediawiki.widgets.SelectWithInputWidget', + 'mediawiki.widgets.NamespacesMultiselectWidget', + 'mediawiki.widgets.TitlesMultiselectWidget', + 'mediawiki.widgets.UserInputWidget', + 'mediawiki.util', + 'mediawiki.htmlform', + 'moment', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // This bundles various small (under 5 KB?) JavaScript files that: + // - .. are never loaded when viewing or editing wiki pages. + // - .. are only used by logged-in users. + // - .. depend on oojs-ui-core. + // - .. contain UI initialisation code (e.g. no public module exports, because + // requiring or depending on this bundle is awkward) + 'mediawiki.misc-authed-ooui' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.misc-authed-ooui", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.misc-authed-ooui", + 'scripts' => [ + 'special.changecredentials.js', + 'special.import.js', + 'special.movePage.js', + 'special.mute.js', + 'special.pageLanguage.js', + 'special.undelete.js', + ], + 'dependencies' => [ + 'mediawiki.api', // special.changecredentials.js + 'mediawiki.htmlform.ooui', // special.changecredentials.js + 'mediawiki.widgets.visibleLengthLimit', // special.movePage.js, special.undelete.js + 'mediawiki.widgets', // special.movePage.js, special.undelete.js, special.import.js + 'oojs-ui-core', // special.pageLanguage.js + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // This bundles various small (under 2 KB?) JavaScript files that: + // - .. are only used by logged-in users when a non-default preference was enabled. + // - .. may be loaded in the critical path for those users on page views. + // - .. do NOT depend on OOUI. + // - .. contain only UI initialisation code (e.g. no public exports) + 'mediawiki.misc-authed-pref' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.misc-authed-pref", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.misc-authed-pref", + 'scripts' => [ + 'rightClickEdit.js', + 'dblClickEdit.js', + ], + 'dependencies' => [ + 'user.options', + ], + ], + // This bundles various small scripts that relate to moderation or curation + // in some way, and: + // - .. are only loaded for a privileged subset of logged-in users. + // - .. may be loaded in the critical path on page views. + // - .. do NOT depend on OOUI or other "large" modules. + // - .. contain only UI initialisation code (e.g. no public exports) + 'mediawiki.misc-authed-curate' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.misc-authed-curate", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.misc-authed-curate", + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => [ + 'patrol.js', + 'rollback.js', + ], + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.util', + 'mediawiki.Title', + 'jquery.spinner', + 'user.options', + 'jquery.confirmable', + ], + 'messages' => [ + 'markedaspatrollednotify', + 'rollback-confirmation-confirm', + 'rollback-confirmation-yes', + 'rollback-confirmation-no', + ], + ], + 'mediawiki.special.changeslist' => [ + 'styles' => [ + 'resources/src/mediawiki.special.changeslist/changeslist.less' + ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.special.changeslist/default.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.changeslist.watchlistexpiry' => [ + 'scripts' => 'resources/src/mediawiki.special.changeslist.watchlistexpiry/watchlistexpiry.js', + 'styles' => 'resources/src/mediawiki.special.changeslist.watchlistexpiry/watchlistexpiry.less', + 'messages' => [ + 'parentheses', + 'watchlist-expiry-days-left', + 'watchlist-expiry-hours-left', + ], + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => [ + 'mediawiki.special', + 'oojs-ui.styles.icons-interactions' + ], + ], + 'mediawiki.special.changeslist.enhanced' => [ + 'styles' => 'resources/src/mediawiki.special.changeslist.enhanced.less', + ], + 'mediawiki.special.changeslist.legend' => [ + 'styles' => 'resources/src/mediawiki.special.changeslist.legend.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.changeslist.legend.js' => [ + 'scripts' => 'resources/src/mediawiki.special.changeslist.legend.js', + 'dependencies' => [ + 'jquery.makeCollapsible', + 'mediawiki.cookie', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.contributions' => [ + 'scripts' => 'resources/src/mediawiki.special.contributions.js', + 'dependencies' => [ + 'jquery.makeCollapsible', + 'oojs-ui', + 'mediawiki.widgets.DateInputWidget', + 'mediawiki.jqueryMsg', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.edittags' => [ + 'scripts' => 'resources/src/mediawiki.special.edittags.js', + 'dependencies' => [ + 'jquery.chosen', + 'jquery.lengthLimit', + ], + 'messages' => [ + 'tags-edit-chosen-placeholder', + 'tags-edit-chosen-no-results', + ], + ], + 'mediawiki.special.import.styles.ooui' => [ + 'styles' => 'resources/src/mediawiki.special.import.styles.ooui.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.changecredentials' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => [ 'resources/src/mediawiki.special.changecredentails.js' ], + ], + 'mediawiki.special.changeemail' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => [ 'resources/src/mediawiki.special.changeemail.js' ], + ], + + 'mediawiki.special.preferences.ooui' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'scripts' => [ + 'resources/src/mediawiki.special.preferences.ooui/confirmClose.js', + 'resources/src/mediawiki.special.preferences.ooui/convertmessagebox.js', + 'resources/src/mediawiki.special.preferences.ooui/editfont.js', + 'resources/src/mediawiki.special.preferences.ooui/skinPrefs.js', + 'resources/src/mediawiki.special.preferences.ooui/signature.js', + 'resources/src/mediawiki.special.preferences.ooui/tabs.js', + 'resources/src/mediawiki.special.preferences.ooui/timezone.js', + ], + 'messages' => [ + 'prefs-tabs-navigation-hint', + 'prefs-signature-highlight-error', + ], + 'dependencies' => [ + 'mediawiki.language', + 'mediawiki.confirmCloseWindow', + 'mediawiki.notification.convertmessagebox', + 'mediawiki.storage', + 'oojs-ui-widgets', + 'mediawiki.widgets.SelectWithInputWidget', + 'mediawiki.editfont.styles', + 'mediawiki.widgets.visibleLengthLimit', + ], + ], + 'mediawiki.special.preferences.styles.ooui' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'styles' => 'resources/src/mediawiki.special.preferences.styles.ooui.less', + ], + 'mediawiki.special.revisionDelete' => [ + 'scripts' => 'resources/src/mediawiki.special.revisionDelete.js', + 'messages' => [ + // @todo Load this message in content language + 'colon-separator', + ], + 'dependencies' => [ + 'jquery.lengthLimit', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.search' => [ + 'scripts' => 'resources/src/mediawiki.special.search/search.js', + 'dependencies' => 'mediawiki.widgets.SearchInputWidget', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.search.commonsInterwikiWidget' => [ + 'scripts' => 'resources/src/mediawiki.special.search.commonsInterwikiWidget.js', + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.Uri', + 'mediawiki.jqueryMsg' + ], + 'targets' => [ 'desktop', 'mobile' ], + 'messages' => [ + 'search-interwiki-more-results', + 'searchprofile-images' + ], + ], + 'mediawiki.special.search.interwikiwidget.styles' => [ + 'styles' => 'resources/src/mediawiki.special.search.interwikiwidget.styles.less', + 'targets' => [ 'desktop', 'mobile' ] + ], + 'mediawiki.special.search.styles' => [ + 'styles' => 'resources/src/mediawiki.special.search.styles.less', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.special.unwatchedPages' => [ + 'scripts' => 'resources/src/mediawiki.special.unwatchedPages/unwatchedPages.js', + 'styles' => 'resources/src/mediawiki.special.unwatchedPages/unwatchedPages.css', + 'messages' => [ + 'addedwatchtext-short', + 'removedwatchtext-short', + 'unwatch', + 'unwatching', + 'watch', + 'watching', + ], + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.Title', + 'mediawiki.util', + ], + ], + 'mediawiki.special.upload' => [ + 'templates' => [ + 'thumbnail.html' => 'resources/src/mediawiki.special.upload/templates/thumbnail.html', + ], + 'scripts' => 'resources/src/mediawiki.special.upload/upload.js', + 'messages' => [ + 'widthheight', + 'size-bytes', + 'size-kilobytes', + 'size-megabytes', + 'size-gigabytes', + 'largefileserver', + ], + 'dependencies' => [ + 'mediawiki.special', + 'jquery.spinner', + 'mediawiki.jqueryMsg', + 'mediawiki.api', + 'mediawiki.libs.jpegmeta', + 'mediawiki.Title', + 'mediawiki.util', + 'mediawiki.confirmCloseWindow', + 'user.options', + ], + ], + 'mediawiki.special.userlogin.common.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.special.userlogin.common.styles/userlogin.css', + ], + ], + 'mediawiki.special.userlogin.login.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.special.userlogin.login.styles/login.less', + ], + ], + 'mediawiki.special.createaccount' => [ + 'targets' => [ 'desktop', 'mobile' ], + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.special.createaccount", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.special.createaccount", + 'packageFiles' => [ + 'signup.js', + 'HtmlformChecker.js' + ], + 'messages' => [ + 'createacct-emailrequired', + 'noname', + 'userexists', + 'createacct-normalization', + ], + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.jqueryMsg', + 'mediawiki.util', + ], + ], + 'mediawiki.special.userlogin.signup.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.special.userlogin.signup.styles/signup.less', + ], + ], + 'mediawiki.special.userrights' => [ + 'scripts' => 'resources/src/mediawiki.special.userrights.js', + 'dependencies' => [ + 'mediawiki.notification.convertmessagebox', + 'jquery.lengthLimit', + ], + ], + 'mediawiki.special.watchlist' => [ + 'scripts' => [ + 'resources/src/mediawiki.special.watchlist/watchlist.js', + 'resources/src/mediawiki.special.watchlist/visitedstatus.js', + ], + 'messages' => [ + 'addedwatchtext', + 'addedwatchtext-talk', + 'removedwatchtext', + 'removedwatchtext-talk', + 'tooltip-ca-watch', + 'tooltip-ca-unwatch', + 'tooltip-ca-unwatch-expiring', + 'tooltip-ca-unwatch-expiring-hours', + 'watchlist-unwatch', + 'watchlist-unwatch-undo', + ], + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.jqueryMsg', + 'mediawiki.Title', + 'mediawiki.util', + 'oojs-ui-core', + 'oojs-ui.styles.icons-interactions', + 'user.options', + ], + ], + + /* MediaWiki Installer */ + + // Used in the web installer. Test it after modifying this definition! + + /* MediaWiki Legacy */ + + // Used in the web installer. Test it after modifying this definition! + + /* MediaWiki UI */ + + 'mediawiki.ui' => [ + 'deprecated' => 'Please use OOUI instead.', + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.ui/default.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.ui.checkbox' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.ui.checkbox/checkbox.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.ui.radio' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.ui.radio/radio.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Lightweight module for anchor styles + 'mediawiki.ui.anchor' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.ui.anchor/anchor.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Lightweight module for button styles + 'mediawiki.ui.button' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.ui.button/button.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.ui.input' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.ui.input/input.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.ui.icon' => [ + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.ui.icon/icons-2.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.widgets' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.widgets", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.widgets", + 'packageFiles' => [ + 'index.js', + [ 'name' => 'data.json', 'callback' => static function ( MessageLocalizer $messageLocalizer ) { + $userLang = $messageLocalizer->msg( 'unused' )->getLanguage(); + return [ + 'formattedNamespaces' => $userLang->getFormattedNamespaces(), + ]; + } ], + 'mw.widgets.NamespaceInputWidget.js', + 'mw.widgets.ComplexNamespaceInputWidget.js', + 'mw.widgets.CopyTextLayout.js', + 'mw.widgets.TitleWidget.js', + 'mw.widgets.TitleInputWidget.js', + 'mw.widgets.TitleSearchWidget.js', + 'mw.widgets.ComplexTitleInputWidget.js', + 'mw.widgets.TitleOptionWidget.js', + ], + 'styles' => [ + 'mw.widgets.CopyTextLayout.css', + ], + 'skinStyles' => [ + 'default' => [ + 'mw.widgets.TitleWidget.less', + ], + ], + 'dependencies' => [ + 'oojs-ui-widgets', + 'mediawiki.widgets.styles', + // TitleInputWidget + 'oojs-ui.styles.icons-content', + // CopyTextLayout uses 'copy' + 'oojs-ui.styles.icons-editing-advanced', + 'mediawiki.Title', + 'mediawiki.api', + 'mediawiki.String', + 'mediawiki.language', + ], + 'messages' => [ + // NamespaceInputWidget + 'blanknamespace', + 'namespacesall', + // CopyTextLayout + 'mw-widgets-copytextlayout-copy', + 'mw-widgets-copytextlayout-copy-fail', + 'mw-widgets-copytextlayout-copy-success', + // TitleInputWidget + 'mw-widgets-titleinput-description-new-page', + 'mw-widgets-titleinput-description-redirect', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.styles' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.base.css', + 'resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.base.css', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.AbandonEditDialog' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.AbandonEditDialog.js', + ], + 'messages' => [ + 'mw-widgets-abandonedit', + 'mw-widgets-abandonedit-discard', + 'mw-widgets-abandonedit-keep', + 'mw-widgets-abandonedit-title', + ], + 'dependencies' => [ + 'oojs-ui-windows', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.DateInputWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js', + 'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js', + ], + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less', + 'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less', + ], + ], + 'messages' => [ + 'mw-widgets-dateinput-no-date', + 'mw-widgets-dateinput-placeholder-day', + 'mw-widgets-dateinput-placeholder-month', + ], + 'dependencies' => [ + 'oojs-ui-widgets', + 'oojs-ui.styles.icons-movement', + 'moment', + 'mediawiki.widgets.DateInputWidget.styles', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.DateInputWidget.styles' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.styles.less', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.visibleLengthLimit' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets.visibleLengthLimit/mediawiki.widgets.visibleLengthLimit.js' + ], + 'dependencies' => [ + 'oojs-ui-core', + 'jquery.lengthLimit', + 'mediawiki.language', + 'mediawiki.String', + ], + 'targets' => [ 'desktop', 'mobile' ] + ], + 'mediawiki.widgets.datetime' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.js', + 'resources/src/mediawiki.widgets.datetime/CalendarWidget.js', + 'resources/src/mediawiki.widgets.datetime/DateTimeFormatter.js', + 'resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.js', + 'resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js', + ], + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.widgets.datetime/CalendarWidget.less', + 'resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less', + ], + ], + 'messages' => [ + 'timezone-utc', + 'timezone-local', + 'january', + 'february', + 'march', + 'april', + 'may_long', + 'june', + 'july', + 'august', + 'september', + 'october', + 'november', + 'december', + 'jan', + 'feb', + 'mar', + 'apr', + 'may', + 'jun', + 'jul', + 'aug', + 'sep', + 'oct', + 'nov', + 'dec', + 'sunday', + 'monday', + 'tuesday', + 'wednesday', + 'thursday', + 'friday', + 'saturday', + 'sun', + 'mon', + 'tue', + 'wed', + 'thu', + 'fri', + 'sat', + 'period-am', + 'period-pm', + ], + 'dependencies' => [ + 'jquery.client', + 'mediawiki.util', + 'oojs-ui-core', + 'oojs-ui.styles.icons-moderation', + 'oojs-ui.styles.icons-movement', + 'oojs-ui.styles.icons-interactions', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.expiry' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.ExpiryInputWidget.js', + ], + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-widgets', + 'moment', + 'mediawiki.widgets.datetime' + ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki.widgets/mw.widgets.ExpiryInputWidget.less', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.CheckMatrixWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.CheckMatrixWidget.js', + ], + 'dependencies' => [ + 'oojs-ui-core', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.CategoryMultiselectWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.CategoryTagItemWidget.js', + 'resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js', + ], + 'dependencies' => [ + 'oojs-ui-widgets', + 'mediawiki.api', + 'mediawiki.ForeignApi', + 'mediawiki.Title', + ], + 'messages' => [ + 'red-link-title', + 'mw-widgets-categoryselector-add-category-placeholder', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.SelectWithInputWidget' => [ + 'scripts' => 'resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js', + 'dependencies' => [ + 'mediawiki.widgets.SelectWithInputWidget.styles', + 'oojs-ui-widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.SelectWithInputWidget.styles' => [ + 'styles' => 'resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.base.css', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.SizeFilterWidget' => [ + 'scripts' => 'resources/src/mediawiki.widgets/mw.widgets.SizeFilterWidget.js', + 'dependencies' => [ + 'mediawiki.widgets.SizeFilterWidget.styles', + 'oojs-ui-widgets', + ], + 'messages' => [ + 'minimum-size', + 'maximum-size', + 'pagesize', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.SizeFilterWidget.styles' => [ + 'styles' => 'resources/src/mediawiki.widgets/mw.widgets.SizeFilterWidget.base.css', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.MediaSearch' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaUserUploadsProvider.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaUserUploadsQueue.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js', + ], + 'styles' => [ + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css', + 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css', + ], + 'dependencies' => [ + 'oojs-ui-widgets', + 'mediawiki.ForeignApi', + 'mediawiki.Title', + 'mediawiki.user', + 'mediawiki.util', + ], + 'messages' => [ + 'mw-widgets-mediasearch-noresults', + 'mw-widgets-mediasearch-input-placeholder', + 'mw-widgets-mediasearch-results-aria-label', + 'mw-widgets-mediasearch-recent-uploads', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.Table' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/Table/mw.widgets.RowWidget.js', + 'resources/src/mediawiki.widgets/Table/mw.widgets.RowWidgetModel.js', + 'resources/src/mediawiki.widgets/Table/mw.widgets.TableWidget.js', + 'resources/src/mediawiki.widgets/Table/mw.widgets.TableWidgetModel.js' + ], + 'styles' => [ + 'resources/src/mediawiki.widgets/Table/mw.widgets.RowWidget.css', + 'resources/src/mediawiki.widgets/Table/mw.widgets.TableWidget.css', + ], + 'dependencies' => [ + 'oojs-ui-widgets' + ], + 'messages' => [ + 'mw-widgets-table-row-delete', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.TagMultiselectWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.TagMultiselectWidget.js', + ], + 'dependencies' => [ + 'oojs-ui-widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.UserInputWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js', + ], + 'dependencies' => [ + 'mediawiki.api', + 'oojs-ui-widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.UsersMultiselectWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js', + ], + 'dependencies' => [ + 'mediawiki.api', + 'oojs-ui-widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.NamespacesMultiselectWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.NamespacesMultiselectWidget.js', + 'resources/src/mediawiki.widgets/mw.widgets.NamespacesMenuOptionWidget.js', + ], + 'dependencies' => [ + 'oojs-ui-widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.TitlesMultiselectWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.TitlesMultiselectWidget.js', + ], + 'dependencies' => [ + 'mediawiki.api', + 'oojs-ui-widgets', + // FIXME: Needs TitleInputWidget only + 'mediawiki.widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.TagMultiselectWidget.styles' => [ + 'styles' => 'resources/src/mediawiki.widgets/mw.widgets.TagMultiselectWidget.base.css', + ], + 'mediawiki.widgets.SearchInputWidget' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js', + ], + 'dependencies' => [ + 'mediawiki.searchSuggest', + 'oojs-ui.styles.icons-interactions', + // FIXME: Needs TitleInputWidget only + 'mediawiki.widgets', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.SearchInputWidget.styles' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.css', + ], + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.watchstar.widgets' => [ + 'localBasePath' => "$wgBaseDirectory/resources/src/mediawiki.watchstar.widgets", + 'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.watchstar.widgets", + 'packageFiles' => [ + 'WatchlistExpiryWidget.js', + [ 'name' => 'data.json', 'callback' => static function ( MessageLocalizer $messageLocalizer ) { + return WatchAction::getExpiryOptions( $messageLocalizer, false ); + } ] + ], + 'styles' => 'WatchlistExpiryWidget.css', + 'dependencies' => [ + 'oojs-ui' + ], + 'messages' => [ + 'accesskey-ca-watch', + 'addedwatchexpiry-options-label', + 'addedwatchexpirytext', + 'addedwatchexpirytext-talk', + 'addedwatchindefinitelytext', + 'addedwatchindefinitelytext-talk' + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.deflate' => [ + 'packageFiles' => [ + 'resources/src/mediawiki.deflate/mw.deflate.js', + 'resources/lib/pako/pako_deflate.es5.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + /* OOjs */ + 'oojs' => [ + 'scripts' => [ + 'resources/lib/oojs/oojs.js', + 'resources/src/oojs-global.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'mediawiki.router' => [ + 'scripts' => [ + 'resources/src/mediawiki.router/index.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => [ + 'oojs-router', + ], + ], + + 'oojs-router' => [ + 'scripts' => [ + 'resources/lib/oojs-router/oojs-router.js', + ], + 'targets' => [ 'desktop', 'mobile' ], + 'dependencies' => [ + 'oojs', + ], + ], + + /* OOjs UI */ + + // Omnibus module. + 'oojs-ui' => [ + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-widgets', + 'oojs-ui-toolbars', + 'oojs-ui-windows', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + // The core JavaScript library. + 'oojs-ui-core' => [ + 'class' => OOUIFileModule::class, + 'scripts' => [ + 'resources/lib/ooui/oojs-ui-core.js', + 'resources/src/ooui-local.js', + ], + 'themeScripts' => 'core', + 'dependencies' => [ + 'oojs', + 'oojs-ui-core.styles', + 'oojs-ui-core.icons', + 'oojs-ui.styles.indicators', + 'mediawiki.language', + ], + 'messages' => [ + 'ooui-field-help', + 'ooui-combobox-button-label', + 'ooui-popup-widget-close-button-aria-label', + 'ooui-selectfile-button-select', + 'ooui-selectfile-button-select-multiple', + 'ooui-selectfile-dragdrop-placeholder', + 'ooui-selectfile-dragdrop-placeholder-multiple', + 'ooui-selectfile-not-supported', + 'ooui-selectfile-placeholder', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // This contains only the styles required by core widgets. + 'oojs-ui-core.styles' => [ + 'class' => OOUIFileModule::class, + 'styles' => [ + 'resources/lib/ooui/wikimedia-ui-base.less', // Providing Wikimedia UI LESS variables to all + ], + 'themeStyles' => 'core', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'oojs-ui-core.icons' => [ + 'class' => OOUIIconPackModule::class, + 'icons' => [ + 'add', 'alert', 'infoFilled', 'error', 'check', 'close', 'info', 'search', 'subtract' + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Additional widgets and layouts module. + 'oojs-ui-widgets' => [ + 'class' => OOUIFileModule::class, + 'scripts' => 'resources/lib/ooui/oojs-ui-widgets.js', + 'themeStyles' => 'widgets', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-widgets.icons', + ], + 'messages' => [ + 'ooui-item-remove', + 'ooui-outline-control-move-down', + 'ooui-outline-control-move-up', + 'ooui-outline-control-remove', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // You should never directly load this module. The CSS classes it defines are not a public API, + // they depend on the internal structure of OOUI widgets, which can change at any time. If you + // find that you need to load this module, you're probably doing something wrong or very hacky. + 'oojs-ui-widgets.styles' => [ + 'class' => OOUIFileModule::class, + 'themeStyles' => 'widgets', + 'targets' => [ 'desktop', 'mobile' ], + ], + 'oojs-ui-widgets.icons' => [ + 'class' => OOUIIconPackModule::class, + // Do not repeat icons already used in 'oojs-ui-core.icons' + 'icons' => [ 'attachment', 'collapse', 'expand', 'trash', 'upload' ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Toolbar and tools module. + 'oojs-ui-toolbars' => [ + 'class' => OOUIFileModule::class, + 'scripts' => 'resources/lib/ooui/oojs-ui-toolbars.js', + 'themeStyles' => 'toolbars', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-toolbars.icons', + ], + 'messages' => [ + 'ooui-toolbar-more', + 'ooui-toolgroup-collapse', + 'ooui-toolgroup-expand', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'oojs-ui-toolbars.icons' => [ + 'class' => OOUIIconPackModule::class, + // Do not repeat icons already used in 'oojs-ui-core.icons': 'check' + 'icons' => [ 'collapse', 'expand' ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Windows and dialogs module. + 'oojs-ui-windows' => [ + 'class' => OOUIFileModule::class, + 'scripts' => 'resources/lib/ooui/oojs-ui-windows.js', + 'themeStyles' => 'windows', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-windows.icons', + ], + 'messages' => [ + 'ooui-dialog-message-accept', + 'ooui-dialog-message-reject', + 'ooui-dialog-process-continue', + 'ooui-dialog-process-dismiss', + 'ooui-dialog-process-error', + 'ooui-dialog-process-retry', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'oojs-ui-windows.icons' => [ + 'class' => OOUIIconPackModule::class, + // Do not repeat icons already used in 'oojs-ui-core.icons': 'close' + 'icons' => [ 'previous' ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'oojs-ui.styles.indicators' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'indicators', + ], + 'oojs-ui.styles.icons-accessibility' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-accessibility', + ], + 'oojs-ui.styles.icons-alerts' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-alerts', + ], + 'oojs-ui.styles.icons-content' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-content', + ], + 'oojs-ui.styles.icons-editing-advanced' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-editing-advanced', + ], + 'oojs-ui.styles.icons-editing-citation' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-editing-citation', + ], + 'oojs-ui.styles.icons-editing-core' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-editing-core', + ], + 'oojs-ui.styles.icons-editing-list' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-editing-list', + ], + 'oojs-ui.styles.icons-editing-styling' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-editing-styling', + ], + 'oojs-ui.styles.icons-interactions' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-interactions', + ], + 'oojs-ui.styles.icons-layout' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-layout', + ], + 'oojs-ui.styles.icons-location' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-location', + ], + 'oojs-ui.styles.icons-media' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-media', + ], + 'oojs-ui.styles.icons-moderation' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-moderation', + ], + 'oojs-ui.styles.icons-movement' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-movement', + ], + 'oojs-ui.styles.icons-user' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-user', + ], + 'oojs-ui.styles.icons-wikimedia' => [ + 'class' => OOUIImageModule::class, + 'themeImages' => 'icons-wikimedia', + ], +]; diff --git a/resources/assets/change-your-logo-icon.png b/resources/assets/change-your-logo-icon.png new file mode 100644 index 0000000..bd5d167 Binary files /dev/null and b/resources/assets/change-your-logo-icon.png differ diff --git a/resources/assets/change-your-logo-icon.svg b/resources/assets/change-your-logo-icon.svg new file mode 100644 index 0000000..9c4ee40 --- /dev/null +++ b/resources/assets/change-your-logo-icon.svg @@ -0,0 +1,5 @@ + + + + +