Skip to content

Commit 605173a

Browse files
Azir-11honghuangdc
authored andcommitted
feat(projects): support theme perset to override component library presets.
1 parent 73e9a0f commit 605173a

File tree

5 files changed

+49
-8
lines changed

5 files changed

+49
-8
lines changed

src/layouts/modules/theme-drawer/modules/preset/modules/theme-preset.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ type ThemePreset = Pick<
3333
desc: string;
3434
i18nkey?: string;
3535
version: string;
36+
/** Optional NaiveUI theme overrides */
37+
naiveui?: App.Theme.NaiveUIThemeOverride;
3638
};
3739
3840
const presetModules = import.meta.glob('@/theme/preset/*.json', { eager: true, import: 'default' });
@@ -80,7 +82,7 @@ const getPresetDesc = (preset: ThemePreset): string => {
8082
8183
const applyPreset = (preset: ThemePreset): void => {
8284
const mergedPreset = defu(preset, themeSettings);
83-
const { themeScheme, grayscale, colourWeakness, layout, watermark, ...rest } = mergedPreset;
85+
const { themeScheme, grayscale, colourWeakness, layout, watermark, naiveui, ...rest } = mergedPreset;
8486
themeStore.setThemeScheme(themeScheme);
8587
themeStore.setGrayscale(grayscale);
8688
themeStore.setColourWeakness(colourWeakness);
@@ -100,6 +102,9 @@ const applyPreset = (preset: ThemePreset): void => {
100102
tokens: { ...rest.tokens }
101103
});
102104
105+
// Apply NaiveUI theme overrides if present
106+
themeStore.setNaiveThemeOverrides(naiveui);
107+
103108
window.$message?.success($t('theme.appearance.preset.applySuccess'));
104109
};
105110
</script>

src/store/modules/theme/index.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
2424
/** Theme settings */
2525
const settings: Ref<App.Theme.ThemeSetting> = ref(initThemeSettings());
2626

27+
/** Optional NaiveUI theme overrides from preset */
28+
const naiveThemeOverrides: Ref<App.Theme.NaiveUIThemeOverride | undefined> = ref(undefined);
29+
2730
/** Watermark time instance with controls */
2831
const { now: watermarkTime, pause: pauseWatermarkTime, resume: resumeWatermarkTime } = useNow({ controls: true });
2932

@@ -53,7 +56,7 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
5356
});
5457

5558
/** Naive theme */
56-
const naiveTheme = computed(() => getNaiveTheme(themeColors.value, settings.value));
59+
const naiveTheme = computed(() => getNaiveTheme(themeColors.value, settings.value, naiveThemeOverrides.value));
5760

5861
/**
5962
* Settings json
@@ -198,6 +201,15 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
198201
}
199202
}
200203

204+
/**
205+
* Set NaiveUI theme overrides
206+
*
207+
* @param overrides NaiveUI theme overrides or undefined to clear
208+
*/
209+
function setNaiveThemeOverrides(overrides?: App.Theme.NaiveUIThemeOverride) {
210+
naiveThemeOverrides.value = overrides;
211+
}
212+
201213
/** Only run timer when watermark is visible and time display is enabled */
202214
function updateWatermarkTimer() {
203215
const { watermark } = settings.value;
@@ -284,6 +296,7 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
284296
updateThemeColors,
285297
setThemeLayout,
286298
setWatermarkEnableUserName,
287-
setWatermarkEnableTime
299+
setWatermarkEnableTime,
300+
setNaiveThemeOverrides
288301
};
289302
});

src/store/modules/theme/shared.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,15 @@ function getNaiveThemeColors(colors: App.Theme.ThemeColor, recommended = false)
236236
/**
237237
* Get naive theme
238238
*
239-
* @param settings Theme settings object.
240-
* @param settings.recommendColor Whether to use recommended color palette.
241-
* @param settings.themeRadius Border radius to use in the theme (in px).
239+
* @param colors Theme colors
240+
* @param settings Theme settings object
241+
* @param overrides Optional manual overrides from preset
242242
*/
243-
export function getNaiveTheme(colors: App.Theme.ThemeColor, settings: App.Theme.ThemeSetting) {
243+
export function getNaiveTheme(
244+
colors: App.Theme.ThemeColor,
245+
settings: App.Theme.ThemeSetting,
246+
overrides?: GlobalThemeOverrides
247+
) {
244248
const { primary: colorLoading } = colors;
245249

246250
const theme: GlobalThemeOverrides = {
@@ -256,5 +260,7 @@ export function getNaiveTheme(colors: App.Theme.ThemeColor, settings: App.Theme.
256260
}
257261
};
258262

259-
return theme;
263+
// If there are overrides, merge them with priority
264+
// overrides has higher priority than auto-generated theme
265+
return overrides ? defu(overrides, theme) : theme;
260266
}

src/theme/preset/azir.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,19 @@
3434
"base-text": "rgb(224, 224, 224)"
3535
}
3636
}
37+
},
38+
"naiveui": {
39+
"Alert": {
40+
"borderRadiusMedium": "12px",
41+
"fontWeightStrong": "600",
42+
"paddingMedium": "0 20px"
43+
},
44+
"Card": {
45+
"borderRadius": "16px",
46+
"paddingMedium": "24px"
47+
},
48+
"Input": {
49+
"borderRadius": "10px"
50+
}
3751
}
3852
}

src/typings/app.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ declare namespace App {
44
namespace Theme {
55
type ColorPaletteNumber = import('@sa/color').ColorPaletteNumber;
66

7+
/** NaiveUI theme overrides that can be specified in preset */
8+
type NaiveUIThemeOverride = import('naive-ui').GlobalThemeOverrides;
9+
710
/** Theme setting */
811
interface ThemeSetting {
912
/** Theme scheme */

0 commit comments

Comments
 (0)