diff --git a/src/App.js b/src/App.js index 9fb4d32e5..36df2d84e 100644 --- a/src/App.js +++ b/src/App.js @@ -149,13 +149,16 @@ export default { userBackground() { return this.currentUser.background_image }, + foreignProfileBackground() { + return useMergedConfigStore().mergedConfig.allowForeignUserBackground && useInterfaceStore().foreignProfileBackground + }, instanceBackground() { return useMergedConfigStore().mergedConfig.hideInstanceWallpaper ? null : this.instanceBackgroundUrl }, background() { - return this.userBackground || this.instanceBackground + return this.foreignProfileBackground || this.userBackground || this.instanceBackground }, bgStyle() { if (this.background) { diff --git a/src/App.scss b/src/App.scss index 41fea782b..952af5b47 100644 --- a/src/App.scss +++ b/src/App.scss @@ -50,7 +50,7 @@ body { // have a cursor/pointer to operate them @media (any-pointer: fine) { * { - scrollbar-color: var(--text) transparent; + scrollbar-color: var(--icon) transparent; &::-webkit-scrollbar { background: transparent; @@ -130,7 +130,7 @@ body { } // Body should have background to scrollbar otherwise it will use white (body color?) html { - scrollbar-color: var(--text) var(--wallpaper); + scrollbar-color: var(--icon) var(--wallpaper); background: var(--wallpaper); } } @@ -200,6 +200,7 @@ nav { background-color: var(--wallpaper); background-image: var(--body-background-image); background-position: 50%; + transition: background-image 1s; } .underlay { diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 1d19987ac..36b669622 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -129,6 +129,7 @@ const EmojiPicker = { hideCustomEmojiInPicker: false, // Lazy-load only after the first time `showing` becomes true. contentLoaded: false, + popoverShown: false, groupRefs: {}, emojiRefs: {}, filteredEmojiGroups: [], @@ -176,6 +177,13 @@ const EmojiPicker = { const fullEmojiSize = emojiSizeReal + 2 * 0.2 * fontSizeMultiplier * 14 this.emojiSize = fullEmojiSize }, + togglePicker() { + if (this.popoverShown) { + this.hidePicker() + } else { + this.showPicker() + } + }, showPicker() { this.$refs.popover.showPopover() this.$nextTick(() => { @@ -194,10 +202,10 @@ const EmojiPicker = { } }, onPopoverShown() { - this.$emit('show') + this.popoverShown = true }, onPopoverClosed() { - this.$emit('close') + this.popoverShown = false }, onStickerUploaded(e) { this.$emit('sticker-uploaded', e) diff --git a/src/components/settings_modal/admin_tabs/emoji_tab.js b/src/components/settings_modal/admin_tabs/emoji_tab.js index 6afd0be5c..78f71934b 100644 --- a/src/components/settings_modal/admin_tabs/emoji_tab.js +++ b/src/components/settings_modal/admin_tabs/emoji_tab.js @@ -11,8 +11,8 @@ import ModifiedIndicator from '../helpers/modified_indicator.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' import StringSetting from '../helpers/string_setting.vue' -import { useInstanceStore } from 'src/stores/instance.js' import { useEmojiStore } from 'src/stores/emoji.js' +import { useInstanceStore } from 'src/stores/instance.js' import { useInterfaceStore } from 'src/stores/interface.js' import { library } from '@fortawesome/fontawesome-svg-core' @@ -176,21 +176,24 @@ const EmojiTab = { }, refreshPackList() { - useEmojiStore().getAdminPacks( - this.remotePackInstance, - this.$store.state.api.backendInteractor.listEmojiPacks, - ).then((allPacks) => { - this.knownLocalPacks = allPacks - for (const name of Object.keys(this.knownLocalPacks)) { - this.sortPackFiles(name) - } - }) + useEmojiStore() + .getAdminPacks( + this.remotePackInstance, + this.$store.state.api.backendInteractor.listEmojiPacks, + ) + .then((allPacks) => { + this.knownLocalPacks = allPacks + for (const name of Object.keys(this.knownLocalPacks)) { + this.sortPackFiles(name) + } + }) }, listRemotePacks() { - useEmojiStore().getAdminPacks( - this.remotePackInstance, - this.$store.state.api.backendInteractor.listRemoteEmojiPacks, - ) + useEmojiStore() + .getAdminPacks( + this.remotePackInstance, + this.$store.state.api.backendInteractor.listRemoteEmojiPacks, + ) .then((allPacks) => { let inst = this.remotePackInstance if (!inst.startsWith('http')) { diff --git a/src/components/settings_modal/helpers/vertical_tab_switcher.scss b/src/components/settings_modal/helpers/vertical_tab_switcher.scss index f98d2d78f..67da9305b 100644 --- a/src/components/settings_modal/helpers/vertical_tab_switcher.scss +++ b/src/components/settings_modal/helpers/vertical_tab_switcher.scss @@ -41,6 +41,7 @@ .tab-slot-wrapper { flex: 1 1 auto; height: 100%; + padding: 0 1em; overflow-y: auto; display: grid; grid-template-columns: minmax(1em, 1fr) minmax(min-content, 45em) minmax(1em, 1fr); diff --git a/src/components/settings_modal/settings_modal.scss b/src/components/settings_modal/settings_modal.scss index 313ed71b0..7d6e17244 100644 --- a/src/components/settings_modal/settings_modal.scss +++ b/src/components/settings_modal/settings_modal.scss @@ -38,6 +38,7 @@ p { line-height: 1.5; + margin-left: 2em; } .sidenote { @@ -49,6 +50,7 @@ .setting-description { margin-top: 0.2em; margin-bottom: 0; + margin-left: 0; font-size: 80%; } diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index f0ccf71f3..1343a36d5 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -263,6 +263,11 @@ {{ $t('settings.hide_wallpaper') }} +
  • + + {{ $t('settings.foreign_user_background') }} + +
  • {{ $t('settings.compact_profiles') }} diff --git a/src/components/status/status.vue b/src/components/status/status.vue index a9312c8e6..5cd2de3ab 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -169,7 +169,10 @@ - + { @@ -142,7 +148,7 @@ export default { ) return if (button.name === 'emoji') { - this.$refs.picker.showPicker() + this.$refs.picker.togglePicker() } else { this.animationState = true this.getComponent(button) === 'button' && this.doAction(button) diff --git a/src/components/status_action_buttons/action_button.vue b/src/components/status_action_buttons/action_button.vue index 88a342314..043cd995d 100644 --- a/src/components/status_action_buttons/action_button.vue +++ b/src/components/status_action_buttons/action_button.vue @@ -72,9 +72,8 @@ @@ -101,6 +100,8 @@ :hide-custom-emoji="hideCustomEmoji" class="emoji-picker-panel" @emoji="addReaction" + @show="onShowEmojiPicker" + @close="onHideEmojiPicker" /> diff --git a/src/components/status_action_buttons/action_button_container.js b/src/components/status_action_buttons/action_button_container.js index 0f236b0a9..a5a070dde 100644 --- a/src/components/status_action_buttons/action_button_container.js +++ b/src/components/status_action_buttons/action_button_container.js @@ -20,6 +20,7 @@ export default { UserTimedFilterModal, }, props: ['button', 'status'], + emits: ['emojiPickerShown'], mounted() { if (this.button.name === 'mute') { this.$store.dispatch('fetchDomainMutes') diff --git a/src/components/status_action_buttons/action_button_container.vue b/src/components/status_action_buttons/action_button_container.vue index 9c4e84c00..348b158a7 100644 --- a/src/components/status_action_buttons/action_button_container.vue +++ b/src/components/status_action_buttons/action_button_container.vue @@ -79,6 +79,7 @@ :button="button" :status="status" v-bind="$attrs" + @emojiPickerShown="e => $emit('emojiPickerShown', e)" /> true, - active: () => false, + active: ({ emojiPickerShown }) => emojiPickerShown, toggleable: true, anonLink: true, }, diff --git a/src/components/status_action_buttons/status_action_buttons.js b/src/components/status_action_buttons/status_action_buttons.js index 8bdd87277..05809bbe9 100644 --- a/src/components/status_action_buttons/status_action_buttons.js +++ b/src/components/status_action_buttons/status_action_buttons.js @@ -28,6 +28,7 @@ const StatusActionButtons = { /* no-op */ }, randomSeed: genRandomSeed(), + emojiPickerShown: false, } }, components: { @@ -56,6 +57,7 @@ const StatusActionButtons = { return { status: this.status, replying: this.replying, + emojiPickerShown: this.emojiPickerShown, emit: this.$emit, dispatch: this.$store.dispatch, state: this.$store.state, @@ -107,6 +109,9 @@ const StatusActionButtons = { onExtraClose() { this.showPin = false }, + onEmojiPickerShown(state) { + this.emojiPickerShown = state + }, isPinned(button) { return this.pinnedItems.has(button.name) }, diff --git a/src/components/status_action_buttons/status_action_buttons.vue b/src/components/status_action_buttons/status_action_buttons.vue index 3837e6ae5..7017a8cf0 100644 --- a/src/components/status_action_buttons/status_action_buttons.vue +++ b/src/components/status_action_buttons/status_action_buttons.vue @@ -20,6 +20,7 @@ :get-component="getComponent" :close="() => { /* no-op */ }" :do-action="doAction" + @emojiPickerShown="onEmojiPickerShown" />