logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git
commit: 0285efadbb10ed68940a2aef2f320fbf65f841c9
parent 23dc2d1a5b6b3db7e5daa30c71eda1add2273e34
Author: Henry Jameson <me@hjkos.com>
Date:   Mon, 19 Feb 2024 20:47:27 +0200

independence from themes3, converter/backwards compat WIP

Diffstat:

Msrc/services/style_setter/style_setter.js19++++++++++---------
Msrc/services/theme_data/theme2_to_theme3.js87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Msrc/services/theme_data/theme_data_3.service.js23+++++++++++++++--------
3 files changed, 106 insertions(+), 23 deletions(-)

diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js @@ -2,6 +2,7 @@ import { convert } from 'chromatism' import { rgb2hex, hex2rgb, rgba2css, getCssColor, relativeLuminance } from '../color_convert/color_convert.js' import { getColors, computeDynamicColor, getOpacitySlot } from '../theme_data/theme_data.service.js' import { init } from '../theme_data/theme_data_3.service.js' +import { convertTheme2To3 } from '../theme_data/theme2_to_theme3.js' import { getCssRules } from '../theme_data/css_utils.js' import { sampleRules @@ -10,10 +11,12 @@ import { defaultState } from '../../modules/config.js' export const applyTheme = (input) => { const t0 = performance.now() - const { rules, t3b } = generatePreset(input) + const { rules, theme } = generatePreset(input) + console.log(rules, theme) const t1 = performance.now() console.log('Themes 2 initialization took ' + (t1 - t0) + 'ms') - const themes3 = init(sampleRules, t3b) + const extraRules = convertTheme2To3(theme) + const themes3 = init([...sampleRules, ...extraRules]) const t2 = performance.now() console.log('Themes 3 initialization took ' + (t2 - t1) + 'ms') const head = document.head @@ -26,7 +29,7 @@ export const applyTheme = (input) => { styleSheet.toString() styleSheet.insertRule(`:root { ${rules.fonts} }`, 'index-max') - getCssRules(themes3.eager, t3b).forEach(rule => { + getCssRules(themes3.eager, themes3.staticVars).forEach(rule => { // Hack to support multiple selectors on same component if (rule.match(/::-webkit-scrollbar-button/)) { const parts = rule.split(/[{}]/g) @@ -45,7 +48,7 @@ export const applyTheme = (input) => { }) body.classList.remove('hidden') themes3.lazy.then(lazyRules => { - getCssRules(lazyRules, t3b).forEach(rule => { + getCssRules(lazyRules, themes3.staticVars).forEach(rule => { styleSheet.insertRule(rule, 'index-max') }) const t3 = performance.now() @@ -358,7 +361,7 @@ export const generateShadows = (input, colors) => { } } -export const composePreset = (colors, radii, shadows, fonts, t3b) => { +export const composePreset = (colors, radii, shadows, fonts) => { return { rules: { ...shadows.rules, @@ -371,8 +374,7 @@ export const composePreset = (colors, radii, shadows, fonts, t3b) => { ...colors.theme, ...radii.theme, ...fonts.theme - }, - t3b + } } } @@ -382,8 +384,7 @@ export const generatePreset = (input) => { colors, generateRadii(input), generateShadows(input, colors.theme.colors, colors.mod), - generateFonts(input), - colors.theme.colors + generateFonts(input) ) } diff --git a/src/services/theme_data/theme2_to_theme3.js b/src/services/theme_data/theme2_to_theme3.js @@ -1,7 +1,7 @@ import allKeys from './theme2_keys' // keys that are meant to be used globally, i.e. what's the rest of the theme is based upon. -const basePaletteKeys = new Set([ +export const basePaletteKeys = new Set([ 'bg', 'fg', 'text', @@ -14,13 +14,26 @@ const basePaletteKeys = new Set([ 'cOrange' ]) +export const shadowsKeys = new Set([ + 'panel', + 'topBar', + 'popup', + 'avatar', + 'avatarStatus', + 'panelHeader', + 'button', + 'buttonHover', + 'buttonPressed', + 'input' +]) + // Keys that are not available in editor and never meant to be edited -const hiddenKeys = new Set([ +export const hiddenKeys = new Set([ 'profileBg', 'profileTint' ]) -const extendedBasePrefixes = [ +export const extendedBasePrefixes = [ 'border', 'icon', 'highlight', @@ -47,12 +60,74 @@ const extendedBasePrefixes = [ 'chatMessageOutgoing' ] -const extendedBaseKeys = Object.fromEntries(extendedBasePrefixes.map(prefix => [prefix, allKeys.filter(k => k.startsWith(prefix))])) +export const extendedBaseKeys = Object.fromEntries(extendedBasePrefixes.map(prefix => [prefix, allKeys.filter(k => k.startsWith(prefix))])) // Keysets that are only really used intermideately, i.e. to generate other colors -const temporary = new Set([ +export const temporary = new Set([ 'border', 'highlight' ]) -const temporaryColors = {} +export const temporaryColors = {} + +export const convertTheme2To3 = (data) => { + const generateRoot = () => { + const directives = {} + basePaletteKeys.forEach(key => { directives['--' + key] = 'color | ' + data.colors[key] }) + return { + component: 'Root', + directives + } + } + + const convertShadows = () => { + const newRules = [] + shadowsKeys.forEach(key => { + const originalShadow = data.shadows[key] + const rule = {} + + switch (key) { + case 'panel': + rule.component = 'Panel' + break + case 'topBar': + rule.component = 'TopBar' + break + case 'popup': + rule.component = 'Popover' + break + case 'avatar': + rule.component = 'Avatar' + break + case 'avatarStatus': + rule.component = 'Avatar' + rule.parent = { component: 'Post' } + break + case 'panelHeader': + rule.component = 'PanelHeader' + break + case 'button': + rule.component = 'Button' + break + case 'buttonHover': + rule.component = 'Button' + rule.state = ['hover'] + break + case 'buttonPressed': + rule.component = 'Button' + rule.state = ['pressed'] + break + case 'input': + rule.component = 'Input' + break + } + rule.directives = { + shadow: originalShadow + } + newRules.push(rule) + }) + return newRules + } + + return [generateRoot(), ...convertShadows()] +} diff --git a/src/services/theme_data/theme_data_3.service.js b/src/services/theme_data/theme_data_3.service.js @@ -119,7 +119,8 @@ componentsContext.keys().forEach(key => { const ruleToSelector = genericRuleToSelector(components) -export const init = (extraRuleset, palette) => { +export const init = (extraRuleset) => { + const staticVars = {} const stacked = {} const computed = {} @@ -287,7 +288,7 @@ export const init = (extraRuleset, palette) => { dynamicVars.inheritedBackground = lowerLevelBackground dynamicVars.stacked = convert(stacked[lowerLevelSelector]).rgb - const intendedTextColor = convert(findColor(inheritedTextColor, dynamicVars, palette)).rgb + const intendedTextColor = convert(findColor(inheritedTextColor, dynamicVars, staticVars)).rgb const textColor = newTextRule.directives.textAuto === 'no-auto' ? intendedTextColor : getTextColor( @@ -354,7 +355,7 @@ export const init = (extraRuleset, palette) => { dynamicVars.inheritedBackground = inheritedBackground - const rgb = convert(findColor(computedDirectives.background, dynamicVars, palette)).rgb + const rgb = convert(findColor(computedDirectives.background, dynamicVars, staticVars)).rgb if (!stacked[selector]) { let blend @@ -376,7 +377,7 @@ export const init = (extraRuleset, palette) => { let targetShadow if (typeof shadow === 'string') { if (shadow.startsWith('$')) { - targetShadow = process(shadow, shadowFunctions, findColor, dynamicVars, palette) + targetShadow = process(shadow, shadowFunctions, findColor, dynamicVars, staticVars) } } else { targetShadow = shadow @@ -384,7 +385,7 @@ export const init = (extraRuleset, palette) => { return { ...targetShadow, - color: findColor(targetShadow.color, dynamicVars, palette) + color: findColor(targetShadow.color, dynamicVars, staticVars) } }) } @@ -404,8 +405,13 @@ export const init = (extraRuleset, palette) => { dynamicSlots.forEach(([k, v]) => { const [type, value] = v.split('|').map(x => x.trim()) // woah, Extreme! switch (type) { - case 'color': - dynamicVars[k] = findColor(value, dynamicVars, palette) + case 'color': { + const color = findColor(value, dynamicVars, staticVars) + dynamicVars[k] = color + if (component.name === 'Root') { + staticVars[k.substring(2)] = color + } + } } }) @@ -456,6 +462,7 @@ export const init = (extraRuleset, palette) => { return { lazy: lazyExec, - eager: eagerRules + eager: eagerRules, + staticVars } }