diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js index 10de0397..ef367e41 100644 --- a/src/components/settings_modal/tabs/appearance_tab.js +++ b/src/components/settings_modal/tabs/appearance_tab.js @@ -35,6 +35,7 @@ const AppearanceTab = { data () { return { availableStyles: [], + intersectionObserver: null, thirdColumnModeOptions: ['none', 'notifications', 'postform'].map(mode => ({ key: mode, value: mode, @@ -62,9 +63,7 @@ const AppearanceTab = { FontControl, Preview }, - created () { - const self = this - + mounted () { getThemes() .then((promises) => { return Promise.all( @@ -74,19 +73,48 @@ const AppearanceTab = { }) .then(themes => themes.reduce((acc, [k, v]) => { if (v) { - return { + return [ ...acc, - [k]: v - } + { + name: v.name || v[0], + key: k, + data: v + } + ] } else { return acc } - }, {})) + }, [])) .then((themesComplete) => { - self.availableStyles = themesComplete + this.availableStyles = themesComplete + }) + + if (window.IntersectionObserver) { + this.intersectionObserver = new IntersectionObserver((entries, observer) => { + entries.forEach(({ target, isIntersecting }) => { + if (!isIntersecting) return + const theme = this.availableStyles.find(x => x.key === target.dataset.themeKey) + this.$nextTick(() => { + theme.ready = true + }) + observer.unobserve(target) + }) + }, { + root: this.$refs.themeList + }) + } + }, + updated () { + this.$nextTick(() => { + this.$refs.themeList.querySelectorAll('.theme-preview').forEach(node => { + this.intersectionObserver.observe(node) }) + }) }, computed: { + noIntersectionObserver () { + return !window.IntersectionObserver + }, horizontalUnits () { return defaultHorizontalUnits }, @@ -119,7 +147,12 @@ const AppearanceTab = { ...SharedComputedObject() }, methods: { - previewTheme (input) { + isThemeActive (key, name) { + console.log(this.$store.getters.mergedConfig) + const { customTheme, themeName, customThemeSource } = this.$store.getters.mergedConfig + console.log(customTheme, customThemeSource, themeName) + }, + previewTheme (key, input) { const style = normalizeThemeData(input) const x = 2 if (x === 1) return @@ -128,12 +161,13 @@ const AppearanceTab = { inputRuleset: theme2, ultimateBackgroundColor: '#000000', liteMode: true, + debug: true, onlyNormalState: true }) return getScopedVersion( getCssRules(theme3.eager), - '#theme-preview-' + (input.name || input[0]).replace(/ /g, '_') + '#theme-preview-' + key ).join('\n') } } diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index 2488720d..0954d3a7 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -2,18 +2,26 @@

{{ $t('settings.theme') }}

-
@@ -252,13 +260,28 @@ list-style: none; display: flex; flex-wrap: wrap; -} + margin: 0 -0.5em; + height: 15em; + overflow-x: hidden; + overflow-y: auto; + scrollbar-gutter: stable; + + .theme-preview { + width: 21rem; + display: flex; + flex-direction: column; + align-items: center; + margin: 0.5em; -.theme-preview { - width: 10rem; + &.placeholder { + opacity: 0.2; + } - .preview-container { - zoom: 0.33; + .preview-container { + zoom: 0.5; + border: none; + border-radius: var(--roundness); + } } }