update tabs to use new API

This commit is contained in:
Henry Jameson 2025-07-02 22:54:45 +03:00
commit 3081504c64
4 changed files with 35 additions and 40 deletions

View file

@ -2,6 +2,7 @@ import Checkbox from 'src/components/checkbox/checkbox.vue'
import ColorInput from 'src/components/color_input/color_input.vue' import ColorInput from 'src/components/color_input/color_input.vue'
import genRandomSeed from 'src/services/random_seed/random_seed.service.js' import genRandomSeed from 'src/services/random_seed/random_seed.service.js'
import { createStyleSheet, adoptStyleSheets } from 'src/services/style_setter/style_setter.js'
export default { export default {
components: { components: {
@ -51,15 +52,11 @@ export default {
this.$emit('update:shadow', { axis, value: Number(value) }) this.$emit('update:shadow', { axis, value: Number(value) })
}, },
update () { update () {
const styleEl = document.getElementById('component-style-holder') const sheet = createStyleSheet('style-component-preview')
const styleSheet = styleEl.sheet
for (let i = styleSheet.cssRules.length - 1; i >= 0; --i) { sheet.clear()
styleSheet.deleteRule(i)
}
const result = []
const result = [this.previewCss]
if (this.colorOverride) result.push(`--background: ${this.colorOverride}`) if (this.colorOverride) result.push(`--background: ${this.colorOverride}`)
const styleRule = [ const styleRule = [
@ -71,13 +68,15 @@ export default {
'\n}' '\n}'
].join('') ].join('')
styleSheet.insertRule(styleRule) sheet.addRule(styleRule)
styleSheet.insertRule([ sheet.addRule([
'#component-preview-', this.randomSeed, ' {\n', '#component-preview-', this.randomSeed, ' {\n',
this.previewCss,
...result, ...result,
'\n}' '\n}'
].join(''), 'index-max') ].join(''))
sheet.ready = true
adoptStyleSheets()
} }
} }
} }

View file

@ -15,6 +15,7 @@ import {
getCssRules getCssRules
} from 'src/services/theme_data/css_utils.js' } from 'src/services/theme_data/css_utils.js'
import { deserialize } from 'src/services/theme_data/iss_deserializer.js' import { deserialize } from 'src/services/theme_data/iss_deserializer.js'
import { createStyleSheet, adoptStyleSheets } from 'src/services/style_setter/style_setter.js'
import SharedComputedObject from '../helpers/shared_computed_object.js' import SharedComputedObject from '../helpers/shared_computed_object.js'
import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue' import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue'
@ -410,16 +411,17 @@ const AppearanceTab = {
this.compilationCache[key] = theme3 this.compilationCache[key] = theme3
} }
const styleEl = document.getElementById('theme-preview-holder')
const styleSheet = styleEl.sheet const sheet = createStyleSheet('appearance-tab-previews')
styleSheet.insertRule([ sheet.addRule([
'#theme-preview-', '#theme-preview-',
key, key,
' {\n', ' {\n',
getCssRules(theme3.eager).join('\n'), getCssRules(theme3.eager).join('\n'),
'\n}' '\n}'
].join(''), 'index-max') ].join(''))
sheet.ready = true
adoptStyleSheets()
} }
} }
} }

View file

