优化
This commit is contained in:
@@ -1,16 +1,151 @@
|
||||
<script setup>
|
||||
import { RouterView } from 'vue-router'
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { theme } from 'ant-design-vue'
|
||||
import { ref, computed, watchEffect } from 'vue'
|
||||
import SvgSprite from '@/components/icons/SvgSprite.vue'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
import tokenManager from '@gold/utils/token-manager'
|
||||
import zhCN from 'ant-design-vue/es/locale/zh_CN';
|
||||
const themeToken = ref({
|
||||
import zhCN from 'ant-design-vue/es/locale/zh_CN'
|
||||
|
||||
// ========================================
|
||||
// Ant Design Vue 主题配置
|
||||
// ========================================
|
||||
const isDark = ref(false)
|
||||
|
||||
// 初始化主题
|
||||
const initTheme = () => {
|
||||
const stored = localStorage.getItem('theme')
|
||||
if (stored) {
|
||||
isDark.value = stored === 'dark'
|
||||
} else {
|
||||
isDark.value = window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
}
|
||||
document.documentElement.setAttribute('data-theme', isDark.value ? 'dark' : 'light')
|
||||
}
|
||||
|
||||
// 主题切换
|
||||
const toggleTheme = () => {
|
||||
isDark.value = !isDark.value
|
||||
document.documentElement.setAttribute('data-theme', isDark.value ? 'dark' : 'light')
|
||||
localStorage.setItem('theme', isDark.value ? 'dark' : 'light')
|
||||
}
|
||||
|
||||
// Ant Design 主题 Token
|
||||
const themeToken = computed(() => {
|
||||
const lightToken = {
|
||||
// 品牌色
|
||||
colorPrimary: '#3B82F6',
|
||||
colorSuccess: '#22C55E',
|
||||
colorWarning: '#F59E0B',
|
||||
colorError: '#EF4444',
|
||||
colorInfo: '#3B82F6',
|
||||
// 背景色
|
||||
colorBgContainer: '#FFFFFF',
|
||||
colorBgElevated: '#FFFFFF',
|
||||
colorBgLayout: '#F9FAFB',
|
||||
// 边框
|
||||
colorBorder: '#E5E7EB',
|
||||
colorBorderSecondary: '#F3F4F6',
|
||||
// 文字
|
||||
colorText: '#111827',
|
||||
colorTextSecondary: '#4B5563',
|
||||
colorTextTertiary: '#6B7280',
|
||||
colorTextQuaternary: '#9CA3AF',
|
||||
// 填充
|
||||
colorFill: '#F3F4F6',
|
||||
colorFillSecondary: '#F9FAFB',
|
||||
// 字体
|
||||
fontFamily: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif',
|
||||
fontSize: 14,
|
||||
// 圆角
|
||||
borderRadius: 6,
|
||||
borderRadiusSM: 4,
|
||||
borderRadiusLG: 8,
|
||||
// 控件尺寸
|
||||
controlHeight: 32,
|
||||
controlHeightSM: 28,
|
||||
controlHeightLG: 40,
|
||||
// 动画
|
||||
motionDurationFast: '0.15s',
|
||||
motionDurationMid: '0.2s',
|
||||
motionDurationSlow: '0.3s',
|
||||
// 阴影
|
||||
boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)',
|
||||
boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',
|
||||
}
|
||||
|
||||
const darkToken = {
|
||||
colorPrimary: '#60A5FA',
|
||||
colorBgContainer: '#1E293B',
|
||||
colorBgElevated: '#334155',
|
||||
colorBgLayout: '#0F172A',
|
||||
colorBorder: '#334155',
|
||||
colorBorderSecondary: '#1E293B',
|
||||
colorText: '#F1F5F9',
|
||||
colorTextSecondary: '#94A3B8',
|
||||
colorTextTertiary: '#64748B',
|
||||
colorTextQuaternary: '#475569',
|
||||
colorFill: '#334155',
|
||||
colorFillSecondary: '#1E293B',
|
||||
boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.4), 0 1px 2px -1px rgba(0, 0, 0, 0.4)',
|
||||
boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.4)',
|
||||
}
|
||||
|
||||
return {
|
||||
token: isDark.value ? { ...lightToken, ...darkToken } : lightToken,
|
||||
components: {
|
||||
Button: {
|
||||
primaryShadow: 'none',
|
||||
defaultShadow: 'none',
|
||||
fontWeight: 500,
|
||||
},
|
||||
Input: {
|
||||
paddingBlock: 6,
|
||||
paddingInline: 12,
|
||||
activeShadow: '0 0 0 3px rgba(59, 130, 246, 0.15)',
|
||||
},
|
||||
Select: {
|
||||
optionSelectedBg: isDark.value ? 'rgba(96, 165, 250, 0.15)' : '#EFF6FF',
|
||||
optionActiveBg: isDark.value ? '#334155' : '#F3F4F6',
|
||||
},
|
||||
Table: {
|
||||
headerBg: isDark.value ? '#1E293B' : '#F9FAFB',
|
||||
rowHoverBg: isDark.value ? '#334155' : '#F9FAFB',
|
||||
borderColor: isDark.value ? '#334155' : '#E5E7EB',
|
||||
headerColor: '#4B5563',
|
||||
},
|
||||
Card: {
|
||||
paddingLG: 20,
|
||||
borderRadiusLG: 12,
|
||||
},
|
||||
Modal: {
|
||||
borderRadiusLG: 12,
|
||||
},
|
||||
Menu: {
|
||||
itemHoverBg: isDark.value ? '#334155' : '#F3F4F6',
|
||||
itemSelectedBg: isDark.value ? 'rgba(96, 165, 250, 0.15)' : '#EFF6FF',
|
||||
itemSelectedColor: isDark.value ? '#60A5FA' : '#3B82F6',
|
||||
},
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
onMounted(async () => {})
|
||||
// 初始化
|
||||
initTheme()
|
||||
|
||||
// 监听系统主题变化
|
||||
watchEffect(() => {
|
||||
const media = window.matchMedia('(prefers-color-scheme: dark)')
|
||||
const handler = (e) => {
|
||||
if (!localStorage.getItem('theme')) {
|
||||
isDark.value = e.matches
|
||||
document.documentElement.setAttribute('data-theme', e.matches ? 'dark' : 'light')
|
||||
}
|
||||
}
|
||||
media.addEventListener('change', handler)
|
||||
})
|
||||
|
||||
// 暴露给模板使用
|
||||
defineExpose({ toggleTheme, isDark })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -1,139 +1,179 @@
|
||||
@import "tailwindcss";
|
||||
|
||||
/* ================================
|
||||
模块化CSS设计系统
|
||||
Yudao Cloud B端设计系统
|
||||
Design System v1.0
|
||||
================================ */
|
||||
|
||||
/* ================================
|
||||
1. 设计令牌 (Design Tokens)
|
||||
================================ */
|
||||
:root {
|
||||
/* 主色系 - Slate(石板色) */
|
||||
--color-slate-50: #f8fafc;
|
||||
--color-slate-100: #f1f5f9;
|
||||
--color-slate-200: #e2e8f0;
|
||||
--color-slate-300: #cbd5e1;
|
||||
--color-slate-400: #94a3b8;
|
||||
--color-slate-500: #64748b;
|
||||
--color-slate-600: #475569;
|
||||
--color-slate-700: #334155;
|
||||
--color-slate-800: #1e293b;
|
||||
--color-slate-900: #0f172a;
|
||||
// ========================================
|
||||
// 品牌主色 - 科技蓝
|
||||
// ========================================
|
||||
--color-primary-50: #EFF6FF;
|
||||
--color-primary-100: #DBEAFE;
|
||||
--color-primary-200: #BFDBFE;
|
||||
--color-primary-300: #93C5FD;
|
||||
--color-primary-400: #60A5FA;
|
||||
--color-primary-500: #3B82F6;
|
||||
--color-primary-600: #2563EB;
|
||||
--color-primary-700: #1D4ED8;
|
||||
|
||||
/* 强调色 - Blue(蓝色) */
|
||||
--color-blue-400: #60a5fa;
|
||||
--color-blue-500: #3b82f6;
|
||||
--color-blue-600: #2563eb;
|
||||
--color-blue-700: #1d4ed8;
|
||||
|
||||
/* 辅助色 - Indigo(靛蓝) */
|
||||
--color-indigo-50: #eef2ff;
|
||||
--color-indigo-100: #e0e7ff;
|
||||
--color-indigo-500: #6366f1;
|
||||
--color-indigo-600: #4f46e5;
|
||||
--color-indigo-700: #4338ca;
|
||||
--color-indigo-800: #3730a3;
|
||||
--color-indigo-900: #312e81;
|
||||
|
||||
/* 功能色 */
|
||||
--color-green-500: #10b981;
|
||||
--color-yellow-400: #facc15;
|
||||
--color-yellow-500: #eab308;
|
||||
--color-red-500: #ef4444;
|
||||
--color-red-800: #991b1b;
|
||||
|
||||
/* 中性色 */
|
||||
--color-gray-100: #f3f4f6;
|
||||
--color-gray-300: #d1d5db;
|
||||
--color-gray-400: #9ca3af;
|
||||
// ========================================
|
||||
// 中性灰
|
||||
// ========================================
|
||||
--color-gray-50: #F9FAFB;
|
||||
--color-gray-100: #F3F4F6;
|
||||
--color-gray-200: #E5E7EB;
|
||||
--color-gray-300: #D1D5DB;
|
||||
--color-gray-400: #9CA3AF;
|
||||
--color-gray-500: #6B7280;
|
||||
--color-gray-600: #4B5563;
|
||||
--color-gray-700: #374151;
|
||||
--color-gray-800: #1F2937;
|
||||
--color-gray-900: #111827;
|
||||
|
||||
/* 主题设计令牌 - 现代化风格 */
|
||||
--color-bg: var(--color-slate-50);
|
||||
--color-surface: #ffffff;
|
||||
--color-header: var(--color-slate-900);
|
||||
--color-text: var(--color-slate-700);
|
||||
--color-text-secondary: var(--color-slate-500);
|
||||
--color-text-inverse: #ffffff;
|
||||
--color-border: var(--color-slate-200);
|
||||
--color-border-focus: var(--color-blue-500);
|
||||
--color-border-selected: var(--color-indigo-500);
|
||||
--color-primary: var(--color-blue-500);
|
||||
--color-primary-hover: var(--color-blue-600);
|
||||
// ========================================
|
||||
// 功能色
|
||||
// ========================================
|
||||
--color-success-50: #DCFCE7;
|
||||
--color-success-500: #22C55E;
|
||||
--color-success-600: #16A34A;
|
||||
|
||||
/* 新增:现代化的功能色 */
|
||||
--color-success: #10b981;
|
||||
--color-success-bg: #ecfdf5;
|
||||
--color-warning: #f59e0b;
|
||||
--color-warning-bg: #fffbeb;
|
||||
--color-error: #ef4444;
|
||||
--color-error-bg: #fef2f2;
|
||||
--color-warning-50: #FEF3C7;
|
||||
--color-warning-500: #F59E0B;
|
||||
--color-warning-600: #D97706;
|
||||
|
||||
/* 新增:Ant Design Vue 主题覆盖 */
|
||||
--ant-primary-color: var(--color-primary);
|
||||
--ant-primary-color-hover: var(--color-primary-hover);
|
||||
--ant-primary-color-active: var(--color-blue-700);
|
||||
--ant-success-color: var(--color-success);
|
||||
--ant-warning-color: var(--color-warning);
|
||||
--ant-error-color: var(--color-error);
|
||||
--ant-border-radius-base: var(--radius-button);
|
||||
--ant-border-radius-sm: 4px;
|
||||
--color-error-50: #FEE2E2;
|
||||
--color-error-500: #EF4444;
|
||||
--color-error-600: #DC2626;
|
||||
|
||||
/* 尺寸系统 */
|
||||
--radius-card: 12px;
|
||||
--radius-button: 8px;
|
||||
--radius-tag: 4px;
|
||||
--color-info-50: #DBEAFE;
|
||||
--color-info-500: #3B82F6;
|
||||
--color-info-600: #2563EB;
|
||||
|
||||
/* 阴影系统 */
|
||||
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
||||
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
|
||||
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
|
||||
--shadow-blue: 0 10px 15px -3px rgb(59 130 246 / 0.2);
|
||||
// ========================================
|
||||
// 语义化颜色 (兼容旧变量)
|
||||
// ========================================
|
||||
--color-bg: var(--color-gray-50);
|
||||
--color-bg-page: var(--color-gray-50);
|
||||
--color-bg-card: #FFFFFF;
|
||||
--color-surface: #FFFFFF;
|
||||
|
||||
/* 间距系统 */
|
||||
--space-0-5: 2px;
|
||||
--space-1: 4px;
|
||||
--space-2: 8px;
|
||||
--space-3: 12px;
|
||||
--space-4: 16px;
|
||||
--space-5: 20px;
|
||||
--space-6: 24px;
|
||||
--space-8: 32px;
|
||||
--color-text: var(--color-gray-900);
|
||||
--color-text-primary: var(--color-gray-900);
|
||||
--color-text-secondary: var(--color-gray-600);
|
||||
--color-text-muted: var(--color-gray-500);
|
||||
--color-text-disabled: var(--color-gray-400);
|
||||
--color-text-inverse: #FFFFFF;
|
||||
|
||||
/* ================================
|
||||
Notion 风格设计变量
|
||||
================================ */
|
||||
/* 极简配色 */
|
||||
--bg-primary: #ffffff;
|
||||
--bg-secondary: #fafafa;
|
||||
--bg-hover: #f7f6f3;
|
||||
--bg-selected: #e9e9e7;
|
||||
--color-border: var(--color-gray-200);
|
||||
--color-border-focus: var(--color-primary-500);
|
||||
--color-primary: var(--color-primary-500);
|
||||
--color-primary-hover: var(--color-primary-400);
|
||||
|
||||
/* 文字颜色 */
|
||||
--text-primary: #37352f;
|
||||
--text-secondary: #787774;
|
||||
--text-tertiary: #9b9a97;
|
||||
--text-quaternary: #c1c0bd;
|
||||
--color-success: var(--color-success-500);
|
||||
--color-success-bg: var(--color-success-50);
|
||||
--color-warning: var(--color-warning-500);
|
||||
--color-warning-bg: var(--color-warning-50);
|
||||
--color-error: var(--color-error-500);
|
||||
--color-error-bg: var(--color-error-50);
|
||||
|
||||
/* 边框和分割线 */
|
||||
--border-light: #e9e9e7;
|
||||
--border-medium: #d3d3d1;
|
||||
--border-strong: #c1c0bd;
|
||||
// ========================================
|
||||
// 字体系统
|
||||
// ========================================
|
||||
--font-family: -apple-system, BlinkMacSystemFont, "PingFang SC",
|
||||
"Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;
|
||||
|
||||
/* 圆角 */
|
||||
--radius-none: 0;
|
||||
--radius-sm: 3px;
|
||||
--radius-md: 6px;
|
||||
--radius-lg: 8px;
|
||||
--font-size-xs: 12px;
|
||||
--font-size-sm: 13px;
|
||||
--font-size-base: 14px;
|
||||
--font-size-md: 16px;
|
||||
--font-size-lg: 18px;
|
||||
--font-size-xl: 20px;
|
||||
--font-size-2xl: 24px;
|
||||
|
||||
/* 间距 */
|
||||
--space-xs: 4px;
|
||||
--space-sm: 8px;
|
||||
--space-md: 16px;
|
||||
--space-lg: 24px;
|
||||
--space-xl: 32px;
|
||||
--space-2xl: 48px;
|
||||
--space-3xl: 64px;
|
||||
--line-height-tight: 1.25;
|
||||
--line-height-base: 1.5;
|
||||
|
||||
// ========================================
|
||||
// 间距系统 (4px 基准)
|
||||
// ========================================
|
||||
--space-1: 4px;
|
||||
--space-2: 8px;
|
||||
--space-3: 12px;
|
||||
--space-4: 16px;
|
||||
--space-5: 20px;
|
||||
--space-6: 24px;
|
||||
--space-8: 32px;
|
||||
--space-10: 40px;
|
||||
--space-12: 48px;
|
||||
|
||||
// 兼容旧变量
|
||||
--space-xs: 4px;
|
||||
--space-sm: 8px;
|
||||
--space-md: 16px;
|
||||
--space-lg: 24px;
|
||||
--space-xl: 32px;
|
||||
|
||||
// ========================================
|
||||
// 圆角系统
|
||||
// ========================================
|
||||
--radius-sm: 4px;
|
||||
--radius-base: 6px;
|
||||
--radius-md: 8px;
|
||||
--radius-lg: 12px;
|
||||
--radius-full: 9999px;
|
||||
|
||||
// 兼容旧变量
|
||||
--radius-card: 12px;
|
||||
--radius-button: 6px;
|
||||
--radius-tag: 4px;
|
||||
|
||||
// ========================================
|
||||
// 阴影系统
|
||||
// ========================================
|
||||
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
||||
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
|
||||
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
|
||||
--shadow-blue: 0 0 0 3px rgba(59, 130, 246, 0.15);
|
||||
|
||||
// ========================================
|
||||
// 布局系统
|
||||
// ========================================
|
||||
--sidebar-width: 240px;
|
||||
--header-height: 56px;
|
||||
|
||||
// ========================================
|
||||
// 动效
|
||||
// ========================================
|
||||
--duration-fast: 150ms;
|
||||
--duration-base: 200ms;
|
||||
--duration-slow: 300ms;
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 深色模式
|
||||
// ========================================
|
||||
[data-theme="dark"],
|
||||
.dark {
|
||||
--color-bg: #0F172A;
|
||||
--color-bg-page: #0F172A;
|
||||
--color-bg-card: #1E293B;
|
||||
--color-surface: #1E293B;
|
||||
|
||||
--color-text: #F1F5F9;
|
||||
--color-text-primary: #F1F5F9;
|
||||
--color-text-secondary: #94A3B8;
|
||||
--color-text-muted: #64748B;
|
||||
--color-text-disabled: #475569;
|
||||
|
||||
--color-border: #334155;
|
||||
|
||||
--color-primary: #60A5FA;
|
||||
--color-primary-hover: #93C5FD;
|
||||
}
|
||||
|
||||
/* ================================
|
||||
|
||||
Reference in New Issue
Block a user