pleroma-fe/src/services/style_setter/style_setter.js

150 lines
4.4 KiB
JavaScript
Raw Normal View History

import { hex2rgb } from '../color_convert/color_convert.js'
import { generatePreset } 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 { defaultState } from '../../modules/config.js'
export const applyTheme = (input) => {
2024-02-22 01:10:24 +02:00
console.log({ ...input })
2024-02-21 22:18:56 +02:00
let extraRules
let fonts
2024-02-22 01:10:24 +02:00
if (input.themeType !== 1) {
2024-02-21 22:18:56 +02:00
const t0 = performance.now()
2024-02-22 01:10:24 +02:00
const { rules, theme } = generatePreset(input)
2024-02-21 22:18:56 +02:00
fonts = rules.fonts
const t1 = performance.now()
console.log('Themes 2 initialization took ' + (t1 - t0) + 'ms')
extraRules = convertTheme2To3(theme)
} else {
console.log(input)
extraRules = convertTheme2To3(input)
}
2024-02-08 18:18:01 +02:00
const t1 = performance.now()
2024-02-20 01:05:17 +02:00
const themes3 = init(extraRules)
2024-02-08 18:18:01 +02:00
const t2 = performance.now()
console.log('Themes 3 initialization took ' + (t2 - t1) + 'ms')
const head = document.head
const body = document.body
body.classList.add('hidden')
const styleEl = document.createElement('style')
head.appendChild(styleEl)
const styleSheet = styleEl.sheet
styleSheet.toString()
2024-02-21 22:18:56 +02:00
styleSheet.insertRule(`:root { ${fonts} }`, 'index-max')
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)
const newRule = [
parts[0],
', ',
parts[0].replace(/button/, 'thumb'),
' {',
parts[1],
'}'
].join('')
styleSheet.insertRule(newRule, 'index-max')
} else {
styleSheet.insertRule(rule, 'index-max')
}
2024-01-31 17:39:51 +02:00
})
body.classList.remove('hidden')
themes3.lazy.then(lazyRules => {
getCssRules(lazyRules, themes3.staticVars).forEach(rule => {
styleSheet.insertRule(rule, 'index-max')
})
const t3 = performance.now()
console.log('Themes 3 finalization took ' + (t3 - t2) + 'ms')
})
}
const configColumns = ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth, emojiReactionsScale }) =>
({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth, emojiReactionsScale })
const defaultConfigColumns = configColumns(defaultState)
export const applyConfig = (config) => {
const columns = configColumns(config)
if (columns === defaultConfigColumns) {
return
}
const head = document.head
const body = document.body
body.classList.add('hidden')
const rules = Object
.entries(columns)
.filter(([k, v]) => v)
.map(([k, v]) => `--${k}: ${v}`).join(';')
const styleEl = document.createElement('style')
head.appendChild(styleEl)
const styleSheet = styleEl.sheet
styleSheet.toString()
styleSheet.insertRule(`:root { ${rules} }`, 'index-max')
body.classList.remove('hidden')
}
2020-01-12 04:00:41 +02:00
export const getThemes = () => {
2020-02-11 10:42:15 +02:00
const cache = 'no-store'
return window.fetch('/static/styles.json', { cache })
.then((data) => data.json())
.then((themes) => {
return Object.entries(themes).map(([k, v]) => {
let promise = null
2018-12-11 01:38:20 +03:00
if (typeof v === 'object') {
promise = Promise.resolve(v)
2018-12-11 01:38:20 +03:00
} else if (typeof v === 'string') {
2020-02-11 10:42:15 +02:00
promise = window.fetch(v, { cache })
2018-12-11 01:38:20 +03:00
.then((data) => data.json())
.catch((e) => {
console.error(e)
return null
2018-12-11 01:38:20 +03:00
})
}
return [k, promise]
})
2018-12-11 01:38:20 +03:00
})
.then((promises) => {
return promises
.reduce((acc, [k, v]) => {
acc[k] = v
return acc
}, {})
})
}
export const getPreset = (val) => {
return getThemes()
2020-01-20 00:34:49 +02:00
.then((themes) => themes[val] ? themes[val] : themes['pleroma-dark'])
.then((theme) => {
const isV1 = Array.isArray(theme)
2024-02-22 01:10:24 +02:00
const data = isV1 ? { themeType: 1 } : theme.theme
if (isV1) {
const bg = hex2rgb(theme[1])
const fg = hex2rgb(theme[2])
const text = hex2rgb(theme[3])
const link = hex2rgb(theme[4])
const cRed = hex2rgb(theme[5] || '#FF0000')
const cGreen = hex2rgb(theme[6] || '#00FF00')
const cBlue = hex2rgb(theme[7] || '#0000FF')
const cOrange = hex2rgb(theme[8] || '#E3FF00')
data.colors = { bg, fg, text, link, cRed, cBlue, cGreen, cOrange }
}
2024-02-22 01:10:24 +02:00
return { theme: data, source: theme.source }
})
2017-01-16 17:44:26 +01:00
}
2024-02-21 22:18:56 +02:00
export const setPreset = (val) => getPreset(val).then(data => applyTheme(data))