king-design-analyzer 2.1.7 → 2.2.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 (311) hide show
  1. package/components/actions.json +101 -0
  2. package/components/advancedset.json +127 -0
  3. package/components/affix.json +7 -0
  4. package/components/aksk.json +172 -0
  5. package/components/az.json +15 -2
  6. package/components/badge.json +7 -0
  7. package/components/billtypes.json +14 -2
  8. package/components/breadcrumb.json +7 -0
  9. package/components/button.json +191 -0
  10. package/components/buttonlink.json +73 -0
  11. package/components/card.json +8 -1
  12. package/components/cardcol.json +142 -0
  13. package/components/cardcols.json +121 -0
  14. package/components/cardcontent.json +15 -3
  15. package/components/cardtabs.json +172 -0
  16. package/components/carousel.json +7 -0
  17. package/components/cascader.json +520 -368
  18. package/components/checkbox.json +51 -4
  19. package/components/cidrinput.json +140 -0
  20. package/components/code.json +8 -1
  21. package/components/collapse.json +7 -0
  22. package/components/colorpicker.json +217 -0
  23. package/components/copy.json +7 -0
  24. package/components/copyhover.json +111 -0
  25. package/components/copyrow.json +124 -0
  26. package/components/datepicker.json +656 -524
  27. package/components/description.json +98 -0
  28. package/components/dialog.json +522 -455
  29. package/components/divider.json +8 -1
  30. package/components/drawer.json +571 -558
  31. package/components/dropdown.json +464 -384
  32. package/components/duration.json +125 -0
  33. package/components/editable.json +66 -0
  34. package/components/ellipsis.json +34 -1
  35. package/components/filtertablefieldsdialog.json +128 -0
  36. package/components/flex.json +151 -0
  37. package/components/form.json +131 -0
  38. package/components/formiteminput.json +214 -0
  39. package/components/formitemspinner.json +213 -0
  40. package/components/formitemswitch.json +185 -0
  41. package/components/formitemtableconfigs.json +210 -0
  42. package/components/grid.json +7 -0
  43. package/components/header.json +161 -0
  44. package/components/icon.json +13 -1
  45. package/components/icontooltip.json +19 -1
  46. package/components/input.json +188 -4
  47. package/components/instancelist.json +194 -0
  48. package/components/instancenum.json +196 -0
  49. package/components/ipinput.json +117 -0
  50. package/components/kspstatus.json +205 -0
  51. package/components/kvcode.json +120 -0
  52. package/components/layoutcontent.json +15 -3
  53. package/components/layoutlistcontent.json +148 -0
  54. package/components/layoutpermissioncontent.json +155 -0
  55. package/components/layoutstandardlist.json +275 -0
  56. package/components/layouttabs.json +168 -0
  57. package/components/lazymount.json +86 -0
  58. package/components/lazyteleport.json +118 -0
  59. package/components/menu.json +7 -0
  60. package/components/pagination.json +12 -0
  61. package/components/paginationplus.json +30 -3
  62. package/components/password.json +121 -0
  63. package/components/popover.json +457 -437
  64. package/components/projects.json +129 -0
  65. package/components/protable.json +97 -8
  66. package/components/queuevisualrange.json +110 -0
  67. package/components/radio.json +82 -2
  68. package/components/rate.json +199 -0
  69. package/components/region.json +14 -2
  70. package/components/search.json +221 -0
  71. package/components/searchinput.json +132 -0
  72. package/components/searchitems.json +215 -0
  73. package/components/searchselect.json +195 -0
  74. package/components/select.json +686 -666
  75. package/components/sidebar.json +198 -0
  76. package/components/skeleton.json +233 -0
  77. package/components/spin.json +8 -1
  78. package/components/split.json +260 -0
  79. package/components/sshkeys.json +138 -0
  80. package/components/status.json +60 -3
  81. package/components/steps.json +7 -0
  82. package/components/switch.json +8 -1
  83. package/components/table.json +18 -1
  84. package/components/tablecolumnid.json +14 -2
  85. package/components/tabs.json +12 -0
  86. package/components/timeline.json +213 -0
  87. package/components/timepicker.json +147 -3
  88. package/components/timerange.json +262 -0
  89. package/components/tip.json +7 -0
  90. package/components/tooltip.json +484 -395
  91. package/components/tour.json +418 -372
  92. package/components/transfer.json +27 -3
  93. package/components/tree.json +6 -4
  94. package/components/treeselect.json +556 -475
  95. package/components/upload.json +474 -473
  96. package/components/vdialog.json +308 -0
  97. package/components/vdrawer.json +331 -0
  98. package/components/virtuallist.json +7 -0
  99. package/dist/ast/index.d.mts +35 -1
  100. package/dist/ast/index.d.ts +35 -1
  101. package/dist/ast/index.js +5 -3
  102. package/dist/ast/index.mjs +3 -1
  103. package/dist/{chunk-DSWKLUIX.mjs → chunk-3LYQ5XFM.mjs} +1 -1
  104. package/dist/chunk-BI5TIQID.mjs +330 -0
  105. package/dist/{chunk-6QS5IGS6.js → chunk-CJGGFVQJ.js} +8 -8
  106. package/dist/chunk-CR3GC4H3.js +353 -0
  107. package/dist/{chunk-NZ6TLWMD.mjs → chunk-D2SXGGTX.mjs} +28 -17
  108. package/dist/{chunk-D3Y6FGWA.js → chunk-EYKZY2F3.js} +29 -18
  109. package/dist/chunk-JSBRDJBE.js +30 -0
  110. package/dist/chunk-KF5YBEM5.js +143 -0
  111. package/dist/chunk-KMIDURUR.mjs +33324 -0
  112. package/dist/chunk-QC6VTSA3.mjs +117 -0
  113. package/dist/chunk-SZYVGYKK.js +33350 -0
  114. package/dist/{chunk-WYSRJVX4.js → chunk-TA3SV4SP.js} +2 -2
  115. package/dist/chunk-UJCSKKID.mjs +27 -0
  116. package/dist/{chunk-FVSQ6BU6.mjs → chunk-XGPHQHLR.mjs} +4 -4
  117. package/dist/docs/index.js +1 -1
  118. package/dist/docs/index.mjs +1 -1
  119. package/dist/full/index.js +8 -6
  120. package/dist/full/index.mjs +6 -4
  121. package/dist/index.d.mts +1 -0
  122. package/dist/index.d.ts +1 -0
  123. package/dist/index.js +15 -13
  124. package/dist/index.mjs +7 -5
  125. package/dist/metadata/index.d.mts +22 -2
  126. package/dist/metadata/index.d.ts +22 -2
  127. package/dist/metadata/index.js +27 -17
  128. package/dist/metadata/index.mjs +27 -16
  129. package/dist/resolve-BsLBxlBi.d.mts +24 -0
  130. package/dist/resolve-BsLBxlBi.d.ts +24 -0
  131. package/dist/runtime/index.js +5 -4
  132. package/dist/runtime/index.mjs +3 -2
  133. package/dist/shared/index.d.mts +10 -0
  134. package/dist/shared/index.d.ts +10 -0
  135. package/dist/shared/index.js +23 -0
  136. package/dist/shared/index.mjs +2 -0
  137. package/dist/static/index.js +6 -5
  138. package/dist/static/index.mjs +3 -2
  139. package/docs_for_llm/actions.doc.md +77 -0
  140. package/docs_for_llm/advancedset.doc.md +89 -0
  141. package/docs_for_llm/affix.doc.md +15 -7
  142. package/docs_for_llm/aksk.doc.md +111 -0
  143. package/docs_for_llm/az.doc.md +17 -11
  144. package/docs_for_llm/badge.doc.md +6 -5
  145. package/docs_for_llm/billtypes.doc.md +17 -11
  146. package/docs_for_llm/breadcrumb.doc.md +6 -3
  147. package/docs_for_llm/button.doc.md +34 -18
  148. package/docs_for_llm/buttonlink.doc.md +55 -0
  149. package/docs_for_llm/card.doc.md +8 -5
  150. package/docs_for_llm/cardcol.doc.md +78 -0
  151. package/docs_for_llm/cardcols.doc.md +84 -0
  152. package/docs_for_llm/cardcontent.doc.md +10 -10
  153. package/docs_for_llm/cardtabs.doc.md +106 -0
  154. package/docs_for_llm/carousel.doc.md +8 -7
  155. package/docs_for_llm/cascader.doc.md +46 -25
  156. package/docs_for_llm/checkbox.doc.md +25 -13
  157. package/docs_for_llm/cidrinput.doc.md +83 -0
  158. package/docs_for_llm/code.doc.md +22 -11
  159. package/docs_for_llm/collapse.doc.md +9 -6
  160. package/docs_for_llm/colorpicker.doc.md +104 -0
  161. package/docs_for_llm/copy.doc.md +15 -13
  162. package/docs_for_llm/copyhover.doc.md +59 -0
  163. package/docs_for_llm/copyrow.doc.md +71 -0
  164. package/docs_for_llm/datepicker.doc.md +51 -39
  165. package/docs_for_llm/description.doc.md +75 -0
  166. package/docs_for_llm/descriptions.doc.md +9 -6
  167. package/docs_for_llm/dialog.doc.md +48 -77
  168. package/docs_for_llm/divider.doc.md +9 -7
  169. package/docs_for_llm/drawer.doc.md +43 -84
  170. package/docs_for_llm/dropdown.doc.md +52 -21
  171. package/docs_for_llm/duration.doc.md +76 -0
  172. package/docs_for_llm/editable.doc.md +36 -14
  173. package/docs_for_llm/ellipsis.doc.md +10 -5
  174. package/docs_for_llm/filtertablefieldsdialog.doc.md +99 -0
  175. package/docs_for_llm/flex.doc.md +74 -0
  176. package/docs_for_llm/form.doc.md +33 -14
  177. package/docs_for_llm/formiteminput.doc.md +128 -0
  178. package/docs_for_llm/formitemspinner.doc.md +105 -0
  179. package/docs_for_llm/formitemswitch.doc.md +113 -0
  180. package/docs_for_llm/formitemtableconfigs.doc.md +95 -0
  181. package/docs_for_llm/grid.doc.md +7 -5
  182. package/docs_for_llm/header.doc.md +85 -0
  183. package/docs_for_llm/icon.doc.md +12 -8
  184. package/docs_for_llm/icontooltip.doc.md +121 -0
  185. package/docs_for_llm/input.doc.md +90 -39
  186. package/docs_for_llm/instancelist.doc.md +113 -0
  187. package/docs_for_llm/instancenum.doc.md +95 -0
  188. package/docs_for_llm/ipinput.doc.md +77 -0
  189. package/docs_for_llm/kspstatus.doc.md +82 -0
  190. package/docs_for_llm/kvcode.doc.md +76 -0
  191. package/docs_for_llm/layoutcontent.doc.md +17 -17
  192. package/docs_for_llm/layoutlistcontent.doc.md +95 -0
  193. package/docs_for_llm/layoutpermissioncontent.doc.md +84 -0
  194. package/docs_for_llm/layoutstandardlist.doc.md +120 -0
  195. package/docs_for_llm/layouttabs.doc.md +101 -0
  196. package/docs_for_llm/lazymount.doc.md +73 -0
  197. package/docs_for_llm/lazyteleport.doc.md +76 -0
  198. package/docs_for_llm/menu.doc.md +14 -11
  199. package/docs_for_llm/message.doc.md +48 -10
  200. package/docs_for_llm/pagination.doc.md +30 -17
  201. package/docs_for_llm/paginationplus.doc.md +31 -10
  202. package/docs_for_llm/password.doc.md +86 -0
  203. package/docs_for_llm/popover.doc.md +24 -55
  204. package/docs_for_llm/progress.doc.md +13 -10
  205. package/docs_for_llm/projects.doc.md +91 -0
  206. package/docs_for_llm/protable.doc.md +89 -15
  207. package/docs_for_llm/queuevisualrange.doc.md +78 -0
  208. package/docs_for_llm/radio.doc.md +23 -8
  209. package/docs_for_llm/rate.doc.md +122 -0
  210. package/docs_for_llm/region.doc.md +25 -13
  211. package/docs_for_llm/search.doc.md +120 -0
  212. package/docs_for_llm/searchinput.doc.md +111 -0
  213. package/docs_for_llm/searchitems.doc.md +116 -0
  214. package/docs_for_llm/searchselect.doc.md +126 -0
  215. package/docs_for_llm/select.doc.md +40 -55
  216. package/docs_for_llm/sidebar.doc.md +133 -0
  217. package/docs_for_llm/skeleton.doc.md +117 -0
  218. package/docs_for_llm/slider.doc.md +31 -21
  219. package/docs_for_llm/spin.doc.md +8 -5
  220. package/docs_for_llm/spinner.doc.md +28 -18
  221. package/docs_for_llm/split.doc.md +157 -0
  222. package/docs_for_llm/sshkeys.doc.md +88 -0
  223. package/docs_for_llm/status.doc.md +14 -9
  224. package/docs_for_llm/steps.doc.md +10 -7
  225. package/docs_for_llm/switch.doc.md +17 -14
  226. package/docs_for_llm/table.doc.md +118 -51
  227. package/docs_for_llm/tablecolumnid.doc.md +36 -16
  228. package/docs_for_llm/tabs.doc.md +19 -10
  229. package/docs_for_llm/tag.doc.md +19 -10
  230. package/docs_for_llm/timeline.doc.md +109 -0
  231. package/docs_for_llm/timepicker.doc.md +57 -38
  232. package/docs_for_llm/timerange.doc.md +157 -0
  233. package/docs_for_llm/tip.doc.md +20 -11
  234. package/docs_for_llm/tooltip.doc.md +55 -29
  235. package/docs_for_llm/tour.doc.md +48 -29
  236. package/docs_for_llm/transfer.doc.md +40 -29
  237. package/docs_for_llm/tree.doc.md +65 -23
  238. package/docs_for_llm/treeselect.doc.md +37 -48
  239. package/docs_for_llm/upload.doc.md +56 -32
  240. package/docs_for_llm/useCRUD.doc.md +49 -0
  241. package/docs_for_llm/useCountdown.doc.md +43 -0
  242. package/docs_for_llm/useDetail.doc.md +48 -0
  243. package/docs_for_llm/useDialog.doc.md +46 -0
  244. package/docs_for_llm/useEntity.doc.md +45 -0
  245. package/docs_for_llm/useEventListener.doc.md +44 -0
  246. package/docs_for_llm/useFalseUntilTruthy.doc.md +41 -0
  247. package/docs_for_llm/useGetCopyAuthText.doc.md +35 -0
  248. package/docs_for_llm/useGetUserPermission.doc.md +43 -0
  249. package/docs_for_llm/useGroup.doc.md +48 -0
  250. package/docs_for_llm/useIdEntities.doc.md +48 -0
  251. package/docs_for_llm/useIdEntity.doc.md +103 -0
  252. package/docs_for_llm/useInterval.doc.md +43 -0
  253. package/docs_for_llm/useLayoutStandardList.doc.md +38 -0
  254. package/docs_for_llm/useMessage.doc.md +46 -0
  255. package/docs_for_llm/useModifyCache.doc.md +37 -0
  256. package/docs_for_llm/useOpenDialog.doc.md +41 -0
  257. package/docs_for_llm/usePagination.doc.md +60 -0
  258. package/docs_for_llm/usePersist.doc.md +54 -0
  259. package/docs_for_llm/usePoll.doc.md +41 -0
  260. package/docs_for_llm/useRoutePlus.doc.md +34 -0
  261. package/docs_for_llm/useRouterPlus.doc.md +34 -0
  262. package/docs_for_llm/useSearch.doc.md +68 -0
  263. package/docs_for_llm/useShell.doc.md +43 -0
  264. package/docs_for_llm/useSkip.doc.md +41 -0
  265. package/docs_for_llm/useStorageIdEntity.doc.md +46 -0
  266. package/docs_for_llm/useStore.doc.md +34 -0
  267. package/docs_for_llm/useTable.doc.md +57 -0
  268. package/docs_for_llm/useTableGroup.doc.md +47 -0
  269. package/docs_for_llm/useTableSort.doc.md +40 -0
  270. package/docs_for_llm/useToState.doc.md +112 -0
  271. package/docs_for_llm/useUser.doc.md +38 -0
  272. package/docs_for_llm/useValidForm.doc.md +41 -0
  273. package/docs_for_llm/vdialog.doc.md +129 -0
  274. package/docs_for_llm/vdrawer.doc.md +119 -0
  275. package/docs_for_llm/virtuallist.doc.md +6 -3
  276. package/hooks/useCRUD.json +61 -0
  277. package/hooks/useCountdown.json +49 -0
  278. package/hooks/useDetail.json +67 -0
  279. package/hooks/useDialog.json +49 -0
  280. package/hooks/useEntity.json +61 -0
  281. package/hooks/useEventListener.json +61 -0
  282. package/hooks/useFalseUntilTruthy.json +43 -0
  283. package/hooks/useGetCopyAuthText.json +36 -0
  284. package/hooks/useGetUserPermission.json +55 -0
  285. package/hooks/useGroup.json +49 -0
  286. package/hooks/useIdEntities.json +61 -0
  287. package/hooks/useInterval.json +55 -0
  288. package/hooks/useLayoutStandardList.json +36 -0
  289. package/hooks/useMessage.json +73 -0
  290. package/hooks/useModifyCache.json +36 -0
  291. package/hooks/useOpenDialog.json +43 -0
  292. package/hooks/usePagination.json +49 -0
  293. package/hooks/usePersist.json +61 -0
  294. package/hooks/usePoll.json +43 -0
  295. package/hooks/useRoutePlus.json +36 -0
  296. package/hooks/useRouterPlus.json +36 -0
  297. package/hooks/useSearch.json +56 -0
  298. package/hooks/useShell.json +49 -0
  299. package/hooks/useSkip.json +43 -0
  300. package/hooks/useStorageIdEntity.json +67 -0
  301. package/hooks/useStore.json +36 -0
  302. package/hooks/useTable.json +49 -0
  303. package/hooks/useTableGroup.json +43 -0
  304. package/hooks/useTableSort.json +43 -0
  305. package/hooks/useUser.json +36 -0
  306. package/hooks/useValidForm.json +43 -0
  307. package/package.json +12 -6
  308. package/dist/chunk-HDV7ETXE.mjs +0 -1055
  309. package/dist/chunk-HPAUCD5I.js +0 -156
  310. package/dist/chunk-L4DS3EXI.mjs +0 -133
  311. package/dist/chunk-YWY3D4J7.js +0 -1082
