@xihan-ui/vue 2.0.0 → 2.1.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/CHANGELOG.md +258 -0
- package/dist/components/avatar-group/avatar-group.d.ts.map +1 -1
- package/dist/components/avatar-group/avatar-group.js +2 -1
- package/dist/components/avatar-group/avatar-group.js.map +1 -1
- package/dist/components/card/card.d.ts.map +1 -1
- package/dist/components/card/card.js +2 -1
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/cascader/cascader.d.ts +9 -1
- package/dist/components/cascader/cascader.d.ts.map +1 -1
- package/dist/components/cascader/cascader.js +19 -1
- package/dist/components/cascader/cascader.js.map +1 -1
- package/dist/components/combobox/combobox.d.ts +18 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/combobox.js +37 -4
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/command/command.d.ts +23 -2
- package/dist/components/command/command.d.ts.map +1 -1
- package/dist/components/command/command.js +46 -4
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/context-menu/context-menu.d.ts +14 -1
- package/dist/components/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/context-menu/context-menu.js +42 -12
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/input-group/input-group.d.ts.map +1 -1
- package/dist/components/input-group/input-group.js +2 -1
- package/dist/components/input-group/input-group.js.map +1 -1
- package/dist/components/json-viewer/json-viewer.js.map +1 -1
- package/dist/components/kbd/kbd.d.ts.map +1 -1
- package/dist/components/kbd/kbd.js +27 -10
- package/dist/components/kbd/kbd.js.map +1 -1
- package/dist/components/listbox/listbox.d.ts +18 -1
- package/dist/components/listbox/listbox.d.ts.map +1 -1
- package/dist/components/listbox/listbox.js +37 -4
- package/dist/components/listbox/listbox.js.map +1 -1
- package/dist/components/mention/mention.d.ts +17 -1
- package/dist/components/mention/mention.d.ts.map +1 -1
- package/dist/components/mention/mention.js +36 -4
- package/dist/components/mention/mention.js.map +1 -1
- package/dist/components/menu/menu.d.ts +14 -1
- package/dist/components/menu/menu.d.ts.map +1 -1
- package/dist/components/menu/menu.js +63 -8
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menubar/menubar.d.ts +14 -2
- package/dist/components/menubar/menubar.d.ts.map +1 -1
- package/dist/components/menubar/menubar.js +43 -11
- package/dist/components/menubar/menubar.js.map +1 -1
- package/dist/components/page-header/page-header.d.ts.map +1 -1
- package/dist/components/page-header/page-header.js +2 -1
- package/dist/components/page-header/page-header.js.map +1 -1
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/reasoning/reasoning.d.ts +1 -1
- package/dist/components/select/select.d.ts +18 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/select/select.js +37 -4
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/sortable/sortable.d.ts +1 -1
- package/dist/components/statistic/statistic.d.ts.map +1 -1
- package/dist/components/statistic/statistic.js +2 -1
- package/dist/components/statistic/statistic.js.map +1 -1
- package/dist/components/table/table.d.ts +2 -2
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/tag-group/tag-group.js +1 -1
- package/dist/components/tag-group/tag-group.js.map +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/timeline/timeline.js +2 -1
- package/dist/components/timeline/timeline.js.map +1 -1
- package/dist/components/timer/timer.d.ts +1 -1
- package/dist/components/tour/tour.d.ts +1 -1
- package/dist/components/transfer/transfer.d.ts +9 -1
- package/dist/components/transfer/transfer.d.ts.map +1 -1
- package/dist/components/transfer/transfer.js +19 -1
- package/dist/components/transfer/transfer.js.map +1 -1
- package/dist/components/tree/tree.d.ts +9 -7
- package/dist/components/tree/tree.d.ts.map +1 -1
- package/dist/components/tree/tree.js +17 -15
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.d.ts +9 -1
- package/dist/components/tree-select/tree-select.d.ts.map +1 -1
- package/dist/components/tree-select/tree-select.js +19 -1
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/typography/typography.d.ts.map +1 -1
- package/dist/components/typography/typography.js +2 -1
- package/dist/components/typography/typography.js.map +1 -1
- package/dist/index.d.ts +13 -13
- package/dist/index.js +13 -13
- package/dist/package.js +1 -1
- package/dist/runtime/use-machine.js +3 -2
- package/dist/runtime/use-machine.js.map +1 -1
- package/dist/runtime/use-scrollbars.js +3 -1
- package/dist/runtime/use-scrollbars.js.map +1 -1
- package/package.json +14 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,263 @@
|
|
|
1
1
|
# @xihan-ui/vue
|
|
2
2
|
|
|
3
|
+
## 2.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1ed8a8d: Listbox / Select / Combobox / Mention / Command 补上 `item-prefix` 与 `item-suffix` 两个部件和对应的逐条钩子。
|
|
8
|
+
|
|
9
|
+
这五家的行首那一格一直空着:它们的 `item-indicator` 是行尾的选中对号,不是前导图标槽(那是菜单族的用法)。所以想给选项配个国旗、给候选人配个头像、给命令配个图标,只能走整条替换的 `item` 插槽 / `renderItem`,代价是文字与副文本全要自己重搭。
|
|
10
|
+
|
|
11
|
+
```vue
|
|
12
|
+
<XhSelectRoot :collection="countries" label="国家">
|
|
13
|
+
<template #item-prefix="node"><CountryFlag :code="node.value" /></template>
|
|
14
|
+
</XhSelectRoot>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
<XhMentionRoot
|
|
19
|
+
collection={people}
|
|
20
|
+
renderItemPrefix={(node) => <XhAvatar name={node.label} size="sm" />}
|
|
21
|
+
/>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- **`item-prefix`** 落家族的 prefix 列(行首),带 `aria-hidden`:它是装饰,可及名由条目文字承担。
|
|
25
|
+
- **`item-suffix`** 落 suffix 列(行尾、选中对号之前),承载计数、徽标一类的任意节点,家族只管落位。
|
|
26
|
+
- 两个钩子都只接管自己那一格,文字、副文本与选中对号照旧由数据与家族负责;`item` / `renderItem` 语义不变。
|
|
27
|
+
|
|
28
|
+
Tree / TreeSelect / Transfer 不在其列:它们的行首那一格已经归勾选框与展开箭头,再放作者内容会跟结构件抢位。
|
|
29
|
+
|
|
30
|
+
- 6f5fd2f: 菜单族三家新增 `item-suffix` 部件与**按槽位的逐条钩子**:想给条目加个图标,不必再把整条重搭。
|
|
31
|
+
|
|
32
|
+
此前 `collection` 那条路只有一个整条替换的出口(Vue 的 `item` 插槽 / React 的 `renderItem`)。图标是可渲染内容、进不了 Headless,所以"给每条命令配个 SVG 图标"只能走那个出口——代价是文字、说明、快捷键全部得自己重新搭一遍,数据里写的 `description` / `shortcut` 一个都不生效。
|
|
33
|
+
|
|
34
|
+
现在首尾两格各有自己的钩子:
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<XhMenuRoot :collection="actions" trigger-as-child>
|
|
38
|
+
<template #trigger><XhButton variant="subtle">文件</XhButton></template>
|
|
39
|
+
<template #item-prefix="node"><XhIcon :icon="iconOf(node)" size="sm" /></template>
|
|
40
|
+
</XhMenuRoot>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
<XhMenuRoot
|
|
45
|
+
collection={actions}
|
|
46
|
+
renderItemPrefix={(node) => <XhIcon icon={iconOf(node)} size="sm" />}
|
|
47
|
+
/>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- **`item-prefix` / `renderItemPrefix`** 只接管行首那一格(与数据里的 `indicator` 同一个部件,插槽在场时以它为准),文字、说明、快捷键照旧由数据铺。
|
|
51
|
+
- **`item-suffix` / `renderItemSuffix`** 只接管行尾那一格,落新增的 `item-suffix` 部件:家族的 suffix 列排在快捷键之后、选中对号之前,跨两行居中。它承载的是任意节点(计数、徽标、次级图标),所以家族只管落位,不规定字号与颜色。
|
|
52
|
+
- **`item` / `renderItem` 语义不变**,仍是整条的接管口。
|
|
53
|
+
|
|
54
|
+
Web Components 由作者自写 Light DOM,不需要钩子,只多一个可用的 `data-xh-part="item-suffix"` 角色。
|
|
55
|
+
|
|
56
|
+
文档的"破坏性命令"示例改用 `item-prefix` 重写:现在是三行数据加一个插槽,此前要把整条结构抄一遍。
|
|
57
|
+
|
|
58
|
+
- 7adbd61: Command 补上快捷键提示,Tree / TreeSelect / Cascader / Transfer 补上行尾那一格——Collection Item 家族的六个槽至此每一格都有归属。
|
|
59
|
+
|
|
60
|
+
- **Command 的 `shortcut`**:命令面板本来就是快捷键的主场,`⌘K` 那一列此前没有承载它的部件。新增 `item-shortcut`,贴行尾、与说明同档同色、带 `aria-hidden`,不进检索串。
|
|
61
|
+
- **Tree / TreeSelect / Cascader / Transfer 的 `item-suffix`**:这四家的行首那一格归勾选框与展开箭头,行尾一直空着。现在留给作者放计数、徽标一类的任意节点,家族只管落位。
|
|
62
|
+
|
|
63
|
+
至此六个槽的归属:
|
|
64
|
+
|
|
65
|
+
| 槽 | 归属 |
|
|
66
|
+
| ------------- | ---------------------------------------------------------------------------------------------------- |
|
|
67
|
+
| `prefix` | 菜单族 = `item-indicator`(前导图标);候选列表 = `item-prefix`(作者内容);树族 = 勾选框与展开箭头 |
|
|
68
|
+
| `text` | `item-text`,取自 `label`,也是连打检索的取字来源 |
|
|
69
|
+
| `description` | `item-description`,第 2 行、muted 档,全部集合组件可用 |
|
|
70
|
+
| `shortcut` | `item-shortcut`,菜单族与 Command |
|
|
71
|
+
| `suffix` | `item-suffix`,作者内容,全部集合组件可用 |
|
|
72
|
+
| `indicator` | 选中对号,由库按 `aria-selected` 显隐 |
|
|
73
|
+
|
|
74
|
+
导航族(Anchor / Breadcrumb / NavigationMenu / Tabs / SideNav)不在其列:那里的条目表达位置而不是一条可配置的数据行。
|
|
75
|
+
|
|
76
|
+
- 7fea8a8: 另外九个集合组件补上 `item-description` 部件与节点上的 `description`:条目的第 2 行终于到处都能写了。
|
|
77
|
+
|
|
78
|
+
家族的网格里一直留着说明这一行(跨 text 槽的第 2 行、muted 档),但只有 ContextMenu 与 Menubar 拿得到它。一句话说不清的选项——订阅方案、权限档、机型——只能把解释挤进 `label`,或者放弃 `collection` 退回手写部件。
|
|
79
|
+
|
|
80
|
+
覆盖 Listbox / Select / Combobox / Mention / Command / Cascader / Tree / TreeSelect / Transfer:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
const plans = [
|
|
84
|
+
{
|
|
85
|
+
value: "team",
|
|
86
|
+
label: "团队版",
|
|
87
|
+
description: "最多 20 人,共享工作区与审计日志",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
value: "enterprise",
|
|
91
|
+
label: "企业版",
|
|
92
|
+
description: "单点登录、私有部署与专属支持",
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- 新部件 `item-description`(`getItemDescriptionProps` / `Xh*ItemDescription` / `data-xh-part="item-description"`)跨 text 槽落第 2 行,与快捷键同档同色,**不跟语气**。
|
|
98
|
+
- 代铺的树按数据铺:写了 `description` 的条目才多一个部件,没写的与此前完全一致。
|
|
99
|
+
- 不进检索串:连打检索与命令面板的过滤都只取 `item-text` 那一段。
|
|
100
|
+
|
|
101
|
+
SideNav 不在其列:它的入口在折叠成图标栏时只剩一格,第 2 行无处安放。
|
|
102
|
+
|
|
103
|
+
- 2bd127a: ContextMenu 与 Menubar 补上 `item-shortcut` 部件与节点上的 `shortcut`,菜单族三家至此口径一致。
|
|
104
|
+
|
|
105
|
+
三家的文档都写着"条目可组合图标、文字、说明和快捷键提示",但谁都没有承载快捷键的部件:示例只能在条目末尾塞一个没有槽位的裸 `<span aria-hidden>`,既不落家族的 shortcut 列,也拿不到那一列的字号与颜色。Menu 已在上一版补齐,这一版补另外两家。
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
const commands = [
|
|
109
|
+
{ value: "copy", label: "复制", description: "连同格式", shortcut: "⌘ C" },
|
|
110
|
+
];
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- 新部件 `item-shortcut`(`getItemShortcutProps` / `XhContextMenuItemShortcut` / `XhMenubarItemShortcut` / `data-xh-part="item-shortcut"`)落行尾、跨两行居中,与说明同档同色。
|
|
114
|
+
- 带 `aria-hidden`:可及名由条目文字承担;连打检索只取 `item-text`,这串按键记号不进检索串。
|
|
115
|
+
- Menubar 的 `shortcut` 与 `description` 一样**只在条目上读取**,顶层入口写了不生效。
|
|
116
|
+
|
|
117
|
+
示例 `context-menu/03-icon` 与 `menubar/03-icon` 一并改正:图标进 `item-indicator`(此前是裸 `<svg>`,不落 prefix 列),快捷键进 `item-shortcut`。
|
|
118
|
+
|
|
119
|
+
- 8eeb26b: Menu 新增 `item-shortcut` 部件,`MenuNode` 补上 `indicator` / `description` / `shortcut`——菜单的条目契约至此与 ContextMenu 完全对齐。
|
|
120
|
+
|
|
121
|
+
文档从一开始就写着"条目可组合图标、文字、说明和快捷键提示",但 Menu 既没有说明与快捷键的字段,也没有承载快捷键的部件:示例只能在条目末尾塞一个没有槽位的裸 `<span aria-hidden>`,既不落家族的 shortcut 列,也拿不到那一列的字号与颜色。
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
const actions = [
|
|
125
|
+
{
|
|
126
|
+
value: "duplicate",
|
|
127
|
+
label: "创建副本",
|
|
128
|
+
description: "保留当前版本,另存一份",
|
|
129
|
+
shortcut: "⌘ D",
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
value: "archive",
|
|
133
|
+
label: "归档",
|
|
134
|
+
description: "移出列表,随时可以恢复",
|
|
135
|
+
shortcut: "⌘ ⇧ A",
|
|
136
|
+
separatorBefore: true,
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- **新部件 `item-shortcut`**(`getItemShortcutProps` / `XhMenuItemShortcut` / `data-xh-part="item-shortcut"`)落家族的 shortcut 列:行尾、跨两行居中、排在 `suffix` 之前,与说明同档同色。
|
|
142
|
+
- **纯装饰**:带 `aria-hidden`,可及名由条目文字承担;连打检索只取 `item-text`,这串按键记号不进检索串。
|
|
143
|
+
- **只为真正注册了的组合写提示**,写一个不存在的比不写更糟。
|
|
144
|
+
|
|
145
|
+
有一处 DOM 形状变化:代铺的条目此前把 `label` 作为裸文本放进 `item`,现在放进 `item-text` 部件(与 ContextMenu、Menubar 一致)。这修正了两件事——家族的 text 槽此前选不中它,连打检索也会把说明与快捷键的文字一并算进去。手写部件那条路本来就该自己放 `XhMenuItemText`,不受影响。
|
|
146
|
+
|
|
147
|
+
`item` 插槽(React `renderItem`)的语义不变:它是**整条**的接管口,写了它就由作者全权负责条目内容,代铺的标记位、说明与快捷键都不再出现。这一点与 ContextMenu / Menubar 的同名插槽不同——那两家填的是文字槽。
|
|
148
|
+
|
|
149
|
+
- 43b3f69: `MenuNode` 新增 `group` 与 `groupLabel`,`collection` 那条路终于真的铺得出分组。
|
|
150
|
+
|
|
151
|
+
此前文档写着"`collection` 可直接生成条目、分组、标记位和分隔线",`MenuNode` 却没有这两个字段,代铺的树也只认条目与分隔线。示例 `demos/menu/03-group` 照文档传了 `group` / `groupLabel`,浏览器里实测产出 0 个 `group`、0 个 `group-label` —— 一个不工作的示例照着一句不成立的文档写了出来。ContextMenu 与 Menubar 一直是对的,只有 Menu 漏了。
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
const actions = [
|
|
155
|
+
{ value: "compact", label: "紧凑", group: "density", groupLabel: "行高" },
|
|
156
|
+
{ value: "comfortable", label: "宽松", group: "density" },
|
|
157
|
+
{
|
|
158
|
+
value: "sidebar",
|
|
159
|
+
label: "侧栏",
|
|
160
|
+
group: "panels",
|
|
161
|
+
groupLabel: "面板",
|
|
162
|
+
separatorBefore: true,
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
规则与 ContextMenu 逐条对齐:
|
|
168
|
+
|
|
169
|
+
- **相邻同值收进同一个 `group`**,不相邻的同值各成一段(与数据顺序一致,不重排)。
|
|
170
|
+
- **标题取本组首个写了 `groupLabel` 的那条**,本组无人提供时不铺 `group-label`;`group` 靠 `aria-labelledby` 认领它。
|
|
171
|
+
- **领头一个分组的条目,它的 `separatorBefore` 画在 `group` 外面**;组内条目的分隔线留在组里。首条上的标记仍然不产出分隔线。
|
|
172
|
+
- 没写 `group` 的条目直接落在 `content` 上,与分组段互不影响。
|
|
173
|
+
|
|
174
|
+
手写部件那条路本来就支持分组,产出的 DOM 与代铺的一致,这次没有变化;Web Components 由作者自写 Light DOM,同样不受影响。
|
|
175
|
+
|
|
176
|
+
- 6c9ff6b: Tree 的展开与选中分开:`expandOnClick` 缺省由 `true` 改为 `false`,与 TreeSelect 一致。
|
|
177
|
+
|
|
178
|
+
此前点分支行(或在分支上按确认键)会同时选中并切换展开态,想勾一枝却把它收了起来。现在点行与确认键只选中,展开归展开箭头(`branch-trigger`)与左右方向键;需要文件管理器那种「点目录即展开」的,显式打开 `expandOnClick`(Web Components 写 `expand-on-click`)。
|
|
179
|
+
|
|
180
|
+
**破坏性变更**:依赖点行展开的树需要补上 `expandOnClick`,或在分支行里摆一枚 `branch-trigger`——只摆了不可点的 `branch-indicator` 的树,缺省下只能靠方向键展开。
|
|
181
|
+
|
|
182
|
+
- 9fd2157: Tree 的选中改成与 TreeSelect 同一种读法:行不换面,单选、多选与级联都只在行尾画对号,勾选框部件删除。
|
|
183
|
+
|
|
184
|
+
此前页内树有两套标记:单选铺品牌淡底 + 行首对号,勾选档再摆一枚行首方框——方框已经表明了勾选态,淡底又把同一件事说了一遍;而下拉里的树(TreeSelect)一直是透明底 + 行尾对号。现在两者统一:
|
|
185
|
+
|
|
186
|
+
- 行投影 Collection Item 的 `overlay` 语境:选中不换面、不换字色,悬停 / 高亮 / 按下沿用未选行的 100 → 200 阶梯。
|
|
187
|
+
- 对号(`item-indicator`)一律排到行尾,作者写在行首也会被排到最后;行尾那一格(`item-suffix`)在它之前。
|
|
188
|
+
- 分支行也放 `item-indicator`:勾选态与级联半选态落在标记自身的 `data-selected` / `data-indeterminate` 上,半选画横杠。
|
|
189
|
+
- forced-colors 下选中行保持 Canvas,只由对号表达;打印时对号按原样印出。
|
|
190
|
+
|
|
191
|
+
**破坏性变更**
|
|
192
|
+
|
|
193
|
+
- 删除部件 `item-checkbox` / `branch-checkbox`,以及三端对应的 `XhTreeItemCheckbox` / `XhTreeBranchCheckbox`(React 另有 `XhTreeItemCheckboxProps` / `XhTreeBranchCheckboxProps`)和 connect 上的 `getItemCheckboxProps` / `getBranchCheckboxProps`。
|
|
194
|
+
- 删除组件槽 `--xh-tree-checkbox-*`(8 个)与 `--xh-tree-row-bg-selected`。
|
|
195
|
+
- 行的 `data-xh-collection-context` 由 `page` 改为 `overlay`。
|
|
196
|
+
|
|
197
|
+
迁移:把勾选框换成对号,分支行同样摆一枚。
|
|
198
|
+
|
|
199
|
+
```vue
|
|
200
|
+
<XhTreeBranchControl>
|
|
201
|
+
<XhTreeBranchTrigger />
|
|
202
|
+
<XhTreeBranchText>华东</XhTreeBranchText>
|
|
203
|
+
<XhTreeItemIndicator />
|
|
204
|
+
</XhTreeBranchControl>
|
|
205
|
+
<XhTreeItem value="sh">
|
|
206
|
+
<XhTreeItemText>上海</XhTreeItemText>
|
|
207
|
+
<XhTreeItemIndicator />
|
|
208
|
+
</XhTreeItem>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Web Components 把 `data-xh-part="item-checkbox"` / `"branch-checkbox"` 换成 `data-xh-part="item-indicator"`。
|
|
212
|
+
|
|
213
|
+
- 6bad64f: Vue 侧状态机的 props 取值器不再按 prop 个数重复展开。连接层每读一个 prop 都会调一次 `service` 的 `props()`,而那一处每次都把组件 props 整个展开成新对象再并全局配置——一个按钮渲染一遍要走十几趟,每趟都是十来次响应式代理取值。现在取值器的求值放进一个 `computed`:响应式依赖没动时复用同一份展开结果,状态机的身份缓存跟着命中(带 props 归一化的组件连归一化也一并省掉);依赖一动就产出新对象,身份缓存照旧失效。
|
|
214
|
+
|
|
215
|
+
实测 Chromium:挂载 200 个 `XhButton` 从 29.5ms 降到 16.0ms,200 个按钮加 100 个文本字段从 63ms 降到 16.4ms,打开 200 项 Select 的同步开销从 12.2ms 降到 8.1ms。
|
|
216
|
+
|
|
217
|
+
因此 `useMachine` 的 props 取值器必须只读响应式来源(组件 props、`attrs`、ref、注入的上下文、全局配置)。读普通变量或普通数组的长度不再会让它重算——那类来源本来也驱动不了 `computed(() => connectX(...))` 的重算,只是以前靠每次重新展开碰巧读到过新值。仓库内唯一一处这样的读取(自绘滚动条按「两条轴都建好了没有」决定让不让交叉口那一格)已改为响应式。
|
|
218
|
+
|
|
219
|
+
### Patch Changes
|
|
220
|
+
|
|
221
|
+
- 03585eb: Vue 的三个条目插槽补上 JSDoc:文档「插槽」表的说明列此前是空的,看得到名字与载荷类型,看不出 `item` / `item-prefix` / `item-suffix` 三者分工。
|
|
222
|
+
|
|
223
|
+
`item` 在菜单里是整条的接管口,在 ContextMenu / Menubar / 候选列表里填的是文字槽——这条差别现在写在各自的声明上,一并进文档。
|
|
224
|
+
|
|
225
|
+
- 4f9ca55: `withXhConfig` 不再写在 computed 里,`XhKbd` 在平台探测之后不会再丢掉全局配置。
|
|
226
|
+
|
|
227
|
+
`withXhConfig` 要调 `inject`,只能在 setup 期跑。`XhKbd` 把它写在了 `api` 这个 computed 的取值函数里:首次求值确实发生在 setup 期,但 `useKbdPlatform` 会在 `onMounted` 把探测到的平台写回 `detected`,`api` 随之失效,而下一次求值发生在同组件那个 `watchEffect` 的作业里——那时既没有 `currentInstance` 也没有 `currentRenderingInstance`。
|
|
228
|
+
|
|
229
|
+
于是每个 `XhKbd` 挂载后都会在开发期打一条 `[Vue warn] inject() can only be used inside setup() or functional components`,并且 `inject` 返回 `undefined` 时 `withXhConfig` 原样返回 props,`provideXhConfig` 注入的 `translations` 与 `locale` 被静默丢弃:键帽的读屏文案从作者提供的那份回落到内建英文,配置在别处生效、在它这里没反应,谁也不会报错。
|
|
230
|
+
|
|
231
|
+
`kbd` 这一侧改成在 setup 期包一次代理,源对象写成一组取值函数,`props` 与 `detected` 仍在求值期被追踪,响应性不变。
|
|
232
|
+
|
|
233
|
+
另外七个把 `withXhConfig` 写进 computed 的组件(`avatar-group`、`card`、`input-group`、`page-header`、`statistic`、`timeline`、`typography`)一并按 `badge` 的既有写法提到 setup 期。它们目前不报警——那几个 computed 只在渲染期被读,`currentRenderingInstance` 还在——但同一处接线只要哪天被渲染之外的读者碰到,就会重演 `kbd` 这一幕。
|
|
234
|
+
|
|
235
|
+
- c456e52: TagGroup 选中标签的对号从文字前移到文字后,与集合行「对号一律在行尾」统一。
|
|
236
|
+
|
|
237
|
+
- 皮肤按顺序排:对号排在文字与作者内容之后、摘除钮之前,作者在格里把 `item-indicator` 写在哪儿都一样。
|
|
238
|
+
- Vue / React 不传结构时的默认渲染同步改成「文字 → 对号 → 摘除钮」。
|
|
239
|
+
- 选中的淡底、配对前景与按压反馈不变。
|
|
240
|
+
|
|
241
|
+
- Updated dependencies [1ed8a8d]
|
|
242
|
+
- Updated dependencies [6f5fd2f]
|
|
243
|
+
- Updated dependencies [7adbd61]
|
|
244
|
+
- Updated dependencies [7fea8a8]
|
|
245
|
+
- Updated dependencies [4a82bc7]
|
|
246
|
+
- Updated dependencies [e00c965]
|
|
247
|
+
- Updated dependencies [2bd127a]
|
|
248
|
+
- Updated dependencies [8eeb26b]
|
|
249
|
+
- Updated dependencies [43b3f69]
|
|
250
|
+
- Updated dependencies [cd2be1f]
|
|
251
|
+
- Updated dependencies [1e7bc1d]
|
|
252
|
+
- Updated dependencies [abd9e8c]
|
|
253
|
+
- Updated dependencies [6c9ff6b]
|
|
254
|
+
- Updated dependencies [9fd2157]
|
|
255
|
+
- @xihan-ui/headless@2.1.0
|
|
256
|
+
- @xihan-ui/core@2.1.0
|
|
257
|
+
- @xihan-ui/motion@2.1.0
|
|
258
|
+
- @xihan-ui/position@2.1.0
|
|
259
|
+
- @xihan-ui/pointer@2.1.0
|
|
260
|
+
|
|
3
261
|
## 2.0.0
|
|
4
262
|
|
|
5
263
|
### Major Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar-group.d.ts","names":[],"sources":["../../../src/components/avatar-group/avatar-group.ts"],"mappings":";;;cAgBa,iCAAiB,8BAAA;;;;;IAKF,MAAA,SAAS;;;;;;;;;IAAT,MAAA,SAAS;;
|
|
1
|
+
{"version":3,"file":"avatar-group.d.ts","names":[],"sources":["../../../src/components/avatar-group/avatar-group.ts"],"mappings":";;;cAgBa,iCAAiB,8BAAA;;;;;IAKF,MAAA,SAAS;;;;;;;;;IAAT,MAAA,SAAS;;MASnC,oDAAA;cAEW,yCAAyB,wCAAA,oBAAA,4BAAA;;8BAOpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -11,7 +11,8 @@ const XhAvatarGroupRoot = defineComponent({
|
|
|
11
11
|
size: { type: String }
|
|
12
12
|
},
|
|
13
13
|
setup(props, { slots }) {
|
|
14
|
-
const
|
|
14
|
+
const configured = withXhConfig("avatar-group", props);
|
|
15
|
+
const api = computed(() => connectAvatarGroup(configured, vueNormalize));
|
|
15
16
|
provideAvatarGroup({ api });
|
|
16
17
|
return () => h("div", api.value.getRootProps(), slots.default?.());
|
|
17
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar-group.js","names":[],"sources":["../../../src/components/avatar-group/avatar-group.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 avatar group 相关实现。\n\nimport type { Size } from '@xihan-ui/core'\nimport type { AvatarGroupProps } from '@xihan-ui/headless'\nimport type { PropType } from 'vue'\nimport { connectAvatarGroup } from '@xihan-ui/headless'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { provideAvatarGroup, useAvatarGroupContext } from './context'\n\nexport const XhAvatarGroupRoot = defineComponent({\n name: 'XhAvatarGroupRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n max: { type: Number },\n size: { type: String as PropType<Size> },\n },\n setup(props, { slots }) {\n const
|
|
1
|
+
{"version":3,"file":"avatar-group.js","names":[],"sources":["../../../src/components/avatar-group/avatar-group.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 avatar group 相关实现。\n\nimport type { Size } from '@xihan-ui/core'\nimport type { AvatarGroupProps } from '@xihan-ui/headless'\nimport type { PropType } from 'vue'\nimport { connectAvatarGroup } from '@xihan-ui/headless'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { provideAvatarGroup, useAvatarGroupContext } from './context'\n\nexport const XhAvatarGroupRoot = defineComponent({\n name: 'XhAvatarGroupRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n max: { type: Number },\n size: { type: String as PropType<Size> },\n },\n setup(props, { slots }) {\n // withXhConfig 只能在 setup 期调,连接层在渲染期读这份代理\n const configured = withXhConfig('avatar-group', props)\n const api = computed(() => connectAvatarGroup(configured as AvatarGroupProps, vueNormalize))\n provideAvatarGroup({ api })\n return () => h('div', api.value.getRootProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhAvatarGroupOverflowItem = defineComponent({\n name: 'XhAvatarGroupOverflowItem',\n setup(_, { slots }) {\n const ctx = useAvatarGroupContext()\n // 「+N」的文本由作者写进插槽\n return () => h('span', ctx.api.value.getOverflowItemProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":";;;;;;AAgBA,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CAEN,OAAO;EACL,KAAK,EAAE,MAAM,OAAO;EACpB,MAAM,EAAE,MAAM,OAAyB;CACzC;CACA,MAAM,OAAO,EAAE,SAAS;EAEtB,MAAM,aAAa,aAAa,gBAAgB,KAAK;EACrD,MAAM,MAAM,eAAe,mBAAmB,YAAgC,YAAY,CAAC;EAC3F,mBAAmB,EAAE,IAAI,CAAC;EAC1B,aAAa,EAAE,OAAO,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU,CAAC;CAC9F;AACF,CAAC;AAED,MAAa,4BAA4B,gBAAgB;CACvD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,sBAAsB;EAElC,aAAa,EAAE,QAAQ,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC3G;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.d.ts","names":[],"sources":["../../../src/components/card/card.ts"],"mappings":";;;cAgBa,0BAAU,8BAAA;;IAIQ,MAAA,SAAS;;;;;;IAAT,MAAA,SAAS;;
|
|
1
|
+
{"version":3,"file":"card.d.ts","names":[],"sources":["../../../src/components/card/card.ts"],"mappings":";;;cAgBa,0BAAU,8BAAA;;IAIQ,MAAA,SAAS;;;;;;IAAT,MAAA,SAAS;;MAStC,oDAAA;cAEW,4BAAY,wCAAA,oBAAA,4BAAA;;8BAMvB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,2BAAW,wCAAA,oBAAA,4BAAA;;8BAMtB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,wCAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,6BAAa,wCAAA,oBAAA,4BAAA;;8BAMxB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,4BAAY,wCAAA,oBAAA,4BAAA;;8BAMvB,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -8,7 +8,8 @@ const XhCardRoot = defineComponent({
|
|
|
8
8
|
name: "XhCardRoot",
|
|
9
9
|
props: { variant: { type: String } },
|
|
10
10
|
setup(props, { slots }) {
|
|
11
|
-
const
|
|
11
|
+
const configured = withXhConfig("card", props);
|
|
12
|
+
const api = computed(() => connectCard(configured, vueNormalize));
|
|
12
13
|
provideCard({ api });
|
|
13
14
|
return () => h("div", api.value.getRootProps(), slots.default?.());
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","names":[],"sources":["../../../src/components/card/card.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 card 相关实现。\n\nimport type { ControlVariant } from '@xihan-ui/core'\nimport type { CardProps } from '@xihan-ui/headless'\nimport type { PropType } from 'vue'\nimport { connectCard } from '@xihan-ui/headless'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { provideCard, useCardContext } from './context'\n\nexport const XhCardRoot = defineComponent({\n name: 'XhCardRoot',\n // 缺省值由 connect 给出。\n props: {\n variant: { type: String as PropType<ControlVariant> },\n },\n setup(props, { slots }) {\n const api = computed(() => connectCard(
|
|
1
|
+
{"version":3,"file":"card.js","names":[],"sources":["../../../src/components/card/card.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 card 相关实现。\n\nimport type { ControlVariant } from '@xihan-ui/core'\nimport type { CardProps } from '@xihan-ui/headless'\nimport type { PropType } from 'vue'\nimport { connectCard } from '@xihan-ui/headless'\nimport { computed, defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { vueNormalize } from '../../runtime/normalize-props'\nimport { provideCard, useCardContext } from './context'\n\nexport const XhCardRoot = defineComponent({\n name: 'XhCardRoot',\n // 缺省值由 connect 给出。\n props: {\n variant: { type: String as PropType<ControlVariant> },\n },\n setup(props, { slots }) {\n // withXhConfig 只能在 setup 期调,连接层在渲染期读这份代理\n const configured = withXhConfig('card', props)\n const api = computed(() => connectCard(configured as CardProps, vueNormalize))\n provideCard({ api })\n return () => h('div', api.value.getRootProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCardHeader = defineComponent({\n name: 'XhCardHeader',\n setup(_, { slots }) {\n const ctx = useCardContext()\n return () => h('div', ctx.api.value.getHeaderProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCardTitle = defineComponent({\n name: 'XhCardTitle',\n setup(_, { slots }) {\n const ctx = useCardContext()\n return () => h('h3', ctx.api.value.getTitleProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCardDescription = defineComponent({\n name: 'XhCardDescription',\n setup(_, { slots }) {\n const ctx = useCardContext()\n return () => h('p', ctx.api.value.getDescriptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCardContent = defineComponent({\n name: 'XhCardContent',\n setup(_, { slots }) {\n const ctx = useCardContext()\n return () => h('div', ctx.api.value.getContentProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCardFooter = defineComponent({\n name: 'XhCardFooter',\n setup(_, { slots }) {\n const ctx = useCardContext()\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":";;;;;;AAgBA,MAAa,aAAa,gBAAgB;CACxC,MAAM;CAEN,OAAO,EACL,SAAS,EAAE,MAAM,OAAmC,EACtD;CACA,MAAM,OAAO,EAAE,SAAS;EAEtB,MAAM,aAAa,aAAa,QAAQ,KAAK;EAC7C,MAAM,MAAM,eAAe,YAAY,YAAyB,YAAY,CAAC;EAC7E,YAAY,EAAE,IAAI,CAAC;EACnB,aAAa,EAAE,OAAO,IAAI,MAAM,aAAa,GAA8B,MAAM,UAAU,CAAC;CAC9F;AACF,CAAC;AAED,MAAa,eAAe,gBAAgB;CAC1C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,eAAe,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC;AAED,MAAa,cAAc,gBAAgB;CACzC,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,MAAM,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CAClG;AACF,CAAC;AAED,MAAa,oBAAoB,gBAAgB;CAC/C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,KAAK,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CACvG;AACF,CAAC;AAED,MAAa,gBAAgB,gBAAgB;CAC3C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,gBAAgB,GAA8B,MAAM,UAAU,CAAC;CACrG;AACF,CAAC;AAED,MAAa,eAAe,gBAAgB;CAC1C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,eAAe;EAC3B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,eAAe,GAA8B,MAAM,UAAU,CAAC;CACpG;AACF,CAAC"}
|
|
@@ -283,6 +283,14 @@ declare const XhCascaderItem: import("vue").DefineComponent<import("vue").Extrac
|
|
|
283
283
|
declare const XhCascaderItemText: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
284
284
|
[key: string]: any;
|
|
285
285
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
286
|
+
/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */
|
|
287
|
+
declare const XhCascaderItemDescription: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
288
|
+
[key: string]: any;
|
|
289
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
290
|
+
/** 条目行尾的作者内容(计数、徽标) */
|
|
291
|
+
declare const XhCascaderItemSuffix: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
292
|
+
[key: string]: any;
|
|
293
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
286
294
|
declare const XhCascaderItemIndicator: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
287
295
|
[key: string]: any;
|
|
288
296
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -290,5 +298,5 @@ declare const XhCascaderFooter: import("vue").DefineComponent<{}, () => VNode<im
|
|
|
290
298
|
[key: string]: any;
|
|
291
299
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
292
300
|
//#endregion
|
|
293
|
-
export { CascaderRootSlotProps, CascaderSearchListItemSlotProps, XhCascaderClearTrigger, XhCascaderColumn, XhCascaderContent, XhCascaderControl, XhCascaderFooter, XhCascaderGroup, XhCascaderGroupLabel, XhCascaderIndicator, XhCascaderInput, XhCascaderItem, XhCascaderItemIndicator, XhCascaderItemText, XhCascaderLabel, XhCascaderLoading, XhCascaderPositioner, XhCascaderRoot, XhCascaderSearchList, XhCascaderTrigger, XhCascaderValueText };
|
|
301
|
+
export { CascaderRootSlotProps, CascaderSearchListItemSlotProps, XhCascaderClearTrigger, XhCascaderColumn, XhCascaderContent, XhCascaderControl, XhCascaderFooter, XhCascaderGroup, XhCascaderGroupLabel, XhCascaderIndicator, XhCascaderInput, XhCascaderItem, XhCascaderItemDescription, XhCascaderItemIndicator, XhCascaderItemSuffix, XhCascaderItemText, XhCascaderLabel, XhCascaderLoading, XhCascaderPositioner, XhCascaderRoot, XhCascaderSearchList, XhCascaderTrigger, XhCascaderValueText };
|
|
294
302
|
//# sourceMappingURL=cascader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascader.d.ts","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"mappings":";;;;;KA+BK,gBAAgB;;KAiCT,wBAAwB,KAClC;cAqBW,8BAAc,8BAAA;;IAIM,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;;;;;;;IAKZ,MAAA,SAAS,QAAQ;;;IACtB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;IAGJ,MAAA,SAAS;;;;;;;;;;IAGf,MAAA,SAAS;;;;;EAIL,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACZ,gBAAA,OAAA,UAAU;;;IAjCJ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;;;;;;;IAKZ,MAAA,SAAS,QAAQ;;;IACtB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;IAGJ,MAAA,SAAS;;;;;;;;;;IAGf,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;EAUtB,WAAC,OAAO,0BAA0B;kCA0C9C;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAc5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAW9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAuBxC,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAc5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAiBW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAsC5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;UAGe;EACf,QAAQ;;cAGG,oCAAoB,0BAAA,oBAAA,4BAAA;;;EAGtB,QAAC,OAAO,oCAAoC;kCA8BrD;cAEW,gCAAgB,8BAAA;;IAIU,MAAA;;;;;;;IAAA,MAAA;;;MA4BrC,oDAAA;cAEW,+BAAe,8BAAA;;;;;;;;;;;;MAY1B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;;;;;;;;;;;MAiBzB,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAQ3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
1
|
+
{"version":3,"file":"cascader.d.ts","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"mappings":";;;;;KA+BK,gBAAgB;;KAiCT,wBAAwB,KAClC;cAqBW,8BAAc,8BAAA;;IAIM,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;;;;;;;IAKZ,MAAA,SAAS,QAAQ;;;IACtB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;IAGJ,MAAA,SAAS;;;;;;;;;;IAGf,MAAA,SAAS;;;;;EAIL,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACZ,gBAAA,OAAA,UAAU;;;IAjCJ,MAAA,SAAS;;;IACd,MAAA,SAAS;;;IACF,MAAA,SAAS;;;;;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;IAKP,MAAA,SAAS;;;;;;;;;;;;;;;;IAKZ,MAAA,SAAS,QAAQ;;;IACtB,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;IAGJ,MAAA,SAAS;;;;;;;;;;IAGf,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;EAUtB,WAAC,OAAO,0BAA0B;kCA0C9C;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAc5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAW9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAuBxC,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAc5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAiBW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAsC5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;UAGe;EACf,QAAQ;;cAGG,oCAAoB,0BAAA,oBAAA,4BAAA;;;EAGtB,QAAC,OAAO,oCAAoC;kCA8BrD;cAEW,gCAAgB,8BAAA;;IAIU,MAAA;;;;;;;IAAA,MAAA;;;MA4BrC,oDAAA;cAEW,+BAAe,8BAAA;;;;;;;;;;;;MAY1B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;;;;;;;;;;;MAiBzB,oDAAA;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAOpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAQ3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|
|
@@ -362,6 +362,24 @@ const XhCascaderItemText = defineComponent({
|
|
|
362
362
|
return () => h("span", ctx.api.value.getItemTextProps(item.value), slots.default?.());
|
|
363
363
|
}
|
|
364
364
|
});
|
|
365
|
+
/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */
|
|
366
|
+
const XhCascaderItemDescription = defineComponent({
|
|
367
|
+
name: "XhCascaderItemDescription",
|
|
368
|
+
setup(_, { slots }) {
|
|
369
|
+
const ctx = useCascaderContext();
|
|
370
|
+
const { item } = useCascaderItemContext();
|
|
371
|
+
return () => h("span", ctx.api.value.getItemDescriptionProps(item.value), slots.default?.());
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
/** 条目行尾的作者内容(计数、徽标) */
|
|
375
|
+
const XhCascaderItemSuffix = defineComponent({
|
|
376
|
+
name: "XhCascaderItemSuffix",
|
|
377
|
+
setup(_, { slots }) {
|
|
378
|
+
const ctx = useCascaderContext();
|
|
379
|
+
const { item } = useCascaderItemContext();
|
|
380
|
+
return () => h("span", ctx.api.value.getItemSuffixProps(item.value), slots.default?.());
|
|
381
|
+
}
|
|
382
|
+
});
|
|
365
383
|
const XhCascaderItemIndicator = defineComponent({
|
|
366
384
|
name: "XhCascaderItemIndicator",
|
|
367
385
|
setup(_, { slots }) {
|
|
@@ -378,6 +396,6 @@ const XhCascaderFooter = defineComponent({
|
|
|
378
396
|
}
|
|
379
397
|
});
|
|
380
398
|
//#endregion
|
|
381
|
-
export { XhCascaderClearTrigger, XhCascaderColumn, XhCascaderContent, XhCascaderControl, XhCascaderFooter, XhCascaderGroup, XhCascaderGroupLabel, XhCascaderIndicator, XhCascaderInput, XhCascaderItem, XhCascaderItemIndicator, XhCascaderItemText, XhCascaderLabel, XhCascaderLoading, XhCascaderPositioner, XhCascaderRoot, XhCascaderSearchList, XhCascaderTrigger, XhCascaderValueText };
|
|
399
|
+
export { XhCascaderClearTrigger, XhCascaderColumn, XhCascaderContent, XhCascaderControl, XhCascaderFooter, XhCascaderGroup, XhCascaderGroupLabel, XhCascaderIndicator, XhCascaderInput, XhCascaderItem, XhCascaderItemDescription, XhCascaderItemIndicator, XhCascaderItemSuffix, XhCascaderItemText, XhCascaderLabel, XhCascaderLoading, XhCascaderPositioner, XhCascaderRoot, XhCascaderSearchList, XhCascaderTrigger, XhCascaderValueText };
|
|
382
400
|
|
|
383
401
|
//# sourceMappingURL=cascader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascader.js","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 cascader 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n CascaderApi,\n CascaderExpandTrigger,\n CascaderGroupProps,\n CascaderItemProps,\n CascaderNode,\n CascaderSchema,\n CascaderSearchResult,\n CascaderTranslations,\n CascaderValue,\n} from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { CascaderContext } from './use-cascader'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, onUpdated, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext } from './context'\nimport { useCascader } from './use-cascader'\n\ntype CascaderProps = CascaderSchema['props']\n\n/** 本条目持有焦点时,value 变更重新报告焦点条目,卸载时上报焦点丢失 */\nfunction reportItemFocus(\n ctx: CascaderContext,\n el: Ref<HTMLElement | null>,\n value: () => string,\n): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service, api } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (!el.value || service.scope.getActiveElement() !== el.value)\n return\n // 层号回 collection 里查,条目只自报值\n const meta = api.value.levels.flatMap(level => level.items).find(item => item.value === next)\n if (meta)\n service.send({ type: 'ITEM.FOCUS', level: meta.level, value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条目当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.LOST' })\n })\n}\n\n/** 默认插槽的载荷:级联的展开态、选中态与列数据,以及修改它们的方法。 */\nexport type CascaderRootSlotProps = Pick<\n CascaderApi,\n | 'open'\n | 'levels'\n | 'columns'\n | 'value'\n | 'valuePath'\n | 'activePath'\n | 'focusedPath'\n | 'displayText'\n | 'canClear'\n | 'isSelected'\n | 'isIndeterminate'\n | 'isActive'\n | 'isVisible'\n | 'setOpen'\n | 'setValue'\n | 'setActivePath'\n | 'select'\n | 'clear'\n>\n\nexport const XhCascaderRoot = defineComponent({\n name: 'XhCascaderRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<CascaderNode[]> },\n value: { type: Array as PropType<CascaderValue> },\n defaultValue: { type: Array as PropType<CascaderValue> },\n name: { type: String },\n form: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n expandTrigger: { type: String as PropType<CascaderExpandTrigger> },\n changeOnSelect: Boolean,\n multiple: Boolean,\n searchable: { type: Boolean, default: undefined },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<CascaderProps['checkedStrategy']> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n loading: Boolean,\n translations: { type: Object as PropType<Partial<CascaderTranslations>> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placeholder: { type: String },\n separator: { type: String },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;选中值恒为路径数组,单选时长度 ≤ 1\n emits: {\n 'value-change': (_details: PayloadOf<CascaderProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<CascaderProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<CascaderProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<CascaderProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CascaderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: CascaderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: CascaderProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCascader(withXhConfig('cascader', useFormControlProps(props)) as CascaderProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideCascader(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [slots.default?.({\n open: ctx.api.value.open,\n // levels 每层一列、层内节点各一条目,供作者渲染;columns 只读当前展开的列\n levels: ctx.api.value.levels,\n columns: ctx.api.value.columns,\n value: ctx.api.value.value,\n valuePath: ctx.api.value.valuePath,\n activePath: ctx.api.value.activePath,\n focusedPath: ctx.api.value.focusedPath,\n displayText: ctx.api.value.displayText,\n canClear: ctx.api.value.canClear,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n isActive: ctx.api.value.isActive,\n isVisible: ctx.api.value.isVisible,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setActivePath: ctx.api.value.setActivePath,\n select: ctx.api.value.select,\n clear: ctx.api.value.clear,\n }), ...ctx.api.value.value.map(path => h('input', {\n ...ctx.api.value.getHiddenInputProps({ path }) as Record<string, unknown>,\n key: JSON.stringify(path),\n }))])\n },\n})\n\nexport const XhCascaderLabel = defineComponent({\n name: 'XhCascaderLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderControl = defineComponent({\n name: 'XhCascaderControl',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderTrigger = defineComponent({\n name: 'XhCascaderTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useCascaderContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhCascaderValueText = defineComponent({\n name: 'XhCascaderValueText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 有插槽用插槽,否则显示整条路径或 placeholder\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.displayText,\n )\n },\n})\n\nexport const XhCascaderIndicator = defineComponent({\n name: 'XhCascaderIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderClearTrigger = defineComponent({\n name: 'XhCascaderClearTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderPositioner = defineComponent({\n name: 'XhCascaderPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n // 列区的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner。\n // 只摆横的:列多到放不下时整体横向滚动,纵向溢出归每一列自己。\n // 横条的正负按排版方向算,而组件不读计算样式,把 positioner 上那份显式交过去\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\n // 条子走浮层 4px 档\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhCascaderLoading = defineComponent({\n name: 'XhCascaderLoading',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n const unregister = content.registerLoading()\n onBeforeUnmount(unregister)\n // 在途占位:作者没写内容时使用 Cascader 自己的翻译合同。\n return () => h(\n 'div',\n ctx.api.value.getLoadingProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.translations.loading,\n )\n },\n})\n\n/** 放在作者插槽之后挂载;隔着普通元素或业务组件的 Loading 已在 setup 阶段登记。 */\nconst XhCascaderAutoLoading = defineComponent({\n name: 'XhCascaderAutoLoading',\n setup() {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n return () => content.authoredLoadingCount.value > 0\n ? null\n : h('div', {\n ...ctx.api.value.getLoadingProps() as Record<string, unknown>,\n 'data-xh-cascader-auto-loading': '',\n }, ctx.api.value.translations.loading)\n },\n})\n\nexport const XhCascaderContent = defineComponent({\n name: 'XhCascaderContent',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const authoredLoadingCount = ref(0)\n const registerLoading = (): (() => void) => {\n authoredLoadingCount.value += 1\n let active = true\n return () => {\n if (!active)\n return\n active = false\n authoredLoadingCount.value -= 1\n }\n }\n provideCascaderContent({ authoredLoadingCount, registerLoading })\n // 收起时只隐藏不卸载;跨列的键盘导航也在这一层处理\n return () => {\n const api = ctx.api.value\n const children = slots.default?.() ?? []\n return h('div', {\n ...api.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, [\n children,\n // 空态占位常挂在列后,露不露面归连接层;empty 插槽可换内容,缺省文案按视图取无匹配或无数据\n h(\n 'div',\n api.getEmptyProps() as Record<string, unknown>,\n slots.empty ? slots.empty() : (api.searching ? api.translations.noMatch : api.translations.empty),\n ),\n h(XhCascaderAutoLoading),\n ])\n }\n },\n})\n\nexport const XhCascaderInput = defineComponent({\n name: 'XhCascaderInput',\n setup() {\n const ctx = useCascaderContext()\n // 搜索框放在 content 顶部;没开 searchable 时连接层给 hidden\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** item 插槽的载荷:一条搜索候选。 */\nexport interface CascaderSearchListItemSlotProps {\n result: CascaderSearchResult\n}\n\nexport const XhCascaderSearchList = defineComponent({\n name: 'XhCascaderSearchList',\n slots: Object as SlotsType<{\n item?: (props: CascaderSearchListItemSlotProps) => VNode[]\n }>,\n // 根是片段(列表节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列表节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useCascaderContext()\n const searchListRef = ref<HTMLElement | null>(null)\n // 候选列表自己竖滚,条子贴在它的盒子上、紧跟在它后面(与列同一形态:浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => searchListRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 候选换代、列表显隐都会挪动它在壳内的位置:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 候选整组自动铺:整条路径连缀成一行;item 插槽可换内容\n return () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSearchListProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { searchListRef.value = el as HTMLElement },\n }, ctx.api.value.searchResults.map(result =>\n h(\n 'div',\n { ...ctx.api.value.getSearchItemProps({ path: result.path }) as Record<string, unknown>, key: result.key },\n slots.item ? slots.item({ result }) : result.labels.join(' / '),\n ),\n )),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderColumn = defineComponent({\n name: 'XhCascaderColumn',\n props: {\n // 层号,兼收字符串以支持模板里写 level=\"0\"\n level: { type: [Number, String] as PropType<number | string>, required: true },\n },\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n const columnRef = ref<HTMLElement | null>(null)\n // 每列自己竖滚:条子贴在本列的盒子上、紧跟在它后面;content 那条横的归浮层壳\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 展开路径一变,左边的列换内容、本列在壳内的位置跟着挪:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 展开路径变短时本列收起,节点常挂不卸载\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ level: Number(props.level) }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.(),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderGroup = defineComponent({\n name: 'XhCascaderGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const group = computed<CascaderGroupProps>(() => ({ value: props.value }))\n provideCascaderGroup({ group })\n // 分组容器:写在列里,条目照常挂在它下面\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderGroupLabel = defineComponent({\n name: 'XhCascaderGroupLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { group } = useCascaderGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItem = defineComponent({\n name: 'XhCascaderItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const item = computed<CascaderItemProps>(() => ({ value: props.value }))\n provideCascaderItem({ item })\n const el = ref<HTMLElement | null>(null)\n reportItemFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhCascaderItemText = defineComponent({\n name: 'XhCascaderItemText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItemIndicator = defineComponent({\n name: 'XhCascaderItemIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderFooter = defineComponent({\n name: 'XhCascaderFooter',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 浮层底部的操作区:写在 content 里、与列并列,横跨全部列;\n // 列表框语义在每一列上,放在这里的按钮既不进列的拥有关系,也走不到方向键\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cascader.js","names":[],"sources":["../../../src/components/cascader/cascader.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 cascader 相关实现。\n\nimport type { ControlVariant, Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type {\n CascaderApi,\n CascaderExpandTrigger,\n CascaderGroupProps,\n CascaderItemProps,\n CascaderNode,\n CascaderSchema,\n CascaderSearchResult,\n CascaderTranslations,\n CascaderValue,\n} from '@xihan-ui/headless'\nimport type { PropType, Ref, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport type { CascaderContext } from './use-cascader'\nimport { computed, defineComponent, h, mergeProps, onBeforeUnmount, onUpdated, ref, watch } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { useFieldLabelWiring, useFieldStateWiring } from '../field/use-field-control'\nimport { useFormControlProps } from '../form/use-form-control'\nimport { provideCascader, provideCascaderContent, provideCascaderGroup, provideCascaderItem, useCascaderContentContext, useCascaderContext, useCascaderGroupContext, useCascaderItemContext } from './context'\nimport { useCascader } from './use-cascader'\n\ntype CascaderProps = CascaderSchema['props']\n\n/** 本条目持有焦点时,value 变更重新报告焦点条目,卸载时上报焦点丢失 */\nfunction reportItemFocus(\n ctx: CascaderContext,\n el: Ref<HTMLElement | null>,\n value: () => string,\n): void {\n watch(value, (next, prev) => {\n if (next === prev)\n return\n const { service, api } = ctx\n if (service.getStatus() !== 'Started')\n return\n if (!el.value || service.scope.getActiveElement() !== el.value)\n return\n // 层号回 collection 里查,条目只自报值\n const meta = api.value.levels.flatMap(level => level.items).find(item => item.value === next)\n if (meta)\n service.send({ type: 'ITEM.FOCUS', level: meta.level, value: next })\n })\n onBeforeUnmount(() => {\n const { service } = ctx\n // 整组一起卸载时根部件先停机,此刻送事件会在 dev 下抛\n if (service.getStatus() !== 'Started')\n return\n // 按「本条目当下正持有焦点」判定,不按 value 比对\n if (el.value && service.scope.getActiveElement() === el.value)\n service.send({ type: 'ITEM.LOST' })\n })\n}\n\n/** 默认插槽的载荷:级联的展开态、选中态与列数据,以及修改它们的方法。 */\nexport type CascaderRootSlotProps = Pick<\n CascaderApi,\n | 'open'\n | 'levels'\n | 'columns'\n | 'value'\n | 'valuePath'\n | 'activePath'\n | 'focusedPath'\n | 'displayText'\n | 'canClear'\n | 'isSelected'\n | 'isIndeterminate'\n | 'isActive'\n | 'isVisible'\n | 'setOpen'\n | 'setValue'\n | 'setActivePath'\n | 'select'\n | 'clear'\n>\n\nexport const XhCascaderRoot = defineComponent({\n name: 'XhCascaderRoot',\n // 有 connect 兜底的 prop:普通类型省略 default,Boolean 显式保留 undefined\n props: {\n collection: { type: Array as PropType<CascaderNode[]> },\n value: { type: Array as PropType<CascaderValue> },\n defaultValue: { type: Array as PropType<CascaderValue> },\n name: { type: String },\n form: { type: String },\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n expandTrigger: { type: String as PropType<CascaderExpandTrigger> },\n changeOnSelect: Boolean,\n multiple: Boolean,\n searchable: { type: Boolean, default: undefined },\n cascade: Boolean,\n checkedStrategy: { type: String as PropType<CascaderProps['checkedStrategy']> },\n disabled: { type: Boolean, default: undefined },\n readOnly: { type: Boolean, default: undefined },\n invalid: { type: Boolean, default: undefined },\n loading: Boolean,\n translations: { type: Object as PropType<Partial<CascaderTranslations>> },\n variant: { type: String as PropType<ControlVariant> },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n placeholder: { type: String },\n separator: { type: String },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n loop: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n },\n // *-change 携带 details 对象,update:* 携带裸值;选中值恒为路径数组,单选时长度 ≤ 1\n emits: {\n 'value-change': (_details: PayloadOf<CascaderProps, 'onValueChange'>) => true,\n 'open-change': (_details: PayloadOf<CascaderProps, 'onOpenChange'>) => true,\n 'update:value': (_value: PayloadOf<CascaderProps, 'onValueChange'>['value']) => true,\n 'update:open': (_open: PayloadOf<CascaderProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: CascaderRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notifyValue: CascaderProps['onValueChange'] = (details) => {\n emit('value-change', details)\n emit('update:value', details.value)\n }\n const notifyOpen: CascaderProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = useCascader(withXhConfig('cascader', useFormControlProps(props)) as CascaderProps, {\n onValueChange: notifyValue,\n onOpenChange: notifyOpen,\n })\n provideCascader(ctx)\n\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, [slots.default?.({\n open: ctx.api.value.open,\n // levels 每层一列、层内节点各一条目,供作者渲染;columns 只读当前展开的列\n levels: ctx.api.value.levels,\n columns: ctx.api.value.columns,\n value: ctx.api.value.value,\n valuePath: ctx.api.value.valuePath,\n activePath: ctx.api.value.activePath,\n focusedPath: ctx.api.value.focusedPath,\n displayText: ctx.api.value.displayText,\n canClear: ctx.api.value.canClear,\n isSelected: ctx.api.value.isSelected,\n isIndeterminate: ctx.api.value.isIndeterminate,\n isActive: ctx.api.value.isActive,\n isVisible: ctx.api.value.isVisible,\n setOpen: ctx.api.value.setOpen,\n setValue: ctx.api.value.setValue,\n setActivePath: ctx.api.value.setActivePath,\n select: ctx.api.value.select,\n clear: ctx.api.value.clear,\n }), ...ctx.api.value.value.map(path => h('input', {\n ...ctx.api.value.getHiddenInputProps({ path }) as Record<string, unknown>,\n key: JSON.stringify(path),\n }))])\n },\n})\n\nexport const XhCascaderLabel = defineComponent({\n name: 'XhCascaderLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getLabelProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderControl = defineComponent({\n name: 'XhCascaderControl',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 描边、底色与聚焦环所在的那一层,触发按钮与尾部动作钮在里面并排\n return () => h('div', ctx.api.value.getControlProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderTrigger = defineComponent({\n name: 'XhCascaderTrigger',\n setup(_, { slots }) {\n // 字段的说明与校验状态要落在真控件上,不能停在封装根的 div 上\n const fieldWiring = useFieldStateWiring()\n // 字段的标签也得并进名字链:控件自带的那条指的是它自己那个没渲染的 label 部件\n const fieldLabel = useFieldLabelWiring()\n const ctx = useCascaderContext()\n return () => h('button', fieldLabel.value({\n ...fieldWiring.value,\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }), slots.default?.())\n },\n})\n\nexport const XhCascaderValueText = defineComponent({\n name: 'XhCascaderValueText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 有插槽用插槽,否则显示整条路径或 placeholder\n return () => h(\n 'span',\n ctx.api.value.getValueTextProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.displayText,\n )\n },\n})\n\nexport const XhCascaderIndicator = defineComponent({\n name: 'XhCascaderIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('span', ctx.api.value.getIndicatorProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderClearTrigger = defineComponent({\n name: 'XhCascaderClearTrigger',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n return () => h('button', ctx.api.value.getClearTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderPositioner = defineComponent({\n name: 'XhCascaderPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n // 列区的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner。\n // 只摆横的:列多到放不下时整体横向滚动,纵向溢出归每一列自己。\n // 横条的正负按排版方向算,而组件不读计算样式,把 positioner 上那份显式交过去\n const bars = useScrollbars({\n scrollable: () => ctx.contentRef.value,\n axes: ['horizontal'],\n // 条子走浮层 4px 档\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhCascaderLoading = defineComponent({\n name: 'XhCascaderLoading',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n const unregister = content.registerLoading()\n onBeforeUnmount(unregister)\n // 在途占位:作者没写内容时使用 Cascader 自己的翻译合同。\n return () => h(\n 'div',\n ctx.api.value.getLoadingProps() as Record<string, unknown>,\n slots.default?.() ?? ctx.api.value.translations.loading,\n )\n },\n})\n\n/** 放在作者插槽之后挂载;隔着普通元素或业务组件的 Loading 已在 setup 阶段登记。 */\nconst XhCascaderAutoLoading = defineComponent({\n name: 'XhCascaderAutoLoading',\n setup() {\n const ctx = useCascaderContext()\n const content = useCascaderContentContext()\n return () => content.authoredLoadingCount.value > 0\n ? null\n : h('div', {\n ...ctx.api.value.getLoadingProps() as Record<string, unknown>,\n 'data-xh-cascader-auto-loading': '',\n }, ctx.api.value.translations.loading)\n },\n})\n\nexport const XhCascaderContent = defineComponent({\n name: 'XhCascaderContent',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const authoredLoadingCount = ref(0)\n const registerLoading = (): (() => void) => {\n authoredLoadingCount.value += 1\n let active = true\n return () => {\n if (!active)\n return\n active = false\n authoredLoadingCount.value -= 1\n }\n }\n provideCascaderContent({ authoredLoadingCount, registerLoading })\n // 收起时只隐藏不卸载;跨列的键盘导航也在这一层处理\n return () => {\n const api = ctx.api.value\n const children = slots.default?.() ?? []\n return h('div', {\n ...api.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, [\n children,\n // 空态占位常挂在列后,露不露面归连接层;empty 插槽可换内容,缺省文案按视图取无匹配或无数据\n h(\n 'div',\n api.getEmptyProps() as Record<string, unknown>,\n slots.empty ? slots.empty() : (api.searching ? api.translations.noMatch : api.translations.empty),\n ),\n h(XhCascaderAutoLoading),\n ])\n }\n },\n})\n\nexport const XhCascaderInput = defineComponent({\n name: 'XhCascaderInput',\n setup() {\n const ctx = useCascaderContext()\n // 搜索框放在 content 顶部;没开 searchable 时连接层给 hidden\n return () => h('input', ctx.api.value.getInputProps() as Record<string, unknown>)\n },\n})\n\n/** item 插槽的载荷:一条搜索候选。 */\nexport interface CascaderSearchListItemSlotProps {\n result: CascaderSearchResult\n}\n\nexport const XhCascaderSearchList = defineComponent({\n name: 'XhCascaderSearchList',\n slots: Object as SlotsType<{\n item?: (props: CascaderSearchListItemSlotProps) => VNode[]\n }>,\n // 根是片段(列表节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列表节点上\n inheritAttrs: false,\n setup(_, { slots, attrs }) {\n const ctx = useCascaderContext()\n const searchListRef = ref<HTMLElement | null>(null)\n // 候选列表自己竖滚,条子贴在它的盒子上、紧跟在它后面(与列同一形态:浮层 4px 档)\n const bars = useScrollbars({\n scrollable: () => searchListRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 候选换代、列表显隐都会挪动它在壳内的位置:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 候选整组自动铺:整条路径连缀成一行;item 插槽可换内容\n return () => [\n h('div', {\n ...mergeProps(ctx.api.value.getSearchListProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { searchListRef.value = el as HTMLElement },\n }, ctx.api.value.searchResults.map(result =>\n h(\n 'div',\n { ...ctx.api.value.getSearchItemProps({ path: result.path }) as Record<string, unknown>, key: result.key },\n slots.item ? slots.item({ result }) : result.labels.join(' / '),\n ),\n )),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderColumn = defineComponent({\n name: 'XhCascaderColumn',\n props: {\n // 层号,兼收字符串以支持模板里写 level=\"0\"\n level: { type: [Number, String] as PropType<number | string>, required: true },\n },\n // 根是片段(列节点 + 贴层的条子),Vue 不会把直通属性合上去:作者写的 class、style 与 data-* 自己接住落到列节点上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = useCascaderContext()\n const columnRef = ref<HTMLElement | null>(null)\n // 每列自己竖滚:条子贴在本列的盒子上、紧跟在它后面;content 那条横的归浮层壳\n const bars = useScrollbars({\n scrollable: () => columnRef.value,\n anchor: 'layer',\n props: () => ({ dir: (ctx.api.value.getPositionerProps() as { dir?: Direction }).dir, size: 'sm' }),\n })\n // 展开路径一变,左边的列换内容、本列在壳内的位置跟着挪:每次更新后重量一次偏移盒\n onUpdated(() => bars.measure())\n // 展开路径变短时本列收起,节点常挂不卸载\n return () => [\n h(\n 'div',\n {\n ...mergeProps(ctx.api.value.getColumnProps({ level: Number(props.level) }) as Record<string, unknown>, attrs),\n ref: (el: unknown) => { columnRef.value = el as HTMLElement },\n },\n slots.default?.(),\n ),\n ...bars.render(),\n ]\n },\n})\n\nexport const XhCascaderGroup = defineComponent({\n name: 'XhCascaderGroup',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const group = computed<CascaderGroupProps>(() => ({ value: props.value }))\n provideCascaderGroup({ group })\n // 分组容器:写在列里,条目照常挂在它下面\n return () => h('div', ctx.api.value.getGroupProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderGroupLabel = defineComponent({\n name: 'XhCascaderGroupLabel',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { group } = useCascaderGroupContext()\n return () => h('span', ctx.api.value.getGroupLabelProps(group.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItem = defineComponent({\n name: 'XhCascaderItem',\n props: {\n value: { type: String, required: true },\n },\n setup(props, { slots }) {\n const ctx = useCascaderContext()\n const item = computed<CascaderItemProps>(() => ({ value: props.value }))\n provideCascaderItem({ item })\n const el = ref<HTMLElement | null>(null)\n reportItemFocus(ctx, el, () => props.value)\n return () => h(\n 'div',\n { ...ctx.api.value.getItemProps(item.value) as Record<string, unknown>, ref: el },\n slots.default?.(),\n )\n },\n})\n\nexport const XhCascaderItemText = defineComponent({\n name: 'XhCascaderItemText',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemTextProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */\nexport const XhCascaderItemDescription = defineComponent({\n name: 'XhCascaderItemDescription',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemDescriptionProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 条目行尾的作者内容(计数、徽标) */\nexport const XhCascaderItemSuffix = defineComponent({\n name: 'XhCascaderItemSuffix',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemSuffixProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderItemIndicator = defineComponent({\n name: 'XhCascaderItemIndicator',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n const { item } = useCascaderItemContext()\n return () => h('span', ctx.api.value.getItemIndicatorProps(item.value) as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhCascaderFooter = defineComponent({\n name: 'XhCascaderFooter',\n setup(_, { slots }) {\n const ctx = useCascaderContext()\n // 浮层底部的操作区:写在 content 里、与列并列,横跨全部列;\n // 列表框语义在每一列上,放在这里的按钮既不进列的拥有关系,也走不到方向键\n return () => h('div', ctx.api.value.getFooterProps() as Record<string, unknown>, slots.default?.())\n },\n})\n"],"mappings":"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"}
|
|
@@ -210,7 +210,12 @@ declare const XhComboboxRoot: import("vue").DefineComponent<import("vue").Extrac
|
|
|
210
210
|
default?: (props: ComboboxRootSlotProps) => VNode[];
|
|
211
211
|
label?: () => VNode[];
|
|
212
212
|
empty?: () => VNode[];
|
|
213
|
+
/** 只填条目的文字槽,副文本与首尾两格照旧各归各的 */
|
|
213
214
|
item?: (node: ComboboxNodeMeta) => VNode[];
|
|
215
|
+
/** 只接管行首那一格,其余槽照旧由数据铺 */
|
|
216
|
+
'item-prefix'?: (node: ComboboxNodeMeta) => VNode[];
|
|
217
|
+
/** 只接管行尾那一格(计数、徽标、次级图标),其余槽照旧由数据铺 */
|
|
218
|
+
'item-suffix'?: (node: ComboboxNodeMeta) => VNode[];
|
|
214
219
|
}>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
215
220
|
declare const XhComboboxLabel: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
216
221
|
[key: string]: any;
|
|
@@ -305,6 +310,18 @@ declare const XhComboboxItem: import("vue").DefineComponent<import("vue").Extrac
|
|
|
305
310
|
declare const XhComboboxItemText: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
306
311
|
[key: string]: any;
|
|
307
312
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
313
|
+
/** 条目行首的作者内容(图标、色块、头像),对读屏隐藏 */
|
|
314
|
+
declare const XhComboboxItemPrefix: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
315
|
+
[key: string]: any;
|
|
316
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
317
|
+
/** 条目行尾的作者内容(计数、徽标) */
|
|
318
|
+
declare const XhComboboxItemSuffix: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
319
|
+
[key: string]: any;
|
|
320
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
321
|
+
/** 条目的第 2 行副文本,跨文字槽、走 muted 档 */
|
|
322
|
+
declare const XhComboboxItemDescription: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
323
|
+
[key: string]: any;
|
|
324
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
308
325
|
declare const XhComboboxItemIndicator: import("vue").DefineComponent<{}, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
309
326
|
[key: string]: any;
|
|
310
327
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -318,5 +335,5 @@ declare const XhComboboxLoading: import("vue").DefineComponent<{}, () => VNode<i
|
|
|
318
335
|
[key: string]: any;
|
|
319
336
|
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
320
337
|
//#endregion
|
|
321
|
-
export { ComboboxRootSlotProps, XhComboboxClearTrigger, XhComboboxContent, XhComboboxControl, XhComboboxEmpty, XhComboboxGroup, XhComboboxGroupLabel, XhComboboxHiddenInput, XhComboboxInput, XhComboboxItem, XhComboboxItemIndicator, XhComboboxItemText, XhComboboxLabel, XhComboboxLoading, XhComboboxPositioner, XhComboboxRoot, XhComboboxTrigger };
|
|
338
|
+
export { ComboboxRootSlotProps, XhComboboxClearTrigger, XhComboboxContent, XhComboboxControl, XhComboboxEmpty, XhComboboxGroup, XhComboboxGroupLabel, XhComboboxHiddenInput, XhComboboxInput, XhComboboxItem, XhComboboxItemDescription, XhComboboxItemIndicator, XhComboboxItemPrefix, XhComboboxItemSuffix, XhComboboxItemText, XhComboboxLabel, XhComboboxLoading, XhComboboxPositioner, XhComboboxRoot, XhComboboxTrigger };
|
|
322
339
|
//# sourceMappingURL=combobox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.d.ts","names":[],"sources":["../../../src/components/combobox/combobox.ts"],"mappings":";;;;;KA2BK,gBAAgB;;KAGT,wBAAwB,KAClC;cAIW,8BAAc,8BAAA;;IAIM,MAAA,SAAS;;;;;;;;;;;IAKJ,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBT,MAAA,SAAS;;;;;IAGR,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;IAGf,MAAA,SAAS;;;IACL,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;EAIN,iBAAA,UAAA,UAAU;EACJ,uBAAA,UAAA,UAAU;EACjB,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACA,sBAAA,aAAA,UAAU;EACtB,gBAAA,OAAA,UAAU;;;IA1CJ,MAAA,SAAS;;;;;;;;;;;IAKJ,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBT,MAAA,SAAS;;;;;IAGR,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;IAGf,MAAA,SAAS;;;IACL,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","names":[],"sources":["../../../src/components/combobox/combobox.ts"],"mappings":";;;;;KA2BK,gBAAgB;;KAGT,wBAAwB,KAClC;cAIW,8BAAc,8BAAA;;IAIM,MAAA,SAAS;;;;;;;;;;;IAKJ,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBT,MAAA,SAAS;;;;;IAGR,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;IAGf,MAAA,SAAS;;;IACL,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;EAIN,iBAAA,UAAA,UAAU;EACJ,uBAAA,UAAA,UAAU;EACjB,gBAAA,UAAA,UAAU;EACX,iBAAA,QAAA,UAAU;EACA,sBAAA,aAAA,UAAU;EACtB,gBAAA,OAAA,UAAU;;;IA1CJ,MAAA,SAAS;;;;;;;;;;;IAKJ,MAAA;;;IACO,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBT,MAAA,SAAS;;;;;IAGR,MAAA,SAAS;;;IACb,MAAA,SAAS;;;;;;;IAGf,MAAA,SAAS;;;IACL,MAAA,SAAS;;;IACZ,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;;;;;;;;;;;EAYrB,WAAC,OAAO,0BAA0B;EACpC,cAAM;EACN,cAAM;;EAEP,QAAC,MAAM,qBAAqB;;EAErB,iBAAC,MAAM,qBAAqB;;EAE5B,iBAAC,MAAM,qBAAqB;kCAuD9C;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAS5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;IAOF,MAAA,SAAS;;;;;;;;;;;IAAT,MAAA,SAAS;;;;;qCAcjC;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,sCAAsB,0BAAA,oBAAA,4BAAA;;8BAMjC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,oCAAoB,8BAAA;;;IAIA,MAAA,SAAS;;;;;;;IAAT,MAAA,SAAS;;MAgBxC,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAY5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,8BAAA;;;;;;;;;;;;MAW1B,oDAAA;cAEW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,8BAAc,8BAAA;;;;;;;;;;;;;;;;;;;;;;qCAkBzB;cAEW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAO7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAO/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,yCAAyB,0BAAA,oBAAA,4BAAA;;8BAOpC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,uCAAuB,0BAAA,oBAAA,4BAAA;;8BAOlC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,qCAAqB,0BAAA,oBAAA,4BAAA;;gCAYhC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAO1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;cAEW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAO5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA"}
|