@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
|
@@ -11,15 +11,15 @@
|
|
|
11
11
|
* **整支保留**,并强制全展到命中层(算法与切分都是纯函数,见 `select-tree-filter.ts`);
|
|
12
12
|
* 命中文本按面层的 `.mh-select__hit` 高亮(靠 `Tree` 的可选 `renderLabel` 钩子落进标签槽)。
|
|
13
13
|
* 3. **面板内限高滚动**:限高归面板(`.mh-select__panel` 的 `--ui-select-panel-max-height`)、
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* 溢出与内容内距都由面板内容区(`.mh-select__body`)承担 —— 两形态共用同一份,本件因此
|
|
15
|
+
* 把树**直接**装进内容区,不再自持一层只给内距的包裹(限高与内距都不由形态自持)。
|
|
16
16
|
*
|
|
17
17
|
* ## 与 `Select` 的三处有意差异(都是「树不是列表」决定的)
|
|
18
18
|
*
|
|
19
19
|
* | 事项 | `Select` | `SelectTree` |
|
|
20
20
|
* | --- | --- | --- |
|
|
21
21
|
* | 值 | `string \| number \| Array<…>` | 只单选、只 `string`(`Tree` 的主键本就 `String()` 化) |
|
|
22
|
-
* | 面板内 ↑↓ 行导航 |
|
|
22
|
+
* | 面板内 ↑↓ 行导航 | 有(高亮位由 `data-active` 表达,焦点留在触发器上) | **无**(树的行不做键盘导航,与 `Tree` 自身同口径) |
|
|
23
23
|
* | 空 / 加载态 | 列表体的内建行 | 面板内同样出一行文字(**不复用**整件三态容器:下拉里出空态插画太重) |
|
|
24
24
|
*
|
|
25
25
|
* @example 基础单选
|
|
@@ -139,6 +139,16 @@ export declare const SelectTree: import("vue").DefineComponent<import("vue").Ext
|
|
|
139
139
|
type: PropType<(keyword: string) => void>;
|
|
140
140
|
default: undefined;
|
|
141
141
|
};
|
|
142
|
+
/** 面板里树行的节点图标(标签前的一位图标):透传给 `Tree.renderIcon` */
|
|
143
|
+
renderIcon: {
|
|
144
|
+
type: PropType<(node: TreeNode) => unknown>;
|
|
145
|
+
default: undefined;
|
|
146
|
+
};
|
|
147
|
+
/** 面板里树行的展开 / 收起箭头字形:透传给 `Tree.renderCaret` */
|
|
148
|
+
renderCaret: {
|
|
149
|
+
type: PropType<(node: TreeNode, expanded: boolean) => unknown>;
|
|
150
|
+
default: undefined;
|
|
151
|
+
};
|
|
142
152
|
}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
143
153
|
'update:modelValue': (v: string) => true;
|
|
144
154
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
@@ -248,6 +258,16 @@ export declare const SelectTree: import("vue").DefineComponent<import("vue").Ext
|
|
|
248
258
|
type: PropType<(keyword: string) => void>;
|
|
249
259
|
default: undefined;
|
|
250
260
|
};
|
|
261
|
+
/** 面板里树行的节点图标(标签前的一位图标):透传给 `Tree.renderIcon` */
|
|
262
|
+
renderIcon: {
|
|
263
|
+
type: PropType<(node: TreeNode) => unknown>;
|
|
264
|
+
default: undefined;
|
|
265
|
+
};
|
|
266
|
+
/** 面板里树行的展开 / 收起箭头字形:透传给 `Tree.renderCaret` */
|
|
267
|
+
renderCaret: {
|
|
268
|
+
type: PropType<(node: TreeNode, expanded: boolean) => unknown>;
|
|
269
|
+
default: undefined;
|
|
270
|
+
};
|
|
251
271
|
}>> & Readonly<{
|
|
252
272
|
"onUpdate:modelValue"?: ((v: string) => any) | undefined;
|
|
253
273
|
}>, {
|
|
@@ -257,6 +277,8 @@ export declare const SelectTree: import("vue").DefineComponent<import("vue").Ext
|
|
|
257
277
|
loading: boolean;
|
|
258
278
|
labelKey: string;
|
|
259
279
|
childrenKey: string;
|
|
280
|
+
renderCaret: (node: TreeNode, expanded: boolean) => unknown;
|
|
281
|
+
renderIcon: (node: TreeNode) => unknown;
|
|
260
282
|
expandedKeys: string[];
|
|
261
283
|
defaultExpandedKeys: string[];
|
|
262
284
|
defaultExpandAll: boolean;
|
|
@@ -113,6 +113,16 @@ const SelectTree = /* @__PURE__ */ defineComponent({
|
|
|
113
113
|
onSearch: {
|
|
114
114
|
type: Function,
|
|
115
115
|
default: void 0
|
|
116
|
+
},
|
|
117
|
+
/** 面板里树行的节点图标(标签前的一位图标):透传给 `Tree.renderIcon` */
|
|
118
|
+
renderIcon: {
|
|
119
|
+
type: Function,
|
|
120
|
+
default: void 0
|
|
121
|
+
},
|
|
122
|
+
/** 面板里树行的展开 / 收起箭头字形:透传给 `Tree.renderCaret` */
|
|
123
|
+
renderCaret: {
|
|
124
|
+
type: Function,
|
|
125
|
+
default: void 0
|
|
116
126
|
}
|
|
117
127
|
},
|
|
118
128
|
emits: {
|
|
@@ -184,7 +194,8 @@ const SelectTree = /* @__PURE__ */ defineComponent({
|
|
|
184
194
|
disabled: props.disabled,
|
|
185
195
|
clear,
|
|
186
196
|
openPanel: () => showPanel(panelRef.value)
|
|
187
|
-
/* 有意不给 `
|
|
197
|
+
/* 有意不给 `moveActive` / `commitActive`:树不做面板内键盘导航(行不可聚焦、与 `Tree` 自身
|
|
198
|
+
同口径),故 `↑` / `↓` 只开面板、`Enter` / `Space` 仍归按钮的原生切换行为 */
|
|
188
199
|
});
|
|
189
200
|
const renderHitLabel = (node) => createVNode(Fragment, null, [splitHighlight(treeLabel(node, props.labelKey), keyword.value).map((segment, index) => segment.hit ? createVNode("span", {
|
|
190
201
|
"key": index,
|
|
@@ -228,9 +239,7 @@ const SelectTree = /* @__PURE__ */ defineComponent({
|
|
|
228
239
|
"class": "mh-select__option mh-select__option--empty"
|
|
229
240
|
}, [props.emptyText]);
|
|
230
241
|
}
|
|
231
|
-
return createVNode(
|
|
232
|
-
"class": "mh-select__tree"
|
|
233
|
-
}, [createVNode(Tree, {
|
|
242
|
+
return createVNode(Tree, {
|
|
234
243
|
"nodes": visibleNodes.value,
|
|
235
244
|
"rowKey": props.rowKey,
|
|
236
245
|
"labelKey": props.labelKey,
|
|
@@ -239,8 +248,10 @@ const SelectTree = /* @__PURE__ */ defineComponent({
|
|
|
239
248
|
"expandedKeys": expandedKeys.value,
|
|
240
249
|
"onExpandChange": handleExpandChange,
|
|
241
250
|
"onSelect": pick,
|
|
242
|
-
"renderLabel": highlightLabel
|
|
243
|
-
|
|
251
|
+
"renderLabel": highlightLabel,
|
|
252
|
+
"renderIcon": props.renderIcon,
|
|
253
|
+
"renderCaret": props.renderCaret
|
|
254
|
+
}, null);
|
|
244
255
|
}
|
|
245
256
|
})]);
|
|
246
257
|
};
|
|
@@ -45,6 +45,16 @@ export declare const SelectTrigger: import("vue").DefineComponent<import("vue").
|
|
|
45
45
|
type: StringConstructor;
|
|
46
46
|
default: undefined;
|
|
47
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* 键盘高亮行的 id(`aria-activedescendant`,**列表形态专用**)。
|
|
50
|
+
*
|
|
51
|
+
* 选项是 `div[role='option']`、不可聚焦,焦点留在本按钮上 ⇒ 高亮项要靠这个属性告诉读屏。
|
|
52
|
+
* 树形态不给(树的行不做键盘导航,见 `SelectTree`)。
|
|
53
|
+
*/
|
|
54
|
+
activeDescendant: {
|
|
55
|
+
type: StringConstructor;
|
|
56
|
+
default: undefined;
|
|
57
|
+
};
|
|
48
58
|
/** 触发器上的键盘契约(`createTriggerKeydown()` 产出,两件同源) */
|
|
49
59
|
onKeydown: {
|
|
50
60
|
type: PropType<(event: KeyboardEvent) => void>;
|
|
@@ -104,6 +114,16 @@ export declare const SelectTrigger: import("vue").DefineComponent<import("vue").
|
|
|
104
114
|
type: StringConstructor;
|
|
105
115
|
default: undefined;
|
|
106
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* 键盘高亮行的 id(`aria-activedescendant`,**列表形态专用**)。
|
|
119
|
+
*
|
|
120
|
+
* 选项是 `div[role='option']`、不可聚焦,焦点留在本按钮上 ⇒ 高亮项要靠这个属性告诉读屏。
|
|
121
|
+
* 树形态不给(树的行不做键盘导航,见 `SelectTree`)。
|
|
122
|
+
*/
|
|
123
|
+
activeDescendant: {
|
|
124
|
+
type: StringConstructor;
|
|
125
|
+
default: undefined;
|
|
126
|
+
};
|
|
107
127
|
/** 触发器上的键盘契约(`createTriggerKeydown()` 产出,两件同源) */
|
|
108
128
|
onKeydown: {
|
|
109
129
|
type: PropType<(event: KeyboardEvent) => void>;
|
|
@@ -130,5 +150,6 @@ export declare const SelectTrigger: import("vue").DefineComponent<import("vue").
|
|
|
130
150
|
clearable: boolean;
|
|
131
151
|
hasValue: boolean;
|
|
132
152
|
onClear: () => void;
|
|
153
|
+
activeDescendant: string;
|
|
133
154
|
renderValue: () => VNodeChild;
|
|
134
155
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -48,6 +48,16 @@ const SelectTrigger = /* @__PURE__ */ defineComponent({
|
|
|
48
48
|
type: String,
|
|
49
49
|
default: void 0
|
|
50
50
|
},
|
|
51
|
+
/**
|
|
52
|
+
* 键盘高亮行的 id(`aria-activedescendant`,**列表形态专用**)。
|
|
53
|
+
*
|
|
54
|
+
* 选项是 `div[role='option']`、不可聚焦,焦点留在本按钮上 ⇒ 高亮项要靠这个属性告诉读屏。
|
|
55
|
+
* 树形态不给(树的行不做键盘导航,见 `SelectTree`)。
|
|
56
|
+
*/
|
|
57
|
+
activeDescendant: {
|
|
58
|
+
type: String,
|
|
59
|
+
default: void 0
|
|
60
|
+
},
|
|
51
61
|
/** 触发器上的键盘契约(`createTriggerKeydown()` 产出,两件同源) */
|
|
52
62
|
onKeydown: {
|
|
53
63
|
type: Function,
|
|
@@ -80,8 +90,12 @@ const SelectTrigger = /* @__PURE__ */ defineComponent({
|
|
|
80
90
|
popovertarget: props.panelId,
|
|
81
91
|
"aria-haspopup": "listbox",
|
|
82
92
|
/* 开合态由原生 popover 与 popup.css 的箭头转向承担,本件不维护第二份;
|
|
83
|
-
恒定 'false' 是既有口径(输入面的触发器形态不跟踪 popover
|
|
93
|
+
恒定 'false' 是既有口径(输入面的触发器形态不跟踪 popover 的开关状态)。
|
|
94
|
+
⚠️ 这与 `aria-activedescendant`(下面那条)**都是焦点留在触发器上的必然结果**:
|
|
95
|
+
真的做完整要连 `aria-expanded` 一起跟踪开合态,那是另一次改动(见 select.md 的注意事项)。 */
|
|
84
96
|
"aria-expanded": "false",
|
|
97
|
+
/* 高亮行引用(列表形态给、树形态不给):值 `undefined` 时 Vue 会整个摘掉这个属性 */
|
|
98
|
+
"aria-activedescendant": props.activeDescendant,
|
|
85
99
|
onKeydown: props.onKeydown
|
|
86
100
|
},
|
|
87
101
|
"onChange": () => props.onClear?.()
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type PropType, type SlotsType, type VNode, type VNodeChild } from 'vue';
|
|
2
|
+
import type { ControlSize } from '../control-size';
|
|
2
3
|
/** 轨道项:`Tabs` 从 `TabPanel` 提取(写了面板时)或由 `options` 直接给(老写法) */
|
|
3
4
|
export interface TabsOption {
|
|
4
5
|
/** 项文字 */
|
|
@@ -19,6 +20,14 @@ export interface TabsProps {
|
|
|
19
20
|
onChange?: (value: string | number) => void;
|
|
20
21
|
/** 惰性档:只有激活的面板才渲染(切走即卸载),用于面板很重(图表 / 大表格)的场景 */
|
|
21
22
|
lazy?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* **缺省皮肤的尺寸档**(`sm` / `md` / `lg`,即 24 / 32 / 40)—— 只透传给缺省皮肤 `TabBar`。
|
|
25
|
+
*
|
|
26
|
+
* 传了 `selector` 插槽时本档**整块失效**:那时尺寸归你放进来的那个控件自己管
|
|
27
|
+
* (`Capsule` / 分段按钮各有自己的 `size`),本件也不给它加任何类 —— 有意不给
|
|
28
|
+
* 「一处声明、两处打架」的机会。
|
|
29
|
+
*/
|
|
30
|
+
size?: ControlSize;
|
|
22
31
|
}
|
|
23
32
|
/** 一块面板的信息(本件只承载这些,自己不画任何东西) */
|
|
24
33
|
export interface TabPanelProps {
|
|
@@ -110,6 +119,8 @@ export declare const TabPanel: import("vue").DefineComponent<import("vue").Extra
|
|
|
110
119
|
* - 传插槽则整块替换:放 `Capsule`(胶囊)、按钮族的分段形态、单选卡片都行,
|
|
111
120
|
* 作用域参数 `{ value, options, select }` 把值、项(已含从 `TabPanel` 提取的那些)与选中回调
|
|
112
121
|
* 递出来。本件不认识任何选择控件的类名 —— **控制器与骨架零互指**,换皮肤不必动本件。
|
|
122
|
+
* - 尺寸档 `size` **只在缺省这条路上生效**:它原样透传给 `TabBar`(高度 24 / 32 / 40 + 同级字号,
|
|
123
|
+
* 只覆盖 `--ui-tabbar-*` 令牌);换了皮肤,尺寸归你的控件自己管,本件不代它加类。
|
|
113
124
|
*
|
|
114
125
|
* ## 显隐只有一条路径
|
|
115
126
|
* 本件按受控值给非选中面板下发 `hidden`,**与控件形态无关**(是不是原生 radio 都一样)。
|
|
@@ -157,6 +168,11 @@ export declare const Tabs: import("vue").DefineComponent<import("vue").ExtractPr
|
|
|
157
168
|
type: BooleanConstructor;
|
|
158
169
|
default: boolean;
|
|
159
170
|
};
|
|
171
|
+
/** 缺省皮肤的尺寸档(`sm` / `md` / `lg`);口径见 `TabsProps.size` */
|
|
172
|
+
size: {
|
|
173
|
+
type: PropType<ControlSize>;
|
|
174
|
+
default: string;
|
|
175
|
+
};
|
|
160
176
|
}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
161
177
|
'update:value': (value: string | number) => true;
|
|
162
178
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
@@ -180,9 +196,15 @@ export declare const Tabs: import("vue").DefineComponent<import("vue").ExtractPr
|
|
|
180
196
|
type: BooleanConstructor;
|
|
181
197
|
default: boolean;
|
|
182
198
|
};
|
|
199
|
+
/** 缺省皮肤的尺寸档(`sm` / `md` / `lg`);口径见 `TabsProps.size` */
|
|
200
|
+
size: {
|
|
201
|
+
type: PropType<ControlSize>;
|
|
202
|
+
default: string;
|
|
203
|
+
};
|
|
183
204
|
}>> & Readonly<{
|
|
184
205
|
"onUpdate:value"?: ((value: string | number) => any) | undefined;
|
|
185
206
|
}>, {
|
|
207
|
+
size: ControlSize;
|
|
186
208
|
value: string | number | undefined;
|
|
187
209
|
onChange: (value: string | number) => void;
|
|
188
210
|
options: TabsOption[];
|
|
@@ -55,6 +55,11 @@ const Tabs = /* @__PURE__ */ defineComponent({
|
|
|
55
55
|
lazy: {
|
|
56
56
|
type: Boolean,
|
|
57
57
|
default: false
|
|
58
|
+
},
|
|
59
|
+
/** 缺省皮肤的尺寸档(`sm` / `md` / `lg`);口径见 `TabsProps.size` */
|
|
60
|
+
size: {
|
|
61
|
+
type: String,
|
|
62
|
+
default: "md"
|
|
58
63
|
}
|
|
59
64
|
},
|
|
60
65
|
/* 同 `TabBar`:受控值必须 emit 回 `update:value`,否则 `v-model:value="current"` 静默失效
|
|
@@ -116,6 +121,7 @@ const Tabs = /* @__PURE__ */ defineComponent({
|
|
|
116
121
|
}) : createVNode(TabBar, {
|
|
117
122
|
"options": items,
|
|
118
123
|
"value": current,
|
|
124
|
+
"size": props.size,
|
|
119
125
|
"onChange": select
|
|
120
126
|
}, null), createVNode("div", {
|
|
121
127
|
"class": "mh-tabs-panels"
|
|
@@ -1,203 +1,82 @@
|
|
|
1
|
-
import { type IconName } from '@manohub/icon';
|
|
2
1
|
import { type PropType, type SlotsType, type VNodeChild } from 'vue';
|
|
3
|
-
import type
|
|
2
|
+
import { type BadgeShape, type BadgeSize, type BadgeTone } from '../badge';
|
|
3
|
+
/** 本件的形态:`Badge` 的三档 + `add`(新增入口,本件扩展档) */
|
|
4
|
+
export type TagShape = BadgeShape | 'add';
|
|
4
5
|
export interface TagProps {
|
|
5
6
|
/**
|
|
6
7
|
* 形态:
|
|
7
|
-
* - `
|
|
8
|
-
* - `
|
|
9
|
-
* - `select` 可选标签(渲染隐身原生 radio,选中态实底主色)
|
|
10
|
-
* - `add` 新增标签(虚线框 + 加号图标,点击回调)
|
|
11
|
-
* - `chip` 轻量筛选片
|
|
8
|
+
* - `soft`(缺省)/ `outline` / `plain` —— 转发给 `Badge` 的同名档;
|
|
9
|
+
* - `add` 新增入口:虚线入口点击后就地变窄输入框,`Enter` 提交回调 `onAdd`。
|
|
12
10
|
*/
|
|
13
|
-
shape?:
|
|
14
|
-
/**
|
|
15
|
-
tone?:
|
|
16
|
-
/**
|
|
17
|
-
size?:
|
|
18
|
-
/**
|
|
19
|
-
lg?: boolean;
|
|
20
|
-
/** 前置图标(图标包的闭合枚举) */
|
|
21
|
-
icon?: IconName;
|
|
22
|
-
/** 描边档:浅主色底 + 浅主色边(设计稿的标签配方,配 `size="sm"` 即「表格内标签」) */
|
|
23
|
-
outline?: boolean;
|
|
24
|
-
/** 可关闭(右端出现关闭位) */
|
|
11
|
+
shape?: TagShape;
|
|
12
|
+
/** 语义色档(转发 `Badge`;缺省 `default` 是中性面) */
|
|
13
|
+
tone?: BadgeTone;
|
|
14
|
+
/** 尺寸档(转发 `Badge`:`sm` 20 / `md` 24);缺省 `md`(与 `Badge` 的缺省 `sm` 不同,见下) */
|
|
15
|
+
size?: BadgeSize;
|
|
16
|
+
/** 可关闭:右端出现关闭位(**受控**:只回调 `onClose`,本件不删自己) */
|
|
25
17
|
closable?: boolean;
|
|
26
|
-
/**
|
|
27
|
-
color?: string;
|
|
28
|
-
/** `shape="select"` 的选中态 */
|
|
29
|
-
selected?: boolean;
|
|
30
|
-
/** 禁用(可选档不可点、转弱) */
|
|
31
|
-
disabled?: boolean;
|
|
32
|
-
/** `shape="select"` 的原生分组名与值(组内同名互斥) */
|
|
33
|
-
name?: string;
|
|
34
|
-
value?: string | number;
|
|
35
|
-
/** `shape="add"` / `chip` 的点击回调(`select` 档用 `onChange`) */
|
|
36
|
-
onClick?: () => void;
|
|
37
|
-
/** `shape="select"` 的选中变化回调 */
|
|
38
|
-
onChange?: (selected: boolean) => void;
|
|
39
|
-
/** 关闭回调(`closable` 的关闭位点击) */
|
|
18
|
+
/** 关闭位回调(`closable`) */
|
|
40
19
|
onClose?: () => void;
|
|
20
|
+
/** 新增档提交回调(`shape="add"`):载荷是用户敲定的标签名(已 trim、非空) */
|
|
21
|
+
onAdd?: (name: string) => void;
|
|
41
22
|
}
|
|
42
|
-
/**
|
|
43
|
-
* 标签(常规 / 状态 / 可选 / 新增 / 轻量筛选片)。
|
|
44
|
-
*
|
|
45
|
-
* **与 `Badge` 的判据**:`Badge` 是状态徽标(固定短、状态色、可带圆点/数字);
|
|
46
|
-
* 本件是内容标签(描述性文字,长度随内容,可能可选/可加/可关闭)。
|
|
47
|
-
*
|
|
48
|
-
* 可选档(`shape="select"`)是**原生 radio**:组内同名互斥、键盘方向键换项都由浏览器接管,
|
|
49
|
-
* 样式层靠 `:has(input:checked)` / `[data-state='selected']` / `.is-selected` 三源等价选态。
|
|
50
|
-
*
|
|
51
|
-
* 关闭是**受控**的:本件只回调 `onClose`,是否移除由业务决定(与 `Notification` 同一口径)——
|
|
52
|
-
* 组件自己删自己会让「关闭后又能从别处恢复」这类需求无解。
|
|
53
|
-
*
|
|
54
|
-
* @example 状态标签
|
|
55
|
-
* <Tag shape="status" tone="success">已通过</Tag>
|
|
56
|
-
*
|
|
57
|
-
* @example 可关闭的筛选条件
|
|
58
|
-
* <Tag closable icon="filter" onClose={() => remove('status')}>状态:已通过</Tag>
|
|
59
|
-
*
|
|
60
|
-
* @example 可选标签(同组互斥)
|
|
61
|
-
* <Tag shape="select" name="scope" value="all" :selected="v === 'all'" @change="select('all')">全部</Tag>
|
|
62
|
-
*/
|
|
63
23
|
export declare const Tag: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
64
24
|
shape: {
|
|
65
|
-
type: PropType<
|
|
25
|
+
type: PropType<TagShape>;
|
|
66
26
|
default: string;
|
|
67
27
|
};
|
|
68
28
|
tone: {
|
|
69
|
-
type: PropType<
|
|
70
|
-
default:
|
|
29
|
+
type: PropType<BadgeTone>;
|
|
30
|
+
default: string;
|
|
71
31
|
};
|
|
72
32
|
size: {
|
|
73
|
-
type: PropType<
|
|
33
|
+
type: PropType<BadgeSize>;
|
|
74
34
|
default: string;
|
|
75
35
|
};
|
|
76
|
-
lg: {
|
|
77
|
-
type: BooleanConstructor;
|
|
78
|
-
default: boolean;
|
|
79
|
-
};
|
|
80
|
-
icon: {
|
|
81
|
-
type: PropType<IconName>;
|
|
82
|
-
default: undefined;
|
|
83
|
-
};
|
|
84
|
-
outline: {
|
|
85
|
-
type: BooleanConstructor;
|
|
86
|
-
default: boolean;
|
|
87
|
-
};
|
|
88
36
|
closable: {
|
|
89
37
|
type: BooleanConstructor;
|
|
90
38
|
default: boolean;
|
|
91
39
|
};
|
|
92
|
-
|
|
93
|
-
type: StringConstructor;
|
|
94
|
-
default: undefined;
|
|
95
|
-
};
|
|
96
|
-
selected: {
|
|
97
|
-
type: BooleanConstructor;
|
|
98
|
-
default: boolean;
|
|
99
|
-
};
|
|
100
|
-
disabled: {
|
|
101
|
-
type: BooleanConstructor;
|
|
102
|
-
default: boolean;
|
|
103
|
-
};
|
|
104
|
-
name: {
|
|
105
|
-
type: StringConstructor;
|
|
106
|
-
default: undefined;
|
|
107
|
-
};
|
|
108
|
-
value: {
|
|
109
|
-
type: PropType<string | number>;
|
|
110
|
-
default: undefined;
|
|
111
|
-
};
|
|
112
|
-
onClick: {
|
|
40
|
+
onClose: {
|
|
113
41
|
type: PropType<() => void>;
|
|
114
42
|
default: undefined;
|
|
115
43
|
};
|
|
116
|
-
|
|
117
|
-
type: PropType<(
|
|
118
|
-
default: undefined;
|
|
119
|
-
};
|
|
120
|
-
onClose: {
|
|
121
|
-
type: PropType<() => void>;
|
|
44
|
+
onAdd: {
|
|
45
|
+
type: PropType<(name: string) => void>;
|
|
122
46
|
default: undefined;
|
|
123
47
|
};
|
|
124
48
|
}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
125
49
|
shape: {
|
|
126
|
-
type: PropType<
|
|
50
|
+
type: PropType<TagShape>;
|
|
127
51
|
default: string;
|
|
128
52
|
};
|
|
129
53
|
tone: {
|
|
130
|
-
type: PropType<
|
|
131
|
-
default:
|
|
54
|
+
type: PropType<BadgeTone>;
|
|
55
|
+
default: string;
|
|
132
56
|
};
|
|
133
57
|
size: {
|
|
134
|
-
type: PropType<
|
|
58
|
+
type: PropType<BadgeSize>;
|
|
135
59
|
default: string;
|
|
136
60
|
};
|
|
137
|
-
lg: {
|
|
138
|
-
type: BooleanConstructor;
|
|
139
|
-
default: boolean;
|
|
140
|
-
};
|
|
141
|
-
icon: {
|
|
142
|
-
type: PropType<IconName>;
|
|
143
|
-
default: undefined;
|
|
144
|
-
};
|
|
145
|
-
outline: {
|
|
146
|
-
type: BooleanConstructor;
|
|
147
|
-
default: boolean;
|
|
148
|
-
};
|
|
149
61
|
closable: {
|
|
150
62
|
type: BooleanConstructor;
|
|
151
63
|
default: boolean;
|
|
152
64
|
};
|
|
153
|
-
|
|
154
|
-
type: StringConstructor;
|
|
155
|
-
default: undefined;
|
|
156
|
-
};
|
|
157
|
-
selected: {
|
|
158
|
-
type: BooleanConstructor;
|
|
159
|
-
default: boolean;
|
|
160
|
-
};
|
|
161
|
-
disabled: {
|
|
162
|
-
type: BooleanConstructor;
|
|
163
|
-
default: boolean;
|
|
164
|
-
};
|
|
165
|
-
name: {
|
|
166
|
-
type: StringConstructor;
|
|
167
|
-
default: undefined;
|
|
168
|
-
};
|
|
169
|
-
value: {
|
|
170
|
-
type: PropType<string | number>;
|
|
171
|
-
default: undefined;
|
|
172
|
-
};
|
|
173
|
-
onClick: {
|
|
65
|
+
onClose: {
|
|
174
66
|
type: PropType<() => void>;
|
|
175
67
|
default: undefined;
|
|
176
68
|
};
|
|
177
|
-
|
|
178
|
-
type: PropType<(
|
|
179
|
-
default: undefined;
|
|
180
|
-
};
|
|
181
|
-
onClose: {
|
|
182
|
-
type: PropType<() => void>;
|
|
69
|
+
onAdd: {
|
|
70
|
+
type: PropType<(name: string) => void>;
|
|
183
71
|
default: undefined;
|
|
184
72
|
};
|
|
185
73
|
}>> & Readonly<{}>, {
|
|
186
|
-
|
|
187
|
-
size: ControlSize;
|
|
188
|
-
icon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "info-circle" | "check-circle" | "alert-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
189
|
-
disabled: boolean;
|
|
190
|
-
name: string;
|
|
191
|
-
value: string | number;
|
|
192
|
-
onChange: (selected: boolean) => void;
|
|
193
|
-
onClick: () => void;
|
|
74
|
+
size: BadgeSize;
|
|
194
75
|
onClose: () => void;
|
|
195
|
-
|
|
196
|
-
selected: boolean;
|
|
197
|
-
lg: boolean;
|
|
198
|
-
shape: "add" | "select" | "chip" | "regular" | "status" | undefined;
|
|
76
|
+
shape: TagShape;
|
|
199
77
|
closable: boolean;
|
|
200
|
-
|
|
78
|
+
onAdd: (name: string) => void;
|
|
79
|
+
tone: BadgeTone;
|
|
201
80
|
}, SlotsType<{
|
|
202
81
|
default?: () => VNodeChild;
|
|
203
82
|
}>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|