update theming

This commit is contained in:
lightling 2025-04-16 18:39:03 -04:00
parent 0f865e10f9
commit 8cb6c76d79
Signed by: lightling
GPG key ID: F1F29650D537C773
4 changed files with 115 additions and 12 deletions

34
package-lock.json generated
View file

@ -1968,6 +1968,39 @@
"node": ">=12.11.0" "node": ">=12.11.0"
} }
}, },
"node_modules/@primeuix/themes": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@primeuix/themes/-/themes-1.0.3.tgz",
"integrity": "sha512-f/1qadrv5TFMHfvtVv4Y9zjrkeDP2BO/cuzbHBO9DYxKL6YBIPT9BjKec2K4Kg8PcfGm6CAvxAvICadJSWejRw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@primeuix/styled": "^0.5.1"
}
},
"node_modules/@primeuix/themes/node_modules/@primeuix/styled": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@primeuix/styled/-/styled-0.5.1.tgz",
"integrity": "sha512-5Ftw/KSauDPClQ8F2qCyCUF7cIUEY4yLNikf0rKV7Vsb8zGYNK0dahQe7CChaR6M2Kn+NA2DSBSk76ZXqj6Uog==",
"dev": true,
"license": "MIT",
"dependencies": {
"@primeuix/utils": "^0.5.3"
},
"engines": {
"node": ">=12.11.0"
}
},
"node_modules/@primeuix/themes/node_modules/@primeuix/utils": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.5.3.tgz",
"integrity": "sha512-7SGh7734wcF1/uK6RzO6Z6CBjGQ97GDHfpyl2F1G/c7R0z9hkT/V72ypDo82AWcCS7Ta07oIjDpOCTkSVZuEGQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.11.0"
}
},
"node_modules/@primeuix/utils": { "node_modules/@primeuix/utils": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.3.2.tgz",
@ -22704,6 +22737,7 @@
"devDependencies": { "devDependencies": {
"@goldenwere/mackenzii-embeds": "*", "@goldenwere/mackenzii-embeds": "*",
"@goldenwere/mackenzii-types": "*", "@goldenwere/mackenzii-types": "*",
"@primeuix/themes": "1.0.3",
"@primevue/themes": "4.2.5", "@primevue/themes": "4.2.5",
"@types/dompurify": "3.2.0", "@types/dompurify": "3.2.0",
"@types/js-yaml": "4.0.9", "@types/js-yaml": "4.0.9",

View file

@ -12,6 +12,7 @@
"@goldenwere/mackenzii-types": "*", "@goldenwere/mackenzii-types": "*",
"@goldenwere/mackenzii-embeds": "*", "@goldenwere/mackenzii-embeds": "*",
"@primevue/themes": "4.2.5", "@primevue/themes": "4.2.5",
"@primeuix/themes": "1.0.3",
"@types/dompurify": "3.2.0", "@types/dompurify": "3.2.0",
"@types/js-yaml": "4.0.9", "@types/js-yaml": "4.0.9",
"@types/node": "22.12.0", "@types/node": "22.12.0",

View file

@ -1,6 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import PrimeVueSelect from 'primevue/select'
import type { SiteTheme } from '@goldenwere/mackenzii-types'
import { injectStylesheet } from 'src/utilities/dom' import { injectStylesheet } from 'src/utilities/dom'
import { storage } from 'src/utilities/fetch' import { storage } from 'src/utilities/fetch'
import { useRouteStore } from 'src/routes' import { useRouteStore } from 'src/routes'
@ -8,30 +11,69 @@ import { useRouteStore } from 'src/routes'
const routeStore = useRouteStore() const routeStore = useRouteStore()
const globalConfig = routeStore._globals const globalConfig = routeStore._globals
const options = ref(globalConfig.themes) const options = ref(globalConfig.themes)
const currentTheme = ref('') const optionsArray = computed(() => Object.keys(options.value).map(key => ({...options.value[key], id: key})))
const currentTheme = ref<SiteTheme & { id: string }>(null as any)
let node: HTMLLinkElement let node: HTMLLinkElement
const setModeClass = () => {
switch (currentTheme.value.type) {
case 'dark':
document.body.parentElement!.classList.add('app-dark')
document.body.parentElement!.classList.remove('app-dark-hc')
document.body.parentElement!.classList.remove('app-light')
document.body.parentElement!.classList.remove('app-light-hc')
break
case 'dark_hc':
document.body.parentElement!.classList.remove('app-dark')
document.body.parentElement!.classList.add('app-dark-hc')
document.body.parentElement!.classList.remove('app-light')
document.body.parentElement!.classList.remove('app-light-hc')
break
case 'light':
document.body.parentElement!.classList.remove('app-dark')
document.body.parentElement!.classList.remove('app-dark-hc')
document.body.parentElement!.classList.add('app-light')
document.body.parentElement!.classList.remove('app-light-hc')
break
case 'light_hc':
document.body.parentElement!.classList.remove('app-dark')
document.body.parentElement!.classList.remove('app-dark-hc')
document.body.parentElement!.classList.remove('app-light')
document.body.parentElement!.classList.add('app-light-hc')
break
default:
document.body.parentElement!.classList.remove('app-dark')
document.body.parentElement!.classList.remove('app-dark-hc')
document.body.parentElement!.classList.remove('app-light')
document.body.parentElement!.classList.remove('app-light-hc')
break
}
}
const onThemeChosen = (event: Event) => { const onThemeChosen = (event: Event) => {
storage.write(`${globalConfig.id}::currentTheme`, currentTheme.value) const themeId = currentTheme.value.id
node.setAttribute('href', globalConfig.themes[currentTheme.value].url) storage.write(`${globalConfig.id}::currentTheme`, themeId)
node.setAttribute('href', globalConfig.themes[themeId].url)
setModeClass()
} }
onMounted(async () => { onMounted(async () => {
currentTheme.value = storage.read(`${globalConfig.id}::currentTheme`) || Object.keys(globalConfig.themes)[0] const themeId = storage.read<string>(`${globalConfig.id}::currentTheme`) || Object.keys(globalConfig.themes)[0]
node = injectStylesheet(globalConfig.themes[currentTheme.value].url, 'theme-stylesheet') currentTheme.value = { ...options.value[themeId], id: themeId }
node = injectStylesheet(globalConfig.themes[themeId].url, 'theme-stylesheet')
setModeClass()
}) })
</script> </script>
<template lang="pug"> <template lang="pug">
.theme-picker .theme-picker
select( PrimeVueSelect(
v-model='currentTheme' v-model='currentTheme'
:options='optionsArray'
@change='onThemeChosen($event)' @change='onThemeChosen($event)'
optionLabel='displayName'
placeholder='theme'
) )
option(
v-for='(option, key) in options'
:value='key'
) {{ option.displayName|| option }}
</template> </template>
<style scoped lang="sass"> <style scoped lang="sass">

View file

@ -5,6 +5,8 @@ import type { HLJSApi } from 'highlight.js'
const marked = import('marked') const marked = import('marked')
import { markedHighlight } from 'marked-highlight' import { markedHighlight } from 'marked-highlight'
import PrimeVue from 'primevue/config' import PrimeVue from 'primevue/config'
import Aura from '@primevue/themes/aura'
import { definePreset } from '@primeuix/themes'
import type { RoutedWindow, SiteGlobals } from '@goldenwere/mackenzii-types' import type { RoutedWindow, SiteGlobals } from '@goldenwere/mackenzii-types'
@ -46,7 +48,31 @@ export const createApp = ViteSSG(
app app
.use(createPinia()) .use(createPinia())
.use(PrimeVue, { theme: 'none' }) .use(PrimeVue, {
theme: {
// TBA: proper theme implementation between mackenzii and primevue
preset: definePreset(Aura, {
semantic: {
primary: {
50: '{neutral.50}',
100: '{neutral.100}',
200: '{neutral.200}',
300: '{neutral.300}',
400: '{neutral.400}',
500: '{neutral.500}',
600: '{neutral.600}',
700: '{neutral.700}',
800: '{neutral.800}',
900: '{neutral.900}',
950: '{neutral.950}',
},
},
}),
options: {
darkModeSelector: '.app-dark'
}
},
})
initializeRouteStore(routes, globals as unknown as SiteGlobals) initializeRouteStore(routes, globals as unknown as SiteGlobals)
}, },
) )