# Astral3D UI 样式迁移规范 (CSS & Vue Style Guide)
> **项目**: Astral3D Web 3D 编辑器
> **迁移目标**: NaiveUI → Shadcn UI + Tailwind CSS
> **风格**: 现代简约 / Minimalist Modern
> **版本**: 1.0
---
## 1. 主题与色彩系统 (Theme & Colors)
### 1.1 色彩变量 (CSS Variables)
我们将在 Tailwind 的默认调色板基础上,定义与当前 NaiveUI 浅色主题兼容的 CSS 变量。
**建议配置 (`tailwind.config.ts` & `globals.css`)**:
| 用途 | Tailwind 映射 | 变量名 | 当前值 (NaiveUI Light) | 说明 |
| :--- | :--- | :--- | :--- | :--- |
| **主色 (Primary)** | `primary` | `--color-primary` | `#63E2B7` (Mint Green) | 品牌色,用于按钮、选中态 |
| **主色悬停** | `primary-hover` | `--color-primary-hover` | `#7FE7C4` | 鼠标悬停 |
| **主色按下** | `primary-pressed` | `--color-primary-pressed` | `#5ACEA7` | 鼠标按下 |
| **背景 (Background)** | `background` | `--background` | `#ffffff` (White) | 页面主背景 |
| **侧边栏背景** | `sidebar-bg` | `--sidebar-background` | `#f8fafc` (Slate 50) | 侧边栏容器 |
| **卡片/面板背景** | `card-bg` | `--card-background` | `#ffffff` (White) | 表单、卡片背景 |
| **边框 (Border)** | `border` | `--border` | `#e2e8f0` (Slate 200) | 分割线、输入框边框 |
| **文字主色** | `foreground` | `--foreground` | `#0f172a` (Slate 900) | 标题、主要文字 |
| **文字次要** | `muted-foreground` | `--muted-foreground` | `#64748b` (Slate 500) | 标签、占位符 |
### 1.2 暗色模式适配 (Dark Mode)
我们将默认配置为浅色,支持通过 class 切换到深色:
```typescript
// tailwind.config.ts
export default {
darkMode: 'class', // 允许通过添加 'dark' class 切换主题
theme: {
extend: {
colors: {
primary: {
DEFAULT: 'var(--color-primary)',
hover: 'var(--color-primary-hover)',
pressed: 'var(--color-primary-pressed)',
},
background: 'var(--background)',
surface: 'var(--sidebar-background)',
border: 'var(--border)',
}
}
}
}
```
---
## 2. 间距与排版 (Spacing & Typography)
### 2.1 间距系统 (Spacing)
迁移 `n-space` 和 NaiveUI 的 padding/margin 逻辑。
| NaiveUI Size | Tailwind Class | 用途 |
| :--- | :--- | :--- |
| `size="small"` | `gap-2` (8px) | 紧凑列表、工具栏 |
| `size="medium"` (默认) | `gap-3` (12px) | 通用表单、卡片 |
| `size="large"` | `gap-4` (16px) | 模块间距、大间距 |
| `n-layout-sider` padding | `p-3` (12px) | 侧边栏内容 padding |
| `n-card` padding | `p-4` (16px) | 卡片内边距 |
### 2.2 圆角系统 (Border Radius)
| NaiveUI | Tailwind Class | 说明 |
| :--- | :--- | :--- |
| `bordered` (默认) | `rounded-md` (6px) | 按钮、输入框 |
| `round` | `rounded-full` | 标签、头像 |
| - | `rounded-lg` (8px) | 模态框、卡片 |
---
## 3. 组件映射速查 (Component Mapping)
### 3.1 基础组件 (Basic Components)
#### Button 按钮
- **NaiveUI**: `Save`
- **Shadcn/Vue + Tailwind**:
```vue
```
- **属性映射**:
- `type="primary"` -> `variant="default"` (Primary Color Background)
- `type="default"` -> `variant="outline"`
- `type="tertiary"` -> `variant="ghost"`
- `size="small"` -> `size="sm"`
- `ghost=true` -> `variant="ghost"`
#### Input 输入框
- **NaiveUI**: ``
- **Shadcn/Vue + Tailwind**:
```vue
```
- **样式调整**:
- 当前项目输入框通常为白色背景,需覆盖 `shadcn` 默认样式:
```css
.Input {
@apply bg-white border-slate-300 text-slate-900 focus:ring-primary;
}
```
#### Select 选择器
- **NaiveUI**: ``
- **Shadcn**: 使用 `Select` 组件或自定义封装。
- **Tailwind 实现 (自定义封装示例)**:
```vue
```
---
### 3.2 布局组件 (Layout Components)
#### Tabs 标签页 (侧边栏)
- **NaiveUI**: `` (侧边栏常规模式)
- **Shadcn 实现**: Shadcn 默认 Tabs 是水平顶部排列。
- **Tailwind 实现 (自定义侧边栏 Tabs)**:
需要使用 Flexbox 布局模拟侧边栏 Tab。
```vue
```
#### Layout 布局容器
- **NaiveUI**:
```vue
...
...
```
- **Tailwind 实现**:
```vue
```
#### Card 卡片
- **NaiveUI**: `Content`
- **Shadcn 实现**:
```vue
Title
Content
```
#### Collapse 折叠面板
- **NaiveUI**:
```vue
Content
```
- **Tailwind 实现**:
```vue
Group
Content
```
---
### 3.3 反馈组件 (Feedback Components)
#### Modal 对话框
- **NaiveUI**: ``
- **Shadcn 实现**:
```vue
```
#### Message 消息提示
- **NaiveUI**: `window.$message.success('Success')`
- **迁移方案**: 使用 `sonner` 或自定义 Toast 组件。
- **Tailwind 样式 (浅色)**:
```css
.toast-success {
@apply bg-white border-l-4 border-primary text-slate-900 shadow-lg;
}
```
#### Loading 加载
- **NaiveUI**: `` 或 `v-loading`
- **Tailwind 实现**:
```vue
```
---
## 4. 样式覆盖规范 (Style Overrides)
为了保持项目当前的视觉风格(浅色为主),需要在全局 CSS 中添加以下覆盖:
```css
/* src/assets/globals.css */
@layer base {
:root {
/* 浅色模式 (默认) */
--background: 255 255 255; /* White */
--foreground: 15 23 42; /* Slate 900 */
--card: 255 255 255;
--card-foreground: 15 23 42;
--primary: 99 226 183; /* Mint Green #63E2B7 */
--primary-foreground: 15 23 42;
--secondary: 241 245 249; /* Slate 100 */
--secondary-foreground: 15 23 42;
--muted: 241 245 249; /* Slate 100 */
--muted-foreground: 100 116 139; /* Slate 500 */
--accent: 241 245 249;
--accent-foreground: 15 23 42;
--destructive: 239 68 68; /* Red 500 */
--destructive-foreground: 255 255 255;
--border: 226 232 240; /* Slate 200 */
--input: 226 232 240;
--ring: 99 226 183;
--radius: 0.5rem;
}
/* 暗色模式 (可选) */
.dark {
--background: 15 23 42; /* Slate 950 */
--foreground: 248 250 252; /* Slate 50 */
--card: 30 41 59; /* Slate 800 */
--card-foreground: 248 250 252;
--secondary: 51 65 85; /* Slate 700 */
--secondary-foreground: 248 250 252;
--muted: 51 65 85;
--muted-foreground: 148 163 184;
--accent: 51 65 85;
--accent-foreground: 248 250 252;
--destructive: 239 68 68;
--destructive-foreground: 248 250 252;
--border: 51 65 85;
--input: 51 65 85;
}
}
/* 自定义组件样式适配当前项目 (浅色) */
.btn-primary {
@apply bg-primary text-slate-900 hover:bg-primary/90;
}
.input-light {
@apply bg-white border-slate-200 text-slate-900 focus:ring-primary rounded-md;
}
/* 侧边栏样式适配 */
.sidebar {
@apply bg-slate-50 border-r border-slate-200;
}
```
---
## 5. 迁移步骤建议
1. **安装依赖**: 运行 TODO 文档中的安装命令。
2. **配置 Tailwind**: 创建 `tailwind.config.ts` 并配置颜色。
3. **全局样式**: 创建 `globals.css` 并填入上方 CSS 变量。
4. **组件替换**: 按照 "组件映射速查" 表格,逐页面替换 `naive-ui` 组件。
5. **样式微调**: 针对特定的 NaiveUI 样式类(如 `.n-form-item`),使用 `@apply` 或 Tailwind 工具类进行覆盖。