diff --git a/app/assets/css/dark-mode.css b/app/assets/css/dark-mode.css index d51aa55..cc648f4 100644 --- a/app/assets/css/dark-mode.css +++ b/app/assets/css/dark-mode.css @@ -1,132 +1,42 @@ -/* 暗色模式 CSS 变量 */ +/* 自定义 CSS 变量(Element Plus 组件由其内置暗色模式处理) */ :root { + /* 侧边栏变量 */ --sidebar-bg: #1e293b; --sidebar-header-bg: #0f172a; --sidebar-hover-bg: #334155; --sidebar-text: #94a3b8; - --sidebar-active-text: #fff; + --sidebar-active-text: #ffffff; --sidebar-active-bg: #3b82f6; - --header-bg: #ffffff; - --header-border: #e2e8f0; - --header-text: #1e293b; - --main-bg: #f8fafc; - --main-text: #1e293b; - --footer-bg: #ffffff; - --footer-border: #e2e8f0; - --footer-text: #64748b; + + /* 通用文本变量(用于非 Element Plus 元素) */ + --el-text-color-primary: #303133; + --el-text-color-regular: #606266; + --el-text-color-secondary: #909399; + --el-border-color: #dcdfe6; + --el-bg-color: #ffffff; + --el-bg-color-page: #f2f3f5; } html.dark { + /* 侧边栏暗色变量 */ --sidebar-bg: #0f172a; --sidebar-header-bg: #020617; --sidebar-hover-bg: #1e293b; --sidebar-text: #cbd5e1; - --sidebar-active-text: #fff; + --sidebar-active-text: #ffffff; --sidebar-active-bg: #3b82f6; - --header-bg: #1e293b; - --header-border: #334155; - --header-text: #f1f5f9; - --main-bg: #0f172a; - --main-text: #f1f5f9; - --footer-bg: #1e293b; - --footer-border: #334155; - --footer-text: #cbd5e1; + + /* 通用文本暗色变量 */ + --el-text-color-primary: #e5eaf3; + --el-text-color-regular: #cfd3dc; + --el-text-color-secondary: #a3a6ad; + --el-border-color: #4c4d4f; + --el-bg-color: #141414; + --el-bg-color-page: #0a0a0a; } -/* 基础样式 */ +/* 全局基础样式 */ body { - color: var(--main-text); - background-color: var(--main-bg); -} - -/* ========== Element Plus 暗色模式全局覆盖 ========== */ - -/* 输入框、文本框、选择器 */ -html.dark .el-input__inner, -html.dark .el-textarea__inner, -html.dark .el-select .el-input__inner, -html.dark .el-cascader .el-input__inner { - color: var(--header-text) !important; - background-color: var(--header-bg) !important; - border-color: var(--header-border) !important; -} - -/* 选择器下拉项 */ -html.dark .el-select-dropdown__item { - color: var(--header-text) !important; -} - -html.dark .el-select-dropdown__item.selected { - color: var(--sidebar-active-text) !important; - background-color: var(--sidebar-active-bg) !important; -} - -html.dark .el-select-dropdown__item.hover { - background-color: var(--sidebar-hover-bg) !important; -} - -/* 表单标签 */ -html.dark .el-form-item__label { - color: var(--header-text) !important; -} - -/* 表格 */ -html.dark .el-table { - color: var(--header-text); -} - -html.dark .el-table th { - background-color: var(--header-bg); - color: var(--header-text); -} - -html.dark .el-table tr { - background-color: var(--header-bg); -} - -html.dark .el-table td { - color: var(--header-text); -} - -/* 卡片 */ -html.dark .el-card { - background-color: var(--header-bg); - color: var(--header-text); -} - -html.dark .el-card .el-card__header { - border-bottom-color: var(--header-border); -} - -/* 标签 */ -html.dark .el-tag { - background-color: var(--sidebar-bg) !important; - border-color: var(--header-border) !important; - color: var(--header-text) !important; -} - -/* 按钮文字颜色 */ -html.dark .el-button--default { - color: var(--header-text); - background-color: var(--header-bg); - border-color: var(--header-border); -} - -html.dark .el-button--primary { - background-color: var(--sidebar-active-bg) !important; - border-color: var(--sidebar-active-bg) !important; - color: #fff !important; -} - -/* 级联选择器、日期选择器等 */ -html.dark .el-cascader .el-input__inner, -html.dark .el-date-editor .el-input__inner { - color: var(--header-text) !important; - background-color: var(--header-bg) !important; - border-color: var(--header-border) !important; -} - -/* 占位符 */ -html.dark .el-input__inner::placeholder { - color: var(--footer-text) !important; + color: var(--el-text-color-primary); + background-color: var(--el-bg-color-page); } diff --git a/app/layouts/default.vue b/app/layouts/default.vue index 69ff625..9a9dbd8 100644 --- a/app/layouts/default.vue +++ b/app/layouts/default.vue @@ -211,21 +211,9 @@ const showLoginDialog = ref(false) const logging = ref(false) const loginFormRef = ref() -// 使用 VueUse 的 useDark 管理暗色模式 - SSR safe -const isDark = ref(false) -const toggleDark = ref(() => {}) - -onMounted(() => { - const dark = useDark({ - selector: 'html', - attribute: 'class', - valueDark: 'dark', - valueLight: '', - storageKey: 'theme', - }) - isDark.value = dark - toggleDark.value = useToggle(dark) -}) +// VueUse useDark - 自动添加/移除 html.dark 类,Element Plus 自动响应 +const isDark = useDark() +const toggleDark = useToggle(isDark) const collapsed = ref(false) const currentUser = ref(null) @@ -318,13 +306,13 @@ onMounted(() => { if (savedUser) { currentUser.value = JSON.parse(savedUser) } - // 主题切换由 VueUse useDark 自动处理 }) diff --git a/app/pages/admin/oauth.vue b/app/pages/admin/oauth.vue index 890c128..61b1097 100644 --- a/app/pages/admin/oauth.vue +++ b/app/pages/admin/oauth.vue @@ -305,7 +305,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -323,7 +323,7 @@ onMounted(() => { .form-tip { font-size: 12px; - color: var(--footer-text); + color: var(--el-text-color-secondary); margin-top: 4px; } @@ -334,18 +334,18 @@ onMounted(() => { .secret-display p { margin: 16px 0 8px; font-size: 14px; - color: var(--header-text); + color: var(--el-text-color-primary); } .secret-value { display: block; padding: 12px; background-color: var(--header-bg); - border: 1px solid var(--header-border); + border: 1px solid var(--el-border-color); border-radius: 4px; word-break: break-all; font-size: 13px; - color: var(--header-text); + color: var(--el-text-color-primary); } .copy-btn { @@ -356,24 +356,24 @@ onMounted(() => { /* 确保表格在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -381,7 +381,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } @media (max-width: 900px) { diff --git a/app/pages/admin/users.vue b/app/pages/admin/users.vue index c14f0ac..2671685 100644 --- a/app/pages/admin/users.vue +++ b/app/pages/admin/users.vue @@ -287,7 +287,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -298,31 +298,31 @@ onMounted(() => { .form-tip { font-size: 12px; - color: var(--footer-text); + color: var(--el-text-color-secondary); margin-top: 4px; } /* 确保表格和表单在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -330,7 +330,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } @media (max-width: 900px) { diff --git a/app/pages/checkins.vue b/app/pages/checkins.vue index 96956ba..43ea615 100644 --- a/app/pages/checkins.vue +++ b/app/pages/checkins.vue @@ -175,7 +175,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -187,24 +187,24 @@ onMounted(() => { /* 确保表格和表单在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -212,7 +212,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } @media (max-width: 900px) { diff --git a/app/pages/events.vue b/app/pages/events.vue index 0b90ba6..6cf1913 100644 --- a/app/pages/events.vue +++ b/app/pages/events.vue @@ -211,7 +211,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -223,24 +223,24 @@ onMounted(() => { /* 确保表格和表单在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -248,7 +248,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } /* Table row staggered animations */ diff --git a/app/pages/index.vue b/app/pages/index.vue index 827291a..2f6dfe7 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -153,12 +153,12 @@ onMounted(async () => { } .welcome-card h1 { - color: var(--header-text); + color: var(--el-text-color-primary); margin-bottom: 10px; } .welcome-card p { - color: var(--footer-text); + color: var(--el-text-color-secondary); font-size: 16px; } @@ -184,12 +184,12 @@ onMounted(async () => { .stat-value { font-size: 32px; font-weight: bold; - color: var(--header-text); + color: var(--el-text-color-primary); } .stat-label { font-size: 14px; - color: var(--footer-text); + color: var(--el-text-color-secondary); margin-top: 5px; } @@ -210,8 +210,8 @@ onMounted(async () => { .system-info li { padding: 8px 0; - border-bottom: 1px solid var(--header-border); - color: var(--header-text); + border-bottom: 1px solid var(--el-border-color); + color: var(--el-text-color-primary); } .system-info li:last-child { diff --git a/app/pages/results.vue b/app/pages/results.vue index 141a0c9..5be92d5 100644 --- a/app/pages/results.vue +++ b/app/pages/results.vue @@ -185,7 +185,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -197,24 +197,24 @@ onMounted(() => { /* 确保表格和表单在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -222,7 +222,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } /* Table row staggered animations */ diff --git a/app/pages/scoreboard.vue b/app/pages/scoreboard.vue index c30c413..90e3c1c 100644 --- a/app/pages/scoreboard.vue +++ b/app/pages/scoreboard.vue @@ -173,7 +173,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -185,24 +185,24 @@ onMounted(() => { /* 确保表格和表单在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -210,7 +210,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } .rank-cell { @@ -219,7 +219,7 @@ onMounted(() => { align-items: center; font-size: 18px; font-weight: bold; - color: var(--header-text); + color: var(--el-text-color-primary); } .medals { @@ -240,8 +240,8 @@ onMounted(() => { .rules-list li { padding: 8px 0; - border-bottom: 1px solid var(--header-border); - color: var(--header-text); + border-bottom: 1px solid var(--el-border-color); + color: var(--el-text-color-primary); } .rules-list li:last-child { @@ -253,8 +253,8 @@ onMounted(() => { justify-content: space-between; align-items: center; padding: 8px 0; - border-bottom: 1px solid var(--header-border); - color: var(--header-text); + border-bottom: 1px solid var(--el-border-color); + color: var(--el-text-color-primary); } .top-item:last-child { diff --git a/app/pages/teams.vue b/app/pages/teams.vue index 55897b8..15f7b87 100644 --- a/app/pages/teams.vue +++ b/app/pages/teams.vue @@ -157,7 +157,7 @@ onMounted(() => { } .card-header span { - color: var(--header-text); + color: var(--el-text-color-primary); font-size: 18px; font-weight: 600; } @@ -169,24 +169,24 @@ onMounted(() => { /* 确保表格和表单在暗色模式下文字清晰 */ :deep(.el-card) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-card .el-card__header) { - border-bottom-color: var(--header-border); + border-bottom-color: var(--el-border-color); } :deep(.el-form-item__label) { - color: var(--header-text) !important; + color: var(--el-text-color-primary) !important; } :deep(.el-table) { - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table th) { background-color: var(--header-bg); - color: var(--header-text); + color: var(--el-text-color-primary); } :deep(.el-table tr) { @@ -194,7 +194,7 @@ onMounted(() => { } :deep(.el-table td) { - color: var(--header-text); + color: var(--el-text-color-primary); } @media (max-width: 900px) { diff --git a/nuxt.config.ts b/nuxt.config.ts index 056806c..a7adc9a 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,5 +1,7 @@ export default defineNuxtConfig({ ssr: false, modules: ['@element-plus/nuxt'], - css: ['~/assets/css/dark-mode.css'] + elementPlus: { + themes: ['dark'], + }, })