diff --git a/CHANGELOG.md b/CHANGELOG.md index dd4a28360f09a68a3b83f4982c647dcc1a4ffd6a..4f270bfeafb482d3000b42a3302f76232a59d4c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Fixed +- Follows/Followers tabs on user profiles now display the content properly. +- Handle punycode in screen names + +## [2.2.2] - 2020-12-22 ### Added - Mouseover titles for emojis in reaction picker - Support to input emoji into the search box in reaction picker - Added some missing unicode emoji +- Added the upload limit to the Features panel in the About page +- Support for solid color wallpaper, instance doesn't have to define a wallpaper anymore ### Fixed - Fixed the occasional bug where screen would scroll 1px when typing into a reply form @@ -17,11 +24,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fixed custom emoji not working in profile field names - Fixed pinned statuses not appearing in user profiles - Fixed some elements not being keyboard navigation friendly +- Fixed error handling when updating various profile images - Fixed your latest chat messages disappearing when closing chat view and opening it again during the same session +- Fixed custom emoji not showing in poll options before voting +- Fixed link color not applied to instance name in topbar ### Changed - Errors when fetching are now shown with popup errors instead of "Error fetching updates" in panel headers - Made reply/fav/repeat etc buttons easier to hit +- Adjusted timeline menu clickable area to match the visible button +- Moved external source link from status heading to the ellipsis menu +- Disabled horizontal textarea resize +- Wallpaper is now top-aligned, horizontally centered. ## [2.2.1] - 2020-11-11 diff --git a/package.json b/package.json index 14738c3eb301f5d43378d8217467adc0026094d3..e11396bf68f1dc7f641699c8ee65baa5278656ff 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "parse-link-header": "^1.0.1", "phoenix": "^1.3.0", "portal-vue": "^2.1.4", + "punycode.js": "^2.1.0", "v-click-outside": "^2.1.1", "vue": "^2.6.11", "vue-chat-scroll": "^1.2.1", @@ -55,7 +56,7 @@ "babel-plugin-lodash": "^3.3.4", "chai": "^3.5.0", "chalk": "^1.1.3", - "chromedriver": "^2.21.2", + "chromedriver": "^87.0.1", "connect-history-api-fallback": "^1.1.0", "cross-spawn": "^4.0.2", "css-loader": "^0.28.0", diff --git a/src/App.js b/src/App.js index 5270031915793f1f4958ec955a4e7d659707a851..1ca029b69aeebeb9b35fbd0de6ad53601d654edc 100644 --- a/src/App.js +++ b/src/App.js @@ -15,6 +15,7 @@ import UserReportingModal from './components/user_reporting_modal/user_reporting import PostStatusModal from './components/post_status_modal/post_status_modal.vue' import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' import { windowWidth, windowHeight } from './services/window_utils/window_utils' +import { mapGetters } from 'vuex' export default { name: 'app', @@ -50,17 +51,18 @@ export default { }, computed: { currentUser () { return this.$store.state.users.currentUser }, - background () { - return this.currentUser.background_image || this.$store.state.instance.background + userBackground () { return this.currentUser.background_image }, + instanceBackground () { + return this.mergedConfig.hideInstanceWallpaper + ? null + : this.$store.state.instance.background }, + background () { return this.userBackground || this.instanceBackground }, bgStyle () { - return { - 'background-image': `url(${this.background})` - } - }, - bgAppStyle () { - return { - '--body-background-image': `url(${this.background})` + if (this.background) { + return { + '--body-background-image': `url(${this.background})` + } } }, chat () { return this.$store.state.chat.channel.state === 'joined' }, @@ -77,7 +79,8 @@ export default { return { 'order': this.$store.state.instance.sidebarRight ? 99 : 0 } - } + }, + ...mapGetters(['mergedConfig']) }, methods: { updateMobileState () { diff --git a/src/App.scss b/src/App.scss index cdc3209c9162c285ac6cbd4707a545fa29fada2a..2a1d7b1bc27760952b95a741abe4c30ad2c3e8ee 100644 --- a/src/App.scss +++ b/src/App.scss @@ -14,7 +14,9 @@ right: -20px; background-size: cover; background-repeat: no-repeat; - background-position: 0 50%; + background-color: var(--wallpaper); + background-image: var(--body-background-image); + background-position: 50% 50px; } i[class^='icon-'] { @@ -332,6 +334,10 @@ input, textarea, .select, .input { box-sizing: border-box; } } + + &.resize-height { + resize: vertical; + } } option { diff --git a/src/App.vue b/src/App.vue index b4eb05246788d04844b7fa05dbec06e844fc0ab2..1a1667788d1cba17870fb0167ca7a6cffd5ff401 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,12 +1,11 @@ <template> <div id="app" - :style="bgAppStyle" + :style="bgStyle" > <div id="app_bg_wrapper" class="app-bg-wrapper" - :style="bgStyle" /> <MobileNav v-if="isMobileLayout" /> <DesktopNav v-else /> diff --git a/src/components/desktop_nav/desktop_nav.scss b/src/components/desktop_nav/desktop_nav.scss index 8fd8e6202e4fd4b5cfc36bfe44218a951345310d..2d4685885401a7bad261d7fee88c4a286f881c3d 100644 --- a/src/components/desktop_nav/desktop_nav.scss +++ b/src/components/desktop_nav/desktop_nav.scss @@ -5,6 +5,10 @@ width: 100%; position: fixed; + a { + color: var(--topBarLink, $fallback--link); + } + .inner-nav { display: grid; grid-template-rows: 50px; diff --git a/src/components/extra_buttons/extra_buttons.js b/src/components/extra_buttons/extra_buttons.js index 1a8eef729534f579e7f196a5497c6981a969076a..b5b29e8a5a7d2a3fd56e5c7ac1b9c60b8ec63196 100644 --- a/src/components/extra_buttons/extra_buttons.js +++ b/src/components/extra_buttons/extra_buttons.js @@ -5,7 +5,8 @@ import { faBookmark, faEyeSlash, faThumbtack, - faShareAlt + faShareAlt, + faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons' import { faBookmark as faBookmarkReg @@ -17,7 +18,8 @@ library.add( faBookmarkReg, faEyeSlash, faThumbtack, - faShareAlt + faShareAlt, + faExternalLinkAlt ) const ExtraButtons = { diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue index e687d4873563143d460c79a9aad566c140a4ebcf..dc790cad7ec2035e360b0847c904b64401c66057 100644 --- a/src/components/extra_buttons/extra_buttons.vue +++ b/src/components/extra_buttons/extra_buttons.vue @@ -1,5 +1,6 @@ <template> <Popover + class="ExtraButtons" trigger="click" placement="top" :offset="{ y: 5 }" @@ -96,11 +97,23 @@ icon="share-alt" /><span>{{ $t("status.copy_link") }}</span> </button> + <a + v-if="!status.is_local" + class="button-default dropdown-item dropdown-item-icon" + title="Source" + :href="status.external_url" + target="_blank" + > + <FAIcon + fixed-width + icon="external-link-alt" + /><span>{{ $t("status.external_source") }}</span> + </a> </div> </div> <span slot="trigger" - class="ExtraButtons" + class="popover-trigger" > <FAIcon class="fa-scale-110 fa-old-padding" @@ -116,13 +129,15 @@ @import '../../_variables.scss'; .ExtraButtons { - position: static; - padding: 10px; - margin: -10px; + .popover-trigger { + position: static; + padding: 10px; + margin: -10px; - &:hover .svg-inline--fa { - color: $fallback--text; - color: var(--text, $fallback--text); + &:hover .svg-inline--fa { + color: $fallback--text; + color: var(--text, $fallback--text); + } } } </style> diff --git a/src/components/features_panel/features_panel.js b/src/components/features_panel/features_panel.js index 620a85ea7cd519ca85d7744f5188e20be7c62204..8b142d08308dedb37095c871557706b673d4380e 100644 --- a/src/components/features_panel/features_panel.js +++ b/src/components/features_panel/features_panel.js @@ -1,3 +1,5 @@ +import fileSizeFormatService from '../../services/file_size_format/file_size_format.js' + const FeaturesPanel = { computed: { chat: function () { return this.$store.state.instance.chatAvailable }, @@ -6,7 +8,8 @@ const FeaturesPanel = { whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled }, mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable }, minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode }, - textlimit: function () { return this.$store.state.instance.textlimit } + textlimit: function () { return this.$store.state.instance.textlimit }, + uploadlimit: function () { return fileSizeFormatService.fileSizeFormat(this.$store.state.instance.uploadlimit) } } } diff --git a/src/components/features_panel/features_panel.vue b/src/components/features_panel/features_panel.vue index 608b11c81244f37b239c5f37d95dd58ad9c0db06..9605d09d07185e0a158042855b736ee0f97bdf1a 100644 --- a/src/components/features_panel/features_panel.vue +++ b/src/components/features_panel/features_panel.vue @@ -25,6 +25,7 @@ </li> <li>{{ $t('features_panel.scope_options') }}</li> <li>{{ $t('features_panel.text_limit') }} = {{ textlimit }}</li> + <li>{{ $t('features_panel.upload_limit') }} = {{ uploadlimit.num }} {{ $t('upload.file_size_units.' + uploadlimit.unit) }}</li> </ul> </div> </div> diff --git a/src/components/global_notice_list/global_notice_list.vue b/src/components/global_notice_list/global_notice_list.vue index 8a33b9eb711209fc2d49df8b72eef0500c889c21..049e23dbb01033225c2ba9e0627253d8bf14a70a 100644 --- a/src/components/global_notice_list/global_notice_list.vue +++ b/src/components/global_notice_list/global_notice_list.vue @@ -9,11 +9,15 @@ <div class="notice-message"> {{ $t(notice.messageKey, notice.messageArgs) }} </div> - <FAIcon - class="fa-scale-110 fa-old-padding" - icon="times" + <button + class="button-unstyled close-notice" @click="closeNotice(notice)" - /> + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" + /> + </button> </div> </div> </template> @@ -54,7 +58,7 @@ .global-error { background-color: var(--alertPopupError, $fallback--cRed); color: var(--alertPopupErrorText, $fallback--text); - i { + .svg-inline--fa { color: var(--alertPopupErrorText, $fallback--text); } } @@ -62,7 +66,7 @@ .global-warning { background-color: var(--alertPopupWarning, $fallback--cOrange); color: var(--alertPopupWarningText, $fallback--text); - i { + .svg-inline--fa { color: var(--alertPopupWarningText, $fallback--text); } } @@ -70,9 +74,16 @@ .global-info { background-color: var(--alertPopupNeutral, $fallback--fg); color: var(--alertPopupNeutralText, $fallback--text); - i { + .svg-inline--fa { color: var(--alertPopupNeutralText, $fallback--text); } } + + .close-notice { + padding-right: 0.2em; + .svg-inline--fa:hover { + opacity: 0.6; + } + } } </style> diff --git a/src/components/image_cropper/image_cropper.js b/src/components/image_cropper/image_cropper.js index 59e4d07ef590f13353cabcccf09ea92c44cf51a0..e8d5ec6de849ae7e3822e88f35a345466f6afa36 100644 --- a/src/components/image_cropper/image_cropper.js +++ b/src/components/image_cropper/image_cropper.js @@ -2,12 +2,10 @@ import Cropper from 'cropperjs' import 'cropperjs/dist/cropper.css' import { library } from '@fortawesome/fontawesome-svg-core' import { - faTimes, faCircleNotch } from '@fortawesome/free-solid-svg-icons' library.add( - faTimes, faCircleNotch ) @@ -53,8 +51,7 @@ const ImageCropper = { cropper: undefined, dataUrl: undefined, filename: undefined, - submitting: false, - submitError: null + submitting: false } }, computed: { @@ -66,9 +63,6 @@ const ImageCropper = { }, cancelText () { return this.cancelButtonLabel || this.$t('image_cropper.cancel') - }, - submitErrorMsg () { - return this.submitError && this.submitError instanceof Error ? this.submitError.toString() : this.submitError } }, methods: { @@ -82,12 +76,8 @@ const ImageCropper = { }, submit (cropping = true) { this.submitting = true - this.avatarUploadError = null this.submitHandler(cropping && this.cropper, this.file) .then(() => this.destroy()) - .catch((err) => { - this.submitError = err - }) .finally(() => { this.submitting = false }) @@ -113,9 +103,6 @@ const ImageCropper = { reader.readAsDataURL(this.file) this.$emit('changed', this.file, reader) } - }, - clearError () { - this.submitError = null } }, mounted () { diff --git a/src/components/image_cropper/image_cropper.vue b/src/components/image_cropper/image_cropper.vue index 448461b4d4bbdf691d2d58378e4f66ce7ae0bc81..8c48a3876740fb332627ec3e116e55cd1206cd4e 100644 --- a/src/components/image_cropper/image_cropper.vue +++ b/src/components/image_cropper/image_cropper.vue @@ -37,17 +37,6 @@ icon="circle-notch" /> </div> - <div - v-if="submitError" - class="alert error" - > - {{ submitErrorMsg }} - <FAIcon - class="fa-scale-110 fa-old-padding" - icon="times" - @click="clearError" - /> - </div> </div> <input ref="input" diff --git a/src/components/interface_language_switcher/interface_language_switcher.vue b/src/components/interface_language_switcher/interface_language_switcher.vue index d039e86b223ca25f0e56e9d2f1183cb084438b15..524ec5e95542de414c4bcc22b05315ae81fc753b 100644 --- a/src/components/interface_language_switcher/interface_language_switcher.vue +++ b/src/components/interface_language_switcher/interface_language_switcher.vue @@ -63,7 +63,8 @@ export default { const specialLanguageNames = { 'ja': 'Japanese (日本語)', 'ja_easy': 'Japanese (ã‚„ã•ã—ã„ã«ã»ã‚“ã”)', - 'zh': 'Chinese (简体ä¸æ–‡)' + 'zh': 'Simplified Chinese (简体ä¸æ–‡)', + 'zh_Hant': 'Traditional Chinese (ç¹é«”ä¸æ–‡)' } return specialLanguageNames[code] || ISO6391.getName(code) } diff --git a/src/components/poll/poll.vue b/src/components/poll/poll.vue index 264a5f03eae3322773bbe2552383558e6cf1b99f..42819c19faca04f250350bb1d0f20699d96b12d4 100644 --- a/src/components/poll/poll.vue +++ b/src/components/poll/poll.vue @@ -42,7 +42,8 @@ :value="index" > <label class="option-vote"> - <div>{{ option.title }}</div> + <!-- eslint-disable-next-line vue/no-v-html --> + <div v-html="option.title_html" /> </label> </div> </div> diff --git a/src/components/popover/popover.vue b/src/components/popover/popover.vue index 020eab0557f1cd0c4b26d5e5d4905413dfff8be1..2252c68f37e89687b523b71ae675a290c6f77550 100644 --- a/src/components/popover/popover.vue +++ b/src/components/popover/popover.vue @@ -95,6 +95,7 @@ box-shadow: none; width: 100%; height: 100%; + box-sizing: border-box; --btnText: var(--popoverText, $fallback--text); diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue index dde67d214f1b7ec6ea88af66f3e149b9953a2db8..ac940b9890e2f05a89e0955d5fbdb07d68aedf59 100644 --- a/src/components/react_button/react_button.vue +++ b/src/components/react_button/react_button.vue @@ -20,10 +20,10 @@ <div class="reaction-picker"> <span v-for="emoji in commonEmojis" - :key="emoji" + :key="emoji.replacement" class="emoji-button" :title="emoji.displayText" - @click="addReaction($event, emoji, close)" + @click="addReaction($event, emoji.replacement, close)" > {{ emoji.replacement }} </span> diff --git a/src/components/remote_follow/remote_follow.vue b/src/components/remote_follow/remote_follow.vue index cb1c2a1bb538f99dfb7ee960a9e7b703f34bff39..be8274001c21e391d61cb220de58fda1e96c77f1 100644 --- a/src/components/remote_follow/remote_follow.vue +++ b/src/components/remote_follow/remote_follow.vue @@ -16,7 +16,7 @@ > <button click="submit" - class="remote-button" + class="button-default remote-button" > {{ $t('user_card.remote_follow') }} </button> diff --git a/src/components/settings_modal/tabs/filtering_tab.vue b/src/components/settings_modal/tabs/filtering_tab.vue index 813dc4cdb6bc197b1acd9cc60231b69e4d40fe89..8f850c8b7a6af1072fe3f408de34f1665505a100 100644 --- a/src/components/settings_modal/tabs/filtering_tab.vue +++ b/src/components/settings_modal/tabs/filtering_tab.vue @@ -75,6 +75,7 @@ <p>{{ $t('settings.filtering_explanation') }}</p> <textarea id="muteWords" + class="resize-height" v-model="muteWordsString" /> </div> diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index df592a109432f642db74c11855bb8f9186266803..029ee7a1cc59076b2a78444dbbc7de3eb2cd1a56 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -34,6 +34,10 @@ const GeneralTab = { return this.$store.state.instance.postFormats || [] }, instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel }, + instanceWallpaperUsed () { + return this.$store.state.instance.background && + !this.$store.state.users.currentUser.background_image + }, ...SharedComputedObject() } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index c1d0d0ecb88454d931c16d83c36cec05035686f0..a9081793bdd9361376f6968b91df0289723e9642 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -11,6 +11,11 @@ {{ $t('settings.hide_isp') }} </Checkbox> </li> + <li v-if="instanceWallpaperUsed"> + <Checkbox v-model="hideInstanceWallpaper"> + {{ $t('settings.hide_wallpaper') }} + </Checkbox> + </li> </ul> </div> <div class="setting-item"> diff --git a/src/components/settings_modal/tabs/profile_tab.js b/src/components/settings_modal/tabs/profile_tab.js index a4fed6294f1bbd57f56e14c329827e238ab19367..9709424c9e5a283c0876a0fbe8a8a26a16355f1b 100644 --- a/src/components/settings_modal/tabs/profile_tab.js +++ b/src/components/settings_modal/tabs/profile_tab.js @@ -45,9 +45,7 @@ const ProfileTab = { banner: null, bannerPreview: null, background: null, - backgroundPreview: null, - bannerUploadError: null, - backgroundUploadError: null + backgroundPreview: null } }, components: { @@ -162,18 +160,18 @@ const ProfileTab = { if (file.size > this.$store.state.instance[slot + 'limit']) { const filesize = fileSizeFormatService.fileSizeFormat(file.size) const allowedsize = fileSizeFormatService.fileSizeFormat(this.$store.state.instance[slot + 'limit']) - this[slot + 'UploadError'] = [ - this.$t('upload.error.base'), - this.$t( - 'upload.error.file_too_big', - { + this.$store.dispatch('pushGlobalNotice', { + messageKey: 'upload.error.message', + messageArgs: [ + this.$t('upload.error.file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit - } - ) - ].join(' ') + }) + ], + level: 'error' + }) return } // eslint-disable-next-line no-undef @@ -213,8 +211,9 @@ const ProfileTab = { that.$store.commit('setCurrentUser', user) resolve() }) - .catch((err) => { - reject(new Error(that.$t('upload.error.base') + ' ' + err.message)) + .catch((error) => { + that.displayUploadError(error) + reject(error) }) } @@ -235,24 +234,27 @@ const ProfileTab = { this.$store.commit('setCurrentUser', user) this.bannerPreview = null }) - .catch((err) => { - this.bannerUploadError = this.$t('upload.error.base') + ' ' + err.message - }) - .then(() => { this.bannerUploading = false }) + .catch(this.displayUploadError) + .finally(() => { this.bannerUploading = false }) }, submitBackground (background) { if (!this.backgroundPreview && background !== '') { return } this.backgroundUploading = true - this.$store.state.api.backendInteractor.updateProfileImages({ background }).then((data) => { - if (!data.error) { + this.$store.state.api.backendInteractor.updateProfileImages({ background }) + .then((data) => { this.$store.commit('addNewUsers', [data]) this.$store.commit('setCurrentUser', data) this.backgroundPreview = null - } else { - this.backgroundUploadError = this.$t('upload.error.base') + data.error - } - this.backgroundUploading = false + }) + .catch(this.displayUploadError) + .finally(() => { this.backgroundUploading = false }) + }, + displayUploadError (error) { + this.$store.dispatch('pushGlobalNotice', { + messageKey: 'upload.error.message', + messageArgs: [error.message], + level: 'error' }) } } diff --git a/src/components/settings_modal/tabs/profile_tab.vue b/src/components/settings_modal/tabs/profile_tab.vue index 50d3ee630174893f41ffcbb8100c1089325c5f9b..b7ef21d77ac50bb8f256da7221a88d52bd5b5230 100644 --- a/src/components/settings_modal/tabs/profile_tab.vue +++ b/src/components/settings_modal/tabs/profile_tab.vue @@ -11,7 +11,7 @@ <input id="username" v-model="newName" - classname="name-changer" + class="name-changer" > </EmojiInput> <p>{{ $t('settings.bio') }}</p> @@ -22,7 +22,7 @@ > <textarea v-model="newBio" - classname="bio" + class="bio resize-height" /> </EmojiInput> <p> @@ -229,17 +229,6 @@ > {{ $t('general.submit') }} </button> - <div - v-if="bannerUploadError" - class="alert error" - > - Error: {{ bannerUploadError }} - <FAIcon - class="fa-scale-110 fa-old-padding" - icon="times" - @click="clearUploadError('banner')" - /> - </div> </div> <div class="setting-item"> <h2>{{ $t('settings.profile_background') }}</h2> @@ -279,18 +268,6 @@ > {{ $t('general.submit') }} </button> - <div - v-if="backgroundUploadError" - class="alert error" - > - Error: {{ backgroundUploadError }} - <FAIcon - size="lg" - class="fa-scale-110 fa-old-padding" - icon="times" - @click="clearUploadError('background')" - /> - </div> </div> </div> </template> diff --git a/src/components/settings_modal/tabs/theme_tab/theme_tab.scss b/src/components/settings_modal/tabs/theme_tab/theme_tab.scss index 926eceff570dc2aedca52bbc21697372edee55d4..1b7d9f31524367b814c3e2f069f4b35bbbe32224 100644 --- a/src/components/settings_modal/tabs/theme_tab/theme_tab.scss +++ b/src/components/settings_modal/tabs/theme_tab/theme_tab.scss @@ -165,7 +165,8 @@ border-color: var(--border, $fallback--border); margin: 1em 0; padding: 1em; - background: var(--body-background-image); + background-color: var(--wallpaper); + background-image: var(--body-background-image); background-size: cover; background-position: 50% 50%; diff --git a/src/components/settings_modal/tabs/theme_tab/theme_tab.vue b/src/components/settings_modal/tabs/theme_tab/theme_tab.vue index 4ab793d66c7c8364b9e3b33cf477f5c9bac94b3f..b8add42f48973d2dba28e6faf8e46461f39a5997 100644 --- a/src/components/settings_modal/tabs/theme_tab/theme_tab.vue +++ b/src/components/settings_modal/tabs/theme_tab/theme_tab.vue @@ -616,6 +616,15 @@ :disabled="underlayOpacityLocal === 'transparent'" /> </div> + <div class="color-item"> + <h4>{{ $t('settings.style.advanced_colors.wallpaper') }}</h4> + <ColorInput + v-model="wallpaperColorLocal" + name="wallpaper" + :label="$t('settings.style.advanced_colors.wallpaper')" + :fallback="previewTheme.colors.wallpaper" + /> + </div> <div class="color-item"> <h4>{{ $t('settings.style.advanced_colors.poll') }}</h4> <ColorInput diff --git a/src/components/status/status.js b/src/components/status/status.js index 142e1fc6389728462a05e28600c5e2cf33827b9b..f9c710ab7d97737f675d820b52575caaa4e77c65 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -26,7 +26,6 @@ import { faTimes, faRetweet, faReply, - faExternalLinkSquareAlt, faPlusSquare, faSmileBeam, faEllipsisH, @@ -44,7 +43,6 @@ library.add( faTimes, faRetweet, faReply, - faExternalLinkSquareAlt, faPlusSquare, faStar, faSmileBeam, diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 70c6d03d6a34dbbc3ce8bcad1915788a12beeedd..58b55bc81b1077311d3abefc786fd1b5963fb1b9 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -139,6 +139,20 @@ $status-margin: 0.75em; .heading-right { display: flex; flex-shrink: 0; + + .button-unstyled { + padding: 5px; + margin: -5px; + + &:hover svg { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } + } + + .svg-inline--fa { + margin-left: 0.25em; + } } .timeago { diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 896635ee089b194ed49cabd245933bc6281e2d91..6ee8117f2a23b633e16291888f274f8e0dc7eff6 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -184,30 +184,20 @@ :title="status.visibility | capitalize" > <FAIcon - class="fa-scale-110 fa-old-padding" + fixed-width + class="fa-scale-110" :icon="visibilityIcon(status.visibility)" /> </span> - <a - v-if="!status.is_local && !isPreview" - :href="status.external_url" - target="_blank" - class="source_url" - title="Source" - > - <FAIcon - class="fa-scale-110 fa-old-padding" - icon="external-link-square-alt" - /> - </a> <button v-if="expandable && !isPreview" class="button-unstyled" - title="Expand" + :title="$t('status.expand')" @click.prevent="toggleExpanded" > <FAIcon - class="fa-scale-110 fa-old-padding" + fixed-width + class="fa-scale-110" icon="plus-square" /> </button> @@ -217,8 +207,9 @@ @click.prevent="toggleMute" > <FAIcon + fixed-width icon="eye-slash" - class="fa-scale-110 fa-old-padding" + class="fa-scale-110" /> </button> </span> diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index 0326342be4cecdfedd63bb5cd4a97f09a9cc5b27..4c43fe5ce8c509bfd6f9409bab6a7d827820a728 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -102,6 +102,7 @@ .timeline-heading { max-width: 100%; flex-wrap: nowrap; + align-items: center; .loadmore-button { flex-shrink: 0; } diff --git a/src/components/timeline_menu/timeline_menu.js b/src/components/timeline_menu/timeline_menu.js index ef8a58137908a651026de180e255efe6248cad6b..8d6a58b11e913bfe61b191f9fe2c2d6efb98dab5 100644 --- a/src/components/timeline_menu/timeline_menu.js +++ b/src/components/timeline_menu/timeline_menu.js @@ -59,6 +59,14 @@ const TimelineMenu = { this.isOpen = true }, 25) }, + blockOpen (event) { + // For the blank area inside the button element. + // Just setting @click.stop="" makes unintuitive behavior when + // menu is open and clicking on the blank area doesn't close it. + if (!this.isOpen) { + event.stopPropagation() + } + }, timelineName () { const route = this.$route.name if (route === 'tag-timeline') { diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue index c46531be47759370cb73bbac01918a436d78597b..3c86842b7d8f3ab4cf7a476c1751da649e4e2b2c 100644 --- a/src/components/timeline_menu/timeline_menu.vue +++ b/src/components/timeline_menu/timeline_menu.vue @@ -65,10 +65,16 @@ slot="trigger" class="title timeline-menu-title" > - <span>{{ timelineName() }}</span> - <FAIcon - size="sm" - icon="chevron-down" + <span class="timeline-title">{{ timelineName() }}</span> + <span> + <FAIcon + size="sm" + icon="chevron-down" + /> + </span> + <span + class="click-blocker" + @click="blockOpen" /> </div> </Popover> @@ -117,8 +123,9 @@ cursor: pointer; user-select: none; width: 100%; + display: flex; - span { + .timeline-menu-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -128,6 +135,11 @@ margin-left: 0.6em; transition: transform 100ms; } + + .click-blocker { + cursor: default; + flex-grow: 1; + } } &.open .timeline-menu-title svg { diff --git a/src/hocs/with_load_more/with_load_more.js b/src/hocs/with_load_more/with_load_more.js index 7df9dbb2f25601443f0b9b64b47ba9df01724cd9..671b2b6f7052599935fd547dcc18d0950f1dedb8 100644 --- a/src/hocs/with_load_more/with_load_more.js +++ b/src/hocs/with_load_more/with_load_more.js @@ -29,12 +29,8 @@ const withLoadMore = ({ return { loading: false, bottomedOut: false, - error: false - } - }, - computed: { - entries () { - return select(this.$props, this.$store) || [] + error: false, + entries: [] } }, created () { @@ -48,6 +44,11 @@ const withLoadMore = ({ destroy && destroy(this.$props, this.$store) }, methods: { + // Entries is not a computed because computed can't track the dynamic + // selector for changes and won't trigger after fetch. + updateEntries () { + this.entries = select(this.$props, this.$store) || [] + }, fetchEntries () { if (!this.loading) { this.loading = true @@ -61,6 +62,9 @@ const withLoadMore = ({ this.loading = false this.error = true }) + .finally(() => { + this.updateEntries() + }) } }, scrollLoad (e) { diff --git a/src/i18n/en.json b/src/i18n/en.json index ef23efd60cd0d3760816f86b0d1a72088f3ef685..26dd61445d43c768e4270862f504c608df2ec139 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -50,7 +50,8 @@ "scope_options": "Scope options", "text_limit": "Text limit", "title": "Features", - "who_to_follow": "Who to follow" + "who_to_follow": "Who to follow", + "upload_limit": "Upload limit" }, "finder": { "error_fetching_user": "Error fetching user", @@ -328,6 +329,7 @@ "hide_muted_posts": "Hide posts of muted users", "max_thumbnails": "Maximum amount of thumbnails per post", "hide_isp": "Hide instance-specific panel", + "hide_wallpaper": "Hide instance wallpaper", "preload_images": "Preload images", "use_one_click_nsfw": "Open NSFW attachments with just one click", "hide_post_stats": "Hide post statistics (e.g. the number of favorites)", @@ -515,6 +517,7 @@ "inputs": "Input fields", "faint_text": "Faded text", "underlay": "Underlay", + "wallpaper": "Wallpaper", "poll": "Poll graph", "icons": "Icons", "highlight": "Highlighted elements", @@ -661,6 +664,7 @@ "unmute_conversation": "Unmute conversation", "status_unavailable": "Status unavailable", "copy_link": "Copy link to status", + "external_source": "External source", "thread_muted": "Thread muted", "thread_muted_and_words": ", has words:", "show_full_subject": "Show full subject", @@ -668,7 +672,8 @@ "show_content": "Show content", "hide_content": "Hide content", "status_deleted": "This post was deleted", - "nsfw": "NSFW" + "nsfw": "NSFW", + "expand": "Expand" }, "user_card": { "approve": "Approve", @@ -758,6 +763,7 @@ "upload": { "error": { "base": "Upload failed.", + "message": "Upload failed: {0}", "file_too_big": "File too big [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", "default": "Try again later" }, diff --git a/src/i18n/messages.js b/src/i18n/messages.js index c3195f10aacd05896af1df5659829a1ff66cc835..2a1161be252bc4c71d85a07b98b41cb8ce91b313 100644 --- a/src/i18n/messages.js +++ b/src/i18n/messages.js @@ -33,7 +33,9 @@ const loaders = { ro: () => import('./ro.json'), ru: () => import('./ru.json'), te: () => import('./te.json'), - zh: () => import('./zh.json') + uk: () => import('./uk.json'), + zh: () => import('./zh.json'), + zh_Hant: () => import('./zh_Hant.json') } const messages = { diff --git a/src/i18n/ru.json b/src/i18n/ru.json index f636bdf8f59967cac98f65e47cdcb6b7af6c805d..3a7c61a9a4e24a8bc2d6c2f4ee1abaa86b5d50ce 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -19,7 +19,7 @@ "optional": "не обÑзательно", "show_less": "Показать меньше", "show_more": "Показать больше", - "peek": "ВзглÑнуть", + "peek": "Свернуть", "dismiss": "Закрыть", "retry": "Попробуйте еще раз", "error_retry": "ПожалуйÑта попробуйте еще раз", @@ -39,8 +39,11 @@ "recovery_code": "Код воÑÑтановлениÑ", "heading": { "TotpForm": "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ", - "RecoveryForm": "Two-factor recovery" - } + "RecoveryForm": "Two-factor recovery", + "totp": "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ" + }, + "hint": "Войдите чтобы приÑоединитьÑÑ Ðº диÑкуÑÑии", + "description": "Войти Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OAuth" }, "nav": { "back": "Ðазад", @@ -52,7 +55,14 @@ "twkn": "Ð¤ÐµÐ´ÐµÑ€Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð»ÐµÐ½Ñ‚Ð°", "search": "ПоиÑк", "friend_requests": "ЗапроÑÑ‹ на чтение", - "bookmarks": "Закладки" + "bookmarks": "Закладки", + "chats": "БеÑеды", + "timelines": "Ленты", + "preferences": "ÐаÑтройки", + "who_to_follow": "Кого читать", + "dms": "Личные СообщениÑ", + "administration": "Панель админиÑтратора", + "about": "О Ñервере" }, "notifications": { "broken_favorite": "ÐеизвеÑтный ÑтатуÑ, ищем...", @@ -62,12 +72,17 @@ "notifications": "УведомлениÑ", "read": "ПрочеÑÑ‚ÑŒ", "repeated_you": "повторил(а) ваш ÑтатуÑ", - "follow_request": "хочет читать ваÑ" + "follow_request": "хочет читать ваÑ", + "reacted_with": "добавил реакцию: {0}", + "migrated_to": "мигрировал на", + "no_more_notifications": "Ðет дальнейших уведомлений", + "error": "Ошибка при обновлении уведомлений: {0}" }, "interactions": { "favs_repeats": "Повторы и фавориты", - "follows": "Ðовые подпиÑки", - "load_older": "Загрузить Ñтарые взаимодейÑтвиÑ" + "follows": "Ðовые читатели", + "load_older": "Загрузить Ñтарые взаимодейÑтвиÑ", + "moves": "Миграции пользователей" }, "post_status": { "account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может начать читать Ð²Ð°Ñ Ñ‡Ñ‚Ð¾Ð±Ñ‹ видеть поÑÑ‚Ñ‹ только Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñчиков.", @@ -87,7 +102,21 @@ "private": "Ð”Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñчиков - Ñтот поÑÑ‚ видÑÑ‚ только подпиÑчики", "public": "Публичный - Ñтот поÑÑ‚ виден вÑем", "unlisted": "Ðепубличный - Ñтот поÑÑ‚ не виден на публичных лентах" - } + }, + "preview_empty": "ПуÑтой предпроÑмотр", + "media_description_error": "Ðе удалоÑÑŒ обновить вложение, попробуйте еще раз", + "empty_status_error": "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ пуÑтой ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±ÐµÐ· вложений", + "preview": "ПредпроÑмотр", + "direct_warning_to_first_only": "Ðто Ñообщение увидÑÑ‚ только пользователи упомÑнутые в его начале.", + "direct_warning_to_all": "Ðто Ñообщение увидÑÑ‚ вÑе упомÑнутые пользователи.", + "content_type": { + "text/bbcode": "BBCode", + "text/html": "HTML", + "text/markdown": "Markdown", + "text/plain": "ПроÑтой текÑÑ‚" + }, + "media_description": "ОпиÑание вложениÑ", + "new_status": "ÐапиÑать новый ÑтатуÑ" }, "registration": { "bio": "ОпиÑание", @@ -103,7 +132,12 @@ "password_required": "не должен быть пуÑтым", "password_confirmation_required": "не должно быть пуÑтым", "password_confirmation_match": "должно Ñовпадать Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼" - } + }, + "bio_placeholder": "например:\nПривет, Ñ Ð˜Ð³Ð¾Ñ€ÑŒ Печкин.\nРаботаю почтальоном в деревне ПроÑтоквашино. С недавних пор велоÑипедиÑÑ‚.", + "fullname_placeholder": "например: Почтальон Печкин", + "username_placeholder": "например: pechkin", + "captcha": "Код подтверждениÑ", + "new_captcha": "Ðажмите на изображение чтобы получить новый код" }, "settings": { "enter_current_password_to_confirm": "Введите Ñвой текущий пароль", @@ -202,7 +236,7 @@ "hide_followers_count_description": "Ðе показывать чиÑло моих подпиÑчиков", "show_admin_badge": "Показывать значок админиÑтратора в моем профиле", "show_moderator_badge": "Показывать значок модератора в моем профиле", - "nsfw_clickthrough": "Включить Ñкрытие NSFW вложений", + "nsfw_clickthrough": "Включить Ñкрытие NSFW вложений и не показывать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² предпроÑмотре ÑÑылок Ð´Ð»Ñ NSFW ÑтатуÑов", "oauth_tokens": "OAuth токены", "token": "Токен", "refresh_token": "Рефреш токен", @@ -355,7 +389,60 @@ } }, "allow_following_move": "Разрешить автоматичеÑки читать новый аккаунт при перемещении на другой Ñервер", - "hide_user_stats": "Ðе показывать ÑтатиÑтику пользователей (например количеÑтво читателей)" + "hide_user_stats": "Ðе показывать ÑтатиÑтику пользователей (например количеÑтво читателей)", + "discoverable": "Разрешить показ аккаунта в поиÑковиках и других ÑервиÑах", + "default_vis": "ВидимоÑÑ‚ÑŒ поÑтов по умолчанию", + "mutes_and_blocks": "Блокировки и игнорируемые", + "composing": "СоÑтавление поÑтов", + "chatMessageRadius": "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² беÑеде", + "blocks_tab": "Блокировки", + "import_mutes_from_a_csv_file": "Импортировать игнорируемых из CSV файла", + "mutes_imported": "Игнорируемые импортированы! Обработка может занÑÑ‚ÑŒ некоторое времÑ.", + "mute_import_error": "Произошла ошибка при импорте игнорируемых", + "mute_import": "Импорт игнорируемых", + "block_export_button": "ÐкÑпортирует блокировки в CSV файл", + "mute_export_button": "ÐкÑпортирует игнорируемых пользователей в CSV файл", + "mute_export": "ÐкÑпорт игнорируемых", + "blocks_imported": "Блокировки импортированы! Обработка может занÑÑ‚ÑŒ некоторое времÑ.", + "block_import_error": "Произошла ошибка при импорте блокировок", + "block_import": "Импорт блокировок", + "block_export": "ÐкÑпортировать блокировки", + "security": "БезопаÑноÑÑ‚ÑŒ", + "app_name": "Приложение", + "user_mutes": "Пользователи", + "post_status_content_type": "Формат ÑоÑтавлÑемых ÑтатуÑов по умолчанию", + "subject_line_noop": "Ðе копировать", + "subject_line_mastodon": "Как в Mastodon: Ñкопировать как еÑÑ‚ÑŒ", + "subject_line_email": "Как в e-mail: \"re: тема\"", + "subject_line_behavior": "Копировать тему в ответах", + "no_mutes": "Ðет игнорируемых", + "no_blocks": "Ðет блокировок", + "notification_visibility_emoji_reactions": "Реакции", + "notification_visibility_moves": "Миграции пользователей", + "use_contain_fit": "Ðе обрезать Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² миниатюрах", + "profile_fields": { + "value": "Значение", + "name": "Пункт", + "add_field": "Добавить поле", + "label": "Таблица метаданных профилÑ" + }, + "play_videos_in_modal": "Проигрывать видео во вÑплывающей рамке", + "mutes_tab": "Игнорируемые", + "invalid_theme_imported": "Выбраный файл не ÑвлÑетÑÑ Ñ‚ÐµÐ¼Ð¾Ð¹ Pleroma. Изменений в тему не было внеÑено.", + "import_blocks_from_a_csv_file": "Импортировать блокировки из CSV файла", + "hide_filtered_statuses": "Ðе показывать отфильтрованные ÑтатуÑÑ‹", + "hide_muted_posts": "Ðе показывать ÑтатуÑÑ‹ игнорируемых пользователей", + "hide_post_stats": "Ðе показывать ÑтатиÑтику ÑтатуÑов (например количеÑтво отметок «ÐравитÑÑ»)", + "use_one_click_nsfw": "Открывать NSFW Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¸Ð¼ кликом", + "preload_images": "Предварительно загружать изображениÑ", + "max_thumbnails": "МакÑимальное чиÑло миниатюр показываемых в ÑтатуÑе", + "emoji_reactions_on_timeline": "Показывать Ñмодзи реакции в ленте", + "domain_mutes": "Узлы", + "notification_setting_privacy": "ПриватноÑÑ‚ÑŒ", + "notification_setting_block_from_strangers": "Ðе показывать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ пользователей которых вы не читаете", + "notification_setting_filters": "ФильтрациÑ", + "notifications": "УведомлениÑ", + "virtual_scrolling": "Оптимизировать рендеринг ленты" }, "timeline": { "collapse": "Свернуть", @@ -369,7 +456,11 @@ }, "status": { "bookmark": "Ð’ закладки", - "unbookmark": "Удалить из закладок" + "unbookmark": "Удалить из закладок", + "status_deleted": "ПоÑÑ‚ удален", + "reply_to": "Ответ", + "repeats": "Повторы", + "favorites": "ПонравилоÑÑŒ" }, "user_card": { "block": "Заблокировать", @@ -407,7 +498,11 @@ "quarantine": "Ðе федерировать поÑÑ‚Ñ‹ пользователÑ", "delete_user": "Удалить пользователÑ", "delete_user_confirmation": "Ð’Ñ‹ уверены? Ðто дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ." - } + }, + "media": "С вложениÑми", + "mention": "УпомÑнуть", + "show_repeats": "Показывать повторы", + "hide_repeats": "Скрыть повторы" }, "user_profile": { "timeline_title": "Лента пользователÑ" @@ -480,12 +575,78 @@ }, "tool_tip": { "accept_follow_request": "ПринÑÑ‚ÑŒ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° чтение", - "reject_follow_request": "Отклонить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° чтение" + "reject_follow_request": "Отклонить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° чтение", + "media_upload": "Прикрепить вложение" }, "image_cropper": { "save_without_cropping": "Сохранить не обрезаÑ", "save": "Сохранить", "crop_picture": "Обрезать картинку", - "cancel": "Отмена" + "cancel": "Отменить" + }, + "errors": { + "storage_unavailable": "Pleroma не Ñмогла получить доÑтуп к хранилищу браузера. Ваша ÑеÑÑÐ¸Ñ Ð¸ наÑтройки не будут Ñохранены, и вы можете ÑтолкнутьÑÑ Ñ Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ñ‹Ð¼Ð¸ проблемами. Попробуйте включить файлы cookie." + }, + "polls": { + "not_enough_options": "ÐедоÑтаточно уникальных вариантов в опроÑе", + "expired": "ÐžÐ¿Ñ€Ð¾Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡Ð¸Ð»ÑÑ {0} назад", + "expires_in": "ÐžÐ¿Ñ€Ð¾Ñ Ð·Ð°ÐºÐ°Ð½Ñ‡Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‡ÐµÑ€ÐµÐ· {0}", + "expiry": "Срок опроÑа", + "multiple_choices": "ÐеÑколько вариантов", + "single_choice": "Один вариант", + "type": "Тип опроÑа", + "vote": "ПроголоÑовать", + "votes": "голоÑов", + "option": "Вариант", + "add_option": "Добавить вариант", + "add_poll": "Прикрепить опроÑ" + }, + "media_modal": { + "next": "СледующаÑ", + "previous": "ПредыдущаÑ" + }, + "importer": { + "error": "Произошла ошибка при импорте файла.", + "success": "Импорт прошел уÑпешно.", + "submit": "Отправить" + }, + "selectable_list": { + "select_all": "Выбрать вÑе" + }, + "emoji": { + "load_all": "Ð’Ñе {emojiAmount} Ñмодзи загружаютÑÑ", + "load_all_hint": "Загружены первые {saneAmount} Ñмодзи, загрузка вÑех Ñмодзи может привеÑти к проблемам Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью.", + "unicode": "Стандартные Ñмодзи", + "custom": "ПользовательÑкие Ñмодзи", + "add_emoji": "Добавить Ñмодзи", + "search_emoji": "ПоиÑк Ñмодзи", + "keep_open": "ОÑтавить окно выбора открытым", + "emoji": "Ðмодзи", + "stickers": "Стикеры" + }, + "shoutbox": { + "title": "БолтовнÑ" + }, + "time": { + "days_short": "{0}дн", + "years_short": "{0}г", + "year_short": "{0}г", + "weeks_short": "{0}нед", + "week_short": "{0}нед", + "seconds_short": "{0}Ñек", + "second_short": "{0}Ñ", + "now_short": "только что", + "now": "только что", + "months_short": "{0}меÑ", + "month_short": "{0}меÑ", + "minutes_short": "{0}мин", + "minute_short": "{0}мин", + "in_past": "{0} назад", + "in_future": "через {0}", + "hours_short": "{0}ч", + "hour_short": "{0}ч", + "hour": "{0} чаÑ", + "day_short": "{0}д", + "days": "{0} дней" } } diff --git a/src/i18n/uk.json b/src/i18n/uk.json index 73006e6e89e56d5e7303e10ff5776bfba712bb85..f630b2ddb0922bc844cc9eddbf4564d9d2e89368 100644 --- a/src/i18n/uk.json +++ b/src/i18n/uk.json @@ -44,19 +44,19 @@ "mute": "Ігнорувати" }, "shoutbox": { - "title": "Ð”Ð»Ñ Ð²Ð¾Ð¿Ð»Ñ–Ð²" + "title": "Міні-чат" }, "about": { "staff": "ÐдмініÑтраціÑ", "mrf": { "simple": { - "media_nsfw_desc": "Даний інÑÑ‚Ð°Ð½Ñ Ð¿Ñ€Ð¸Ð¼ÑƒÑово позначає Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð· наÑтупних інÑтанÑів Ñк NSFW:", - "media_nsfw": "ПримуÑове Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ñк дратівливого", - "media_removal_desc": "Поточний інÑÑ‚Ð°Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ” Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð½Ð° перелічених інÑтанÑах:", - "media_removal": "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½ÑŒ", + "media_nsfw_desc": "Даний інÑÑ‚Ð°Ð½Ñ Ð¿Ñ€Ð¸Ð¼ÑƒÑово позначає медіа в наÑтупних інÑтанÑах Ñк NSFW:", + "media_nsfw": "ПримуÑове Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼ÐµÐ´Ñ–Ð° Ñк дратівливого", + "media_removal_desc": "Поточний інÑÑ‚Ð°Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ” медіа з допиÑів на перелічених інÑтанÑах:", + "media_removal": "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÐ´Ñ–Ð°", "ftl_removal_desc": "Цей інÑÑ‚Ð°Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ” перелічені інÑтанÑи з \"УÑієї відомої мережі\":", - "ftl_removal": "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· \"Ð’ÑÑ Ð²Ñ–Ð´Ð¾Ð¼Ð° мережа\"", - "quarantine_desc": "Поточний інÑÑ‚Ð°Ð½Ñ Ð±ÑƒÐ´Ðµ надÑилати тільки публічні поÑти наÑтупним інÑтанÑам:", + "ftl_removal": "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· \"УÑієї відомої мережі\"", + "quarantine_desc": "Поточний інÑÑ‚Ð°Ð½Ñ Ð±ÑƒÐ´Ðµ надÑилати тільки публічні допиÑи наÑтупним інÑтанÑам:", "quarantine": "Карантин", "reject_desc": "Поточний інÑÑ‚Ð°Ð½Ñ Ð½Ðµ прийматиме Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· перелічених інÑтанÑів:", "accept": "ПрийнÑти", @@ -64,7 +64,7 @@ "accept_desc": "Поточний інÑÑ‚Ð°Ð½Ñ Ð¿Ñ€Ð¸Ð¹Ð¼Ð°Ñ” Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з перелічених інÑтанÑів:", "simple_policies": "Правила поточного інÑтанÑу" }, - "mrf_policies_desc": "Правила MRF розповÑюджуютьÑÑ Ð½Ð° данний інÑтанÑ. ÐаÑтупні правила активні:", + "mrf_policies_desc": "Правила MRF розповÑюджуютьÑÑ Ð½Ð° даний інÑтанÑ. ÐаÑтупні правила активні:", "mrf_policies": "Ðктивні правила MRF (модуль перепиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ)", "keyword": { "is_replaced_by": "→", @@ -83,7 +83,16 @@ "password": "Пароль", "logout": "Вийти", "description": "Увійти за допомогою OAuth", - "login": "Увійти" + "login": "Увійти", + "recovery_code": "Код відновленнÑ", + "enter_recovery_code": "Введіть код відновленнÑ", + "authentication_code": "Код автентифікації", + "heading": { + "recovery": "Двофакторне відновленнÑ", + "totp": "Двофакторна автентифікаціÑ" + }, + "enter_two_factor_code": "Введіть двофакторний код автентифікації", + "placeholder": "напр. stepan" }, "importer": { "error": "Під Ñ‡Ð°Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.", @@ -95,5 +104,674 @@ "save_without_cropping": "Зберегти не обрізаючи", "crop_picture": "Обрізати малюнок", "save": "Зберегти" + }, + "polls": { + "expired": "ÐžÐ¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð¾ÑÑŒ {0} тому", + "expires_in": "ÐžÐ¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÑƒÑ”Ñ‚ÑŒÑÑ Ñ‡ÐµÑ€ÐµÐ· {0}", + "expiry": "Термін опитуваннÑ", + "multiple_choices": "Декілька варіантів", + "single_choice": "Один варіант", + "add_option": "Додати опцію", + "type": "Тип опитуваннÑ", + "vote": "ПроголоÑувати", + "votes": "голоÑів", + "option": "Відповідь", + "add_poll": "Додати опитуваннÑ", + "not_enough_options": "Замало унікальних варіантів в опитуванні" + }, + "notifications": { + "reacted_with": "додав реакцію: {0}", + "migrated_to": "мігрував на", + "no_more_notifications": "Ðемає більше Ñповіщень", + "repeated_you": "поширив(-ла) ваш допиÑ", + "read": "Прочитано!", + "notifications": "СповіщеннÑ", + "load_older": "Завантажити давніші ÑповіщеннÑ", + "follow_request": "хоче підпиÑатиÑÑŒ на ваÑ", + "followed_you": "підпиÑавÑÑ(-лаÑÑŒ) на ваÑ", + "favorited_you": "вподобав(-ла) ваш допиÑ", + "broken_favorite": "Ðевідомий допиÑ, шукаю його…", + "error": "Помилка при оновленні Ñповіщень: {0}" + }, + "nav": { + "chats": "Локальні балачки", + "timelines": "Стрічки", + "twkn": "УÑÑ Ð²Ñ–Ð´Ð¾Ð¼Ð° мережа", + "about": "ІнформаціÑ", + "preferences": "ÐалаштуваннÑ", + "friend_requests": "Запити поÑлідовників", + "who_to_follow": "Кого відÑтежувати", + "search": "Пошук", + "user_search": "Пошук кориÑтувача", + "bookmarks": "Закладки", + "timeline": "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñтрічка", + "public_tl": "Публічна Ñтрічка", + "dms": "Приватні повідомленнÑ", + "interactions": "Взаємодії", + "mentions": "ЗгадуваннÑ", + "back": "Ðазад", + "administration": "ÐдмініÑтруваннÑ" + }, + "media_modal": { + "next": "ÐаÑтупна", + "previous": "ПопереднÑ" + }, + "password_reset": { + "instruction": "Введіть Ñвою адреÑу електронної пошти або Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача. Ми надішлемо вам поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.", + "placeholder": "Ваша електронна адреÑа або ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача", + "check_email": "Перевірте електронну пошту на наÑвніÑÑ‚ÑŒ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.", + "return_home": "ПовернутиÑÑ Ð½Ð° головну Ñторінку", + "too_many_requests": "Ви доÑÑгли ліміту Ñпроб, Ñпробуйте ще раз пізніше.", + "password_reset_required_but_mailer_is_disabled": "Ви повинні Ñкинути Ñвій пароль, але ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾. ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора інÑтанÑу.", + "password_reset_disabled": "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾. ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора інÑтанÑу.", + "password_reset_required": "Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ потрібно Ñкинути пароль.", + "password_reset": "Відновити пароль", + "forgot_password": "Забули пароль?" + }, + "chats": { + "you": "Ви:", + "message_user": "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ {nickname}", + "delete": "Видалити", + "chats": "Чати", + "new": "Ðовий чат", + "empty_message_error": "Ðе вдаєтьÑÑ Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ порожнє повідомленнÑ", + "more": "Більше", + "delete_confirm": "Ви дійÑно хочете видалити це повідомленнÑ?", + "error_loading_chat": "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñ‚Ñƒ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.", + "error_sending_message": "Під Ñ‡Ð°Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.", + "empty_chat_list_placeholder": "У Ð²Ð°Ñ Ñ‰Ðµ немає чатів. Почніть новий чат!" + }, + "file_type": { + "audio": "Ðудіо", + "video": "Відео", + "image": "ЗображеннÑ", + "file": "Файл" + }, + "display_date": { + "today": "Сьогодні" + }, + "interactions": { + "load_older": "Завантажити давніші взаємодії", + "follows": "Ðові підпиÑки", + "favs_repeats": "Повтори та вподобайки", + "moves": "Міграції кориÑтувачів" + }, + "errors": { + "storage_unavailable": "Pleroma не змогла отримати доÑтуп до Ñховища браузеру. Ваша ÑеÑÑ–Ñ Ñ‚Ð° Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ будуть збережені, це може Ñпричинити непередбачувані проблеми. Спробуйте увімкнути cookie." + }, + "emoji": { + "stickers": "Стікери", + "custom": "КориÑтувацькі емодзі", + "search_emoji": "Пошук емодзі", + "keep_open": "Тримати панель відкритою", + "add_emoji": "Додати емодзі", + "emoji": "Емодзі", + "load_all": "Ð’ÑÑ– {emojiAmount} Ñмодзі завантажуютьÑÑ", + "load_all_hint": "Завантажені перші {saneAmount} емодзі, Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… емодзі може призвеÑти до проблем з продуктивніÑÑ‚ÑŽ.", + "unicode": "Стандартні емодзі" + }, + "post_status": { + "content_type": { + "text/bbcode": "BBCode", + "text/markdown": "Markdown", + "text/html": "HTML", + "text/plain": "ПроÑтий текÑÑ‚" + }, + "attachments_sensitive": "Позначити Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ñк чутливі", + "account_not_locked_warning_link": "замкнена", + "account_not_locked_warning": "Ваша обліковка не {0}. Будь-хто може відÑтежувати Ð²Ð°Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду допиÑів тільки Ð´Ð»Ñ Ð²Ñ–Ð´Ñтежувачів.", + "new_status": "Створити допиÑ", + "direct_warning_to_first_only": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð±Ð°Ñ‡Ð°Ñ‚ÑŒ лише кориÑтувачі, що були згадані на початку повідомленнÑ.", + "direct_warning_to_all": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð±Ð°Ñ‡Ð°Ñ‚ÑŒ вÑÑ– згадані кориÑтувачі.", + "default": "Що нового?", + "content_warning": "Тема (необов'Ñзково)", + "preview": "Попередній переглÑд", + "posting": "ВідправлÑєтьÑÑ", + "empty_status_error": "Ðе можу опублікувати пуÑтий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±ÐµÐ· вкладень", + "scope": { + "unlisted": "Ðепублічний - цей Ð´Ð¾Ð¿Ð¸Ñ Ð±ÑƒÐ´Ðµ відÑутній у публічних Ñтрічках", + "public": "Піблічний - цей Ð´Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð±Ð°Ñ‡Ð°Ñ‚ÑŒ уÑÑ–", + "private": "Ð”Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ñ‡Ñ–Ð² - цей Ð´Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð±Ð°Ñ‡Ð°Ñ‚ÑŒ лише ваші читачі", + "direct": "Приватний - цей Ð´Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð±Ð°Ñ‡Ð°Ñ‚ÑŒ лише згадані кориÑтувачі" + }, + "scope_notice": { + "unlisted": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð½Ðµ буде видно в публічній Ñтрічці та уÑій відомій мережі", + "private": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð±Ð°Ñ‡Ð°Ñ‚ÑŒ лише ваші підпиÑники", + "public": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð±Ð°Ñ‡Ð¸Ñ‚Ð¸Ð¼ÑƒÑ‚ÑŒ уÑÑ–" + }, + "preview_empty": "ПуÑтий", + "media_description_error": "Ðе вдалоÑÑŒ оновити медіа, Ñпробуйте ще раз", + "media_description": "ÐžÐ¿Ð¸Ñ Ð¼ÐµÐ´Ñ–Ð°" + }, + "settings": { + "blocks_imported": "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¾Ð²Ð°Ð½Ñ–! Їх обробка триватиме певний чаÑ.", + "block_import_error": "Помилка Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½ÑŒ", + "block_import": "Імпорт блокувань", + "block_export_button": "ЕкÑпорт блокувань у файл CSV", + "block_export": "ЕкÑпорт блокувань", + "bio": "Про ВаÑ", + "background": "Обкладинка", + "app_name": "Ðазва програми", + "follow_export": "ЕкÑпортувати відÑтежуваних", + "filtering_explanation": "УÑÑ– ÑтатуÑи з цими Ñловами будуть приховані, один на Ñ€Ñдок", + "filtering": "ФільтруваннÑ", + "export_theme": "Зберегти переднабір", + "avatar_size_instruction": "Рекомендований мінімальний розмір Ð´Ð»Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ аватара Ñтановить 150x150 пікÑелів.", + "delete_account_instructions": "Введіть ваш пароль в поле нижче, аби підтвердити Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу.", + "delete_account_error": "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ облікового запиÑу виникла проблема. Якщо це траплÑєтьÑÑ Ð¿Ð¾Ñтійно, будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтратора вашого Ñервера.", + "delete_account_description": "ОÑтаточно видалити ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ð° уÑÑ– ваші повідомленнÑ.", + "delete_account": "Видалити обліковий запиÑ", + "default_vis": "ОбÑÑг видимоÑÑ‚Ñ– за замовчуваннÑм", + "data_import_export_tab": "Імпорт/екÑпорт даних", + "current_password": "Поточний пароль", + "confirm_new_password": "Підтвердіть новий пароль", + "composing": "Ð¡ÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ–", + "collapse_subject": "Згорнути допиÑи з темами", + "changed_password": "Пароль уÑпішно змінено!", + "change_password_error": "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ пароль.", + "change_password": "Змінити пароль", + "cRed": "Червоний (СкаÑувати)", + "cGreen": "Зелений (Поширити)", + "cOrange": "ЖовтогарÑчий (Вподобайки)", + "cBlue": "Блакитний (ВідповіÑти, читати)", + "btnRadius": "Кнопки", + "blocks_tab": "БлокуваннÑ", + "avatarRadius": "Ðватарки", + "avatarAltRadius": "Ðватарки у ÑповіщеннÑÑ…", + "avatar": "Ðватар", + "attachments": "ВкладеннÑ", + "attachmentRadius": "ВкладеннÑ", + "general": "Загальні", + "foreground": "Передній план", + "follows_imported": "ВідÑтежуваних імпортовано! Ð‡Ñ…Ð½Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ° потребує чаÑу.", + "follow_import_error": "Помилка Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñтежуваних", + "follow_import": "Імпортувати відÑтежуваних", + "follow_export_button": "ЕкÑпортувати відÑтежуваних до csv файлу", + "lock_account_description": "Обмежте Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð»Ð¸ÑˆÐµ Ñхваленими читачами", + "links": "ПоÑиланнÑ", + "limited_availability": "ÐедоÑтупно у вашому браузері", + "invalid_theme_imported": "Вибраний файл не Ñ” темою Pleroma. У вашу тему не внеÑено жодних змін.", + "interfaceLanguage": "Мова оболонки", + "interface": "Оболонка", + "instance_default_simple": "(за замовчуваннÑм)", + "instance_default": "(за замовчуваннÑм: {value})", + "checkboxRadius": "Прапорці", + "inputRadius": "ÐŸÐ¾Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ", + "import_theme": "Завантажити переднабір", + "import_followers_from_a_csv_file": "Імпортувати відÑтежуваних з csv файлу", + "import_blocks_from_a_csv_file": "Імпортувати заблокованих з csv файлу", + "hide_filtered_statuses": "Сховати відфільтровані ÑтатуÑи", + "hide_user_stats": "Приховувати ÑтатиÑтику кориÑтувачів (напр. кількіÑÑ‚ÑŒ відÑтежувачів)", + "hide_post_stats": "Приховувати ÑтатиÑтику допиÑів (напр. кількіÑÑ‚ÑŒ вподобаних)", + "use_one_click_nsfw": "Відкривати NSFW Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¸Ð¼ кліком миші", + "preload_images": "Передзавантажувати Ñвітлини", + "hide_isp": "Сховати панель з оÑобливоÑÑ‚Ñми Ñервера", + "max_thumbnails": "МакÑимальна кількіÑÑ‚ÑŒ мініатюр на повідомленнÑ", + "hide_muted_posts": "Приховати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð³Ð»ÑƒÑˆÐµÐ½Ð¸Ñ… кориÑтувачів", + "hide_attachments_in_tl": "Приховувати Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ñƒ Ñтрічці", + "hide_attachments_in_convo": "Приховувати Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ñƒ розмовах", + "mutes_tab": "Заглушені", + "loop_video_silent_only": "Зациклити відео без звуку (напр. Mastodon \"gifs\")", + "loop_video": "Зациклити відео", + "mfa": { + "verify": { + "desc": "Щоб увімкнути двофакторну автентифікацію, введіть код з вашого заÑтоÑунку Ð´Ð»Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації:" + }, + "scan": { + "desc": "ВідÑкануйте цей QR-код за допомогою програми двофакторної автентифікації або введіть текÑтовий ключ:", + "title": "СкануваннÑ", + "secret_code": "Ключ" + }, + "authentication_methods": "Методи автентифікації", + "recovery_codes_warning": "Запишіть ці коди Ñ– тримайте в безпечному міÑці - інакше ви Ñ—Ñ… ніколи не побачите. Якщо ви втратите доÑтуп до OTP додатку - без резервних кодів ви не зможете отримати доÑтуп до Ñвого облікового запиÑу.", + "waiting_a_recovery_codes": "Отримую резервні коди…", + "recovery_codes": "Резервні коди.", + "warning_of_generate_new_codes": "ПіÑÐ»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… резервних кодів, Ñтарі переÑтануть працювати.", + "generate_new_recovery_codes": "Згенерувати нові резервні коди", + "title": "Двофакторна автентифікаціÑ", + "confirm_and_enable": "Підтвердити та увімкнути OTP", + "wait_pre_setup_otp": "попереднє Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ OTP", + "setup_otp": "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ OTP", + "otp": "OTP" + }, + "enter_current_password_to_confirm": "Введіть Ñвій поточний пароль", + "security": "Безпека", + "domain_mutes": "Домени", + "discoverable": "Дозволити виÑÐ²Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ облікового запиÑу в результатах пошуку та інших Ñлужбах", + "mutes_and_blocks": "Заглушені та блоковані", + "changed_email": "Email уÑпішно змінено!", + "change_email_error": "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ email.", + "change_email": "Змінити email", + "bot": "Це обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±Ð¾Ñ‚Ð°", + "import_mutes_from_a_csv_file": "Імпорт заглушених з csv файлу", + "mutes_imported": "Заглушені імпортовані! Їх обробка триватиме певний чаÑ.", + "mute_export_button": "ЕкÑпорт заглушених у csv файл", + "mute_import_error": "Під Ñ‡Ð°Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ заглушених ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°", + "mute_import": "Імпорт ігнорувань", + "mute_export": "ЕкÑпорт ігнорувань", + "new_password": "Ðовий пароль", + "new_email": "Ðова ел. пошта", + "name_bio": "ОÑобиÑÑ‚Ñ– дані", + "set_new_profile_banner": "Ð’Ñтановити новий банер", + "set_new_avatar": "Ð’Ñтановити новий аватар", + "security_tab": "Безпека", + "saving_ok": "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ñ–", + "saving_err": "Помилка при збереженні налаштувань", + "reply_visibility_self": "Показувати лише адреÑовані мені відповіді", + "reply_visibility_following": "Показувати відповіді адреÑовані лише мені або кориÑтувачам, Ñких Ñ Ñ‡Ð¸Ñ‚Ð°ÑŽ", + "reply_visibility_all": "Показати вÑÑ– відповіді", + "replies_in_timeline": "Відповіді в Ñтрічці", + "profile_tab": "Профіль", + "profile_banner": "Банер профілю", + "profile_background": "Обкладинка профілю", + "revoke_token": "Відкликати", + "oauth_tokens": "OAuth ключі", + "token": "Ключ", + "refresh_token": "Оновити ключ", + "valid_until": "Діє до", + "use_contain_fit": "Ðе обрізати краї мініатюр", + "name": "Ім'Ñ", + "profile_fields": { + "value": "ЗміÑÑ‚", + "name": "Ðазва", + "add_field": "Додати поле", + "label": "Метадані профілю" + }, + "play_videos_in_modal": "Відтворювати відео у Ñпливаючій рамці", + "accent": "Ðкцент", + "chatMessageRadius": "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² беÑіді", + "notification_mutes": "Щоб переÑтати отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ певного кориÑтувача, заглушіть його.", + "user_mutes": "КориÑтувачі", + "no_mutes": "Заглушені відÑутні", + "emoji_reactions_on_timeline": "Показувати реакції емоджі на Ñтрічці", + "pad_emoji": "Додавати проÑÑ‚Ñ–Ñ€ з обидвох Ñторін емоджі, при додаванні з панелі", + "allow_following_move": "Дозволити автоÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ переміщенні на інший інÑтанÑ", + "set_new_profile_background": "Ð’Ñтановити нову обкладинку профілю", + "radii_help": "Ð Ð°Ð´Ñ–ÑƒÑ Ð·Ð°Ð¾ÐºÑ€ÑƒÐ³Ð»ÐµÐ½Ð½Ñ ÐºÑƒÑ‚Ñ–Ð² інтерфейÑу (в пікÑелÑÑ…)", + "presets": "Переднабір", + "show_moderator_badge": "Показувати значок модератора в моєму профілі", + "show_admin_badge": "Показувати значок адмініÑтратора в моєму профілі", + "hide_followers_description": "Ðе показувати хто підпиÑаний на мене", + "hide_follows_description": "Ðе показувати на кого Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñаний", + "no_rich_text_description": "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ñього Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту з уÑÑ–Ñ… допиÑів", + "notification_visibility_emoji_reactions": "Реакції", + "notification_visibility_moves": "ÐœÑ–Ð³Ñ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувача", + "notification_visibility_repeats": "ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾Ð¿Ð¸Ñу", + "notification_visibility_mentions": "ЗгадуваннÑ", + "notification_visibility_likes": "Вподобайки", + "notification_visibility_follows": "Ðові підпиÑки", + "notification_visibility": "Отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ наÑтупні події", + "settings": "ÐалаштуваннÑ", + "panelRadius": "Панелі", + "text": "ТекÑÑ‚", + "tooltipRadius": "Підказки/попередженнÑ", + "values": { + "true": "так", + "false": "ні" + }, + "user_settings": "КориÑтувацькі налаштуваннÑ", + "upload_a_photo": "Завантажити фото", + "theme": "Тема", + "style": { + "switcher": { + "keep_fonts": "Залишити шрифти", + "keep_roundness": "Залишити ÑкругленнÑ", + "keep_opacity": "Залишити прозороÑÑ‚Ñ–", + "keep_shadows": "Залишити тіні", + "keep_color": "Залишити кольори", + "use_source": "Ðова верÑÑ–Ñ", + "use_snapshot": "Стара верÑÑ–Ñ", + "load_theme": "Завантажити тему", + "reset": "Скинути", + "clear_all": "ОчиÑтити вÑе", + "help": { + "older_version_imported": "Імпортований файл було Ñтворено в Ñтарішій верÑÑ–Ñ— FE.", + "future_version_imported": "Імпортований файл було Ñтворено в новішій верÑÑ–Ñ— FE.", + "v2_imported": "Файл, Ñкий ви імпортували, був Ñтворений Ð´Ð»Ñ Ñтарішої верÑÑ–Ñ— інтерфейÑу Pleroma. Ми намагаємоÑÑŒ покращити ÑуміÑніÑÑ‚ÑŒ, але вÑе одно можуть бути розбіжноÑÑ‚Ñ–.", + "upgraded_from_v2": "PleromaFE було оновлено, тема може дещо відрізнÑтиÑÑ Ð²Ñ–Ð´ тієї, Ñку ви пам’Ñтаєте.", + "snapshot_source_mismatch": "Конфлікт верÑій: Швидше за вÑе, FE повернуто до попередньої верÑÑ–Ñ— та оновлено знову, Ñкщо ви змінили тему за допомогою Ñтарішої верÑÑ–Ñ— FE, швидше за вÑе, ви хочете викориÑтовувати Ñтару верÑÑ–ÑŽ, інакше викориÑтовуйте нову верÑÑ–ÑŽ.", + "migration_napshot_gone": "З ÑкоїÑÑŒ причини знімок зник, деÑкі речі можуть бути не такими, Ñк ви пам’Ñтаєте.", + "migration_snapshot_ok": "Ð”Ð»Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸, знімок теми завантажено. Ви можете Ñпробувати завантажити дані теми.", + "fe_downgraded": "ВерÑÑ–ÑŽ PleromaFE змінено на Ñтаршу.", + "fe_upgraded": "Двигун теми PleromaFE оновлено.", + "snapshot_missing": "У файлі немає жодного знімка теми, тому він може виглÑдати інакше, ніж передбачалоÑÑ Ñпочатку.", + "snapshot_present": "Знімок теми завантажено, тому вÑÑ– Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ перезапиÑано. ÐатоміÑÑ‚ÑŒ ви можете завантажити правильні дані теми." + }, + "keep_as_is": "Залишити Ñк Ñ”", + "clear_opacity": "ОчиÑтити прозоріÑÑ‚ÑŒ", + "save_load_hint": "Параметри \"Зберегти\" зберігають вÑтановлені на даний момент параметри під Ñ‡Ð°Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ або Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐ¼, вони також зберігають зазначені параметри під Ñ‡Ð°Ñ ÐµÐºÑпорту теми. Коли вÑÑ– прапорці знÑто, екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐ¼Ð¸ збереже вÑе." + }, + "common": { + "color": "Колір", + "contrast": { + "context": { + "text": "Ð´Ð»Ñ Ñ‚ÐµÐºÑту", + "18pt": "Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ (18pt+) текÑту" + }, + "level": { + "bad": "Ðе відповідає жодним вимогам щодо доÑтупноÑÑ‚Ñ–", + "aaa": "відповідає вимогам Ñ€Ñ–Ð²Ð½Ñ ÐÐA (рекомендований)", + "aa": "відповідає вимогам Ñ€Ñ–Ð²Ð½Ñ ÐÐ (мінімальний)" + }, + "hint": "Рівень контраÑту: {ratio}, {level} {context}" + }, + "opacity": "ПрозоріÑÑ‚ÑŒ" + }, + "preview": { + "mono": "зміÑту", + "text": "Трохи більше {0} та {1}", + "button": "Кнопка", + "error": "Приклад помилки", + "content": "ЗміÑÑ‚", + "header": "Попередній переглÑд", + "link": "невеличке поÑиланнÑ", + "header_faint": "Це нормально", + "input": "Що нового?", + "checkbox": "Я переглÑнув умови викориÑтаннÑ", + "fine_print": "Прочитайте наш {0} аби нічого нового не дізнатиÑÑŒ!", + "faint_link": "кориÑний підручник" + }, + "shadows": { + "components": { + "button": "Кнопка", + "input": "Поле вводу", + "panel": "Панель", + "panelHeader": "Заголовок панелі", + "avatarStatus": "Ðватар кориÑтувача (в Ñтрічці)", + "avatar": "Ðватар кориÑтувача (профіль)", + "buttonPressedHover": "Кнопка (натиÑнута + наведенний курÑор)", + "buttonPressed": "Кнопка (натиÑнута)", + "buttonHover": "Кнопка (при наведенні)", + "popup": "Спливаючі вікна та підказки" + }, + "component": "Компонент", + "filter_hint": { + "inset_classic": "Тіні ÑпрÑмовані вÑередину викориÑтовуватимуть {0}", + "spread_zero": "Тіні з поширеннÑм > 0 відображатимутьÑÑ Ñ‚Ð°Ðº, ніби було вÑтановлено нуль", + "avatar_inset": "Зауважте, що викориÑÑ‚Ð°Ð½Ð½Ñ Ñк вÑтавних, так Ñ– невÑтавних тіней на аватарах може привеÑти до непередбачуваних результатів із прозорими аватарами.", + "drop_shadow_syntax": "{0} не підтримує параметр {1} та ключове Ñлово {2}.", + "always_drop_shadow": "Увага! Ð¦Ñ Ñ‚Ñ–Ð½ÑŒ завжди викориÑтовує {0}, Ñкщо підтримуєтьÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼." + }, + "inset": "Ð’Ñередину", + "blur": "РозмиттÑ", + "shadow_id": "Тінь â„–{value}", + "override": "Перевизначити", + "_tab_label": "Тінь Ñ– підÑвічуваннÑ", + "hintV3": "Ð”Ð»Ñ Ñ‚Ñ–Ð½ÐµÐ¹ ви також можете викориÑтовувати Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ {0} Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ кольорового Ñлота." + }, + "fonts": { + "components": { + "input": "ÐŸÐ¾Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ", + "interface": "ІнтерфейÑ", + "postCode": "Моноширинний текÑÑ‚ в допиÑÑ– (форматований текÑÑ‚)", + "post": "ТекÑÑ‚ допиÑу" + }, + "_tab_label": "Шрифти", + "size": "Розмір (в пікÑелÑÑ…)", + "custom": "ÐеÑтандартний", + "weight": "Товщина", + "family": "Ðазва шрифту", + "help": "Виберіть шрифт Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð² інтерфейÑу. Ð”Ð»Ñ \"неÑтандартного\" потрібно ввеÑти точну назву шрифту, так Ñк вона відображаєтьÑÑ Ð² ÑиÑтемі." + }, + "advanced_colors": { + "alert_warning": "ПопередженнÑ", + "underlay": "Тло", + "inputs": "ÐŸÐ¾Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ", + "buttons": "Кнопки", + "borders": "Кордони", + "top_bar": "Ð’ÐµÑ€Ñ…Ð½Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ", + "panel_header": "Заголовок панелі", + "badge_notification": "СповіщеннÑ", + "popover": "Підказки, меню, поповери", + "badge": "Тло значків", + "post": "ДопиÑи/Дані кориÑтувачів", + "alert_neutral": "Ðейтральний", + "alert_error": "Помилки", + "alert": "Фон Ñповіщень", + "_tab_label": "Додатково", + "selectedPost": "Вибраний допиÑ", + "highlight": "Виділені елементи", + "poll": "Діаграма опитуваннÑ", + "icons": "Іконки", + "faint_text": "Затемнений текÑÑ‚", + "chat": { + "border": "Кайма", + "outgoing": "Вихідні повідомленнÑ", + "incoming": "Вхідні повідомленнÑ" + }, + "toggled": "Переключено", + "disabled": "Вимкнено", + "selectedMenu": "Вибраний пункт меню", + "tabs": "Вкладки", + "pressed": "ÐатиÑнуто" + }, + "common_colors": { + "rgbo": "Піктограми, акценти, значки", + "foreground_hint": "ПереглÑньте вкладку \"Додатково\" Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¾Ð³Ð¾ контролю", + "main": "Загальні кольори", + "_tab_label": "Загальні" + }, + "radii": { + "_tab_label": "ОкругліÑÑ‚ÑŒ" + } + }, + "enable_web_push_notifications": "Увімкнути web push-ÑповіщеннÑ", + "notifications": "СповіщеннÑ", + "fun": "Розваги", + "notification_setting_privacy": "ПриватніÑÑ‚ÑŒ", + "notification_setting_filters": "Фільтри", + "reset_avatar": "Скинути аватар", + "reset_profile_background": "Скинути обкладинку профілю", + "reset_avatar_confirm": "Ви дійÑно хочете Ñкинути аватар?", + "reset_profile_banner": "Скинули банер профілю", + "hide_follows_count_description": "Ðе показувати на кого Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñаний", + "reset_banner_confirm": "Ви дійÑно хочете Ñкинути банер?", + "reset_background_confirm": "Ви дійÑно хочете Ñкинути обкладинку?", + "subject_line_behavior": "ВиглÑд теми при відповіді", + "subject_input_always_show": "Завжди показувати поле Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ теми", + "minimal_scopes_mode": "Мінімізувати набір варіантів оÑÑгу Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¸Ñу", + "scope_copy": "Копіювати оÑÑг при відповіді (завжди ввімкнено Ð´Ð»Ñ Ð¾ÑобиÑтих повідомлень)", + "search_user_to_mute": "Шукайте кого ви хочете заглушити", + "search_user_to_block": "Шукайте кого ви хочете заблокувати", + "autohide_floating_post_button": "Ðвтоматично ховати кнопку \"Ðовий допиÑ\" (в мобільній верÑÑ–Ñ—)", + "pause_on_unfocused": "Призупинити транÑлÑцію, коли вкладка неактивна", + "hide_followers_count_description": "Ðе показувати кількіÑÑ‚ÑŒ читачів", + "notification_blocks": "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача зупинÑÑ” вÑÑ– ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ нього, а також ÑкаÑовує його відÑтеженнÑ.", + "notification_setting_hide_notification_contents": "Ховати відправника та вміÑÑ‚ push-Ñповіщень", + "notification_setting_block_from_strangers": "Блокувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ кориÑтувачів за Ñкими ви не Ñлідкуєте", + "type_domains_to_mute": "Пошук доменів Ð´Ð»Ñ Ð·Ð°Ð³Ð»ÑƒÑˆÐµÐ½Ð½Ñ", + "nsfw_clickthrough": "Увімкнути Ð¿Ñ€Ð¸Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ NSFW медіа", + "greentext": "Мемний текÑÑ‚", + "virtual_scrolling": "Оптимізувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñтрчки", + "theme_help_v2_2": "Піктограми під деÑкими запиÑами Ñ” показниками контраÑту між фоном та текÑтом. Коли ви наведете на них курÑор, ви отримаєте детальну інформацію. Пам'Ñтайте, Ñкщо ви викориÑтовуєте прозоріÑÑ‚ÑŒ, індикатори показують найгірший варіант.", + "theme_help_v2_1": "Ви також можете замінити кольори та видиміÑÑ‚ÑŒ окремих компонентів, перемикаючи прапорці, викориÑтовуйте \"ОчиÑтити вÑе\", щоб видалити вÑÑ– заміни.", + "theme_help": "ВикориÑтовувати шіÑтнадцÑткові коди кольору (#rrggbb) щоб редагувати тему.", + "no_blocks": "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñутні", + "subject_line_mastodon": "Як в mastodon: проÑто Ñкопіювати", + "subject_line_email": "Як в email: \"re: тема\"", + "useStreamingApiWarning": "(Ðе рекомендуєтьÑÑ, екÑпериментально, Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ зникати)", + "useStreamingApi": "Отримувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² режимі реального чаÑу", + "streaming": "Ввімкнути автоматичне Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… повідомлень при прокручуванні вгору", + "stop_gifs": "Відтворювати GIF анімації тільки при наведенні", + "post_status_content_type": "Тип вміÑту допиÑу", + "subject_line_noop": "Ðе копіювати", + "version": { + "frontend_version": "ВерÑÑ–Ñ Ñ„Ñ€Ð¾Ð½Ñ‚ÐµÐ½Ð´Ñƒ", + "backend_version": "ВерÑÑ–Ñ Ð±ÐµÐºÐµÐ½Ð´Ñƒ", + "title": "ВерÑÑ–Ñ" + } + }, + "selectable_list": { + "select_all": "Вибрати вÑе" + }, + "remote_user_resolver": { + "error": "Ðе знайдено.", + "searching_for": "Шукаю", + "remote_user_resolver": "Пошукова ÑиÑтема Ð´Ð»Ñ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ð¸Ñ… кориÑтувачів" + }, + "registration": { + "validations": { + "password_confirmation_match": "пароль та Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ мають Ñпівпадати", + "password_confirmation_required": "не може бути порожнім", + "password_required": "не може бути порожнім", + "email_required": "не може бути порожнім", + "fullname_required": "не може бути порожнім", + "username_required": "не може бути порожнім" + }, + "bio_placeholder": "напр.\nÐаш народ завжди прагне волі Ð´Ð»Ñ Ñебе Ñ– бажає Ñ—Ñ— Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… народів. Він боровÑÑ Ñ– боретьÑÑ Ð·Ð° правду Ñ– ÑправедливіÑÑ‚ÑŒ. Ми хочемо жити у згоді Ñ– взаємному шануванні з уÑіми народами доброї волі. Такі Ñамі права визнаємо за іншими народами, за Ñкі боремоÑÑ Ð´Ð»Ñ Ñебе.", + "fullname_placeholder": "напр. Степан Бандера", + "username_placeholder": "напр. stepan", + "new_captcha": "ÐатиÑніть на зображеннÑ, щоб оновити код, Ñкщо він нерозбірливий", + "token": "Ключ запрошеннÑ", + "registration": "РеєÑтраціÑ", + "password_confirm": "ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ", + "fullname": "Відображене ім'Ñ", + "email": "Ел. пошта", + "bio": "Про Ñебе", + "captcha": "CAPTCHA" + }, + "who_to_follow": { + "who_to_follow": "Ðа кого підпиÑатиÑÑ", + "more": "Більше" + }, + "tool_tip": { + "repeat": "Поширити", + "reply": "ВідповіÑти", + "add_reaction": "Додати реакцію", + "user_settings": "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача", + "favorite": "ПодобаєтьÑÑ", + "reject_follow_request": "Відхилити запит на підпиÑку", + "accept_follow_request": "ПрийнÑти запит на підпиÑку", + "media_upload": "Завантажити медіа" + }, + "upload": { + "error": { + "base": "Збій при завантаженні.", + "file_too_big": "Файл завеликий [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", + "default": "Спробуйте ще раз пізніше" + }, + "file_size_units": { + "TiB": "ТіБ", + "GiB": "ГіБ", + "MiB": "МіБ", + "KiB": "КіБ", + "B": "Б" + } + }, + "time": { + "weeks_short": "{0}тижд.", + "week_short": "{0}тижд.", + "years_short": "{0}Ñ€", + "year_short": "{0}Ñ€", + "years": "{0} роки", + "year": "{0} рік", + "weeks": "{0} тижднів", + "week": "{0} тиждень", + "second_short": "{0}Ñ", + "second": "{0} Ñекунда", + "now_short": "щойно", + "now": "щойно", + "months_short": "{0}міÑ.", + "month_short": "{0}міÑ.", + "months": "{0} міÑÑці", + "month": "{0} міÑÑць", + "minutes_short": "{0}хв", + "hours_short": "{0}год", + "hour_short": "{0}год", + "day_short": "{0}д", + "minute_short": "{0}хв", + "minutes": "{0} хвилини", + "minute": "{0} хвилина", + "in_past": "{0} тому", + "hours": "{0} години", + "hour": "{0} година", + "days_short": "{0}д", + "days": "{0} дні", + "day": "{0} день", + "seconds_short": "{0}Ñ", + "seconds": "{0} Ñекунди", + "in_future": "через {0}" + }, + "search": { + "no_results": "Ðемає результатів", + "hashtags": "Хештеги", + "people": "Люди" + }, + "user_card": { + "statuses": "ДопиÑи", + "message": "ПовідомленнÑ", + "follow": "ПідпиÑатиÑÑŒ", + "follow_unfollow": "ВідпиÑатиÑÑŒ", + "follow_again": "Відправити запит знову?", + "follow_sent": "Запит відправлено!", + "blocked": "Заблоковано!", + "admin_menu": { + "activate_account": "Ðктивувати обліковий запиÑ", + "deactivate_account": "Деактивувати обліковий запиÑ", + "delete_account": "Видалити аккаунт", + "moderation": "МодераціÑ", + "delete_user_confirmation": "Ви абÑолютно впевнені? Цю дію неможливо буде ÑкаÑовувати.", + "delete_user": "Видалити обліковий запиÑ", + "strip_media": "Вилучити медіа з допиÑів кориÑтувача", + "force_nsfw": "Позначити вÑÑ– допиÑи Ñк NSFW" + }, + "deny": "Відмовити", + "block": "Заблокувати", + "approve": "Схвалити", + "mention": "Згадати", + "unsubscribe": "ВідпиÑатиÑÑŒ", + "subscribe": "ПідпиÑатиÑÑŒ", + "report": "ПоÑкаржитиÑÑŒ", + "per_day": "на день", + "favorites": "ВподобаннÑ", + "media": "Медіа" + }, + "status": { + "copy_link": "Скопіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° допиÑ", + "status_unavailable": "Ð”Ð¾Ð¿Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупний", + "replies_list": "Відповіді:", + "delete_confirm": "Ви дійÑно хочете видалити цей допиÑ?", + "delete": "Видалити допиÑ", + "pin": "Закріпити в профілі", + "status_deleted": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð±ÑƒÐ² видалений", + "favorites": "Вподобане", + "hide_content": "Сховати вміÑÑ‚", + "show_content": "Показати вміÑÑ‚", + "hide_full_subject": "Сховати вÑÑŽ тему", + "show_full_subject": "Показати вÑÑŽ тему", + "thread_muted_and_words": ", має Ñлова:", + "mute_conversation": "Заглушити розмову", + "reply_to": "Відповідь", + "unbookmark": "Видалити із закладок", + "bookmark": "Додати до закладок", + "pinned": "Закріплено", + "unpin": "Відкріпити від профілю", + "repeats": "Повтори" + }, + "timeline": { + "no_more_statuses": "Більше немає допиÑів", + "up_to_date": "Оновлено", + "reload": "Оновити", + "show_new": "Показати нові", + "load_older": "Завантажити давніші допиÑи", + "error": "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñтрічки: {0}", + "collapse": "Згорнути", + "conversation": "Розмова", + "no_statuses": "ÐÑ–Ñких ÑтатуÑів", + "repeated": "поширив(-ла)", + "no_retweet_hint": "ЗапиÑ, позначено Ñк \"тільки Ð´Ð»Ñ Ð²Ñ–Ð´Ñтежувачів\" або \"оÑобиÑте\" Ñ– тому не може бути повторений" + }, + "user_reporting": { + "submit": "Відправити", + "forward_to": "ПереÑлати до {0}", + "forward_description": "Цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ іншому інÑтанÑу. Відправити їм копію Ñкарги?", + "additional_comments": "Додаткове поÑÑненнÑ", + "add_comment_description": "Скарга буде надіÑлана модераторам вашого інÑтанÑу. Ðижче Ви можете додати поÑÑÐ½ÐµÐ½Ð½Ñ Ñ‡Ð¾Ð¼Ñƒ ви вирішили поÑкаржитиÑÑŒ на цей обліковий запиÑ:", + "title": "ПоÑкаржитиÑÑŒ на {0}", + "generic_error": "Виникла помилка під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ вашого запиту." + }, + "user_profile": { + "profile_loading_error": "Вибачте, під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ профілю виникла помилка.", + "profile_does_not_exist": "Вибачте, цей профіль більше не Ñ–Ñнує." } } diff --git a/src/modules/config.js b/src/modules/config.js index 444b8ec7c39e22d301b6b8dd8355b0e72b3d3ec1..cd088737cb3fcdf60c20210344df6e8915b56a36 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -20,6 +20,7 @@ export const defaultState = { customTheme: undefined, customThemeSource: undefined, hideISP: false, + hideInstanceWallpaper: false, // bad name: actually hides posts of muted USERS hideMutedPosts: undefined, // instance default collapseMessageWithSubject: undefined, // instance default diff --git a/src/modules/instance.js b/src/modules/instance.js index 5f7bf0ec6ff59c46f70ac83eaeec3f35d98325a1..411b1caa87bfb2d756f13af4a67d12787e2bf188 100644 --- a/src/modules/instance.js +++ b/src/modules/instance.js @@ -127,7 +127,7 @@ const instance = { imageUrl: false, replacement: values[key] } - }).sort((a, b) => a.displayText - b.displayText) + }).sort((a, b) => a.name > b.name ? 1 : -1) commit('setInstanceOption', { name: 'emoji', value: emoji }) } else { throw (res) @@ -154,7 +154,7 @@ const instance = { } // Technically could use tags but those are kinda useless right now, // should have been "pack" field, that would be more useful - }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : 0) + }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : -1) commit('setInstanceOption', { name: 'customEmoji', value: emoji }) } else { throw (res) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 6b825c3746bf7ca9ccd38cf71cd1e15cb5fd1225..405903a9a401ff43fc0a22ff74221494ecd45186 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -162,7 +162,12 @@ const updateProfileImages = ({ credentials, avatar = null, banner = null, backgr body: form }) .then((data) => data.json()) - .then((data) => parseUser(data)) + .then((data) => { + if (data.error) { + throw new Error(data.error) + } + return parseUser(data) + }) } const updateProfile = ({ credentials, params }) => { diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index c71bc15af8660fce656810dd8da742f1bb428c31..f71d660975b075c2b97f33a6ef32c7c46ccfef56 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -1,6 +1,7 @@ import escape from 'escape-html' import parseLinkHeader from 'parse-link-header' import { isStatusNotification } from '../notification_utils/notification_utils.js' +import punycode from 'punycode.js' /** NOTICE! ** * Do not initialize UI-generated data here. @@ -197,6 +198,19 @@ export const parseUser = (data) => { output.rights = output.rights || {} output.notification_settings = output.notification_settings || {} + // Convert punycode to unicode + if (output.screen_name.includes('@')) { + const parts = output.screen_name.split('@') + console.log(parts) + let unicodeDomain = punycode.toUnicode(parts[1]) + if (unicodeDomain !== parts[1]) { + // Add some identifier so users can potentially spot spoofing attempts: + // lain.com and xn--lin-6cd.com would appear identical otherwise. + unicodeDomain = 'ðŸŒ' + unicodeDomain + output.screen_name = [parts[0], unicodeDomain].join('@') + } + } + return output } @@ -280,7 +294,7 @@ export const parseStatus = (data) => { if (output.poll) { output.poll.options = (output.poll.options || []).map(field => ({ ...field, - title_html: addEmojis(field.title, data.emojis) + title_html: addEmojis(escape(field.title), data.emojis) })) } output.pinned = data.pinned diff --git a/src/services/theme_data/pleromafe.js b/src/services/theme_data/pleromafe.js index 7ed85797575d4ae52a91d0a1b7c15f15aa3480d8..bec1eebdfc08246e3c426dc264b3670194cdca81 100644 --- a/src/services/theme_data/pleromafe.js +++ b/src/services/theme_data/pleromafe.js @@ -84,6 +84,10 @@ export const SLOT_INHERITANCE = { opacity: 'bg', priority: 1 }, + wallpaper: { + depends: ['bg'], + color: (mod, bg) => brightness(-2 * mod, bg).rgb + }, fg: { depends: [], priority: 1 diff --git a/static/themes/redmond-xx-se.json b/static/themes/redmond-xx-se.json index 24480d2c7bf050b971f89bce2ead456f9d86ae70..b62769dbc71d08715ddc0ec2724ed5b34d51e6ac 100644 --- a/static/themes/redmond-xx-se.json +++ b/static/themes/redmond-xx-se.json @@ -267,6 +267,7 @@ }, "colors": { "bg": "#c0c0c0", + "wallpaper": "#008080", "text": "#000000", "link": "#0000ff", "accent": "#000080", diff --git a/static/themes/redmond-xx.json b/static/themes/redmond-xx.json index cf9010fe20319dc628574430edc58dd526ff3f0e..83b591091d1570415c7c684d80d0ab80351e481d 100644 --- a/static/themes/redmond-xx.json +++ b/static/themes/redmond-xx.json @@ -258,6 +258,7 @@ }, "colors": { "bg": "#c0c0c0", + "wallpaper": "#008080", "text": "#000000", "link": "#0000ff", "accent": "#000080", diff --git a/static/themes/redmond-xxi.json b/static/themes/redmond-xxi.json index 7fdc4a6d654f326280ad868ad82c659ea1a33a88..60ceae7c2cc5bc1cc9505871925b0cb136d8ca1a 100644 --- a/static/themes/redmond-xxi.json +++ b/static/themes/redmond-xxi.json @@ -240,6 +240,7 @@ }, "colors": { "bg": "#d6d6ce", + "wallpaper": "#396ba5", "text": "#000000", "link": "#0000ff", "accent": "#0a246a", diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js index e1f7a958f95c41dbf30268383a57de4d64ebf2b9..a3f49b2cefe92f6aebb2d06cde3d06cc727d1e83 100644 --- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js +++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js @@ -311,6 +311,12 @@ describe('API Entities normalizer', () => { expect(parseUser(user)).to.have.property('hide_followers_count', false) expect(parseUser(user)).to.have.property('hide_follows_count', true) }) + + it('converts IDN to unicode and marks it as internatonal', () => { + const user = makeMockUserMasto({ acct: 'lain@xn--lin-6cd.com' }) + + expect(parseUser(user)).to.have.property('screen_name').that.equal('lain@ðŸŒlаin.com') + }) }) // We currently use QvitterAPI notifications only, and especially due to MastoAPI lacking is_seen, support for MastoAPI diff --git a/yarn.lock b/yarn.lock index 86cd420f2768a1c14543a1ae4643271444c5d922..6682841b8df0c29d656201da33d600fd600f760f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -951,6 +951,11 @@ remark "^12.0.0" unist-util-find-all-after "^3.0.1" +"@testim/chrome-version@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@testim/chrome-version/-/chrome-version-1.0.7.tgz#0cd915785ec4190f08a3a6acc9b61fc38fb5f1a9" + integrity sha512-8UT/J+xqCYfn3fKtOznAibsHpiuDshCb0fwgWxRazTT19Igp9ovoXMPhXyLD6m3CKQGTMHgqoxaFfMWaL40Rnw== + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -961,6 +966,11 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= +"@types/node@*": + version "14.14.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.19.tgz#5135176a8330b88ece4e9ab1fdcfc0a545b4bab4" + integrity sha512-4nhBPStMK04rruRVtVc6cDqhu7S9GZai0fpXgPXrFpcPX6Xul8xnrjSdGB4KPBVYG/R5+fXWdCM8qBoiULWGPQ== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -976,6 +986,13 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== +"@types/yauzl@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" + integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + dependencies: + "@types/node" "*" + "@ungap/event-target@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@ungap/event-target/-/event-target-0.1.0.tgz#88d527d40de86c4b0c99a060ca241d755999915b" @@ -1182,6 +1199,21 @@ agent-base@2: extend "~3.0.0" semver "~5.0.1" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1209,15 +1241,6 @@ ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.5: - version "6.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -1338,21 +1361,11 @@ array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -1383,16 +1396,6 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -1443,10 +1446,6 @@ async@^2.5.0: dependencies: lodash "^4.17.10" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -1475,13 +1474,12 @@ autoprefixer@^9.8.0: postcss "^7.0.32" postcss-value-parser "^4.1.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" +axios@^0.21.0: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -1675,12 +1673,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - dependencies: - tweetnacl "^0.14.3" - better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" @@ -1880,6 +1872,11 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -2042,10 +2039,6 @@ caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001097: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001107.tgz#809360df7a5b3458f627aa46b0f6ed6d5239da9a" integrity sha512-86rCH+G8onCmdN4VZzJet5uPELII59cUzDphko3thQFgAQG1RNa+sVLDoALIhRYmflo5iSIzWY3vu1XTWtNMQQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - ccount@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" @@ -2156,14 +2149,18 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -chromedriver@^2.21.2: - version "2.45.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.45.0.tgz#8c1b158adbbd3e0ca3f7af19d459082245554378" - dependencies: - del "^3.0.0" - extract-zip "^1.6.7" - mkdirp "^0.5.1" - request "^2.88.0" +chromedriver@^87.0.1: + version "87.0.4" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-87.0.4.tgz#749f69e9427880abff19c1838258c35238397e50" + integrity sha512-kD4N/L8c0nAzh1eEAiAbEIq6Pn5TvGvckODvP5dPqF90q5tPiAJZCoWWSOUV/mrPxiodjHPfmNeOfGERHugzug== + dependencies: + "@testim/chrome-version" "^1.0.7" + axios "^0.21.0" + del "^6.0.0" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + mkdirp "^1.0.4" + proxy-from-env "^1.1.0" tcp-port-used "^1.0.1" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: @@ -2198,6 +2195,11 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2338,12 +2340,6 @@ combine-lists@^1.0.0: dependencies: lodash "^4.5.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - dependencies: - delayed-stream "~1.0.0" - commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -2378,7 +2374,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.2, concat-stream@^1.5.0: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: @@ -2480,7 +2476,7 @@ core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: version "2.6.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2698,12 +2694,6 @@ cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - data-uri-to-buffer@1: version "1.2.0" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" @@ -2746,6 +2736,13 @@ debug@2.6.8: dependencies: ms "2.0.0" +debug@4: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" @@ -2837,20 +2834,19 @@ degenerator@~1.0.2: escodegen "1.x.x" esprima "3.x.x" -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" delegates@^1.0.0: version "1.0.0" @@ -3010,13 +3006,6 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3520,7 +3509,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: +extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -3551,18 +3540,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" fast-deep-equal@^2.0.1: version "2.0.1" @@ -3604,9 +3591,10 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" @@ -3763,6 +3751,11 @@ follow-redirects@^1.0.0: dependencies: debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3773,18 +3766,6 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - formatio@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" @@ -3890,6 +3871,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-uri@2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.2.tgz#5c795e71326f6ca1286f2fc82575cd2bab2af578" @@ -3905,12 +3893,6 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -3970,7 +3952,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: @@ -4028,16 +4010,6 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -4054,6 +4026,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" +graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -4072,17 +4049,6 @@ handlebars@^4.0.1: optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -4304,14 +4270,6 @@ http-proxy@^1.13.0, http-proxy@^1.16.2: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -4324,6 +4282,14 @@ https-proxy-agent@1: debug "2" extend "3" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + iconv-lite@0.4.23, iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -4717,21 +4683,15 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" +is-path-inside@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" @@ -4787,7 +4747,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -4885,10 +4845,6 @@ isparta@4.x.x: source-map "^0.5.0" which "^1.0.9" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - istanbul@0.4.5, istanbul@^0.4.0: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" @@ -4946,10 +4902,6 @@ js-yaml@~3.7.0: argparse "^1.0.7" esprima "^2.6.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -4975,18 +4927,10 @@ json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -5015,15 +4959,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - karma-coverage@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.2.tgz#cc09dceb589a83101aca5fe70c287645ef387689" @@ -5774,7 +5709,7 @@ mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" -mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: +mime-types@~2.1.18: version "2.1.21" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" dependencies: @@ -5894,6 +5829,11 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@ dependencies: minimist "0.0.8" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkpath@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-1.0.0.tgz#ebb3a977e7af1c683ae6fda12b545a6ba6c5853d" @@ -5950,6 +5890,11 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -6202,10 +6147,6 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6399,9 +6340,12 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" @@ -6569,7 +6513,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -6624,10 +6568,6 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - phoenix@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/phoenix/-/phoenix-1.4.0.tgz#9cec8dbd8cbc59ecd2147bc09ca8ceb56b860d75" @@ -6641,10 +6581,6 @@ pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -7147,6 +7083,11 @@ proxy-agent@2.0.0: pac-proxy-agent "1" socks-proxy-agent "2" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -7155,10 +7096,6 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -psl@^1.1.24: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -7192,11 +7129,16 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +punycode.js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.1.0.tgz#f3937f7a914152c2dc17e9c280a2cf86a26b7cda" + integrity sha512-LvGUJ9QHiESLM4yn8JuJWicstRcJKRmP46psQw1HvCZ9puLFwYMKJWvkAkP3OHBVzNzZGx/D53EYJrIaKd9gZQ== + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -7222,7 +7164,7 @@ qrcode@^1.3.0: pngjs "^3.3.0" yargs "^12.0.5" -qs@6.5.2, qs@~6.5.2: +qs@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -7606,31 +7548,6 @@ replace-ext@1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= -request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - 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.0" - 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.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -7713,12 +7630,19 @@ rfdc@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -7764,7 +7688,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -8148,20 +8072,6 @@ sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -sshpk@^1.7.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" - 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" - ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -8647,13 +8557,6 @@ toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -8690,16 +8593,6 @@ tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -8995,14 +8888,6 @@ vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vfile-location@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" @@ -9331,11 +9216,13 @@ yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: - fd-slicer "~1.0.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yeast@0.1.2: version "0.1.2"