@@ -0,0 +1,111 @@
1
+ # 搜索输入框 (SearchInput)
2
+
3
+ 轻量搜索输入框组件,适合工具栏关键词过滤、输入即搜或与列表查询按钮配套使用。
4
+
5
+ **关键词**: search input, keyword search, 输入搜索, 搜索输入框, 关键字过滤, 单字段搜索
6
+
7
+ **使用场景**: 列表页关键字输入、工具栏快捷搜索、确认输入后发起查询
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { SearchInput } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | type | `string` | `"text"` | 否 | 在原生 input 标签的 type 取值的基础上扩展了 textarea 值,当取该值时渲染成 <textarea> | `inherited:Input` | `<Input type="textarea" :rows="4" placeholder="请输入内容" />` |
18
+ | name | `string` | `undefined` | 否 | 原生 input 标签的 name 属性 | `native`, `inherited:Input` | `<Input name="username" />` |
19
+ | placeholder | `string` | `undefined` | 否 | 占位文案 | `native`, `inherited:Input` | `<Input placeholder="请输入内容" />` |
20
+ | readonly | `boolean` | `false` | 否 | 是否只读 | `native`, `inherited:Input` | `<Input v-model="value" readonly />` |
21
+ | autocomplete | `string` | `undefined` | 否 | 原生 autocomplete 属性,指定浏览器自动补全行为 | `native`, `inherited:Input` | `<Input autocomplete="username" />` |
22
+ | autofocus | `boolean` | `undefined` | 否 | 原生 autofocus 属性,页面加载后自动聚焦输入框 | `native`, `inherited:Input` | `<Input autofocus />` |
23
+ | form | `string` | `undefined` | 否 | 原生 form 属性,指定输入框关联的表单 id | `native`, `inherited:Input` | `<Input form="searchForm" />` |
24
+ | maxlength | `number | string` | `undefined` | 否 | 原生 maxlength 属性,限制最大输入长度 | `native`, `inherited:Input` | `<Input :maxlength="50" showCount />` |
25
+ | pattern | `string` | `undefined` | 否 | 原生 pattern 属性,指定输入值需要匹配的正则模式 | `native`, `inherited:Input` | `<Input pattern="[0-9]{6}" placeholder="请输入6位数字" />` |
26
+ | required | `boolean` | `undefined` | 否 | 原生 required 属性,标记为必填输入项 | `native`, `inherited:Input` | `<Input required placeholder="必填项" />` |
27
+ | clearable | `boolean` | `false` | 否 | 是否显示清空按钮 | - | - |
28
+ | disabled | `boolean` | `false` | 否 | 是否禁用 | `inherited:Input` | `<Input disabled placeholder="禁用状态" />` |
29
+ | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 组件尺寸 | `inherited:Input` | `<Input size="large" placeholder="大尺寸输入框" />` |
30
+ | rows | `number | string` | `2` | 否 | 当 type="textarea" 时,默认展示文本行数 | `native`, `inherited:Input` | `<Input type="textarea" :rows="6" />` |
31
+ | cols | `number` | `undefined` | 否 | 原生 cols 属性,当 type="textarea" 时指定可见宽度 | `native`, `inherited:Input` | `<Input type="textarea" :cols="40" />` |
32
+ | datalist | `string` | `undefined` | 否 | 原生 datalist 属性,关联 datalist 元素 id | `native`, `inherited:Input` | `<Input datalist="city-list" />` |
33
+ | dirname | `string` | `undefined` | 否 | 原生 dirname 属性,提交时附带输入方向信息 | `native`, `inherited:Input` | `<Input dirname="comment.dir" />` |
34
+ | wrap | `"hard" | "soft"` | `undefined` | 否 | 原生 wrap 属性,当 type="textarea" 时指定换行提交方式 | `native`, `inherited:Input` | `<Input type="textarea" wrap="hard" />` |
35
+ | autoWidth | `boolean` | `false` | 否 | 是否宽度随输入的文本的长度变化而变化 | `inherited:Input` | `<Input autoWidth placeholder="宽度自适应" />` |
36
+ | fluid | `boolean` | `false` | 否 | 是否宽度 100% | `inherited:Input` | `<Input fluid placeholder="宽度100%" />` |
37
+ | width | `string | number` | `undefined` | 否 | 指定宽度,组件会加上单位 px | `inherited:Input` | `<Input :width="300" placeholder="宽度300px" />` |
38
+ | stackClearIcon | `boolean` | `false` | 否 | 是否将清空按钮覆盖在 suffix 按钮上展示来节省空间 | `inherited:Input` | `<Input clearable stackClearIcon />` |
39
+ | frozenOnInput | `boolean` | `false` | 否 | 是否在输入的过程中冻结 value 更新到视图 | `inherited:Input` | `<Input frozenOnInput />` |
40
+ | inline | `boolean` | `false` | 否 | 是否展示内联模式 | `inherited:Input` | `<Input inline />` |
41
+ | waveDisabled | `boolean` | `false` | 否 | 是否禁用点击波纹效果 | `inherited:Input` | `<Input waveDisabled />` |
42
+ | resize | `"none" | "vertical" | "horizontal" | "both"` | `"vertical"` | 否 | 指定 textarea 输入框拖动调整大小的方向,默认只能垂直方向调整 | `inherited:Input` | `<Input type="textarea" resize="both" />` |
43
+ | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | `inherited:Input` | `<Input flat placeholder="扁平样式" />` |
44
+ | showCount | `boolean` | `false` | 否 | 是否展示字符长度提示数字 | `inherited:Input` | `<Input showCount maxlength="50" />` |
45
+ | showPassword | `boolean` | `false` | 否 | 当 type="password" 时,是否展示显隐密码按钮 | `inherited:Input` | `<Input type="password" showPassword />` |
46
+ | modelValue | `string` | `""` | 否 | 输入框当前值 | - | - |
47
+
48
+ ## 事件 (Events)
49
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
50
+ | --- | --- | --- | --- | --- |
51
+ | clear | `@clear` | 用户清空关键词时触发,通常用于恢复默认列表数据。 | `-` | - |
52
+ | change:value | `@change:value` | 搜索关键词完成一次确认输入时触发,适合发起查询请求。 | `value?: string` | - |
53
+
54
+ ### 事件参数说明
55
+ **change:value**
56
+
57
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
58
+ | --- | --- | --- | --- | --- |
59
+ | value | `string` | 否 | - | 本次确认提交的关键词。 |
60
+
61
+ ## 使用示例
62
+ ### 工具栏关键字过滤
63
+ **场景**: 在工具栏中提供单关键字快速搜索。
64
+
65
+ 在列表工具栏放置一个轻量搜索框,按名称快速过滤资源。
66
+
67
+ **使用的 API**: 属性: modelValue, clearable, placeholder | 事件: change:value, clear
68
+
69
+ ```vue
70
+ <script setup lang="ts">
71
+ import { ref } from 'vue';
72
+ import { SearchInput } from '@ksyun-internal/versatile';
73
+
74
+ const keyword = ref('');
75
+ </script>
76
+
77
+ <template>
78
+ <SearchInput v-model="keyword" :clearable="true" placeholder="搜索实例名称" />
79
+ </template>
80
+ ```
81
+
82
+ ### 监听确认输入发起搜索
83
+ **场景**: 在用户回车或确认输入时再发起一次正式查询。
84
+
85
+ 通过 change:value 在用户确认输入后发起查询。
86
+
87
+ **使用的 API**: 属性: modelValue, placeholder | 事件: change:value
88
+
89
+ ```vue
90
+ <script setup lang="ts">
91
+ import { ref } from 'vue';
92
+ import { SearchInput } from '@ksyun-internal/versatile';
93
+
94
+ const keyword = ref('');
95
+ const handleChange = (value: string) => {
96
+ console.log('query keyword:', value);
97
+ };
98
+ </script>
99
+
100
+ <template>
101
+ <SearchInput
102
+ v-model="keyword"
103
+ placeholder="请输入镜像名称"
104
+ @change:value="handleChange"
105
+ />
106
+ </template>
107
+ ```
108
+
109
+ ## 相关组件
110
+ Search, Input
111
+
@@ -0,0 +1,116 @@
1
+ # 检索项 (SearchItems)
2
+
3
+ 用于展示和管理当前检索条件标签的组件,适合复杂筛选场景中回显用户已选条件,并支持快速删除和清空。
4
+
5
+ **关键词**: search items, filters, filter tags, 检索项, 筛选条件, 条件回显, 搜索标签, 已选条件
6
+
7
+ **使用场景**: 复杂检索条件回显、列表页多条件筛选、已选条件快速删除、列表页筛选状态持久化
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { SearchItems } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | modelValue | `Record<string, string | number>` | `{}` | 否 | 检索项数据对象 | - | - |
18
+ | searchKey | `string` | `""` | 否 | 持久化存储时使用的 key | - | - |
19
+ | title | `string` | `"检索项"` | 否 | 检索项区域标题 | - | - |
20
+ | separator | `string` | `"|"` | 否 | 多值拼接分隔符 | - | - |
21
+ | placeholderSeparator | `string | RegExp` | `/,+|\|+/g` | 否 | 占位分隔符匹配规则 | - | - |
22
+
23
+ ## 事件 (Events)
24
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
25
+ | --- | --- | --- | --- | --- |
26
+ | delete:item | `@delete:item` | 删除单个检索条件时触发,可用于同步列表查询参数。 | `key?: string, value?: SearchItem` | - |
27
+ | delete:all | `@delete:all` | 清空全部检索条件时触发,通常配合重置分页和重新拉取数据。 | `-` | - |
28
+
29
+ ### 事件参数说明
30
+ **delete:item**
31
+
32
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
33
+ | --- | --- | --- | --- | --- |
34
+ | key | `string` | 否 | - | 被删除检索项所属的分组 key,通常对应当前列表或筛选区的唯一标识。 |
35
+ | value | `SearchItem` | 否 | - | 被删除的检索项对象,包含 label、key、text、value 等字段。 |
36
+
37
+ ## 方法 (Methods)
38
+ | 方法名 | 说明 | 参数 | 返回值 |
39
+ | --- | --- | --- | --- |
40
+ | get | 获取当前组件维护的全部检索项,用于外部读取当前筛选状态。 | `-` | `SearchItem[]` |
41
+ | add | 追加一个新的检索条件,并立即同步到当前检索项列表中。 | `searchItem: SearchItem` | `void` |
42
+ | del | 按照给定条件删除一个已存在的检索项。 | `item: Partial<SearchItem>, unique?: boolean, isTriggerEmit?: boolean` | `void` |
43
+ | clear | 清空当前 searchKey 下保存的检索项,常用于重置单个列表视图的筛选状态。 | `-` | `void` |
44
+ | clearAll | 清空组件维护的全部检索项,通常用于一键重置筛选条件。 | `-` | `void` |
45
+
46
+ ### 方法参数说明
47
+ **add**
48
+
49
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
50
+ | --- | --- | --- | --- | --- |
51
+ | searchItem | `SearchItem` | 是 | - | 待追加的检索项对象,通常包含 key、label 和 value。 |
52
+
53
+ **del**
54
+
55
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
56
+ | --- | --- | --- | --- | --- |
57
+ | item | `Partial<SearchItem>` | 是 | - | 用于匹配删除目标的条件对象,可传 key、label 或 value。 |
58
+ | unique | `boolean` | 否 | `false` | 是否按唯一条件精确删除匹配项,适合区分同 key 下的多个候选值。 |
59
+ | isTriggerEmit | `boolean` | 否 | `true` | 删除后是否继续触发组件事件,批量同步内部状态时可按需关闭。 |
60
+
61
+ ## 使用示例
62
+ ### 复杂筛选条件回显
63
+ **场景**: 在复杂列表页中回显并管理用户已选择的过滤条件。
64
+
65
+ 把当前列表的多个过滤条件展示为可删除的检索项。
66
+
67
+ **使用的 API**: 属性: modelValue, searchKey, title | 事件: delete:item, delete:all
68
+
69
+ ```vue
70
+ <script setup lang="ts">
71
+ import { ref } from 'vue';
72
+ import { SearchItems } from '@ksyun-internal/versatile';
73
+
74
+ const filters = ref({
75
+ name: 'web-prod',
76
+ status: 'running',
77
+ project: '核心项目',
78
+ });
79
+ </script>
80
+
81
+ <template>
82
+ <SearchItems v-model="filters" search-key="instance-list" title="当前筛选" />
83
+ </template>
84
+ ```
85
+
86
+ ### 通过组件方法清空检索项
87
+ **场景**: 在切换页签或重置查询条件时,从外部统一清空当前检索项。
88
+
89
+ 使用 ref 调用 clearAll,在切换列表视图时统一重置筛选条件。
90
+
91
+ **使用的 API**: 属性: modelValue, searchKey | 事件: delete:all | 方法: clearAll
92
+
93
+ ```vue
94
+ <script setup lang="ts">
95
+ import { ref } from 'vue';
96
+ import { SearchItems } from '@ksyun-internal/versatile';
97
+
98
+ const searchItemsRef = ref<InstanceType<typeof SearchItems>>();
99
+ const filters = ref({
100
+ name: 'web-prod',
101
+ project: '核心项目',
102
+ });
103
+ const resetFilters = () => {
104
+ searchItemsRef.value?.clearAll();
105
+ };
106
+ </script>
107
+
108
+ <template>
109
+ <button @click="resetFilters">重置全部筛选</button>
110
+ <SearchItems ref="searchItemsRef" v-model="filters" search-key="instance-list" />
111
+ </template>
112
+ ```
113
+
114
+ ## 相关组件
115
+ Search, ProTable
116
+
@@ -0,0 +1,126 @@
1
+ # 搜索下拉框 (SearchSelect)
2
+
3
+ 面向搜索维度或搜索值选择的业务下拉组件,适合在搜索框左侧选择字段,也适合承载小规模筛选选项。
4
+
5
+ **关键词**: search select, search field select, filter select, 下拉搜索, 搜索下拉框, 检索字段选择, 筛选字段, 条件下拉
6
+
7
+ **使用场景**: 搜索类型选择、业务下拉筛选、组合搜索左侧字段切换、小规模筛选项选择
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { SearchSelect } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | multiple | `boolean` | `false` | 否 | 是否支持多选 | `inherited:Select` | `<Select v-model="selectedList" multiple>` |
18
+ | filterable | `boolean` | `false` | 否 | 是否支持筛选,输入时可过滤选项 | `inherited:Select` | `<Select v-model="selected" filterable>` |
19
+ | loading | `boolean` | `false` | 否 | 数据加载状态 | `inherited:Select` | `<Select v-model="selected" :loading="isLoading">` |
20
+ | disabled | `boolean` | `false` | 否 | 是否禁用 | `inherited:Select` | `<Select disabled>` |
21
+ | name | `string` | `undefined` | 否 | 表单元素的 name 属性 | `inherited:Select` | `<Select name="city">` |
22
+ | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 尺寸 | `inherited:Select` | `<Select size="small">` |
23
+ | hideIcon | `boolean` | `false` | 否 | 是否隐藏后面的下拉图标 | `inherited:Select` | `<Select hideIcon>` |
24
+ | clearable | `boolean` | `false` | 否 | 是否可清空已选内容 | `inherited:Select` | `<Select v-model="selected" clearable>` |
25
+ | fluid | `boolean` | `false` | 否 | 是否宽度 100% | `inherited:Select` | `<Select fluid>` |
26
+ | inline | `boolean` | `false` | 否 | 展示内联模式,该模式下组件没有边框,宽度和高度由内容撑开 | `inherited:Select` | `<Select inline>` |
27
+ | placeholder | `string` | `"请选择"` | 否 | 占位文案 | `inherited:Select` | `<Select placeholder="请选择城市">` |
28
+ | container | `string | ((parentDom: Element, anchor: Node | null) => Element)` | `undefined` | 否 | 指定弹出菜单追加的位置,默认 Dialog 组件会追加到 Dialog 中,其他追加到 body | `inherited:Select` | `<Select :container="() => document.body">` |
29
+ | width | `number | string` | `undefined` | 否 | 指定宽度,组件自动添加单位 px | `inherited:Select` | `<Select :width="200">` |
30
+ | filter | `(keywords: string, props: any) => boolean` | `(keywords, props) => props.label.toLowerCase().includes(keywords) || props.value.toLowerCase().includes(keywords)` | 否 | 当支持筛选时,可以自定义筛选规则 | `inherited:Select` | `<Select filterable :filter="(kw, props) => props.label.includes(kw)">` |
31
+ | searchable | `boolean` | `false` | 否 | 是否在弹出菜单中展示搜索框 | `inherited:Select` | `<Select searchable>` |
32
+ | creatable | `boolean` | `false` | 否 | 是否支持创建新的选项,可以配合 filterable 使用 | `inherited:Select` | `<Select filterable creatable>` |
33
+ | labelMap | `Map<any, string>` | `new Map()` | 否 | 建立 value 到 label 的映射,可以在 value 不在 Option 集合中时正确展示 label | `inherited:Select` | `<Select :labelMap="new Map([['custom', '自定义选项']])">` |
34
+ | card | `boolean` | `false` | 否 | 是否展示 card 模式 | `inherited:Select` | `<Select card>` |
35
+ | autoDisableArrow | `boolean` | `false` | 否 | 是否在没有更多可选项时,给箭头一个 disabled 状态来提示用户 | `inherited:Select` | `<Select autoDisableArrow>` |
36
+ | keepKeywords | `boolean` | `true` | 否 | 是否在选中选项后保留搜索关键字,配合 filterable 使用 | `inherited:Select` | `<Select filterable :keepKeywords="false">` |
37
+ | show | `boolean` | `false` | 否 | 是否展示菜单项(受控模式) | `inherited:Select` | `<Select :show="isMenuVisible">` |
38
+ | position | `Position | "left" | "bottom" | "right" | "top"` | `{my: 'left top+8', at: 'left bottom'}` | 否 | 菜单弹出的位置 | `inherited:Select` | `<Select position="top">` |
39
+ | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | `inherited:Select` | `<Select flat>` |
40
+ | nowrap | `boolean` | `false` | 否 | 选中值区域是否不换行展示,适合单行紧凑布局 | `inherited:Select` | `<Select nowrap>` |
41
+ | draggable | `boolean` | `false` | 否 | 多选值是否支持拖动排序 | `inherited:Select` | `<Select multiple draggable>` |
42
+ | virtual | `boolean` | `false` | 否 | 是否开启虚拟列表,用于大数据量场景 | `inherited:Select` | `<Select virtual>` |
43
+ | label | `string` | `undefined` | 否 | 下拉框前置标题或说明文案 | - | - |
44
+ | helper | `string` | `undefined` | 否 | 辅助提示文案 | - | - |
45
+ | modelValue | `string` | `""` | 否 | 当前选中的值 | - | - |
46
+ | searches | `SearchType[] | Record<string, SearchType>` | `[]` | 否 | 搜索选项列表 | - | - |
47
+ | searchKeyName | `string` | `"key"` | 否 | 搜索项中 value 字段名 | - | - |
48
+ | searchLabelName | `string` | `"label"` | 否 | 搜索项中 label 字段名 | - | - |
49
+ | searchGroups | `SearchGroupItem[]` | `undefined` | 否 | 搜索项分组配置 | - | - |
50
+ | showValue | `boolean` | `false` | 否 | 选项展示时是否同时显示 value | - | - |
51
+
52
+ ## 事件 (Events)
53
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
54
+ | --- | --- | --- | --- | --- |
55
+ | change:value | `@change:value` | 下拉选中值变化时触发,通常用于联动输入框占位或直接发起查询。 | `value?: string` | - |
56
+
57
+ ### 事件参数说明
58
+ **change:value**
59
+
60
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
61
+ | --- | --- | --- | --- | --- |
62
+ | value | `string` | 否 | - | 当前选中的搜索项 key。 |
63
+
64
+ ## 使用示例
65
+ ### 选择搜索维度
66
+ **场景**: 在列表搜索区切换当前按哪个字段检索。
67
+
68
+ 在组合搜索中用下拉框切换当前搜索字段。
69
+
70
+ **使用的 API**: 属性: modelValue, label, searches | 事件: change:value
71
+
72
+ ```vue
73
+ <script setup lang="ts">
74
+ import { ref } from 'vue';
75
+ import { SearchSelect } from '@ksyun-internal/versatile';
76
+
77
+ const searchKey = ref('name');
78
+ const searches = [
79
+ { key: 'name', label: '实例名称' },
80
+ { key: 'id', label: '实例 ID' },
81
+ { key: 'ip', label: '内网 IP' },
82
+ ];
83
+ </script>
84
+
85
+ <template>
86
+ <SearchSelect
87
+ v-model="searchKey"
88
+ label="搜索字段"
89
+ :searches="searches"
90
+ />
91
+ </template>
92
+ ```
93
+
94
+ ### 同时展示标签和值
95
+ **场景**: 在字段名称可能重复或歧义较大时同时展示 key 和 label。
96
+
97
+ 在选项较多时同时展示 value,方便用户准确识别字段。
98
+
99
+ **使用的 API**: 属性: modelValue, searches, helper, showValue | 事件: change:value
100
+
101
+ ```vue
102
+ <script setup lang="ts">
103
+ import { ref } from 'vue';
104
+ import { SearchSelect } from '@ksyun-internal/versatile';
105
+
106
+ const searchKey = ref('instanceId');
107
+ const searches = [
108
+ { key: 'instanceId', label: '实例 ID' },
109
+ { key: 'privateIp', label: '内网 IP' },
110
+ { key: 'projectId', label: '项目 ID' },
111
+ ];
112
+ </script>
113
+
114
+ <template>
115
+ <SearchSelect
116
+ v-model="searchKey"
117
+ :searches="searches"
118
+ helper="请选择检索字段"
119
+ :show-value="true"
120
+ />
121
+ </template>
122
+ ```
123
+
124
+ ## 相关组件
125
+ Search, Select
126
+
@@ -12,64 +12,48 @@ import { Select, Option, OptionGroup } from '@king-design/vue';
12
12
  ```
13
13
 
14
14
  ## 属性 (Props)
15
- | 属性名 | 类型 | 默认值 | 必填 | 说明 | 示例 |
16
- | --- | --- | --- | --- | --- | --- |
17
- | value | `any` | `""` | 否 | 当前选择的元素,可用 v-model 双向绑定 | `<Select v-model="selected"></Select>` |
18
- | multiple | `boolean` | `false` | 否 | 是否支持多选 | `<Select v-model="selectedList" multiple></Select>` |
19
- | filterable | `boolean` | `false` | 否 | 是否支持筛选,输入时可过滤选项 | `<Select v-model="selected" filterable></Select>` |
20
- | loading | `boolean` | `false` | 否 | 数据加载状态 | `<Select v-model="selected" :loading="isLoading"></Select>` |
21
- | disabled | `boolean` | `false` | 否 | 是否禁用 | `<Select disabled></Select>` |
22
- | name | `string` | `undefined` | 否 | 表单元素的 name 属性 | `<Select name="city"></Select>` |
23
- | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 尺寸 | `<Select size="small"></Select>` |
24
- | hideIcon | `boolean` | `false` | 否 | 是否隐藏后面的下拉图标 | `<Select hideIcon></Select>` |
25
- | clearable | `boolean` | `false` | 否 | 是否可清空已选内容 | `<Select v-model="selected" clearable></Select>` |
26
- | fluid | `boolean` | `false` | 否 | 是否宽度 100% | `<Select fluid></Select>` |
27
- | inline | `boolean` | `false` | 否 | 展示内联模式,该模式下组件没有边框,宽度和高度由内容撑开 | `<Select inline></Select>` |
28
- | placeholder | `string` | `"请选择"` | 否 | 占位文案 | `<Select placeholder="请选择城市"></Select>` |
29
- | container | `string | ((parentDom: Element, anchor: Node | null) => Element)` | `undefined` | 否 | 指定弹出菜单追加的位置,默认 Dialog 组件会追加到 Dialog 中,其他追加到 body | `<Select :container="() => document.body"></Select>` |
30
- | width | `number | string` | `undefined` | 否 | 指定宽度,组件自动添加单位 px | `<Select :width="200"></Select>` |
31
- | filter | `(keywords: string, props: any) => boolean` | `(keywords, props) => props.label.toLowerCase().includes(keywords) || props.value.toLowerCase().includes(keywords)` | 否 | 当支持筛选时,可以自定义筛选规则 | `<Select filterable :filter="(kw, props) => props.label.includes(kw)"></Select>` |
32
- | searchable | `boolean` | `false` | 否 | 是否在弹出菜单中展示搜索框 | `<Select searchable></Select>` |
33
- | creatable | `boolean` | `false` | 否 | 是否支持创建新的选项,可以配合 filterable 使用 | `<Select filterable creatable></Select>` |
34
- | labelMap | `Map<any, string>` | `new Map()` | 否 | 建立 value 到 label 的映射,可以在 value 不在 Option 集合中时正确展示 label | `<Select :labelMap="new Map([['custom', '自定义选项']])"></Select>` |
35
- | card | `boolean` | `false` | 否 | 是否展示 card 模式 | `<Select card></Select>` |
36
- | autoDisableArrow | `boolean` | `false` | 否 | 是否在没有更多可选项时,给箭头一个 disabled 状态来提示用户 | `<Select autoDisableArrow></Select>` |
37
- | keepKeywords | `boolean` | `true` | 否 | 是否在选中选项后保留搜索关键字,配合 filterable 使用 | `<Select filterable :keepKeywords="false"></Select>` |
38
- | show | `boolean` | `false` | 否 | 是否展示菜单项(受控模式) | `<Select :show="isMenuVisible"></Select>` |
39
- | position | `Position | "left" | "bottom" | "right" | "top"` | `{my: 'left top+8', at: 'left bottom'}` | 否 | 菜单弹出的位置 | `<Select position="top"></Select>` |
40
- | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | `<Select flat></Select>` |
41
- | draggable | `boolean` | `false` | 否 | 多选值是否支持拖动排序 | `<Select multiple draggable></Select>` |
42
- | virtual | `boolean` | `false` | 否 | 是否开启虚拟列表,用于大数据量场景 | `<Select virtual></Select>` |
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | value | `any` | `""` | 否 | 当前选择的元素,可用 v-model 双向绑定 | - | `<Select v-model="selected">` |
18
+ | multiple | `boolean` | `false` | 否 | 是否支持多选 | - | `<Select v-model="selectedList" multiple>` |
19
+ | filterable | `boolean` | `false` | 否 | 是否支持筛选,输入时可过滤选项 | - | `<Select v-model="selected" filterable>` |
20
+ | loading | `boolean` | `false` | 否 | 数据加载状态 | - | `<Select v-model="selected" :loading="isLoading">` |
21
+ | disabled | `boolean` | `false` | 否 | 是否禁用 | - | `<Select disabled>` |
22
+ | name | `string` | `undefined` | 否 | 表单元素的 name 属性 | - | `<Select name="city">` |
23
+ | size | `"large" | "default" | "small" | "mini"` | `"default"` | 否 | 尺寸 | - | `<Select size="small">` |
24
+ | hideIcon | `boolean` | `false` | 否 | 是否隐藏后面的下拉图标 | - | `<Select hideIcon>` |
25
+ | clearable | `boolean` | `false` | 否 | 是否可清空已选内容 | - | `<Select v-model="selected" clearable>` |
26
+ | fluid | `boolean` | `false` | 否 | 是否宽度 100% | - | `<Select fluid>` |
27
+ | inline | `boolean` | `false` | 否 | 展示内联模式,该模式下组件没有边框,宽度和高度由内容撑开 | - | `<Select inline>` |
28
+ | placeholder | `string` | `"请选择"` | 否 | 占位文案 | - | `<Select placeholder="请选择城市">` |
29
+ | container | `string | ((parentDom: Element, anchor: Node | null) => Element)` | `undefined` | 否 | 指定弹出菜单追加的位置,默认 Dialog 组件会追加到 Dialog 中,其他追加到 body | - | `<Select :container="() => document.body">` |
30
+ | width | `number | string` | `undefined` | 否 | 指定宽度,组件自动添加单位 px | - | `<Select :width="200">` |
31
+ | filter | `(keywords: string, props: any) => boolean` | `(keywords, props) => props.label.toLowerCase().includes(keywords) || props.value.toLowerCase().includes(keywords)` | 否 | 当支持筛选时,可以自定义筛选规则 | - | `<Select filterable :filter="(kw, props) => props.label.includes(kw)">` |
32
+ | searchable | `boolean` | `false` | 否 | 是否在弹出菜单中展示搜索框 | - | `<Select searchable>` |
33
+ | creatable | `boolean` | `false` | 否 | 是否支持创建新的选项,可以配合 filterable 使用 | - | `<Select filterable creatable>` |
34
+ | labelMap | `Map<any, string>` | `new Map()` | 否 | 建立 value 到 label 的映射,可以在 value 不在 Option 集合中时正确展示 label | - | `<Select :labelMap="new Map([['custom', '自定义选项']])">` |
35
+ | card | `boolean` | `false` | 否 | 是否展示 card 模式 | - | `<Select card>` |
36
+ | autoDisableArrow | `boolean` | `false` | 否 | 是否在没有更多可选项时,给箭头一个 disabled 状态来提示用户 | - | `<Select autoDisableArrow>` |
37
+ | keepKeywords | `boolean` | `true` | 否 | 是否在选中选项后保留搜索关键字,配合 filterable 使用 | - | `<Select filterable :keepKeywords="false">` |
38
+ | show | `boolean` | `false` | 否 | 是否展示菜单项(受控模式) | - | `<Select :show="isMenuVisible">` |
39
+ | position | `Position | "left" | "bottom" | "right" | "top"` | `{my: 'left top+8', at: 'left bottom'}` | 否 | 菜单弹出的位置 | - | `<Select position="top">` |
40
+ | flat | `boolean` | `false` | 否 | 是否展示扁平样式 | - | `<Select flat>` |
41
+ | nowrap | `boolean` | `false` | 否 | 选中值区域是否不换行展示,适合单行紧凑布局 | - | `<Select nowrap>` |
42
+ | draggable | `boolean` | `false` | 否 | 多选值是否支持拖动排序 | - | `<Select multiple draggable>` |
43
+ | virtual | `boolean` | `false` | 否 | 是否开启虚拟列表,用于大数据量场景 | - | `<Select virtual>` |
43
44
 
44
45
  ## 事件 (Events)
45
46
  | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
46
47
  | --- | --- | --- | --- | --- |
47
- | show | `@show` | 菜单弹出时触发 | `-` | `<Select @show="handleShow"></Select>` |
48
- | hide | `@hide` | 菜单隐藏时触发 | `-` | `<Select @hide="handleHide"></Select>` |
48
+ | show | `@show` | 菜单弹出时触发 | `-` | `<Select @show="handleShow">` |
49
+ | hide | `@hide` | 菜单隐藏时触发 | `-` | `<Select @hide="handleHide">` |
49
50
 
50
- ### 事件处理函数示例
51
- **show**:
52
- ```typescript
53
- const handleShow = () => {
54
- console.log('下拉菜单已展开');
55
- };
56
- ```
57
-
58
- **hide**:
59
- ```typescript
60
- const handleHide = () => {
61
- console.log('下拉菜单已关闭');
62
- };
63
- ```
64
-
65
- ## 插槽 (Slots)
66
- | 插槽名 | 说明 | 模板写法 | 示例 |
51
+ ## 方法 (Methods)
52
+ | 方法名 | 说明 | 参数 | 返回值 |
67
53
  | --- | --- | --- | --- |
68
- | value | 自定义选择结果的展示 | `undefined` | - |
69
- | values | 自定义多选的选择结果的展示 | `undefined` | - |
70
- | prefix | 自定义输入框前面展示的内容 | `undefined` | - |
71
- | suffix | 自定义输入框后面展示的内容 | `undefined` | - |
72
- | menu | 自定义整个菜单的内容 | `undefined` | - |
54
+ | show | 主动展开选择器下拉面板。 | `-` | `void` |
55
+ | hide | 主动关闭选择器下拉面板。 | `-` | `void` |
56
+ | position | 重新计算当前选择器下拉面板的位置。 | `-` | `void` |
73
57
 
74
58
  ## 子组件 (Sub-Components)
75
59
  ### Option
@@ -90,16 +74,15 @@ const handleHide = () => {
90
74
  <Option value="apple" label="苹果" />
91
75
  </OptionGroup>` |