@ -1,4 +1,4 @@
import { ref, reactive, computed, watch, watchEffect, provide, getCurrentInstance } from 'vue' import { ref, reactive, computed, watch, provide, getCurrentInstance } from 'vue'
import { useInterfaceStore } from 'src/stores/interface' import { useInterfaceStore } from 'src/stores/interface'
import { get, set, unset, throttle } from 'lodash' import { get, set, unset, throttle } from 'lodash'
@ -19,6 +19,7 @@ import Preview from '../theme_tab/theme_preview.vue'
import VirtualDirectivesTab from './virtual_directives_tab.vue' import VirtualDirectivesTab from './virtual_directives_tab.vue'
import { createStyleSheet, adoptStyleSheets } from 'src/services/style_setter/style_setter.js'
import { init, findColor } from 'src/services/theme_data/theme_data_3.service.js' import { init, findColor } from 'src/services/theme_data/theme_data_3.service.js'
import { getCssRules } from 'src/services/theme_data/css_utils.js' import { getCssRules } from 'src/services/theme_data/css_utils.js'
import { serialize } from 'src/services/theme_data/iss_serializer.js' import { serialize } from 'src/services/theme_data/iss_serializer.js'
@ -694,29 +695,19 @@ export default {
return return
} }
const styleEl = document.getElementById('editor-overall-holder') const sheet = createStyleSheet('style-tab-overall-preview')
const styleSheet = styleEl.sheet
console.log(styleSheet) sheet.clear()
console.log('BEFORE', styleSheet.cssRules) sheet.addRule([
for (let i = styleSheet.cssRules.length - 1; i >= 0; --i) {
styleSheet.deleteRule(i)
}
styleSheet.insertRule([
'#edited-style-preview {\n', '#edited-style-preview {\n',
css.join('\n'), css.join('\n'),
'\n}' '\n}'
].join(''), 'index-max') ].join(''))
styleSheet.insertRule([ sheet.ready = true
'#edited-style-preview {\n', adoptStyleSheets()
css.join('\n'),
'\n}'
].join(''), 'index-max')
console.log('AFTER', styleSheet.cssRules)
}) })
const updateOverallPreview = () => { const updateOverallPreview = throttle(() => {
try { try {
overallPreviewRules.value = init({ overallPreviewRules.value = init({
inputRuleset: [ inputRuleset: [
@ -738,7 +729,7 @@ export default {
console.error('Could not compile preview theme', e) console.error('Could not compile preview theme', e)
return null return null
} }
} }, 1000)
// //
// Apart from "hover" we can't really show how component looks like in // Apart from "hover" we can't really show how component looks like in
// certain states, so we have to fake them. // certain states, so we have to fake them.

View file

@ -1,7 +1,7 @@
import { init, getEngineChecksum } from '../theme_data/theme_data_3.service.js' import { init, getEngineChecksum } from '../theme_data/theme_data_3.service.js'
import { getCssRules } from '../theme_data/css_utils.js' import { getCssRules } from '../theme_data/css_utils.js'
import { defaultState } from 'src/modules/default_config_state.js' import { defaultState } from 'src/modules/default_config_state.js'
import { chunk } from 'lodash' import { chunk, throttle } from 'lodash'
import localforage from 'localforage' import localforage from 'localforage'
// On platforms where this is not supported, it will return undefined // On platforms where this is not supported, it will return undefined
@ -10,10 +10,14 @@ const supportsAdoptedStyleSheets = !!document.adoptedStyleSheets
const stylesheets = {} const stylesheets = {}
const createStyleSheet = (id) => { export const createStyleSheet = (id) => {
if (stylesheets[id]) return stylesheets[id]
const newStyleSheet = { const newStyleSheet = {
rules: [], rules: [],
ready: false, ready: false,
clear () {
this.rules = []
},
addRule (rule) { addRule (rule) {
this.rules.push( this.rules.push(
rule rule
@ -28,7 +32,7 @@ const createStyleSheet = (id) => {
} }
export const adoptStyleSheets = () => { export const adoptStyleSheets = throttle(() => {
if (supportsAdoptedStyleSheets) { if (supportsAdoptedStyleSheets) {
document.adoptedStyleSheets = Object document.adoptedStyleSheets = Object
.values(stylesheets) .values(stylesheets)
@ -46,13 +50,12 @@ export const adoptStyleSheets = () => {
.forEach(sheet => { .forEach(sheet => {
sheet.rules.forEach(r => holder.sheet.insertRule(r)) sheet.rules.forEach(r => holder.sheet.insertRule(r))
}) })
} }
// Some older browsers do not support document.adoptedStyleSheets. // Some older browsers do not support document.adoptedStyleSheets.
// In this case, we use the <style> elements. // In this case, we use the <style> elements.
// Since the <style> elements we need are already in the DOM, there // Since the <style> elements we need are already in the DOM, there
// is nothing to do here. // is nothing to do here.
} }, 500)
const EAGER_STYLE_ID = 'pleroma-eager-styles' const EAGER_STYLE_ID = 'pleroma-eager-styles'