Some checks failed
Build Multi-Platform Binaries / build-frontend (push) Failing after 16s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Has been skipped
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Has been skipped
- 集成主题切换功能,支持浅色、深色和自动模式 - 添加SunnyOutline、MoonOutline、ContrastOutline图标用于主题选择 - 创建主题下拉菜单组件,允许用户切换不同主题模式 - 重构CSS样式使用CSS变量替代硬编码颜色值 - 优化导航栏、用户菜单、客户端卡片等组件的视觉效果 - 调整头部高度从60px到56px,修改品牌文字样式 - 更新按钮、下拉菜单、模态框等交互元素的样式 - 在客户端视图中添加心跳指示器显示连接状态 - 实现客户端页面数据自动轮询刷新功能 - 优化版本号显示逻辑,确保始终以v开头显示 - 修复更新检查按钮只在有可用更新时才显示的问题
48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
import { ref, watch, onMounted } from 'vue'
|
|
|
|
export type ThemeMode = 'light' | 'dark' | 'auto'
|
|
|
|
const STORAGE_KEY = 'gotunnel-theme'
|
|
|
|
const themeMode = ref<ThemeMode>('auto')
|
|
|
|
function getSystemTheme(): 'light' | 'dark' {
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
|
|
}
|
|
|
|
function applyTheme(mode: ThemeMode) {
|
|
const theme = mode === 'auto' ? getSystemTheme() : mode
|
|
document.documentElement.setAttribute('data-theme', theme)
|
|
}
|
|
|
|
export function useTheme() {
|
|
onMounted(() => {
|
|
const saved = localStorage.getItem(STORAGE_KEY) as ThemeMode | null
|
|
if (saved && ['light', 'dark', 'auto'].includes(saved)) {
|
|
themeMode.value = saved
|
|
}
|
|
applyTheme(themeMode.value)
|
|
|
|
// 监听系统主题变化
|
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
|
if (themeMode.value === 'auto') {
|
|
applyTheme('auto')
|
|
}
|
|
})
|
|
})
|
|
|
|
watch(themeMode, (mode) => {
|
|
localStorage.setItem(STORAGE_KEY, mode)
|
|
applyTheme(mode)
|
|
})
|
|
|
|
const setTheme = (mode: ThemeMode) => {
|
|
themeMode.value = mode
|
|
}
|
|
|
|
return {
|
|
themeMode,
|
|
setTheme
|
|
}
|
|
}
|