flnxi-Wu/lib/ui-styles-composer.ts

234 lines
9.4 KiB
TypeScript

/**
* UI 样式组合器
* 将基础样式和颜色主题组合成完整的样式配置
*/
import * as baseStyles from './ui-styles-base'
import * as lightColors from './ui-theme-colors-light'
import * as darkColors from './ui-theme-colors-dark'
// 定义颜色主题的通用类型结构
type ColorTheme = {
card: {
border: string
bg: string
shadow: string
shadowHover: string
shadowLarge: string
shadowLargeHover: string
shadowRainbow: string
shadowRainbowHover: string
shadowGlass: string
shadowGlassHover: string
shadowNeon: string
shadowNeonHover: string
borderNeon: string
bgRainbow: string
bgGlass: string
borderGlass: string
}
button: {
primary: { bg: string; hover: string; shadow: string; shadowHover: string }
secondary: { border: string; bg: string; text: string; hover: string }
ghost: { text: string; hover: string }
danger: { bg: string; hover: string; shadow: string; shadowHover: string }
success: { bg: string; hover: string; shadow: string; shadowHover: string }
glass: { bg: string; hover: string; border: string }
}
input: {
border: string
bg: string
text: string
placeholder: string
focusRing: string
errorBorder: string
errorBg: string
errorText: string
errorPlaceholder: string
errorFocusRing: string
}
navItem: {
border: string
bg: string
text: string
hoverBg: string
hoverShadow: string
activeBg: string
activeText: string
activeShadow: string
rainbowBg: string
rainbowShadow: string
tabText: string
tabTextHover: string
tabTextActive: string
}
badge: {
primary: { bg: string; text: string }
success: { bg: string; text: string }
warning: { bg: string; text: string }
danger: { bg: string; text: string }
}
modal: {
overlay: string
bg: string
border: string
shadow: string
headerBorder: string
title: string
body: string
footerBorder: string
closeButton: string
}
toggle: {
trackBg: string
trackChecked: string
thumbBg: string
thumbBorder: string
}
accent: {
pink: { bg: string; text: string; border: string; hover: string }
purple: { bg: string; text: string; border: string; hover: string }
blue: { bg: string; text: string; border: string; hover: string }
cyan: { bg: string; text: string; border: string; hover: string }
emerald: { bg: string; text: string; border: string; hover: string }
orange: { bg: string; text: string; border: string; hover: string }
rainbow: { bg: string; text: string; border: string; hover: string }
}
}
/**
* 组合卡片样式
*/
function composeCardStyles(colors: ColorTheme) {
return {
base: `${baseStyles.baseCardStyles.base} ${colors.card.border} ${colors.card.bg} ${colors.card.shadow}`,
hover: `${baseStyles.baseCardStyles.hover} ${colors.card.border} ${colors.card.bg} ${colors.card.shadow} ${colors.card.shadowHover}`,
large: `${baseStyles.baseCardStyles.large} ${colors.card.border} ${colors.card.bg} ${colors.card.shadowLarge} ${colors.card.shadowLargeHover}`,
flat: `${baseStyles.baseCardStyles.flat} ${colors.card.border} ${colors.card.bg}`,
rainbow: `${baseStyles.baseCardStyles.rainbow} ${colors.card.border} ${colors.card.bgRainbow} ${colors.card.shadowRainbow} ${colors.card.shadowRainbowHover}`,
glass: `${baseStyles.baseCardStyles.glass} ${colors.card.bgGlass} ${colors.card.borderGlass} ${colors.card.shadowGlass} ${colors.card.shadowGlassHover}`,
neon: `${baseStyles.baseCardStyles.neon} ${colors.card.borderNeon} ${colors.card.bg} ${colors.card.shadowNeon} ${colors.card.shadowNeonHover}`,
} as const
}
/**
* 组合按钮样式
*/
function composeButtonStyles(colors: ColorTheme) {
return {
primary: `${baseStyles.baseButtonStyles.primary} ${colors.button.primary.bg} ${colors.button.primary.hover} ${colors.button.primary.shadow} ${colors.button.primary.shadowHover}`,
secondary: `${baseStyles.baseButtonStyles.secondary} ${colors.button.secondary.border} ${colors.button.secondary.bg} ${colors.button.secondary.text} ${colors.button.secondary.hover} hover:border-slate-400 dark:hover:border-slate-500`,
ghost: `${baseStyles.baseButtonStyles.ghost} ${colors.button.ghost.text} ${colors.button.ghost.hover}`,
danger: `${baseStyles.baseButtonStyles.danger} ${colors.button.danger.bg} ${colors.button.danger.hover} ${colors.button.danger.shadow} ${colors.button.danger.shadowHover}`,
success: `${baseStyles.baseButtonStyles.success} ${colors.button.success.bg} ${colors.button.success.hover} ${colors.button.success.shadow} ${colors.button.success.shadowHover}`,
rainbow: baseStyles.baseButtonStyles.rainbow, // 渐变按钮颜色固定(标准尺寸)
rainbowCompact: baseStyles.baseButtonStyles.rainbowCompact, // 渐变按钮颜色固定(紧凑尺寸,用于角标)
neon: baseStyles.baseButtonStyles.neon, // 霓虹按钮颜色固定
glass: `${baseStyles.baseButtonStyles.glass} ${colors.button.glass.bg} ${colors.button.glass.hover} ${colors.button.glass.border}`,
} as const
}
/**
* 组合输入框样式
*/
function composeInputStyles(colors: ColorTheme) {
return {
base: `${baseStyles.baseInputStyles.base} ${colors.input.border} ${colors.input.bg} ${colors.input.text} ${colors.input.placeholder} ${colors.input.focusRing} focus:border-slate-500 dark:focus:border-slate-300`,
error: `${baseStyles.baseInputStyles.error} ${colors.input.errorBorder} ${colors.input.errorBg} ${colors.input.errorText} ${colors.input.errorPlaceholder} ${colors.input.errorFocusRing}`,
} as const
}
/**
* 组合导航项样式
*/
function composeNavItemStyles(colors: ColorTheme) {
return {
base: `${baseStyles.baseNavItemStyles.base} ${colors.navItem.border} ${colors.navItem.bg} ${colors.navItem.text}`,
hover: `${baseStyles.baseNavItemStyles.hover} ${colors.navItem.border} ${colors.navItem.bg} ${colors.navItem.hoverBg} ${colors.navItem.hoverShadow} ${colors.navItem.text} hover:border-slate-400 dark:hover:border-slate-500`,
active: `${baseStyles.baseNavItemStyles.active} ${colors.navItem.activeBg} ${colors.navItem.activeText} ${colors.navItem.activeShadow} border-slate-900 dark:border-slate-100`,
rainbow: `${baseStyles.baseNavItemStyles.rainbow} ${colors.navItem.border} ${colors.navItem.rainbowBg} ${colors.navItem.rainbowShadow} ${colors.navItem.text}`,
tabBase: `${baseStyles.baseNavItemStyles.tabBase} ${colors.navItem.tabText} ${colors.navItem.tabTextHover}`,
tabActive: `${baseStyles.baseNavItemStyles.tabActive} ${colors.navItem.tabTextActive}`,
} as const
}
/**
* 组合徽章样式
*/
function composeBadgeStyles(colors: ColorTheme) {
return {
base: baseStyles.baseBadgeStyles.base,
primary: `${baseStyles.baseBadgeStyles.primary} ${colors.badge.primary.bg} ${colors.badge.primary.text}`,
success: `${baseStyles.baseBadgeStyles.success} ${colors.badge.success.bg} ${colors.badge.success.text}`,
warning: `${baseStyles.baseBadgeStyles.warning} ${colors.badge.warning.bg} ${colors.badge.warning.text}`,
danger: `${baseStyles.baseBadgeStyles.danger} ${colors.badge.danger.bg} ${colors.badge.danger.text}`,
} as const
}
/**
* 组合Modal样式
*/
function composeModalStyles(colors: ColorTheme) {
return {
overlay: `${baseStyles.baseModalStyles.overlay} ${colors.modal.overlay}`,
container: baseStyles.baseModalStyles.container,
content: `${baseStyles.baseModalStyles.content} ${colors.modal.bg} ${colors.modal.border} ${colors.modal.shadow}`,
sizes: baseStyles.baseModalStyles.sizes,
header: `${baseStyles.baseModalStyles.header} ${colors.modal.headerBorder}`,
title: `${baseStyles.baseModalStyles.title} ${colors.modal.title}`,
closeButton: `${baseStyles.baseModalStyles.closeButton} ${colors.modal.closeButton}`,
body: `${baseStyles.baseModalStyles.body} ${colors.modal.body}`,
footer: `${baseStyles.baseModalStyles.footer} ${colors.modal.footerBorder}`,
} as const
}
/**
* 组合低饱和度炫彩元素样式
*/
function composeAccentStyles(colors: ColorTheme) {
return {
pink: colors.accent.pink,
purple: colors.accent.purple,
blue: colors.accent.blue,
cyan: colors.accent.cyan,
emerald: colors.accent.emerald,
orange: colors.accent.orange,
rainbow: colors.accent.rainbow,
} as const
}
/**
* 组合开关切换器样式
*/
function composeToggleStyles(colors: ColorTheme) {
return {
container: baseStyles.baseToggleStyles.container,
track: `${baseStyles.baseToggleStyles.track} ${colors.toggle.trackBg} ${colors.toggle.trackChecked} ${colors.toggle.thumbBg} ${colors.toggle.thumbBorder}`,
input: baseStyles.baseToggleStyles.input,
} as const
}
/**
* 组合完整的样式配置
*/
export function composeThemeStyles(colors: ColorTheme) {
return {
cardStyles: composeCardStyles(colors),
buttonStyles: composeButtonStyles(colors),
buttonModifiers: baseStyles.baseButtonModifiers,
inputStyles: composeInputStyles(colors),
inputModifiers: baseStyles.baseInputModifiers,
navItemStyles: composeNavItemStyles(colors),
badgeStyles: composeBadgeStyles(colors),
modalStyles: composeModalStyles(colors),
toggleStyles: composeToggleStyles(colors),
accentStyles: composeAccentStyles(colors),
spacingStyles: baseStyles.baseSpacingStyles,
} as const
}
// 导出浅色和深色主题的完整样式
export const lightThemeStyles = composeThemeStyles(lightColors.themeColors)
export const darkThemeStyles = composeThemeStyles(darkColors.themeColors)