ruoyi-plus-vben5/packages/effects/layouts/src/widgets/theme-toggle/theme-toggle.vue

83 lines
1.7 KiB
Vue
Raw Normal View History

2024-05-19 21:20:42 +08:00
<script lang="ts" setup>
import type { ThemeModeType } from '@vben/types';
import { MoonStar, Sun, SunMoon } from '@vben/icons';
import { $t } from '@vben/locales';
2024-06-01 23:15:29 +08:00
import {
2024-06-09 12:53:38 +08:00
preferences,
2024-06-01 23:15:29 +08:00
updatePreferences,
usePreferences,
} from '@vben/preferences';
2024-05-19 21:20:42 +08:00
import {
ToggleGroup,
ToggleGroupItem,
VbenTooltip,
} from '@vben-core/shadcn-ui';
import ThemeButton from './theme-button.vue';
defineOptions({
name: 'ThemeToggle',
});
withDefaults(defineProps<{ shouldOnHover?: boolean }>(), {
shouldOnHover: false,
});
function handleChange(isDark: boolean | undefined) {
2024-06-01 23:15:29 +08:00
updatePreferences({
2024-06-23 19:17:31 +08:00
theme: { mode: isDark ? 'dark' : 'light' },
2024-06-01 23:15:29 +08:00
});
2024-05-19 21:20:42 +08:00
}
2024-06-01 23:15:29 +08:00
const { isDark } = usePreferences();
2024-05-19 21:20:42 +08:00
const PRESETS = [
{
icon: Sun,
2024-05-19 21:20:42 +08:00
name: 'light',
2024-06-29 15:41:10 +08:00
title: $t('preferences.theme.light'),
2024-05-19 21:20:42 +08:00
},
{
icon: MoonStar,
2024-05-19 21:20:42 +08:00
name: 'dark',
2024-06-29 15:41:10 +08:00
title: $t('preferences.theme.dark'),
2024-05-19 21:20:42 +08:00
},
{
icon: SunMoon,
2024-05-19 21:20:42 +08:00
name: 'auto',
title: $t('preferences.followSystem'),
2024-05-19 21:20:42 +08:00
},
];
</script>
<template>
<div>
2024-06-09 13:31:43 +08:00
<VbenTooltip :disabled="!shouldOnHover" side="bottom">
2024-05-19 21:20:42 +08:00
<template #trigger>
<ThemeButton
:model-value="isDark"
type="icon"
@update:model-value="handleChange"
/>
</template>
<ToggleGroup
2024-06-23 19:17:31 +08:00
:model-value="preferences.theme.mode"
2024-06-09 13:31:43 +08:00
class="gap-2"
2024-05-19 21:20:42 +08:00
type="single"
variant="outline"
2024-06-09 12:53:38 +08:00
@update:model-value="
2024-06-23 19:17:31 +08:00
(val) => updatePreferences({ theme: { mode: val as ThemeModeType } })
2024-06-09 12:53:38 +08:00
"
2024-05-19 21:20:42 +08:00
>
<ToggleGroupItem
v-for="item in PRESETS"
:key="item.name"
:value="item.name"
>
<component :is="item.icon" class="size-5" />
</ToggleGroupItem>
</ToggleGroup>
</VbenTooltip>
</div>
</template>