x-next 1.13.0 → 1.15.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.
Files changed (187) hide show
  1. package/AI_CODING.md +6 -5
  2. package/AI_USAGE/catalog.md +108 -105
  3. package/AI_USAGE/components/alert-api.md +48 -0
  4. package/AI_USAGE/components/alert.md +222 -3
  5. package/AI_USAGE/components/bar-chart-api.md +177 -0
  6. package/AI_USAGE/components/bar-chart.md +297 -3
  7. package/AI_USAGE/components/boxicons.md +147 -0
  8. package/AI_USAGE/components/button-api.md +144 -0
  9. package/AI_USAGE/components/button.md +447 -3
  10. package/AI_USAGE/components/charts.md +81 -0
  11. package/AI_USAGE/components/checkbox-api.md +145 -0
  12. package/AI_USAGE/components/checkbox.md +365 -3
  13. package/AI_USAGE/components/color-picker-api.md +52 -0
  14. package/AI_USAGE/components/color-picker.md +211 -3
  15. package/AI_USAGE/components/config-provider-api.md +38 -0
  16. package/AI_USAGE/components/config-provider.md +250 -3
  17. package/AI_USAGE/components/date-picker-api.md +1114 -0
  18. package/AI_USAGE/components/date-picker.md +378 -3
  19. package/AI_USAGE/components/dialog-api.md +142 -0
  20. package/AI_USAGE/components/dialog.md +284 -3
  21. package/AI_USAGE/components/draggable-api.md +146 -0
  22. package/AI_USAGE/components/draggable.md +259 -0
  23. package/AI_USAGE/components/drawer-api.md +78 -0
  24. package/AI_USAGE/components/drawer.md +256 -0
  25. package/AI_USAGE/components/dropdown-api.md +529 -0
  26. package/AI_USAGE/components/dropdown.md +392 -3
  27. package/AI_USAGE/components/empty-api.md +36 -0
  28. package/AI_USAGE/components/empty.md +227 -3
  29. package/AI_USAGE/components/finicon.md +88 -0
  30. package/AI_USAGE/components/form-api.md +524 -0
  31. package/AI_USAGE/components/form.md +454 -0
  32. package/AI_USAGE/components/grid-api.md +527 -0
  33. package/AI_USAGE/components/grid.md +224 -0
  34. package/AI_USAGE/components/heatmap-api.md +122 -0
  35. package/AI_USAGE/components/heatmap.md +220 -0
  36. package/AI_USAGE/components/icon-api.md +4707 -0
  37. package/AI_USAGE/components/icon.md +257 -0
  38. package/AI_USAGE/components/image-api.md +440 -0
  39. package/AI_USAGE/components/image.md +465 -0
  40. package/AI_USAGE/components/input-api.md +184 -0
  41. package/AI_USAGE/components/input-number-api.md +66 -0
  42. package/AI_USAGE/components/input-number.md +294 -0
  43. package/AI_USAGE/components/input-tag-api.md +114 -0
  44. package/AI_USAGE/components/input-tag.md +482 -0
  45. package/AI_USAGE/components/input.md +293 -3
  46. package/AI_USAGE/components/layout-api.md +147 -0
  47. package/AI_USAGE/components/layout.md +230 -0
  48. package/AI_USAGE/components/line-chart-api.md +197 -0
  49. package/AI_USAGE/components/line-chart.md +306 -3
  50. package/AI_USAGE/components/link-api.md +42 -0
  51. package/AI_USAGE/components/link.md +197 -0
  52. package/AI_USAGE/components/menu-api.md +516 -0
  53. package/AI_USAGE/components/menu.md +268 -0
  54. package/AI_USAGE/components/message-api.md +215 -0
  55. package/AI_USAGE/components/message-box-api.md +108 -0
  56. package/AI_USAGE/components/message-box.md +268 -3
  57. package/AI_USAGE/components/message.md +231 -3
  58. package/AI_USAGE/components/network-api.md +91 -0
  59. package/AI_USAGE/components/network.md +378 -0
  60. package/AI_USAGE/components/notification-api.md +236 -0
  61. package/AI_USAGE/components/notification.md +275 -3
  62. package/AI_USAGE/components/pagination-api.md +62 -0
  63. package/AI_USAGE/components/pagination.md +380 -3
  64. package/AI_USAGE/components/pie-chart-api.md +109 -0
  65. package/AI_USAGE/components/pie-chart.md +245 -3
  66. package/AI_USAGE/components/popconfirm-api.md +75 -0
  67. package/AI_USAGE/components/popconfirm.md +231 -3
  68. package/AI_USAGE/components/popover-api.md +75 -0
  69. package/AI_USAGE/components/popover.md +208 -3
  70. package/AI_USAGE/components/popup-api.md +75 -0
  71. package/AI_USAGE/components/popup.md +52 -0
  72. package/AI_USAGE/components/progress-api.md +44 -0
  73. package/AI_USAGE/components/progress.md +248 -3
  74. package/AI_USAGE/components/radio-api.md +165 -0
  75. package/AI_USAGE/components/radio.md +259 -3
  76. package/AI_USAGE/components/rate-api.md +54 -0
  77. package/AI_USAGE/components/rate.md +233 -3
  78. package/AI_USAGE/components/resize-box-api.md +56 -0
  79. package/AI_USAGE/components/resize-box.md +231 -0
  80. package/AI_USAGE/components/scrollbar-api.md +77 -0
  81. package/AI_USAGE/components/scrollbar.md +218 -0
  82. package/AI_USAGE/components/select-api.md +758 -0
  83. package/AI_USAGE/components/select.md +640 -3
  84. package/AI_USAGE/components/skeleton-api.md +85 -0
  85. package/AI_USAGE/components/skeleton.md +150 -0
  86. package/AI_USAGE/components/slider-api.md +51 -0
  87. package/AI_USAGE/components/slider.md +233 -3
  88. package/AI_USAGE/components/space-api.md +38 -0
  89. package/AI_USAGE/components/space.md +145 -0
  90. package/AI_USAGE/components/spin-api.md +43 -0
  91. package/AI_USAGE/components/spin.md +205 -0
  92. package/AI_USAGE/components/steps-api.md +111 -0
  93. package/AI_USAGE/components/steps.md +201 -3
  94. package/AI_USAGE/components/switch-api.md +58 -0
  95. package/AI_USAGE/components/switch.md +290 -3
  96. package/AI_USAGE/components/table-api.md +2919 -0
  97. package/AI_USAGE/components/table.md +1457 -0
  98. package/AI_USAGE/components/tabs-api.md +135 -0
  99. package/AI_USAGE/components/tabs.md +308 -3
  100. package/AI_USAGE/components/tag-api.md +124 -0
  101. package/AI_USAGE/components/tag.md +292 -0
  102. package/AI_USAGE/components/textarea-api.md +55 -0
  103. package/AI_USAGE/components/textarea.md +326 -3
  104. package/AI_USAGE/components/time-picker-api.md +137 -0
  105. package/AI_USAGE/components/time-picker.md +271 -3
  106. package/AI_USAGE/components/time-range-selector-api.md +44 -0
  107. package/AI_USAGE/components/time-range-selector.md +355 -0
  108. package/AI_USAGE/components/timeline-api.md +93 -0
  109. package/AI_USAGE/components/timeline.md +312 -0
  110. package/AI_USAGE/components/tooltip-api.md +77 -0
  111. package/AI_USAGE/components/tooltip.md +182 -0
  112. package/AI_USAGE/components/tree-select-api.md +498 -0
  113. package/AI_USAGE/components/tree-select.md +744 -0
  114. package/AI_USAGE/components/trend-chart-api.md +119 -0
  115. package/AI_USAGE/components/trend-chart.md +335 -0
  116. package/AI_USAGE/components/trigger-api.md +124 -0
  117. package/AI_USAGE/components/trigger.md +185 -0
  118. package/AI_USAGE/components/upload-api.md +200 -0
  119. package/AI_USAGE/components/upload.md +711 -3
  120. package/AI_USAGE/components/watermark-api.md +87 -0
  121. package/AI_USAGE/components/watermark.md +200 -0
  122. package/AI_USAGE/core.md +1 -1
  123. package/AI_USAGE/index.md +36 -7
  124. package/AI_USAGE/recipes/form-on-demand.md +1 -1
  125. package/AI_USAGE.md +34972 -5
  126. package/CHANGELOG.md +39 -0
  127. package/dist/_props/css.d.ts +2 -1
  128. package/dist/_utils/inherit-component-type.d.ts +11 -0
  129. package/dist/components/bar-chart/BarChart.d.ts +1 -1
  130. package/dist/components/bar-chart/index.d.ts +3 -3
  131. package/dist/components/date-picker/index.d.ts +420 -5
  132. package/dist/components/form-input/index.d.ts +617 -2
  133. package/dist/components/index.d.ts +1 -0
  134. package/dist/components/layout/index.d.ts +689 -1
  135. package/dist/components/line-chart/LineChart.d.ts +1 -1
  136. package/dist/components/line-chart/index.d.ts +3 -3
  137. package/dist/components/line-chart/interface.d.ts +2 -2
  138. package/dist/components/menu/index.d.ts +786 -1
  139. package/dist/components/tree-select/TreeNode.vue.d.ts +478 -0
  140. package/dist/components/tree-select/TreeSelect.d.ts +1549 -0
  141. package/dist/components/tree-select/TreeSelectDropdown.vue.d.ts +569 -0
  142. package/dist/components/tree-select/hooks/use-tree-select.d.ts +92 -0
  143. package/dist/components/tree-select/index.d.ts +3321 -0
  144. package/dist/components/tree-select/interface.d.ts +203 -0
  145. package/dist/components/tree-select/utils.d.ts +64 -0
  146. package/dist/es/_styles/palette-aliases.js +3 -0
  147. package/dist/es/_utils/inherit-component-type.js +6 -0
  148. package/dist/es/components/_components/feedback-icon/index.vue2.js +10 -10
  149. package/dist/es/components/button/Button.js +9 -9
  150. package/dist/es/components/date-picker/index.js +18 -17
  151. package/dist/es/components/drawer/src/Drawer.vue.js +6 -6
  152. package/dist/es/components/form-input/index.js +12 -11
  153. package/dist/es/components/form-switch/Switch.vue2.js +18 -18
  154. package/dist/es/components/image/Image.vue2.js +13 -13
  155. package/dist/es/components/image/ImagePreview.vue2.js +33 -33
  156. package/dist/es/components/index.js +55 -52
  157. package/dist/es/components/layout/index.js +10 -9
  158. package/dist/es/components/link/Link.vue2.js +12 -12
  159. package/dist/es/components/menu/hooks/use-level.js +5 -5
  160. package/dist/es/components/menu/index.js +13 -10
  161. package/dist/es/components/message/message.vue2.js +13 -13
  162. package/dist/es/components/spin/Spin.js +28 -28
  163. package/dist/es/components/tag/Tag.vue2.js +22 -22
  164. package/dist/es/components/timeline/src/Timeline.js +7 -7
  165. package/dist/es/components/tree-select/TreeNode.vue.js +91 -0
  166. package/dist/es/components/tree-select/TreeNode.vue2.js +162 -0
  167. package/dist/es/components/tree-select/TreeSelect.js +865 -0
  168. package/dist/es/components/tree-select/TreeSelectDropdown.vue.js +57 -0
  169. package/dist/es/components/tree-select/TreeSelectDropdown.vue2.js +79 -0
  170. package/dist/es/components/tree-select/hooks/use-tree-select.js +376 -0
  171. package/dist/es/components/tree-select/index.js +13 -0
  172. package/dist/es/components/tree-select/utils.js +181 -0
  173. package/dist/es/icons/animation/animation-loading.js +2 -2
  174. package/dist/es/index.js +71 -68
  175. package/dist/es/style.css +1 -1
  176. package/dist/index.cjs +3 -3
  177. package/dist/index.umd.js +3 -3
  178. package/dist/style/base.css +1 -1
  179. package/dist/style/dependencies.json +10 -0
  180. package/dist/style/drawer.css +1 -1
  181. package/dist/style/table.css +1 -1
  182. package/dist/style/tree-select.css +1 -0
  183. package/dist/style/tree-select.js +8 -0
  184. package/dist/style.css +1 -1
  185. package/dist/types.d.ts +2 -0
  186. package/package.json +11 -5
  187. package/volar.d.ts +2 -0
