feat: 初始化船长·HeiXiu 桌面应用项目(错误是svg的问题)
Electron + React 19 + TypeScript + Ant Design 6 + Tailwind CSS 4 【核心架构】 - Electron 主进程(窗口管理、平台检测、图标适配) - Vite 构建链(双产物 dist/ + dist-electron/) - 共享层 shared/(类型、常量、工具函数) - IPC 通信框架 + 安全守卫 【主题系统】 - 蓝紫渐变主题(亮色/暗色双模式) - Ant Design ConfigProvider 适配(lightAlgorithm / darkAlgorithm) - Tailwind CSS 4 @theme 指令 + CSS 变量 - 设计令牌三处同步(tokens.ts / globals.css / antd-theme.ts) 【导航栏】 - 自定义 H5 导航栏替代系统菜单 - 个人版/企业版双布局 - 未登录拦截 + 事件总线驱动登录弹窗 【登录注册】 - Modal 弹层(Portal)+ Tabs 切换 - 登录/注册表单动态字段渲染 - 记住密码 / 自动登录 / 用户协议 【更新系统】 - 自定义 API 版本检查(替代 electron-updater generic provider) - 手动下载 + SHA512 校验 + spawn NSIS 安装 - 渲染进程更新状态机 Hook(useUpdater) - 检查更新按钮 + 下载进度展示 【构建工具链】 - build.mjs 构建总管(--win/--mac/--linux --personal/--enterprise --build/--clean/--sign/--upload/--publish) - scripts/ 自动化脚本(clean / generate-update-info / upload-oss / publish-release) - electron-builder NSIS 安装器(可选路径、多版本打包) - update-info.json 自动生成(fileSize/sha512/changelog/releaseDate) 【代码质量】 - ESLint + TypeScript strict + Prettier - husky + lint-staged(提交前自动检查) - commitlint(规范提交信息) - Playwright E2E + Vitest 单元测试框架 - rollup-plugin-visualizer 打包体积分析 【文档】 - README.md(快速开始 + 目录结构 + 命令速查) - UpdateA.md(发布手册:API/签名/发版流程/数据库) - CHANGELOG.md(更新日志) - .env.example(构建环境变量模板)
This commit is contained in:
257
src/theme/globals.css
Normal file
257
src/theme/globals.css
Normal file
@@ -0,0 +1,257 @@
|
||||
/* ============================================================
|
||||
* 全局样式 —— Tailwind CSS v4 指令 + 蓝紫渐变主题扩展 + 重置样式
|
||||
* Tailwind v4 使用 CSS @theme 指令替代 tailwind.config.ts,
|
||||
* 设计令牌需与 tokens.ts / antd-theme.ts 保持同步。
|
||||
* ============================================================ */
|
||||
|
||||
@import 'tailwindcss';
|
||||
|
||||
/* ============================================================
|
||||
* Tailwind CSS v4 主题扩展(用 @theme 指令)
|
||||
* 此处定义的自定义令牌会自动生成对应的 Tailwind 工具类。
|
||||
* 例如:colors.primary → bg-primary, text-primary, border-primary 等。
|
||||
* ============================================================ */
|
||||
|
||||
/* 品牌色 — 蓝紫渐变 */
|
||||
@theme {
|
||||
/* 主色系 */
|
||||
--color-primary: #6366f1; /* Indigo-500 */
|
||||
--color-primary-light: #818cf8; /* Indigo-400 */
|
||||
--color-primary-dark: #4f46e5; /* Indigo-600 */
|
||||
--color-primary-50: #eef2ff; /* Indigo-50 */
|
||||
--color-primary-100: #e0e7ff; /* Indigo-100 */
|
||||
--color-primary-200: #c7d2fe; /* Indigo-200 */
|
||||
--color-primary-300: #a5b4fc; /* Indigo-300 */
|
||||
--color-primary-400: #818cf8; /* Indigo-400 */
|
||||
--color-primary-500: #6366f1; /* Indigo-500 */
|
||||
--color-primary-600: #4f46e5; /* Indigo-600 */
|
||||
--color-primary-700: #4338ca; /* Indigo-700 */
|
||||
--color-primary-800: #3730a3; /* Indigo-800 */
|
||||
--color-primary-900: #312e81; /* Indigo-900 */
|
||||
|
||||
/* 辅助色系 — Violet */
|
||||
--color-secondary: #8b5cf6; /* Violet-500 */
|
||||
--color-secondary-light: #a78bfa; /* Violet-400 */
|
||||
--color-secondary-dark: #7c3aed; /* Violet-600 */
|
||||
|
||||
/* 功能色 */
|
||||
--color-success: #10b981;
|
||||
--color-success-light: #d1fae5;
|
||||
--color-warning: #f59e0b;
|
||||
--color-warning-light: #fef3c7;
|
||||
--color-error: #ef4444;
|
||||
--color-error-light: #fee2e2;
|
||||
--color-info: #3b82f6;
|
||||
--color-info-light: #dbeafe;
|
||||
|
||||
/* 圆角 */
|
||||
--radius-xs: 4px;
|
||||
--radius-sm: 6px;
|
||||
--radius-base: 8px;
|
||||
--radius-lg: 12px;
|
||||
--radius-xl: 16px;
|
||||
--radius-2xl: 24px;
|
||||
|
||||
/* 字体 */
|
||||
--font-family-base:
|
||||
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
|
||||
'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||||
--font-family-mono:
|
||||
'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, 'Courier New', monospace;
|
||||
|
||||
/* 动画 */
|
||||
--transition-duration: 0.2s;
|
||||
--transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 🌞 亮色模式 CSS 变量(默认)
|
||||
* 这些变量与 tokens.ts 中的亮色令牌同步
|
||||
* ============================================================ */
|
||||
|
||||
:root,
|
||||
[data-theme='light'] {
|
||||
/* 中性色 — 亮色 */
|
||||
--color-text-base: #1e1b4b;
|
||||
--color-text-secondary: #6b7280;
|
||||
--color-text-tertiary: #9ca3af;
|
||||
--color-bg-base: #ffffff;
|
||||
--color-bg-container: #f9fafb;
|
||||
--color-bg-layout: #f5f3ff;
|
||||
--color-bg-elevated: #ffffff;
|
||||
--color-border-base: #e5e7eb;
|
||||
--color-border-secondary: #f3f4f6;
|
||||
|
||||
/* 阴影 */
|
||||
--shadow-base: 0 1px 3px 0 rgba(99, 102, 241, 0.08), 0 1px 2px -1px rgba(99, 102, 241, 0.08);
|
||||
--shadow-lg: 0 10px 15px -3px rgba(99, 102, 241, 0.1), 0 4px 6px -4px rgba(99, 102, 241, 0.1);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 🌙 暗色模式 CSS 变量
|
||||
* 当 <html data-theme="dark"> 时自动切换
|
||||
* 这些变量与 tokens.ts 中的暗色令牌同步
|
||||
* ============================================================ */
|
||||
|
||||
[data-theme='dark'] {
|
||||
/* 中性色 — 暗色 */
|
||||
--color-text-base: #e8e6f0;
|
||||
--color-text-secondary: #a5a0c9;
|
||||
--color-text-tertiary: #6e6998;
|
||||
--color-bg-base: #0f0d1a;
|
||||
--color-bg-container: #1a1730;
|
||||
--color-bg-layout: #0b0a15;
|
||||
--color-bg-elevated: #242040;
|
||||
--color-border-base: #2e2a4a;
|
||||
--color-border-secondary: #1f1c38;
|
||||
|
||||
/* 暗色模式下品牌色提亮以保持对比度 */
|
||||
--color-primary: #818cf8;
|
||||
--color-primary-light: #a5b4fc;
|
||||
--color-primary-dark: #6366f1;
|
||||
|
||||
/* 阴影 — 暗色下用深投影 */
|
||||
--shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
|
||||
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 蓝紫渐变工具类
|
||||
* Tailwind v4 使用 @utility 定义自定义工具类
|
||||
* ============================================================ */
|
||||
|
||||
@utility gradient-primary {
|
||||
background: linear-gradient(135deg, #4f46e5, #7c3aed);
|
||||
}
|
||||
|
||||
@utility gradient-primary-hover {
|
||||
background: linear-gradient(135deg, #6366f1, #8b5cf6);
|
||||
}
|
||||
|
||||
@utility gradient-primary-text {
|
||||
background: linear-gradient(135deg, #4f46e5, #7c3aed);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
@utility gradient-border {
|
||||
border-image: linear-gradient(135deg, #4f46e5, #7c3aed) 1;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 全局重置样式
|
||||
* 仅放必要的重置,不堆积组件样式
|
||||
* ============================================================ */
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: var(--font-family-base);
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-rendering: optimizeLegibility;
|
||||
/* 亮/暗切换过渡 */
|
||||
color-scheme: light dark;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: var(--color-text-base);
|
||||
background-color: var(--color-bg-base);
|
||||
min-height: 100vh;
|
||||
transition:
|
||||
background-color 0.3s ease,
|
||||
color 0.3s ease;
|
||||
}
|
||||
|
||||
#root {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
/* 滚动条美化 */
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #c7d2fe;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: #a5b4fc;
|
||||
}
|
||||
|
||||
/* 暗色模式滚动条 */
|
||||
[data-theme='dark'] ::-webkit-scrollbar-thumb {
|
||||
background: #4338ca;
|
||||
}
|
||||
|
||||
[data-theme='dark'] ::-webkit-scrollbar-thumb:hover {
|
||||
background: #4f46e5;
|
||||
}
|
||||
|
||||
/* 聚焦环 — 使用品牌色 */
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--color-primary);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
/* 选中文本 — 使用品牌色 */
|
||||
::selection {
|
||||
background: rgba(99, 102, 241, 0.2);
|
||||
color: var(--color-text-base);
|
||||
}
|
||||
|
||||
[data-theme='dark'] ::selection {
|
||||
background: rgba(129, 140, 248, 0.3);
|
||||
color: var(--color-text-base);
|
||||
}
|
||||
|
||||
/* 链接全局样式 */
|
||||
a {
|
||||
color: var(--color-primary);
|
||||
text-decoration: none;
|
||||
transition: color var(--transition-duration) var(--transition-timing);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--color-primary-light);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 窗口拖拽区域(自定义导航栏)
|
||||
*
|
||||
* macOS hiddenInset 模式下,整个导航栏区域可拖拽移动窗口。
|
||||
* .navbar-drag-region → 可拖拽(背景区域)
|
||||
* .navbar-no-drag → 不可拖拽(按钮、链接等交互元素)
|
||||
* ============================================================ */
|
||||
|
||||
.navbar-drag-region {
|
||||
-webkit-app-region: drag;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.navbar-no-drag {
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
/* macOS 红绿灯按钮区域不遮挡内容 */
|
||||
@supports (-webkit-app-region: drag) {
|
||||
.navbar-drag-region {
|
||||
-webkit-app-region: drag;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user