@manohub/theme 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/dist/default/colors.css +79 -0
- package/dist/default/index.css +39 -0
- package/dist/default/radius.css +24 -0
- package/dist/default/shadows.css +37 -0
- package/dist/default/spacing.css +35 -0
- package/dist/default/typography.css +38 -0
- package/dist/farris/colors.css +59 -0
- package/dist/farris/index.css +20 -0
- package/dist/farris/radius.css +22 -0
- package/dist/farris/shadows.css +25 -0
- package/dist/farris/spacing.css +29 -0
- package/dist/farris/typography.css +33 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# @manohub/theme
|
|
2
|
+
|
|
3
|
+
AIHub 前端体系里的**主题包**:纯 CSS 令牌层,只有「值」,没有面、没有 JS、零运行时依赖。
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
@manohub/theme 值(本包:全局令牌)
|
|
7
|
+
@manohub/ui 值 + 面(组件类 + 组件自己的令牌 + 命令式服务)
|
|
8
|
+
@manohub/kit 入口编排(容器锚 + 装配;零样式)
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 接入
|
|
12
|
+
|
|
13
|
+
```css
|
|
14
|
+
/* 应用的样式链(顺序即契约:先值后面) */
|
|
15
|
+
@import "@manohub/theme/default.css"; /* ① 值(本包)—— 换主题只换这一行 */
|
|
16
|
+
@import "@manohub/ui/styles.css"; /* ② 面(组件类 + 组件令牌基础值) */
|
|
17
|
+
@import "./app.css";
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**没有哪个包会替你引本包**:`@manohub/kit` 是纯入口编排层,**不发布任何样式**
|
|
21
|
+
(0.6.0 起它自己的 reset 与富文本预设也已删除),样式两行必须由应用自己写进样式链。
|
|
22
|
+
静态页 / 不用组件库的场景只需第一行(没有面可引)。
|
|
23
|
+
|
|
24
|
+
## 锚:`[data-manohub-ui]`
|
|
25
|
+
|
|
26
|
+
全部令牌锚在一个**库品牌属性**上,不是任何一个包的私有类名:
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<div data-manohub-ui data-theme="farris">
|
|
30
|
+
<!-- 换皮 = 加一个 data-theme,不动类名、不动组件代码、不重打包 -->
|
|
31
|
+
</div>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- `data-manohub-ui` 由 `@manohub/kit` 的 `createSubApp` **无条件**写在应用容器上,
|
|
35
|
+
所以有属性即生效、宿主不用额外配置
|
|
36
|
+
- 不用 `class="app-container"`:`app-` 是 kit 的私有命名空间前缀,本包锚它等于引用别的包的名字
|
|
37
|
+
- 不写 `:root`:micro-app 的 scopecss 不作用域化 `:root`,会泄漏到宿主全局
|
|
38
|
+
- 局部换肤 = 在更深的元素上重设变量:`.role-tree-pane { --ui-primary: #7C3AED; }`
|
|
39
|
+
|
|
40
|
+
## 主题与分片
|
|
41
|
+
|
|
42
|
+
| 主题 | 入口 | 锚 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `default`(AIHub 品牌蓝 `#2660FF`) | `@manohub/theme/default.css` | `[data-manohub-ui]` |
|
|
45
|
+
| `farris`(《Farris Web 基础视觉规范》) | `@manohub/theme/farris.css` | `[data-manohub-ui][data-theme='farris']` |
|
|
46
|
+
|
|
47
|
+
每个主题五片 + 一个入口:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
src/<主题>/
|
|
51
|
+
├─ index.css @import 下面五片
|
|
52
|
+
├─ colors.css 品牌槽位 / 中性阶 / 语义状态
|
|
53
|
+
├─ typography.css 字阶 / 行高 / 字重 / 等宽族
|
|
54
|
+
├─ spacing.css 间距档 / 控件尺寸
|
|
55
|
+
├─ radius.css 四档圆角
|
|
56
|
+
└─ shadows.css 投影 / 蒙层
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`default` 是唯一不带属性选择器的**兜底套**,永远先生效;其它主题**必须全量覆盖**
|
|
60
|
+
`default` 的每一枚令牌(缺一枚就是「半套主题」),由 `__tests__/contract-tokens.spec.ts` 机械校验。
|
|
61
|
+
|
|
62
|
+
## 新增主题
|
|
63
|
+
|
|
64
|
+
1. `src/<name>/` 建同结构五片 + index,令牌一律锚 `[data-manohub-ui][data-theme='<name>']`
|
|
65
|
+
2. `package.json` 的 `exports` 加一行 `"./<name>.css": "./dist/<name>/index.css"`
|
|
66
|
+
3. 消费方给锚加 `data-theme="<name>"`
|
|
67
|
+
|
|
68
|
+
## 新增令牌
|
|
69
|
+
|
|
70
|
+
改值前先读对应分片的文件头 —— 每枚令牌都带**设计出处**(Figma 节点号 / 规范色板编号)。
|
|
71
|
+
**无出处的令牌一律撤除**,不要为「成对好看」补空令牌。
|
|
72
|
+
|
|
73
|
+
## 校验
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pnpm --filter @manohub/theme test:unit # 分片齐全 / 全量覆盖 / 锚一致 / 零真实样式
|
|
77
|
+
pnpm --filter @manohub/theme build # src 镜像到 dist
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 边界
|
|
81
|
+
|
|
82
|
+
- **只放值**:组件自己的几何令牌(`--ui-button-height` 等,只服务单一组件)不在这里,
|
|
83
|
+
随组件落在 `@manohub/ui` 的 `styles/components/<件>.tokens.css`
|
|
84
|
+
- **不产面**:本包零条真实样式声明(只有自定义属性),组件类一律归 `@manohub/ui`
|
|
85
|
+
- **不做运行时切换**:换肤就是给锚加/去 `data-theme` 属性
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 色彩令牌(品牌槽位 + 中性阶 + 语义状态三件套)。
|
|
3
|
+
*
|
|
4
|
+
* 分层与 `@aihub/theme` 的 `base/colors.css` 对齐;取值以设计稿《MH后台-0911》的
|
|
5
|
+
* **四个品牌页**(`00.1 管理员配置` / `01.1 技能权限分配` / `01.2 技能权限分配-初始状态` /
|
|
6
|
+
* `02.1 技能准入列表`)为唯一事实源。
|
|
7
|
+
*
|
|
8
|
+
* **三个向导页(`02.2.1/2/3`)判定为旧稿**:它们用 Farris 规范色(`#2a87ff` 主色、
|
|
9
|
+
* `#5fc875` 成功、`#cdd2de` 连接线、`#a8adb8` 弱字、`#f0f3f7` 面),一律**不予采纳** ——
|
|
10
|
+
* 否则 default 主题会与 farris 主题同值,两套主题失去区分意义。
|
|
11
|
+
*
|
|
12
|
+
* 锚定 `[data-manohub-ui]` 而非 `:root`:micro-app 的 scopecss 不作用域化 `:root`,
|
|
13
|
+
* 定义在 `:root` 的变量会泄漏到宿主全局(多子应用互染、卸载残留)。
|
|
14
|
+
* 局部换主题 = 在更深的容器上重设变量,如 `.role-tree-pane { --ui-primary: #7C3AED; }`。
|
|
15
|
+
*
|
|
16
|
+
* ## 三条口径(改值前先读,别绕过)
|
|
17
|
+
*
|
|
18
|
+
* 1. **中性阶只有四级面**:`base-100`(内容底)/ `base-200`(中性面)/ `base-300`(线框)/
|
|
19
|
+
* `base-400`(仅勾选类小控件框体)。设计稿内容区**从未出现 `#F5F7FA`**;实测中性面只有
|
|
20
|
+
* `#F2F2F2`(中性 hover / 禁用底)与 `#F1F2F5`(表头底),二者差 3/255,故合并为 `base-200`。
|
|
21
|
+
* 2. **`base-300` 是全库唯一的「线 / 框」色**:输入框、按钮、表格、分页项、卡片、面板、分隔线
|
|
22
|
+
* 一律取它。`base-400` 只留给 **14×14 这类小尺寸勾选框体**(设计稿让复选框比容器线深一档,
|
|
23
|
+
* 否则小方块在浅底上看不见)。
|
|
24
|
+
* 3. **语义浅底与描边由基色按固定比例派生**(写在行尾):`-weak` = 基色 10% 入白、
|
|
25
|
+
* `-border` = 基色 30% 入白、`-strong` = 基色 85% 入黑。改基色时**必须同步重算这三档**
|
|
26
|
+
* (此处不写 `color-mix` 派生:自定义属性在**声明元素**上求值,派生写法会让
|
|
27
|
+
* 「在更深容器重设 `--ui-success`」的局部换肤失效)。
|
|
28
|
+
*/
|
|
29
|
+
[data-manohub-ui] {
|
|
30
|
+
/* ===== 品牌槽位:全仓唯一一处定义 ===== */
|
|
31
|
+
--ui-primary: #2660FF;
|
|
32
|
+
--ui-primary-content: #FFFFFF;
|
|
33
|
+
--ui-primary-hover: #1A4FE0;
|
|
34
|
+
/* 浅底 / 滑过底 / 聚焦环(设计实证:分页「选中背景色」`h28 r6 bg[#eff5ff]`)。
|
|
35
|
+
`#EAEFFF`(表格内标签底)与之差 5/255,按「近似值合并」并入本档。 */
|
|
36
|
+
--ui-primary-weak: #EFF5FF;
|
|
37
|
+
/* 选中底(设计实证:`02.1` / `01.1` 的 `Table > 表格背景- White` = `#dbe9ff`)。
|
|
38
|
+
本档与 `-weak` 分家的意义:改前两者视觉等值,导致表格「滑过」与「选中」不可辨。 */
|
|
39
|
+
--ui-primary-subtle: #DBE9FF;
|
|
40
|
+
/* 浅主色描边(设计实证:表格内 20 高标签「底 #eaefff + 边 #b7caff」)。
|
|
41
|
+
补这一枚是为了让主色族与四个语义族槽位等形(base / content / weak / border)。 */
|
|
42
|
+
--ui-primary-border: #B7CAFF;
|
|
43
|
+
|
|
44
|
+
/* ===== 中性阶(四级面 + 三级字;禁止再自由取值) ===== */
|
|
45
|
+
--ui-base-50: #FAFAFA;
|
|
46
|
+
--ui-base-100: #FFFFFF;
|
|
47
|
+
--ui-base-200: #F1F2F5; /* 中性面:表头底 / hover 底 / 禁用底 / 斑马行 */
|
|
48
|
+
--ui-base-300: #E6E6E6; /* 全库唯一的「线 / 框」色 */
|
|
49
|
+
--ui-base-400: #DCDCDC; /* 仅勾选类小控件框体(checkbox / radio / switch 未选) */
|
|
50
|
+
--ui-base-content: #1A1A1A;
|
|
51
|
+
--ui-base-content-muted: #666666;
|
|
52
|
+
/* 说明 / 占位 / 禁用文字。设计稿的 `#888888`(禁用按钮字)与 `#bfbfbf` 并入本档
|
|
53
|
+
—— 三者只差一档且同为「弱化」,多开槽位只会再长出漂移(`filter.css` 已有同向裁决)。 */
|
|
54
|
+
--ui-base-content-subtle: #999999;
|
|
55
|
+
|
|
56
|
+
/* ===== 语义状态(四组同词根:info / success / warning / error) =====
|
|
57
|
+
基色有设计实证;浅底 / 描边 / 深字按本文件头第 3 条的固定比例派生。 */
|
|
58
|
+
/* 信息:设计稿未覆盖本槽位 → 沿用原值(不合并进主色:无依据,且会破坏与 farris 主题的结构对称) */
|
|
59
|
+
--ui-info: #3B82F6; --ui-info-content: #FFFFFF;
|
|
60
|
+
/* 成功:设计实证 = 品牌页「已授权 2 个组织」13px 绿字 + 状态圆点(`#61cc77`) */
|
|
61
|
+
--ui-success: #61CC77; --ui-success-content: #FFFFFF;
|
|
62
|
+
/* 警告:设计稿未覆盖本槽位 → 沿用原值 */
|
|
63
|
+
--ui-warning: #F59E0B; --ui-warning-content: #1A1A1A;
|
|
64
|
+
/* 错误:设计实证 = 品牌页 `02.1`「已拒绝」13px 红字 + 状态圆点(`#f23030`)。
|
|
65
|
+
注意区分:`#FF1922` 是**必填星号**专用色(见 `--ui-required-mark`),不是错误态色。 */
|
|
66
|
+
--ui-error: #F23030; --ui-error-content: #FFFFFF;
|
|
67
|
+
|
|
68
|
+
--ui-info-weak: #EBF2FE; --ui-info-border: #C4DAFC;
|
|
69
|
+
--ui-success-weak: #EFFAF1; --ui-success-border: #D0F0D6;
|
|
70
|
+
--ui-warning-weak: #FEF5E7; --ui-warning-border: #FCE2B6;
|
|
71
|
+
--ui-error-weak: #FEEAEA; --ui-error-border: #FBC1C1;
|
|
72
|
+
--ui-success-strong: #52AD65;
|
|
73
|
+
--ui-warning-strong: #D08609;
|
|
74
|
+
|
|
75
|
+
/* ===== 专用色(不属语义四组,只服务单一用途) =====
|
|
76
|
+
必填星号:设计实证 = `02.1 > 高级筛选 > 1..4` 的 `*`(`#ff1922`)。
|
|
77
|
+
它比错误色更艳(`#f23030`),因为作用是「提示存在」而非「报告失败」,故单列一槽。 */
|
|
78
|
+
--ui-required-mark: #FF1922;
|
|
79
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 默认主题(对外公开为 `@manohub/theme/default.css`)。
|
|
3
|
+
*
|
|
4
|
+
* ## 本包只放「值」
|
|
5
|
+
*
|
|
6
|
+
* 全仓**唯一**的全局令牌定义处(`--ui-primary` 这类跨件共用的值)。组件自己的几何令牌
|
|
7
|
+
* (`--ui-button-height` 等,只服务单一组件)不在这里,随组件落在 `@manohub/ui` 的
|
|
8
|
+
* `styles/components/<件>.tokens.css`。三段分工:
|
|
9
|
+
*
|
|
10
|
+
* 值(本包 + 组件 tokens 文件) → 面(受 `@manohub/ui`)
|
|
11
|
+
*
|
|
12
|
+
* ## 锚:`[data-manohub-ui]`(跨包唯一作用域锚)
|
|
13
|
+
*
|
|
14
|
+
* 锚是一个**库品牌属性**,不是任何一个包的私有类名 —— `@manohub` 是这个库三个包共同的 scope,
|
|
15
|
+
* 谁都锚得起。它由入口层 `createSubApp` **无条件**写在应用容器上(见 `@manohub/kit`),
|
|
16
|
+
* 因此**有属性即生效**,不需要宿主额外配置。
|
|
17
|
+
*
|
|
18
|
+
* 本主题是**唯一不带属性选择器的兜底套**,永远先生效;
|
|
19
|
+
* 换皮 = 在同一个锚上加 `data-theme`(见 `farris/index.css`)。
|
|
20
|
+
* 局部换肤 = 在更深的元素上重设变量(如 `.role-tree-pane { --ui-primary: #7C3AED; }`)。
|
|
21
|
+
*
|
|
22
|
+
* 也是本包的默认身份色(primary 取 AIHub 品牌蓝 #2660FF,非 Farris 规范蓝 #2a87ff)。
|
|
23
|
+
*
|
|
24
|
+
* 新增主题 = 本包新目录 `src/<name>/` + 同结构分片,令牌一律锚 `[data-manohub-ui][data-theme='<name>']`,
|
|
25
|
+
* 并在 `package.json` 的 exports 加一行 `./<name>.css`。换皮靠锚上的属性切换,不动类名、
|
|
26
|
+
* 不动组件代码、不重打包。
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ 不写 `:root`:micro-app 的 scopecss 不作用域化 `:root`,定义在 `:root` 的变量会泄漏到宿主
|
|
29
|
+
* 全局(多子应用互染、卸载残留)。
|
|
30
|
+
* ⚠️ icons / motion 两片**有意未建**(非遗漏):图标走 `@manohub/icon`(无 CSS 槽位),动效时长
|
|
31
|
+
* 内联在各组件规则里 —— 无消费者前不预置令牌(与「无出处令牌一律撤除」同一口径)。
|
|
32
|
+
*
|
|
33
|
+
* 分片与 `@aihub/theme` 的 base 对齐到 colors / typography / spacing / radius / shadows 五片。
|
|
34
|
+
*/
|
|
35
|
+
@import './colors.css';
|
|
36
|
+
@import './typography.css';
|
|
37
|
+
@import './spacing.css';
|
|
38
|
+
@import './radius.css';
|
|
39
|
+
@import './shadows.css';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 圆角令牌(四档,按**元素体量**分,取自设计稿《MH后台-0911》品牌页实测)。
|
|
3
|
+
*
|
|
4
|
+
* | 档 | 值 | 用途 | 设计实证 |
|
|
5
|
+
* |---|---|---|---|
|
|
6
|
+
* | `xs` | 3px | 勾选框体、20 高标签 | `控件` 画布 `0:4101`(14×14 复选框 r3)、`0:2723`(表格内标签 r3) |
|
|
7
|
+
* | `sm` | 4px | 页头图标块、下拉选项行 | `0:3905`(26×26 页头图标块 r4)、`0:4024`(选项行 r4) |
|
|
8
|
+
* | `control` | 6px | 按钮 / 输入框 / 分页项 / 树行 | 45×+20× 的控件签名(`h32 r6` / `h28 r6`) |
|
|
9
|
+
* | `md` | 8px | 卡片 / 面板 / 下拉面板 / 表格外框 / 弹窗 | `0:1556`(卡片 r8)、`0:4025`(下拉面板 r8) |
|
|
10
|
+
*
|
|
11
|
+
* 两处与设计稿的**登记偏差**(有意,非漏项):
|
|
12
|
+
* - 表格外框设计为 **7px**(介于 `control` 与 `md` 之间)→ 按「表格是容器」归 `md`;
|
|
13
|
+
* - 树行设计为 **8px** → 按「树行是控件级行元素」归 `control`(体量档一致优先于单点复刻)。
|
|
14
|
+
*
|
|
15
|
+
* `xs` 与 `control` 拉开 3px 而不是 2px:`xs` 服务的是 14px 量级的小方块,
|
|
16
|
+
* 圆角一大就失去「方块」的识别度。
|
|
17
|
+
*/
|
|
18
|
+
[data-manohub-ui] {
|
|
19
|
+
--ui-radius-xs: 3px;
|
|
20
|
+
--ui-radius-sm: 4px;
|
|
21
|
+
--ui-radius-control: 6px; /* 控件档:按钮 / 输入框 / 树节点行 / 说明条 */
|
|
22
|
+
--ui-radius-md: 8px; /* 容器档:卡片 / 面板 / 下拉面板 / 表格外框 / 弹窗 */
|
|
23
|
+
--ui-radius-full: 9999px;
|
|
24
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 阴影与遮罩令牌(卡片环境光 + 两类浮层关键光 + 蒙层)。
|
|
3
|
+
*
|
|
4
|
+
* 分层与 `@aihub/theme` 的 `base/shadows.css` 对齐;**拟物重投影一律收敛到这里**,
|
|
5
|
+
* 组件里不再出现新的投影字面量。
|
|
6
|
+
*
|
|
7
|
+
* ## 两枚浮层阴影按「浮层的锚定方式」分工(不是按体量,别把两者合并)
|
|
8
|
+
*
|
|
9
|
+
* | 令牌 | 角色 | 消费者 |
|
|
10
|
+
* |---|---|---|
|
|
11
|
+
* | `--ui-shadow-popover` | **锚定浮层**:挂在触发器旁,随定位档翻转 | Select 面板 / Button 菜单 / Input 菜单 / Pagination 条数选择器 / Input 气泡 |
|
|
12
|
+
* | `--ui-shadow-elevated` | **居中浮层**:居中或贴边、自带遮罩 | Dialog / Toast / Notification |
|
|
13
|
+
*
|
|
14
|
+
* 这层分工同时对上两套来源:设计稿给的是**下拉面板**的 `0 4px 20px rgba(0,14,51,.10)`
|
|
15
|
+
* (`0:4025`),故填进 `popover`;farris 主题的 `popover` 取规范的 `--mh-shadow-lg:14dp 下拉/弹出层`、
|
|
16
|
+
* `elevated` 取 `--mh-shadow-xl:18dp 对话框 / 抽屉` —— 两边语义完全对齐。
|
|
17
|
+
* 改前四处锚定浮层(Select / Button 菜单 / Input 菜单 / 页码条数选择器)都误用了 `elevated`,
|
|
18
|
+
* 等于把「对话框级」的投影打在「下拉」上。
|
|
19
|
+
*/
|
|
20
|
+
[data-manohub-ui] {
|
|
21
|
+
/* 卡片环境光 */
|
|
22
|
+
--ui-shadow-card: 0 2px 20px rgba(3, 18, 51, 0.05);
|
|
23
|
+
/* 卡片悬浮(Card / ListView.CardItem):portal 技能市场卡片实测
|
|
24
|
+
—— hover 主色描边 + 主色 12% 环境光投影 */
|
|
25
|
+
--ui-shadow-card-hover: 0 4px 10px rgba(38, 96, 255, 0.12);
|
|
26
|
+
|
|
27
|
+
/* 锚定浮层:设计实证 = 下拉面板 `0:4025` 的 DROP_SHADOW(0,4,b20,#000e331a) */
|
|
28
|
+
--ui-shadow-popover: 0 4px 20px rgba(0, 14, 51, 0.1);
|
|
29
|
+
/* 居中浮层(设计稿未覆盖本槽位 → 沿用原值) */
|
|
30
|
+
--ui-shadow-elevated: 0 2px 20px rgba(3, 18, 51, 0.15);
|
|
31
|
+
|
|
32
|
+
/* 蒙层与浅色浮层底 */
|
|
33
|
+
--ui-overlay-weak: rgba(15, 23, 42, 0.04);
|
|
34
|
+
--ui-overlay-strong: rgba(15, 23, 42, 0.06);
|
|
35
|
+
--ui-mask: rgba(0, 14, 51, 0.1);
|
|
36
|
+
--ui-mask-light: rgba(255, 255, 255, 0.6);
|
|
37
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 布局间距与控件尺寸令牌。
|
|
3
|
+
*
|
|
4
|
+
* 分层与 `@aihub/theme` 的 `base/spacing.css` 对齐(间距档 + 控件尺寸)。
|
|
5
|
+
* 这些是**跨件共用**的几何:既被自绘件(Card / Tree)消费,
|
|
6
|
+
* 也被骨架件(Page / Panel)共用。
|
|
7
|
+
* 只服务单一组件的几何**不写在这里**,随组件落在其同名 CSS 顶部(如 tree.css 的行高与缩进)。
|
|
8
|
+
*
|
|
9
|
+
* 间距档 `1/2/3/4/5/6` = `4/8/12/16/20/24`。**`--ui-space-5`(20)是设计稿的页面级内距**:
|
|
10
|
+
* 页头左右 20、页面内容内距 20、卡片内距 20、表格单元格左右 20 —— 补这一档之前,
|
|
11
|
+
* 这四处都在面层写裸的 `20px`(`page.css` / `card.css` / `list-view.css`),是「令牌不全」的典型症状。
|
|
12
|
+
*
|
|
13
|
+
* **控件三档是 24 / 32 / 40**(对齐主流设计系统的 small / middle / large):
|
|
14
|
+
* `sm` 用于表格行内与密集工具条,`md` 是**标准档**(按钮 / 输入框 / 选择器的缺省高度),
|
|
15
|
+
* `lg` 用于表单首屏的主字段。
|
|
16
|
+
*
|
|
17
|
+
* ⚠️ 命名与档位的对应关系:`-sm` 是「小号控件高」,**不是「标准控件高」**。
|
|
18
|
+
* 组件里表示标准高一律取 `--ui-control-height-md`;早先把这个槽位当标准档用的写法已全部改正 ——
|
|
19
|
+
* 若某处仍写 `var(--ui-control-height-sm)` 当标准高,它渲染出来会比邻件矮一档(这是排查尺寸不齐的第一个入口)。
|
|
20
|
+
*/
|
|
21
|
+
[data-manohub-ui] {
|
|
22
|
+
--ui-space-1: 4px; --ui-space-2: 8px; --ui-space-3: 12px;
|
|
23
|
+
--ui-space-4: 16px; --ui-space-5: 20px; --ui-space-6: 24px;
|
|
24
|
+
|
|
25
|
+
--ui-control-height-sm: 24px; /* 小号控件:表格行内、密集工具条 */
|
|
26
|
+
--ui-control-height-md: 32px; /* 标准控件高:按钮 / 输入框 / 选择器缺省档 */
|
|
27
|
+
--ui-control-height-lg: 40px; /* 大号控件:表单首屏主字段 */
|
|
28
|
+
--ui-row-height: 36px;
|
|
29
|
+
--ui-header-height: 48px;
|
|
30
|
+
|
|
31
|
+
/* 栅格单元最小宽度(Layout.Row 与 ListView 共用):比表单列宽(--ui-form-column-min,见 form.css)
|
|
32
|
+
窄一档 —— 表单字段要放下「label + 控件」,而栅格单元(卡片/内容块)可以更窄。
|
|
33
|
+
用于「列数上限 N + 最小列宽」公式里 track 的下限(实测:600px 仍排 2 列、500px 折成 1 列)。 */
|
|
34
|
+
--ui-grid-column-min: 260px;
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字体令牌(字阶 / 行高 / 字重 / 等宽族)。
|
|
3
|
+
*
|
|
4
|
+
* 分层与 `@aihub/theme` 的 `base/typography.css` 对齐;取值取自《MH后台-0911》品牌页实测:
|
|
5
|
+
* 页头标题 `18/28 w600`(node `0:3902`)、卡片标题 `16/24`(`0:1556` 区段头)、
|
|
6
|
+
* 卡片描述与正文 `14/20`、次级文字 `13/20`、表格内 20 高标签 `12/15`(`0:2723`)。
|
|
7
|
+
*
|
|
8
|
+
* **行高的两处口径**:
|
|
9
|
+
* - `--ui-line-body`(14px 档)取 **20**:设计稿里 14px 有两组行高 —— 控件内单行(按钮、
|
|
10
|
+
* 输入框)是 `14/18`,会换行的说明文字是 `14/20`。本令牌的消费者以「可能换行的说明文字」
|
|
11
|
+
* 为主(`notice` / `dialog` / `filter` / `form`),故取正文档;控件内单行文字走固定高 + 居中,
|
|
12
|
+
* 对行高不敏感,不为此另开一档。
|
|
13
|
+
* - `--ui-line-micro` / `--ui-line-display` **有意未建**:两档目前都只有字号消费者、没有行高消费者
|
|
14
|
+
* (12px 档用于标签,标签是 `line-height: 1`;20px 档见设计 `0:1548` 的 `20/28 w500` 但尚未落件)。
|
|
15
|
+
* 无消费者前不预置令牌(见 `default/index.css` 同一口径)—— 别为了「成对好看」补上空令牌,
|
|
16
|
+
* 那样只会多出一枚没人验证的值。
|
|
17
|
+
*/
|
|
18
|
+
[data-manohub-ui] {
|
|
19
|
+
/* 密度档位(`micro` 是设计稿最小的实体字阶:表格内 20 高标签的「测试」= 12/15) */
|
|
20
|
+
--ui-font-micro: 12px;
|
|
21
|
+
--ui-font-caption: 13px;
|
|
22
|
+
--ui-font-body: 14px;
|
|
23
|
+
--ui-font-heading: 16px;
|
|
24
|
+
--ui-font-title: 18px;
|
|
25
|
+
--ui-font-display: 20px;
|
|
26
|
+
--ui-font-icon: 14px;
|
|
27
|
+
|
|
28
|
+
--ui-line-caption: 20px;
|
|
29
|
+
--ui-line-body: 20px;
|
|
30
|
+
--ui-line-heading: 24px;
|
|
31
|
+
--ui-line-title: 28px;
|
|
32
|
+
|
|
33
|
+
--ui-weight-regular: 400;
|
|
34
|
+
--ui-weight-medium: 500;
|
|
35
|
+
--ui-weight-semibold: 600;
|
|
36
|
+
|
|
37
|
+
--ui-font-mono: Consolas, Monaco, 'Courier New', monospace;
|
|
38
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Farris 主题 · 色彩令牌。
|
|
3
|
+
*
|
|
4
|
+
* 值全部取自 `@aihub/theme` 的 `base/colors.css`(《Farris Web 基础视觉规范》Figma 导出 2026-09-09),
|
|
5
|
+
* 行尾括注为该规范的色板编号(Th/Au/Ne/Te/Focus/Success/Warning/Danger),便于回主题包对照检索。
|
|
6
|
+
*
|
|
7
|
+
* 锚 `[data-manohub-ui][data-theme='farris']`:加上属性即整包换皮(见 `default/index.css` 的换主题约定)。
|
|
8
|
+
* **本主题必须全量覆盖 default 的令牌**(否则会与 default 混成半套主题;护栏在
|
|
9
|
+
* `__tests__/contract-tokens.spec.ts` 的「主题覆盖度」用例)。
|
|
10
|
+
*/
|
|
11
|
+
[data-manohub-ui][data-theme='farris'] {
|
|
12
|
+
/* ===== 品牌主色(科技蓝 Th 族) ===== */
|
|
13
|
+
--ui-primary: #2a87ff; /* Th04 主要按钮默认背景 / 链接默认色 */
|
|
14
|
+
--ui-primary-content: #ffffff; /* Te11 主按钮文字 */
|
|
15
|
+
--ui-primary-hover: #529dff; /* Th05 滑过 */
|
|
16
|
+
/* 轻量主色底:badge 底 / 聚焦环 / 卡片滑过底 —— 规范 Au04「分页页码选中、胶囊页签背景」 */
|
|
17
|
+
--ui-primary-weak: #eff5ff;
|
|
18
|
+
/* 选中态底:树行 / 卡片选中 —— 规范 Au02「表格/树表选中背景」(语义正好对上) */
|
|
19
|
+
--ui-primary-subtle: #dbe9ff;
|
|
20
|
+
/* 浅主色描边:规范 Au01「表格选中行下划线」(规范里唯一一枚浅主色描边档) */
|
|
21
|
+
--ui-primary-border: #c9e0ff;
|
|
22
|
+
|
|
23
|
+
/* ===== 中性阶 ===== */
|
|
24
|
+
--ui-base-50: #fafafc; /* Ne14 表格/树表禁用行 */
|
|
25
|
+
--ui-base-100: #ffffff; /* Ne12 卡片与输入框背景 */
|
|
26
|
+
--ui-base-200: #f5f6f9; /* Ne10 选择器选中行 / 输入框禁用背景 */
|
|
27
|
+
--ui-base-300: #e8ebf2; /* Ne08 弱边框(卡片描边的主手段) */
|
|
28
|
+
--ui-base-400: #d9dee7; /* Ne04 复选框 / 输入框 / 筛选项默认边框 */
|
|
29
|
+
--ui-base-content: #2d2f33; /* Te01/Te02 标题与通用正文 */
|
|
30
|
+
--ui-base-content-muted: #5a5e66; /* Te04 标签文字 / 表头 */
|
|
31
|
+
--ui-base-content-subtle: #747b8b; /* Te06 辅助说明 */
|
|
32
|
+
|
|
33
|
+
/* ===== 语义状态(01 文字 / 02 边框 / 03 浅背景三件套) ===== */
|
|
34
|
+
--ui-info: #4190ff; /* Focus01 */
|
|
35
|
+
--ui-info-content: #ffffff; /* Te11 */
|
|
36
|
+
--ui-success: #5fc875; /* Success01 */
|
|
37
|
+
--ui-success-content: #ffffff; /* Te11 */
|
|
38
|
+
--ui-warning: #f7933b; /* Warning01 */
|
|
39
|
+
--ui-warning-content: #2d2f33; /* Te01(规范未给 Warning 前景,取标题色) */
|
|
40
|
+
--ui-error: #f15e5d; /* Danger01 */
|
|
41
|
+
--ui-error-content: #ffffff; /* Te11 */
|
|
42
|
+
|
|
43
|
+
--ui-info-weak: #ecf4ff; /* Focus03 */
|
|
44
|
+
--ui-info-border: #aed1ff; /* Focus02 */
|
|
45
|
+
--ui-success-weak: #f0f9f2; /* Success03 */
|
|
46
|
+
--ui-success-border: #b5e3bf; /* Success02 */
|
|
47
|
+
--ui-warning-weak: #fef5ec; /* Warning03 */
|
|
48
|
+
--ui-warning-border: #fad0a1; /* Warning02 */
|
|
49
|
+
--ui-error-weak: #fdefef; /* Danger03 */
|
|
50
|
+
--ui-error-border: #f9b0af; /* Danger02 */
|
|
51
|
+
|
|
52
|
+
/* 浅底上的状态文字:规范**以状态基色承载**,
|
|
53
|
+
本包把它拆成 -strong 槽位,故此处取基色 —— 若觉得浅底绿字对比不足,那是规范取值本身的问题。 */
|
|
54
|
+
--ui-success-strong: #5fc875; /* Success01 */
|
|
55
|
+
--ui-warning-strong: #f7933b; /* Warning01 */
|
|
56
|
+
|
|
57
|
+
/* 必填星号:规范 `components/field.css` 的 `--ak-field-required`(Input 专页实测红) */
|
|
58
|
+
--ui-required-mark: #f46160;
|
|
59
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Farris 主题(对外公开为 `@manohub/theme/farris.css`)。
|
|
3
|
+
*
|
|
4
|
+
* 全量令牌取自 `@aihub/theme`(《Farris Web 基础视觉规范》),命名映射到本包的 `--ui-*` 槽位 ——
|
|
5
|
+
* 组件类名、组件代码、组件面一个字都不动,纯粹换「值」。
|
|
6
|
+
*
|
|
7
|
+
* 与 default 的关系(这也是多主题的通用约定):
|
|
8
|
+
* - `default/` 锚 `[data-manohub-ui]`,是**不带属性选择器的兜底套**,永远先生效;
|
|
9
|
+
* - 本主题锚 `[data-manohub-ui][data-theme='farris']`,给锚加上 `data-theme` 即整包换皮
|
|
10
|
+
* (`createSubApp({ theme: 'farris' })` 会写这个属性);
|
|
11
|
+
* - 因此本主题**必须全量覆盖 default 的每一枚令牌**,缺一枚就会出现"半套主题"(default 兜底 + farris 局部),
|
|
12
|
+
* 覆盖度由 `__tests__/contract-tokens.spec.ts` 的「主题覆盖度」用例机械校验。
|
|
13
|
+
*
|
|
14
|
+
* 锚点同样**不写 `:root`**:micro-app 的 scopecss 不作用域化 `:root`,变量会泄漏到宿主全局。
|
|
15
|
+
*/
|
|
16
|
+
@import './colors.css';
|
|
17
|
+
@import './typography.css';
|
|
18
|
+
@import './spacing.css';
|
|
19
|
+
@import './radius.css';
|
|
20
|
+
@import './shadows.css';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Farris 主题 · 圆角令牌。
|
|
3
|
+
*
|
|
4
|
+
* 取自 `@aihub/theme` 的 `base/radius.css`(规范只有三档:控件 6 / 复选框 3 / 胶囊)与
|
|
5
|
+
* `components/card.css`(内容卡片圆角 8px 实测)。
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 已知差异(换主题不改令牌结构带来的代价,如实登记):规范里徽标 / 标签是**胶囊**(`9999px`),
|
|
8
|
+
* 而本包的 `Badge` / `Tag` 走 `--ui-radius-xs`(3) 与 `--ui-radius-sm`(4) 的小圆角档
|
|
9
|
+
* (default 主题的设计源给的就是小圆角,见 `default/radius.css` 的四档表)。
|
|
10
|
+
* 一个槽位不能同时是 3px 与胶囊 —— 此处保留本包的体量档结构,徽标要不要变胶囊属**形态**问题
|
|
11
|
+
* (API 变更),不在换皮范围。
|
|
12
|
+
*
|
|
13
|
+
* 好消息:`--ui-radius-xs` 恰好对上规范的复选框档 3px,故**复选框在两套主题下都是 3px**
|
|
14
|
+
* (改前 default 用 4px 且被硬编码挡着、farris 声明的 3px 从未生效 —— 本轮一并修掉)。
|
|
15
|
+
*/
|
|
16
|
+
[data-manohub-ui][data-theme='farris'] {
|
|
17
|
+
--ui-radius-xs: 3px; /* --mh-radius-checkbox:规范只有「复选框 3px」这一枚小圆角 */
|
|
18
|
+
--ui-radius-sm: 4px; /* 规范未给 4px 槽位 → 沿用 default 值(页头图标块 / 下拉选项行) */
|
|
19
|
+
--ui-radius-control: 6px; /* --mh-radius-control:按钮 / 输入框 / 树节点行 */
|
|
20
|
+
--ui-radius-md: 8px; /* --mh-card-radius:内容卡片实测 */
|
|
21
|
+
--ui-radius-full: 9999px; /* --mh-radius-full */
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Farris 主题 · 投影与遮罩令牌。
|
|
3
|
+
*
|
|
4
|
+
* 取值取自 `@aihub/theme` 的 `base/shadows.css`(规范 Shadows 页 4dp→18dp 阶梯,投影基准 #031b4e)
|
|
5
|
+
* 与 `components/card.css`(卡片 4dp 静态 → 10dp 悬浮)。
|
|
6
|
+
*
|
|
7
|
+
* 遮罩与微蒙层四枚规范未给对应槽位 → 沿用 default 值。**不映射规范的弹层遮罩档(0.45)**:
|
|
8
|
+
* 那是弹出层遮罩,与本包 `--ui-mask`(0.1 的轻蒙层,消费方可能用于局部压暗)不是同一语义,
|
|
9
|
+
* 直接换值会误伤消费方页面。
|
|
10
|
+
*/
|
|
11
|
+
[data-manohub-ui][data-theme='farris'] {
|
|
12
|
+
/* 卡片阶梯(环境光) */
|
|
13
|
+
--ui-shadow-card: 1px 1px 4px rgba(3, 27, 78, 0.04); /* --mh-shadow-xs:4dp 卡片静态 */
|
|
14
|
+
--ui-shadow-card-hover: 1px 1px 10px rgba(3, 27, 78, 0.1); /* --mh-shadow-md:10dp 卡片悬浮 */
|
|
15
|
+
|
|
16
|
+
/* 浮层阶梯(关键光) */
|
|
17
|
+
--ui-shadow-elevated: 0 5px 14px rgba(3, 27, 78, 0.18); /* --mh-shadow-xl:18dp 对话框 / 抽屉 */
|
|
18
|
+
--ui-shadow-popover: 0 3px 10px rgba(3, 27, 78, 0.14); /* --mh-shadow-lg:14dp 下拉 / 弹出层 */
|
|
19
|
+
|
|
20
|
+
/* 规范无对应槽位 → 沿用 default */
|
|
21
|
+
--ui-overlay-weak: rgba(15, 23, 42, 0.04);
|
|
22
|
+
--ui-overlay-strong: rgba(15, 23, 42, 0.06);
|
|
23
|
+
--ui-mask: rgba(0, 14, 51, 0.1);
|
|
24
|
+
--ui-mask-light: rgba(255, 255, 255, 0.6);
|
|
25
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Farris 主题 · 间距与尺寸令牌。
|
|
3
|
+
*
|
|
4
|
+
* 取值取自 `@aihub/theme` 的 `base/spacing.css`。注意规范的刻度比本包密(3=10px、4=12px、5=14px、6=16px…),
|
|
5
|
+
* 故本包的五档是**按值对位**(4/8/12/16/24),不是按序号对位。
|
|
6
|
+
*
|
|
7
|
+
* 规范**未给**的槽位(大号控件高、行高、页头条高、栅格单元下限)沿用 default 值并在此注明 ——
|
|
8
|
+
* 宁可如实标注"无出处",也不凭空造数(与 theme 包「无出处令牌一律撤除」的同一口径,
|
|
9
|
+
* 只是这里因为槽位已被消费方使用而不能撤)。
|
|
10
|
+
*/
|
|
11
|
+
[data-manohub-ui][data-theme='farris'] {
|
|
12
|
+
/* 布局间距(对位 --mh-space-1/2/4/6/8) */
|
|
13
|
+
--ui-space-1: 4px;
|
|
14
|
+
--ui-space-2: 8px; /* 同类按钮组间距 */
|
|
15
|
+
--ui-space-3: 12px;
|
|
16
|
+
--ui-space-4: 16px;
|
|
17
|
+
--ui-space-5: 20px; /* --mh-space-7 */
|
|
18
|
+
--ui-space-6: 24px;
|
|
19
|
+
|
|
20
|
+
/* 控件尺寸:规范「S/紧凑与 M/舒适主题同尺寸」,实测 26px → 两档同值(档位语义仍由类名区分) */
|
|
21
|
+
--ui-control-height-sm: 26px;
|
|
22
|
+
--ui-control-height-md: 26px;
|
|
23
|
+
|
|
24
|
+
/* 以下四枚规范未给槽位 → 沿用 default 值 */
|
|
25
|
+
--ui-control-height-lg: 40px;
|
|
26
|
+
--ui-row-height: 36px;
|
|
27
|
+
--ui-header-height: 48px;
|
|
28
|
+
--ui-grid-column-min: 260px; /* 栅格水槽 28px 与「单元最小宽度」不是同一件事 */
|
|
29
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Farris 主题 · 字体令牌。
|
|
3
|
+
*
|
|
4
|
+
* 取自 `@aihub/theme` 的 `base/typography.css`(规范 S/紧凑档字阶:12/16 → 14/20 → 16/24,17/24 数值强调,
|
|
5
|
+
* 18/25 为 M 档数值强调)。映射按**规范自己的字号-行高配对**逐个对位,不跨档取近似值。
|
|
6
|
+
*/
|
|
7
|
+
[data-manohub-ui][data-theme='farris'] {
|
|
8
|
+
/* 字号(--mh-font-size-* 对位) */
|
|
9
|
+
--ui-font-micro: 12px; /* xs:规范 S 档最低一阶(常规正文 / 状态标签) */
|
|
10
|
+
--ui-font-caption: 13px; /* sm:数字版页签选中文字;本包的树行 / 表格正文档 */
|
|
11
|
+
--ui-font-body: 14px; /* md:控件内容 / 二级标题(卡片标题) */
|
|
12
|
+
--ui-font-heading: 16px; /* lg:一级标题(页面标题) */
|
|
13
|
+
--ui-font-title: 18px; /* 2xl:M 档数值强调 */
|
|
14
|
+
/* 规范 S/M 档顶档为 18px,无 20px 槽位:沿用 default 值,避免 display 与 title 塌成同一档 */
|
|
15
|
+
--ui-font-display: 20px;
|
|
16
|
+
/* 常规图标档:规范**没有全局图标尺寸槽位**(各家族的图标各有实测值 —— 按钮字形 16、下拉箭头槽 14、
|
|
17
|
+
步骤节点 16 …),故如实沿用 default 值;组件侧的常规图标统一取它 */
|
|
18
|
+
--ui-font-icon: 14px;
|
|
19
|
+
|
|
20
|
+
/* 行高(按规范成对关系:13/18、14/20、16/24、18/25)。
|
|
21
|
+
规范另有 12/16 一档,但本包暂无行高消费者 → 不预置(与 default 同口径,见其文件头)。 */
|
|
22
|
+
--ui-line-caption: 18px; /* --mh-line-height-sm */
|
|
23
|
+
--ui-line-body: 20px; /* --mh-line-height-md */
|
|
24
|
+
--ui-line-heading: 24px; /* --mh-line-height-lg */
|
|
25
|
+
--ui-line-title: 25px; /* --mh-line-height-2xl */
|
|
26
|
+
|
|
27
|
+
/* 字重:规范只用三档(600 仅用于英文与数字加粗) */
|
|
28
|
+
--ui-weight-regular: 400;
|
|
29
|
+
--ui-weight-medium: 500;
|
|
30
|
+
--ui-weight-semibold: 600;
|
|
31
|
+
|
|
32
|
+
--ui-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
|
|
33
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@manohub/theme",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "AIHub 主题包:纯 CSS 令牌层(全局值),全部锚 [data-manohub-ui] 属性。零运行时依赖、零 JS、零真实样式声明。",
|
|
7
|
+
"license": "UNLICENSED",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://git.iec.io/gsp-cloud-ds/dip/ibp/aihub/frontend-infra.git",
|
|
11
|
+
"directory": "packages/theme"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"registry": "https://registry.npmjs.org/",
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": [
|
|
22
|
+
"**/*.css"
|
|
23
|
+
],
|
|
24
|
+
"exports": {
|
|
25
|
+
"./default.css": "./dist/default/index.css",
|
|
26
|
+
"./farris.css": "./dist/farris/index.css"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "node ../../scripts/clean-dist.mjs && node scripts/copy-styles.mjs",
|
|
30
|
+
"type-check": "tsc --noEmit -p tsconfig.json",
|
|
31
|
+
"test:unit": "vitest run",
|
|
32
|
+
"test:watch": "vitest"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^24.0.0",
|
|
36
|
+
"vitest": "^3.2.7"
|
|
37
|
+
}
|
|
38
|
+
}
|