logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://anongit.hacktivis.me/git/pleroma-fe.git/
commit: 1cc9ff70e0aa929d7146fa8390fe491190dd131c
parent 3d68dda5a2305035adc3bf3285b2014c36873733
Author: HJ <30-hj@users.noreply.git.pleroma.social>
Date:   Mon, 23 Dec 2024 19:35:14 +0000

Merge branch 'fixes-batch' into 'develop'

Fixes batch

Closes #1321, #1286, and #1241

See merge request pleroma/pleroma-fe!1955

Diffstat:

Achangelog.d/emoji-size.fix1+
Achangelog.d/panel-stack.fix1+
Achangelog.d/quote-buttons.fix1+
Mindex.html1-
Msrc/App.vue2+-
Msrc/components/account_actions/account_actions.vue2++
Msrc/components/basic_user_card/basic_user_card.vue2+-
Msrc/components/bookmark_folder_edit/bookmark_folder_edit.vue2++
Msrc/components/chat_title/chat_title.vue2+-
Msrc/components/component_preview/component_preview.vue9++++++---
Msrc/components/contrast_ratio/contrast_ratio.vue36+++++++++++++++++++++++++++---------
Msrc/components/emoji_picker/emoji_picker.js8++++++--
Msrc/components/extra_notifications/extra_notifications.vue1+
Msrc/components/follow_button/follow_button.vue1+
Msrc/components/font_control/font_control.vue18++++++++----------
Msrc/components/lists_edit/lists_edit.vue2++
Msrc/components/login_form/login_form.vue4+++-
Msrc/components/mention_link/mention_link.js4+++-
Msrc/components/nav_panel/nav_panel.vue2+-
Msrc/components/navigation/navigation.js15+++++++++++----
Msrc/components/notification/notification.scss2+-
Msrc/components/notification/notification.vue1-
Msrc/components/opacity_input/opacity_input.vue2+-
Msrc/components/palette_editor/palette_editor.vue1+
Msrc/components/popover/popover.js6+++++-
Msrc/components/post_status_form/post_status_form.vue71+++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/components/react_button/react_button.vue2+-
Msrc/components/remove_follower_button/remove_follower_button.vue1+
Msrc/components/select/select.vue2+-
Msrc/components/settings_modal/admin_tabs/frontends_tab.vue12++++++++++--
Msrc/components/settings_modal/admin_tabs/limits_tab.js1-
Msrc/components/settings_modal/helpers/attachment_setting.vue4----
Msrc/components/settings_modal/helpers/emoji_editing_popover.vue15++++++++++++---
Msrc/components/settings_modal/helpers/integer_setting.vue2+-
Msrc/components/settings_modal/helpers/number_setting.js15+++++++++++++++
Msrc/components/settings_modal/settings_modal.js1-
Msrc/components/settings_modal/settings_modal.vue5++++-
Msrc/components/settings_modal/settings_modal_admin_content.vue5++++-
Msrc/components/settings_modal/settings_modal_user_content.vue3+++
Msrc/components/settings_modal/tabs/appearance_tab.js12+++++++++---
Msrc/components/settings_modal/tabs/appearance_tab.vue28++++++++++++++++------------
Msrc/components/settings_modal/tabs/filtering_tab.vue2+-
Msrc/components/settings_modal/tabs/general_tab.js2++
Msrc/components/settings_modal/tabs/general_tab.vue2+-
Msrc/components/settings_modal/tabs/security_tab/security_tab.vue2++
Msrc/components/settings_modal/tabs/style_tab/style_tab.vue45++++++++++++++++++++++++++++++++-------------
Msrc/components/settings_modal/tabs/style_tab/virtual_directives_tab.vue19++++++++++---------
Msrc/components/settings_modal/tabs/theme_tab/theme_tab.js2+-
Msrc/components/status/status.scss2+-
Msrc/components/status/status.vue6+++++-
Msrc/components/status_body/status_body.scss2+-
Msrc/components/status_content/status_content.js3+++
Msrc/components/tab_switcher/tab_switcher.jsx7++++++-
Msrc/components/timeline/timeline.vue17++++++++++-------
Msrc/components/update_notification/update_notification.vue3+++
Msrc/components/user_card/user_card.vue2+-
Msrc/components/user_list_popover/user_list_popover.vue2+-
Msrc/components/user_profile/user_profile.vue2+-
Msrc/i18n/en.json3+++
Msrc/modules/config.js2+-
60 files changed, 286 insertions(+), 144 deletions(-)

