diff --git a/changelog.d/better-scroll-button.add b/changelog.d/better-scroll-button.add
new file mode 100644
index 000000000..b206869d1
--- /dev/null
+++ b/changelog.d/better-scroll-button.add
@@ -0,0 +1 @@
+Add support for detachable scrollTop button
diff --git a/src/App.js b/src/App.js
index 1c1b3a8c2..6bb9ba04b 100644
--- a/src/App.js
+++ b/src/App.js
@@ -20,6 +20,8 @@ import { defineAsyncComponent } from 'vue'
import { useShoutStore } from './stores/shout'
import { useInterfaceStore } from './stores/interface'
+import { throttle } from 'lodash'
+
export default {
name: 'app',
components: {
@@ -58,16 +60,23 @@ export default {
// Load the locale from the storage
const val = this.$store.getters.mergedConfig.interfaceLanguage
this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val })
- window.addEventListener('resize', this.updateMobileState)
document.getElementById('modal').classList = ['-' + this.layoutType]
+
+ // Create bound handlers
+ this.updateScrollState = throttle(this.scrollHandler, 200)
+ this.updateMobileState = throttle(this.resizeHandler, 200)
},
mounted () {
+ window.addEventListener('resize', this.updateMobileState)
+ this.scrollParent.addEventListener('scroll', this.updateScrollState)
+
if (useInterfaceStore().themeApplied) {
this.removeSplash()
}
},
unmounted () {
window.removeEventListener('resize', this.updateMobileState)
+ this.scrollParent.removeEventListener('scroll', this.updateScrollState)
},
computed: {
themeApplied () {
@@ -146,13 +155,23 @@ export default {
},
noSticky () { return this.$store.getters.mergedConfig.disableStickyHeaders },
showScrollbars () { return this.$store.getters.mergedConfig.showScrollbars },
+ scrollParent () { return window; /* this.$refs.appContentRef */ },
...mapGetters(['mergedConfig'])
},
methods: {
- updateMobileState () {
+ resizeHandler () {
useInterfaceStore().setLayoutWidth(windowWidth())
useInterfaceStore().setLayoutHeight(windowHeight())
},
+ scrollHandler () {
+ const scrollPosition = this.scrollParent === window ? window.scrollY : this.scrollParent.scrollTop
+
+ if (scrollPosition != 0) {
+ this.$refs.appContentRef.classList.add(['-scrolled'])
+ } else {
+ this.$refs.appContentRef.classList.remove(['-scrolled'])
+ }
+ },
removeSplash () {
document.querySelector('#status').textContent = this.$t('splash.fun_' + Math.ceil(Math.random() * 4))
const splashscreenRoot = document.querySelector('#splash')
diff --git a/src/App.vue b/src/App.vue
index 34cc6b804..e5e088bc3 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -16,6 +16,7 @@