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: e8d0e45b5b19722555b53f9009f8bc01a9ed8640
parent ba4be2cb22aa508589f89fe0c44e8da241e91321
Author: Henry Jameson <me@hjkos.com>
Date:   Wed,  2 Oct 2024 16:22:28 +0300

it is working. finally.

Diffstat:

Msrc/components/settings_modal/tabs/appearance_tab.js28+++++++++++++++++++++++-----
Msrc/components/settings_modal/tabs/appearance_tab.vue8+++++---
Msrc/modules/config.js2++
Msrc/modules/interface.js182++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Msrc/services/style_setter/style_setter.js2+-
Msrc/services/theme_data/theme_data_3.service.js6++++++
Mstatic/config.json2+-
7 files changed, 167 insertions(+), 63 deletions(-)

diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js @@ -174,7 +174,11 @@ const AppearanceTab = { }, isCustomThemeUsed () { const { theme } = this.mergedConfig - return theme === 'custom' || theme === null + return theme === 'custom' + }, + isCustomStyleUsed (name) { + const { style } = this.mergedConfig + return style === 'custom' }, ...SharedComputedObject() }, @@ -196,12 +200,26 @@ const AppearanceTab = { const { theme } = this.mergedConfig return key === theme }, - async setTheme (name) { - await this.$store.dispatch('setTheme', name) + isStyleActive (key) { + const { style } = this.mergedConfig + return key === style + }, + isPaletteActive (key) { + const { palette } = this.mergedConfig + return key === palette + }, + setTheme (name) { + this.$store.dispatch('setTheme', name) + this.$store.dispatch('applyTheme') + }, + setPalette (name) { + this.$store.dispatch('setPalette', name) this.$store.dispatch('applyTheme') }, - async setPalette (name) { - await this.$store.dispatch('setPalette', name) + resetTheming (name) { + this.$store.dispatch('resetThemeV2') + this.$store.dispatch('resetThemeV3') + this.$store.dispatch('setStyle', 'stock') this.$store.dispatch('applyTheme') }, previewTheme (key, input) { diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue @@ -9,7 +9,8 @@ <button class="button-default theme-preview" data-theme-key="stock" - @click="setTheme(null)" + @click="resetTheming" + :class="{ toggled: isStyleActive('stock') }" > <!-- eslint-disable vue/no-v-text-v-html-on-component --> <component @@ -49,7 +50,7 @@ v-html="previewTheme(style.key, style.data)" /> <!-- eslint-enable vue/no-v-text-v-html-on-component --> - <preview :class="{ placeholder: ready }" :id="'theme-preview-' + style.key"/> + <preview :id="'theme-preview-' + style.key"/> <h4 class="theme-name"> {{ style.name }} <span class="alert neutral version">{{ style.version }}</span> @@ -61,8 +62,9 @@ <button v-for="p in availablePalettes" class="btn button-default palette-entry" + :class="{ toggled: isPaletteActive(p.key) }" :key="p.name" - @click="() => setPalette(p)" + @click="() => setPalette(p.key)" > <label> {{ p.name }} diff --git a/src/modules/config.js b/src/modules/config.js @@ -47,6 +47,8 @@ export const defaultState = { customThemeSource: undefined, // "source", stores original theme data // V3 + style: null, + palette: null, themeDebug: false, // debug mode that uses computed backgrounds instead of real ones to debug contrast functions forceThemeRecompilation: false, // flag that forces recompilation on boot even if cache exists theme3hacks: { // Hacks, user overrides that are independent of theme used diff --git a/src/modules/interface.js b/src/modules/interface.js @@ -223,16 +223,16 @@ const interfaceMod = { } }, setPalette ({ dispatch, commit }, value) { - dispatch('resetV3') - dispatch('resetV2') + dispatch('resetThemeV3Palette') + dispatch('resetThemeV2') commit('setOption', { name: 'palette', value }) dispatch('applyTheme') }, setPaletteCustom ({ dispatch, commit }, value) { - dispatch('resetV3') - dispatch('resetV2') + dispatch('resetThemeV3Palette') + dispatch('resetThemeV2') commit('setOption', { name: 'paletteCustomData', value }) @@ -249,16 +249,16 @@ const interfaceMod = { } }, setStyle ({ dispatch, commit }, value) { - dispatch('resetV3') - dispatch('resetV2') + dispatch('resetThemeV3') + dispatch('resetThemeV2') commit('setOption', { name: 'style', value }) dispatch('applyTheme') }, setStyleCustom ({ dispatch, commit }, value) { - dispatch('resetV3') - dispatch('resetV2') + dispatch('resetThemeV3') + dispatch('resetThemeV2') commit('setOption', { name: 'styleCustomData', value }) @@ -275,29 +275,33 @@ const interfaceMod = { } }, setTheme ({ dispatch, commit }, value) { - dispatch('resetV3') - dispatch('resetV2') + dispatch('resetThemeV3') + dispatch('resetThemeV3Palette') + dispatch('resetThemeV2') commit('setOption', { name: 'theme', value }) dispatch('applyTheme') }, setThemeCustom ({ dispatch, commit }, value) { - dispatch('resetV3') - dispatch('resetV2') + dispatch('resetThemeV3') + dispatch('resetThemeV3Palette') + dispatch('resetThemeV2') commit('setOption', { name: 'customTheme', value }) commit('setOption', { name: 'customThemeSource', value }) dispatch('applyTheme') }, - resetV3 ({ dispatch, commit }) { + resetThemeV3 ({ dispatch, commit }) { commit('setOption', { name: 'style', value: null }) commit('setOption', { name: 'styleCustomData', value: null }) + }, + resetThemeV3Palette ({ dispatch, commit }) { commit('setOption', { name: 'palette', value: null }) commit('setOption', { name: 'paletteCustomData', value: null }) }, - resetV2 ({ dispatch, commit }) { + resetThemeV2 ({ dispatch, commit }) { commit('setOption', { name: 'theme', value: null }) commit('setOption', { name: 'customTheme', value: null }) commit('setOption', { name: 'customThemeSource', value: null }) @@ -333,7 +337,6 @@ const interfaceMod = { theme: userThemeV2Name, customTheme: userThemeV2Snapshot, customThemeSource: userThemeV2Source - } = rootState.config const forceRecompile = forceThemeRecompilation || recompile @@ -343,10 +346,34 @@ const interfaceMod = { let majorVersionUsed + console.log( + 'USER V3', + userPaletteName, + userStyleName + ) + console.log( + 'USER V2', + userThemeV2Name, + userThemeV2Source, + userThemeV2Snapshot + ) + + console.log( + 'INST V3', + instancePaletteName, + instanceStyleName + ) + console.log( + 'INST V2', + instanceThemeV2Name + ) + if (userPaletteName || userPaletteCustomData || userStyleName || userStyleCustomData || instancePaletteName || - instanceStyleName + instanceStyleName || + (instanceThemeV2Name == null && + userThemeV2Name == null) ) { // Palette and/or style overrides V2 themes instanceThemeV2Name = null @@ -364,13 +391,20 @@ const interfaceMod = { palettesIndex = result[0] stylesIndex = result[1] } - } else { + } else if ( + userThemeV2Name || + userThemeV2Snapshot || + userThemeV2Source || + instanceThemeV2Name + ) { majorVersionUsed = 'v2' // Promise.all just to be uniform with v3 const result = await Promise.all([ dispatch('fetchThemesIndex') ]) themesIndex = result[0] + } else { + majorVersionUsed = 'v3' } let styleDataUsed = null @@ -380,52 +414,93 @@ const interfaceMod = { let themeNameUsed = null let themeDataUsed = null - if (majorVersionUsed === 'v3') { - if (userStyleCustomData) { - styleNameUsed = 'custom' // custom data overrides name - styleDataUsed = userStyleCustomData + const getData = async (resource, index, customData, name) => { + const capitalizedResource = resource[0].toUpperCase() + resource.slice(1) + const result = {} + + if (customData) { + result.nameUsed = 'custom' // custom data overrides name + result.dataUsed = customData } else { - styleNameUsed = userStyleName || instanceStyleName - let styleFetchFunc = stylesIndex[themeNameUsed] - if (!styleFetchFunc) { - const newName = Object.keys(stylesIndex)[0] - styleFetchFunc = stylesIndex[newName] - console.warn(`Style with id '${styleNameUsed}' not found, falling back to '${newName}'`) + result.nameUsed = name + + if (result.nameUsed === 'stock') { + result.dataUsed = null + return result } - styleDataUsed = await styleFetchFunc?.() - } - if (userPaletteCustomData) { - paletteNameUsed = 'custom' // custom data overrides name - paletteDataUsed = userPaletteCustomData - } else { - paletteNameUsed = userPaletteName || instanceStyleName - let paletteFetchFunc = palettesIndex[themeNameUsed] - if (!paletteFetchFunc) { - const newName = Object.keys(palettesIndex)[0] - paletteFetchFunc = palettesIndex[newName] - console.warn(`Palette with id '${paletteNameUsed}' not found, falling back to '${newName}'`) + let fetchFunc = index[result.nameUsed] + // Fallbacks + if (!fetchFunc) { + const newName = Object.keys(index)[0] + fetchFunc = index[newName] + console.warn(`${capitalizedResource} with id '${styleNameUsed}' not found, trying back to '${newName}'`) + if (!fetchFunc) { + console.warn(`${capitalizedResource} doesn't have a fallback, defaulting to stock.`) + fetchFunc = () => Promise.resolve(null) + } } - paletteDataUsed = await paletteFetchFunc?.() + result.dataUsed = await fetchFunc() } - } else { - if (userThemeV2Snapshot || userThemeV2Source) { - themeNameUsed = 'custom' // custom data overrides name - themeDataUsed = userThemeV2Snapshot || userThemeV2Source - } else { - themeNameUsed = userThemeV2Name || instanceThemeV2Name - let themeFetchFunc = themesIndex[themeNameUsed] - if (!themeFetchFunc) { - const newName = Object.keys(themesIndex)[0] - themeFetchFunc = themesIndex[newName] - console.warn(`Theme with id '${themeNameUsed}' not found, falling back to '${newName}'`) - } - themeDataUsed = await themeFetchFunc?.() + return result + } + + console.log('VERSION', majorVersionUsed) + + if (majorVersionUsed === 'v3') { + const palette = await getData( + 'palette', + palettesIndex, + userPaletteCustomData, + userPaletteName || instancePaletteName + ) + paletteNameUsed = palette.nameUsed + paletteDataUsed = palette.dataUsed + if (Array.isArray(paletteDataUsed)) { + const [ + name, + background, + foreground, + text, + link, + cRed = '#FF0000', + cBlue = '#0000FF', + cGreen = '#00FF00', + cOrange = '#E3FF00' + ] = paletteDataUsed + paletteDataUsed = { name, background, foreground, text, link, cRed, cBlue, cGreen, cOrange } } + console.log('PAL', userPaletteName, paletteNameUsed) + console.log('PAL', paletteDataUsed) + + const style = await getData( + 'style', + stylesIndex, + userStyleCustomData, + userStyleName || instanceStyleName + ) + styleNameUsed = style.nameUsed + styleDataUsed = style.dataUsed + } else { + const theme = await getData( + 'theme', + themesIndex, + userThemeV2Source || userThemeV2Snapshot, + userThemeV2Name || instanceThemeV2Name + ) + themeNameUsed = theme.nameUsed + themeDataUsed = theme.dataUsed + // Themes v2 editor support commit('setInstanceOption', { name: 'themeData', value: themeDataUsed }) } + console.log('STYLE', styleNameUsed, paletteNameUsed, themeNameUsed) + + // commit('setOption', { name: 'palette', value: paletteNameUsed }) + // commit('setOption', { name: 'style', value: styleNameUsed }) + // commit('setOption', { name: 'theme', value: themeNameUsed }) + const paletteIss = (() => { if (!paletteDataUsed) return null const result = { @@ -433,6 +508,7 @@ const interfaceMod = { directives: {} } + console.log('PALETTE', paletteDataUsed) Object .entries(paletteDataUsed) .filter(([k]) => k !== 'name') diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js @@ -52,7 +52,6 @@ export const generateTheme = async (inputRuleset, callbacks, debug) => { // Assuming that "worst case scenario background" is panel background since it's the most likely one const themes3 = init({ inputRuleset, - ultimateBackgroundColor: inputRuleset[0].directives['--bg']?.split('|')[1].trim() || '#000000', debug }) @@ -146,6 +145,7 @@ export const tryLoadCache = () => { } export const applyTheme = async (input, onFinish = (data) => {}, debug) => { + console.log('INPUT', input) const eagerStyles = createStyleSheet(EAGER_STYLE_ID) const lazyStyles = createStyleSheet(LAZY_STYLE_ID) diff --git a/src/services/theme_data/theme_data_3.service.js b/src/services/theme_data/theme_data_3.service.js @@ -230,6 +230,12 @@ export const init = ({ }) .map(({ data }) => data) + if (!ultimateBackgroundColor) { + console.warn('No ultimate background color provided, falling back to panel color') + const rootRule = ruleset.findLast((x) => (x.component === 'Root' && x.directives?.['--bg'])) + ultimateBackgroundColor = rootRule.directives['--bg'].split('|')[1].trim() + } + const virtualComponents = new Set(Object.values(components).filter(c => c.virtual).map(c => c.name)) const nonEditableComponents = new Set(Object.values(components).filter(c => c.notEditable).map(c => c.name)) diff --git a/static/config.json b/static/config.json @@ -24,6 +24,6 @@ "showInstanceSpecificPanel": false, "sidebarRight": false, "subjectLineBehavior": "email", - "theme": "pleroma-dark", + "theme": null, "webPushNotifications": false }