@manohub/ui 0.10.2 → 0.10.4
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 +1 -1
- package/dist/components/badge/index.d.ts +46 -1
- package/dist/components/badge/index.js +42 -9
- package/dist/components/card/index.d.ts +1 -1
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/filter/index.d.ts +74 -6
- package/dist/components/filter/index.js +38 -10
- package/dist/components/form/index.d.ts +50 -1
- package/dist/components/form/index.js +20 -2
- package/dist/components/input/index.js +1 -0
- package/dist/components/nav/index.d.ts +27 -0
- package/dist/components/nav/index.js +12 -0
- package/dist/components/notice/index.d.ts +1 -1
- package/dist/components/notification/index.d.ts +2 -2
- package/dist/components/select/index.d.ts +9 -0
- package/dist/components/select/index.js +57 -12
- package/dist/components/select/select-list.d.ts +42 -8
- package/dist/components/select/select-list.js +36 -11
- package/dist/components/select/select-panel.d.ts +36 -8
- package/dist/components/select/select-panel.js +18 -4
- package/dist/components/select/select-shared.d.ts +51 -10
- package/dist/components/select/select-shared.js +12 -2
- package/dist/components/select/select-tree.d.ts +25 -3
- package/dist/components/select/select-tree.js +17 -6
- package/dist/components/select/select-trigger.d.ts +21 -0
- package/dist/components/select/select-trigger.js +15 -1
- package/dist/components/tabs/index.d.ts +22 -0
- package/dist/components/tabs/index.js +6 -0
- package/dist/components/tag/index.d.ts +32 -153
- package/dist/components/tag/index.js +102 -101
- package/dist/components/text/index.d.ts +1 -1
- package/dist/components/tooltip/index.d.ts +1 -1
- package/dist/components/tree/index.d.ts +65 -0
- package/dist/components/tree/index.js +29 -2
- package/dist/index.d.ts +2 -2
- package/dist/styles/components/avatar.css +2 -2
- package/dist/styles/components/badge.css +21 -1
- package/dist/styles/components/badge.tokens.css +24 -0
- package/dist/styles/components/button.css +7 -6
- package/dist/styles/components/button.tokens.css +5 -2
- package/dist/styles/components/capsule.css +8 -0
- package/dist/styles/components/divider.css +8 -4
- package/dist/styles/components/divider.tokens.css +2 -1
- package/dist/styles/components/form.css +51 -0
- package/dist/styles/components/notification.css +1 -1
- package/dist/styles/components/select.css +62 -39
- package/dist/styles/components/select.tokens.css +15 -8
- package/dist/styles/components/tag.css +77 -154
- package/dist/styles/components/tag.tokens.css +13 -22
- package/dist/styles/components/tree.css +37 -3
- package/dist/styles/components/tree.tokens.css +4 -3
- package/dist/styles/components/upload.tokens.css +1 -1
- package/dist/styles/index.css +2 -1
- package/package.json +2 -2
|
@@ -155,6 +155,57 @@
|
|
|
155
155
|
color: var(--ui-required-mark);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
/* ===== label 提示位(`Form.Item` 的 `tip`)=====
|
|
159
|
+
* 图标与气泡都**不新造** —— 图标取 `@manohub/icon` 的 `help`(带圈问号),气泡复用 `Tooltip` 的面
|
|
160
|
+
* (`.mh-tooltip`)与操作层 `popup.css` 的 hover 档;本件只声明**提示位在 label 行里怎么排**。
|
|
161
|
+
*
|
|
162
|
+
* 宿主位(Tooltip 落在 label 里的那个 span)有两件事必做,少一件就有肉眼可见的偏移:
|
|
163
|
+
* ① `flex: 0 0 auto` —— label 文本过长时走省略号,图标不被挤压;
|
|
164
|
+
* ② 行高归 1 —— 图标比一行文字矮(图标档对 20px 行盒),留在 label 的行盒里会按基线排,
|
|
165
|
+
* 中线与 label 文字错开(本仓对这类 1~6px 偏移有实测前科,见 `.mh-form-item__control` 那段)。
|
|
166
|
+
* 气泡本身是固定定位(操作层 hover 档),不参与本行排布,故宿主宽度恒等于图标宽度。 */
|
|
167
|
+
|
|
168
|
+
.mh-form-item__tip {
|
|
169
|
+
display: inline-flex;
|
|
170
|
+
align-items: center;
|
|
171
|
+
flex: 0 0 auto;
|
|
172
|
+
line-height: 1;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* 触发器(问号按钮):`reset` 不代消费方归零控件外观,故边 / 底 / 内距三项自备。
|
|
176
|
+
颜色取次要色 —— label 旁是**辅助**信息,不与字段名抢层级;悬停 / 聚焦升到正文色。 */
|
|
177
|
+
|
|
178
|
+
.mh-form-item__tip-btn {
|
|
179
|
+
display: inline-flex;
|
|
180
|
+
align-items: center;
|
|
181
|
+
justify-content: center;
|
|
182
|
+
padding: 0;
|
|
183
|
+
border: none;
|
|
184
|
+
background: transparent;
|
|
185
|
+
color: var(--ui-base-content-muted);
|
|
186
|
+
cursor: help;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.mh-form-item__tip-btn:hover,
|
|
190
|
+
.mh-form-item__tip-btn:focus-visible {
|
|
191
|
+
color: var(--ui-base-content);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* 键盘可达:气泡显形靠操作层的宿主 `:focus-within` 档,这里只管**焦点可见**(主色环)。 */
|
|
195
|
+
|
|
196
|
+
.mh-form-item__tip-btn:focus-visible {
|
|
197
|
+
outline: 2px solid var(--ui-primary);
|
|
198
|
+
outline-offset: 2px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 图标尺寸:常规图标一律取全局图标档。`<Icon>` 的宽高是**属性**,面层能覆盖;
|
|
202
|
+
不写就会静默落到组件默认的 16(口径见 `contract-icon-direction.spec.ts`)。 */
|
|
203
|
+
|
|
204
|
+
.mh-form-item__tip-btn > svg {
|
|
205
|
+
width: var(--ui-font-icon);
|
|
206
|
+
height: var(--ui-font-icon);
|
|
207
|
+
}
|
|
208
|
+
|
|
158
209
|
/* label 对齐:基类默认右对齐(贴控件列,`labelAlign` 缺省档);
|
|
159
210
|
`labelAlign="left"` 时挂这个修饰类改成左对齐 —— 只给「非默认值」挂类,避免两段声明争胜出顺序。
|
|
160
211
|
位置必须在基类规则之后:`.mh-form-item__label {` 是它的子串,测试取规则体时按首次出现命中。 */
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* **左边线用绝对定位伪元素画,不用 `border-left` + `border-image`**:后者会吃掉圆角(规范踩过这个坑)。
|
|
16
16
|
* 语义八档的线色是规范 04 档**渐变**,色板编号写在令牌注释里;底色复用本仓语义弱底令牌(一处定义)。
|
|
17
17
|
*
|
|
18
|
-
*
|
|
18
|
+
* **标签位与操作位不重复实现**:标签用标记族(只读走 `.mh-badge`,要可关闭走 `.mh-tag`),
|
|
19
19
|
* 操作用按钮族(`.mh-button--sm`)—— 本件只给它们的容器与间距。
|
|
20
20
|
*/
|
|
21
21
|
.mh-notification {
|
|
@@ -137,37 +137,38 @@
|
|
|
137
137
|
box-shadow: var(--ui-shadow-popover);
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
/* 内容区:**面板里唯一的滚动容器**(列表体的选项行 /
|
|
140
|
+
/* 内容区:**面板里唯一的滚动容器**(列表体的选项行 / 树体的树都装在它里面),
|
|
141
|
+
同时是**两形态共用的一处内距** —— 内容贴面板左右边各留一个最小呼吸位
|
|
142
|
+
(行仍是满宽,只有内容缩进;选项行的内距与树行的缩进各由自己承担)。
|
|
143
|
+
内距为什么在这儿而不是各形态自己一层:见下方「树体壳已退场」一节的实测症状。
|
|
141
144
|
`min-height: 0` 是这一档生效的前提:列容器里弹性项的可收缩下限默认取内容高,
|
|
142
145
|
不给它,内容就永远压不下去、上面的限高形同虚设(与 `panel.css` 的 `.mh-panel__body` 同款)。 */
|
|
143
146
|
.mh-select__body {
|
|
144
147
|
flex: 1;
|
|
145
148
|
min-height: 0;
|
|
146
149
|
overflow-y: auto;
|
|
150
|
+
/* 左右与下各一个最小呼吸位(上不写:面板根已有 4px 上内距)。
|
|
151
|
+
底部这一档落在**滚动容器**上:现代引擎已把滚动器的 padding-bottom 计入可滚动区
|
|
152
|
+
(实测 60 条选项 scrollHeight = 2160 + 4),故滚到底时最后一行不会贴着面板下边。 */
|
|
153
|
+
padding: 0 var(--ui-space-1) var(--ui-space-1);
|
|
147
154
|
}
|
|
148
155
|
|
|
149
|
-
/* 选项行:滑过 / 选中 / 禁用 / 提示 / 空态
|
|
156
|
+
/* 选项行:滑过 / 键盘高亮 / 选中 / 禁用 / 提示 / 空态
|
|
157
|
+
**行的几何与行态与树行同源**(`mh-tree__row`,2026-09-30 由使用方拍板对齐):行高 / 圆角 /
|
|
158
|
+
基础内距 / 字号 / 滑过与选中底色逐项同值 —— 同一个面板里,列表与树两形态不再各是一套行。
|
|
159
|
+
行元素是 `div[role='option']`、**不是 button**(见 `select-list.tsx`):listbox 的选项不是交互控件,
|
|
160
|
+
键盘改由「触发器持焦 + `aria-activedescendant` 指向高亮行」表达。
|
|
161
|
+
随之退场的两条补丁(都是为 `<button>` 而写的):
|
|
162
|
+
① 按钮 UA 四件套重置(`border` / `background` / `font-family` / `text-align`)—— div 本就没有 UA 外观;
|
|
163
|
+
② `width: 100%` —— 那是按钮的 `width: auto` 解析成「包裹内容宽」才要补的,div 是块级、本就满宽
|
|
164
|
+
(hint / empty 两个 span 靠下面的 display 拿满宽)。 */
|
|
150
165
|
.mh-select__option {
|
|
151
166
|
position: relative;
|
|
152
167
|
display: flex;
|
|
153
168
|
align-items: center;
|
|
154
|
-
/* **必须显式给宽**:选项是 `<button>`,而按钮的 `width: auto` 解析成「包裹内容宽」
|
|
155
|
-
(表单控件不参与块级拉伸),不给就会缩成文字那么宽 ——
|
|
156
|
-
滑过 / 选中的底色只剩一小条,聚焦环也贴着文字。`.mh-select__add` 同理。 */
|
|
157
|
-
width: 100%;
|
|
158
169
|
height: var(--ui-select-option-height);
|
|
159
170
|
padding: 0 var(--ui-select-padding-x);
|
|
160
|
-
|
|
161
|
-
(`border: 2px outset` / `background: ButtonFace` / `font-family: Arial` / `text-align: center`)。
|
|
162
|
-
reset 层(`styles/reset.css`)虽然也清零了前三条,但组件面**不得依赖它** ——
|
|
163
|
-
本仓的 0.6.x 就漏了这四条,表现为选项行呈原生按钮外观(灰底 + 立体边框 + 居中 Arial),
|
|
164
|
-
而同一面板里的 `.mh-select__add` 写齐了 ⇒ 一个面板里两种外观。
|
|
165
|
-
`text-align` 是 reset 层**没有**的一项(它不属于「元素基线」,属于「列表行」语义),故此处必写。
|
|
166
|
-
色彩 / 字族这些**值**仍然归令牌,这四条只是把 UA 的默认值归零。 */
|
|
167
|
-
border: none;
|
|
168
|
-
background: transparent;
|
|
169
|
-
font-family: inherit;
|
|
170
|
-
text-align: left;
|
|
171
|
+
border-radius: var(--ui-radius-control);
|
|
171
172
|
font-size: var(--ui-select-font-size);
|
|
172
173
|
color: var(--ui-base-content);
|
|
173
174
|
cursor: pointer;
|
|
@@ -186,10 +187,20 @@
|
|
|
186
187
|
appearance: none;
|
|
187
188
|
pointer-events: none;
|
|
188
189
|
}
|
|
190
|
+
/* 行态三档与树行逐条对应(滑过 / 按下 / 选中):
|
|
191
|
+
① 滑过 = 键盘高亮(`data-active`,见 `select-list.tsx` 的高亮模型)= 主色浅底;
|
|
192
|
+
② 按下 = 选中底(与树行的 `:active` 同款);
|
|
193
|
+
③ 选中 = 选中底 + 主色字。 */
|
|
189
194
|
.mh-select__option:hover,
|
|
190
|
-
.mh-select__option.is-hover
|
|
195
|
+
.mh-select__option.is-hover,
|
|
196
|
+
.mh-select__option[data-active='true'] {
|
|
191
197
|
background: var(--ui-select-option-hover);
|
|
192
198
|
}
|
|
199
|
+
.mh-select__option:active {
|
|
200
|
+
background: var(--ui-select-option-selected);
|
|
201
|
+
}
|
|
202
|
+
/* 零 JS 静态档的键盘可达:行内含原生 radio / checkbox 时,焦点在它身上即给行描边
|
|
203
|
+
(组件路径的选项**不可聚焦**,键盘高亮走上面的 `data-active`)。 */
|
|
193
204
|
.mh-select__option:has(input:focus-visible) {
|
|
194
205
|
outline: 2px solid var(--ui-primary);
|
|
195
206
|
outline-offset: -2px;
|
|
@@ -201,6 +212,28 @@
|
|
|
201
212
|
background: var(--ui-select-option-selected);
|
|
202
213
|
color: var(--ui-primary);
|
|
203
214
|
}
|
|
215
|
+
/* 相连的选中行:缝上的圆角**融合抵消**(多选连续勾选时最扎眼 —— 两个 6px 圆角各自让出的
|
|
216
|
+
凹口拼成一个「蝴蝶结」,看着像渲染坏了)。
|
|
217
|
+
做法:给自己选中、**下一行也选中**的那一行补一条同色补片,向上下各延伸一个圆角位 ——
|
|
218
|
+
它同时盖住上行让出的下半凹口与下行让出的上半凹口,两块底因此连成一片。
|
|
219
|
+
只认「下一行」这一个方向(CSS 只有向后的兄弟组合子):**单向就够**,补片本来横跨两行。
|
|
220
|
+
补片不吃事件(`pointer-events: none`)—— 它压在下一行顶上 6px,若可点会把点击算到上一行头上。
|
|
221
|
+
⚠️ 零 JS 那一路的下家条件写成 `+ .mh-select__option input:checked`(兄弟组合子后再接后代),
|
|
222
|
+
**不是** `+ .mh-select__option:has(input:checked)`:`:has()` **不许嵌套**,写了整条规则会被
|
|
223
|
+
解析器丢掉(浏览器里静默失效 —— 实测踩过,`contract-class-surface` 有机械护栏)。 */
|
|
224
|
+
.mh-select__option.is-selected:has(+ .mh-select__option.is-selected)::after,
|
|
225
|
+
.mh-select__option[data-state='selected']:has(+ .mh-select__option[data-state='selected'])::after,
|
|
226
|
+
.mh-select__option:has(input:checked):has(+ .mh-select__option input:checked)::after {
|
|
227
|
+
content: '';
|
|
228
|
+
position: absolute;
|
|
229
|
+
left: 0;
|
|
230
|
+
right: 0;
|
|
231
|
+
bottom: calc(-1 * var(--ui-radius-control));
|
|
232
|
+
height: calc(2 * var(--ui-radius-control));
|
|
233
|
+
/* 取本行**算出来**的底色(选中底随主题与状态变,写死色值就对不上了) */
|
|
234
|
+
background-color: inherit;
|
|
235
|
+
pointer-events: none;
|
|
236
|
+
}
|
|
204
237
|
.mh-select__option.is-disabled,
|
|
205
238
|
.mh-select__option[data-disabled='true'],
|
|
206
239
|
.mh-select__option:has(input:disabled) {
|
|
@@ -213,18 +246,11 @@
|
|
|
213
246
|
.mh-select__option--empty {
|
|
214
247
|
color: var(--ui-base-content-muted);
|
|
215
248
|
}
|
|
216
|
-
/* 「创建 xxx
|
|
249
|
+
/* 「创建 xxx」行:搜索词无命中时出现 —— 它是 `.mh-select__option` 上的**修饰类**
|
|
250
|
+
(两件同写:`class="mh-select__option mh-select__add"`),行的几何与三态全沿用基类,
|
|
251
|
+
这里只改字色为「可创建」的主色。 */
|
|
217
252
|
.mh-select__add {
|
|
218
|
-
width: 100%;
|
|
219
|
-
border: none;
|
|
220
|
-
background: transparent;
|
|
221
253
|
color: var(--ui-primary);
|
|
222
|
-
font-family: inherit;
|
|
223
|
-
text-align: left;
|
|
224
|
-
}
|
|
225
|
-
.mh-select__add:hover,
|
|
226
|
-
.mh-select__add.is-hover {
|
|
227
|
-
background: var(--ui-select-option-hover);
|
|
228
254
|
}
|
|
229
255
|
|
|
230
256
|
/* ===== 选项分组(组标题不可点,只做分区;组间距靠分隔线给) ===== */
|
|
@@ -248,17 +274,14 @@
|
|
|
248
274
|
padding: var(--ui-space-2) var(--ui-space-2) var(--ui-space-1);
|
|
249
275
|
}
|
|
250
276
|
|
|
251
|
-
/* =====
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
/* 行底满宽、只有内容缩进(缩进公式在 tree 面),故左右各留一个最小呼吸位 */
|
|
260
|
-
padding: 0 var(--ui-space-1) var(--ui-space-1);
|
|
261
|
-
}
|
|
277
|
+
/* ===== 树体壳已退场(2026-09-30)=====
|
|
278
|
+
原先这里有一个 `.mh-select__tree`:面板里的树包在它里面拿内距(左右 4 / 下 4),
|
|
279
|
+
而列表形态的选项是面板的**直接子节点**、一路贴到面板边缘 —— 同一个面板里两形态的内距不一样
|
|
280
|
+
(浏览器实测:面板 240 时树行 232、选项行 240)。
|
|
281
|
+
内距现归**共用的内容区**(上一节 `.mh-select__body`):一处规格、两形态同数;
|
|
282
|
+
树体壳的唯一职责既然已经上移,壳本身一并退场 —— 留一层不承载任何规则的包裹只是噪音。
|
|
283
|
+
边界不变:**面板皮肤归本文件**,**树的行态归 tree 面**(`.mh-tree__*` 那一族,本文件一行都不碰
|
|
284
|
+
—— 跨族类名须先登记跨面豁免,这里不走那条路),行高 / 缩进 / 滑过与选中底色全沿用 tree 面。 */
|
|
262
285
|
|
|
263
286
|
/* 命中高亮(搜索命中的那段文字,由组件的 `renderLabel` 落进 `.mh-tree__label` 槽)。
|
|
264
287
|
底色取主色浅底档(与选中 / 滑过同一套语义槽位);字色 `inherit` —— 高亮只负责「标出位置」,
|
|
@@ -20,18 +20,25 @@
|
|
|
20
20
|
(实测:chrome 里量到 16px 才发现的);
|
|
21
21
|
- 面板 `.mh-select__panel`:挂在 `.mh-popup-host` 下、与触发器**兄弟**(不在 `.mh-select`
|
|
22
22
|
子树里)—— 否则圆角、行高、字号、选中底全失效。 */
|
|
23
|
-
/* 单件令牌
|
|
23
|
+
/* 单件令牌
|
|
24
|
+
## 选项行与树行同源(2026-09-30 由使用方拍板对齐)
|
|
25
|
+
面板里的选项行与 `mh-tree__row`(`SelectTree` 的面板内容)现在是**同一套行**:
|
|
26
|
+
下面的行高 / 基础内距 / 字号 / 滑过底四项都取树行那份值(选中底两处本来就同源),
|
|
27
|
+
故面板里列表形态与树形态不会再长成两套行。改树行的行几何 = 选项行一起动(有意)。
|
|
28
|
+
⚠️ 与全局 `--ui-row-height`(36,Skeleton / Collapse 头行在用)**不是一档**:
|
|
29
|
+
对齐目标是树行(34),不是全库行高 —— 别再按「行高就该 36」改回来。 */
|
|
24
30
|
--ui-select-height: var(--ui-control-height-md); /* 标准档 32(日期格与面板内部用;触发器的框高归输入面) */
|
|
25
|
-
--ui-select-padding-x: var(--ui-space-
|
|
31
|
+
--ui-select-padding-x: var(--ui-space-2); /* 8 = 树行的基础内距(缩进之外的左右呼吸位) */
|
|
26
32
|
--ui-select-radius: var(--ui-radius-md); /* 8:设计 `0:4025` 下拉面板 r8(原注释写 8 但取的是控件档 6) */
|
|
27
|
-
--ui-select-font-size: var(--ui-font-
|
|
28
|
-
--ui-select-option-height:
|
|
29
|
-
--ui-select-option-hover: var(--ui-
|
|
30
|
-
--ui-select-option-selected: var(--ui-primary-subtle); /*
|
|
33
|
+
--ui-select-font-size: var(--ui-font-caption); /* 13 = 树行字号(不是触发器的 14) */
|
|
34
|
+
--ui-select-option-height: var(--ui-tree-row-height); /* 34 = 树行高(同源引用,两处不会各自漂) */
|
|
35
|
+
--ui-select-option-hover: var(--ui-primary-weak); /* 滑过 / 键盘高亮:与树行的滑过同档(**不再是中性灰**) */
|
|
36
|
+
--ui-select-option-selected: var(--ui-primary-subtle); /* 选中底:与树行的选中同档 */
|
|
31
37
|
--ui-select-chip-height: var(--ui-mark-height-md); /* 多选标签(规范复用标签族 24 档)⇒ 标记体量档,与徽标 / 标签同源 */
|
|
32
38
|
--ui-select-icon-size: var(--ui-font-icon); /* 下拉箭头:常规图标档 */
|
|
33
39
|
/* 面板限高(**列表与树两形态共用**):面板整体(含搜索行)不超此高,超出即内容区滚动。
|
|
34
|
-
320px ≈ 8
|
|
35
|
-
|
|
40
|
+
320px ≈ 8 行(行高 34 + 面板上下内距 8)—— 列表与树两形态的节距现在是同一个数
|
|
41
|
+
(树行 2026-09-30 起也去掉了行距),有无搜索行会差一行上下。
|
|
42
|
+
要改高度改这枚令牌,不要在业务侧压 max-height。 */
|
|
36
43
|
--ui-select-panel-max-height: 320px;
|
|
37
44
|
}
|
|
@@ -1,61 +1,53 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tag ——
|
|
2
|
+
* Tag —— **`Badge` 的交互封装**(可关闭 / 可新增)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* (常规 24 高 / 大号 28;状态档 22 高、小圆角、四色语义;可选档胶囊 + 选中实底主色;
|
|
6
|
-
* 新增档虚线框;筛选项贴片底 + 主色字)。
|
|
4
|
+
* ## 本件不画框(与 `select.css` 同一条纪律)
|
|
7
5
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* 底 / 边 / 圆角 / 高度 / 字号 / 内距 / 档位**全归 `badge` 面** —— 徽标是「只读标记」的唯一样式源,
|
|
7
|
+
* 本件只往它上面加两个交互位。2026-09-30 之前这里有一整套与 `badge` 重复的几何
|
|
8
|
+
* (`--ui-tag-bg` / `-height` / `-font-size` / `-radius` …):同一个高度上两件各走一个圆角档、
|
|
9
|
+
* 同一个「浅主色标签底」两件给了两个色 —— 那批规则已整体撤除,本文件只剩三样东西:
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* 1. `.mh-tag`:内容与操作位之间的间距(比 `Badge` 的通用 gap 紧一档);
|
|
12
|
+
* 2. `.mh-tag__close` / `.mh-tag__confirm`:两个操作位(14 圆底 + 悬停蒙层;图标 12 属有意保留的专属尺寸);
|
|
13
|
+
* 3. `.mh-tag--add`:新增入口形态(虚线框 + 中性字,滑过转主色);
|
|
14
|
+
* 4. `.mh-tag--editing` / `.mh-tag__input`:新增档点开后的编辑态(输入框的框归 input 面,
|
|
15
|
+
* 这里只给**窄**宽度;输入框 ↔ 确认位沿用 `.mh-tag` 的间距)。
|
|
13
16
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
17
|
+
* ## 特异性:两位本件类,不靠导入顺序
|
|
18
|
+
*
|
|
19
|
+
* `--add` 那组写成 **`.mh-tag.mh-tag--add`(0-2-0)**,压过 badge 面的单类规则(0-1-0)。
|
|
20
|
+
* 两条备选都被否掉:
|
|
21
|
+
* ① 引用 `.mh-badge`(面文件的类名必须与文件词根同根,跨族引用要进豁免台账);
|
|
22
|
+
* ② 靠 `styles/index.css` 的导入顺序(badge 面在前、本面在后)—— 顺序会被人无意调整,
|
|
23
|
+
* 两位类权重不会。`--add` 转发给 `Badge` 的档是 `plain`(底透明、字取中性),
|
|
24
|
+
* 需要覆盖的只剩 `border-color` 与字色。
|
|
25
|
+
*
|
|
26
|
+
* ⚠️ 新增档的根是**真实 `<button>`**(走 `Badge` 的 `as="button"`):按钮自带外观的三样
|
|
27
|
+
* (`border` / `background` / `padding`)由 badge 面提供(`contract-reset.spec.ts` 按标签审计),
|
|
28
|
+
* `font-family: inherit` 也在那边补 —— 本件只管虚线框与悬停色。
|
|
16
29
|
*/
|
|
30
|
+
|
|
31
|
+
/* ===== 内容 ↔ 关闭位:比 Badge 的通用 gap(6,给前置点的)紧一档 ===== */
|
|
17
32
|
.mh-tag {
|
|
18
|
-
display: inline-flex;
|
|
19
|
-
align-items: center;
|
|
20
33
|
gap: var(--ui-tag-gap);
|
|
21
|
-
height: var(--ui-tag-height);
|
|
22
|
-
padding: 0 var(--ui-space-3);
|
|
23
|
-
border-radius: var(--ui-radius-control);
|
|
24
|
-
background: var(--ui-tag-bg);
|
|
25
|
-
color: var(--ui-primary);
|
|
26
|
-
font-size: var(--ui-tag-font-size);
|
|
27
|
-
line-height: 1;
|
|
28
|
-
white-space: nowrap;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/* ===== 尺寸档 =====
|
|
32
|
-
20 档是设计稿里**唯一有实证**的标签尺寸(`0:2723` 36×20):小圆角 r3 + 12px 字。
|
|
33
|
-
左右内距取 8 而不是设计反推的 6:6 不在本包的间距阶(4/8/12/16/20/24)上,
|
|
34
|
-
为 4px 的总宽差破一档刻度不值当。 */
|
|
35
|
-
.mh-tag--sm {
|
|
36
|
-
height: var(--ui-tag-height-sm);
|
|
37
|
-
padding: 0 var(--ui-space-2);
|
|
38
|
-
border-radius: var(--ui-radius-xs);
|
|
39
|
-
font-size: var(--ui-font-micro);
|
|
40
|
-
}
|
|
41
|
-
.mh-tag--lg {
|
|
42
|
-
height: var(--ui-tag-height-lg);
|
|
43
34
|
}
|
|
44
35
|
|
|
45
|
-
/* =====
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
36
|
+
/* ===== 操作位:关闭位(受控:只回调,见 TSX)与添加位(新增档)=====
|
|
37
|
+
两位共享「按钮重置 + 圆底 + 悬停过渡」,**尺寸与字形各按自己的量级走**:
|
|
38
|
+
- 关闭位:14 触区 + **12 字形**(贴小控件的字形,见 `contract-icon-direction` 的白名单)——
|
|
39
|
+
它是标签内的轻量移除操作,不该跟内容抢视觉重量;
|
|
40
|
+
- 添加位:**常规图标档** `--ui-font-icon`(default 16 / farris 14)+ 由它派生的触区
|
|
41
|
+
(`+ 4`:16→20 / 14→18)—— 它是这一档的**主操作**(一枚 +),与入口的加号同档。
|
|
42
|
+
触区用 `calc()` 而不是写死 20:farris 的图标档是 14,写死就会让字形顶满圆底。
|
|
43
|
+
关闭位右端不再回收内距:旧写法是「本件左右内距 12 + 关闭位负外边距 4」凑出 8,
|
|
44
|
+
现在 `Badge` 的 md 内距就是 8,负外边距一并撤掉。 */
|
|
45
|
+
.mh-tag__close,
|
|
46
|
+
.mh-tag__confirm {
|
|
52
47
|
display: inline-flex;
|
|
53
48
|
align-items: center;
|
|
54
49
|
justify-content: center;
|
|
55
50
|
flex: none;
|
|
56
|
-
width: var(--ui-tag-close-size);
|
|
57
|
-
height: var(--ui-tag-close-size);
|
|
58
|
-
margin-right: calc(-1 * var(--ui-space-1));
|
|
59
51
|
padding: 0;
|
|
60
52
|
border: none;
|
|
61
53
|
border-radius: var(--ui-radius-full);
|
|
@@ -65,6 +57,10 @@
|
|
|
65
57
|
opacity: 0.65;
|
|
66
58
|
transition: opacity 0.15s ease, background-color 0.15s ease;
|
|
67
59
|
}
|
|
60
|
+
.mh-tag__close {
|
|
61
|
+
width: var(--ui-tag-close-size);
|
|
62
|
+
height: var(--ui-tag-close-size);
|
|
63
|
+
}
|
|
68
64
|
.mh-tag__close > svg {
|
|
69
65
|
flex: none;
|
|
70
66
|
width: 12px;
|
|
@@ -74,131 +70,58 @@
|
|
|
74
70
|
opacity: 1;
|
|
75
71
|
background: rgb(0 0 0 / 0.08);
|
|
76
72
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
⚠️ **本条的配方改过**:改前是「透明底 + `1px solid currentColor`」(全色描边)。全色描边在浅底
|
|
82
|
-
页面上过重,且与 `shape="status"` + `tone` 的观感打架(两者都成了「彩边」);设计给的正是
|
|
83
|
-
「同色系浅边」。若某个页面确实需要「透明底 + 全色边」那种更硬的轮廓,请提需求另开形态,
|
|
84
|
-
不要就地改回去。 */
|
|
85
|
-
.mh-tag--outline {
|
|
86
|
-
background: var(--ui-primary-weak);
|
|
87
|
-
border: 1px solid var(--ui-primary-border);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/* ===== 状态标签(22 高 / 四色语义)===== */
|
|
91
|
-
.mh-tag--status {
|
|
92
|
-
height: var(--ui-tag-height-status);
|
|
93
|
-
padding: 0 var(--ui-space-2);
|
|
94
|
-
}
|
|
95
|
-
.mh-tag--info {
|
|
96
|
-
background: var(--ui-info-weak);
|
|
97
|
-
color: var(--ui-info);
|
|
98
|
-
}
|
|
99
|
-
.mh-tag--success {
|
|
100
|
-
background: var(--ui-success-weak);
|
|
101
|
-
color: var(--ui-success);
|
|
102
|
-
}
|
|
103
|
-
.mh-tag--warning {
|
|
104
|
-
background: var(--ui-warning-weak);
|
|
105
|
-
color: var(--ui-warning);
|
|
106
|
-
}
|
|
107
|
-
.mh-tag--error {
|
|
108
|
-
background: var(--ui-error-weak);
|
|
109
|
-
color: var(--ui-error);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/* ===== 可选标签(胶囊;开关是隐身原生 radio,焦点环画在可见标签上)===== */
|
|
113
|
-
.mh-tag--select {
|
|
114
|
-
position: relative;
|
|
115
|
-
border: none;
|
|
116
|
-
border-radius: var(--ui-radius-full);
|
|
117
|
-
background: var(--ui-primary-weak);
|
|
73
|
+
/* 添加位是**肯定的**操作:触区与字形都跟图标档走,色取主色、悬停给主色浅底 */
|
|
74
|
+
.mh-tag__confirm {
|
|
75
|
+
width: calc(var(--ui-font-icon) + var(--ui-space-1));
|
|
76
|
+
height: calc(var(--ui-font-icon) + var(--ui-space-1));
|
|
118
77
|
color: var(--ui-primary);
|
|
119
|
-
cursor: pointer;
|
|
120
|
-
font-family: inherit;
|
|
121
|
-
}
|
|
122
|
-
.mh-tag--select > input {
|
|
123
|
-
position: absolute;
|
|
124
|
-
width: 1px;
|
|
125
|
-
height: 1px;
|
|
126
|
-
margin: -1px;
|
|
127
|
-
padding: 0;
|
|
128
|
-
border: 0;
|
|
129
|
-
overflow: hidden;
|
|
130
|
-
white-space: nowrap;
|
|
131
|
-
clip-path: inset(50%);
|
|
132
|
-
appearance: none;
|
|
133
|
-
pointer-events: none;
|
|
134
|
-
}
|
|
135
|
-
/* 悬停底取 `base-200`(中性面)—— 改前是 `base-50`:那档只比内容底低 1.7 L*,
|
|
136
|
-
在多数屏幕上看不出悬停反馈(`base-50` 不再作为「更轻底」的默认去处,见 colors 口径第 1 条)。 */
|
|
137
|
-
.mh-tag--select:hover {
|
|
138
|
-
background: var(--ui-base-200);
|
|
139
|
-
border: 1px solid var(--ui-base-300);
|
|
140
78
|
}
|
|
141
|
-
.mh-
|
|
142
|
-
|
|
143
|
-
|
|
79
|
+
.mh-tag__confirm > svg {
|
|
80
|
+
flex: none;
|
|
81
|
+
width: var(--ui-font-icon);
|
|
82
|
+
height: var(--ui-font-icon);
|
|
144
83
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
.mh-tag--select:has(input:checked) {
|
|
149
|
-
background: var(--ui-primary);
|
|
150
|
-
color: var(--ui-primary-content);
|
|
84
|
+
.mh-tag__confirm:hover {
|
|
85
|
+
opacity: 1;
|
|
86
|
+
background: var(--ui-primary-weak);
|
|
151
87
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
88
|
+
|
|
89
|
+
/* ===== 编辑态(`shape="add"` 点入口后)=====
|
|
90
|
+
这一档**没有标记片**:输入框的框归 input 面(本件只给宽度),确认位是第二个操作位。
|
|
91
|
+
宽度令牌设在 `Input` 的**表壳**上(`Input` 的 `class` 落表壳,见它的「属性落点」)。 */
|
|
92
|
+
.mh-tag--editing {
|
|
93
|
+
display: inline-flex;
|
|
94
|
+
align-items: center;
|
|
156
95
|
}
|
|
157
|
-
/*
|
|
158
|
-
.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
cursor: not-allowed;
|
|
96
|
+
/* ⚠️ **两位类选择器**(0-2-0),不是单类:`Input` 的表壳自带宽度规则(`.mh-input__wrap`,0-1-0),
|
|
97
|
+
而 `styles/index.css` 里 **`input.css` 排在本文件之后**(表单与选择控件那一组)—— 单类写法在
|
|
98
|
+
同特异性下会被它压掉,实测输入框渲染成 201px 而不是这一档要的 120px(「窄输入」名存实亡)。 */
|
|
99
|
+
.mh-tag .mh-tag__input {
|
|
100
|
+
width: var(--ui-tag-input-width);
|
|
163
101
|
}
|
|
164
102
|
|
|
165
|
-
/* =====
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
.mh-tag--add {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
border: 1px dashed var(--ui-base-300);
|
|
172
|
-
border-radius: var(--ui-radius-full);
|
|
103
|
+
/* ===== 新增入口形态(`shape="add"`)=====
|
|
104
|
+
转发给 `Badge` 的是 `plain`(透明底 + 中性字),这里把框换成虚线、字压成中性档、
|
|
105
|
+
悬停 / 按下转主色 —— 与旧 `--add` 档同一套观感。 */
|
|
106
|
+
.mh-tag.mh-tag--add {
|
|
107
|
+
border-style: dashed;
|
|
108
|
+
border-color: var(--ui-line-dashed); /* 虚线线色:口径「实线 base-300 / 虚线 base-400」 */
|
|
173
109
|
background: transparent;
|
|
174
110
|
color: var(--ui-base-content-muted);
|
|
175
111
|
cursor: pointer;
|
|
176
112
|
font-family: inherit;
|
|
177
|
-
font-size: var(--ui-tag-font-size);
|
|
178
113
|
}
|
|
179
|
-
|
|
114
|
+
/* 加号走常规图标档(`--ui-font-icon`):组件里不写死 `size`(见 AGENTS 第 7 条) */
|
|
115
|
+
.mh-tag.mh-tag--add > svg {
|
|
116
|
+
flex: none;
|
|
117
|
+
width: var(--ui-font-icon);
|
|
118
|
+
height: var(--ui-font-icon);
|
|
119
|
+
}
|
|
120
|
+
.mh-tag.mh-tag--add:hover {
|
|
180
121
|
border-color: var(--ui-primary-hover);
|
|
181
122
|
color: var(--ui-primary);
|
|
182
123
|
}
|
|
183
|
-
.mh-tag--add:active {
|
|
124
|
+
.mh-tag.mh-tag--add:active {
|
|
184
125
|
border-color: var(--ui-primary);
|
|
185
126
|
color: var(--ui-primary);
|
|
186
127
|
}
|
|
187
|
-
|
|
188
|
-
/* ===== 轻量筛选片(浅底 + 主色字)===== */
|
|
189
|
-
.mh-tag--chip {
|
|
190
|
-
height: var(--ui-tag-height-sm);
|
|
191
|
-
padding: 0 var(--ui-space-2);
|
|
192
|
-
border: none;
|
|
193
|
-
border-radius: var(--ui-radius-full);
|
|
194
|
-
background: var(--ui-primary-weak);
|
|
195
|
-
color: var(--ui-primary);
|
|
196
|
-
font-family: inherit;
|
|
197
|
-
font-size: var(--ui-font-caption);
|
|
198
|
-
cursor: pointer;
|
|
199
|
-
}
|
|
200
|
-
.mh-tag--chip[data-state='active'],
|
|
201
|
-
.mh-tag--chip.is-active {
|
|
202
|
-
background: var(--ui-primary);
|
|
203
|
-
color: var(--ui-primary-content);
|
|
204
|
-
}
|
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* tag —— 单件令牌(**基础值**)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 本件是 **`Badge` 的交互封装**(可关闭 / 可新增):底 / 边 / 圆角 / 高度 / 字号 / 内距 / 档位
|
|
5
|
+
* 全归 `badge` 面,故这里只剩**交互位自己**的两个值 —— 文件这么短是**有意**的:
|
|
6
|
+
* 2026-09-30 之前它带着一整套与 `badge` 重复的几何(`--ui-tag-bg` / `-height` / `-font-size` …),
|
|
7
|
+
* 同一高度上还各走一个圆角档,那批令牌已随收口撤除。
|
|
5
8
|
*
|
|
6
9
|
* ## 抽出说明
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
10
|
+
* 这些是**基础值**,锚在 `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,
|
|
11
|
+
* 因此**任何落在容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设。
|
|
11
12
|
*
|
|
12
|
-
* ⚠️ `.mh-<件>--<档>`
|
|
13
|
-
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
13
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效)。
|
|
14
14
|
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
15
15
|
*/
|
|
16
16
|
[data-manohub-ui] {
|
|
17
|
-
/*
|
|
18
|
-
软底**只有一档**:改前是 `#e1edff`(24) 与 `#f0faff`(28) 两个字面量,与主题的主色浅底档
|
|
19
|
-
`--ui-primary-weak`(#EFF5FF) 差 ≤ 6/255 —— 三个近值并存的典型症状,本轮并入主题档。
|
|
20
|
-
设计实证:表格内标签 `0:2723` 底 `#eaefff`。 */
|
|
21
|
-
--ui-tag-bg: var(--ui-primary-weak);
|
|
22
|
-
/* 20 / 24 两档是**跨件共用**的「标记体量档」(徽标 / 标签 / 多选标签片同源)⇒ 全局值在
|
|
23
|
-
`@manohub/theme` 的 `spacing.css`,本件只做别名:改档只改主题那一处。
|
|
24
|
-
28 / 22 两档只服务本件(大号标签 / 状态标签),故字面量留在本文件。 */
|
|
25
|
-
--ui-tag-height: var(--ui-mark-height-md);
|
|
26
|
-
--ui-tag-height-sm: var(--ui-mark-height-sm);
|
|
27
|
-
--ui-tag-height-lg: 28px;
|
|
28
|
-
--ui-tag-height-status: 22px;
|
|
29
|
-
--ui-tag-font-size: var(--ui-font-caption);
|
|
30
|
-
--ui-tag-icon-size: var(--ui-font-icon); /* 常规图标档(本件不再自定数值) */
|
|
31
|
-
--ui-tag-close-size: 14px;
|
|
17
|
+
/* 内容 ↔ 操作位:4(`Badge` 的通用 gap 是 6,那是给前置点的;操作位紧一档更像「贴在字尾」) */
|
|
32
18
|
--ui-tag-gap: var(--ui-space-1);
|
|
19
|
+
/* 关闭位触区;字形 12 属「贴小控件的字形」,见 contract-icon-direction。
|
|
20
|
+
添加位(新增档)**不占令牌**:它的触区与字形都按常规图标档 `--ui-font-icon` 派生。 */
|
|
21
|
+
--ui-tag-close-size: 14px;
|
|
22
|
+
/* 新增档的**窄**输入框宽度:在容器上重设即可加宽(`--ui-tag-input-width: 200px`) */
|
|
23
|
+
--ui-tag-input-width: 120px;
|
|
33
24
|
}
|