diff --git a/changelog.d/emoji-size.fix b/changelog.d/emoji-size.fix @@ -0,0 +1 @@ +fix emoji inconsistencies in notifications, fix some emoji not scaling with interface diff --git a/changelog.d/panel-stack.fix b/changelog.d/panel-stack.fix @@ -0,0 +1 @@ +proper sticky header for conversations on user page diff --git a/changelog.d/quote-buttons.fix b/changelog.d/quote-buttons.fix @@ -0,0 +1 @@ +reply-or-quote buttons now take less space diff --git a/index.html b/index.html @@ -3,7 +3,6 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no"> - <link rel="icon" type="image/png" href="/favicon.png"> <!-- putting styles here to avoid having to wait for styles to load up --> <style id="splashscreen"> #splash { diff --git a/src/App.vue b/src/App.vue @@ -70,7 +70,7 @@ <PostStatusModal /> <EditStatusModal v-if="editingAvailable" /> <StatusHistoryModal v-if="editingAvailable" /> - <SettingsModal :class="layoutModalClass"/> + <SettingsModal :class="layoutModalClass" /> <UpdateNotification /> <GlobalNoticeList /> </div> diff --git a/src/components/account_actions/account_actions.vue b/src/components/account_actions/account_actions.vue @@ -86,6 +86,7 @@ <i18n-t keypath="user_card.block_confirm" tag="span" + scope="global" > <template #user> <span @@ -107,6 +108,7 @@ <i18n-t keypath="user_card.remove_follower_confirm" tag="span" + scope="global" > <template #user> <span diff --git a/src/components/basic_user_card/basic_user_card.vue b/src/components/basic_user_card/basic_user_card.vue @@ -48,7 +48,7 @@ flex: 1 0; margin: 0; - --emoji-size: 14px; + --emoji-size: 1em; &-collapsed-content { margin-left: 0.7em; diff --git a/src/components/bookmark_folder_edit/bookmark_folder_edit.vue b/src/components/bookmark_folder_edit/bookmark_folder_edit.vue @@ -17,6 +17,7 @@ <i18n-t v-if="id" keypath="bookmark_folders.editing_folder" + scope="global" > <template #folderName> {{ name }} @@ -25,6 +26,7 @@ <i18n-t v-else keypath="bookmark_folders.creating_folder" + scope="global" /> </h1> </div> diff --git a/src/components/chat_title/chat_title.vue b/src/components/chat_title/chat_title.vue @@ -32,7 +32,7 @@ text-overflow: ellipsis; white-space: nowrap; - --emoji-size: 14px; + --emoji-size: 1em; .username { max-width: 100%; diff --git a/src/components/component_preview/component_preview.vue b/src/components/component_preview/component_preview.vue @@ -32,8 +32,8 @@ > </label> <label - class="y-shift-number" v-show="shadowControl && !hideControls" + class="y-shift-number" > {{ $t('settings.style.shadows.offset-y') }} <input @@ -78,7 +78,10 @@ > {{ $t('settings.style.themes3.editor.test_string') }} </div> - <div v-if="invalid" class="invalid-container"> + <div + v-if="invalid" + class="invalid-container" + > <div class="alert error invalid-label"> {{ $t('settings.style.themes3.editor.invalid') }} </div> @@ -104,8 +107,8 @@ </div> <ColorInput v-if="!noColorControl" - class="input-color-input" v-model="colorOverride" + class="input-color-input" fallback="#606060" :label="$t('settings.style.shadows.color_override')" /> diff --git a/src/components/contrast_ratio/contrast_ratio.vue b/src/components/contrast_ratio/contrast_ratio.vue @@ -11,13 +11,22 @@ class="rating" > <span v-if="contrast.aaa"> - <FAIcon icon="thumbs-up" :size="showRatio ? 'lg' : ''" /> + <FAIcon + icon="thumbs-up" + :size="showRatio ? 'lg' : ''" + /> </span> <span v-if="!contrast.aaa && contrast.aa"> - <FAIcon icon="adjust" :size="showRatio ? 'lg' : ''" /> + <FAIcon + icon="adjust" + :size="showRatio ? 'lg' : ''" + /> </span> <span v-if="!contrast.aaa && !contrast.aa"> - <FAIcon icon="exclamation-triangle" :size="showRatio ? 'lg' : ''" /> + <FAIcon + icon="exclamation-triangle" + :size="showRatio ? 'lg' : ''" + /> </span> </Tooltip> <Tooltip @@ -26,13 +35,22 @@ class="rating" > <span v-if="contrast.laaa"> - <FAIcon icon="thumbs-up" :size="showRatio ? 'large' : ''" /> + <FAIcon + icon="thumbs-up" + :size="showRatio ? 'large' : ''" + /> </span> <span v-if="!contrast.laaa && contrast.laa"> - <FAIcon icon="adjust" :size="showRatio ? 'lg' : ''" /> + <FAIcon + icon="adjust" + :size="showRatio ? 'lg' : ''" + /> </span> <span v-if="!contrast.laaa && !contrast.laa"> - <FAIcon icon="exclamation-triangle" :size="showRatio ? 'lg' : ''" /> + <FAIcon + icon="exclamation-triangle" + :size="showRatio ? 'lg' : ''" + /> </span> </Tooltip> </span> @@ -55,6 +73,9 @@ library.add( ) export default { + components: { + Tooltip + }, props: { large: { required: false, @@ -74,9 +95,6 @@ export default { default: false } }, - components: { - Tooltip - }, computed: { hint () { const levelVal = this.contrast.aaa ? 'aaa' : (this.contrast.aa ? 'aa' : 'bad') diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js @@ -97,7 +97,7 @@ const EmojiPicker = { enableStickerPicker: { required: false, type: Boolean, - default: false + default: true }, hideCustomEmoji: { required: false, @@ -105,7 +105,11 @@ const EmojiPicker = { default: false } }, - inject: ['popoversZLayer'], + inject: { + popoversZLayer: { + default: '' + } + }, data () { return { keyword: '', diff --git a/src/components/extra_notifications/extra_notifications.vue b/src/components/extra_notifications/extra_notifications.vue @@ -56,6 +56,7 @@ tag="span" class="notification tip extra-notification" keypath="notifications.configuration_tip" + scope="global" > <template #theSettings> <button diff --git a/src/components/follow_button/follow_button.vue b/src/components/follow_button/follow_button.vue @@ -17,6 +17,7 @@ @cancelled="hideConfirmUnfollow" > <i18n-t + scope="global" keypath="user_card.unfollow_confirm" tag="span" > diff --git a/src/components/font_control/font_control.vue b/src/components/font_control/font_control.vue @@ -1,11 +1,8 @@ <template> - <div - class="font-control" - :class="{ custom: isCustom }" - > + <div class="font-control"> <label :id="name + '-label'" - :for="preset === 'custom' ? name : name + '-font-switcher'" + :for="manualEntry ? name : name + '-font-switcher'" class="label" > {{ label }} @@ -14,7 +11,7 @@ <Checkbox v-if="typeof fallback !== 'undefined'" :id="name + '-o'" - :modelValue="present" + :model-value="present" @change="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)" > {{ $t('settings.style.themes3.define') }} @@ -23,12 +20,13 @@ <label v-if="manualEntry" :id="name + '-label'" - :for="preset === 'custom' ? name : name + '-font-switcher'" + :for="manualEntry ? name : name + '-font-switcher'" class="label" > <i18n-t keypath="settings.style.themes3.font.entry" tag="span" + scope="global" > <template #fontFamily> <code>font-family</code> @@ -38,7 +36,7 @@ <label v-else :id="name + '-label'" - :for="preset === 'custom' ? name : name + '-font-switcher'" + :for="manualEntry ? name : name + '-font-switcher'" class="label" > {{ $t('settings.style.themes3.font.select') }} @@ -50,8 +48,8 @@ > <button class="btn button-default" - @click="toggleManualEntry" :title="$t('settings.style.themes3.font.lookup_local_fonts')" + @click="toggleManualEntry" > <FAIcon fixed-width @@ -72,8 +70,8 @@ > <button class="btn button-default" - @click="toggleManualEntry" :title="$t('settings.style.themes3.font.enter_manually')" + @click="toggleManualEntry" > <FAIcon fixed-width diff --git a/src/components/lists_edit/lists_edit.vue b/src/components/lists_edit/lists_edit.vue @@ -17,6 +17,7 @@ <i18n-t v-if="id" keypath="lists.editing_list" + scope="global" > <template #listTitle> {{ title }} @@ -25,6 +26,7 @@ <i18n-t v-else keypath="lists.creating_list" + scope="global" /> </div> </div> diff --git a/src/components/login_form/login_form.vue b/src/components/login_form/login_form.vue @@ -3,7 +3,9 @@ <!-- Default panel contents --> <div class="panel-heading"> - <h1 class="title">{{ $t('login.login') }}</h1> + <h1 class="title"> + {{ $t('login.login') }} + </h1> </div> <div class="panel-body"> diff --git a/src/components/mention_link/mention_link.js b/src/components/mention_link/mention_link.js @@ -53,7 +53,9 @@ const MentionLink = { this.$router.push(link) }, handleSelection () { - this.hasSelection = document.getSelection().containsNode(this.$refs.full, true) + if (this.$refs.full) { + this.hasSelection = document.getSelection().containsNode(this.$refs.full, true) + } } }, mounted () { diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue @@ -125,7 +125,7 @@ <NavigationEntry v-if="!forceEditMode && currentUser" :show-pin="false" - :item="{ label: editMode ? $t('nav.edit_finish') : $t('nav.edit_pinned'), icon: editMode ? 'check' : 'wrench' }" + :item="{ labelRaw: editMode ? $t('nav.edit_finish') : $t('nav.edit_pinned'), icon: editMode ? 'check' : 'wrench' }" @click="toggleEditMode" /> </ul> diff --git a/src/components/navigation/navigation.js b/src/components/navigation/navigation.js @@ -1,11 +1,16 @@ +// routes that take :username property export const USERNAME_ROUTES = new Set([ - 'bookmarks', 'dms', 'interactions', 'notifications', 'chat', - 'chats', - 'user-profile' + 'chats' +]) + +// routes that take :name property +export const NAME_ROUTES = new Set([ + 'user-profile', + 'legacy-user-profile' ]) export const TIMELINES = { @@ -94,7 +99,9 @@ export function routeTo (item, currentUser) { } if (USERNAME_ROUTES.has(route.name)) { - route.params = { username: currentUser.screen_name, name: currentUser.screen_name } + route.params = { username: currentUser.screen_name } + } else if (NAME_ROUTES.has(route.name)) { + route.params = { name: currentUser.screen_name } } return route diff --git a/src/components/notification/notification.scss b/src/components/notification/notification.scss @@ -10,7 +10,7 @@ background-color: transparent !important; } - --emoji-size: 14px; + --emoji-size: 1em; &:hover { --_still-image-img-visibility: visible; diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue @@ -47,7 +47,6 @@ > <UserAvatar class="post-avatar" - :bot="botIndicator" :compact="true" :better-shadow="betterShadow" :user="notification.from_profile" diff --git a/src/components/opacity_input/opacity_input.vue b/src/components/opacity_input/opacity_input.vue @@ -8,7 +8,7 @@ class="label" :class="{ faint: !present || disabled }" > - {{ label }} + {{ label }} </label> <Checkbox v-if="typeof fallback !== 'undefined'" diff --git a/src/components/palette_editor/palette_editor.vue b/src/components/palette_editor/palette_editor.vue @@ -6,6 +6,7 @@ <ColorInput v-for="key in paletteKeys" :key="key" + :name="key" :model-value="props.modelValue[key]" :fallback="fallback(key)" :label="$t('settings.style.themes3.palette.' + key)" diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js @@ -53,7 +53,11 @@ const Popover = { default: {} } }, - inject: ['popoversZLayer'], // override popover z layer + inject: { // override popover z layer + popoversZLayer: { + default: '' + } + }, data () { return { // lockReEntry is a flag that is set when mouse cursor is leaving the popover's content diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue @@ -103,6 +103,36 @@ icon="circle-notch" /> </div> + <div + v-if="quotable" + role="radiogroup" + class="btn-group reply-or-quote-selector" + > + <button + :id="`reply-or-quote-option-${randomSeed}-reply`" + class="btn button-default reply-or-quote-option" + :class="{ toggled: !newStatus.quoting }" + tabindex="0" + role="radio" + :aria-labelledby="`reply-or-quote-option-${randomSeed}-reply`" + :aria-checked="!newStatus.quoting" + @click="newStatus.quoting = false" + > + {{ $t('post_status.reply_option') }} + </button> + <button + :id="`reply-or-quote-option-${randomSeed}-quote`" + class="btn button-default reply-or-quote-option" + :class="{ toggled: newStatus.quoting }" + tabindex="0" + role="radio" + :aria-labelledby="`reply-or-quote-option-${randomSeed}-quote`" + :aria-checked="newStatus.quoting" + @click="newStatus.quoting = true" + > + {{ $t('post_status.quote_option') }} + </button> + </div> </div> <div v-if="showPreview" @@ -126,36 +156,6 @@ class="preview-status" /> </div> - <div - v-if="quotable" - role="radiogroup" - class="btn-group reply-or-quote-selector" - > - <button - :id="`reply-or-quote-option-${randomSeed}-reply`" - class="btn button-default reply-or-quote-option" - :class="{ toggled: !newStatus.quoting }" - tabindex="0" - role="radio" - :aria-labelledby="`reply-or-quote-option-${randomSeed}-reply`" - :aria-checked="!newStatus.quoting" - @click="newStatus.quoting = false" - > - {{ $t('post_status.reply_option') }} - </button> - <button - :id="`reply-or-quote-option-${randomSeed}-quote`" - class="btn button-default reply-or-quote-option" - :class="{ toggled: newStatus.quoting }" - tabindex="0" - role="radio" - :aria-labelledby="`reply-or-quote-option-${randomSeed}-quote`" - :aria-checked="newStatus.quoting" - @click="newStatus.quoting = true" - > - {{ $t('post_status.quote_option') }} - </button> - </div> <EmojiInput v-if="!disableSubject && (newStatus.spoilerText || alwaysShowSubject)" v-model="newStatus.spoilerText" @@ -181,10 +181,10 @@ :suggest="emojiUserSuggestor" :placement="emojiPickerPlacement" class="input form-control main-input" + enable-sticker-picker enable-emoji-picker hide-emoji-button :newline-on-ctrl-enter="submitOnEnter" - enable-sticker-picker @input="onEmojiInputInput" @sticker-uploaded="addMediaFile" @sticker-upload-failed="uploadFailed" @@ -235,7 +235,6 @@ class="text-format" > <Select - id="post-content-type" v-model="newStatus.contentType" class="input form-control" :attrs="{ 'aria-label': $t('post_status.content_type_selection') }" @@ -409,13 +408,14 @@ .preview-heading { display: flex; - padding-left: 0.5em; + flex-wrap: wrap; } .preview-toggle { - flex: 1; + flex: 10 0 auto; cursor: pointer; user-select: none; + padding-left: 0.5em; &:hover { text-decoration: underline; @@ -446,7 +446,10 @@ } .reply-or-quote-selector { + flex: 1 0 auto; margin-bottom: 0.5em; + display: grid; + grid-template-columns: 1fr 1fr; } .text-format { diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue @@ -2,7 +2,7 @@ <span class="ReactButton"> <EmojiPicker ref="picker" - :enable-sticker-picker="enableStickerPicker" + :enable-sticker-picker="false" :hide-custom-emoji="hideCustomEmoji" class="emoji-picker-panel" @emoji="addReaction" diff --git a/src/components/remove_follower_button/remove_follower_button.vue b/src/components/remove_follower_button/remove_follower_button.vue @@ -17,6 +17,7 @@ @cancelled="hideConfirmRemoveUserFromFollowers" > <i18n-t + scope="global" keypath="user_card.remove_follower_confirm" tag="span" > diff --git a/src/components/select/select.vue b/src/components/select/select.vue @@ -84,7 +84,7 @@ label.Select { width: 0.875em; font-family: var(--font); line-height: 2; - z-index: 0; + z-index: 1; pointer-events: none; } } diff --git a/src/components/settings_modal/admin_tabs/frontends_tab.vue b/src/components/settings_modal/admin_tabs/frontends_tab.vue @@ -49,11 +49,13 @@ <span v-if="adminDraft && adminDraft[':pleroma'][':frontends'][':primary']?.name === frontend.name"> <i18n-t v-if="adminDraft && adminDraft[':pleroma'][':frontends'][':primary']?.ref === frontend.refs[0]" + scope="global" keypath="admin_dash.frontend.is_default" /> <i18n-t v-else keypath="admin_dash.frontend.is_default_custom" + scope="global" > <template #version> <code>{{ adminDraft && adminDraft[':pleroma'][':frontends'][':primary'].ref }}</code> @@ -120,7 +122,10 @@ @click.prevent="update(frontend, ref)" @click="close" > - <i18n-t keypath="admin_dash.frontend.install_version"> + <i18n-t + keypath="admin_dash.frontend.install_version" + scope="global" + > <template #version> <code>{{ ref }}</code> </template> @@ -177,7 +182,10 @@ @click.prevent="setDefault(frontend, ref)" @click="close" > - <i18n-t keypath="admin_dash.frontend.set_default_version"> + <i18n-t + keypath="admin_dash.frontend.set_default_version" + scope="global" + > <template #version> <code>{{ ref }}</code> </template> diff --git a/src/components/settings_modal/admin_tabs/limits_tab.js b/src/components/settings_modal/admin_tabs/limits_tab.js @@ -14,7 +14,6 @@ library.add( ) const LimitsTab = { - data () {}, components: { BooleanSetting, ChoiceSetting, diff --git a/src/components/settings_modal/helpers/attachment_setting.vue b/src/components/settings_modal/helpers/attachment_setting.vue @@ -48,18 +48,14 @@ :attachment="attachment" size="small" hide-description - @setMedia="onMedia" - @naturalSizeLoad="onNaturalSizeLoad" /> <div class="controls control-upload"> <MediaUpload ref="mediaUpload" class="media-upload-icon" - :drop-files="dropFiles" normal-button :accept-types="acceptTypes" @uploaded="setMediaFile" - @upload-failed="uploadFailed" /> </div> </div> diff --git a/src/components/settings_modal/helpers/emoji_editing_popover.vue b/src/components/settings_modal/helpers/emoji_editing_popover.vue @@ -112,7 +112,10 @@ export default { components: { Popover, ConfirmModal, StillImage }, inject: ['emojiAddr'], props: { - placement: String, + placement: { + type: String, + required: true + }, disabled: { type: Boolean, default: false @@ -120,8 +123,14 @@ export default { newUpload: Boolean, - title: String, - packName: String, + title: { + type: String, + required: true + }, + packName: { + type: String, + required: true + }, shortcode: { type: String, // Only exists when this is not a new upload diff --git a/src/components/settings_modal/helpers/integer_setting.vue b/src/components/settings_modal/helpers/integer_setting.vue @@ -1,7 +1,7 @@ <template> <NumberSetting v-bind="$attrs" - truncate="1" + :truncate="1" > <slot /> </NumberSetting> diff --git a/src/components/settings_modal/helpers/number_setting.js b/src/components/settings_modal/helpers/number_setting.js @@ -4,6 +4,21 @@ export default { ...Setting, props: { ...Setting.props, + min: { + type: Number, + required: false, + default: 1 + }, + max: { + type: Number, + required: false, + default: 1 + }, + step: { + type: Number, + required: false, + default: 1 + }, truncate: { type: Number, required: false, diff --git a/src/components/settings_modal/settings_modal.js b/src/components/settings_modal/settings_modal.js @@ -167,7 +167,6 @@ const SettingsModal = { }, computed: { currentSaveStateNotice () { - console.log(this.$store.state.interface.settings.currentSaveStateNotice) return this.$store.state.interface.settings.currentSaveStateNotice }, modalActivated () { diff --git a/src/components/settings_modal/settings_modal.vue b/src/components/settings_modal/settings_modal.vue @@ -110,7 +110,10 @@ {{ $t("settings.expert_mode") }} </Checkbox> <span v-if="modalMode === 'admin'"> - <i18n-t keypath="admin_dash.wip_notice"> + <i18n-t + scope="global" + keypath="admin_dash.wip_notice" + > <template #adminFeLink> <a href="/pleroma/admin/#/login-pleroma" diff --git a/src/components/settings_modal/settings_modal_admin_content.vue b/src/components/settings_modal/settings_modal_admin_content.vue @@ -17,7 +17,10 @@ <div :label="$t('admin_dash.tabs.nodb')"> <div class="setting-item"> <h2>{{ $t('admin_dash.nodb.heading') }}</h2> - <i18n-t keypath="admin_dash.nodb.text"> + <i18n-t + scope="global" + keypath="admin_dash.nodb.text" + > <template #documentation> <a href="https://docs-develop.pleroma.social/backend/configuration/howto_database_config/" diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue @@ -17,6 +17,7 @@ :label="$t('settings.appearance')" icon="window-restore" data-tab-name="appearance" + :delay-render="true" > <AppearanceTab /> </div> @@ -25,6 +26,7 @@ :label="$t('settings.style.themes3.editor.title')" icon="palette" data-tab-name="style" + :delay-render="true" > <StyleTab /> </div> @@ -33,6 +35,7 @@ :label="$t('settings.theme_old')" icon="paint-brush" data-tab-name="theme" + :delay-render="true" > <ThemeTab /> </div> diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js @@ -119,7 +119,15 @@ const AppearanceTab = { updateIndex('theme').then(themes => { themes.forEach(([key, themePromise]) => themePromise.then(data => { - this.availableThemesV2.push({ key, data, name: data.name, version: 'v2' }) + if (!data) { + console.warn(`Theme with key ${key} is empty or malformed`) + } else if (Array.isArray(data)) { + console.warn(`Theme with key ${key} is a v1 theme and should be moved to static/palettes/index.json`) + } else if (!data.source && !data.theme) { + console.warn(`Theme with key ${key} is malformed`) + } else { + this.availableThemesV2.push({ key, data, name: data.name, version: 'v2' }) + } })) }) @@ -251,12 +259,10 @@ const AppearanceTab = { return ['sidebar', 'content', ...notif] } }, - instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel }, instanceWallpaperUsed () { return this.$store.state.instance.background && !this.$store.state.users.currentUser.background_image }, - instanceShoutboxPresent () { return this.$store.state.instance.shoutAvailable }, language: { get: function () { return this.$store.getters.mergedConfig.interfaceLanguage }, set: function (val) { diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue @@ -16,10 +16,12 @@ @click="resetTheming" > <!-- eslint-disable vue/no-v-text-v-html-on-component --> + <!-- eslint-disable vue/no-v-html --> <component :is="'style'" v-html="previewTheme('stock', 'v3')" /> + <!-- eslint-enable vue/no-v-html --> <!-- eslint-enable vue/no-v-text-v-html-on-component --> <preview id="theme-preview-stock" /> <h4 class="theme-name"> @@ -58,12 +60,14 @@ @click="style.version === 'v2' ? setTheme(style.key) : setStyle(style.key)" > <!-- eslint-disable vue/no-v-text-v-html-on-component --> + <!-- eslint-disable vue/no-v-html --> <div v-if="style.ready || noIntersectionObserver"> <component :is="'style'" v-html="previewTheme(style.key, style.version, style.data)" /> </div> + <!-- eslint-enable vue/no-v-html --> <!-- eslint-enable vue/no-v-text-v-html-on-component --> <preview :id="'theme-preview-' + style.key" /> <h4 class="theme-name"> @@ -73,13 +77,13 @@ </button> </ul> <div class="import-file-container"> - <button - class="btn button-default" - @click="importFile" - > - <FAIcon icon="folder-open" /> - {{ $t('settings.style.themes3.editor.load_style') }} - </button> + <button + class="btn button-default" + @click="importFile" + > + <FAIcon icon="folder-open" /> + {{ $t('settings.style.themes3.editor.load_style') }} + </button> </div> <div class="setting-item"> <h2>{{ $t('settings.style.themes3.palette.label') }}</h2> @@ -136,8 +140,8 @@ </h4> <PaletteEditor v-if="expertLevel > 0" - class="userPalette" v-model="userPalette" + class="userPalette" :compact="true" :apply="true" @applyPalette="data => setPaletteCustom(data)" @@ -160,7 +164,7 @@ <li> <UnitSetting path="textSize" - step="0.1" + :step="0.1" :units="['px', 'rem']" :reset-default="{ 'px': 14, 'rem': 1 }" timed-apply-mode @@ -236,7 +240,7 @@ <li> <UnitSetting path="emojiSize" - step="0.1" + :step="0.1" :units="['px', 'rem']" :reset-default="{ 'px': 32, 'rem': 2.2 }" > @@ -259,7 +263,7 @@ <li> <UnitSetting path="navbarSize" - step="0.1" + :step="0.1" :units="['px', 'rem']" :reset-default="{ 'px': 55, 'rem': 3.5 }" > @@ -270,7 +274,7 @@ <li> <UnitSetting path="panelHeaderSize" - step="0.1" + :step="0.1" :units="['px', 'rem']" :reset-default="{ 'px': 52, 'rem': 3.2 }" timed-apply-mode diff --git a/src/components/settings_modal/tabs/filtering_tab.vue b/src/components/settings_modal/tabs/filtering_tab.vue @@ -106,7 +106,7 @@ key="hideScrobblesAfter" path="hideScrobblesAfter" :units="['m', 'h', 'd']" - unitSet="time" + unit-set="time" expert="1" > {{ $t('settings.hide_scrobbles_after') }} diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js @@ -81,6 +81,8 @@ const GeneralTab = { this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) } }, + instanceShoutboxPresent () { return this.$store.state.instance.shoutAvailable }, + instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel }, ...SharedComputedObject() }, methods: { diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue @@ -226,8 +226,8 @@ </BooleanSetting> </li> <ul - class="setting-list suboptions" v-if="mergedConfig.useAbsoluteTimeFormat" + class="setting-list suboptions" > <li> <UnitSetting diff --git a/src/components/settings_modal/tabs/security_tab/security_tab.vue b/src/components/settings_modal/tabs/security_tab/security_tab.vue @@ -149,6 +149,7 @@ </div> <div> <i18n-t + scope="global" keypath="settings.new_alias_target" tag="p" > @@ -184,6 +185,7 @@ <i18n-t keypath="settings.move_account_target" tag="p" + scope="global" > <template #example> <code> diff --git a/src/components/settings_modal/tabs/style_tab/style_tab.vue b/src/components/settings_modal/tabs/style_tab/style_tab.vue @@ -7,10 +7,12 @@ <h2> {{ $t('settings.style.themes3.editor.title') }} </h2> <div class="meta-preview"> <!-- eslint-disable vue/no-v-text-v-html-on-component --> + <!-- eslint-disable vue/no-v-html --> <component :is="'style'" v-html="overallPreviewCssRules" /> + <!-- eslint-enable vue/no-v-html --> <!-- eslint-enable vue/no-v-text-v-html-on-component --> <Preview id="edited-style-preview" /> <teleport @@ -52,22 +54,34 @@ </teleport> <ul class="setting-list style-metadata"> <li> - <StringSetting class="meta-field" v-model="name"> + <StringSetting + v-model="name" + class="meta-field" + > {{ $t('settings.style.themes3.editor.style_name') }} </StringSetting> </li> <li> - <StringSetting class="meta-field" v-model="author"> + <StringSetting + v-model="author" + class="meta-field" + > {{ $t('settings.style.themes3.editor.style_author') }} </StringSetting> </li> <li> - <StringSetting class="meta-field" v-model="license"> + <StringSetting + v-model="license" + class="meta-field" + > {{ $t('settings.style.themes3.editor.style_license') }} </StringSetting> </li> <li> - <StringSetting class="meta-field" v-model="website"> + <StringSetting + v-model="website" + class="meta-field" + > {{ $t('settings.style.themes3.editor.style_website') }} </StringSetting> </li> @@ -172,6 +186,7 @@ > <ColorInput v-model="editedBackgroundColor" + name="component-background-color" :fallback="computeColor(editedBackgroundColor) ?? previewColors.background" :disabled="!isBackgroundColorPresent" :label="$t('settings.style.themes3.editor.background')" @@ -183,6 +198,7 @@ <ColorInput v-if="componentHas('Text')" v-model="editedTextColor" + name="component-text-color" :fallback="computeColor(editedTextColor) ?? previewColors.text" :label="$t('settings.style.themes3.editor.text_color')" :disabled="!isTextColorPresent" @@ -228,22 +244,22 @@ <Checkbox v-model="isTextAutoPresent" /> </Tooltip> <div - class="style-control suboption" v-if="componentHas('Text')" + class="style-control suboption" > <label class="label"> - {{$t('settings.style.themes3.editor.contrast') }} + {{ $t('settings.style.themes3.editor.contrast') }} </label> <ContrastRatio :show-ratio="true" :contrast="contrast" /> </div> - <div v-if="componentHas('Text')"> - </div> + <div v-if="componentHas('Text')" /> <ColorInput v-if="componentHas('Link')" v-model="editedLinkColor" + name="component-link-color" :fallback="computeColor(editedLinkColor) ?? previewColors.link" :label="$t('settings.style.themes3.editor.link_color')" :disabled="!isLinkColorPresent" @@ -258,6 +274,7 @@ <ColorInput v-if="componentHas('Icon')" v-model="editedIconColor" + name="component-icon-color" :fallback="computeColor(editedIconColor) ?? previewColors.icon" :label="$t('settings.style.themes3.editor.icon_color')" :disabled="!isIconColorPresent" @@ -272,6 +289,7 @@ <ColorInput v-if="componentHas('Border')" v-model="editedBorderColor" + name="component-border-color" :fallback="computeColor(editedBorderColor) ?? previewColors.border" :label="$t('settings.style.themes3.editor.border_color')" :disabled="!isBorderColorPresent" @@ -285,6 +303,7 @@ </Tooltip> <OpacityInput v-model="editedOpacity" + name="component-opacity" :disabled="!isOpacityPresent" :label="$t('settings.style.themes3.editor.opacity')" /> @@ -293,6 +312,7 @@ </Tooltip> <RoundnessInput v-model="editedRoundness" + name="component-roundness" :disabled="!isRoundnessPresent" :label="$t('settings.style.themes3.editor.roundness')" /> @@ -350,22 +370,22 @@ </Select> <SelectMotion class="list-select-movement" - :modelValue="palettes" - @update:modelValue="onPalettesUpdate" + :model-value="palettes" :selected-id="selectedPaletteId" :get-add-value="getNewPalette" + @update:modelValue="onPalettesUpdate" @update:selectedId="e => selectedPaletteId = e" /> <div class="list-edit-area"> <StringSetting - class="palette-name-input" v-model="selectedPalette.name" + class="palette-name-input" > {{ $t('settings.style.themes3.palette.name_label') }} </StringSetting> <PaletteEditor - class="palette-editor-single" v-model="selectedPalette" + class="palette-editor-single" /> </div> </div> @@ -374,7 +394,6 @@ :label="$t('settings.style.themes3.editor.variables_tab')" :model-value="virtualDirectives" @update:modelValue="updateVirtualDirectives" - :normalize-shadows="normalizeShadows" /> </tab-switcher> </div> diff --git a/src/components/settings_modal/tabs/style_tab/virtual_directives_tab.vue b/src/components/settings_modal/tabs/style_tab/virtual_directives_tab.vue @@ -14,22 +14,22 @@ v-model="selectedVirtualDirectiveId" class="list-select" size="20" - > + > <option v-for="(p, index) in modelValue" :key="p.name" :value="index" - > + > {{ p.name }} </option> </Select> <SelectMotion class="list-select-movement" :model-value="modelValue" - @update:modelValue="e => emit('update:modelValue', e)" :selected-id="selectedVirtualDirectiveId" - @update:selectedId="e => selectedVirtualDirectiveId = e" :get-add-value="getNewVirtualDirective" + @update:modelValue="e => emit('update:modelValue', e)" + @update:selectedId="e => selectedVirtualDirectiveId = e" /> <div class="list-edit-area"> <div class="variable-selector"> @@ -41,26 +41,26 @@ {{ ' ' }} </label> <input - class="input" v-model="selectedVirtualDirective.name" + class="input" > <label class="variable-type-label" for="variables-selector" - > + > {{ $t('settings.style.themes3.editor.variables.type_label') }} {{ ' ' }} </label> <Select v-model="selectedVirtualDirectiveValType" > - <option value='shadow'> + <option value="shadow"> {{ $t('settings.style.themes3.editor.variables.type_shadow') }} </option> - <option value='color'> + <option value="color"> {{ $t('settings.style.themes3.editor.variables.type_color') }} </option> - <option value='generic'> + <option value="generic"> {{ $t('settings.style.themes3.editor.variables.type_generic') }} </option> </Select> @@ -72,6 +72,7 @@ :compact="true" /> <ColorInput + name="virtual-directive-color" v-if="selectedVirtualDirectiveValType === 'color'" v-model="draftVirtualDirective" :fallback="computeColor(draftVirtualDirective)" diff --git a/src/components/settings_modal/tabs/theme_tab/theme_tab.js b/src/components/settings_modal/tabs/theme_tab/theme_tab.js @@ -133,7 +133,7 @@ export default { Object .values(themesIndex) .forEach(themeFunc => { - themeFunc().then(themeData => this.availableStyles.push(themeData)) + themeFunc().then(themeData => themeData && this.availableStyles.push(themeData)) }) }) }, diff --git a/src/components/status/status.scss b/src/components/status/status.scss @@ -72,7 +72,7 @@ text-overflow: ellipsis; --_still_image-label-scale: 0.25; - --emoji-size: 14px; + --emoji-size: 1em; } .status-favicon { diff --git a/src/components/status/status.vue b/src/components/status/status.vue @@ -386,6 +386,7 @@ class="heading-edited-row" > <i18n-t + scope="global" keypath="status.edited_at" tag="span" > @@ -443,7 +444,10 @@ v-else-if="hasInvisibleQuote" class="quoted-status -unavailable-prompt" > - <i18n-t keypath="status.invisible_quote"> + <i18n-t + scope="global" + keypath="status.invisible_quote" + > <template #link> <bdi> <a diff --git a/src/components/status_body/status_body.scss b/src/components/status_body/status_body.scss @@ -113,7 +113,7 @@ align-items: top; flex-direction: row; - --emoji-size: 16px; + --emoji-size: calc(var(--emojiSize, 32px) / 2); & .body, & .attachments { diff --git a/src/components/status_content/status_content.js b/src/components/status_content/status_content.js @@ -90,6 +90,9 @@ const StatusContent = { } return true }, + localCollapseSubjectDefault () { + return this.mergedConfig.collapseMessageWithSubject + }, attachmentSize () { if (this.compact) { return 'small' diff --git a/src/components/tab_switcher/tab_switcher.jsx b/src/components/tab_switcher/tab_switcher.jsx @@ -145,7 +145,12 @@ export default { if (props.fullHeight) { classes.push('full-height') } - const renderSlot = (!this.renderOnlyFocused || active) + let delayRender = slot.props['delay-render'] + if (delayRender && active) { + slot.props['delay-render'] = false + delayRender = false + } + const renderSlot = (!delayRender && (!this.renderOnlyFocused || active)) ? slot : '' diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue @@ -1,12 +1,15 @@ <template> <div :class="['Timeline', classes.root]"> - <div :class="classes.header"> + <div + v-if="!embedded" + :class="classes.header" + > <TimelineMenu v-if="!embedded" :timeline-name="timelineName" /> <div - v-if="showScrollTop && !embedded" + v-if="showScrollTop" class="rightside-button" > <button @@ -24,7 +27,7 @@ </FALayers> </button> </div> - <template v-if="mobileLayout && !embedded"> + <template v-if="mobileLayout"> <div v-if="showLoadButton" class="rightside-button" @@ -44,7 +47,7 @@ </button> </div> <div - v-else-if="!embedded" + v-else class="loadmore-text faint veryfaint rightside-icon" :title="$t('timeline.up_to_date')" :aria-disabled="true" @@ -65,7 +68,7 @@ {{ loadButtonString }} </button> <div - v-else-if="!embedded" + v-else class="loadmore-text faint" @click.prevent > @@ -73,11 +76,9 @@ </div> </template> <QuickFilterSettings - v-if="!embedded" class="rightside-button" /> <QuickViewSettings - v-if="!embedded" class="rightside-button" /> </div> @@ -148,6 +149,8 @@ /> </div> </teleport> + <!-- spacer to avoid having empty shrug --> + <span v-if="embedded && footerSlipgate" /> </div> </div> </template> diff --git a/src/components/update_notification/update_notification.vue b/src/components/update_notification/update_notification.vue @@ -34,6 +34,7 @@ class="extra-info-group" > <i18n-t + scope="global" keypath="update.update_bugs" tag="p" > @@ -45,6 +46,7 @@ </template> </i18n-t> <i18n-t + scope="global" keypath="update.update_changelog" tag="p" > @@ -57,6 +59,7 @@ </i18n-t> <p class="art-credit"> <i18n-t + scope="global" keypath="update.art_by" tag="small" > diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue @@ -8,7 +8,7 @@ :style="style" class="background-image" /> - <div :class="onClose ? '' : panel-heading -flexible-height"> + <div :class="onClose ? '' : 'panel-heading -flexible-height'"> <div class="user-info"> <div class="container"> <a diff --git a/src/components/user_list_popover/user_list_popover.vue b/src/components/user_list_popover/user_list_popover.vue @@ -51,7 +51,7 @@ .user-list-popover { padding: 0.5em; - --emoji-size: 16px; + --emoji-size: calc(var(--emojiSize, 32px) / 2); .user-list-row { padding: 0.25em; diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue @@ -166,7 +166,7 @@ flex-basis: 500px; // No sticky header on user profile - --currentPanelStack: 1; + --currentPanelStack: 0; .user-birthday { margin: 0 0.75em 0.5em; diff --git a/src/i18n/en.json b/src/i18n/en.json @@ -1449,6 +1449,9 @@ "error_sending_message": "Something went wrong when sending the message.", "empty_chat_list_placeholder": "You don't have any chats yet. Start a new chat!" }, + "bookmarks": { + "manage_bookmark_folders": "Manage bookmark folders" + }, "lists": { "lists": "Lists", "new": "New List", diff --git a/src/modules/config.js b/src/modules/config.js @@ -307,7 +307,7 @@ const config = { applyConfig(state) } if (name.startsWith('theme3hacks')) { - dispatch('setTheme', { recompile: true }) + dispatch('applyTheme', { recompile: true }) } switch (name) { case 'theme':