@manohub/ui 0.10.4 → 0.10.5
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.
|
@@ -21,11 +21,13 @@ export interface TabsProps {
|
|
|
21
21
|
/** 惰性档:只有激活的面板才渲染(切走即卸载),用于面板很重(图表 / 大表格)的场景 */
|
|
22
22
|
lazy?: boolean;
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* 尺寸档(`sm` / `md` / `lg`,缺省 `md`)—— 管**两件事**:
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* 1. **骨架的呼吸位**:`控件 → 面板` 的 `gap`(`4 / 8 / 12px`)。这一条**与皮肤无关** ——
|
|
27
|
+
* 传了 `selector` 自定义控件时同样生效(间距归骨架,控件长什么样归皮肤);
|
|
28
|
+
* 2. **缺省皮肤的尺寸档**:原样透传给 `TabBar`(高度 `24 / 32 / 40` + 同级字号)。
|
|
29
|
+
* 换了皮肤则这一条不生效:控件的尺寸归你放进来的那个控件自己管
|
|
30
|
+
* (`Capsule` / 分段按钮各有自己的 `size`),本件不代它加类。
|
|
29
31
|
*/
|
|
30
32
|
size?: ControlSize;
|
|
31
33
|
}
|
|
@@ -119,8 +121,9 @@ export declare const TabPanel: import("vue").DefineComponent<import("vue").Extra
|
|
|
119
121
|
* - 传插槽则整块替换:放 `Capsule`(胶囊)、按钮族的分段形态、单选卡片都行,
|
|
120
122
|
* 作用域参数 `{ value, options, select }` 把值、项(已含从 `TabPanel` 提取的那些)与选中回调
|
|
121
123
|
* 递出来。本件不认识任何选择控件的类名 —— **控制器与骨架零互指**,换皮肤不必动本件。
|
|
122
|
-
* - 尺寸档 `size`
|
|
123
|
-
*
|
|
124
|
+
* - 尺寸档 `size` 管两件事:① 骨架的呼吸位(`.mh-tabs` 的 `gap`,4 / 8 / 12px,**与皮肤无关**);
|
|
125
|
+
* ② 缺省皮肤 `TabBar` 的高与字号(24 / 32 / 40)。换了皮肤则第 ② 条不生效 ——
|
|
126
|
+
* 控件尺寸归你的控件自己管,本件不代它加类。
|
|
124
127
|
*
|
|
125
128
|
* ## 显隐只有一条路径
|
|
126
129
|
* 本件按受控值给非选中面板下发 `hidden`,**与控件形态无关**(是不是原生 radio 都一样)。
|
|
@@ -112,7 +112,12 @@ const Tabs = /* @__PURE__ */ defineComponent({
|
|
|
112
112
|
}, [node]);
|
|
113
113
|
});
|
|
114
114
|
return createVNode("div", {
|
|
115
|
-
"class": [
|
|
115
|
+
"class": [
|
|
116
|
+
"mh-tabs",
|
|
117
|
+
/* `md` 缺省不发类(与 `TabBar` 同口径):骨架的呼吸位 `gap` 靠这个档位类改写 */
|
|
118
|
+
props.size === "md" ? "" : `mh-tabs--${props.size}`,
|
|
119
|
+
attrs.class
|
|
120
|
+
].filter(Boolean).join(" "),
|
|
116
121
|
"style": attrs.style
|
|
117
122
|
}, [slots.selector ? slots.selector({
|
|
118
123
|
value: current,
|
|
@@ -169,7 +169,13 @@
|
|
|
169
169
|
display: inline-flex;
|
|
170
170
|
align-items: center;
|
|
171
171
|
flex: 0 0 auto;
|
|
172
|
-
line-height:
|
|
172
|
+
/* 行盒归零(`font-size: 0` + `line-height: 0`):`Tooltip` 的宿主里还夹着一层 **inline 的锚点
|
|
173
|
+
span**(`.mh-popup-anchor`),它会给内含的 `inline-flex` 触发器生成行盒 —— 行盒按基线对齐,
|
|
174
|
+
于是宿主比图标高出一个 descender 间隙(实测 16px 图标 ⇒ 宿主 17px)。宿主再把这 17px 在
|
|
175
|
+
label 行里居中,图标中线就比文字中线高 0.5px。归零后宿主高度 === 图标高度,中线才重合。
|
|
176
|
+
图标 svg 不受影响(它自带尺寸,不读字号)。 */
|
|
177
|
+
font-size: 0;
|
|
178
|
+
line-height: 0;
|
|
173
179
|
}
|
|
174
180
|
|
|
175
181
|
/* 触发器(问号按钮):`reset` 不代消费方归零控件外观,故边 / 底 / 内距三项自备。
|
|
@@ -182,29 +188,18 @@
|
|
|
182
188
|
padding: 0;
|
|
183
189
|
border: none;
|
|
184
190
|
background: transparent;
|
|
185
|
-
|
|
191
|
+
/* 静止:**浅灰**(`subtle`,同计数器档);滑过 / 键盘聚焦转**正文色(黑)** ——
|
|
192
|
+
从 muted(#666) 起手的那版与 hover 后的 content(#1a1a1a) 只差一档,视觉上几乎看不出交互。 */
|
|
193
|
+
color: var(--ui-base-content-subtle);
|
|
186
194
|
cursor: help;
|
|
187
195
|
}
|
|
188
196
|
|
|
189
|
-
.mh-form-item__tip-btn:hover
|
|
190
|
-
.mh-form-item__tip-btn:focus-visible {
|
|
197
|
+
.mh-form-item__tip-btn:hover {
|
|
191
198
|
color: var(--ui-base-content);
|
|
192
199
|
}
|
|
193
200
|
|
|
194
|
-
/* 键盘可达:气泡显形靠操作层的宿主 `:focus-within` 档,这里只管**焦点可见**(主色环)。 */
|
|
195
201
|
|
|
196
|
-
.mh-form-item__tip-btn:focus-visible {
|
|
197
|
-
outline: 2px solid var(--ui-primary);
|
|
198
|
-
outline-offset: 2px;
|
|
199
|
-
}
|
|
200
202
|
|
|
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
203
|
|
|
209
204
|
/* label 对齐:基类默认右对齐(贴控件列,`labelAlign` 缺省档);
|
|
210
205
|
`labelAlign="left"` 时挂这个修饰类改成左对齐 —— 只给「非默认值」挂类,避免两段声明争胜出顺序。
|
|
@@ -479,7 +479,12 @@
|
|
|
479
479
|
}
|
|
480
480
|
.mh-input__wrap:has(> .mh-input--textarea) > .mh-input__counter {
|
|
481
481
|
position: absolute;
|
|
482
|
-
|
|
482
|
+
/* 右让位一个「拖拽角」:多行是 `resize: vertical`(`.mh-input--textarea`),浏览器于是在框的
|
|
483
|
+
右下角画一枚原生拖拽柄(Chromium 约 16px 见方),与计数器**同角重叠**——实测截图里
|
|
484
|
+
`0/1024` 与手柄叠在一起。故计数器在同一行内右移整一档令牌(`--ui-space-4` = 16px):
|
|
485
|
+
`bottom` 不动,底部留白口径(见上方 padding-bottom 规则)不受影响。
|
|
486
|
+
不同平台的手柄宽略有差异(Firefox 略窄),此处取整档、不按浏览器分支。 */
|
|
487
|
+
right: calc(var(--ui-input-padding-x) + var(--ui-space-4));
|
|
483
488
|
bottom: var(--ui-space-1);
|
|
484
489
|
}
|
|
485
490
|
|
|
@@ -40,11 +40,20 @@
|
|
|
40
40
|
* 面板的面与几何由皮肤族给(卡片一类);本层只写「收起态」「弹性链」与根上的呼吸位。
|
|
41
41
|
*/
|
|
42
42
|
|
|
43
|
-
/* ===== 一、操作根:选择控件在上、面板在下 =====
|
|
43
|
+
/* ===== 一、操作根:选择控件在上、面板在下 =====
|
|
44
|
+
呼吸位(`gap`)随 `size` 档走:档位由组件在根上出 `mh-tabs--sm` / `mh-tabs--lg`
|
|
45
|
+
(`md` 缺省不发类,与 `TabBar` 同口径)。skin 只决定控件长什么样,控件与面板之间的
|
|
46
|
+
间距归骨架 —— 故本档**与皮肤无关**,传了 `selector` 自定义控件时同样生效。 */
|
|
44
47
|
.mh-tabs {
|
|
45
48
|
display: flex;
|
|
46
49
|
flex-direction: column;
|
|
47
|
-
gap: var(--ui-space-
|
|
50
|
+
gap: var(--ui-space-2); /* md(缺省):8px */
|
|
51
|
+
}
|
|
52
|
+
.mh-tabs--sm {
|
|
53
|
+
gap: var(--ui-space-1); /* sm:4px */
|
|
54
|
+
}
|
|
55
|
+
.mh-tabs--lg {
|
|
56
|
+
gap: var(--ui-space-3); /* lg:12px */
|
|
48
57
|
}
|
|
49
58
|
|
|
50
59
|
/* ===== 二、弹性链:面板组 → 面板 =====
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manohub/ui",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "AIHub 自绘组件层:不依赖 farris 的手写 Vue TSX 组件 + 自带令牌层(Farris 规范视觉 · daisyUI 式语义令牌 · shadcn 式 API 词汇)。",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"vue": "^3.5.0"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@manohub/icon": "^0.10.
|
|
49
|
+
"@manohub/icon": "^0.10.5"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "^24.0.0",
|