A:增加样式转换

This commit is contained in:
jimmy committed 2025-08-13 23:28:36 +08:00
1 parent c6b9fbc6f3
commit e54d089c57
9 files changed
+400 -23

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
这是一个Vue3项目,使用了TS和NaiveUI。
我的项目是照片管理项目的前端,使用HTTP请求来请求展示内容
+27 -5
View File
@@ -1,17 +1,39 @@
<script setup lang="ts">
import { ref } from 'vue'
import { NConfigProvider, NMessageProvider, NGlobalStyle, lightTheme } from 'naive-ui'
import { computed, onMounted } from 'vue'
import { NConfigProvider, NMessageProvider, NGlobalStyle, lightTheme, darkTheme } from 'naive-ui'
import AppLayout from '@/components/Layout/AppLayout.vue'
import { useThemeStore } from '@/stores/theme'
const theme = ref(lightTheme)
const themeStore = useThemeStore()
// Naive UI 主题跟随我们的主题状态
const naiveTheme = computed(() => {
return themeStore.isDark ? darkTheme : lightTheme
})
// 初始化主题
onMounted(() => {
themeStore.initTheme()
})
</script>
<template>
<n-config-provider :theme="theme">
<n-config-provider :theme="naiveTheme">
<n-global-style />
<n-message-provider>
<AppLayout />
<div class="app-container">
<AppLayout />
</div>
</n-message-provider>
</n-config-provider>
</template>
<style scoped>
.app-container {
min-height: 100vh;
background-color: var(--bg-color);
color: var(--text-color);
transition: background-color 0.3s ease, color 0.3s ease;
}
</style>
+87
View File
@@ -0,0 +1,87 @@
/* ú@7ÍnŒ;˜M */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
min-height: 100vh;
color: var(--text-color);
background: var(--bg-color);
transition: color 0.3s, background-color 0.3s;
line-height: 1.6;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
#app {
font-weight: normal;
color: var(--text-color);
background: var(--bg-color);
}
a {
color: var(--text-color);
text-decoration: none;
transition: color 0.3s;
}
a:hover {
opacity: 0.8;
}
/* nÝ@ ¹hý(;˜ØÏ */
.n-layout,
.n-layout-header,
.n-layout-sider,
.n-layout-content,
.n-layout-footer {
background-color: var(--bg-color) !important;
color: var(--text-color) !important;
transition: background-color 0.3s, color 0.3s;
}
/* ñr! „Ú¨a7 */
html.dark ::-webkit-scrollbar {
width: 8px;
height: 8px;
}
html.dark ::-webkit-scrollbar-track {
background: var(--bg-color-secondary);
}
html.dark ::-webkit-scrollbar-thumb {
background: var(--border-color);
border-radius: 4px;
}
html.dark ::-webkit-scrollbar-thumb:hover {
background: var(--text-color-secondary);
}
/* Er! „Ú¨a7 */
html.light ::-webkit-scrollbar {
width: 8px;
height: 8px;
}
html.light ::-webkit-scrollbar-track {
background: #f1f1f1;
}
html.light ::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 4px;
}
html.light ::-webkit-scrollbar-thumb:hover {
background: #a1a1a1;
}
+31 -7
View File
@@ -1,11 +1,7 @@
@import "base.css";
@import "var.css";
* {
margin: 0;
padding: 0;
list-style: none;
text-decoration: none;
}
@import "base.css";
@import "theme-override.css";
/* 禁止选中 */
.no-select {
user-select: none;
@@ -13,3 +9,31 @@
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+/Edge */
}
/* 全局容器样式,确保主题一致性 */
html, body {
margin: 0;
padding: 0;
background-color: var(--bg-color);
color: var(--text-color);
transition: background-color 0.3s ease, color 0.3s ease;
}
/* 确保所有文本元素都使用主题颜色 */
h1, h2, h3, h4, h5, h6, p, span, div {
color: inherit;
}
/* 输入框样式适配 */
input, textarea, select {
background-color: var(--bg-color);
color: var(--text-color);
border-color: var(--border-color);
}
/* 按钮基础样式适配 */
button {
background-color: var(--bg-color-secondary);
color: var(--text-color);
border-color: var(--border-color);
}
@@ -0,0 +1,138 @@
/* Naive UI 全局主题覆盖 */
/* 基础组件样式覆盖 */
.n-card {
background-color: var(--card-bg) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
.n-button {
color: var(--text-color) !important;
}
.n-button--quaternary {
color: var(--text-color) !important;
}
.n-button--quaternary:hover {
background-color: var(--hover-bg) !important;
}
.n-input {
background-color: var(--bg-color-secondary) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
.n-input__input-el {
background-color: transparent !important;
color: var(--text-color) !important;
}
.n-input__placeholder {
color: var(--text-color-tertiary) !important;
}
/* 菜单组件样式覆盖 */
.n-menu {
background-color: transparent !important;
color: var(--text-color) !important;
}
.n-menu-item {
color: var(--text-color) !important;
}
.n-menu-item:hover {
background-color: var(--hover-bg) !important;
}
.n-menu-item.n-menu-item--selected {
background-color: var(--hover-bg) !important;
color: var(--text-color) !important;
}
.n-menu-item-content {
color: inherit !important;
}
.n-menu-item-content__icon {
color: inherit !important;
}
/* 布局组件样式覆盖 */
.n-layout {
background-color: var(--bg-color) !important;
color: var(--text-color) !important;
}
.n-layout-header {
background-color: var(--header-bg) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
.n-layout-sider {
background-color: var(--sidebar-bg) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
.n-layout-content {
background-color: var(--content-bg) !important;
color: var(--text-color) !important;
}
.n-layout-footer {
background-color: var(--bg-color) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
/* 图标样式覆盖 */
.n-icon {
color: inherit !important;
}
/* 滚动条样式覆盖 */
.n-scrollbar-rail {
background-color: var(--bg-color-secondary) !important;
}
.n-scrollbar-rail__scrollbar {
background-color: var(--border-color) !important;
}
.n-scrollbar-rail__scrollbar:hover {
background-color: var(--text-color-secondary) !important;
}
/* 其他全局覆盖 */
html.dark .n-base-selection,
html.dark .n-base-selection-input {
background-color: var(--bg-color-secondary) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
html.dark .n-base-selection__border {
border-color: var(--border-color) !important;
}
html.dark .n-base-selection__state-border {
border-color: var(--border-color) !important;
}
/* 确保所有文本元素都继承主题颜色 */
html.dark * {
border-color: var(--border-color);
}
html.dark h1, html.dark h2, html.dark h3, html.dark h4, html.dark h5, html.dark h6 {
color: var(--text-color) !important;
}
html.dark p, html.dark span, html.dark div:not([class*="n-"]) {
color: var(--text-color);
}
+39
View File
@@ -1,3 +1,42 @@
:root {
--header-height: 64px;
}
/* 浅色主题变量 */
:root,
html.light {
--bg-color: #ffffff;
--bg-color-secondary: #f5f5f5;
--bg-color-tertiary: #fafafa;
--text-color: #333333;
--text-color-secondary: #666666;
--text-color-tertiary: #999999;
--border-color: #e0e0e6;
--border-color-light: #f0f0f0;
--shadow-color: rgba(0, 0, 0, 0.08);
--shadow-color-light: rgba(0, 0, 0, 0.04);
--header-bg: #ffffff;
--sidebar-bg: #ffffff;
--content-bg: #f5f5f5;
--card-bg: #ffffff;
--hover-bg: rgba(0, 0, 0, 0.04);
}
/* 深色主题变量 */
html.dark {
--bg-color: #1a1a1a;
--bg-color-secondary: #2d2d2d;
--bg-color-tertiary: #3a3a3a;
--text-color: #ffffff;
--text-color-secondary: #cccccc;
--text-color-tertiary: #999999;
--border-color: #3d3d3d;
--border-color-light: #4a4a4a;
--shadow-color: rgba(0, 0, 0, 0.3);
--shadow-color-light: rgba(0, 0, 0, 0.2);
--header-bg: #1a1a1a;
--sidebar-bg: #1a1a1a;
--content-bg: #2d2d2d;
--card-bg: #2d2d2d;
--hover-bg: rgba(255, 255, 255, 0.08);
}
@@ -27,9 +27,9 @@
</n-input>
</div>
<!-- 右侧预留空间(可放用户信息等) -->
<!-- 右侧工具栏 -->
<div class="header-right">
<!-- 可以添加用户头像、设置按钮等 -->
<ThemeToggle />
</div>
</div>
</n-layout-header>
@@ -71,9 +71,11 @@
</template>
<script lang="ts" setup>
import { ref, watch, computed, h } from 'vue'
import { ref, watch, computed, h, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { NMenu, NIcon } from 'naive-ui'
import ThemeToggle from '@/components/ThemeToggle.vue'
import { useThemeStore } from '@/stores/theme'
import {
ImageOutline,
SearchOutline,
@@ -91,6 +93,12 @@ import { menuOptions, type MenuOption, type MenuItem, type MenuGroup } from '@/t
const router = useRouter()
const route = useRoute()
const themeStore = useThemeStore()
// 初始化主题
onMounted(() => {
themeStore.initTheme()
})
// 图标映射
const iconMap = {
@@ -203,8 +211,9 @@ const handleMenuSelect = (key: string) => {
.layout-header {
height: var(--header-height);
padding: 0;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
box-shadow: 0 1px 4px var(--shadow-color);
z-index: 10;
background-color: var(--header-bg);
}
.header-content {
@@ -242,7 +251,7 @@ const handleMenuSelect = (key: string) => {
.site-title {
font-size: 20px;
font-weight: 600;
color: #333;
color: var(--text-color);
white-space: nowrap;
}
@@ -265,6 +274,7 @@ const handleMenuSelect = (key: string) => {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 12px;
}
.layout-body {
@@ -274,8 +284,9 @@ const handleMenuSelect = (key: string) => {
.layout-sider {
height: 100%;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);
box-shadow: 2px 0 8px var(--shadow-color);
margin-left: 7px;
background-color: var(--sidebar-bg);
}
.sidebar-menu {
@@ -287,7 +298,7 @@ const handleMenuSelect = (key: string) => {
height: 100%;
overflow: auto;
flex: 1;
background-color: #f5f5f5;
background-color: var(--content-bg);
}
.content-wrapper {
@@ -299,11 +310,11 @@ const handleMenuSelect = (key: string) => {
.content-wrapper h1 {
margin: 0 0 16px 0;
color: #333;
color: var(--text-color);
}
.content-wrapper p {
color: #666;
color: var(--text-color-secondary);
line-height: 1.6;
}
@@ -335,4 +346,57 @@ const handleMenuSelect = (key: string) => {
max-width: 200px;
}
}
/* Naive UI 组件主题深度适配 */
:deep(.n-layout) {
background-color: var(--bg-color) !important;
color: var(--text-color) !important;
}
:deep(.n-layout-header) {
background-color: var(--header-bg) !important;
color: var(--text-color) !important;
}
:deep(.n-layout-sider) {
background-color: var(--sidebar-bg) !important;
color: var(--text-color) !important;
}
:deep(.n-layout-content) {
background-color: var(--content-bg) !important;
color: var(--text-color) !important;
}
:deep(.n-menu) {
background-color: transparent !important;
}
:deep(.n-menu-item) {
color: var(--text-color) !important;
}
:deep(.n-menu-item:hover) {
background-color: var(--hover-bg) !important;
}
:deep(.n-menu-item.n-menu-item--selected) {
background-color: var(--hover-bg) !important;
color: var(--text-color) !important;
}
:deep(.n-input) {
background-color: var(--bg-color-secondary) !important;
color: var(--text-color) !important;
border-color: var(--border-color) !important;
}
:deep(.n-input__input-el) {
background-color: transparent !important;
color: var(--text-color) !important;
}
:deep(.n-input__placeholder) {
color: var(--text-color-tertiary) !important;
}
</style>
@@ -267,7 +267,7 @@ onMounted(() => {
.close-icon {
cursor: pointer;
color: #666;
color: var(--text-color-secondary);
transition: all 0.2s ease;
}
@@ -21,7 +21,7 @@
.page-title {
font-size: 24px;
font-weight: 600;
color: #333;
color: var(--text-color);
margin: 0;
}