@@ -1,12 +1,14 @@
1
1
  <!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
2
2
  # Dropdown AI 使用
3
3
 
4
- 适用版本:x-next@1.13.0;来源指纹:`18e9b8eefa53b4bd91134fb4486778509ccf3a8d614a1bd387a6d469b623ddcf`。
4
+ 适用版本:x-next@1.15.0;来源指纹:`47ea153587c8d0b3bf318977b10bde9f8dd4acff90c5818541ba6513252ad362`。
5
5
 
6
- 先读 [通用接入](../core.md)。公开导出:`Dropdown`;模型:v-model:popup-visible;已核对事件:select、popupVisibleChange。
6
+ 先读 [通用接入](../core.md)。公开导出:`Dropdown, DropdownButton, DropdownGroup, DropdownOption, DropdownSubmenu`;主要模型:v-model:popup-visible。完整 Props、Events、Slots、实例方法与服务签名见 [本地 API](./dropdown-api.md),包含本组件族全部子组件和别名。
7
7
 
8
8
  按需样式:`x-next/style/dropdown`(包含 base.css、button.css、dropdown.css、empty.css、scrollbar-v2.css、spin.css、trigger.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
9
9
 
10
+ ## 已核验行为与示例
11
+
10
12
  [组件文档与 live demo](https://x-next.yjmf.com/components/dropdown)。使用 `v-model:popup-visible`,默认 `trigger='click'`、`position='bottom'`、`hideOnSelect=true`。根入口导出 `DropdownOption`、`DropdownGroup`、`DropdownSubmenu`;菜单内容放 `content` 插槽,另有 `empty` / `footer` 插槽。
11
13
 
12
14
  `select(value, event)` 返回 `string | number | Record<string, any> | undefined` 和 `Event`,`popup-visible-change` 返回布尔值。选项支持 `disabled`;字符搜索 typeahead、自定义控件的通用键盘代理及 Tab 自动关闭仍有边界,不能据方向键导航推断这些能力已实现。
@@ -35,4 +37,391 @@ function select(value: unknown, _event: Event) {
35
37
  </template>
36
38
  ```
37
39
 
38
- 返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
40
+ ## 场景用法
41
+
42
+ 以下示例从本地 `src/docs/components/dropdown.md` 显式导入到独立 AI 源,补齐局部注册、状态和样式后进行严格模板检查。上方已核验行为优先;原始 prop 默认值、包装透传和示例业务适配分别查 [完整 API](./dropdown-api.md) 与场景说明。类型通过不代表所有散文和交互已验证。
43
+
44
+ ### 用途与选型
45
+
46
+ 用于承载一组收起的操作项或选择项,适合页面操作过多、需要按触发器就近展开菜单的场景。
47
+
48
+
49
+ ### 何时使用
50
+
51
+ - 页面或列表行操作较多,需要把低频操作收纳起来。
52
+ - 触发元素附近展示命令菜单,比 Dialog 或 Drawer 更轻量。
53
+ - 菜单内容较短,用户选择后通常立即关闭浮层。
54
+
55
+
56
+ ### 基础用法
57
+
58
+ ```vue
59
+ <script setup lang="ts">
60
+ import 'x-next/style.css';
61
+ import { Dropdown, Button, DropdownOption } from 'x-next';
62
+ import { ref } from 'vue';
63
+
64
+ const selected = ref('未选择');
65
+
66
+ const handleSelect = (value: unknown) => {
67
+ selected.value = String(value ?? '未选择');
68
+ };
69
+ </script>
70
+ <template>
71
+ <Dropdown @select="handleSelect">
72
+ <Button>更多操作</Button>
73
+ <template #content>
74
+ <DropdownOption value="edit">编辑</DropdownOption>
75
+ <DropdownOption value="copy">复制</DropdownOption>
76
+ <DropdownOption value="delete" disabled>删除</DropdownOption>
77
+ </template>
78
+ </Dropdown>
79
+ <p>当前选择:{{ selected }}</p>
80
+ </template>
81
+ ```
82
+
83
+ ### 键盘操作
84
+
85
+ 聚焦触发按钮后按 Enter、Space 或 ArrowDown 打开首个启用项,ArrowUp 打开最后一项。菜单使用单个 Tab 停靠点;方向键循环、Home/End 跳到首尾,禁用项自动跳过。子菜单用 ArrowRight 进入,ArrowLeft 或 Escape 返回父项,根菜单 Escape 关闭后回到触发按钮。
86
+
87
+ 受控模式只在外部接受显隐请求后转移或归还焦点。鼠标悬浮打开不会主动抢走焦点。菜单项内部的自定义输入框保留其自己的方向键处理;本轮不提供字符搜索或 Tab 自动关闭行为。
88
+
89
+ ```vue
90
+ <script setup lang="ts">
91
+ import { ref } from 'vue';
92
+ import { Button, Dropdown, DropdownOption, DropdownSubmenu } from 'x-next';
93
+ import 'x-next/dist/style.css';
94
+
95
+ const visible = ref(false);
96
+ const selected = ref('未选择');
97
+ </script>
98
+ <template>
99
+ <Dropdown v-model:popup-visible="visible" @select="(value) => selected = String(value)">
100
+ <Button>键盘操作菜单</Button>
101
+ <template #content>
102
+ <DropdownOption value="edit">编辑</DropdownOption>
103
+ <DropdownOption value="delete" disabled>删除</DropdownOption>
104
+ <DropdownSubmenu>
105
+ 更多
106
+ <template #content>
107
+ <DropdownOption value="copy">复制</DropdownOption>
108
+ <DropdownOption value="archive">归档</DropdownOption>
109
+ </template>
110
+ </DropdownSubmenu>
111
+ <DropdownOption value="export">导出</DropdownOption>
112
+ </template>
113
+ </Dropdown>
114
+ <p role="status">{{ visible ? '打开' : '关闭' }};{{ selected }}</p>
115
+ </template>
116
+ ```
117
+
118
+ ### 弹出位置
119
+
120
+ ```vue
121
+ <script setup lang="ts">
122
+ import 'x-next/style.css';
123
+ import { Dropdown, Button, DropdownOption } from 'x-next';
124
+
125
+ </script>
126
+ <template>
127
+ <div class="demo-inline-group">
128
+ <Dropdown position="top">
129
+ <Button>Top</Button>
130
+ <template #content>
131
+ <DropdownOption value="edit">编辑</DropdownOption>
132
+ <DropdownOption value="copy">复制</DropdownOption>
133
+ </template>
134
+ </Dropdown>
135
+ <Dropdown position="br">
136
+ <Button>BR</Button>
137
+ <template #content>
138
+ <DropdownOption value="edit">编辑</DropdownOption>
139
+ <DropdownOption value="copy">复制</DropdownOption>
140
+ </template>
141
+ </Dropdown>
142
+ </div>
143
+ </template>
144
+ ```
145
+
146
+ ### 触发方式
147
+
148
+ ```vue
149
+ <script setup lang="ts">
150
+ import 'x-next/style.css';
151
+ import { Dropdown, Button, DropdownOption } from 'x-next';
152
+
153
+ </script>
154
+ <template>
155
+ <div class="demo-inline-group">
156
+ <Dropdown trigger="click">
157
+ <Button>点击触发</Button>
158
+ <template #content>
159
+ <DropdownOption value="click">点击菜单</DropdownOption>
160
+ </template>
161
+ </Dropdown>
162
+ <Dropdown trigger="hover">
163
+ <Button>悬浮触发</Button>
164
+ <template #content>
165
+ <DropdownOption value="hover">悬浮菜单</DropdownOption>
166
+ </template>
167
+ </Dropdown>
168
+ </div>
169
+ </template>
170
+ ```
171
+
172
+ ### 受控显示
173
+
174
+ ```vue
175
+ <script setup lang="ts">
176
+ import 'x-next/style.css';
177
+ import { Space, Dropdown, Button, DropdownOption } from 'x-next';
178
+ import { ref } from 'vue';
179
+
180
+ const visible = ref(false);
181
+
182
+ const handleSelect = (value: unknown) => {
183
+ console.log(value);
184
+ };
185
+ </script>
186
+ <template>
187
+ <Space>
188
+ <Dropdown v-model:popup-visible="visible" @select="handleSelect">
189
+ <Button type="primary">受控菜单</Button>
190
+ <template #content>
191
+ <DropdownOption value="save">保存</DropdownOption>
192
+ <DropdownOption value="publish">发布</DropdownOption>
193
+ </template>
194
+ </Dropdown>
195
+ <Button @click="visible = true">外部打开</Button>
196
+ <Button @click="visible = false">外部关闭</Button>
197
+ </Space>
198
+ </template>
199
+ ```
200
+
201
+ ### 分组
202
+
203
+ ```vue
204
+ <script setup lang="ts">
205
+ import 'x-next/style.css';
206
+ import { Dropdown, Button, DropdownGroup, DropdownOption } from 'x-next';
207
+ const handleSelect = (value: unknown) => {
208
+ console.log(value);
209
+ };
210
+ </script>
211
+ <template>
212
+ <Dropdown @select="handleSelect">
213
+ <Button>项目操作</Button>
214
+ <template #content>
215
+ <DropdownGroup title="常用">
216
+ <DropdownOption value="rename">重命名</DropdownOption>
217
+ <DropdownOption value="duplicate">复制项目</DropdownOption>
218
+ </DropdownGroup>
219
+ <DropdownGroup title="危险">
220
+ <DropdownOption value="archive">归档</DropdownOption>
221
+ <DropdownOption value="delete" disabled>删除</DropdownOption>
222
+ </DropdownGroup>
223
+ </template>
224
+ </Dropdown>
225
+ </template>
226
+ ```
227
+
228
+ ### 子菜单
229
+
230
+ ```vue
231
+ <script setup lang="ts">
232
+ import 'x-next/style.css';
233
+ import { Dropdown, Button, DropdownOption, DropdownSubmenu } from 'x-next';
234
+ const handleSelect = (value: unknown) => {
235
+ console.log(value);
236
+ };
237
+ </script>
238
+ <template>
239
+ <Dropdown @select="handleSelect">
240
+ <Button>导出</Button>
241
+ <template #content>
242
+ <DropdownOption value="quick-export">快速导出</DropdownOption>
243
+ <DropdownSubmenu trigger="hover">
244
+ 更多格式
245
+ <template #content>
246
+ <DropdownOption value="csv">CSV</DropdownOption>
247
+ <DropdownOption value="xlsx">Excel</DropdownOption>
248
+ <DropdownOption value="pdf">PDF</DropdownOption>
249
+ </template>
250
+ </DropdownSubmenu>
251
+ </template>
252
+ </Dropdown>
253
+ </template>
254
+ ```
255
+
256
+ ### 右键菜单
257
+
258
+ ```vue
259
+ <script setup lang="ts">
260
+ import 'x-next/style.css';
261
+ import { Dropdown, DropdownOption } from 'x-next';
262
+ const handleSelect = (value: unknown) => {
263
+ console.log(value);
264
+ };
265
+ </script>
266
+ <template>
267
+ <Dropdown trigger="contextMenu" align-point @select="handleSelect">
268
+ <div class="context-target">在此区域右键打开菜单</div>
269
+ <template #content>
270
+ <DropdownOption value="refresh">刷新</DropdownOption>
271
+ <DropdownOption value="copy-link">复制链接</DropdownOption>
272
+ <DropdownOption value="open-new">新窗口打开</DropdownOption>
273
+ </template>
274
+ </Dropdown>
275
+ </template>
276
+ <style scoped>
277
+ .context-target {
278
+ padding: 24px;
279
+ border: 1px dashed #94a3b8;
280
+ }
281
+ </style>
282
+ ```
283
+
284
+ ### 图标、后缀和页脚
285
+
286
+ ```vue
287
+ <script setup lang="ts">
288
+ import 'x-next/style.css';
289
+ import { Dropdown, Button, DropdownOption } from 'x-next';
290
+ const handleSelect = (value: unknown) => {
291
+ console.log(value);
292
+ };
293
+ </script>
294
+ <template>
295
+ <Dropdown @select="handleSelect">
296
+ <Button>账户菜单</Button>
297
+ <template #content>
298
+ <DropdownOption value="profile">
299
+ <template #icon><span>P</span></template>
300
+ 个人资料
301
+ <template #suffix>⌘P</template>
302
+ </DropdownOption>
303
+ <DropdownOption value="settings">
304
+ <template #icon><span>S</span></template>
305
+ 设置
306
+ <template #suffix>⌘,</template>
307
+ </DropdownOption>
308
+ </template>
309
+ <template #footer>
310
+ <div>菜单页脚</div>
311
+ </template>
312
+ </Dropdown>
313
+ </template>
314
+ ```
315
+
316
+ ### 选择后保持打开
317
+
318
+ ```vue
319
+ <script setup lang="ts">
320
+ import 'x-next/style.css';
321
+ import { Dropdown, Button, DropdownOption } from 'x-next';
322
+ import { ref } from 'vue';
323
+
324
+ const visible = ref(false);
325
+ </script>
326
+ <template>
327
+ <Dropdown v-model:popup-visible="visible" :hide-on-select="false">
328
+ <Button>批量操作</Button>
329
+ <template #content>
330
+ <DropdownOption value="select-all">全选</DropdownOption>
331
+ <DropdownOption value="invert">反选</DropdownOption>
332
+ <DropdownOption value="clear">清空选择</DropdownOption>
333
+ </template>
334
+ <template #footer>
335
+ <Button size="mini" @click="visible = false">完成</Button>
336
+ </template>
337
+ </Dropdown>
338
+ </template>
339
+ ```
340
+
341
+ ### 空态、加载和滚动
342
+
343
+ ```vue
344
+ <script setup lang="ts">
345
+ import 'x-next/style.css';
346
+ import { Dropdown, Button, DropdownOption } from 'x-next';
347
+ import { ref } from 'vue';
348
+
349
+ const reached = ref(false);
350
+ const items = Array.from({ length: 18 }, (_, index) => ({
351
+ label: `操作 ${index + 1}`,
352
+ value: `action-${index + 1}`,
353
+ }));
354
+ </script>
355
+ <template>
356
+ <Dropdown is-empty>
357
+ <Button>空菜单</Button>
358
+ <template #empty>暂无可用操作</template>
359
+ </Dropdown>
360
+
361
+ <Dropdown
362
+ :popup-max-height="144"
363
+ :bottom-offset="8"
364
+ @reach-bottom="reached = true"
365
+ >
366
+ <Button>滚动菜单</Button>
367
+ <template #content>
368
+ <DropdownOption v-for="item in items" :key="item.value" :value="item.value">
369
+ {{ item.label }}
370
+ </DropdownOption>
371
+ </template>
372
+ </Dropdown>
373
+ </template>
374
+ ```
375
+
376
+ ### 按钮式下拉
377
+
378
+ ```vue
379
+ <script setup lang="ts">
380
+ import 'x-next/style.css';
381
+ import { DropdownButton, DropdownOption } from 'x-next';
382
+ const handleClick = () => {
383
+ console.log('main button');
384
+ };
385
+
386
+ const handleSelect = (value: unknown) => {
387
+ console.log(value);
388
+ };
389
+ </script>
390
+ <template>
391
+ <div class="demo-inline-group">
392
+ <DropdownButton type="primary" @click="handleClick" @select="handleSelect">
393
+ 新建
394
+ <template #content>
395
+ <DropdownOption value="new-file">新建文件</DropdownOption>
396
+ <DropdownOption value="new-folder">新建文件夹</DropdownOption>
397
+ <DropdownOption value="import">导入</DropdownOption>
398
+ </template>
399
+ </DropdownButton>
400
+
401
+ <DropdownButton @click="handleClick" @select="handleSelect">
402
+ Publish
403
+ <template #content>
404
+ <DropdownOption value="publish-now">立即发布</DropdownOption>
405
+ <DropdownOption value="schedule">定时发布</DropdownOption>
406
+ </template>
407
+ </DropdownButton>
408
+
409
+ <DropdownButton disabled>
410
+ Disabled
411
+ <template #content>
412
+ <DropdownOption value="disabled">不可用</DropdownOption>
413
+ </template>
414
+ </DropdownButton>
415
+ </div>
416
+ </template>
417
+ ```
418
+
419
+ ### 交互说明
420
+
421
+ - 菜单项支持鼠标点击,也支持聚焦后按 Enter 或 Space 触发。
422
+ - 复杂菜单项建议显式传入 `value`,避免默认文本值受到图标、后缀或隐藏文本影响。
423
+ - 多级菜单支持 ArrowRight 进入、ArrowLeft/Escape 返回,键盘选中后按 `hideOnSelect` 决定关闭。字符搜索、复杂自定义控件代理及菜单外 Tab 自动关闭仍未提供。
424
+
425
+
426
+
427
+ 返回 [AI 索引](../index.md)。先查本页与 [本地 API](./dropdown-api.md);需要更深类型时查 [公开组件导航](../catalog.md),不默认上网查找本包用法。
@@ -0,0 +1,36 @@
1
+ <!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
2
+ # Empty 完整公开 API
3
+
4
+ 适用版本:x-next@1.15.0;来源指纹:`47ea153587c8d0b3bf318977b10bde9f8dd4acff90c5818541ba6513252ad362`。
5
+
6
+ 从同版本构建的公开声明、运行时 props/emits 和显式 expose 生成。运行时导入始终使用 `x-next`,声明路径仅作定位。插槽类型未细化时,具体槽名与作用域见本地用法示例。
7
+
8
+ ## Empty API
9
+
10
+ 公开声明:`dist/components/empty/index.d.ts`。 类型中的 undefined 表示可省略;原始 prop 默认值不等于继承配置或服务默认值。
11
+
12
+ ### Props
13
+
14
+ | 名称 | 用途 | 公开类型 | 必填 | 声明默认值 |
15
+ | --- | --- | --- | --- | --- |
16
+ | description | 描述内容;传入 null 或空字符串时隐藏描述区域 | undefined &#124; null &#124; string | 否 | undefined |
17
+ | imgSrc | 自定义图片地址 | undefined &#124; string | 否 | 未声明 |
18
+ | component | 见场景用法与类型 | undefined &#124; string | 否 | "empty" |
19
+
20
+ ### Events
21
+
22
+ 未声明组件 emits;原生事件与包装透传按本页用法核实。
23
+
24
+ ### Slots
25
+
26
+ | 名称 | 用途 | 公开类型 |
27
+ | --- | --- | --- |
28
+ | default | 自定义描述内容 | 文档列出的实际插槽;公开类型未细化,作用域见场景用法 |
29
+ | image | 自定义图片或图标 | 文档列出的实际插槽;公开类型未细化,作用域见场景用法 |
30
+
31
+ ### 实例方法
32
+
33
+ 没有检索到显式 expose 或 Options API methods 的公开方法;不把 setup 内部函数当成稳定实例 API。
34
+
35
+
36
+ 返回 [Empty 用法](./empty.md)。
@@ -1,12 +1,14 @@
1
1
  <!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
2
2
  # Empty AI 使用
3
3
 
4
- 适用版本:x-next@1.13.0;来源指纹:`18e9b8eefa53b4bd91134fb4486778509ccf3a8d614a1bd387a6d469b623ddcf`。
4
+ 适用版本:x-next@1.15.0;来源指纹:`47ea153587c8d0b3bf318977b10bde9f8dd4acff90c5818541ba6513252ad362`。
5
5
 
6
- 先读 [通用接入](../core.md)。公开导出:`Empty`;模型:无;已核对事件:未在精选映射登记事件;其他 API 见下方用法。
6
+ 先读 [通用接入](../core.md)。公开导出:`Empty`;主要模型:无。完整 Props、Events、Slots、实例方法与服务签名见 [本地 API](./empty-api.md),包含本组件族全部子组件和别名。
7
7
 
8
8
  按需样式:`x-next/style/empty`(包含 base.css、empty.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
9
9
 
10
+ ## 已核验行为与示例
11
+
10
12
  [组件文档与 live demo](https://x-next.yjmf.com/components/empty)。`description` 未传时使用语言包默认文案,`null` 或 `''` 隐藏描述;`imgSrc` 自定义图片,`image` 插槽优先于图片地址。默认插槽替代描述,可放业务操作按钮。
11
13
 
12
14
  没有模型或业务事件;刷新、创建等动作由插槽中的业务控件处理。显式提供描述、图片或插槽时采用调用方配置;裸 Empty 才会交由外层 ConfigProvider 的 `empty` 插槽接管。
@@ -27,4 +29,226 @@ function refresh() { refreshed.value = true; }
27
29
  </template>
28
30
  ```
29
31
 
30
- 返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
32
+ ## 场景用法
33
+
34
+ 以下示例从本地 `src/docs/components/empty.md` 显式导入到独立 AI 源,补齐局部注册、状态和样式后进行严格模板检查。上方已核验行为优先;原始 prop 默认值、包装透传和示例业务适配分别查 [完整 API](./empty-api.md) 与场景说明。类型通过不代表所有散文和交互已验证。
35
+
36
+ ### 用途与选型
37
+
38
+ 用于无数据、搜索无结果或空白占位状态。
39
+
40
+
41
+ ### 何时使用
42
+
43
+ - 列表、表格、选择器等数据容器没有可展示内容时。
44
+ - 搜索、筛选或加载后没有匹配结果时。
45
+ - 需要用轻量占位提示用户当前区域为空时。
46
+
47
+
48
+ ### 基础用法
49
+
50
+ ```vue
51
+ <script setup lang="ts">
52
+ import 'x-next/style.css';
53
+ import { Empty } from 'x-next';
54
+
55
+ </script>
56
+ <template>
57
+ <Empty />
58
+ <Empty description="暂无数据" />
59
+ </template>
60
+ ```
61
+
62
+ ### 无描述
63
+
64
+ ```vue
65
+ <script setup lang="ts">
66
+ import 'x-next/style.css';
67
+ import { Empty } from 'x-next';
68
+
69
+ </script>
70
+ <template>
71
+ <Empty :description="null" />
72
+ </template>
73
+ ```
74
+
75
+ ### 自定义图片
76
+
77
+ ```vue
78
+ <script setup lang="ts">
79
+ import 'x-next/style.css';
80
+ import { Empty } from 'x-next';
81
+ const emptyImageSrc =
82
+ 'data:image/svg+xml;utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" width="96" height="72" viewBox="0 0 96 72"%3E%3Crect x="12" y="10" width="72" height="52" rx="10" fill="%23f8fafc" stroke="%23cbd5e1" stroke-width="2"/%3E%3Cpath d="M30 31h36M30 42h24" stroke="%2394a3b8" stroke-width="6" stroke-linecap="round"/%3E%3C/svg%3E';
83
+ </script>
84
+ <template>
85
+ <Empty :img-src="emptyImageSrc">暂无组件</Empty>
86
+ </template>
87
+ ```
88
+
89
+ ### 自定义 image 插槽
90
+
91
+ ```vue
92
+ <script setup lang="ts">
93
+ import 'x-next/style.css';
94
+ import { Empty } from 'x-next';
95
+
96
+ </script>
97
+ <template>
98
+ <Empty>
99
+ <template #image>
100
+ <span class="empty-image" aria-hidden="true">
101
+ <span class="empty-image-line"></span>
102
+ <span class="empty-image-line is-short"></span>
103
+ </span>
104
+ </template>
105
+ 暂无组件
106
+ </Empty>
107
+ </template>
108
+ <style scoped>
109
+ .empty-image {
110
+ display: inline-flex;
111
+ flex-direction: column;
112
+ justify-content: center;
113
+ width: 72px;
114
+ height: 56px;
115
+ padding: 12px;
116
+ background: #f8fafc;
117
+ border: 1px solid #dbe3ef;
118
+ border-radius: 8px;
119
+ }
120
+
121
+ .empty-image-line {
122
+ width: 100%;
123
+ height: 6px;
124
+ background: #cbd5e1;
125
+ border-radius: 999px;
126
+ }
127
+
128
+ .empty-image-line + .empty-image-line {
129
+ margin-top: 8px;
130
+ }
131
+
132
+ .empty-image-line.is-short {
133
+ width: 62%;
134
+ }
135
+ </style>
136
+ ```
137
+
138
+ ### 自定义图标
139
+
140
+ ```vue
141
+ <script setup lang="ts">
142
+ import 'x-next/style.css';
143
+ import { Empty } from 'x-next';
144
+
145
+ </script>
146
+ <template>
147
+ <Empty description="没有找到匹配结果">
148
+ <template #image>
149
+ <span class="empty-icon">?</span>
150
+ </template>
151
+ </Empty>
152
+ </template>
153
+ <style scoped>
154
+ .empty-icon {
155
+ display: inline-flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ width: 48px;
159
+ height: 48px;
160
+ color: #2563eb;
161
+ font-size: 24px;
162
+ font-weight: 600;
163
+ background: #eff6ff;
164
+ border: 1px solid #bfdbfe;
165
+ border-radius: 50%;
166
+ }
167
+ </style>
168
+ ```
169
+
170
+ ### 自定义描述
171
+
172
+ ```vue
173
+ <script setup lang="ts">
174
+ import 'x-next/style.css';
175
+ import { Empty } from 'x-next';
176
+
177
+ </script>
178
+ <template>
179
+ <Empty>
180
+ <span>当前筛选条件下没有数据,尝试放宽时间范围。</span>
181
+ </Empty>
182
+ </template>
183
+ ```
184
+
185
+ ### 组合空态
186
+
187
+ ```vue
188
+ <script setup lang="ts">
189
+ import 'x-next/style.css';
190
+ import { Select, Empty } from 'x-next';
191
+ import { ref } from 'vue';
192
+
193
+ const value = ref('');
194
+ </script>
195
+ <template>
196
+ <Select v-model="value" allow-search placeholder="搜索成员">
197
+ <template #empty>
198
+ <Empty description="没有匹配成员">
199
+ <template #image>
200
+ <span class="empty-small-icon">0</span>
201
+ </template>
202
+ </Empty>
203
+ </template>
204
+ </Select>
205
+ </template>
206
+ <style scoped>
207
+ .empty-small-icon {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ justify-content: center;
211
+ width: 36px;
212
+ height: 36px;
213
+ color: #64748b;
214
+ font-size: 16px;
215
+ background: #f8fafc;
216
+ border: 1px solid #e2e8f0;
217
+ border-radius: 50%;
218
+ }
219
+ </style>
220
+ ```
221
+
222
+ ### 全局空态配置
223
+
224
+ `Empty` 会读取 `ConfigProvider` 的 `empty` 插槽,回调参数 `component` 标明请求来源(`empty` / `select` / `table` / `dropdown`),便于按组件区分空态。
225
+
226
+ 调用方显式传了 `description`、`imgSrc`、`image` 或默认插槽时以自身配置为准,`empty` 插槽只接管「裸空态」——否则组件上配置的内容会被全局配置静默覆盖。
227
+
228
+ ```vue
229
+ <script setup lang="ts">
230
+ import 'x-next/style.css';
231
+ import { ConfigProvider, Empty, Select } from 'x-next';
232
+ import { ref } from 'vue';
233
+
234
+ const value = ref('');
235
+ </script>
236
+ <template>
237
+ <ConfigProvider>
238
+ <template #empty="{ component }">
239
+ <Empty :description="`${component} 暂无内容`" />
240
+ </template>
241
+ <Empty />
242
+ <Select v-model="value" allow-search placeholder="搜索成员" />
243
+ </ConfigProvider>
244
+ </template>
245
+ ```
246
+
247
+ ### 已知限制
248
+
249
+ - 默认插画是多色美术资源,四层灰阶走 `--x-empty-illustration-*` token,会随亮/暗主题自动换色;它是定稿的图形,不支持通过 `--x-empty-image-color` 改色。需要自定义图形时请用 `imgSrc` 或 `image` 插槽。
250
+ - `empty` 插槽只接管「裸空态」。调用方传了 `description`、`imgSrc`、默认插槽或 `image` 插槽时,以调用方配置为准,不再读取全局配置。
251
+
252
+
253
+
254
+ 返回 [AI 索引](../index.md)。先查本页与 [本地 API](./empty-api.md);需要更深类型时查 [公开组件导航](../catalog.md),不默认上网查找本包用法。