92
76
 
93
- **插槽**:
94
- - `undefined`: 定义复杂的分组标签名
95
-
96
77
  ## 常见错误与正确用法 (Anti-Hallucination)
78
+ ### 多选模式下 value 类型错误
97
79
  > **错误用法**: `const selected = ref('');
98
80
  <Select v-model="selected" multiple>`
99
81
  > **正确写法**: `const selected = ref<string[]>([]);
100
82
  <Select v-model="selected" multiple>`
101
83
  > **说明**: 使用 multiple 多选模式时,value 必须是数组类型,而非字符串
102
84
 
85
+ ### Option 未设置 value 属性
103
86
  > **错误用法**: `<Select v-model="selected">
104
87
  <Option label="苹果" />
105
88
  </Select>`
@@ -108,10 +91,12 @@ const handleHide = () => {
108
91
  </Select>`
109
92
  > **说明**: Option 必须设置 value 属性,否则无法正确绑定选中值
110
93
 
94
+ ### 使用不存在的 size 值 (Select)
111
95
  > **错误用法**: `<Select size="medium">`
112
96
  > **正确写法**: `<Select size="default">`
113
97
  > **说明**: Select 的 size 只支持 large, default, small, mini。常见错误是使用 medium 值。
114
98
 
99
+ ### 使用 creatable 但未启用 filterable
115
100
  > **错误用法**: `<Select creatable>`
116
101
  > **正确写法**: `<Select filterable creatable>`
117
102
  > **说明**: creatable 属性需要配合 filterable 使用,因为创建新选项需要用户输入
@@ -0,0 +1,133 @@
1
+ # 侧边导航 (Sidebar)
2
+
3
+ 用于控制台左侧导航的多层级菜单组件,支持路由联动、展开状态管理和默认选中逻辑。
4
+
5
+ **关键词**: sidebar, navigation, menu tree, 侧边栏, 菜单导航, 多级菜单, 控制台导航, 左侧导航
6
+
7
+ **使用场景**: 控制台左侧导航、多级菜单导航、资源中心侧边菜单、路由驱动的后台导航
8
+
9
+ ## 导入语句
10
+ ```typescript
11
+ import { Sidebar } from '@ksyun-internal/versatile';
12
+ ```
13
+
14
+ ## 属性 (Props)
15
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 | 标签 | 示例 |
16
+ | --- | --- | --- | --- | --- | --- | --- |
17
+ | title | `string` | `undefined` | 否 | 侧边栏标题 | - | - |
18
+ | selectedKey | `Key` | `undefined` | 否 | 当前选中的菜单 key | - | - |
19
+ | expandedKeys | `Key[]` | `undefined` | 否 | 当前展开的菜单 key 列表 | - | - |
20
+ | menus | `Menus` | `undefined` | 是 | 菜单配置树 | - | - |
21
+ | router | `boolean` | `false` | 否 | 是否启用路由模式 | - | - |
22
+ | autoSelectDefault | `boolean` | `true` | 否 | 未匹配到路由时是否自动选中默认菜单项 | - | - |
23
+
24
+ ## 事件 (Events)
25
+ | 事件名 | Vue事件名 | 说明 | 回调参数 | 示例 |
26
+ | --- | --- | --- | --- | --- |
27
+ | update:selectedKey | `@update:selectedKey` | 当前选中菜单 key 变化时触发,可用于同步路由或高亮状态。 | `value?: string` | - |
28
+ | update:expandedKeys | `@update:expandedKeys` | 展开的菜单节点变化时触发,适合持久化用户展开习惯。 | `value?: string[]` | - |
29
+ | update:menuItem | `@update:menuItem` | 当前选中的完整菜单项变化时触发,便于读取标题、路由等附加字段。 | `value?: SidebarMenuItem` | - |
30
+ | change:menus | `@change:menus` | 菜单结构变化时触发,适合动态菜单加载后重新同步状态。 | `value?: SidebarMenuItem[]` | - |
31
+
32
+ ### 事件参数说明
33
+ **update:selectedKey**
34
+
35
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
36
+ | --- | --- | --- | --- | --- |
37
+ | value | `string` | 否 | - | 当前选中的菜单 key。 |
38
+
39
+ **update:expandedKeys**
40
+
41
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
42
+ | --- | --- | --- | --- | --- |
43
+ | value | `string[]` | 否 | - | 当前处于展开状态的菜单 key 列表。 |
44
+
45
+ **update:menuItem**
46
+
47
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
48
+ | --- | --- | --- | --- | --- |
49
+ | value | `SidebarMenuItem` | 否 | - | 当前命中的菜单项对象,包含标题、路由参数和 children 等扩展字段。 |
50
+
51
+ **change:menus**
52
+
53
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
54
+ | --- | --- | --- | --- | --- |
55
+ | value | `SidebarMenuItem[]` | 否 | - | 当前可渲染的菜单树数组,常用于动态菜单加载后做缓存或二次处理。 |
56
+
57
+ ## 使用示例
58
+ ### 控制台侧边导航
59
+ **场景**: 在控制台左侧展示资源管理导航。
60
+
61
+ 渲染一个带二级菜单的控制台导航树。
62
+
63
+ **使用的 API**: 属性: title, selectedKey, expandedKeys, menus | 事件: update:selectedKey, update:expandedKeys
64
+
65
+ ```vue
66
+ <script setup lang="ts">
67
+ import { ref } from 'vue';
68
+ import { Sidebar } from '@ksyun-internal/versatile';
69
+
70
+ const selectedKey = ref('instances');
71
+ const expandedKeys = ref(['compute']);
72
+ const menus = [
73
+ {
74
+ key: 'compute',
75
+ label: '计算',
76
+ children: [
77
+ { key: 'instances', label: '实例列表' },
78
+ { key: 'images', label: '镜像' },
79
+ ],
80
+ },
81
+ ];
82
+ </script>
83
+
84
+ <template>
85
+ <Sidebar
86
+ title="云服务器"
87
+ v-model:selected-key="selectedKey"
88
+ v-model:expanded-keys="expandedKeys"
89
+ :menus="menus"
90
+ />
91
+ </template>
92
+ ```
93
+
94
+ ### 路由模式侧边导航
95
+ **场景**: 在多级控制台中让菜单选中状态与 URL 同步。
96
+
97
+ 在路由驱动的控制台中让侧边栏自动和当前页面同步。
98
+
99
+ **使用的 API**: 属性: selectedKey, expandedKeys, menus, router, autoSelectDefault | 事件: update:selectedKey, update:expandedKeys
100
+
101
+ ```vue
102
+ <script setup lang="ts">
103
+ import { ref } from 'vue';
104
+ import { Sidebar } from '@ksyun-internal/versatile';
105
+
106
+ const selectedKey = ref('dashboard');
107
+ const expandedKeys = ref(['overview']);
108
+ const menus = [
109
+ {
110
+ key: 'overview',
111
+ label: '概览',
112
+ children: [
113
+ { key: 'dashboard', label: '仪表盘' },
114
+ { key: 'alerts', label: '告警中心' },
115
+ ],
116
+ },
117
+ ];
118
+ </script>
119
+
120
+ <template>
121
+ <Sidebar
122
+ v-model:selected-key="selectedKey"
123
+ v-model:expanded-keys="expandedKeys"
124
+ :menus="menus"
125
+ :router="true"
126
+ :auto-select-default="false"
127
+ />
128
+ </template>
129
+ ```
130
+
131
+ ## 相关组件
132
+ Header, LayoutContent
133
+