From 59a87c0e11e5fba74c3a6612d0c3331b73bd96af Mon Sep 17 00:00:00 2001 From: miteruzo Date: Mon, 6 Jul 2026 21:17:39 +0900 Subject: [PATCH] #34 --- frontend/src/lib/settings.ts | 79 ++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/settings.ts b/frontend/src/lib/settings.ts index c860406..3714bcf 100644 --- a/frontend/src/lib/settings.ts +++ b/frontend/src/lib/settings.ts @@ -905,7 +905,7 @@ const normaliseThemeTokenValue = ( typeof value === 'string' && value !== '' ? value : fallback -const normaliseTopNavColourValue = ( +const cssColourFromThemeToken = ( value: unknown, fallback: string, ): string => { @@ -1068,6 +1068,10 @@ export const buildThemeTokens = ( ?? legacyTopNavTokens.topNavLink, fallback.topNavBrandLink, ) + const topNavMenuLink = cssColourFromThemeToken ( + link, + fallback.topNavMenuLink, + ) const resolvedTopNav = deriveTopNavTokens ( baseTheme, { @@ -1076,7 +1080,7 @@ export const buildThemeTokens = ( activeBackground: topNavActiveBackground, brandLink: topNavBrandLink, }, - link, + topNavMenuLink, ) return { @@ -1116,11 +1120,80 @@ export const buildThemeTokens = ( } +const normaliseTopNavColourValue = ( + value: unknown, + fallback: string, +): string => { + return cssColourFromThemeToken (value, fallback) +} + + const normaliseThemeTokens = ( rawTokens: unknown, baseTheme: BuiltinThemeId, ): ThemeTokens => { - return buildThemeTokens (baseTheme, rawTokens) + const fallback = baseTheme === 'dark' ? DARK_THEME_TOKENS : LIGHT_THEME_TOKENS + const tokens = + rawTokens && typeof rawTokens === 'object' + ? rawTokens as Partial + : { } + const legacyTopNavTokens = + rawTokens && typeof rawTokens === 'object' + ? rawTokens as Record + : { } + + const background = + normaliseThemeTokenValue (tokens.background, fallback.background) + const foreground = + normaliseThemeTokenValue (tokens.foreground, fallback.foreground) + const card = + normaliseThemeTokenValue (tokens.card, fallback.card) + const muted = + normaliseThemeTokenValue (tokens.muted, fallback.muted) + const primary = + normaliseThemeTokenValue (tokens.primary, fallback.primary) + const accent = + normaliseThemeTokenValue (tokens.accent, fallback.accent) + const border = + normaliseThemeTokenValue (tokens.border, fallback.border) + const link = + normaliseThemeTokenValue (tokens.link, fallback.link) + + return buildThemeTokens ( + baseTheme, + { + ...tokens, + background, + foreground, + card, + muted, + primary, + accent, + border, + link, + topNavRootBackgroundMobile: + tokens.topNavRootBackgroundMobile + ?? legacyTopNavTokens.topNavRootBackgroundMobile + ?? legacyTopNavTokens.topNavBackground, + topNavRootBackgroundDesktop: + tokens.topNavRootBackgroundDesktop + ?? legacyTopNavTokens.topNavRootBackgroundDesktop + ?? legacyTopNavTokens.topNavBackground, + topNavActiveBackground: + tokens.topNavActiveBackground + ?? legacyTopNavTokens.topNavActiveBackground + ?? legacyTopNavTokens.topNavHighlightBackground, + topNavBrandLink: + tokens.topNavBrandLink + ?? legacyTopNavTokens.topNavBrandLink + ?? legacyTopNavTokens.topNavLink, + topNavMenuLink: + tokens.topNavMenuLink + ?? legacyTopNavTokens.topNavMenuLink + ?? link, + tagColours: normaliseThemeTagColours (tokens.tagColours, fallback.tagColours), + }, + ) }