Files
youlai-app/.cursorrules
2025-08-15 20:36:20 +08:00

100 lines
5.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 样式CSS/SCSS与 UnoCSS 使用规范Cursor Rules
目标:在不牺牲可读性的前提下最大化复用,减少冗余,保证小程序/H5 多端一致、整洁大方。
### 1) 总原则
- 优先使用 UnoCSS 工具类与已定义的 shortcuts避免重复造轮子。
- 同一工具类组合在同一页面或多个页面中出现 ≥ 2 次时,提取为“语义化类名”。
- 禁止使用 `@apply`,禁止在 SCSS 中重复定义 UnoCSS 已提供的工具类或在 `unocss.config.ts` 中已存在的 shortcuts`flex`、`flex-start`、`flex-between`、`flex-col-center` 等)。
- 组件库样式覆盖和页面布局样式分离:页面/组件的布局与样式用普通类,覆盖 wot 组件样式用“外部样式类”。
### 2) 目录与作用域
- 页面私有样式:写在当前 `.vue` 的 `<style lang="scss" scoped>` 中。
- 多处复用的语义化样式:优先抽到所属页面/模块级样式;跨页面复用再考虑提到 `src/styles` 公共样式文件。
- 避免把零碎的、只出现一次的样式放到全局,保持全局样式轻量。
### 3) 覆盖 wot-design-uni 组件样式(外部样式类)
- 使用 `custom-class` 传入类名,禁止对 wot 组件使用 `class` 覆盖样式。
- 因为 SFC `scoped`,覆盖子组件需使用 `:deep()`,并加 `!important` 提升优先级。
- 在“自定义组件”中使用 wot 组件时,若样式穿透无效,按需开启 `styleIsolation: 'shared'`。
- 参考文档:[小程序使用外部样式类wot-design-uni](https://wot-design-uni.pages.dev/guide/common-problems.html#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%E6%A0%B7%E5%BC%8F%E7%B1%BB)
示例(按钮):
```vue
<wd-button custom-class="logout-button" plain @click="handleLogout">退出登录</wd-button>
```
```scss
/* 页面/组件内 */
:deep(.logout-button) {
width: 100% !important;
height: 80rpx !important;
font-size: 32rpx !important;
font-weight: bold !important;
border-radius: 40rpx !important;
}
```
### 4) UnoCSS 约定与最小用法
- 预设、shortcuts 位于 `unocss.config.ts`,不要在 SCSS 中重复定义这些类。
- 常用 shortcuts已存在无需再自定义
- `flex-start`、`flex-between`、`flex-center`、`flex-col-center` 等。
- 可以自由组合 UnoCSS 工具类(如:`p-20rpx`、`px-24rpx`、`border-b` 等)。
- 不可读的长串组合若重复使用,抽成语义化类名。
- 复杂/冗长的原子类组合(例如包含 ≥4 个原子类,且会在项目内重复出现)一律改为“外部样式类”(语义化类名),以避免模板膨胀;模板仅保留必要的少量工具类。
- 简单、一次性且语义明确的区域优先使用 UnoCSS 原子类(例如单个 `p-30rpx`、`text-center`、`font-600` 等);
复杂/冗长≥4或会复用的组合抽为“外部样式类”。
示例(页面语义化类):
```vue
<view class="card-header">...</view>
```
```scss
.card-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 24rpx;
border-bottom: 1rpx solid #e5e7eb;
}
:deep(.dark) .card-header { border-bottom-color: #374151; }
```
### 5) 语义化抽取的判定标准
- 满足以下任一条件即可抽取为语义化类名:
- 同一工具类组合在项目内出现 ≥ 2 次;
- 该区域具备明确的语义(如“卡片头部”、“工具项”等);
- 需要在暗色模式等主题下统一控制样式。
推荐命名:`kebab-case`,表达语义而非表现形式,例如:`card-header`、`tool-item`、`user-profile`。
### 6) 属性书写顺序(遵循项目 Linter
- 基本顺序:`display` → 布局(如 `flex-*`:先 `align-items`,后 `justify-content`)→ 尺寸(`width/height`)→ 间距(`margin/padding`)→ 背景 → 边框 → 圆角 → 阴影 → 过渡/变换。
- 避免无意义的属性覆盖;必要时使用 `!important`,仅用于外部样式类覆盖。
### 7) 深色模式
- 使用 `:deep(.dark) .your-class { ... }` 定义暗色样式,保持与明亮模式同一语义类名。
### 8) 示例对照(本项目中已落地)
- 将重复的工具项组合 `w-1/4 flex-col-center mb-30rpx` 抽取为:
- `tool-item`(语义化类,含列方向与对齐、宽度 25%、下间距)
- 将重复的卡片头部组合 `flex-between p-20rpx px-24rpx border-b ...` 抽取为:
- `card-header`(统一控制边距、分隔线与暗色模式)
- 将数据统计卡片 `flex p-30rpx mx-30rpx my-20rpx bg-white rounded-16rpx shadow-sm dark:bg-gray-800` 抽取为:
- `stats-card`、`stats-item`、`stats-divider`(统一控制布局/间距/暗色色板)
- 覆盖 wot 组件样式:
- 使用 `custom-class` + `:deep()` + `!important`,不要用 `class`。
### 9) 禁止项(务必遵守)
- 不要在 SCSS 中定义 `.flex`、`.flex-start`、`.flex-between` 等已由 UnoCSS/shortcuts 提供的类。
- 不要再使用 `@apply`。
- 不要把一次性的样式放到全局公共样式。
---
本规则文件旨在为 Cursor 自动补全与协作提供统一参考,遇到冲突以项目 Lint 规则与 `unocss.config.ts` 为准。