@manohub/ui 0.10.5 → 1.0.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 +155 -155
- package/dist/components/form/index.js +8 -1
- package/dist/styles/components/avatar.css +131 -131
- package/dist/styles/components/avatar.tokens.css +24 -24
- package/dist/styles/components/badge.css +266 -266
- package/dist/styles/components/badge.tokens.css +24 -24
- package/dist/styles/components/button.css +460 -460
- package/dist/styles/components/capsule.css +128 -128
- package/dist/styles/components/capsule.tokens.css +27 -27
- package/dist/styles/components/card.css +198 -198
- package/dist/styles/components/checkbox.css +145 -145
- package/dist/styles/components/checkbox.tokens.css +26 -26
- package/dist/styles/components/code-block.css +216 -216
- package/dist/styles/components/code-block.tokens.css +40 -40
- package/dist/styles/components/collapse.css +62 -62
- package/dist/styles/components/collapse.tokens.css +20 -20
- package/dist/styles/components/dialog.css +158 -158
- package/dist/styles/components/dialog.tokens.css +24 -24
- package/dist/styles/components/divider.css +75 -75
- package/dist/styles/components/divider.tokens.css +22 -22
- package/dist/styles/components/drawer.css +143 -143
- package/dist/styles/components/drawer.tokens.css +22 -22
- package/dist/styles/components/filter.css +29 -29
- package/dist/styles/components/form.css +442 -425
- package/dist/styles/components/form.tokens.css +15 -15
- package/dist/styles/components/input.css +538 -538
- package/dist/styles/components/input.tokens.css +43 -43
- package/dist/styles/components/layout.css +200 -200
- package/dist/styles/components/list-view.css +244 -244
- package/dist/styles/components/loading.css +76 -76
- package/dist/styles/components/loading.tokens.css +23 -23
- package/dist/styles/components/nav.css +48 -48
- package/dist/styles/components/notice.css +153 -153
- package/dist/styles/components/notice.tokens.css +17 -17
- package/dist/styles/components/notification.css +159 -159
- package/dist/styles/components/notification.tokens.css +37 -37
- package/dist/styles/components/page.css +473 -473
- package/dist/styles/components/pagination.css +303 -303
- package/dist/styles/components/pagination.tokens.css +32 -32
- package/dist/styles/components/panel.css +77 -77
- package/dist/styles/components/query-state.css +88 -88
- package/dist/styles/components/radio.css +271 -271
- package/dist/styles/components/radio.tokens.css +26 -26
- package/dist/styles/components/search.css +34 -34
- package/dist/styles/components/select.css +326 -326
- package/dist/styles/components/select.tokens.css +44 -44
- package/dist/styles/components/skeleton.css +60 -60
- package/dist/styles/components/skeleton.tokens.css +27 -27
- package/dist/styles/components/steps.css +205 -205
- package/dist/styles/components/steps.tokens.css +44 -44
- package/dist/styles/components/switch.css +165 -165
- package/dist/styles/components/switch.tokens.css +26 -26
- package/dist/styles/components/tabbar.css +235 -235
- package/dist/styles/components/tabbar.tokens.css +30 -30
- package/dist/styles/components/table.css +504 -504
- package/dist/styles/components/table.tokens.css +44 -44
- package/dist/styles/components/tag.css +127 -127
- package/dist/styles/components/tag.tokens.css +24 -24
- package/dist/styles/components/toast.css +185 -185
- package/dist/styles/components/toast.tokens.css +26 -26
- package/dist/styles/components/tooltip.css +89 -89
- package/dist/styles/components/tooltip.tokens.css +25 -25
- package/dist/styles/components/tree.css +173 -173
- package/dist/styles/components/upload.css +151 -151
- package/dist/styles/components/upload.tokens.css +27 -27
- package/dist/styles/index.css +153 -153
- package/dist/styles/operations/collapse.css +84 -84
- package/dist/styles/operations/popup.css +193 -193
- package/dist/styles/operations/tabs.css +82 -82
- package/package.json +62 -62
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* avatar —— 单件令牌(**基础值**)。
|
|
3
|
-
*
|
|
4
|
-
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
|
-
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `avatar.css` 顶部):这些是**基础值**,锚在
|
|
8
|
-
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
11
|
-
*
|
|
12
|
-
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
13
|
-
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
14
|
-
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
15
|
-
*/
|
|
16
|
-
[data-manohub-ui] {
|
|
17
|
-
/* 单件令牌(只服务本件;跨件令牌才进 theme/) */
|
|
18
|
-
--ui-avatar-size-sm: 24px;
|
|
19
|
-
--ui-avatar-size-md: 36px;
|
|
20
|
-
--ui-avatar-size-lg: 60px;
|
|
21
|
-
--ui-avatar-size-xl: 80px;
|
|
22
|
-
--ui-avatar-badge-size: 20px; /* 角标高 20,宽按位数撑开 */
|
|
23
|
-
--ui-avatar-gap: 10px; /* 堆叠重叠量(组件可用 gap 覆盖) */
|
|
24
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* avatar —— 单件令牌(**基础值**)。
|
|
3
|
+
*
|
|
4
|
+
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
|
+
*
|
|
6
|
+
* ## 抽出说明
|
|
7
|
+
* 本文件从面文件里抽出(原先混写在 `avatar.css` 顶部):这些是**基础值**,锚在
|
|
8
|
+
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
+
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
+
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
13
|
+
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
14
|
+
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
15
|
+
*/
|
|
16
|
+
[data-manohub-ui] {
|
|
17
|
+
/* 单件令牌(只服务本件;跨件令牌才进 theme/) */
|
|
18
|
+
--ui-avatar-size-sm: 24px;
|
|
19
|
+
--ui-avatar-size-md: 36px;
|
|
20
|
+
--ui-avatar-size-lg: 60px;
|
|
21
|
+
--ui-avatar-size-xl: 80px;
|
|
22
|
+
--ui-avatar-badge-size: 20px; /* 角标高 20,宽按位数撑开 */
|
|
23
|
+
--ui-avatar-gap: 10px; /* 堆叠重叠量(组件可用 gap 覆盖) */
|
|
24
|
+
}
|
|
@@ -1,266 +1,266 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Badge(徽标 / 标签)。
|
|
3
|
-
*
|
|
4
|
-
* 依据:@aihub/theme 的 components/badge.css(徽标高 20 / 胶囊)与 components/tag.css(标签片几何)。
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/* ===== Badge(徽标 / 标签)=====
|
|
8
|
-
批次 5 前 4 个应用各自手搓徽标,这里按设计稿收敛为 tone × shape × size × dot 的正交组合。
|
|
9
|
-
每个 tone 先铺一组局部变量(前景 / 底色 / 描边 / 圆点),形态类只决定「用哪几个变量」。 */
|
|
10
|
-
|
|
11
|
-
.mh-badge {
|
|
12
|
-
--mh-badge-fg: var(--ui-base-content);
|
|
13
|
-
--mh-badge-bg: transparent;
|
|
14
|
-
--mh-badge-border: transparent;
|
|
15
|
-
--mh-badge-dot: var(--ui-base-content-subtle);
|
|
16
|
-
display: inline-flex;
|
|
17
|
-
align-items: center;
|
|
18
|
-
justify-content: center;
|
|
19
|
-
gap: 6px;
|
|
20
|
-
box-sizing: border-box;
|
|
21
|
-
border: 1px solid transparent;
|
|
22
|
-
font-size: var(--ui-font-caption);
|
|
23
|
-
/* `as="button"`(可点形态,`Tag` 的「新增」用)时根是 `<button>`:UA 会把字形换成 Arial、
|
|
24
|
-
文字居中、并给 padding/border/background —— 后三样本件已自带(`.mh-badge` 的框与各档内距),
|
|
25
|
-
只有字族漏在外面,这里补上(对 `<span>` 根无副作用:span 本就继承)。 */
|
|
26
|
-
font-family: inherit;
|
|
27
|
-
line-height: 1;
|
|
28
|
-
white-space: nowrap;
|
|
29
|
-
color: var(--mh-badge-fg);
|
|
30
|
-
background: var(--mh-badge-bg);
|
|
31
|
-
border-color: var(--mh-badge-border);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/* 尺寸档的圆角吃**体量档**(`xs` / `sm`),不吃容器档 `md` —— 容器档一改(卡片圆角调整)
|
|
35
|
-
徽标会跟着变,那是两件无关的事。20 档有设计实证(表格内标签 r3),24 档无实证、按体量就近升一档。
|
|
36
|
-
高度取**标记体量档**(全局令牌 `--ui-mark-height-sm/md`):与 `Tag` 的 20 / 24、`Select` 多选
|
|
37
|
-
标签片的 24 同源 —— 这三处以前各写一份字面量,改一次档要改三处(2026-09-30 收敛)。
|
|
38
|
-
`Tag` 的基础圆角同日也归到这两档(改前它走控件档 6px):两族在 20 / 24 上同高同角。 */
|
|
39
|
-
.mh-badge--sm {
|
|
40
|
-
height: var(--ui-mark-height-sm);
|
|
41
|
-
padding: 0 6px;
|
|
42
|
-
min-width: 36px;
|
|
43
|
-
border-radius: var(--ui-radius-xs);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.mh-badge--md {
|
|
47
|
-
height: var(--ui-mark-height-md);
|
|
48
|
-
padding: 0 8px;
|
|
49
|
-
border-radius: var(--ui-radius-sm);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.mh-badge--default {
|
|
53
|
-
--mh-badge-fg: var(--ui-base-content);
|
|
54
|
-
--mh-badge-dot: var(--ui-base-content-subtle);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.mh-badge--primary {
|
|
58
|
-
--mh-badge-fg: var(--ui-primary);
|
|
59
|
-
--mh-badge-bg: var(--ui-primary-weak);
|
|
60
|
-
--mh-badge-border: var(--ui-primary);
|
|
61
|
-
--mh-badge-dot: var(--ui-primary);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.mh-badge--info {
|
|
65
|
-
--mh-badge-fg: var(--ui-info);
|
|
66
|
-
--mh-badge-bg: var(--ui-info-weak);
|
|
67
|
-
--mh-badge-border: var(--ui-info);
|
|
68
|
-
--mh-badge-dot: var(--ui-info);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.mh-badge--success {
|
|
72
|
-
--mh-badge-fg: var(--ui-success);
|
|
73
|
-
--mh-badge-bg: var(--ui-success-weak);
|
|
74
|
-
--mh-badge-border: var(--ui-success);
|
|
75
|
-
--mh-badge-dot: var(--ui-success);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.mh-badge--warning {
|
|
79
|
-
--mh-badge-fg: var(--ui-warning);
|
|
80
|
-
--mh-badge-bg: var(--ui-warning-weak);
|
|
81
|
-
--mh-badge-border: var(--ui-warning);
|
|
82
|
-
--mh-badge-dot: var(--ui-warning);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.mh-badge--error {
|
|
86
|
-
--mh-badge-fg: var(--ui-error);
|
|
87
|
-
--mh-badge-bg: var(--ui-error-weak);
|
|
88
|
-
--mh-badge-border: var(--ui-error);
|
|
89
|
-
--mh-badge-dot: var(--ui-error);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/* 浅底标签:只取浅底 + 同色文字(无描边) */
|
|
93
|
-
|
|
94
|
-
.mh-badge--soft {
|
|
95
|
-
background: var(--mh-badge-bg);
|
|
96
|
-
border-color: transparent;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/* 中性软底取 `base-200`(中性面)—— 改前是 `base-50`:那档只比内容底低 1.7 L*,
|
|
100
|
-
软底淡到与背景不可分(同族 `--primary` 软底也走「弱底」档,此处与之等形)。 */
|
|
101
|
-
.mh-badge--soft.mh-badge--default {
|
|
102
|
-
--mh-badge-bg: var(--ui-base-200);
|
|
103
|
-
--mh-badge-fg: var(--ui-base-content-muted);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/* ⚠️ 主色软底取**浅底档** `--ui-primary-weak`(同一槽位的其他消费者:`Tag` 默认底、表壳滑过底、
|
|
107
|
-
聚焦环);**不取** `--ui-primary-subtle` —— 那是**选中态底**(树行 / 表格行 / 卡片选中 / 单选卡),
|
|
108
|
-
两档在 default 主题里差一整档(#EFF5FF → #DBE9FF),取错会让徽标比同排的标签深一档,
|
|
109
|
-
而徽标表达的是「标记」不是「选中」(2026-09-30 收敛,槽位口径见
|
|
110
|
-
`@manohub/theme` 的 `default/colors.css` 品牌槽位两条注释)。 */
|
|
111
|
-
.mh-badge--soft.mh-badge--primary {
|
|
112
|
-
--mh-badge-bg: var(--ui-primary-weak);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/* 描边:浅底 + 同色描边;default 退化为白底 + 中性描边 + 正文色(状态胶囊) */
|
|
116
|
-
|
|
117
|
-
.mh-badge--outline {
|
|
118
|
-
background: var(--mh-badge-bg);
|
|
119
|
-
border-color: var(--mh-badge-border);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
.mh-badge--outline.mh-badge--default {
|
|
123
|
-
--mh-badge-bg: var(--ui-base-100);
|
|
124
|
-
--mh-badge-border: var(--ui-base-300);
|
|
125
|
-
--mh-badge-fg: var(--ui-base-content);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/* 无底无框:靠圆点表达状态;成功 / 中性用正文色,错误用危险色 */
|
|
129
|
-
|
|
130
|
-
.mh-badge--plain {
|
|
131
|
-
background: transparent;
|
|
132
|
-
border-color: transparent;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
.mh-badge--plain.mh-badge--default {
|
|
136
|
-
--mh-badge-fg: var(--ui-base-content-muted);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
.mh-badge--plain.mh-badge--success {
|
|
140
|
-
--mh-badge-fg: var(--ui-base-content);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.mh-badge--plain.mh-badge--error {
|
|
144
|
-
--mh-badge-fg: var(--ui-error);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/* ===== 前置点 / 状态点:**光学对齐**(下移 1px)=====
|
|
148
|
-
两族的圆点都被 flex 居中在**盒中心**(实测偏心 0px),但**文字的墨迹中心在盒中心之下**:
|
|
149
|
-
中文(`带点(填充)`)约 +0.5px、纯小写(`sm` / `md`)约 +2px、状态点那族(14px)约 +1px
|
|
150
|
-
—— 于是盒居中读起来是「点偏高」(2026-09-30 用户反馈,文档站 3× 放大逐档比对确认)。
|
|
151
|
-
下移 1px 是这几种串的**折中**:中文偏下 0.5px、纯小写偏上 1px。
|
|
152
|
-
没有再细分的办法 —— 小写字母的墨迹中心本就低于盒中心,任何单一常数都盖不住两种极端。
|
|
153
|
-
位移走 `top`(绘制层):不参与 flex 布局,点仍被盒居中,只是看起来对着字。
|
|
154
|
-
⚠️ 位移取值在**值区**(`badge.tokens.css` 的 `--ui-badge-dot-shift`):本件有两个互不嵌套的
|
|
155
|
-
根类(`.mh-badge` / `.mh-badge--status`),声明在任一**根类**上都到不了另一个根。 */
|
|
156
|
-
|
|
157
|
-
.mh-badge__dot {
|
|
158
|
-
width: 8px;
|
|
159
|
-
height: 8px;
|
|
160
|
-
flex: none;
|
|
161
|
-
border-radius: var(--ui-radius-full);
|
|
162
|
-
position: relative;
|
|
163
|
-
top: var(--ui-badge-dot-shift);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
.mh-badge--dot-filled .mh-badge__dot {
|
|
167
|
-
background: var(--mh-badge-dot);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
.mh-badge--dot-ring .mh-badge__dot {
|
|
171
|
-
box-sizing: border-box;
|
|
172
|
-
border: 2px solid var(--mh-badge-dot);
|
|
173
|
-
background: var(--ui-base-100);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/* ===== 数字角标(count)=====
|
|
177
|
-
* 一份面覆盖两种用法:**独立显示**(无子元素)时它就是一枚胶囊;
|
|
178
|
-
* **包裹子元素**时容器转 `relative`、角标脱流钉在右上角(`:has()` 判别,不需要第二套 DOM)。 */
|
|
179
|
-
.mh-badge--count {
|
|
180
|
-
position: relative;
|
|
181
|
-
display: inline-flex;
|
|
182
|
-
align-items: center;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
.mh-badge__count {
|
|
186
|
-
display: inline-flex;
|
|
187
|
-
align-items: center;
|
|
188
|
-
justify-content: center;
|
|
189
|
-
min-width: 18px;
|
|
190
|
-
height: 18px;
|
|
191
|
-
padding: 0 5px;
|
|
192
|
-
/* 白圈:钉在头像 / 图标上时与底色分离(没有它,角标会像长在图标里的一块) */
|
|
193
|
-
border: 2px solid var(--ui-base-100);
|
|
194
|
-
border-radius: var(--ui-radius-full);
|
|
195
|
-
font-size: 12px;
|
|
196
|
-
font-weight: var(--ui-weight-medium);
|
|
197
|
-
line-height: 1;
|
|
198
|
-
white-space: nowrap;
|
|
199
|
-
/* 缺省即「危险红」:数字角标表达的是「有未读 / 有异常」,与主流库同口径 */
|
|
200
|
-
background: var(--ui-error);
|
|
201
|
-
color: var(--ui-error-content);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/* 包裹态:角标脱流钉右上角(`translate(50%, -50%)` 让它挂在内容的角上而不是压进去) */
|
|
205
|
-
.mh-badge--count:has(> :not(.mh-badge__count)) > .mh-badge__count {
|
|
206
|
-
position: absolute;
|
|
207
|
-
top: 0;
|
|
208
|
-
right: 0;
|
|
209
|
-
transform: translate(50%, -50%);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/* 角标的 tone:实色底 + 反白字(与内容徽标的浅底同色字不同 —— 角标要够跳) */
|
|
213
|
-
.mh-badge__count.mh-badge--primary {
|
|
214
|
-
background: var(--ui-primary);
|
|
215
|
-
color: var(--ui-primary-content);
|
|
216
|
-
}
|
|
217
|
-
.mh-badge__count.mh-badge--info {
|
|
218
|
-
background: var(--ui-info);
|
|
219
|
-
color: var(--ui-info-content);
|
|
220
|
-
}
|
|
221
|
-
.mh-badge__count.mh-badge--success {
|
|
222
|
-
background: var(--ui-success);
|
|
223
|
-
color: var(--ui-success-content);
|
|
224
|
-
}
|
|
225
|
-
.mh-badge__count.mh-badge--warning {
|
|
226
|
-
background: var(--ui-warning);
|
|
227
|
-
color: var(--ui-warning-content);
|
|
228
|
-
}
|
|
229
|
-
.mh-badge__count.mh-badge--default {
|
|
230
|
-
background: var(--ui-base-content);
|
|
231
|
-
color: var(--ui-base-100);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/* ===== 状态点 + 文字(`● 已完成`)=====
|
|
235
|
-
* 最轻的状态表达:无底无框,只有一个点与一行字;点色复用 tone 的 `--mh-badge-dot`。 */
|
|
236
|
-
.mh-badge--status {
|
|
237
|
-
--mh-badge-dot: var(--ui-base-content-subtle);
|
|
238
|
-
display: inline-flex;
|
|
239
|
-
align-items: center;
|
|
240
|
-
gap: 6px;
|
|
241
|
-
font-size: var(--ui-font-body);
|
|
242
|
-
line-height: var(--ui-line-body);
|
|
243
|
-
color: var(--ui-base-content);
|
|
244
|
-
white-space: nowrap;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
.mh-badge__status-dot {
|
|
248
|
-
flex: none;
|
|
249
|
-
width: 8px;
|
|
250
|
-
height: 8px;
|
|
251
|
-
border-radius: var(--ui-radius-full);
|
|
252
|
-
background: var(--mh-badge-dot);
|
|
253
|
-
/* 与前置点同一句光学对齐(位移取值见 `__dot` 一节的注释;令牌在 badge.tokens.css) */
|
|
254
|
-
position: relative;
|
|
255
|
-
top: var(--ui-badge-dot-shift);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/* `processing`(映射到 primary)加点呼吸:静态点读不出「正在进行」 */
|
|
259
|
-
.mh-badge--status.mh-badge--primary .mh-badge__status-dot {
|
|
260
|
-
animation: mh-badge-pulse 1.6s ease-in-out infinite;
|
|
261
|
-
}
|
|
262
|
-
@keyframes mh-badge-pulse {
|
|
263
|
-
50% {
|
|
264
|
-
opacity: 0.3;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Badge(徽标 / 标签)。
|
|
3
|
+
*
|
|
4
|
+
* 依据:@aihub/theme 的 components/badge.css(徽标高 20 / 胶囊)与 components/tag.css(标签片几何)。
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/* ===== Badge(徽标 / 标签)=====
|
|
8
|
+
批次 5 前 4 个应用各自手搓徽标,这里按设计稿收敛为 tone × shape × size × dot 的正交组合。
|
|
9
|
+
每个 tone 先铺一组局部变量(前景 / 底色 / 描边 / 圆点),形态类只决定「用哪几个变量」。 */
|
|
10
|
+
|
|
11
|
+
.mh-badge {
|
|
12
|
+
--mh-badge-fg: var(--ui-base-content);
|
|
13
|
+
--mh-badge-bg: transparent;
|
|
14
|
+
--mh-badge-border: transparent;
|
|
15
|
+
--mh-badge-dot: var(--ui-base-content-subtle);
|
|
16
|
+
display: inline-flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
gap: 6px;
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
border: 1px solid transparent;
|
|
22
|
+
font-size: var(--ui-font-caption);
|
|
23
|
+
/* `as="button"`(可点形态,`Tag` 的「新增」用)时根是 `<button>`:UA 会把字形换成 Arial、
|
|
24
|
+
文字居中、并给 padding/border/background —— 后三样本件已自带(`.mh-badge` 的框与各档内距),
|
|
25
|
+
只有字族漏在外面,这里补上(对 `<span>` 根无副作用:span 本就继承)。 */
|
|
26
|
+
font-family: inherit;
|
|
27
|
+
line-height: 1;
|
|
28
|
+
white-space: nowrap;
|
|
29
|
+
color: var(--mh-badge-fg);
|
|
30
|
+
background: var(--mh-badge-bg);
|
|
31
|
+
border-color: var(--mh-badge-border);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* 尺寸档的圆角吃**体量档**(`xs` / `sm`),不吃容器档 `md` —— 容器档一改(卡片圆角调整)
|
|
35
|
+
徽标会跟着变,那是两件无关的事。20 档有设计实证(表格内标签 r3),24 档无实证、按体量就近升一档。
|
|
36
|
+
高度取**标记体量档**(全局令牌 `--ui-mark-height-sm/md`):与 `Tag` 的 20 / 24、`Select` 多选
|
|
37
|
+
标签片的 24 同源 —— 这三处以前各写一份字面量,改一次档要改三处(2026-09-30 收敛)。
|
|
38
|
+
`Tag` 的基础圆角同日也归到这两档(改前它走控件档 6px):两族在 20 / 24 上同高同角。 */
|
|
39
|
+
.mh-badge--sm {
|
|
40
|
+
height: var(--ui-mark-height-sm);
|
|
41
|
+
padding: 0 6px;
|
|
42
|
+
min-width: 36px;
|
|
43
|
+
border-radius: var(--ui-radius-xs);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.mh-badge--md {
|
|
47
|
+
height: var(--ui-mark-height-md);
|
|
48
|
+
padding: 0 8px;
|
|
49
|
+
border-radius: var(--ui-radius-sm);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.mh-badge--default {
|
|
53
|
+
--mh-badge-fg: var(--ui-base-content);
|
|
54
|
+
--mh-badge-dot: var(--ui-base-content-subtle);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.mh-badge--primary {
|
|
58
|
+
--mh-badge-fg: var(--ui-primary);
|
|
59
|
+
--mh-badge-bg: var(--ui-primary-weak);
|
|
60
|
+
--mh-badge-border: var(--ui-primary);
|
|
61
|
+
--mh-badge-dot: var(--ui-primary);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.mh-badge--info {
|
|
65
|
+
--mh-badge-fg: var(--ui-info);
|
|
66
|
+
--mh-badge-bg: var(--ui-info-weak);
|
|
67
|
+
--mh-badge-border: var(--ui-info);
|
|
68
|
+
--mh-badge-dot: var(--ui-info);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.mh-badge--success {
|
|
72
|
+
--mh-badge-fg: var(--ui-success);
|
|
73
|
+
--mh-badge-bg: var(--ui-success-weak);
|
|
74
|
+
--mh-badge-border: var(--ui-success);
|
|
75
|
+
--mh-badge-dot: var(--ui-success);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.mh-badge--warning {
|
|
79
|
+
--mh-badge-fg: var(--ui-warning);
|
|
80
|
+
--mh-badge-bg: var(--ui-warning-weak);
|
|
81
|
+
--mh-badge-border: var(--ui-warning);
|
|
82
|
+
--mh-badge-dot: var(--ui-warning);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.mh-badge--error {
|
|
86
|
+
--mh-badge-fg: var(--ui-error);
|
|
87
|
+
--mh-badge-bg: var(--ui-error-weak);
|
|
88
|
+
--mh-badge-border: var(--ui-error);
|
|
89
|
+
--mh-badge-dot: var(--ui-error);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* 浅底标签:只取浅底 + 同色文字(无描边) */
|
|
93
|
+
|
|
94
|
+
.mh-badge--soft {
|
|
95
|
+
background: var(--mh-badge-bg);
|
|
96
|
+
border-color: transparent;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* 中性软底取 `base-200`(中性面)—— 改前是 `base-50`:那档只比内容底低 1.7 L*,
|
|
100
|
+
软底淡到与背景不可分(同族 `--primary` 软底也走「弱底」档,此处与之等形)。 */
|
|
101
|
+
.mh-badge--soft.mh-badge--default {
|
|
102
|
+
--mh-badge-bg: var(--ui-base-200);
|
|
103
|
+
--mh-badge-fg: var(--ui-base-content-muted);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* ⚠️ 主色软底取**浅底档** `--ui-primary-weak`(同一槽位的其他消费者:`Tag` 默认底、表壳滑过底、
|
|
107
|
+
聚焦环);**不取** `--ui-primary-subtle` —— 那是**选中态底**(树行 / 表格行 / 卡片选中 / 单选卡),
|
|
108
|
+
两档在 default 主题里差一整档(#EFF5FF → #DBE9FF),取错会让徽标比同排的标签深一档,
|
|
109
|
+
而徽标表达的是「标记」不是「选中」(2026-09-30 收敛,槽位口径见
|
|
110
|
+
`@manohub/theme` 的 `default/colors.css` 品牌槽位两条注释)。 */
|
|
111
|
+
.mh-badge--soft.mh-badge--primary {
|
|
112
|
+
--mh-badge-bg: var(--ui-primary-weak);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* 描边:浅底 + 同色描边;default 退化为白底 + 中性描边 + 正文色(状态胶囊) */
|
|
116
|
+
|
|
117
|
+
.mh-badge--outline {
|
|
118
|
+
background: var(--mh-badge-bg);
|
|
119
|
+
border-color: var(--mh-badge-border);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.mh-badge--outline.mh-badge--default {
|
|
123
|
+
--mh-badge-bg: var(--ui-base-100);
|
|
124
|
+
--mh-badge-border: var(--ui-base-300);
|
|
125
|
+
--mh-badge-fg: var(--ui-base-content);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* 无底无框:靠圆点表达状态;成功 / 中性用正文色,错误用危险色 */
|
|
129
|
+
|
|
130
|
+
.mh-badge--plain {
|
|
131
|
+
background: transparent;
|
|
132
|
+
border-color: transparent;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.mh-badge--plain.mh-badge--default {
|
|
136
|
+
--mh-badge-fg: var(--ui-base-content-muted);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.mh-badge--plain.mh-badge--success {
|
|
140
|
+
--mh-badge-fg: var(--ui-base-content);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.mh-badge--plain.mh-badge--error {
|
|
144
|
+
--mh-badge-fg: var(--ui-error);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* ===== 前置点 / 状态点:**光学对齐**(下移 1px)=====
|
|
148
|
+
两族的圆点都被 flex 居中在**盒中心**(实测偏心 0px),但**文字的墨迹中心在盒中心之下**:
|
|
149
|
+
中文(`带点(填充)`)约 +0.5px、纯小写(`sm` / `md`)约 +2px、状态点那族(14px)约 +1px
|
|
150
|
+
—— 于是盒居中读起来是「点偏高」(2026-09-30 用户反馈,文档站 3× 放大逐档比对确认)。
|
|
151
|
+
下移 1px 是这几种串的**折中**:中文偏下 0.5px、纯小写偏上 1px。
|
|
152
|
+
没有再细分的办法 —— 小写字母的墨迹中心本就低于盒中心,任何单一常数都盖不住两种极端。
|
|
153
|
+
位移走 `top`(绘制层):不参与 flex 布局,点仍被盒居中,只是看起来对着字。
|
|
154
|
+
⚠️ 位移取值在**值区**(`badge.tokens.css` 的 `--ui-badge-dot-shift`):本件有两个互不嵌套的
|
|
155
|
+
根类(`.mh-badge` / `.mh-badge--status`),声明在任一**根类**上都到不了另一个根。 */
|
|
156
|
+
|
|
157
|
+
.mh-badge__dot {
|
|
158
|
+
width: 8px;
|
|
159
|
+
height: 8px;
|
|
160
|
+
flex: none;
|
|
161
|
+
border-radius: var(--ui-radius-full);
|
|
162
|
+
position: relative;
|
|
163
|
+
top: var(--ui-badge-dot-shift);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.mh-badge--dot-filled .mh-badge__dot {
|
|
167
|
+
background: var(--mh-badge-dot);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.mh-badge--dot-ring .mh-badge__dot {
|
|
171
|
+
box-sizing: border-box;
|
|
172
|
+
border: 2px solid var(--mh-badge-dot);
|
|
173
|
+
background: var(--ui-base-100);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* ===== 数字角标(count)=====
|
|
177
|
+
* 一份面覆盖两种用法:**独立显示**(无子元素)时它就是一枚胶囊;
|
|
178
|
+
* **包裹子元素**时容器转 `relative`、角标脱流钉在右上角(`:has()` 判别,不需要第二套 DOM)。 */
|
|
179
|
+
.mh-badge--count {
|
|
180
|
+
position: relative;
|
|
181
|
+
display: inline-flex;
|
|
182
|
+
align-items: center;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.mh-badge__count {
|
|
186
|
+
display: inline-flex;
|
|
187
|
+
align-items: center;
|
|
188
|
+
justify-content: center;
|
|
189
|
+
min-width: 18px;
|
|
190
|
+
height: 18px;
|
|
191
|
+
padding: 0 5px;
|
|
192
|
+
/* 白圈:钉在头像 / 图标上时与底色分离(没有它,角标会像长在图标里的一块) */
|
|
193
|
+
border: 2px solid var(--ui-base-100);
|
|
194
|
+
border-radius: var(--ui-radius-full);
|
|
195
|
+
font-size: 12px;
|
|
196
|
+
font-weight: var(--ui-weight-medium);
|
|
197
|
+
line-height: 1;
|
|
198
|
+
white-space: nowrap;
|
|
199
|
+
/* 缺省即「危险红」:数字角标表达的是「有未读 / 有异常」,与主流库同口径 */
|
|
200
|
+
background: var(--ui-error);
|
|
201
|
+
color: var(--ui-error-content);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* 包裹态:角标脱流钉右上角(`translate(50%, -50%)` 让它挂在内容的角上而不是压进去) */
|
|
205
|
+
.mh-badge--count:has(> :not(.mh-badge__count)) > .mh-badge__count {
|
|
206
|
+
position: absolute;
|
|
207
|
+
top: 0;
|
|
208
|
+
right: 0;
|
|
209
|
+
transform: translate(50%, -50%);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* 角标的 tone:实色底 + 反白字(与内容徽标的浅底同色字不同 —— 角标要够跳) */
|
|
213
|
+
.mh-badge__count.mh-badge--primary {
|
|
214
|
+
background: var(--ui-primary);
|
|
215
|
+
color: var(--ui-primary-content);
|
|
216
|
+
}
|
|
217
|
+
.mh-badge__count.mh-badge--info {
|
|
218
|
+
background: var(--ui-info);
|
|
219
|
+
color: var(--ui-info-content);
|
|
220
|
+
}
|
|
221
|
+
.mh-badge__count.mh-badge--success {
|
|
222
|
+
background: var(--ui-success);
|
|
223
|
+
color: var(--ui-success-content);
|
|
224
|
+
}
|
|
225
|
+
.mh-badge__count.mh-badge--warning {
|
|
226
|
+
background: var(--ui-warning);
|
|
227
|
+
color: var(--ui-warning-content);
|
|
228
|
+
}
|
|
229
|
+
.mh-badge__count.mh-badge--default {
|
|
230
|
+
background: var(--ui-base-content);
|
|
231
|
+
color: var(--ui-base-100);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* ===== 状态点 + 文字(`● 已完成`)=====
|
|
235
|
+
* 最轻的状态表达:无底无框,只有一个点与一行字;点色复用 tone 的 `--mh-badge-dot`。 */
|
|
236
|
+
.mh-badge--status {
|
|
237
|
+
--mh-badge-dot: var(--ui-base-content-subtle);
|
|
238
|
+
display: inline-flex;
|
|
239
|
+
align-items: center;
|
|
240
|
+
gap: 6px;
|
|
241
|
+
font-size: var(--ui-font-body);
|
|
242
|
+
line-height: var(--ui-line-body);
|
|
243
|
+
color: var(--ui-base-content);
|
|
244
|
+
white-space: nowrap;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.mh-badge__status-dot {
|
|
248
|
+
flex: none;
|
|
249
|
+
width: 8px;
|
|
250
|
+
height: 8px;
|
|
251
|
+
border-radius: var(--ui-radius-full);
|
|
252
|
+
background: var(--mh-badge-dot);
|
|
253
|
+
/* 与前置点同一句光学对齐(位移取值见 `__dot` 一节的注释;令牌在 badge.tokens.css) */
|
|
254
|
+
position: relative;
|
|
255
|
+
top: var(--ui-badge-dot-shift);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* `processing`(映射到 primary)加点呼吸:静态点读不出「正在进行」 */
|
|
259
|
+
.mh-badge--status.mh-badge--primary .mh-badge__status-dot {
|
|
260
|
+
animation: mh-badge-pulse 1.6s ease-in-out infinite;
|
|
261
|
+
}
|
|
262
|
+
@keyframes mh-badge-pulse {
|
|
263
|
+
50% {
|
|
264
|
+
opacity: 0.3;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* badge —— 单件令牌(**基础值**)。
|
|
3
|
-
*
|
|
4
|
-
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
|
-
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `badge.css` 顶部):这些是**基础值**,锚在
|
|
8
|
-
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值、组内间距变 0)。
|
|
11
|
-
*
|
|
12
|
-
* 本件为什么需要本文件:`Badge` 有**两个互不嵌套的根类** —— `.mh-badge`(内容徽标 / 数字角标)
|
|
13
|
-
* 与 `.mh-badge--status`(状态点 + 文字,它不带 `.mh-badge`)。前置点与状态点共用同一枚
|
|
14
|
-
* 光学对齐位移,声明在任何**根类**上都到不了另一个根(自定义属性只向下继承),故按本仓口径
|
|
15
|
-
* 落到容器锚上。
|
|
16
|
-
*
|
|
17
|
-
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
18
|
-
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
19
|
-
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
20
|
-
*/
|
|
21
|
-
[data-manohub-ui] {
|
|
22
|
-
/* 前置点 / 状态点的**光学对齐**位移(数字见面文件 `__dot` 一节:盒居中读起来偏高)。 */
|
|
23
|
-
--ui-badge-dot-shift: 1px;
|
|
24
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* badge —— 单件令牌(**基础值**)。
|
|
3
|
+
*
|
|
4
|
+
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
|
+
*
|
|
6
|
+
* ## 抽出说明
|
|
7
|
+
* 本文件从面文件里抽出(原先混写在 `badge.css` 顶部):这些是**基础值**,锚在
|
|
8
|
+
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
+
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
+
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值、组内间距变 0)。
|
|
11
|
+
*
|
|
12
|
+
* 本件为什么需要本文件:`Badge` 有**两个互不嵌套的根类** —— `.mh-badge`(内容徽标 / 数字角标)
|
|
13
|
+
* 与 `.mh-badge--status`(状态点 + 文字,它不带 `.mh-badge`)。前置点与状态点共用同一枚
|
|
14
|
+
* 光学对齐位移,声明在任何**根类**上都到不了另一个根(自定义属性只向下继承),故按本仓口径
|
|
15
|
+
* 落到容器锚上。
|
|
16
|
+
*
|
|
17
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
18
|
+
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
19
|
+
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
20
|
+
*/
|
|
21
|
+
[data-manohub-ui] {
|
|
22
|
+
/* 前置点 / 状态点的**光学对齐**位移(数字见面文件 `__dot` 一节:盒居中读起来偏高)。 */
|
|
23
|
+
--ui-badge-dot-shift: 1px;
|
|
24
|
+
}
|