@@ -7,6 +7,7 @@ import MainApp from "./MainApp";
77import WidgetWindow from "./widgets/WidgetWindow" ;
88import { useSettingsStore } from "./stores/settingsStore" ;
99import { AnnouncerProvider } from "@/components/Announcer" ;
10+ import { getSkinPalette } from "@/utils/skinPalettes" ;
1011
1112/**
1213 * Root component. Decides whether to render the main dashboard or a widget,
@@ -25,6 +26,8 @@ export default function App() {
2526 const widgetBackgroundFit = useSettingsStore ( ( s ) => s . widgetBackgroundFit ) ;
2627 const appBackgroundOverlay = useSettingsStore ( ( s ) => s . appBackgroundOverlay ) ;
2728 const widgetBackgroundOverlay = useSettingsStore ( ( s ) => s . widgetBackgroundOverlay ) ;
29+ const skinPalette = useSettingsStore ( ( s ) => s . skinPalette ) ;
30+ const [ activePalette , setActivePalette ] = useState ( skinPalette ) ;
2831 const reducedMotion = useSettingsStore ( ( s ) => s . reducedMotion ) ;
2932 const compactWidgets = useSettingsStore ( ( s ) => s . compactWidgets ) ;
3033 const [ skin , setSkin ] = useState ( {
@@ -36,6 +39,10 @@ export default function App() {
3639 widgetOverlay : widgetBackgroundOverlay ,
3740 } ) ;
3841
42+ useEffect ( ( ) => {
43+ setActivePalette ( skinPalette ) ;
44+ } , [ skinPalette ] ) ;
45+
3946 useEffect ( ( ) => {
4047 try {
4148 const label = getCurrentWebviewWindow ( ) . label ;
@@ -93,7 +100,7 @@ export default function App() {
93100
94101 useEffect ( ( ) => {
95102 let unlisten : ( ( ) => void ) | undefined ;
96- listen < Partial < typeof skin > & { appBackgroundImage ?: string ; widgetBackgroundImage ?: string } > ( "timelens-skin-changed" , ( event ) => {
103+ listen < Partial < typeof skin > & { appBackgroundImage ?: string ; widgetBackgroundImage ?: string ; skinPalette ?: typeof skinPalette } > ( "timelens-skin-changed" , ( event ) => {
97104 setSkin ( ( previous ) => ( {
98105 app : event . payload ?. app ?? event . payload ?. appBackgroundImage ?? previous . app ,
99106 widget : event . payload ?. widget ?? event . payload ?. widgetBackgroundImage ?? previous . widget ,
@@ -102,6 +109,9 @@ export default function App() {
102109 appOverlay : event . payload ?. appOverlay ?? previous . appOverlay ,
103110 widgetOverlay : event . payload ?. widgetOverlay ?? previous . widgetOverlay ,
104111 } ) ) ;
112+ if ( event . payload ?. skinPalette ) {
113+ setActivePalette ( event . payload . skinPalette ) ;
114+ }
105115 } ) . then ( ( cleanup ) => { unlisten = cleanup ; } ) . catch ( ( ) => { } ) ;
106116 return ( ) => unlisten ?.( ) ;
107117 } , [ ] ) ;
@@ -116,7 +126,19 @@ export default function App() {
116126 root . style . setProperty ( "--timelens-widget-background-fit" , skin . widgetFit === "stretch" ? "100% 100%" : skin . widgetFit ) ;
117127 root . style . setProperty ( "--timelens-app-overlay" , skin . app ? String ( skin . appOverlay / 100 ) : "0" ) ;
118128 root . style . setProperty ( "--timelens-widget-overlay" , skin . widget ? String ( skin . widgetOverlay / 100 ) : "0" ) ;
119- } , [ skin ] ) ;
129+ const palette = getSkinPalette ( activePalette ) ;
130+ const paletteVars : Record < string , string > = {
131+ "--app-bg" : palette . appBg , "--surface" : palette . surface , "--surface-light" : palette . surfaceLight ,
132+ "--surface-card" : palette . surfaceCard , "--surface-hover" : palette . surfaceHover , "--surface-border" : palette . surfaceBorder ,
133+ "--text-primary" : palette . textPrimary , "--text-secondary" : palette . textSecondary , "--text-muted" : palette . textMuted ,
134+ "--accent-blue" : palette . accentBlue , "--accent-purple" : palette . accentPurple , "--accent-teal" : palette . accentTeal ,
135+ "--accent-green" : palette . accentGreen , "--accent-red" : palette . accentRed , "--accent-orange" : palette . accentOrange ,
136+ } ;
137+ Object . entries ( paletteVars ) . forEach ( ( [ name , value ] ) => {
138+ if ( activePalette === "default" ) root . style . removeProperty ( name ) ;
139+ else root . style . setProperty ( name , value ) ;
140+ } ) ;
141+ } , [ activePalette , skin ] ) ;
120142
121143 if ( windowLabel !== "main" ) {
122144 return < WidgetWindow widgetId = { windowLabel } /> ;
0 commit comments