commit: 1ffbd02c87df65b7a25e5cce35a0b7c5cf383935
parent 9a9d89229f2654edaf2e096e23f1ad46a0b7a964
Author: Henry Jameson <me@hjkos.com>
Date:   Wed,  4 Dec 2024 14:03:27 +0200
when switching to new style, use "native" palette, also show it in appearance tab
Diffstat:
2 files changed, 76 insertions(+), 21 deletions(-)
diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js
@@ -361,8 +361,27 @@ const AppearanceTab = {
             onlyNormalState: true
           })
         } else if (version === 'v3') {
+          const palette = input.find(x => x.component === '@palette')
+          let paletteRule
+          if (palette) {
+            const { directives } = palette
+            directives.link = directives.link || directives.accent
+            directives.accent = directives.accent || directives.link
+            paletteRule = {
+              component: 'Root',
+              directives: Object.fromEntries(
+                Object
+                  .entries(directives)
+                  .filter(([k, v]) => k && k !== 'name')
+                  .map(([k, v]) => ['--' + k, 'color | ' + v])
+              )
+            }
+          } else {
+            paletteRule = null
+          }
+
           theme3 = init({
-            inputRuleset: input,
+            inputRuleset: [...input, paletteRule].filter(x => x),
             ultimateBackgroundColor: '#000000',
             liteMode: true,
             debug: true,
diff --git a/src/modules/interface.js b/src/modules/interface.js
@@ -3,12 +3,17 @@ import { CURRENT_VERSION, generatePreset } from 'src/services/theme_data/theme_d
 import { convertTheme2To3 } from 'src/services/theme_data/theme2_to_theme3.js'
 import { deserialize } from '../services/theme_data/iss_deserializer.js'
 
+// helper for debugging
+// eslint-disable-next-line no-unused-vars
+const toValue = (x) => JSON.parse(JSON.stringify(x === undefined ? 'null' : x))
+
 const defaultState = {
   localFonts: null,
   themeApplied: false,
   themeVersion: 'v3',
   styleNameUsed: null,
   styleDataUsed: null,
+  useStylePalette: false, // hack for applying styles from appearance tab
   paletteNameUsed: null,
   paletteDataUsed: null,
   themeNameUsed: null,
@@ -261,21 +266,29 @@ const interfaceMod = {
         return Promise.resolve({})
       }
     },
-    setStyle ({ dispatch, commit }, value) {
+    setStyle ({ dispatch, commit, state }, value) {
       dispatch('resetThemeV3')
       dispatch('resetThemeV2')
+      dispatch('resetThemeV3Palette')
 
       commit('setOption', { name: 'style', value })
+      state.useStylePalette = true
 
-      dispatch('applyTheme', { recompile: true })
+      dispatch('applyTheme', { recompile: true }).then(() => {
+        state.useStylePalette = false
+      })
     },
-    setStyleCustom ({ dispatch, commit }, value) {
+    setStyleCustom ({ dispatch, commit, state }, value) {
       dispatch('resetThemeV3')
       dispatch('resetThemeV2')
+      dispatch('resetThemeV3Palette')
 
       commit('setOption', { name: 'styleCustomData', value })
 
-      dispatch('applyTheme', { recompile: true })
+      state.useStylePalette = true
+      dispatch('applyTheme', { recompile: true }).then(() => {
+        state.useStylePalette = false
+      })
     },
     async fetchThemesIndex ({ commit, state }) {
       try {
@@ -443,14 +456,47 @@ const interfaceMod = {
       console.debug('Version used', majorVersionUsed)
 
       if (majorVersionUsed === 'v3') {
+        state.themeDataUsed = null
+        state.themeNameUsed = null
+
+        const style = await getData(
+          'style',
+          stylesIndex,
+          userStyleCustomData,
+          userStyleName || instanceStyleName
+        )
+        state.styleNameUsed = style.nameUsed
+        state.styleDataUsed = style.dataUsed
+
+        let firstStylePaletteName = null
+        style
+          .dataUsed
+          ?.filter(x => x.component === '@palette')
+          .map(x => {
+            const cleanDirectives = Object.fromEntries(
+              Object
+                .entries(x.directives)
+                .filter(([k, v]) => k)
+            )
+
+            return { name: x.variant, ...cleanDirectives }
+          })
+          .forEach(palette => {
+            const key = 'style.' + palette.name.toLowerCase().replace(/ /, '_')
+            if (!firstStylePaletteName) firstStylePaletteName = key
+            palettesIndex[key] = () => Promise.resolve(palette)
+          })
+
         const palette = await getData(
           'palette',
           palettesIndex,
           userPaletteCustomData,
-          userPaletteName || instancePaletteName
+          state.useStylePalette ? firstStylePaletteName : (userPaletteName || instancePaletteName)
         )
+
         state.paletteNameUsed = palette.nameUsed
         state.paletteDataUsed = palette.dataUsed
+
         if (state.paletteDataUsed) {
           state.paletteDataUsed.link = state.paletteDataUsed.link || state.paletteDataUsed.accent
           state.paletteDataUsed.accent = state.paletteDataUsed.accent || state.paletteDataUsed.link
@@ -481,18 +527,12 @@ const interfaceMod = {
           }
         }
         console.debug('Palette data used', palette.dataUsed)
-
-        const style = await getData(
-          'style',
-          stylesIndex,
-          userStyleCustomData,
-          userStyleName || instanceStyleName
-        )
-        state.styleNameUsed = style.nameUsed
-        state.styleDataUsed = style.dataUsed
-        state.themeDataUsed = null
-        state.themeNameUsed = null
       } else {
+        state.styleNameUsed = null
+        state.styleDataUsed = null
+        state.paletteNameUsed = null
+        state.paletteDataUsed = null
+
         const theme = await getData(
           'theme',
           themesIndex,
@@ -501,10 +541,6 @@ const interfaceMod = {
         )
         state.themeNameUsed = theme.nameUsed
         state.themeDataUsed = theme.dataUsed
-        state.styleNameUsed = null
-        state.styleDataUsed = null
-        state.paletteNameUsed = null
-        state.paletteDataUsed = null
       }
     },
     async applyTheme (