@element-plus/nightly 0.0.20260423 → 0.0.20260424

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 (678) hide show
  1. package/attributes.json +1 -1
  2. package/dist/index.css +1 -1
  3. package/dist/index.full.js +4761 -4444
  4. package/dist/index.full.min.js +11 -11
  5. package/dist/index.full.min.js.map +1 -1
  6. package/dist/index.full.min.mjs +10 -10
  7. package/dist/index.full.min.mjs.map +1 -1
  8. package/dist/index.full.mjs +4760 -4445
  9. package/dist/locale/af.js +1 -1
  10. package/dist/locale/af.min.js +1 -1
  11. package/dist/locale/af.min.mjs +1 -1
  12. package/dist/locale/af.mjs +1 -1
  13. package/dist/locale/ar-eg.js +1 -1
  14. package/dist/locale/ar-eg.min.js +1 -1
  15. package/dist/locale/ar-eg.min.mjs +1 -1
  16. package/dist/locale/ar-eg.mjs +1 -1
  17. package/dist/locale/ar.js +1 -1
  18. package/dist/locale/ar.min.js +1 -1
  19. package/dist/locale/ar.min.mjs +1 -1
  20. package/dist/locale/ar.mjs +1 -1
  21. package/dist/locale/az.js +1 -1
  22. package/dist/locale/az.min.js +1 -1
  23. package/dist/locale/az.min.mjs +1 -1
  24. package/dist/locale/az.mjs +1 -1
  25. package/dist/locale/bg.js +1 -1
  26. package/dist/locale/bg.min.js +1 -1
  27. package/dist/locale/bg.min.mjs +1 -1
  28. package/dist/locale/bg.mjs +1 -1
  29. package/dist/locale/bn.js +1 -1
  30. package/dist/locale/bn.min.js +1 -1
  31. package/dist/locale/bn.min.mjs +1 -1
  32. package/dist/locale/bn.mjs +1 -1
  33. package/dist/locale/ca.js +1 -1
  34. package/dist/locale/ca.min.js +1 -1
  35. package/dist/locale/ca.min.mjs +1 -1
  36. package/dist/locale/ca.mjs +1 -1
  37. package/dist/locale/ckb.js +1 -1
  38. package/dist/locale/ckb.min.js +1 -1
  39. package/dist/locale/ckb.min.mjs +1 -1
  40. package/dist/locale/ckb.mjs +1 -1
  41. package/dist/locale/cs.js +1 -1
  42. package/dist/locale/cs.min.js +1 -1
  43. package/dist/locale/cs.min.mjs +1 -1
  44. package/dist/locale/cs.mjs +1 -1
  45. package/dist/locale/da.js +1 -1
  46. package/dist/locale/da.min.js +1 -1
  47. package/dist/locale/da.min.mjs +1 -1
  48. package/dist/locale/da.mjs +1 -1
  49. package/dist/locale/de.js +1 -1
  50. package/dist/locale/de.min.js +1 -1
  51. package/dist/locale/de.min.mjs +1 -1
  52. package/dist/locale/de.mjs +1 -1
  53. package/dist/locale/el.js +1 -1
  54. package/dist/locale/el.min.js +1 -1
  55. package/dist/locale/el.min.mjs +1 -1
  56. package/dist/locale/el.mjs +1 -1
  57. package/dist/locale/en.js +1 -1
  58. package/dist/locale/en.min.js +1 -1
  59. package/dist/locale/en.min.mjs +1 -1
  60. package/dist/locale/en.mjs +1 -1
  61. package/dist/locale/eo.js +1 -1
  62. package/dist/locale/eo.min.js +1 -1
  63. package/dist/locale/eo.min.mjs +1 -1
  64. package/dist/locale/eo.mjs +1 -1
  65. package/dist/locale/es.js +1 -1
  66. package/dist/locale/es.min.js +1 -1
  67. package/dist/locale/es.min.mjs +1 -1
  68. package/dist/locale/es.mjs +1 -1
  69. package/dist/locale/et.js +1 -1
  70. package/dist/locale/et.min.js +1 -1
  71. package/dist/locale/et.min.mjs +1 -1
  72. package/dist/locale/et.mjs +1 -1
  73. package/dist/locale/eu.js +1 -1
  74. package/dist/locale/eu.min.js +1 -1
  75. package/dist/locale/eu.min.mjs +1 -1
  76. package/dist/locale/eu.mjs +1 -1
  77. package/dist/locale/fa.js +1 -1
  78. package/dist/locale/fa.min.js +1 -1
  79. package/dist/locale/fa.min.mjs +1 -1
  80. package/dist/locale/fa.mjs +1 -1
  81. package/dist/locale/fi.js +1 -1
  82. package/dist/locale/fi.min.js +1 -1
  83. package/dist/locale/fi.min.mjs +1 -1
  84. package/dist/locale/fi.mjs +1 -1
  85. package/dist/locale/fr.js +1 -1
  86. package/dist/locale/fr.min.js +1 -1
  87. package/dist/locale/fr.min.mjs +1 -1
  88. package/dist/locale/fr.mjs +1 -1
  89. package/dist/locale/he.js +1 -1
  90. package/dist/locale/he.min.js +1 -1
  91. package/dist/locale/he.min.mjs +1 -1
  92. package/dist/locale/he.mjs +1 -1
  93. package/dist/locale/hi.js +1 -1
  94. package/dist/locale/hi.min.js +1 -1
  95. package/dist/locale/hi.min.mjs +1 -1
  96. package/dist/locale/hi.mjs +1 -1
  97. package/dist/locale/hr.js +1 -1
  98. package/dist/locale/hr.min.js +1 -1
  99. package/dist/locale/hr.min.mjs +1 -1
  100. package/dist/locale/hr.mjs +1 -1
  101. package/dist/locale/hu.js +1 -1
  102. package/dist/locale/hu.min.js +1 -1
  103. package/dist/locale/hu.min.mjs +1 -1
  104. package/dist/locale/hu.mjs +1 -1
  105. package/dist/locale/hy-am.js +1 -1
  106. package/dist/locale/hy-am.min.js +1 -1
  107. package/dist/locale/hy-am.min.mjs +1 -1
  108. package/dist/locale/hy-am.mjs +1 -1
  109. package/dist/locale/id.js +1 -1
  110. package/dist/locale/id.min.js +1 -1
  111. package/dist/locale/id.min.mjs +1 -1
  112. package/dist/locale/id.mjs +1 -1
  113. package/dist/locale/it.js +1 -1
  114. package/dist/locale/it.min.js +1 -1
  115. package/dist/locale/it.min.mjs +1 -1
  116. package/dist/locale/it.mjs +1 -1
  117. package/dist/locale/ja.js +1 -1
  118. package/dist/locale/ja.min.js +1 -1
  119. package/dist/locale/ja.min.mjs +1 -1
  120. package/dist/locale/ja.mjs +1 -1
  121. package/dist/locale/kk.js +1 -1
  122. package/dist/locale/kk.min.js +1 -1
  123. package/dist/locale/kk.min.mjs +1 -1
  124. package/dist/locale/kk.mjs +1 -1
  125. package/dist/locale/km.js +1 -1
  126. package/dist/locale/km.min.js +1 -1
  127. package/dist/locale/km.min.mjs +1 -1
  128. package/dist/locale/km.mjs +1 -1
  129. package/dist/locale/ko.js +1 -1
  130. package/dist/locale/ko.min.js +1 -1
  131. package/dist/locale/ko.min.mjs +1 -1
  132. package/dist/locale/ko.mjs +1 -1
  133. package/dist/locale/ku.js +1 -1
  134. package/dist/locale/ku.min.js +1 -1
  135. package/dist/locale/ku.min.mjs +1 -1
  136. package/dist/locale/ku.mjs +1 -1
  137. package/dist/locale/ky.js +1 -1
  138. package/dist/locale/ky.min.js +1 -1
  139. package/dist/locale/ky.min.mjs +1 -1
  140. package/dist/locale/ky.mjs +1 -1
  141. package/dist/locale/lo.js +1 -1
  142. package/dist/locale/lo.min.js +1 -1
  143. package/dist/locale/lo.min.mjs +1 -1
  144. package/dist/locale/lo.mjs +1 -1
  145. package/dist/locale/lt.js +1 -1
  146. package/dist/locale/lt.min.js +1 -1
  147. package/dist/locale/lt.min.mjs +1 -1
  148. package/dist/locale/lt.mjs +1 -1
  149. package/dist/locale/lv.js +1 -1
  150. package/dist/locale/lv.min.js +1 -1
  151. package/dist/locale/lv.min.mjs +1 -1
  152. package/dist/locale/lv.mjs +1 -1
  153. package/dist/locale/mg.js +1 -1
  154. package/dist/locale/mg.min.js +1 -1
  155. package/dist/locale/mg.min.mjs +1 -1
  156. package/dist/locale/mg.mjs +1 -1
  157. package/dist/locale/mn.js +1 -1
  158. package/dist/locale/mn.min.js +1 -1
  159. package/dist/locale/mn.min.mjs +1 -1
  160. package/dist/locale/mn.mjs +1 -1
  161. package/dist/locale/ms.js +1 -1
  162. package/dist/locale/ms.min.js +1 -1
  163. package/dist/locale/ms.min.mjs +1 -1
  164. package/dist/locale/ms.mjs +1 -1
  165. package/dist/locale/my.js +1 -1
  166. package/dist/locale/my.min.js +1 -1
  167. package/dist/locale/my.min.mjs +1 -1
  168. package/dist/locale/my.mjs +1 -1
  169. package/dist/locale/nb-no.js +1 -1
  170. package/dist/locale/nb-no.min.js +1 -1
  171. package/dist/locale/nb-no.min.mjs +1 -1
  172. package/dist/locale/nb-no.mjs +1 -1
  173. package/dist/locale/nl.js +1 -1
  174. package/dist/locale/nl.min.js +1 -1
  175. package/dist/locale/nl.min.mjs +1 -1
  176. package/dist/locale/nl.mjs +1 -1
  177. package/dist/locale/no.js +1 -1
  178. package/dist/locale/no.min.js +1 -1
  179. package/dist/locale/no.min.mjs +1 -1
  180. package/dist/locale/no.mjs +1 -1
  181. package/dist/locale/pa.js +1 -1
  182. package/dist/locale/pa.min.js +1 -1
  183. package/dist/locale/pa.min.mjs +1 -1
  184. package/dist/locale/pa.mjs +1 -1
  185. package/dist/locale/pl.js +1 -1
  186. package/dist/locale/pl.min.js +1 -1
  187. package/dist/locale/pl.min.mjs +1 -1
  188. package/dist/locale/pl.mjs +1 -1
  189. package/dist/locale/pt-br.js +1 -1
  190. package/dist/locale/pt-br.min.js +1 -1
  191. package/dist/locale/pt-br.min.mjs +1 -1
  192. package/dist/locale/pt-br.mjs +1 -1
  193. package/dist/locale/pt.js +1 -1
  194. package/dist/locale/pt.min.js +1 -1
  195. package/dist/locale/pt.min.mjs +1 -1
  196. package/dist/locale/pt.mjs +1 -1
  197. package/dist/locale/ro.js +1 -1
  198. package/dist/locale/ro.min.js +1 -1
  199. package/dist/locale/ro.min.mjs +1 -1
  200. package/dist/locale/ro.mjs +1 -1
  201. package/dist/locale/ru.js +1 -1
  202. package/dist/locale/ru.min.js +1 -1
  203. package/dist/locale/ru.min.mjs +1 -1
  204. package/dist/locale/ru.mjs +1 -1
  205. package/dist/locale/sk.js +1 -1
  206. package/dist/locale/sk.min.js +1 -1
  207. package/dist/locale/sk.min.mjs +1 -1
  208. package/dist/locale/sk.mjs +1 -1
  209. package/dist/locale/sl.js +1 -1
  210. package/dist/locale/sl.min.js +1 -1
  211. package/dist/locale/sl.min.mjs +1 -1
  212. package/dist/locale/sl.mjs +1 -1
  213. package/dist/locale/sr.js +1 -1
  214. package/dist/locale/sr.min.js +1 -1
  215. package/dist/locale/sr.min.mjs +1 -1
  216. package/dist/locale/sr.mjs +1 -1
  217. package/dist/locale/sv.js +1 -1
  218. package/dist/locale/sv.min.js +1 -1
  219. package/dist/locale/sv.min.mjs +1 -1
  220. package/dist/locale/sv.mjs +1 -1
  221. package/dist/locale/sw.js +1 -1
  222. package/dist/locale/sw.min.js +1 -1
  223. package/dist/locale/sw.min.mjs +1 -1
  224. package/dist/locale/sw.mjs +1 -1
  225. package/dist/locale/ta.js +1 -1
  226. package/dist/locale/ta.min.js +1 -1
  227. package/dist/locale/ta.min.mjs +1 -1
  228. package/dist/locale/ta.mjs +1 -1
  229. package/dist/locale/te.js +1 -1
  230. package/dist/locale/te.min.js +1 -1
  231. package/dist/locale/te.min.mjs +1 -1
  232. package/dist/locale/te.mjs +1 -1
  233. package/dist/locale/th.js +1 -1
  234. package/dist/locale/th.min.js +1 -1
  235. package/dist/locale/th.min.mjs +1 -1
  236. package/dist/locale/th.mjs +1 -1
  237. package/dist/locale/tk.js +1 -1
  238. package/dist/locale/tk.min.js +1 -1
  239. package/dist/locale/tk.min.mjs +1 -1
  240. package/dist/locale/tk.mjs +1 -1
  241. package/dist/locale/tr.js +1 -1
  242. package/dist/locale/tr.min.js +1 -1
  243. package/dist/locale/tr.min.mjs +1 -1
  244. package/dist/locale/tr.mjs +1 -1
  245. package/dist/locale/ug-cn.js +1 -1
  246. package/dist/locale/ug-cn.min.js +1 -1
  247. package/dist/locale/ug-cn.min.mjs +1 -1
  248. package/dist/locale/ug-cn.mjs +1 -1
  249. package/dist/locale/uk.js +1 -1
  250. package/dist/locale/uk.min.js +1 -1
  251. package/dist/locale/uk.min.mjs +1 -1
  252. package/dist/locale/uk.mjs +1 -1
  253. package/dist/locale/uz-uz.js +1 -1
  254. package/dist/locale/uz-uz.min.js +1 -1
  255. package/dist/locale/uz-uz.min.mjs +1 -1
  256. package/dist/locale/uz-uz.mjs +1 -1
  257. package/dist/locale/vi.js +1 -1
  258. package/dist/locale/vi.min.js +1 -1
  259. package/dist/locale/vi.min.mjs +1 -1
  260. package/dist/locale/vi.mjs +1 -1
  261. package/dist/locale/zh-cn.js +1 -1
  262. package/dist/locale/zh-cn.min.js +1 -1
  263. package/dist/locale/zh-cn.min.mjs +1 -1
  264. package/dist/locale/zh-cn.mjs +1 -1
  265. package/dist/locale/zh-hk.js +1 -1
  266. package/dist/locale/zh-hk.min.js +1 -1
  267. package/dist/locale/zh-hk.min.mjs +1 -1
  268. package/dist/locale/zh-hk.mjs +1 -1
  269. package/dist/locale/zh-mo.js +1 -1
  270. package/dist/locale/zh-mo.min.js +1 -1
  271. package/dist/locale/zh-mo.min.mjs +1 -1
  272. package/dist/locale/zh-mo.mjs +1 -1
  273. package/dist/locale/zh-tw.js +1 -1
  274. package/dist/locale/zh-tw.min.js +1 -1
  275. package/dist/locale/zh-tw.min.mjs +1 -1
  276. package/dist/locale/zh-tw.mjs +1 -1
  277. package/es/components/affix/src/affix.d.ts +1 -1
  278. package/es/components/affix/src/affix.vue.d.ts +3 -3
  279. package/es/components/alert/src/alert.d.ts +1 -1
  280. package/es/components/alert/src/alert.vue.d.ts +1 -1
  281. package/es/components/anchor/src/anchor.d.ts +1 -1
  282. package/es/components/autocomplete/src/autocomplete.d.ts +2 -2
  283. package/es/components/autocomplete/src/autocomplete.vue.d.ts +5 -5
  284. package/es/components/avatar/src/avatar-group-props.d.ts +1 -1
  285. package/es/components/avatar/src/avatar-group.d.ts +3 -3
  286. package/es/components/avatar/src/avatar.d.ts +2 -2
  287. package/es/components/backtop/src/backtop.vue.d.ts +1 -1
  288. package/es/components/badge/src/badge.d.ts +1 -1
  289. package/es/components/button/src/button-group.vue.d.ts +1 -1
  290. package/es/components/button/src/button.d.ts +1 -1
  291. package/es/components/button/src/button.vue.d.ts +1 -1
  292. package/es/components/calendar/src/calendar.d.ts +1 -1
  293. package/es/components/calendar/src/calendar.vue.d.ts +1 -1
  294. package/es/components/card/src/card.d.ts +1 -1
  295. package/es/components/card/src/card.vue.d.ts +1 -1
  296. package/es/components/carousel/src/carousel.d.ts +2 -2
  297. package/es/components/carousel/src/carousel.vue.d.ts +2 -2
  298. package/es/components/cascader/src/cascader.d.ts +11 -3
  299. package/es/components/cascader/src/cascader.mjs +4 -0
  300. package/es/components/cascader/src/cascader.mjs.map +1 -1
  301. package/es/components/cascader/src/cascader.vue.d.ts +24 -16
  302. package/es/components/cascader/src/cascader.vue_vue_type_script_setup_true_lang.mjs +155 -29
  303. package/es/components/cascader/src/cascader.vue_vue_type_script_setup_true_lang.mjs.map +1 -1
  304. package/es/components/cascader/src/cascader2.mjs.map +1 -1
  305. package/es/components/cascader-panel/index.d.ts +2 -2
  306. package/es/components/cascader-panel/index.mjs +2 -2
  307. package/es/components/cascader-panel/src/config.d.ts +27 -1
  308. package/es/components/cascader-panel/src/config.mjs +18 -1
  309. package/es/components/cascader-panel/src/config.mjs.map +1 -1
  310. package/es/components/cascader-panel/src/index.mjs.map +1 -1
  311. package/es/components/cascader-panel/src/index.vue.d.ts +7 -5
  312. package/es/components/cascader-panel/src/index.vue_vue_type_script_setup_true_lang.mjs +44 -5
  313. package/es/components/cascader-panel/src/index.vue_vue_type_script_setup_true_lang.mjs.map +1 -1
  314. package/es/components/cascader-panel/src/menu.mjs.map +1 -1
  315. package/es/components/cascader-panel/src/menu.vue.d.ts +23 -22
  316. package/es/components/cascader-panel/src/menu.vue_vue_type_script_setup_true_lang.mjs +120 -6
  317. package/es/components/cascader-panel/src/menu.vue_vue_type_script_setup_true_lang.mjs.map +1 -1
  318. package/es/components/cascader-panel/src/node.vue_vue_type_script_setup_true_lang.mjs +4 -1
  319. package/es/components/cascader-panel/src/node.vue_vue_type_script_setup_true_lang.mjs.map +1 -1
  320. package/es/components/cascader-panel/src/node2.mjs.map +1 -1
  321. package/es/components/cascader-panel/src/types.d.ts +3 -0
  322. package/es/components/cascader-panel/src/types.mjs.map +1 -1
  323. package/es/components/cascader-panel/style/css.mjs +1 -1
  324. package/es/components/cascader-panel/style/index.mjs +1 -1
  325. package/es/components/check-tag/src/check-tag.d.ts +1 -1
  326. package/es/components/checkbox/src/checkbox-button.vue.d.ts +6 -6
  327. package/es/components/checkbox/src/checkbox-group.vue.d.ts +2 -2
  328. package/es/components/checkbox/src/checkbox.d.ts +8 -8
  329. package/es/components/checkbox/src/checkbox.vue.d.ts +6 -6
  330. package/es/components/col/src/col.vue.d.ts +1 -1
  331. package/es/components/collapse/src/collapse-item.vue.d.ts +1 -1
  332. package/es/components/collapse/src/collapse.vue.d.ts +2 -2
  333. package/es/components/color-picker/src/color-picker.vue.d.ts +7 -7
  334. package/es/components/config-provider/src/config-provider.d.ts +1 -1
  335. package/es/components/date-picker/src/date-picker.d.ts +7 -7
  336. package/es/components/date-picker/src/props.d.ts +2 -2
  337. package/es/components/date-picker-panel/src/date-picker-panel.d.ts +4 -4
  338. package/es/components/date-picker-panel/src/props/date-picker-panel.d.ts +1 -1
  339. package/es/components/descriptions/src/description-item.d.ts +12 -12
  340. package/es/components/descriptions/src/description.vue.d.ts +1 -1
  341. package/es/components/dialog/src/dialog.vue.d.ts +4 -4
  342. package/es/components/drawer/src/drawer.vue.d.ts +6 -6
  343. package/es/components/dropdown/src/dropdown-item.vue.d.ts +6 -6
  344. package/es/components/dropdown/src/dropdown-menu.vue.d.ts +1 -1
  345. package/es/components/dropdown/src/dropdown.d.ts +4 -4
  346. package/es/components/dropdown/src/dropdown.vue.d.ts +84 -84
  347. package/es/components/focus-trap/src/focus-trap.vue.d.ts +1 -1
  348. package/es/components/image/src/image.d.ts +1 -1
  349. package/es/components/image/src/image.vue.d.ts +7 -7
  350. package/es/components/image-viewer/src/image-viewer.vue.d.ts +4 -4
  351. package/es/components/index.d.ts +11 -11
  352. package/es/components/index.mjs +7 -7
  353. package/es/components/input/src/input.d.ts +1 -1
  354. package/es/components/input/src/input.vue.d.ts +14 -14
  355. package/es/components/input-number/src/input-number.d.ts +1 -1
  356. package/es/components/input-number/src/input-number.vue.d.ts +8 -8
  357. package/es/components/input-otp/src/input-otp.vue.d.ts +6 -6
  358. package/es/components/input-tag/src/input-tag.d.ts +1 -1
  359. package/es/components/input-tag/src/input-tag.vue.d.ts +10 -10
  360. package/es/components/link/src/link.d.ts +2 -2
  361. package/es/components/link/src/link.vue.d.ts +1 -1
  362. package/es/components/mention/src/mention.d.ts +2 -2
  363. package/es/components/mention/src/mention.vue.d.ts +5 -5
  364. package/es/components/menu/src/menu.d.ts +10 -10
  365. package/es/components/menu/src/sub-menu.d.ts +1 -1
  366. package/es/components/message/src/message.d.ts +2 -2
  367. package/es/components/message/src/message.vue.d.ts +6 -6
  368. package/es/components/message-box/index.d.ts +2 -2
  369. package/es/components/message-box/src/message-box.type.d.ts +9 -3
  370. package/es/components/message-box/src/messageBox.mjs +9 -1
  371. package/es/components/message-box/src/messageBox.mjs.map +1 -1
  372. package/es/components/notification/src/notification.d.ts +2 -2
  373. package/es/components/notification/src/notification.vue.d.ts +5 -5
  374. package/es/components/page-header/src/page-header.vue.d.ts +1 -1
  375. package/es/components/pagination/src/pagination.d.ts +3 -3
  376. package/es/components/popconfirm/src/popconfirm.d.ts +2 -2
  377. package/es/components/popconfirm/src/popconfirm.vue.d.ts +5 -5
  378. package/es/components/popover/src/popover.d.ts +2 -2
  379. package/es/components/popover/src/popover.vue.d.ts +11 -11
  380. package/es/components/popper/src/composables/use-content.d.ts +1 -1
  381. package/es/components/popper/src/composables/use-focus-trap.d.ts +1 -1
  382. package/es/components/popper/src/content.d.ts +4 -4
  383. package/es/components/popper/src/content.vue.d.ts +15 -15
  384. package/es/components/popper/src/popper.d.ts +2 -2
  385. package/es/components/progress/src/progress.d.ts +2 -2
  386. package/es/components/progress/src/progress.vue.d.ts +1 -1
  387. package/es/components/radio/src/radio-button.d.ts +3 -3
  388. package/es/components/radio/src/radio-button.vue.d.ts +3 -3
  389. package/es/components/radio/src/radio-group.vue.d.ts +5 -5
  390. package/es/components/radio/src/radio.d.ts +6 -6
  391. package/es/components/radio/src/radio.vue.d.ts +5 -5
  392. package/es/components/rate/src/rate.vue.d.ts +4 -4
  393. package/es/components/result/src/result.d.ts +1 -1
  394. package/es/components/result/src/result.vue.d.ts +1 -1
  395. package/es/components/row/src/row.d.ts +2 -2
  396. package/es/components/scrollbar/src/scrollbar.vue.d.ts +1 -1
  397. package/es/components/segmented/index.d.ts +3 -3
  398. package/es/components/segmented/src/segmented.d.ts +1 -1
  399. package/es/components/segmented/src/segmented.vue.d.ts +2 -2
  400. package/es/components/select/src/option.d.ts +2 -2
  401. package/es/components/select/src/option.vue.d.ts +5 -5
  402. package/es/components/select/src/select.d.ts +4 -4
  403. package/es/components/select/src/select.vue.d.ts +96 -96
  404. package/es/components/select-v2/src/defaults.d.ts +2 -2
  405. package/es/components/select-v2/src/select-dropdown.d.ts +2 -2
  406. package/es/components/select-v2/src/select.vue.d.ts +80 -80
  407. package/es/components/skeleton/src/skeleton-item.d.ts +1 -1
  408. package/es/components/slider/src/button.vue.d.ts +1 -1
  409. package/es/components/slider/src/slider.vue.d.ts +6 -6
  410. package/es/components/space/src/space.d.ts +2 -2
  411. package/es/components/splitter/src/splitter.vue.d.ts +2 -2
  412. package/es/components/steps/src/item.d.ts +1 -1
  413. package/es/components/steps/src/item.vue.d.ts +2 -2
  414. package/es/components/steps/src/steps.d.ts +2 -2
  415. package/es/components/steps/src/steps.vue.d.ts +1 -1
  416. package/es/components/switch/src/switch.vue.d.ts +5 -5
  417. package/es/components/table/src/table-column/index.d.ts +24 -24
  418. package/es/components/table/src/table-header/index.d.ts +19 -19
  419. package/es/components/table/src/table-layout.d.ts +1 -0
  420. package/es/components/table/src/table-layout.mjs +5 -1
  421. package/es/components/table/src/table-layout.mjs.map +1 -1
  422. package/es/components/table/src/table.vue.d.ts +39 -39
  423. package/es/components/table-v2/src/components/row.d.ts +1 -1
  424. package/es/components/table-v2/src/table-grid.d.ts +2 -2
  425. package/es/components/table-v2/src/table-v2.d.ts +2 -2
  426. package/es/components/table-v2/style/css.mjs +1 -1
  427. package/es/components/table-v2/style/index.mjs +1 -1
  428. package/es/components/tabs/src/tab-nav.d.ts +1 -1
  429. package/es/components/tabs/src/tabs.d.ts +5 -5
  430. package/es/components/tag/src/tag.d.ts +1 -1
  431. package/es/components/tag/src/tag.vue.d.ts +2 -2
  432. package/es/components/text/src/text.d.ts +1 -1
  433. package/es/components/text/src/text.vue.d.ts +1 -1
  434. package/es/components/time-picker/src/common/picker.vue.d.ts +11 -11
  435. package/es/components/time-picker/src/common/props.d.ts +2 -2
  436. package/es/components/time-picker/src/time-picker.d.ts +7 -7
  437. package/es/components/time-select/src/time-select.vue.d.ts +9 -9
  438. package/es/components/timeline/src/timeline-item.d.ts +3 -3
  439. package/es/components/timeline/src/timeline-item.vue.d.ts +1 -1
  440. package/es/components/tooltip/src/content.d.ts +1 -1
  441. package/es/components/tooltip/src/content.vue.d.ts +15 -15
  442. package/es/components/tooltip/src/tooltip.d.ts +3 -3
  443. package/es/components/tooltip/src/tooltip.vue.d.ts +19 -19
  444. package/es/components/tooltip/src/trigger.d.ts +1 -1
  445. package/es/components/tour/src/content.d.ts +2 -2
  446. package/es/components/tour/src/step.d.ts +1 -1
  447. package/es/components/tour/src/tour.d.ts +1 -1
  448. package/es/components/tour/src/tour.vue.d.ts +6 -6
  449. package/es/components/transfer/src/transfer.vue.d.ts +2 -2
  450. package/es/components/tree/src/tree.vue.d.ts +20 -20
  451. package/es/components/tree-select/src/tree-select.vue.d.ts +22 -22
  452. package/es/components/tree-v2/src/tree.vue.d.ts +3 -3
  453. package/es/components/upload/src/upload-content.d.ts +1 -1
  454. package/es/components/upload/src/upload-content.vue.d.ts +1 -1
  455. package/es/components/upload/src/upload-list.d.ts +1 -1
  456. package/es/components/upload/src/upload.d.ts +2 -2
  457. package/es/components/upload/src/upload.vue.d.ts +2 -2
  458. package/es/components/virtual-list/src/builders/build-grid.d.ts +15 -3
  459. package/es/components/virtual-list/src/builders/build-list.mjs +2 -1
  460. package/es/components/virtual-list/src/builders/build-list.mjs.map +1 -1
  461. package/es/components/virtual-list/src/components/dynamic-size-grid.d.ts +15 -3
  462. package/es/components/virtual-list/src/components/dynamic-size-list.d.ts +17 -5
  463. package/es/components/virtual-list/src/components/fixed-size-grid.d.ts +15 -3
  464. package/es/components/virtual-list/src/components/fixed-size-list.d.ts +17 -5
  465. package/es/components/virtual-list/src/props.d.ts +18 -0
  466. package/es/components/virtual-list/src/props.mjs +4 -0
  467. package/es/components/virtual-list/src/props.mjs.map +1 -1
  468. package/es/hooks/use-floating/index.d.ts +4 -4
  469. package/es/hooks/use-popper/index.d.ts +1 -1
  470. package/es/index.d.ts +10 -10
  471. package/es/index.mjs +7 -7
  472. package/es/version.mjs +1 -1
  473. package/es/version.mjs.map +1 -1
  474. package/lib/components/affix/src/affix.d.ts +1 -1
  475. package/lib/components/affix/src/affix.vue.d.ts +3 -3
  476. package/lib/components/alert/src/alert.d.ts +1 -1
  477. package/lib/components/alert/src/alert.vue.d.ts +1 -1
  478. package/lib/components/anchor/src/anchor.d.ts +1 -1
  479. package/lib/components/autocomplete/src/autocomplete.d.ts +2 -2
  480. package/lib/components/autocomplete/src/autocomplete.vue.d.ts +5 -5
  481. package/lib/components/avatar/src/avatar-group-props.d.ts +1 -1
  482. package/lib/components/avatar/src/avatar-group.d.ts +3 -3
  483. package/lib/components/avatar/src/avatar.d.ts +2 -2
  484. package/lib/components/backtop/src/backtop.vue.d.ts +1 -1
  485. package/lib/components/badge/src/badge.d.ts +1 -1
  486. package/lib/components/button/src/button-group.vue.d.ts +1 -1
  487. package/lib/components/button/src/button.d.ts +1 -1
  488. package/lib/components/button/src/button.vue.d.ts +1 -1
  489. package/lib/components/calendar/src/calendar.d.ts +1 -1
  490. package/lib/components/calendar/src/calendar.vue.d.ts +1 -1
  491. package/lib/components/card/src/card.d.ts +1 -1
  492. package/lib/components/card/src/card.vue.d.ts +1 -1
  493. package/lib/components/carousel/src/carousel.d.ts +2 -2
  494. package/lib/components/carousel/src/carousel.vue.d.ts +2 -2
  495. package/lib/components/cascader/src/cascader.d.ts +11 -3
  496. package/lib/components/cascader/src/cascader.js +4 -0
  497. package/lib/components/cascader/src/cascader.js.map +1 -1
  498. package/lib/components/cascader/src/cascader.vue.d.ts +24 -16
  499. package/lib/components/cascader/src/cascader.vue_vue_type_script_setup_true_lang.js +154 -27
  500. package/lib/components/cascader/src/cascader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  501. package/lib/components/cascader/src/cascader2.js.map +1 -1
  502. package/lib/components/cascader-panel/index.d.ts +2 -2
  503. package/lib/components/cascader-panel/index.js +2 -0
  504. package/lib/components/cascader-panel/src/config.d.ts +27 -1
  505. package/lib/components/cascader-panel/src/config.js +19 -0
  506. package/lib/components/cascader-panel/src/config.js.map +1 -1
  507. package/lib/components/cascader-panel/src/index.js.map +1 -1
  508. package/lib/components/cascader-panel/src/index.vue.d.ts +7 -5
  509. package/lib/components/cascader-panel/src/index.vue_vue_type_script_setup_true_lang.js +44 -5
  510. package/lib/components/cascader-panel/src/index.vue_vue_type_script_setup_true_lang.js.map +1 -1
  511. package/lib/components/cascader-panel/src/menu.js.map +1 -1
  512. package/lib/components/cascader-panel/src/menu.vue.d.ts +23 -22
  513. package/lib/components/cascader-panel/src/menu.vue_vue_type_script_setup_true_lang.js +119 -5
  514. package/lib/components/cascader-panel/src/menu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  515. package/lib/components/cascader-panel/src/node.vue_vue_type_script_setup_true_lang.js +4 -1
  516. package/lib/components/cascader-panel/src/node.vue_vue_type_script_setup_true_lang.js.map +1 -1
  517. package/lib/components/cascader-panel/src/node2.js.map +1 -1
  518. package/lib/components/cascader-panel/src/types.d.ts +3 -0
  519. package/lib/components/cascader-panel/src/types.js.map +1 -1
  520. package/lib/components/cascader-panel/style/css.js +1 -1
  521. package/lib/components/cascader-panel/style/index.js +1 -1
  522. package/lib/components/check-tag/src/check-tag.d.ts +1 -1
  523. package/lib/components/checkbox/src/checkbox-button.vue.d.ts +6 -6
  524. package/lib/components/checkbox/src/checkbox-group.vue.d.ts +2 -2
  525. package/lib/components/checkbox/src/checkbox.d.ts +8 -8
  526. package/lib/components/checkbox/src/checkbox.vue.d.ts +6 -6
  527. package/lib/components/col/src/col.vue.d.ts +1 -1
  528. package/lib/components/collapse/src/collapse-item.vue.d.ts +1 -1
  529. package/lib/components/collapse/src/collapse.vue.d.ts +2 -2
  530. package/lib/components/color-picker/src/color-picker.vue.d.ts +7 -7
  531. package/lib/components/config-provider/src/config-provider.d.ts +1 -1
  532. package/lib/components/date-picker/src/date-picker.d.ts +7 -7
  533. package/lib/components/date-picker/src/props.d.ts +2 -2
  534. package/lib/components/date-picker-panel/src/date-picker-panel.d.ts +4 -4
  535. package/lib/components/date-picker-panel/src/props/date-picker-panel.d.ts +1 -1
  536. package/lib/components/descriptions/src/description-item.d.ts +12 -12
  537. package/lib/components/descriptions/src/description.vue.d.ts +1 -1
  538. package/lib/components/dialog/src/dialog.vue.d.ts +4 -4
  539. package/lib/components/drawer/src/drawer.vue.d.ts +6 -6
  540. package/lib/components/dropdown/src/dropdown-item.vue.d.ts +6 -6
  541. package/lib/components/dropdown/src/dropdown-menu.vue.d.ts +1 -1
  542. package/lib/components/dropdown/src/dropdown.d.ts +4 -4
  543. package/lib/components/dropdown/src/dropdown.vue.d.ts +84 -84
  544. package/lib/components/focus-trap/src/focus-trap.vue.d.ts +1 -1
  545. package/lib/components/image/src/image.d.ts +1 -1
  546. package/lib/components/image/src/image.vue.d.ts +7 -7
  547. package/lib/components/image-viewer/src/image-viewer.vue.d.ts +4 -4
  548. package/lib/components/index.d.ts +11 -11
  549. package/lib/components/index.js +13 -11
  550. package/lib/components/input/src/input.d.ts +1 -1
  551. package/lib/components/input/src/input.vue.d.ts +14 -14
  552. package/lib/components/input-number/src/input-number.d.ts +1 -1
  553. package/lib/components/input-number/src/input-number.vue.d.ts +8 -8
  554. package/lib/components/input-otp/src/input-otp.vue.d.ts +6 -6
  555. package/lib/components/input-tag/src/input-tag.d.ts +1 -1
  556. package/lib/components/input-tag/src/input-tag.vue.d.ts +10 -10
  557. package/lib/components/link/src/link.d.ts +2 -2
  558. package/lib/components/link/src/link.vue.d.ts +1 -1
  559. package/lib/components/mention/src/mention.d.ts +2 -2
  560. package/lib/components/mention/src/mention.vue.d.ts +5 -5
  561. package/lib/components/menu/src/menu.d.ts +10 -10
  562. package/lib/components/menu/src/sub-menu.d.ts +1 -1
  563. package/lib/components/message/src/message.d.ts +2 -2
  564. package/lib/components/message/src/message.vue.d.ts +6 -6
  565. package/lib/components/message-box/index.d.ts +2 -2
  566. package/lib/components/message-box/src/message-box.type.d.ts +9 -3
  567. package/lib/components/message-box/src/messageBox.js +9 -1
  568. package/lib/components/message-box/src/messageBox.js.map +1 -1
  569. package/lib/components/notification/src/notification.d.ts +2 -2
  570. package/lib/components/notification/src/notification.vue.d.ts +5 -5
  571. package/lib/components/page-header/src/page-header.vue.d.ts +1 -1
  572. package/lib/components/pagination/src/pagination.d.ts +3 -3
  573. package/lib/components/popconfirm/src/popconfirm.d.ts +2 -2
  574. package/lib/components/popconfirm/src/popconfirm.vue.d.ts +5 -5
  575. package/lib/components/popover/src/popover.d.ts +2 -2
  576. package/lib/components/popover/src/popover.vue.d.ts +11 -11
  577. package/lib/components/popper/src/composables/use-content.d.ts +1 -1
  578. package/lib/components/popper/src/composables/use-focus-trap.d.ts +1 -1
  579. package/lib/components/popper/src/content.d.ts +4 -4
  580. package/lib/components/popper/src/content.vue.d.ts +15 -15
  581. package/lib/components/popper/src/popper.d.ts +2 -2
  582. package/lib/components/progress/src/progress.d.ts +2 -2
  583. package/lib/components/progress/src/progress.vue.d.ts +1 -1
  584. package/lib/components/radio/src/radio-button.d.ts +3 -3
  585. package/lib/components/radio/src/radio-button.vue.d.ts +3 -3
  586. package/lib/components/radio/src/radio-group.vue.d.ts +5 -5
  587. package/lib/components/radio/src/radio.d.ts +6 -6
  588. package/lib/components/radio/src/radio.vue.d.ts +5 -5
  589. package/lib/components/rate/src/rate.vue.d.ts +4 -4
  590. package/lib/components/result/src/result.d.ts +1 -1
  591. package/lib/components/result/src/result.vue.d.ts +1 -1
  592. package/lib/components/row/src/row.d.ts +2 -2
  593. package/lib/components/scrollbar/src/scrollbar.vue.d.ts +1 -1
  594. package/lib/components/segmented/index.d.ts +3 -3
  595. package/lib/components/segmented/src/segmented.d.ts +1 -1
  596. package/lib/components/segmented/src/segmented.vue.d.ts +2 -2
  597. package/lib/components/select/src/option.d.ts +2 -2
  598. package/lib/components/select/src/option.vue.d.ts +5 -5
  599. package/lib/components/select/src/select.d.ts +4 -4
  600. package/lib/components/select/src/select.vue.d.ts +96 -96
  601. package/lib/components/select-v2/src/defaults.d.ts +2 -2
  602. package/lib/components/select-v2/src/select-dropdown.d.ts +2 -2
  603. package/lib/components/select-v2/src/select.vue.d.ts +80 -80
  604. package/lib/components/skeleton/src/skeleton-item.d.ts +1 -1
  605. package/lib/components/slider/src/button.vue.d.ts +1 -1
  606. package/lib/components/slider/src/slider.vue.d.ts +6 -6
  607. package/lib/components/space/src/space.d.ts +2 -2
  608. package/lib/components/splitter/src/splitter.vue.d.ts +2 -2
  609. package/lib/components/steps/src/item.d.ts +1 -1
  610. package/lib/components/steps/src/item.vue.d.ts +2 -2
  611. package/lib/components/steps/src/steps.d.ts +2 -2
  612. package/lib/components/steps/src/steps.vue.d.ts +1 -1
  613. package/lib/components/switch/src/switch.vue.d.ts +5 -5
  614. package/lib/components/table/src/table-column/index.d.ts +24 -24
  615. package/lib/components/table/src/table-header/index.d.ts +19 -19
  616. package/lib/components/table/src/table-layout.d.ts +1 -0
  617. package/lib/components/table/src/table-layout.js +5 -1
  618. package/lib/components/table/src/table-layout.js.map +1 -1
  619. package/lib/components/table/src/table.vue.d.ts +39 -39
  620. package/lib/components/table-v2/src/components/row.d.ts +1 -1
  621. package/lib/components/table-v2/src/table-grid.d.ts +2 -2
  622. package/lib/components/table-v2/src/table-v2.d.ts +2 -2
  623. package/lib/components/table-v2/style/css.js +1 -1
  624. package/lib/components/table-v2/style/index.js +1 -1
  625. package/lib/components/tabs/src/tab-nav.d.ts +1 -1
  626. package/lib/components/tabs/src/tabs.d.ts +5 -5
  627. package/lib/components/tag/src/tag.d.ts +1 -1
  628. package/lib/components/tag/src/tag.vue.d.ts +2 -2
  629. package/lib/components/text/src/text.d.ts +1 -1
  630. package/lib/components/text/src/text.vue.d.ts +1 -1
  631. package/lib/components/time-picker/src/common/picker.vue.d.ts +11 -11
  632. package/lib/components/time-picker/src/common/props.d.ts +2 -2
  633. package/lib/components/time-picker/src/time-picker.d.ts +7 -7
  634. package/lib/components/time-select/src/time-select.vue.d.ts +9 -9
  635. package/lib/components/timeline/src/timeline-item.d.ts +3 -3
  636. package/lib/components/timeline/src/timeline-item.vue.d.ts +1 -1
  637. package/lib/components/tooltip/src/content.d.ts +1 -1
  638. package/lib/components/tooltip/src/content.vue.d.ts +15 -15
  639. package/lib/components/tooltip/src/tooltip.d.ts +3 -3
  640. package/lib/components/tooltip/src/tooltip.vue.d.ts +19 -19
  641. package/lib/components/tooltip/src/trigger.d.ts +1 -1
  642. package/lib/components/tour/src/content.d.ts +2 -2
  643. package/lib/components/tour/src/step.d.ts +1 -1
  644. package/lib/components/tour/src/tour.d.ts +1 -1
  645. package/lib/components/tour/src/tour.vue.d.ts +6 -6
  646. package/lib/components/transfer/src/transfer.vue.d.ts +2 -2
  647. package/lib/components/tree/src/tree.vue.d.ts +20 -20
  648. package/lib/components/tree-select/src/tree-select.vue.d.ts +22 -22
  649. package/lib/components/tree-v2/src/tree.vue.d.ts +3 -3
  650. package/lib/components/upload/src/upload-content.d.ts +1 -1
  651. package/lib/components/upload/src/upload-content.vue.d.ts +1 -1
  652. package/lib/components/upload/src/upload-list.d.ts +1 -1
  653. package/lib/components/upload/src/upload.d.ts +2 -2
  654. package/lib/components/upload/src/upload.vue.d.ts +2 -2
  655. package/lib/components/virtual-list/src/builders/build-grid.d.ts +15 -3
  656. package/lib/components/virtual-list/src/builders/build-list.js +2 -1
  657. package/lib/components/virtual-list/src/builders/build-list.js.map +1 -1
  658. package/lib/components/virtual-list/src/components/dynamic-size-grid.d.ts +15 -3
  659. package/lib/components/virtual-list/src/components/dynamic-size-list.d.ts +17 -5
  660. package/lib/components/virtual-list/src/components/fixed-size-grid.d.ts +15 -3
  661. package/lib/components/virtual-list/src/components/fixed-size-list.d.ts +17 -5
  662. package/lib/components/virtual-list/src/props.d.ts +18 -0
  663. package/lib/components/virtual-list/src/props.js +4 -0
  664. package/lib/components/virtual-list/src/props.js.map +1 -1
  665. package/lib/hooks/use-floating/index.d.ts +4 -4
  666. package/lib/hooks/use-popper/index.d.ts +1 -1
  667. package/lib/index.d.ts +10 -10
  668. package/lib/index.js +13 -11
  669. package/lib/version.js +1 -1
  670. package/lib/version.js.map +1 -1
  671. package/package.json +2 -2
  672. package/tags.json +1 -1
  673. package/theme-chalk/el-cascader-panel.css +1 -1
  674. package/theme-chalk/el-cascader.css +1 -1
  675. package/theme-chalk/index.css +1 -1
  676. package/theme-chalk/src/cascader-panel.scss +11 -0
  677. package/theme-chalk/src/cascader.scss +28 -1
  678. package/web-types.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cascader2.mjs","names":[],"sources":["../../../../../../packages/components/cascader/src/cascader.vue"],"sourcesContent":["<template>\n <el-tooltip\n ref=\"tooltipRef\"\n :visible=\"popperVisible\"\n :teleported=\"teleported\"\n :popper-class=\"[nsCascader.e('dropdown'), popperClass!]\"\n :popper-style=\"popperStyle\"\n :popper-options=\"popperOptions\"\n :fallback-placements=\"fallbackPlacements\"\n :stop-popper-mouse-event=\"false\"\n :gpu-acceleration=\"false\"\n :placement=\"placement\"\n :transition=\"`${nsCascader.namespace.value}-zoom-in-top`\"\n :effect=\"effect\"\n pure\n :persistent=\"persistent\"\n @hide=\"hideSuggestionPanel\"\n >\n <template #default>\n <div\n ref=\"wrapperRef\"\n v-clickoutside:[contentRef]=\"handleClickOutside\"\n :class=\"cascaderKls\"\n :style=\"cascaderStyle\"\n @click=\"() => togglePopperVisible(readonly ? undefined : true)\"\n @keydown=\"handleKeyDown\"\n @mouseenter=\"inputHover = true\"\n @mouseleave=\"inputHover = false\"\n >\n <el-input\n ref=\"inputRef\"\n v-model=\"inputValue\"\n :placeholder=\"currentPlaceholder\"\n :readonly=\"readonly\"\n :disabled=\"isDisabled\"\n :validate-event=\"false\"\n :size=\"realSize\"\n :class=\"inputClass\"\n :tabindex=\"multiple && filterable && !isDisabled ? -1 : undefined\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n @input=\"handleInput\"\n >\n <template v-if=\"$slots.prefix\" #prefix>\n <slot name=\"prefix\" />\n </template>\n <template #suffix>\n <el-icon\n v-if=\"clearBtnVisible\"\n key=\"clear\"\n :class=\"[nsInput.e('icon'), 'icon-circle-close']\"\n @click.stop=\"handleClear\"\n >\n <component :is=\"clearIcon\" />\n </el-icon>\n <el-icon\n v-else\n key=\"arrow-down\"\n :class=\"cascaderIconKls\"\n @click.stop=\"togglePopperVisible()\"\n >\n <arrow-down />\n </el-icon>\n </template>\n </el-input>\n\n <div\n v-if=\"multiple\"\n ref=\"tagWrapper\"\n :class=\"[\n nsCascader.e('tags'),\n nsCascader.is('validate', Boolean(validateState)),\n ]\"\n >\n <slot name=\"tag\" :data=\"tags\" :delete-tag=\"deleteTag\">\n <el-tag\n v-for=\"tag in showTagList\"\n :key=\"tag.key\"\n :type=\"tagType\"\n :size=\"tagSize\"\n :effect=\"tagEffect\"\n :hit=\"tag.hitState\"\n :closable=\"tag.closable\"\n disable-transitions\n @close=\"deleteTag(tag)\"\n >\n <span>{{ tag.text }}</span>\n </el-tag>\n </slot>\n <el-tooltip\n v-if=\"collapseTags && tags.length > maxCollapseTags\"\n ref=\"tagTooltipRef\"\n :disabled=\"popperVisible || !collapseTagsTooltip\"\n :fallback-placements=\"['bottom', 'top', 'right', 'left']\"\n placement=\"bottom\"\n :popper-class=\"popperClass\"\n :popper-style=\"popperStyle\"\n :effect=\"effect\"\n :persistent=\"persistent\"\n >\n <template #default>\n <el-tag\n :closable=\"false\"\n :size=\"tagSize\"\n :type=\"tagType\"\n :effect=\"tagEffect\"\n disable-transitions\n >\n <span :class=\"nsCascader.e('tags-text')\">\n + {{ tags.length - maxCollapseTags }}\n </span>\n </el-tag>\n </template>\n <template #content>\n <el-scrollbar :max-height=\"maxCollapseTagsTooltipHeight\">\n <div :class=\"nsCascader.e('collapse-tags')\">\n <div\n v-for=\"(tag, idx) in collapseTagList\"\n :key=\"idx\"\n :class=\"nsCascader.e('collapse-tag')\"\n >\n <el-tag\n :key=\"tag.key\"\n class=\"in-tooltip\"\n :type=\"tagType\"\n :size=\"tagSize\"\n :effect=\"tagEffect\"\n :hit=\"tag.hitState\"\n :closable=\"tag.closable\"\n disable-transitions\n @close=\"deleteTag(tag)\"\n >\n <span>{{ tag.text }}</span>\n </el-tag>\n </div>\n </div>\n </el-scrollbar>\n </template>\n </el-tooltip>\n <input\n v-if=\"filterable && !isDisabled\"\n v-model=\"searchInputValue\"\n type=\"text\"\n :class=\"nsCascader.e('search-input')\"\n :placeholder=\"presentText ? '' : inputPlaceholder\"\n @input=\"(e) => handleInput(searchInputValue, e as InputEvent)\"\n @click.stop=\"togglePopperVisible(true)\"\n @keydown.delete=\"handleDelete\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n />\n </div>\n </div>\n </template>\n\n <template #content>\n <div v-if=\"$slots.header\" :class=\"nsCascader.e('header')\" @click.stop>\n <slot name=\"header\" />\n </div>\n <el-cascader-panel\n v-show=\"!filtering\"\n ref=\"cascaderPanelRef\"\n v-model=\"checkedValue\"\n :options=\"options\"\n :props=\"props.props\"\n :border=\"false\"\n :render-label=\"$slots.default\"\n @expand-change=\"handleExpandChange\"\n @close=\"$nextTick(() => togglePopperVisible(false))\"\n >\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </el-cascader-panel>\n <el-scrollbar\n v-if=\"filterable\"\n v-show=\"filtering\"\n ref=\"suggestionPanel\"\n tag=\"ul\"\n :class=\"nsCascader.e('suggestion-panel')\"\n :view-class=\"nsCascader.e('suggestion-list')\"\n @keydown=\"handleSuggestionKeyDown\"\n >\n <template v-if=\"suggestions.length\">\n <li\n v-for=\"item in suggestions\"\n :key=\"item.uid\"\n :class=\"[\n nsCascader.e('suggestion-item'),\n nsCascader.is('checked', item.checked),\n ]\"\n :tabindex=\"-1\"\n @click=\"handleSuggestionClick(item)\"\n >\n <slot name=\"suggestion-item\" :item=\"item\">\n <span>{{ item.text }}</span>\n <el-icon v-if=\"item.checked\">\n <check />\n </el-icon>\n </slot>\n </li>\n </template>\n <slot v-else name=\"empty\">\n <li :class=\"nsCascader.e('empty-text')\">\n {{ t('el.cascader.noMatch') }}\n </li>\n </slot>\n </el-scrollbar>\n <div v-if=\"$slots.footer\" :class=\"nsCascader.e('footer')\" @click.stop>\n <slot name=\"footer\" />\n </div>\n </template>\n </el-tooltip>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n markRaw,\n nextTick,\n onMounted,\n ref,\n useAttrs,\n useSlots,\n watch,\n} from 'vue'\nimport { cloneDeep } from 'lodash-unified'\nimport { useCssVar, useDebounceFn, useResizeObserver } from '@vueuse/core'\nimport {\n NOOP,\n focusNode,\n getEventCode,\n getSibling,\n isClient,\n isPromise,\n} from '@element-plus/utils'\nimport ElCascaderPanel from '@element-plus/components/cascader-panel'\nimport ElInput from '@element-plus/components/input'\nimport ElTooltip from '@element-plus/components/tooltip'\nimport ElScrollbar from '@element-plus/components/scrollbar'\nimport ElTag from '@element-plus/components/tag'\nimport ElIcon from '@element-plus/components/icon'\nimport {\n useFormDisabled,\n useFormItem,\n useFormSize,\n} from '@element-plus/components/form'\nimport { ClickOutside as vClickoutside } from '@element-plus/directives'\nimport {\n useComposition,\n useEmptyValues,\n useFocusController,\n useLocale,\n useNamespace,\n} from '@element-plus/hooks'\nimport {\n CHANGE_EVENT,\n EVENT_CODE,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { ArrowDown, Check, CircleClose } from '@element-plus/icons-vue'\nimport { cascaderEmits } from './cascader'\n\nimport type { Options } from '@element-plus/components/popper'\nimport type { ComputedRef, StyleValue } from 'vue'\nimport type { TooltipInstance } from '@element-plus/components/tooltip'\nimport type { InputInstance } from '@element-plus/components/input'\nimport type { ScrollbarInstance } from '@element-plus/components/scrollbar'\nimport type {\n CascaderNode,\n CascaderPanelInstance,\n CascaderValue,\n Tag,\n} from '@element-plus/components/cascader-panel'\nimport type { CascaderComponentProps } from './cascader'\n\nconst popperOptions: Partial<Options> = {\n modifiers: [\n {\n name: 'arrowPosition',\n enabled: true,\n phase: 'main',\n fn: ({ state }) => {\n const { modifiersData, placement } = state\n if (['right', 'left', 'bottom', 'top'].includes(placement)) return\n if (modifiersData.arrow) {\n modifiersData.arrow.x = 35\n }\n },\n requires: ['arrow'],\n },\n ],\n}\n\ndefineOptions({\n name: 'ElCascader',\n})\n\nconst props = withDefaults(defineProps<CascaderComponentProps>(), {\n options: () => [],\n props: () => ({}),\n disabled: undefined,\n clearIcon: markRaw(CircleClose),\n filterMethod: (node, keyword) => node.text.includes(keyword),\n separator: ' / ',\n showAllLevels: true,\n maxCollapseTags: 1,\n debounce: 300,\n beforeFilter: () => true,\n placement: 'bottom-start',\n fallbackPlacements: () => [\n 'bottom-start',\n 'bottom',\n 'top-start',\n 'top',\n 'right',\n 'left',\n ],\n teleported: true,\n effect: 'light',\n tagType: 'info',\n tagEffect: 'light',\n validateEvent: true,\n persistent: true,\n showCheckedStrategy: 'child',\n showPrefix: true,\n popperStyle: undefined,\n valueOnClear: undefined,\n})\nconst emit = defineEmits(cascaderEmits)\nconst attrs = useAttrs()\nconst slots = useSlots()\n\nlet inputInitialHeight = 0\nlet pressDeleteCount = 0\n\nconst nsCascader = useNamespace('cascader')\nconst nsInput = useNamespace('input')\nconst sizeMapPadding = {\n small: 7,\n default: 11,\n large: 15,\n}\n\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst isDisabled = useFormDisabled()\nconst { valueOnClear } = useEmptyValues(props)\nconst { isComposing, handleComposition } = useComposition({\n afterComposition(event) {\n const text = (event.target as HTMLInputElement)?.value\n handleInput(text)\n },\n})\n\nconst tooltipRef = ref<TooltipInstance>()\nconst tagTooltipRef = ref<TooltipInstance>()\nconst inputRef = ref<InputInstance>()\nconst tagWrapper = ref<HTMLDivElement>()\nconst cascaderPanelRef = ref<CascaderPanelInstance>()\nconst suggestionPanel = ref<ScrollbarInstance>()\nconst popperVisible = ref(false)\nconst inputHover = ref(false)\nconst filtering = ref(false)\nconst inputValue = ref('')\nconst searchInputValue = ref('')\nconst tags = ref<Tag[]>([])\nconst suggestions = ref<CascaderNode[]>([])\n\nconst showTagList = computed(() => {\n if (!props.props.multiple) {\n return []\n }\n return props.collapseTags\n ? tags.value.slice(0, props.maxCollapseTags)\n : tags.value\n})\n\nconst collapseTagList = computed(() => {\n if (!props.props.multiple) {\n return []\n }\n return props.collapseTags ? tags.value.slice(props.maxCollapseTags) : []\n})\n\nconst cascaderStyle = computed(() => {\n return attrs.style as StyleValue\n})\n\nconst inputPlaceholder = computed(\n () => props.placeholder ?? t('el.cascader.placeholder')\n)\nconst currentPlaceholder = computed(() =>\n searchInputValue.value || tags.value.length > 0 || isComposing.value\n ? ''\n : inputPlaceholder.value\n)\nconst realSize = useFormSize()\nconst tagSize = computed(() =>\n realSize.value === 'small' ? 'small' : 'default'\n)\nconst multiple = computed(() => !!props.props.multiple)\nconst readonly = computed(() => !props.filterable || multiple.value)\nconst searchKeyword = computed(() =>\n multiple.value ? searchInputValue.value : inputValue.value\n)\nconst checkedNodes: ComputedRef<CascaderNode[]> = computed(\n () => cascaderPanelRef.value?.checkedNodes || []\n)\n\nconst { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, {\n disabled: isDisabled,\n beforeBlur(event) {\n return (\n tooltipRef.value?.isFocusInsideContent(event) ||\n tagTooltipRef.value?.isFocusInsideContent(event)\n )\n },\n afterBlur() {\n if (props.validateEvent) {\n formItem?.validate?.('blur').catch(NOOP)\n }\n },\n})\n\nconst clearBtnVisible = computed(() => {\n if (\n !props.clearable ||\n isDisabled.value ||\n filtering.value ||\n (!inputHover.value && !isFocused.value)\n )\n return false\n\n return !!checkedNodes.value.length\n})\nconst presentText = computed(() => {\n const { showAllLevels, separator } = props\n const nodes = checkedNodes.value\n return nodes.length\n ? multiple.value\n ? ''\n : nodes[0].calcText(showAllLevels, separator)\n : ''\n})\n\nconst validateState = computed(() => formItem?.validateState || '')\n\nconst checkedValue = computed<CascaderValue>({\n get() {\n return cloneDeep(props.modelValue) as CascaderValue\n },\n set(val) {\n // https://github.com/element-plus/element-plus/issues/17647\n const value = val ?? valueOnClear.value\n emit(UPDATE_MODEL_EVENT, value)\n emit(CHANGE_EVENT, value)\n if (props.validateEvent) {\n formItem?.validate('change').catch(NOOP)\n }\n },\n})\n\nconst cascaderKls = computed(() => {\n return [\n nsCascader.b(),\n nsCascader.m(realSize.value),\n nsCascader.is('disabled', isDisabled.value),\n attrs.class,\n ]\n})\n\nconst cascaderIconKls = computed(() => {\n return [\n nsInput.e('icon'),\n 'icon-arrow-down',\n nsCascader.is('reverse', popperVisible.value),\n ]\n})\n\nconst inputClass = computed(() => nsCascader.is('focus', isFocused.value))\n\nconst contentRef = computed(() => {\n return tooltipRef.value?.popperRef?.contentRef\n})\n\nconst handleClickOutside = (event: Event) => {\n if (isFocused.value) {\n const _event = new FocusEvent('blur', event)\n handleBlur(_event)\n }\n togglePopperVisible(false)\n}\n\nconst togglePopperVisible = (visible?: boolean) => {\n if (isDisabled.value) return\n\n visible = visible ?? !popperVisible.value\n\n if (visible !== popperVisible.value) {\n popperVisible.value = visible\n inputRef.value?.input?.setAttribute('aria-expanded', `${visible}`)\n\n if (visible) {\n updatePopperPosition()\n cascaderPanelRef.value &&\n nextTick(cascaderPanelRef.value.scrollToExpandingNode)\n } else if (props.filterable) {\n syncPresentTextValue()\n }\n\n emit('visibleChange', visible)\n }\n}\n\nconst updatePopperPosition = () => {\n nextTick(() => {\n tooltipRef.value?.updatePopper()\n })\n}\nconst hideSuggestionPanel = () => {\n filtering.value = false\n}\n\nconst genTag = (node: CascaderNode): Tag => {\n const { showAllLevels, separator } = props\n return {\n node,\n key: node.uid,\n text: node.calcText(showAllLevels, separator),\n hitState: false,\n closable: !isDisabled.value && !node.isDisabled,\n }\n}\n\nconst deleteTag = (tag: Tag) => {\n const node = tag.node as CascaderNode\n node.doCheck(false)\n cascaderPanelRef.value?.calculateCheckedValue()\n emit('removeTag', node.valueByOption)\n}\n\nconst getStrategyCheckedNodes = (): CascaderNode[] => {\n switch (props.showCheckedStrategy) {\n case 'child':\n return checkedNodes.value\n case 'parent': {\n const clickedNodes = getCheckedNodes(false)\n const clickedNodesValue = clickedNodes!.map((o) => o.value)\n const parentNodes = clickedNodes!.filter(\n (o) => !o.parent || !clickedNodesValue.includes(o.parent.value)\n )\n return parentNodes\n }\n default:\n return []\n }\n}\n\nconst calculatePresentTags = () => {\n if (!multiple.value) return\n\n const nodes = getStrategyCheckedNodes()\n\n const allTags: Tag[] = []\n nodes.forEach((node) => allTags.push(genTag(node)))\n tags.value = allTags\n}\n\nconst calculateSuggestions = () => {\n const { filterMethod, showAllLevels, separator } = props\n const res = cascaderPanelRef.value\n ?.getFlattedNodes(!props.props.checkStrictly)\n ?.filter((node) => {\n if (node.isDisabled) return false\n node.calcText(showAllLevels, separator)\n return filterMethod(node, searchKeyword.value)\n })\n\n if (multiple.value) {\n tags.value.forEach((tag) => {\n tag.hitState = false\n })\n }\n\n filtering.value = true\n suggestions.value = res!\n updatePopperPosition()\n}\n\nconst focusFirstNode = () => {\n let firstNode!: HTMLElement\n\n if (filtering.value && suggestionPanel.value) {\n firstNode = suggestionPanel.value.$el.querySelector(\n `.${nsCascader.e('suggestion-item')}`\n )\n } else {\n firstNode = cascaderPanelRef.value?.$el.querySelector(\n `.${nsCascader.b('node')}[tabindex=\"-1\"]`\n )\n }\n\n if (firstNode) {\n firstNode.focus()\n if (\n !filtering.value &&\n firstNode.getAttribute('aria-haspopup') === 'true'\n ) {\n firstNode.click()\n }\n }\n}\n\nconst updateStyle = () => {\n const inputInner = inputRef.value?.input\n const tagWrapperEl = tagWrapper.value\n const suggestionPanelEl = suggestionPanel.value?.$el\n\n if (!isClient || !inputInner) return\n\n if (suggestionPanelEl) {\n const suggestionList = suggestionPanelEl.querySelector(\n `.${nsCascader.e('suggestion-list')}`\n )\n suggestionList.style.minWidth = `${inputInner.offsetWidth}px`\n }\n\n if (tagWrapperEl) {\n const { offsetHeight } = tagWrapperEl\n // 2 is el-input__wrapper padding\n const height =\n tags.value.length > 0\n ? `${Math.max(offsetHeight, inputInitialHeight) - 2}px`\n : `${inputInitialHeight}px`\n inputInner.style.height = height\n // if prefix slot exists, update tagWrapperEl left position\n if (slots.prefix) {\n const prefix = inputRef.value?.$el.querySelector(\n `.${nsInput.e('prefix')}`\n ) as HTMLElement\n let left = 0\n if (prefix) {\n left = prefix.offsetWidth\n if (left > 0) {\n left += sizeMapPadding[realSize.value || 'default'] // this is the default padding of el-input__wrapper\n }\n }\n tagWrapperEl.style.left = `${left}px`\n } else {\n tagWrapperEl.style.left = `0`\n }\n updatePopperPosition()\n }\n}\n\nconst getCheckedNodes = (leafOnly: boolean) => {\n return cascaderPanelRef.value?.getCheckedNodes(leafOnly)\n}\n\nconst handleExpandChange = (value: CascaderValue) => {\n updatePopperPosition()\n emit('expandChange', value)\n}\n\nconst handleKeyDown = (e: KeyboardEvent) => {\n if (isComposing.value) return\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n togglePopperVisible()\n break\n case EVENT_CODE.down:\n togglePopperVisible(true)\n nextTick(focusFirstNode)\n e.preventDefault()\n break\n case EVENT_CODE.esc:\n if (popperVisible.value === true) {\n e.preventDefault()\n e.stopPropagation()\n togglePopperVisible(false)\n }\n break\n case EVENT_CODE.tab:\n togglePopperVisible(false)\n break\n }\n}\n\nconst handleClear = () => {\n cascaderPanelRef.value?.clearCheckedNodes()\n if (!popperVisible.value && props.filterable) {\n syncPresentTextValue()\n }\n togglePopperVisible(false)\n emit('clear')\n}\n\nconst syncPresentTextValue = () => {\n const { value } = presentText\n inputValue.value = value\n searchInputValue.value = value\n}\n\nconst handleSuggestionClick = (node: CascaderNode) => {\n const { checked } = node\n\n if (multiple.value) {\n cascaderPanelRef.value?.handleCheckChange(node, !checked, false)\n } else {\n !checked && cascaderPanelRef.value?.handleCheckChange(node, true, false)\n togglePopperVisible(false)\n }\n}\n\nconst handleSuggestionKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.up:\n case EVENT_CODE.down: {\n e.preventDefault()\n const distance = code === EVENT_CODE.up ? -1 : 1\n focusNode(\n getSibling(\n target,\n distance,\n `.${nsCascader.e('suggestion-item')}[tabindex=\"-1\"]`\n ) as HTMLElement\n )\n break\n }\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n target.click()\n break\n }\n}\n\nconst handleDelete = () => {\n const lastTag = tags.value[tags.value.length - 1]\n pressDeleteCount = searchInputValue.value ? 0 : pressDeleteCount + 1\n\n if (\n !lastTag ||\n !pressDeleteCount ||\n (props.collapseTags && tags.value.length > 1)\n )\n return\n\n if (lastTag.hitState) {\n deleteTag(lastTag)\n } else {\n lastTag.hitState = true\n }\n}\n\nconst debounce = computed(() => props.debounce)\nconst handleFilter = useDebounceFn(() => {\n const { value } = searchKeyword\n\n if (!value) return\n\n const passed = props.beforeFilter(value)\n\n if (isPromise(passed)) {\n passed.then(calculateSuggestions).catch(() => {\n /* prevent log error */\n })\n } else if (passed !== false) {\n calculateSuggestions()\n } else {\n hideSuggestionPanel()\n }\n}, debounce)\n\nconst handleInput = (val: string, e?: InputEvent) => {\n !popperVisible.value && togglePopperVisible(true)\n\n if (e?.isComposing) return\n\n if (val) {\n handleFilter()\n } else {\n const passed = props.beforeFilter('')\n if (isPromise(passed)) {\n passed.catch(() => {\n /* prevent log error */\n })\n }\n hideSuggestionPanel()\n }\n}\n\nconst getInputInnerHeight = (inputInner: HTMLElement): number =>\n Number.parseFloat(\n useCssVar(nsInput.cssVarName('input-height'), inputInner).value!\n ) - 2\n\nconst focus = () => {\n inputRef.value?.focus()\n}\n\nconst blur = () => {\n inputRef.value?.blur()\n}\n\nwatch(filtering, updatePopperPosition)\n\nwatch(\n [\n checkedNodes,\n isDisabled,\n () => props.collapseTags,\n () => props.maxCollapseTags,\n ],\n calculatePresentTags\n)\n\nwatch(tags, () => {\n nextTick(() => updateStyle())\n})\n\nwatch(realSize, async () => {\n await nextTick()\n const inputInner = inputRef.value!.input!\n inputInitialHeight = getInputInnerHeight(inputInner) || inputInitialHeight\n updateStyle()\n})\n\nwatch(presentText, syncPresentTextValue, { immediate: true })\n\nwatch(\n () => popperVisible.value,\n (val) => {\n if (val && props.props.lazy && props.props.lazyLoad) {\n cascaderPanelRef.value?.loadLazyRootNodes()\n }\n }\n)\n\nonMounted(() => {\n const inputInner = inputRef.value!.input!\n\n const inputInnerHeight = getInputInnerHeight(inputInner)\n\n inputInitialHeight = inputInner.offsetHeight || inputInnerHeight\n useResizeObserver(inputInner, updateStyle)\n})\n\ndefineExpose({\n /**\n * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false`\n */\n getCheckedNodes,\n /**\n * @description cascader panel ref\n */\n cascaderPanelRef,\n /**\n * @description toggle the visible of popper\n */\n togglePopperVisible,\n /**\n * @description cascader content ref\n */\n contentRef,\n /**\n * @description selected content text\n */\n presentText,\n /** @description focus the input element */\n focus,\n /** @description blur the input element */\n blur,\n})\n</script>\n"],"mappings":""}
1
+ {"version":3,"file":"cascader2.mjs","names":[],"sources":["../../../../../../packages/components/cascader/src/cascader.vue"],"sourcesContent":["<template>\n <el-tooltip\n ref=\"tooltipRef\"\n :visible=\"popperVisible\"\n :teleported=\"teleported\"\n :popper-class=\"[nsCascader.e('dropdown'), popperClass!]\"\n :popper-style=\"popperStyle\"\n :popper-options=\"popperOptions\"\n :fallback-placements=\"fallbackPlacements\"\n :stop-popper-mouse-event=\"false\"\n :gpu-acceleration=\"false\"\n :placement=\"placement\"\n :transition=\"`${nsCascader.namespace.value}-zoom-in-top`\"\n :effect=\"effect\"\n pure\n :persistent=\"persistent\"\n @hide=\"hideSuggestionPanel\"\n >\n <template #default>\n <div\n ref=\"wrapperRef\"\n v-clickoutside:[contentRef]=\"handleClickOutside\"\n :class=\"cascaderKls\"\n :style=\"cascaderStyle\"\n @click=\"() => togglePopperVisible(readonly ? undefined : true)\"\n @keydown=\"handleKeyDown\"\n @mouseenter=\"inputHover = true\"\n @mouseleave=\"inputHover = false\"\n >\n <el-input\n ref=\"inputRef\"\n v-model=\"inputValue\"\n :placeholder=\"currentPlaceholder\"\n :readonly=\"readonly\"\n :disabled=\"isDisabled\"\n :validate-event=\"false\"\n :size=\"realSize\"\n :class=\"inputClass\"\n :tabindex=\"multiple && filterable && !isDisabled ? -1 : undefined\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n @input=\"handleInput\"\n >\n <template v-if=\"$slots.prefix\" #prefix>\n <slot name=\"prefix\" />\n </template>\n <template #suffix>\n <el-icon\n v-if=\"clearBtnVisible\"\n key=\"clear\"\n :class=\"[nsInput.e('icon'), 'icon-circle-close']\"\n @click.stop=\"handleClear\"\n >\n <component :is=\"clearIcon\" />\n </el-icon>\n <el-icon\n v-else\n key=\"arrow-down\"\n :class=\"cascaderIconKls\"\n @click.stop=\"togglePopperVisible()\"\n >\n <arrow-down />\n </el-icon>\n </template>\n </el-input>\n\n <div\n v-if=\"multiple\"\n ref=\"tagWrapper\"\n :class=\"[\n nsCascader.e('tags'),\n nsCascader.is('validate', Boolean(validateState)),\n ]\"\n >\n <slot name=\"tag\" :data=\"tags\" :delete-tag=\"deleteTag\">\n <el-tag\n v-for=\"tag in showTagList\"\n :key=\"tag.key\"\n :type=\"tagType\"\n :size=\"tagSize\"\n :effect=\"tagEffect\"\n :hit=\"tag.hitState\"\n :closable=\"tag.closable\"\n disable-transitions\n @close=\"deleteTag(tag)\"\n >\n <span>{{ tag.text }}</span>\n </el-tag>\n </slot>\n <el-tooltip\n v-if=\"collapseTags && tags.length > maxCollapseTags\"\n ref=\"tagTooltipRef\"\n :disabled=\"popperVisible || !collapseTagsTooltip\"\n :fallback-placements=\"['bottom', 'top', 'right', 'left']\"\n placement=\"bottom\"\n :popper-class=\"popperClass\"\n :popper-style=\"popperStyle\"\n :effect=\"effect\"\n :persistent=\"persistent\"\n >\n <template #default>\n <el-tag\n :closable=\"false\"\n :size=\"tagSize\"\n :type=\"tagType\"\n :effect=\"tagEffect\"\n disable-transitions\n >\n <span :class=\"nsCascader.e('tags-text')\">\n + {{ tags.length - maxCollapseTags }}\n </span>\n </el-tag>\n </template>\n <template #content>\n <el-scrollbar :max-height=\"maxCollapseTagsTooltipHeight\">\n <div :class=\"nsCascader.e('collapse-tags')\">\n <div\n v-for=\"(tag, idx) in collapseTagList\"\n :key=\"idx\"\n :class=\"nsCascader.e('collapse-tag')\"\n >\n <el-tag\n :key=\"tag.key\"\n class=\"in-tooltip\"\n :type=\"tagType\"\n :size=\"tagSize\"\n :effect=\"tagEffect\"\n :hit=\"tag.hitState\"\n :closable=\"tag.closable\"\n disable-transitions\n @close=\"deleteTag(tag)\"\n >\n <span>{{ tag.text }}</span>\n </el-tag>\n </div>\n </div>\n </el-scrollbar>\n </template>\n </el-tooltip>\n <input\n v-if=\"filterable && !isDisabled\"\n v-model=\"searchInputValue\"\n type=\"text\"\n :class=\"nsCascader.e('search-input')\"\n :placeholder=\"presentText ? '' : inputPlaceholder\"\n @input=\"(e) => handleInput(searchInputValue, e as InputEvent)\"\n @click.stop=\"togglePopperVisible(true)\"\n @keydown.delete=\"handleDelete\"\n @compositionstart=\"handleComposition\"\n @compositionupdate=\"handleComposition\"\n @compositionend=\"handleComposition\"\n />\n </div>\n </div>\n </template>\n\n <template #content>\n <div v-if=\"$slots.header\" :class=\"nsCascader.e('header')\" @click.stop>\n <slot name=\"header\" />\n </div>\n <el-cascader-panel\n v-show=\"!filtering\"\n ref=\"cascaderPanelRef\"\n v-model=\"checkedValue\"\n :options=\"options\"\n :props=\"props.props\"\n :border=\"false\"\n :render-label=\"$slots.default\"\n :virtual-scroll=\"virtualScroll\"\n :item-size=\"itemSize\"\n :height=\"height\"\n @expand-change=\"handleExpandChange\"\n @close=\"$nextTick(() => togglePopperVisible(false))\"\n >\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </el-cascader-panel>\n <template v-if=\"filterable\">\n <el-scrollbar\n v-if=\"!virtualScroll\"\n v-show=\"filtering\"\n :ref=\"(ref) => (suggestionPanel = (ref as ScrollbarInstance)?.$el)\"\n tag=\"ul\"\n :class=\"nsCascader.e('suggestion-panel')\"\n :wrap-class=\"nsCascader.e('suggestion-wrap')\"\n :view-class=\"nsCascader.e('suggestion-list')\"\n @keydown=\"handleSuggestionKeyDown\"\n >\n <template v-if=\"suggestions.length\">\n <li\n v-for=\"item in suggestions\"\n :key=\"item.uid\"\n :class=\"[\n nsCascader.e('suggestion-item'),\n nsCascader.is('checked', item.checked),\n ]\"\n :tabindex=\"-1\"\n @click=\"handleSuggestionClick(item)\"\n >\n <slot name=\"suggestion-item\" :item=\"item\">\n <span>{{ item.text }}</span>\n <el-icon v-if=\"item.checked\">\n <check />\n </el-icon>\n </slot>\n </li>\n </template>\n <slot v-else name=\"empty\">\n <li :class=\"nsCascader.e('empty-text')\">\n {{ t('el.cascader.noMatch') }}\n </li>\n </slot>\n </el-scrollbar>\n <div\n v-else\n v-show=\"filtering\"\n ref=\"suggestionPanel\"\n :class=\"nsCascader.e('suggestion-panel')\"\n @keydown=\"handleSuggestionKeyDown\"\n >\n <el-fixed-size-list\n v-show=\"suggestions.length\"\n ref=\"suggestionVirtualListRef\"\n :height=\"clampedSuggestionListHeight\"\n :item-size=\"itemSize\"\n :data=\"suggestions\"\n :total=\"suggestions.length\"\n :class-name=\"nsCascader.e('suggestion-list')\"\n inner-element=\"ul\"\n :inner-width=\"suggestionListWidth\"\n >\n <template #default=\"{ data, index, style }\">\n <li\n :id=\"`suggestion-${data[index].uid}`\"\n :key=\"data[index].uid\"\n :data-suggestion-index=\"index\"\n :class=\"[\n nsCascader.e('suggestion-item'),\n nsCascader.is('checked', data[index].checked),\n ]\"\n :tabindex=\"-1\"\n :style=\"style\"\n @click=\"handleSuggestionClick(data[index])\"\n >\n <slot name=\"suggestion-item\" :item=\"data[index]\">\n <span>{{ data[index].text }}</span>\n <el-icon v-if=\"data[index].checked\">\n <check />\n </el-icon>\n </slot>\n </li>\n </template>\n </el-fixed-size-list>\n <slot v-if=\"!suggestions.length\" name=\"empty\">\n <ul :class=\"nsCascader.e('suggestion-list')\">\n <li :class=\"nsCascader.e('empty-text')\">\n {{ t('el.cascader.noMatch') }}\n </li>\n </ul>\n </slot>\n </div>\n </template>\n <div v-if=\"$slots.footer\" :class=\"nsCascader.e('footer')\" @click.stop>\n <slot name=\"footer\" />\n </div>\n </template>\n </el-tooltip>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n markRaw,\n nextTick,\n onMounted,\n ref,\n useAttrs,\n useSlots,\n watch,\n} from 'vue'\nimport { clamp, cloneDeep } from 'lodash-unified'\nimport { useCssVar, useDebounceFn, useResizeObserver } from '@vueuse/core'\nimport {\n NOOP,\n focusNode,\n getEventCode,\n getSibling,\n isClient,\n isNumber,\n isPromise,\n} from '@element-plus/utils'\nimport ElCascaderPanel, {\n CASCADER_PANEL_HEIGHT,\n CASCADER_PANEL_ITEM_SIZE,\n} from '@element-plus/components/cascader-panel'\nimport ElInput from '@element-plus/components/input'\nimport ElTooltip from '@element-plus/components/tooltip'\nimport ElScrollbar from '@element-plus/components/scrollbar'\nimport { FixedSizeList as ElFixedSizeList } from '@element-plus/components/virtual-list'\nimport ElTag from '@element-plus/components/tag'\nimport ElIcon from '@element-plus/components/icon'\nimport {\n useFormDisabled,\n useFormItem,\n useFormSize,\n} from '@element-plus/components/form'\nimport { ClickOutside as vClickoutside } from '@element-plus/directives'\nimport {\n useComposition,\n useEmptyValues,\n useFocusController,\n useLocale,\n useNamespace,\n} from '@element-plus/hooks'\nimport {\n CHANGE_EVENT,\n EVENT_CODE,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { ArrowDown, Check, CircleClose } from '@element-plus/icons-vue'\nimport { cascaderEmits } from './cascader'\n\nimport type { Options } from '@element-plus/components/popper'\nimport type { ComputedRef, StyleValue } from 'vue'\nimport type { TooltipInstance } from '@element-plus/components/tooltip'\nimport type { InputInstance } from '@element-plus/components/input'\nimport type { ScrollbarInstance } from '@element-plus/components/scrollbar'\nimport type { FixedSizeListInstance } from '@element-plus/components/virtual-list'\nimport type {\n CascaderNode,\n CascaderPanelInstance,\n CascaderValue,\n Tag,\n} from '@element-plus/components/cascader-panel'\nimport type { CascaderComponentProps } from './cascader'\n\nconst SUGGESTION_ITEM_EXTRA_WIDTH = 34 // span margin-right (10px) + check icon width (24px)\n\nconst popperOptions: Partial<Options> = {\n modifiers: [\n {\n name: 'arrowPosition',\n enabled: true,\n phase: 'main',\n fn: ({ state }) => {\n const { modifiersData, placement } = state\n if (['right', 'left', 'bottom', 'top'].includes(placement)) return\n if (modifiersData.arrow) {\n modifiersData.arrow.x = 35\n }\n },\n requires: ['arrow'],\n },\n ],\n}\n\ndefineOptions({\n name: 'ElCascader',\n})\n\nconst props = withDefaults(defineProps<CascaderComponentProps>(), {\n options: () => [],\n props: () => ({}),\n disabled: undefined,\n clearIcon: markRaw(CircleClose),\n filterMethod: (node, keyword) => node.text.includes(keyword),\n separator: ' / ',\n showAllLevels: true,\n maxCollapseTags: 1,\n debounce: 300,\n beforeFilter: () => true,\n placement: 'bottom-start',\n fallbackPlacements: () => [\n 'bottom-start',\n 'bottom',\n 'top-start',\n 'top',\n 'right',\n 'left',\n ],\n teleported: true,\n effect: 'light',\n tagType: 'info',\n tagEffect: 'light',\n validateEvent: true,\n persistent: true,\n showCheckedStrategy: 'child',\n showPrefix: true,\n popperStyle: undefined,\n valueOnClear: undefined,\n itemSize: CASCADER_PANEL_ITEM_SIZE,\n height: CASCADER_PANEL_HEIGHT,\n})\nconst emit = defineEmits(cascaderEmits)\nconst attrs = useAttrs()\nconst slots = useSlots()\n\nlet inputInitialHeight = 0\nlet pressDeleteCount = 0\n\nconst nsCascader = useNamespace('cascader')\nconst nsInput = useNamespace('input')\nconst sizeMapPadding = {\n small: 7,\n default: 11,\n large: 15,\n}\n\nconst { t } = useLocale()\nconst { formItem } = useFormItem()\nconst isDisabled = useFormDisabled()\nconst { valueOnClear } = useEmptyValues(props)\nconst { isComposing, handleComposition } = useComposition({\n afterComposition(event) {\n const text = (event.target as HTMLInputElement)?.value\n handleInput(text)\n },\n})\n\nconst tooltipRef = ref<TooltipInstance>()\nconst tagTooltipRef = ref<TooltipInstance>()\nconst inputRef = ref<InputInstance>()\nconst tagWrapper = ref<HTMLDivElement>()\nconst cascaderPanelRef = ref<CascaderPanelInstance>()\nconst suggestionPanel = ref<HTMLElement>()\nconst suggestionVirtualListRef = ref<FixedSizeListInstance>()\nconst popperVisible = ref(false)\nconst inputHover = ref(false)\nconst filtering = ref(false)\nconst inputValue = ref('')\nconst searchInputValue = ref('')\nconst tags = ref<Tag[]>([])\nconst suggestions = ref<CascaderNode[]>([])\nconst suggestionListWidth = ref<string | number>('100%')\nconst hasCustomSuggestionItemSlot = computed(() => !!slots['suggestion-item'])\nconst clampedSuggestionListHeight = computed(() =>\n clamp(suggestions.value.length * props.itemSize, props.itemSize, props.height)\n)\n\nconst showTagList = computed(() => {\n if (!props.props.multiple) {\n return []\n }\n return props.collapseTags\n ? tags.value.slice(0, props.maxCollapseTags)\n : tags.value\n})\n\nconst collapseTagList = computed(() => {\n if (!props.props.multiple) {\n return []\n }\n return props.collapseTags ? tags.value.slice(props.maxCollapseTags) : []\n})\n\nconst cascaderStyle = computed(() => {\n return attrs.style as StyleValue\n})\n\nconst inputPlaceholder = computed(\n () => props.placeholder ?? t('el.cascader.placeholder')\n)\nconst currentPlaceholder = computed(() =>\n searchInputValue.value || tags.value.length > 0 || isComposing.value\n ? ''\n : inputPlaceholder.value\n)\nconst realSize = useFormSize()\nconst tagSize = computed(() =>\n realSize.value === 'small' ? 'small' : 'default'\n)\nconst multiple = computed(() => !!props.props.multiple)\nconst readonly = computed(() => !props.filterable || multiple.value)\nconst searchKeyword = computed(() =>\n multiple.value ? searchInputValue.value : inputValue.value\n)\nconst checkedNodes: ComputedRef<CascaderNode[]> = computed(\n () => cascaderPanelRef.value?.checkedNodes || []\n)\n\nconst { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, {\n disabled: isDisabled,\n beforeBlur(event) {\n return (\n tooltipRef.value?.isFocusInsideContent(event) ||\n tagTooltipRef.value?.isFocusInsideContent(event)\n )\n },\n afterBlur() {\n if (props.validateEvent) {\n formItem?.validate?.('blur').catch(NOOP)\n }\n },\n})\n\nconst clearBtnVisible = computed(() => {\n if (\n !props.clearable ||\n isDisabled.value ||\n filtering.value ||\n (!inputHover.value && !isFocused.value)\n )\n return false\n\n return !!checkedNodes.value.length\n})\nconst presentText = computed(() => {\n const { showAllLevels, separator } = props\n const nodes = checkedNodes.value\n return nodes.length\n ? multiple.value\n ? ''\n : nodes[0].calcText(showAllLevels, separator)\n : ''\n})\n\nconst validateState = computed(() => formItem?.validateState || '')\n\nconst checkedValue = computed<CascaderValue>({\n get() {\n return cloneDeep(props.modelValue) as CascaderValue\n },\n set(val) {\n // https://github.com/element-plus/element-plus/issues/17647\n const value = val ?? valueOnClear.value\n emit(UPDATE_MODEL_EVENT, value)\n emit(CHANGE_EVENT, value)\n if (props.validateEvent) {\n formItem?.validate('change').catch(NOOP)\n }\n },\n})\n\nconst cascaderKls = computed(() => {\n return [\n nsCascader.b(),\n nsCascader.m(realSize.value),\n nsCascader.is('disabled', isDisabled.value),\n attrs.class,\n ]\n})\n\nconst cascaderIconKls = computed(() => {\n return [\n nsInput.e('icon'),\n 'icon-arrow-down',\n nsCascader.is('reverse', popperVisible.value),\n ]\n})\n\nconst inputClass = computed(() => nsCascader.is('focus', isFocused.value))\n\nconst contentRef = computed(() => {\n return tooltipRef.value?.popperRef?.contentRef\n})\n\nconst handleClickOutside = (event: Event) => {\n if (isFocused.value) {\n const _event = new FocusEvent('blur', event)\n handleBlur(_event)\n }\n togglePopperVisible(false)\n}\n\nconst togglePopperVisible = (visible?: boolean) => {\n if (isDisabled.value) return\n\n visible = visible ?? !popperVisible.value\n\n if (visible !== popperVisible.value) {\n popperVisible.value = visible\n inputRef.value?.input?.setAttribute('aria-expanded', `${visible}`)\n\n if (visible) {\n updatePopperPosition()\n cascaderPanelRef.value &&\n nextTick(cascaderPanelRef.value.scrollToExpandingNode)\n } else if (props.filterable) {\n syncPresentTextValue()\n }\n\n emit('visibleChange', visible)\n }\n}\n\nconst updatePopperPosition = () => {\n nextTick(() => {\n tooltipRef.value?.updatePopper()\n })\n}\nconst hideSuggestionPanel = () => {\n filtering.value = false\n}\n\nconst genTag = (node: CascaderNode): Tag => {\n const { showAllLevels, separator } = props\n return {\n node,\n key: node.uid,\n text: node.calcText(showAllLevels, separator),\n hitState: false,\n closable: !isDisabled.value && !node.isDisabled,\n }\n}\n\nconst deleteTag = (tag: Tag) => {\n const node = tag.node as CascaderNode\n node.doCheck(false)\n cascaderPanelRef.value?.calculateCheckedValue()\n emit('removeTag', node.valueByOption)\n}\n\nconst getStrategyCheckedNodes = (): CascaderNode[] => {\n switch (props.showCheckedStrategy) {\n case 'child':\n return checkedNodes.value\n case 'parent': {\n const clickedNodes = getCheckedNodes(false)\n const clickedNodesValue = clickedNodes!.map((o) => o.value)\n const parentNodes = clickedNodes!.filter(\n (o) => !o.parent || !clickedNodesValue.includes(o.parent.value)\n )\n return parentNodes\n }\n default:\n return []\n }\n}\n\nconst calculatePresentTags = () => {\n if (!multiple.value) return\n\n const nodes = getStrategyCheckedNodes()\n\n const allTags: Tag[] = []\n nodes.forEach((node) => allTags.push(genTag(node)))\n tags.value = allTags\n}\n\nconst calculateSuggestions = () => {\n const { filterMethod, showAllLevels, separator } = props\n const res = cascaderPanelRef.value\n ?.getFlattedNodes(!props.props.checkStrictly)\n ?.filter((node) => {\n if (node.isDisabled) return false\n node.calcText(showAllLevels, separator)\n return filterMethod(node, searchKeyword.value)\n })\n\n if (multiple.value) {\n tags.value.forEach((tag) => {\n tag.hitState = false\n })\n }\n\n filtering.value = true\n suggestions.value = res!\n nextTick(() => {\n if (props.virtualScroll && suggestions.value.length > 0) {\n suggestionVirtualListRef.value?.scrollToItem(0)\n }\n updateStyle()\n })\n updatePopperPosition()\n}\n\nconst getSuggestionPanelEl = (selector?: string): HTMLElement | undefined => {\n const el = suggestionPanel.value\n return selector ? (el?.querySelector(selector) ?? undefined) : el\n}\n\nconst focusFirstNode = () => {\n let firstNode: HTMLElement | undefined\n\n if (filtering.value && suggestionPanel.value) {\n firstNode = getSuggestionPanelEl(`.${nsCascader.e('suggestion-item')}`)\n } else {\n firstNode = cascaderPanelRef.value?.$el.querySelector(\n `.${nsCascader.b('node')}[tabindex=\"-1\"]`\n )\n }\n\n if (firstNode) {\n firstNode.focus()\n if (\n !filtering.value &&\n firstNode.getAttribute('aria-haspopup') === 'true'\n ) {\n firstNode.click()\n }\n }\n}\n\nconst updateSuggestionPanelWidth = (inputWidth: number) => {\n const suggestionPanelEl = getSuggestionPanelEl()\n if (!suggestionPanelEl) return\n\n const panelWidth = isNumber(props.fitInputWidth)\n ? `${props.fitInputWidth}px`\n : `${inputWidth}px`\n\n const setPanelStyle = (el: HTMLElement) => {\n if (props.fitInputWidth !== false) {\n el.style.width = panelWidth\n el.style.minWidth = ''\n } else {\n el.style.width = ''\n el.style.minWidth = panelWidth\n }\n }\n\n setPanelStyle(suggestionPanelEl)\n\n if (props.virtualScroll) {\n suggestionListWidth.value =\n props.fitInputWidth !== false\n ? panelWidth\n : hasCustomSuggestionItemSlot.value\n ? `${inputWidth}px`\n : `${Math.max(inputWidth, calculateSuggestionMaxWidth())}px`\n return\n }\n\n const suggestionList = getSuggestionPanelEl(\n `.${nsCascader.e('suggestion-list')}`\n )\n if (suggestionList) {\n setPanelStyle(suggestionList)\n }\n}\n\nconst getTagWrapperLeft = () => {\n if (!slots.prefix) return 0\n\n const prefix = inputRef.value?.$el.querySelector(\n `.${nsInput.e('prefix')}`\n ) as HTMLElement | null\n if (!prefix) return 0\n\n const prefixWidth = prefix.getBoundingClientRect().width\n if (prefixWidth <= 0) return 0\n return prefixWidth + sizeMapPadding[realSize.value || 'default']\n}\n\nconst updateStyle = () => {\n const inputInner = inputRef.value?.input\n const inputWrapper = inputRef.value?.$el\n if (!isClient || !inputInner || !inputWrapper) return\n\n if (suggestionPanel.value) {\n updateSuggestionPanelWidth(inputWrapper.getBoundingClientRect().width)\n }\n\n const tagWrapperEl = tagWrapper.value\n if (tagWrapperEl) {\n const height =\n tags.value.length > 0\n ? `${Math.max(tagWrapperEl.offsetHeight, inputInitialHeight) - 2}px`\n : `${inputInitialHeight}px`\n inputInner.style.height = height\n tagWrapperEl.style.left = `${getTagWrapperLeft()}px`\n updatePopperPosition()\n }\n}\n\nconst calculateSuggestionMaxWidth = () => {\n if (hasCustomSuggestionItemSlot.value) return 0\n if (!suggestions.value.length) return 0\n\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return 0\n\n const renderedSuggestion = getSuggestionPanelEl(\n `.${nsCascader.e('suggestion-item')}`\n )\n if (!renderedSuggestion || !isClient) return 0\n\n const style = getComputedStyle(renderedSuggestion)\n const padding =\n Number.parseFloat(style.paddingLeft) + Number.parseFloat(style.paddingRight)\n // Use bold font for all items to ensure width is sufficient\n ctx.font = `bold ${style.fontSize} ${style.fontFamily}`\n\n let maxWidth = 0\n let hasChecked = false\n\n for (const suggestion of suggestions.value) {\n const text = suggestion.text || ''\n const metrics = ctx.measureText(text)\n maxWidth = Math.max(maxWidth, metrics.width)\n if (suggestion.checked && !hasChecked) hasChecked = true\n }\n\n return maxWidth + padding + (hasChecked ? SUGGESTION_ITEM_EXTRA_WIDTH : 0)\n}\n\nconst getCheckedNodes = (leafOnly: boolean) => {\n return cascaderPanelRef.value?.getCheckedNodes(leafOnly)\n}\n\nconst handleExpandChange = (value: CascaderValue) => {\n updatePopperPosition()\n emit('expandChange', value)\n}\n\nconst handleKeyDown = (e: KeyboardEvent) => {\n if (isComposing.value) return\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n togglePopperVisible()\n break\n case EVENT_CODE.down:\n togglePopperVisible(true)\n nextTick(focusFirstNode)\n e.preventDefault()\n break\n case EVENT_CODE.esc:\n if (popperVisible.value === true) {\n e.preventDefault()\n e.stopPropagation()\n togglePopperVisible(false)\n }\n break\n case EVENT_CODE.tab:\n togglePopperVisible(false)\n break\n }\n}\n\nconst handleClear = () => {\n cascaderPanelRef.value?.clearCheckedNodes()\n if (!popperVisible.value && props.filterable) {\n syncPresentTextValue()\n }\n togglePopperVisible(false)\n emit('clear')\n}\n\nconst syncPresentTextValue = () => {\n const { value } = presentText\n inputValue.value = value\n searchInputValue.value = value\n}\n\nconst handleSuggestionClick = (node: CascaderNode) => {\n const { checked } = node\n\n if (multiple.value) {\n cascaderPanelRef.value?.handleCheckChange(node, !checked, false)\n } else {\n !checked && cascaderPanelRef.value?.handleCheckChange(node, true, false)\n togglePopperVisible(false)\n }\n}\n\nconst getSuggestionIndexFromTarget = (target: HTMLElement) => {\n const suggestionItem = target.closest<HTMLElement>('[data-suggestion-index]')\n const indexStr = suggestionItem?.dataset.suggestionIndex\n\n if (!indexStr) return -1\n\n const index = Number.parseInt(indexStr, 10)\n if (Number.isNaN(index) || index < 0 || index >= suggestions.value.length) {\n return -1\n }\n\n return index\n}\n\nconst handleSuggestionKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.up:\n case EVENT_CODE.down: {\n e.preventDefault()\n const distance = code === EVENT_CODE.up ? -1 : 1\n\n if (props.virtualScroll && suggestionVirtualListRef.value) {\n const currentIndex = getSuggestionIndexFromTarget(target)\n if (currentIndex >= 0) {\n const length = suggestions.value.length\n const targetIndex = (currentIndex + distance + length) % length\n\n suggestionVirtualListRef.value.scrollToItem(targetIndex)\n\n nextTick(() => {\n const targetItem = getSuggestionPanelEl(\n `#suggestion-${suggestions.value[targetIndex].uid}`\n )\n targetItem && focusNode(targetItem)\n })\n return\n }\n }\n\n // use DOM-based navigation\n focusNode(\n getSibling(\n target,\n distance,\n `.${nsCascader.e('suggestion-item')}[tabindex=\"-1\"]`\n ) as HTMLElement\n )\n break\n }\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n target.click()\n break\n }\n}\n\nconst handleDelete = () => {\n const lastTag = tags.value[tags.value.length - 1]\n pressDeleteCount = searchInputValue.value ? 0 : pressDeleteCount + 1\n\n if (\n !lastTag ||\n !pressDeleteCount ||\n (props.collapseTags && tags.value.length > 1)\n )\n return\n\n if (lastTag.hitState) {\n deleteTag(lastTag)\n } else {\n lastTag.hitState = true\n }\n}\n\nconst debounce = computed(() => props.debounce)\nconst handleFilter = useDebounceFn(() => {\n const { value } = searchKeyword\n\n if (!value) return\n\n const passed = props.beforeFilter(value)\n\n if (isPromise(passed)) {\n passed.then(calculateSuggestions).catch(() => {\n /* prevent log error */\n })\n } else if (passed !== false) {\n calculateSuggestions()\n } else {\n hideSuggestionPanel()\n }\n}, debounce)\n\nconst handleInput = (val: string, e?: InputEvent) => {\n !popperVisible.value && togglePopperVisible(true)\n\n if (e?.isComposing) return\n\n if (val) {\n handleFilter()\n } else {\n const passed = props.beforeFilter('')\n if (isPromise(passed)) {\n passed.catch(() => {\n /* prevent log error */\n })\n }\n hideSuggestionPanel()\n }\n}\n\nconst getInputInnerHeight = (inputInner: HTMLElement): number =>\n Number.parseFloat(\n useCssVar(nsInput.cssVarName('input-height'), inputInner).value!\n ) - 2\n\nconst focus = () => {\n inputRef.value?.focus()\n}\n\nconst blur = () => {\n inputRef.value?.blur()\n}\n\nwatch(filtering, updatePopperPosition)\n\nwatch(\n [\n checkedNodes,\n isDisabled,\n () => props.collapseTags,\n () => props.maxCollapseTags,\n ],\n calculatePresentTags\n)\n\nwatch(tags, () => {\n nextTick(() => updateStyle())\n})\n\nwatch(realSize, async () => {\n await nextTick()\n const inputInner = inputRef.value!.input!\n inputInitialHeight = getInputInnerHeight(inputInner) || inputInitialHeight\n updateStyle()\n})\n\nwatch(presentText, syncPresentTextValue, { immediate: true })\n\nwatch(\n () => popperVisible.value,\n (val) => {\n if (val && props.props.lazy && props.props.lazyLoad) {\n cascaderPanelRef.value?.loadLazyRootNodes()\n }\n }\n)\n\nonMounted(() => {\n const inputInner = inputRef.value!.input!\n const inputWrapper = inputRef.value!.$el!\n\n const inputInnerHeight = getInputInnerHeight(inputInner)\n\n inputInitialHeight = inputInner.offsetHeight || inputInnerHeight\n useResizeObserver(inputWrapper, updateStyle)\n})\n\ndefineExpose({\n /**\n * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false`\n */\n getCheckedNodes,\n /**\n * @description cascader panel ref\n */\n cascaderPanelRef,\n /**\n * @description toggle the visible of popper\n */\n togglePopperVisible,\n /**\n * @description cascader content ref\n */\n contentRef,\n /**\n * @description selected content text\n */\n presentText,\n /** @description focus the input element */\n focus,\n /** @description blur the input element */\n blur,\n})\n</script>\n"],"mappings":""}
@@ -3,11 +3,11 @@ import { Nullable } from "../../utils/typescript.js";
3
3
  import "../../utils/index.js";
4
4
  import { CASCADER_PANEL_INJECTION_KEY, CascaderConfig, CascaderNodePathValue, CascaderNodeValue, CascaderOption, CascaderProps, CascaderValue, ElCascaderPanelContext, ExpandTrigger, LazyLoad, RenderLabel, RenderLabelProps, Resolve, Tag, isDisabled, isLeaf } from "./src/types.js";
5
5
  import { Node } from "./src/node.js";
6
+ import { CASCADER_PANEL_HEIGHT, CASCADER_PANEL_ITEM_SIZE, CascaderCommonProps, CascaderPanelProps, CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig } from "./src/config.js";
6
7
  import { CascaderMenuInstance, CascaderPanelInstance } from "./src/instance.js";
7
- import { CascaderCommonProps, CascaderPanelProps, CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig } from "./src/config.js";
8
8
  import { _default } from "./src/index.vue.js";
9
9
 
10
10
  //#region ../../packages/components/cascader-panel/index.d.ts
11
11
  declare const ElCascaderPanel: SFCWithInstall<typeof _default>;
12
12
  //#endregion
13
- export { CASCADER_PANEL_INJECTION_KEY, CascaderCommonProps, CascaderConfig, CascaderMenuInstance, Node as CascaderNode, CascaderNodePathValue, CascaderNodeValue, CascaderOption, CascaderPanelInstance, CascaderPanelProps, CascaderProps, CascaderValue, CommonProps, DefaultProps, ElCascaderPanel, ElCascaderPanel as default, ElCascaderPanelContext, ExpandTrigger, LazyLoad, Nullable, RenderLabel, RenderLabelProps, Resolve, Tag, cascaderPanelEmits, cascaderPanelProps, isDisabled, isLeaf, useCascaderConfig };
13
+ export { CASCADER_PANEL_HEIGHT, CASCADER_PANEL_INJECTION_KEY, CASCADER_PANEL_ITEM_SIZE, CascaderCommonProps, CascaderConfig, CascaderMenuInstance, Node as CascaderNode, CascaderNodePathValue, CascaderNodeValue, CascaderOption, CascaderPanelInstance, CascaderPanelProps, CascaderProps, CascaderValue, CommonProps, DefaultProps, ElCascaderPanel, ElCascaderPanel as default, ElCascaderPanelContext, ExpandTrigger, LazyLoad, Nullable, RenderLabel, RenderLabelProps, Resolve, Tag, cascaderPanelEmits, cascaderPanelProps, isDisabled, isLeaf, useCascaderConfig };
@@ -1,5 +1,5 @@
1
1
  import { withInstall } from "../../utils/vue/install.mjs";
2
- import { CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig } from "./src/config.mjs";
2
+ import { CASCADER_PANEL_HEIGHT, CASCADER_PANEL_ITEM_SIZE, CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig } from "./src/config.mjs";
3
3
  import { CASCADER_PANEL_INJECTION_KEY } from "./src/types.mjs";
4
4
  import src_default from "./src/index.mjs";
5
5
 
@@ -7,5 +7,5 @@ import src_default from "./src/index.mjs";
7
7
  const ElCascaderPanel = withInstall(src_default);
8
8
 
9
9
  //#endregion
10
- export { CASCADER_PANEL_INJECTION_KEY, CommonProps, DefaultProps, ElCascaderPanel, ElCascaderPanel as default, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig };
10
+ export { CASCADER_PANEL_HEIGHT, CASCADER_PANEL_INJECTION_KEY, CASCADER_PANEL_ITEM_SIZE, CommonProps, DefaultProps, ElCascaderPanel, ElCascaderPanel as default, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig };
11
11
  //# sourceMappingURL=index.mjs.map
@@ -19,7 +19,27 @@ interface CascaderCommonProps {
19
19
  * @description configuration options, see the following `CascaderProps` table.
20
20
  */
21
21
  props?: CascaderProps;
22
+ /**
23
+ * @description whether to enable virtual scrolling
24
+ */
25
+ virtualScroll?: boolean;
26
+ /**
27
+ * @description node height for virtual scrolling
28
+ */
29
+ itemSize?: number;
30
+ /**
31
+ * @description menu height for virtual scrolling
32
+ */
33
+ height?: number;
22
34
  }
35
+ /**
36
+ * @description node height for virtual scrolling
37
+ */
38
+ declare const CASCADER_PANEL_ITEM_SIZE = 34;
39
+ /**
40
+ * @description menu height for virtual scrolling
41
+ */
42
+ declare const CASCADER_PANEL_HEIGHT = 204;
23
43
  declare const CommonProps: {
24
44
  readonly modelValue: {
25
45
  readonly type: PropType<EpPropMergeType<(new (...args: any[]) => string | number | Record<string, any> | CascaderNodePathValue | (CascaderNodeValue | CascaderNodePathValue)[]) | (() => CascaderValue | null) | (((new (...args: any[]) => string | number | Record<string, any> | CascaderNodePathValue | (CascaderNodeValue | CascaderNodePathValue)[]) | (() => CascaderValue | null)) | null)[], unknown, unknown>>;
@@ -29,6 +49,9 @@ declare const CommonProps: {
29
49
  };
30
50
  readonly options: EpPropFinalized<(new (...args: any[]) => CascaderOption[]) | (() => CascaderOption[]) | (((new (...args: any[]) => CascaderOption[]) | (() => CascaderOption[])) | null)[], unknown, unknown, () => CascaderOption[], boolean>;
31
51
  readonly props: EpPropFinalized<(new (...args: any[]) => CascaderProps) | (() => CascaderProps) | (((new (...args: any[]) => CascaderProps) | (() => CascaderProps)) | null)[], unknown, unknown, () => CascaderProps, boolean>;
52
+ readonly virtualScroll: BooleanConstructor;
53
+ readonly itemSize: EpPropFinalized<NumberConstructor, unknown, unknown, 34, boolean>;
54
+ readonly height: EpPropFinalized<NumberConstructor, unknown, unknown, 204, boolean>;
32
55
  };
33
56
  interface CascaderPanelProps extends CascaderCommonProps {
34
57
  border?: boolean;
@@ -54,6 +77,9 @@ declare const cascaderPanelProps: {
54
77
  };
55
78
  options: EpPropFinalized<(new (...args: any[]) => CascaderOption[]) | (() => CascaderOption[]) | (((new (...args: any[]) => CascaderOption[]) | (() => CascaderOption[])) | null)[], unknown, unknown, () => CascaderOption[], boolean>;
56
79
  props: EpPropFinalized<(new (...args: any[]) => CascaderProps) | (() => CascaderProps) | (((new (...args: any[]) => CascaderProps) | (() => CascaderProps)) | null)[], unknown, unknown, () => CascaderProps, boolean>;
80
+ virtualScroll: BooleanConstructor;
81
+ itemSize: EpPropFinalized<NumberConstructor, unknown, unknown, 34, boolean>;
82
+ height: EpPropFinalized<NumberConstructor, unknown, unknown, 204, boolean>;
57
83
  };
58
84
  declare const cascaderPanelEmits: {
59
85
  "update:modelValue": (value: CascaderValue | undefined | null) => boolean;
@@ -81,4 +107,4 @@ declare const useCascaderConfig: (props: {
81
107
  showPrefix: boolean;
82
108
  }>;
83
109
  //#endregion
84
- export { CascaderCommonProps, CascaderPanelProps, CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig };
110
+ export { CASCADER_PANEL_HEIGHT, CASCADER_PANEL_ITEM_SIZE, CascaderCommonProps, CascaderPanelProps, CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig };
@@ -4,6 +4,14 @@ import { NOOP } from "../../../utils/functions.mjs";
4
4
  import { computed } from "vue";
5
5
 
6
6
  //#region ../../packages/components/cascader-panel/src/config.ts
7
+ /**
8
+ * @description node height for virtual scrolling
9
+ */
10
+ const CASCADER_PANEL_ITEM_SIZE = 34;
11
+ /**
12
+ * @description menu height for virtual scrolling
13
+ */
14
+ const CASCADER_PANEL_HEIGHT = 204;
7
15
  const CommonProps = buildProps({
8
16
  modelValue: { type: definePropType([
9
17
  Number,
@@ -18,6 +26,15 @@ const CommonProps = buildProps({
18
26
  props: {
19
27
  type: definePropType(Object),
20
28
  default: () => ({})
29
+ },
30
+ virtualScroll: Boolean,
31
+ itemSize: {
32
+ type: Number,
33
+ default: CASCADER_PANEL_ITEM_SIZE
34
+ },
35
+ height: {
36
+ type: Number,
37
+ default: CASCADER_PANEL_HEIGHT
21
38
  }
22
39
  });
23
40
  const DefaultProps = {
@@ -63,5 +80,5 @@ const useCascaderConfig = (props) => {
63
80
  };
64
81
 
65
82
  //#endregion
66
- export { CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig };
83
+ export { CASCADER_PANEL_HEIGHT, CASCADER_PANEL_ITEM_SIZE, CommonProps, DefaultProps, cascaderPanelEmits, cascaderPanelProps, useCascaderConfig };
67
84
  //# sourceMappingURL=config.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/config.ts"],"sourcesContent":["import { computed } from 'vue'\nimport { NOOP, buildProps, definePropType } from '@element-plus/utils'\nimport { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '@element-plus/constants'\n\nimport type { PropType } from 'vue'\nimport type {\n CascaderConfig,\n CascaderNodePathValue,\n CascaderOption,\n CascaderProps,\n CascaderValue,\n RenderLabel,\n} from './types'\n\nexport interface CascaderCommonProps {\n /**\n * @description specify which key of node object is used as the node's value\n */\n modelValue?: CascaderValue | null\n /**\n * @description data of the options, the key of `value` and `label` can be customize by `CascaderProps`.\n */\n options?: CascaderOption[]\n /**\n * @description configuration options, see the following `CascaderProps` table.\n */\n props?: CascaderProps\n}\n\nexport const CommonProps = buildProps({\n /**\n * @description specify which key of node object is used as the node's value\n */\n modelValue: {\n type: definePropType<CascaderValue | null>([Number, String, Array, Object]),\n },\n /**\n * @description data of the options, the key of `value` and `label` can be customize by `CascaderProps`.\n */\n options: {\n type: definePropType<CascaderOption[]>(Array),\n default: () => [] as CascaderOption[],\n },\n /**\n * @description configuration options, see the following `CascaderProps` table.\n */\n props: {\n type: definePropType<CascaderProps>(Object),\n default: () => ({}) as CascaderProps,\n },\n} as const)\n\nexport interface CascaderPanelProps extends CascaderCommonProps {\n border?: boolean\n renderLabel?: RenderLabel\n}\n\nexport const DefaultProps: CascaderConfig = {\n /**\n * @description trigger mode of expanding options\n */\n expandTrigger: 'click',\n /**\n * @description whether multiple selection is enabled\n */\n multiple: false,\n /**\n * @description whether checked state of a node not affects its parent and child nodes\n */\n checkStrictly: false, // whether all nodes can be selected\n /**\n * @description when checked nodes change, whether to emit an array of node's path, if false, only emit the value of node.\n */\n emitPath: true, // whether to emit an array of all levels value in which node is located\n /**\n * @description whether to dynamic load child nodes, use with `lazyload` attribute\n */\n lazy: false,\n /**\n * @description method for loading child nodes data, only works when `lazy` is true\n */\n lazyLoad: NOOP,\n /**\n * @description specify which key of node object is used as the node's value\n */\n value: 'value',\n /**\n * @description specify which key of node object is used as the node's label\n */\n label: 'label',\n /**\n * @description specify which key of node object is used as the node's children\n */\n children: 'children',\n /**\n * @description specify which key of node object is used as the node's leaf\n */\n leaf: 'leaf',\n /**\n * @description specify which key of node object is used as the node's disabled\n */\n disabled: 'disabled',\n /**\n * @description hover threshold of expanding options\n */\n hoverThreshold: 500,\n /**\n * @description whether to check or uncheck node when clicking on the node\n */\n checkOnClickNode: false,\n /**\n * @description whether to check or uncheck node when clicking on leaf node (last children).\n */\n checkOnClickLeaf: true,\n /**\n * @description whether to show the radio or checkbox prefix\n */\n showPrefix: true,\n}\n\n/**\n * @deprecated Removed after 3.0.0, Use `CascaderPanelProps` instead.\n */\nexport const cascaderPanelProps = buildProps({\n ...CommonProps,\n border: {\n type: Boolean,\n default: true,\n },\n renderLabel: {\n type: Function as PropType<RenderLabel>,\n },\n})\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst emitChangeFn = (value: CascaderValue | undefined | null) => true\n\nexport const cascaderPanelEmits = {\n [UPDATE_MODEL_EVENT]: emitChangeFn,\n [CHANGE_EVENT]: emitChangeFn,\n close: () => true,\n 'expand-change': (value: CascaderNodePathValue) => value,\n}\n\nexport const useCascaderConfig = (props: { props: CascaderProps }) => {\n return computed(() => ({\n ...DefaultProps,\n ...props.props,\n }))\n}\n"],"mappings":";;;;;;AA6BA,MAAa,cAAc,WAAW;CAIpC,YAAY,EACV,MAAM,eAAqC;EAAC;EAAQ;EAAQ;EAAO;EAAO,CAAC,EAC5E;CAID,SAAS;EACP,MAAM,eAAiC,MAAM;EAC7C,eAAe,EAAE;EAClB;CAID,OAAO;EACL,MAAM,eAA8B,OAAO;EAC3C,gBAAgB,EAAE;EACnB;CACF,CAAU;AAOX,MAAa,eAA+B;CAI1C,eAAe;CAIf,UAAU;CAIV,eAAe;CAIf,UAAU;CAIV,MAAM;CAIN,UAAU;CAIV,OAAO;CAIP,OAAO;CAIP,UAAU;CAIV,MAAM;CAIN,UAAU;CAIV,gBAAgB;CAIhB,kBAAkB;CAIlB,kBAAkB;CAIlB,YAAY;CACb;;;;AAKD,MAAa,qBAAqB,WAAW;CAC3C,GAAG;CACH,QAAQ;EACN,MAAM;EACN,SAAS;EACV;CACD,aAAa,EACX,MAAM,UACP;CACF,CAAC;AAGF,MAAM,gBAAgB,UAA4C;AAElE,MAAa,qBAAqB;EAC/B,qBAAqB;EACrB,eAAe;CAChB,aAAa;CACb,kBAAkB,UAAiC;CACpD;AAED,MAAa,qBAAqB,UAAoC;AACpE,QAAO,gBAAgB;EACrB,GAAG;EACH,GAAG,MAAM;EACV,EAAE"}
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/config.ts"],"sourcesContent":["import { computed } from 'vue'\nimport { NOOP, buildProps, definePropType } from '@element-plus/utils'\nimport { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '@element-plus/constants'\n\nimport type { PropType } from 'vue'\nimport type {\n CascaderConfig,\n CascaderNodePathValue,\n CascaderOption,\n CascaderProps,\n CascaderValue,\n RenderLabel,\n} from './types'\n\nexport interface CascaderCommonProps {\n /**\n * @description specify which key of node object is used as the node's value\n */\n modelValue?: CascaderValue | null\n /**\n * @description data of the options, the key of `value` and `label` can be customize by `CascaderProps`.\n */\n options?: CascaderOption[]\n /**\n * @description configuration options, see the following `CascaderProps` table.\n */\n props?: CascaderProps\n /**\n * @description whether to enable virtual scrolling\n */\n virtualScroll?: boolean\n /**\n * @description node height for virtual scrolling\n */\n itemSize?: number\n /**\n * @description menu height for virtual scrolling\n */\n height?: number\n}\n\n/**\n * @description node height for virtual scrolling\n */\nexport const CASCADER_PANEL_ITEM_SIZE = 34\n\n/**\n * @description menu height for virtual scrolling\n */\nexport const CASCADER_PANEL_HEIGHT = 204\n\nexport const CommonProps = buildProps({\n /**\n * @description specify which key of node object is used as the node's value\n */\n modelValue: {\n type: definePropType<CascaderValue | null>([Number, String, Array, Object]),\n },\n /**\n * @description data of the options, the key of `value` and `label` can be customize by `CascaderProps`.\n */\n options: {\n type: definePropType<CascaderOption[]>(Array),\n default: () => [] as CascaderOption[],\n },\n /**\n * @description configuration options, see the following `CascaderProps` table.\n */\n props: {\n type: definePropType<CascaderProps>(Object),\n default: () => ({}) as CascaderProps,\n },\n /**\n * @description whether to enable virtual scrolling\n */\n virtualScroll: Boolean,\n /**\n * @description node height for virtual scrolling\n */\n itemSize: {\n type: Number,\n default: CASCADER_PANEL_ITEM_SIZE,\n },\n /**\n * @description menu height for virtual scrolling\n */\n height: {\n type: Number,\n default: CASCADER_PANEL_HEIGHT,\n },\n} as const)\n\nexport interface CascaderPanelProps extends CascaderCommonProps {\n border?: boolean\n renderLabel?: RenderLabel\n}\n\nexport const DefaultProps: CascaderConfig = {\n /**\n * @description trigger mode of expanding options\n */\n expandTrigger: 'click',\n /**\n * @description whether multiple selection is enabled\n */\n multiple: false,\n /**\n * @description whether checked state of a node not affects its parent and child nodes\n */\n checkStrictly: false, // whether all nodes can be selected\n /**\n * @description when checked nodes change, whether to emit an array of node's path, if false, only emit the value of node.\n */\n emitPath: true, // whether to emit an array of all levels value in which node is located\n /**\n * @description whether to dynamic load child nodes, use with `lazyload` attribute\n */\n lazy: false,\n /**\n * @description method for loading child nodes data, only works when `lazy` is true\n */\n lazyLoad: NOOP,\n /**\n * @description specify which key of node object is used as the node's value\n */\n value: 'value',\n /**\n * @description specify which key of node object is used as the node's label\n */\n label: 'label',\n /**\n * @description specify which key of node object is used as the node's children\n */\n children: 'children',\n /**\n * @description specify which key of node object is used as the node's leaf\n */\n leaf: 'leaf',\n /**\n * @description specify which key of node object is used as the node's disabled\n */\n disabled: 'disabled',\n /**\n * @description hover threshold of expanding options\n */\n hoverThreshold: 500,\n /**\n * @description whether to check or uncheck node when clicking on the node\n */\n checkOnClickNode: false,\n /**\n * @description whether to check or uncheck node when clicking on leaf node (last children).\n */\n checkOnClickLeaf: true,\n /**\n * @description whether to show the radio or checkbox prefix\n */\n showPrefix: true,\n}\n\n/**\n * @deprecated Removed after 3.0.0, Use `CascaderPanelProps` instead.\n */\nexport const cascaderPanelProps = buildProps({\n ...CommonProps,\n border: {\n type: Boolean,\n default: true,\n },\n renderLabel: {\n type: Function as PropType<RenderLabel>,\n },\n})\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst emitChangeFn = (value: CascaderValue | undefined | null) => true\n\nexport const cascaderPanelEmits = {\n [UPDATE_MODEL_EVENT]: emitChangeFn,\n [CHANGE_EVENT]: emitChangeFn,\n close: () => true,\n 'expand-change': (value: CascaderNodePathValue) => value,\n}\n\nexport const useCascaderConfig = (props: { props: CascaderProps }) => {\n return computed(() => ({\n ...DefaultProps,\n ...props.props,\n }))\n}\n"],"mappings":";;;;;;;;;AA4CA,MAAa,2BAA2B;;;;AAKxC,MAAa,wBAAwB;AAErC,MAAa,cAAc,WAAW;CAIpC,YAAY,EACV,MAAM,eAAqC;EAAC;EAAQ;EAAQ;EAAO;EAAO,CAAC,EAC5E;CAID,SAAS;EACP,MAAM,eAAiC,MAAM;EAC7C,eAAe,EAAE;EAClB;CAID,OAAO;EACL,MAAM,eAA8B,OAAO;EAC3C,gBAAgB,EAAE;EACnB;CAID,eAAe;CAIf,UAAU;EACR,MAAM;EACN,SAAS;EACV;CAID,QAAQ;EACN,MAAM;EACN,SAAS;EACV;CACF,CAAU;AAOX,MAAa,eAA+B;CAI1C,eAAe;CAIf,UAAU;CAIV,eAAe;CAIf,UAAU;CAIV,MAAM;CAIN,UAAU;CAIV,OAAO;CAIP,OAAO;CAIP,UAAU;CAIV,MAAM;CAIN,UAAU;CAIV,gBAAgB;CAIhB,kBAAkB;CAIlB,kBAAkB;CAIlB,YAAY;CACb;;;;AAKD,MAAa,qBAAqB,WAAW;CAC3C,GAAG;CACH,QAAQ;EACN,MAAM;EACN,SAAS;EACV;CACD,aAAa,EACX,MAAM,UACP;CACF,CAAC;AAGF,MAAM,gBAAgB,UAA4C;AAElE,MAAa,qBAAqB;EAC/B,qBAAqB;EACrB,eAAe;CAChB,aAAa;CACb,kBAAkB,UAAiC;CACpD;AAED,MAAa,qBAAqB,UAAoC;AACpE,QAAO,gBAAgB;EACrB,GAAG;EACH,GAAG,MAAM;EACV,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/index.vue"],"sourcesContent":["<template>\n <div\n :class=\"[ns.b('panel'), ns.is('bordered', border)]\"\n @keydown=\"handleKeyDown\"\n >\n <el-cascader-menu\n v-for=\"(menu, index) in menus\"\n :key=\"index\"\n :ref=\"(item) => (menuList[index] = item as CascaderMenuInstance)\"\n :index=\"index\"\n :nodes=\"[...menu]\"\n >\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </el-cascader-menu>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n nextTick,\n onBeforeUpdate,\n onMounted,\n provide,\n reactive,\n ref,\n useSlots,\n watch,\n} from 'vue'\nimport { cloneDeep, flattenDeep, isEqual } from 'lodash-unified'\nimport {\n castArray,\n focusNode,\n getEventCode,\n getSibling,\n isClient,\n isEmpty,\n scrollIntoView,\n unique,\n} from '@element-plus/utils'\nimport {\n CHANGE_EVENT,\n EVENT_CODE,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { useNamespace } from '@element-plus/hooks'\nimport ElCascaderMenu from './menu.vue'\nimport Store from './store'\nimport Node from './node'\nimport { cascaderPanelEmits, useCascaderConfig } from './config'\nimport { checkNode, getMenuIndex, sortByOriginalOrder } from './utils'\nimport { CASCADER_PANEL_INJECTION_KEY } from './types'\n\nimport type {\n CascaderNode,\n CascaderNodeValue,\n CascaderOption,\n CascaderValue,\n ElCascaderPanelContext,\n} from './types'\nimport type { CascaderMenuInstance } from './instance'\nimport type { CascaderPanelProps } from './config'\n\ndefineOptions({\n name: 'ElCascaderPanel',\n})\n\nconst props = withDefaults(defineProps<CascaderPanelProps>(), {\n options: () => [],\n props: () => ({}),\n border: true,\n})\nconst emit = defineEmits(cascaderPanelEmits)\n\n// for interrupt sync check status in lazy mode\nlet manualChecked = false\n\nconst ns = useNamespace('cascader')\nconst config = useCascaderConfig(props)\nconst slots = useSlots()\n\nlet store: Store\nconst initialLoaded = ref(true)\nconst initialLoadedOnce = ref(false)\nconst menuList = ref<CascaderMenuInstance[]>([])\nconst checkedValue = ref<CascaderValue>()\nconst menus = ref<CascaderNode[][]>([])\nconst expandingNode = ref<CascaderNode>()\nconst checkedNodes = ref<CascaderNode[]>([])\n\nconst isHoverMenu = computed(() => config.value.expandTrigger === 'hover')\nconst renderLabelFn = computed(() => props.renderLabel || slots.default)\n\nconst initStore = () => {\n const { options } = props\n const cfg = config.value\n\n manualChecked = false\n store = new Store(options, cfg)\n menus.value = [store.getNodes()]\n\n if (cfg.lazy && isEmpty(props.options)) {\n initialLoaded.value = false\n lazyLoad(undefined, (list) => {\n if (list) {\n store = new Store(list, cfg)\n menus.value = [store.getNodes()]\n }\n initialLoaded.value = true\n syncCheckedValue(false, true)\n })\n } else {\n syncCheckedValue(false, true)\n }\n}\n\nconst lazyLoad: ElCascaderPanelContext['lazyLoad'] = (node, cb) => {\n const cfg = config.value\n node! = node || new Node({}, cfg, undefined, true)\n node.loading = true\n\n const resolve = (dataList?: CascaderOption[]) => {\n const _node = node as Node\n const parent = _node.root ? null : _node\n _node.loading = false\n _node.loaded = true\n _node.childrenData = _node.childrenData || []\n dataList && store?.appendNodes(dataList, parent as Node)\n dataList && cb?.(dataList)\n if (node.level === 0) {\n initialLoadedOnce.value = true\n }\n }\n\n const reject = () => {\n node!.loading = false\n node!.loaded = false\n if (node!.level === 0) {\n initialLoaded.value = true\n }\n }\n\n cfg.lazyLoad(node, resolve, reject)\n}\n\nconst expandNode: ElCascaderPanelContext['expandNode'] = (node, silent) => {\n const { level } = node\n const newMenus = menus.value.slice(0, level)\n let newExpandingNode: CascaderNode\n\n if (node.isLeaf) {\n newExpandingNode = node.pathNodes[level - 2]\n } else {\n newExpandingNode = node\n newMenus.push(node.children)\n }\n\n if (expandingNode.value?.uid !== newExpandingNode?.uid) {\n expandingNode.value = node\n menus.value = newMenus\n !silent && emit('expand-change', node?.pathValues || [])\n }\n}\n\nconst handleCheckChange: ElCascaderPanelContext['handleCheckChange'] = (\n node,\n checked,\n emitClose = true\n) => {\n const { checkStrictly, multiple } = config.value\n const oldNode = checkedNodes.value[0]\n manualChecked = true\n\n !multiple && oldNode?.doCheck(false)\n node.doCheck(checked)\n calculateCheckedValue()\n emitClose && !multiple && !checkStrictly && emit('close')\n !emitClose && !multiple && expandParentNode(node)\n}\n\nconst expandParentNode = (node: Node | undefined) => {\n if (!node) return\n node = node.parent\n expandParentNode(node)\n node && expandNode(node)\n}\n\nconst getFlattedNodes = (leafOnly: boolean) => store?.getFlattedNodes(leafOnly)\n\nconst getCheckedNodes = (leafOnly: boolean) => {\n return getFlattedNodes(leafOnly)?.filter(({ checked }) => checked !== false)\n}\n\nconst clearCheckedNodes = () => {\n checkedNodes.value.forEach((node) => node.doCheck(false))\n calculateCheckedValue()\n menus.value = menus.value.slice(0, 1)\n expandingNode.value = undefined\n emit('expand-change', [])\n}\n\nconst calculateCheckedValue = () => {\n const { checkStrictly, multiple } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = getCheckedNodes(!checkStrictly)!\n // ensure the original order\n const nodes = sortByOriginalOrder(oldNodes, newNodes)\n const values = nodes.map((node) => node.valueByOption)\n checkedNodes.value = nodes\n checkedValue.value = multiple ? values : (values[0] ?? null)\n}\n\nconst syncCheckedValue = (loaded = false, forced = false) => {\n const { modelValue } = props\n const { lazy, multiple, checkStrictly } = config.value\n const leafOnly = !checkStrictly\n\n if (\n !initialLoaded.value ||\n manualChecked ||\n (!forced && isEqual(modelValue, checkedValue.value))\n )\n return\n\n if (lazy && !loaded) {\n const values: CascaderNodeValue[] = unique(\n flattenDeep(castArray(modelValue as CascaderNodeValue[]))\n )\n const nodes = values\n .map((val) => store?.getNodeByValue(val))\n .filter((node) => !!node && !node.loaded && !node.loading) as Node[]\n\n if (nodes.length) {\n nodes.forEach((node) => {\n lazyLoad(node, () => syncCheckedValue(false, forced))\n })\n } else {\n syncCheckedValue(true, forced)\n }\n } else {\n const values = multiple ? castArray(modelValue) : [modelValue]\n const nodes = unique(\n values.map((val) =>\n store?.getNodeByValue(val as CascaderNodeValue, leafOnly)\n )\n ) as Node[]\n syncMenuState(nodes, forced)\n checkedValue.value = cloneDeep(modelValue ?? undefined)\n }\n}\n\nconst syncMenuState = (\n newCheckedNodes: CascaderNode[],\n reserveExpandingState = true\n) => {\n const { checkStrictly } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = newCheckedNodes.filter(\n (node) => !!node && (checkStrictly || node.isLeaf)\n )\n const oldExpandingNode = store?.getSameNode(expandingNode.value!)\n const newExpandingNode =\n (reserveExpandingState && oldExpandingNode) || newNodes[0]\n\n if (newExpandingNode) {\n newExpandingNode.pathNodes.forEach((node) => expandNode(node, true))\n } else {\n expandingNode.value = undefined\n }\n\n oldNodes.forEach((node) => node.doCheck(false))\n reactive(newNodes).forEach((node) => node.doCheck(true))\n checkedNodes.value = newNodes\n nextTick(scrollToExpandingNode)\n}\n\nconst scrollToExpandingNode = () => {\n if (!isClient) return\n\n menuList.value.forEach((menu) => {\n const menuElement = menu?.$el\n if (menuElement) {\n const container = menuElement.querySelector(\n `.${ns.namespace.value}-scrollbar__wrap`\n )\n let activeNode = menuElement.querySelector(\n `.${ns.b('node')}.in-active-path`\n )\n if (!activeNode) {\n const activeElements = menuElement.querySelectorAll(\n `.${ns.b('node')}.${ns.is('active')}`\n )\n activeNode = activeElements[activeElements.length - 1]\n }\n scrollIntoView(container, activeNode)\n }\n })\n}\n\nconst handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.up:\n case EVENT_CODE.down: {\n e.preventDefault()\n const distance = code === EVENT_CODE.up ? -1 : 1\n focusNode(\n getSibling(\n target,\n distance,\n `.${ns.b('node')}[tabindex=\"-1\"]`\n ) as HTMLElement\n )\n break\n }\n case EVENT_CODE.left: {\n e.preventDefault()\n const preMenu = menuList.value[getMenuIndex(target) - 1]\n const expandedNode = preMenu?.$el.querySelector(\n `.${ns.b('node')}[aria-expanded=\"true\"]`\n )\n focusNode(expandedNode)\n break\n }\n case EVENT_CODE.right: {\n e.preventDefault()\n const nextMenu = menuList.value[getMenuIndex(target) + 1]\n const firstNode = nextMenu?.$el.querySelector(\n `.${ns.b('node')}[tabindex=\"-1\"]`\n )\n focusNode(firstNode)\n break\n }\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n checkNode(target)\n break\n }\n}\n\nprovide(\n CASCADER_PANEL_INJECTION_KEY,\n reactive({\n config,\n expandingNode,\n checkedNodes,\n isHoverMenu,\n initialLoaded,\n renderLabelFn,\n lazyLoad,\n expandNode,\n handleCheckChange,\n })\n)\n\nwatch(\n config,\n (newVal, oldVal) => {\n if (isEqual(newVal, oldVal)) return\n initStore()\n },\n {\n immediate: true,\n }\n)\n\nwatch(() => props.options, initStore, {\n deep: true,\n})\n\nwatch(\n () => props.modelValue,\n () => {\n manualChecked = false\n syncCheckedValue()\n },\n {\n deep: true,\n }\n)\n\nwatch(\n () => checkedValue.value,\n (val) => {\n if (!isEqual(val, props.modelValue)) {\n emit(UPDATE_MODEL_EVENT, val)\n emit(CHANGE_EVENT, val)\n }\n }\n)\n\nconst loadLazyRootNodes = () => {\n if (initialLoadedOnce.value) return\n initStore()\n}\n\nonBeforeUpdate(() => (menuList.value = []))\n\nonMounted(() => !isEmpty(props.modelValue) && syncCheckedValue())\n\ndefineExpose({\n menuList,\n menus,\n checkedNodes,\n handleKeyDown,\n handleCheckChange,\n getFlattedNodes,\n /**\n * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false`\n */\n getCheckedNodes,\n /**\n * @description clear checked nodes\n */\n clearCheckedNodes,\n calculateCheckedValue,\n scrollToExpandingNode,\n loadLazyRootNodes,\n})\n</script>\n"],"mappings":""}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/index.vue"],"sourcesContent":["<template>\n <div\n :class=\"[ns.b('panel'), ns.is('bordered', border)]\"\n @keydown=\"handleKeyDown\"\n >\n <el-cascader-menu\n v-for=\"(menu, index) in menus\"\n :key=\"index\"\n :ref=\"(item) => (menuList[index] = item as CascaderMenuInstance)\"\n :index=\"index\"\n :nodes=\"[...menu]\"\n :virtual-scroll=\"virtualScroll\"\n :item-size=\"itemSize\"\n :height=\"height\"\n >\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </el-cascader-menu>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n nextTick,\n onBeforeUpdate,\n onMounted,\n provide,\n reactive,\n ref,\n useSlots,\n watch,\n} from 'vue'\nimport { cloneDeep, flattenDeep, isEqual } from 'lodash-unified'\nimport {\n castArray,\n focusNode,\n getEventCode,\n getSibling,\n isClient,\n isEmpty,\n scrollIntoView,\n unique,\n} from '@element-plus/utils'\nimport {\n CHANGE_EVENT,\n EVENT_CODE,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { useNamespace } from '@element-plus/hooks'\nimport ElCascaderMenu from './menu.vue'\nimport Store from './store'\nimport Node from './node'\nimport {\n CASCADER_PANEL_HEIGHT,\n CASCADER_PANEL_ITEM_SIZE,\n cascaderPanelEmits,\n useCascaderConfig,\n} from './config'\nimport { checkNode, getMenuIndex, sortByOriginalOrder } from './utils'\nimport { CASCADER_PANEL_INJECTION_KEY } from './types'\n\nimport type {\n CascaderNode,\n CascaderNodeValue,\n CascaderOption,\n CascaderValue,\n ElCascaderPanelContext,\n} from './types'\nimport type { CascaderMenuInstance } from './instance'\nimport type { CascaderPanelProps } from './config'\n\ndefineOptions({\n name: 'ElCascaderPanel',\n})\n\nconst props = withDefaults(defineProps<CascaderPanelProps>(), {\n options: () => [],\n props: () => ({}),\n border: true,\n itemSize: CASCADER_PANEL_ITEM_SIZE,\n height: CASCADER_PANEL_HEIGHT,\n})\nconst emit = defineEmits(cascaderPanelEmits)\n\n// for interrupt sync check status in lazy mode\nlet manualChecked = false\n\nconst ns = useNamespace('cascader')\nconst config = useCascaderConfig(props)\nconst slots = useSlots()\n\nlet store: Store\nconst initialLoaded = ref(true)\nconst initialLoadedOnce = ref(false)\nconst menuList = ref<CascaderMenuInstance[]>([])\nconst checkedValue = ref<CascaderValue>()\nconst menus = ref<CascaderNode[][]>([])\nconst expandingNode = ref<CascaderNode>()\nconst checkedNodes = ref<CascaderNode[]>([])\n\nconst isHoverMenu = computed(() => config.value.expandTrigger === 'hover')\nconst renderLabelFn = computed(() => props.renderLabel || slots.default)\nconst virtualScroll = computed(() => props.virtualScroll)\nconst itemSize = computed(() => props.itemSize)\nconst height = computed(() => props.height)\n\nconst initStore = () => {\n const { options } = props\n const cfg = config.value\n\n manualChecked = false\n store = new Store(options, cfg)\n menus.value = [store.getNodes()]\n\n if (cfg.lazy && isEmpty(props.options)) {\n initialLoaded.value = false\n lazyLoad(undefined, (list) => {\n if (list) {\n store = new Store(list, cfg)\n menus.value = [store.getNodes()]\n }\n initialLoaded.value = true\n syncCheckedValue(false, true)\n })\n } else {\n syncCheckedValue(false, true)\n }\n}\n\nconst lazyLoad: ElCascaderPanelContext['lazyLoad'] = (node, cb) => {\n const cfg = config.value\n node! = node || new Node({}, cfg, undefined, true)\n node.loading = true\n\n const resolve = (dataList?: CascaderOption[]) => {\n const _node = node as Node\n const parent = _node.root ? null : _node\n _node.loading = false\n _node.loaded = true\n _node.childrenData = _node.childrenData || []\n dataList && store?.appendNodes(dataList, parent as Node)\n dataList && cb?.(dataList)\n if (node.level === 0) {\n initialLoadedOnce.value = true\n }\n }\n\n const reject = () => {\n node!.loading = false\n node!.loaded = false\n if (node!.level === 0) {\n initialLoaded.value = true\n }\n }\n\n cfg.lazyLoad(node, resolve, reject)\n}\n\nconst expandNode: ElCascaderPanelContext['expandNode'] = (node, silent) => {\n const { level } = node\n const newMenus = menus.value.slice(0, level)\n let newExpandingNode: CascaderNode\n\n if (node.isLeaf) {\n newExpandingNode = node.pathNodes[level - 2]\n } else {\n newExpandingNode = node\n newMenus.push(node.children)\n }\n\n if (expandingNode.value?.uid !== newExpandingNode?.uid) {\n expandingNode.value = node\n menus.value = newMenus\n !silent && emit('expand-change', node?.pathValues || [])\n }\n}\n\nconst handleCheckChange: ElCascaderPanelContext['handleCheckChange'] = (\n node,\n checked,\n emitClose = true\n) => {\n const { checkStrictly, multiple } = config.value\n const oldNode = checkedNodes.value[0]\n manualChecked = true\n\n !multiple && oldNode?.doCheck(false)\n node.doCheck(checked)\n calculateCheckedValue()\n emitClose && !multiple && !checkStrictly && emit('close')\n !emitClose && !multiple && expandParentNode(node)\n}\n\nconst expandParentNode = (node: Node | undefined) => {\n if (!node) return\n node = node.parent\n expandParentNode(node)\n node && expandNode(node)\n}\n\nconst getFlattedNodes = (leafOnly: boolean) => store?.getFlattedNodes(leafOnly)\n\nconst getCheckedNodes = (leafOnly: boolean) => {\n return getFlattedNodes(leafOnly)?.filter(({ checked }) => checked !== false)\n}\n\nconst clearCheckedNodes = () => {\n checkedNodes.value.forEach((node) => node.doCheck(false))\n calculateCheckedValue()\n menus.value = menus.value.slice(0, 1)\n expandingNode.value = undefined\n emit('expand-change', [])\n}\n\nconst calculateCheckedValue = () => {\n const { checkStrictly, multiple } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = getCheckedNodes(!checkStrictly)!\n // ensure the original order\n const nodes = sortByOriginalOrder(oldNodes, newNodes)\n const values = nodes.map((node) => node.valueByOption)\n checkedNodes.value = nodes\n checkedValue.value = multiple ? values : (values[0] ?? null)\n}\n\nconst syncCheckedValue = (loaded = false, forced = false) => {\n const { modelValue } = props\n const { lazy, multiple, checkStrictly } = config.value\n const leafOnly = !checkStrictly\n\n if (\n !initialLoaded.value ||\n manualChecked ||\n (!forced && isEqual(modelValue, checkedValue.value))\n )\n return\n\n if (lazy && !loaded) {\n const values: CascaderNodeValue[] = unique(\n flattenDeep(castArray(modelValue as CascaderNodeValue[]))\n )\n const nodes = values\n .map((val) => store?.getNodeByValue(val))\n .filter((node) => !!node && !node.loaded && !node.loading) as Node[]\n\n if (nodes.length) {\n nodes.forEach((node) => {\n lazyLoad(node, () => syncCheckedValue(false, forced))\n })\n } else {\n syncCheckedValue(true, forced)\n }\n } else {\n const values = multiple ? castArray(modelValue) : [modelValue]\n const nodes = unique(\n values.map((val) =>\n store?.getNodeByValue(val as CascaderNodeValue, leafOnly)\n )\n ) as Node[]\n syncMenuState(nodes, forced)\n checkedValue.value = cloneDeep(modelValue ?? undefined)\n }\n}\n\nconst syncMenuState = (\n newCheckedNodes: CascaderNode[],\n reserveExpandingState = true\n) => {\n const { checkStrictly } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = newCheckedNodes.filter(\n (node) => !!node && (checkStrictly || node.isLeaf)\n )\n const oldExpandingNode = store?.getSameNode(expandingNode.value!)\n const newExpandingNode =\n (reserveExpandingState && oldExpandingNode) || newNodes[0]\n\n if (newExpandingNode) {\n newExpandingNode.pathNodes.forEach((node) => expandNode(node, true))\n } else {\n expandingNode.value = undefined\n }\n\n oldNodes.forEach((node) => node.doCheck(false))\n reactive(newNodes).forEach((node) => node.doCheck(true))\n checkedNodes.value = newNodes\n nextTick(scrollToExpandingNode)\n}\n\nconst scrollToExpandingNode = () => {\n if (!isClient) return\n\n menuList.value.forEach((menu) => {\n const menuElement = menu?.$el\n if (menuElement) {\n // virtual scroll mode, use scrollToItem method\n if (virtualScroll.value) {\n const activeIndex = menu?.getActiveNodeIndex?.()\n if (activeIndex !== undefined && activeIndex >= 0) {\n menu?.scrollToItem?.(activeIndex)\n }\n } else {\n // logic for non-virtual scroll mode\n const container = menuElement.querySelector(\n `.${ns.namespace.value}-scrollbar__wrap`\n )\n let activeNode = menuElement.querySelector(\n `.${ns.b('node')}.in-active-path`\n )\n if (!activeNode) {\n const activeElements = menuElement.querySelectorAll(\n `.${ns.b('node')}.${ns.is('active')}`\n )\n activeNode = activeElements[activeElements.length - 1]\n }\n scrollIntoView(container, activeNode)\n }\n }\n })\n}\n\nconst handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.up:\n case EVENT_CODE.down: {\n e.preventDefault()\n const distance = code === EVENT_CODE.up ? -1 : 1\n\n if (virtualScroll.value) {\n const menuIndex = getMenuIndex(target)\n const menu = menuList.value[menuIndex]\n if (menu) {\n // For virtual scroll, calculate the target index and use focusNodeAt\n const currentIndex = menu.getNodeIndexById(target.id)\n if (currentIndex >= 0) {\n const nodesInMenu = menus.value[menuIndex] ?? []\n const nodesCount = nodesInMenu.length\n // Find the next non-disabled node\n let targetIndex = currentIndex + distance\n while (targetIndex >= 0 && targetIndex < nodesCount) {\n if (!nodesInMenu[targetIndex].isDisabled) {\n menu.focusNodeAt(targetIndex)\n return\n }\n targetIndex += distance\n }\n }\n }\n }\n\n focusNode(\n getSibling(\n target,\n distance,\n `.${ns.b('node')}[tabindex=\"-1\"]`\n ) as HTMLElement\n )\n break\n }\n case EVENT_CODE.left: {\n e.preventDefault()\n const preMenu = menuList.value[getMenuIndex(target) - 1]\n const expandedNode = preMenu?.$el.querySelector(\n `.${ns.b('node')}[aria-expanded=\"true\"]`\n )\n focusNode(expandedNode)\n break\n }\n case EVENT_CODE.right: {\n e.preventDefault()\n const nextMenu = menuList.value[getMenuIndex(target) + 1]\n const firstNode = nextMenu?.$el.querySelector(\n `.${ns.b('node')}[tabindex=\"-1\"]`\n )\n focusNode(firstNode)\n break\n }\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n checkNode(target)\n break\n }\n}\n\nprovide(\n CASCADER_PANEL_INJECTION_KEY,\n reactive({\n config,\n expandingNode,\n checkedNodes,\n isHoverMenu,\n initialLoaded,\n renderLabelFn,\n virtualScroll,\n itemSize,\n height,\n lazyLoad,\n expandNode,\n handleCheckChange,\n })\n)\n\nwatch(\n config,\n (newVal, oldVal) => {\n if (isEqual(newVal, oldVal)) return\n initStore()\n },\n {\n immediate: true,\n }\n)\n\nwatch(() => props.options, initStore, {\n deep: true,\n})\n\nwatch(\n () => props.modelValue,\n () => {\n manualChecked = false\n syncCheckedValue()\n },\n {\n deep: true,\n }\n)\n\nwatch(\n () => checkedValue.value,\n (val) => {\n if (!isEqual(val, props.modelValue)) {\n emit(UPDATE_MODEL_EVENT, val)\n emit(CHANGE_EVENT, val)\n }\n }\n)\n\nconst loadLazyRootNodes = () => {\n if (initialLoadedOnce.value) return\n initStore()\n}\n\nonBeforeUpdate(() => (menuList.value = []))\n\nonMounted(() => !isEmpty(props.modelValue) && syncCheckedValue())\n\ndefineExpose({\n menuList,\n menus,\n checkedNodes,\n handleKeyDown,\n handleCheckChange,\n getFlattedNodes,\n /**\n * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false`\n */\n getCheckedNodes,\n /**\n * @description clear checked nodes\n */\n clearCheckedNodes,\n calculateCheckedValue,\n scrollToExpandingNode,\n loadLazyRootNodes,\n})\n</script>\n"],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  import { CascaderNodePathValue, CascaderNodeValue, CascaderOption, CascaderProps, CascaderValue, ExpandTrigger, LazyLoad, isDisabled, isLeaf } from "./types.js";
2
2
  import { Node } from "./node.js";
3
- import { CascaderMenuInstance } from "./instance.js";
4
3
  import { CascaderPanelProps } from "./config.js";
4
+ import { CascaderMenuInstance } from "./instance.js";
5
5
  import "../../../index.js";
6
6
  import * as vue from "vue";
7
7
 
@@ -269,19 +269,21 @@ declare const __VLS_base: vue.DefineComponent<CascaderPanelProps, {
269
269
  scrollToExpandingNode: () => void;
270
270
  loadLazyRootNodes: () => void;
271
271
  }, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
272
- "update:modelValue": (value: CascaderValue | null | undefined) => void;
273
- change: (value: CascaderValue | null | undefined) => void;
274
272
  close: () => void;
273
+ change: (value: CascaderValue | null | undefined) => void;
274
+ "update:modelValue": (value: CascaderValue | null | undefined) => void;
275
275
  "expand-change": (value: CascaderNodePathValue) => void;
276
276
  }, string, vue.PublicProps, Readonly<CascaderPanelProps> & Readonly<{
277
- "onUpdate:modelValue"?: ((value: CascaderValue | null | undefined) => any) | undefined;
278
- onChange?: ((value: CascaderValue | null | undefined) => any) | undefined;
279
277
  onClose?: (() => any) | undefined;
278
+ onChange?: ((value: CascaderValue | null | undefined) => any) | undefined;
279
+ "onUpdate:modelValue"?: ((value: CascaderValue | null | undefined) => any) | undefined;
280
280
  "onExpand-change"?: ((value: CascaderNodePathValue) => any) | undefined;
281
281
  }>, {
282
282
  props: CascaderProps;
283
283
  border: boolean;
284
+ height: number;
284
285
  options: CascaderOption[];
286
+ itemSize: number;
285
287
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
286
288
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
287
289
  declare const _default: typeof __VLS_export;
@@ -39,6 +39,9 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
39
39
  const checkedNodes = ref([]);
40
40
  const isHoverMenu = computed(() => config.value.expandTrigger === "hover");
41
41
  const renderLabelFn = computed(() => props.renderLabel || slots.default);
42
+ const virtualScroll = computed(() => props.virtualScroll);
43
+ const itemSize = computed(() => props.itemSize);
44
+ const height = computed(() => props.height);
42
45
  const initStore = () => {
43
46
  const { options } = props;
44
47
  const cfg = config.value;
@@ -161,7 +164,10 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
161
164
  if (!isClient) return;
162
165
  menuList.value.forEach((menu) => {
163
166
  const menuElement = menu?.$el;
164
- if (menuElement) {
167
+ if (menuElement) if (virtualScroll.value) {
168
+ const activeIndex = menu?.getActiveNodeIndex?.();
169
+ if (activeIndex !== void 0 && activeIndex >= 0) menu?.scrollToItem?.(activeIndex);
170
+ } else {
165
171
  const container = menuElement.querySelector(`.${ns.namespace.value}-scrollbar__wrap`);
166
172
  let activeNode = menuElement.querySelector(`.${ns.b("node")}.in-active-path`);
167
173
  if (!activeNode) {
@@ -177,10 +183,31 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
177
183
  const code = getEventCode(e);
178
184
  switch (code) {
179
185
  case EVENT_CODE.up:
180
- case EVENT_CODE.down:
186
+ case EVENT_CODE.down: {
181
187
  e.preventDefault();
182
- focusNode(getSibling(target, code === EVENT_CODE.up ? -1 : 1, `.${ns.b("node")}[tabindex="-1"]`));
188
+ const distance = code === EVENT_CODE.up ? -1 : 1;
189
+ if (virtualScroll.value) {
190
+ const menuIndex = getMenuIndex(target);
191
+ const menu = menuList.value[menuIndex];
192
+ if (menu) {
193
+ const currentIndex = menu.getNodeIndexById(target.id);
194
+ if (currentIndex >= 0) {
195
+ const nodesInMenu = menus.value[menuIndex] ?? [];
196
+ const nodesCount = nodesInMenu.length;
197
+ let targetIndex = currentIndex + distance;
198
+ while (targetIndex >= 0 && targetIndex < nodesCount) {
199
+ if (!nodesInMenu[targetIndex].isDisabled) {
200
+ menu.focusNodeAt(targetIndex);
201
+ return;
202
+ }
203
+ targetIndex += distance;
204
+ }
205
+ }
206
+ }
207
+ }
208
+ focusNode(getSibling(target, distance, `.${ns.b("node")}[tabindex="-1"]`));
183
209
  break;
210
+ }
184
211
  case EVENT_CODE.left: {
185
212
  e.preventDefault();
186
213
  const expandedNode = menuList.value[getMenuIndex(target) - 1]?.$el.querySelector(`.${ns.b("node")}[aria-expanded="true"]`);
@@ -206,6 +233,9 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
206
233
  isHoverMenu,
207
234
  initialLoaded,
208
235
  renderLabelFn,
236
+ virtualScroll,
237
+ itemSize,
238
+ height,
209
239
  lazyLoad,
210
240
  expandNode,
211
241
  handleCheckChange
@@ -254,11 +284,20 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
254
284
  ref_for: true,
255
285
  ref: (item) => menuList.value[index] = item,
256
286
  index,
257
- nodes: [...menu]
287
+ nodes: [...menu],
288
+ "virtual-scroll": virtualScroll.value,
289
+ "item-size": itemSize.value,
290
+ height: height.value
258
291
  }, {
259
292
  empty: withCtx(() => [renderSlot(_ctx.$slots, "empty")]),
260
293
  _: 3
261
- }, 8, ["index", "nodes"]);
294
+ }, 8, [
295
+ "index",
296
+ "nodes",
297
+ "virtual-scroll",
298
+ "item-size",
299
+ "height"
300
+ ]);
262
301
  }), 128))], 34);
263
302
  };
264
303
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue_vue_type_script_setup_true_lang.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/index.vue"],"sourcesContent":["<template>\n <div\n :class=\"[ns.b('panel'), ns.is('bordered', border)]\"\n @keydown=\"handleKeyDown\"\n >\n <el-cascader-menu\n v-for=\"(menu, index) in menus\"\n :key=\"index\"\n :ref=\"(item) => (menuList[index] = item as CascaderMenuInstance)\"\n :index=\"index\"\n :nodes=\"[...menu]\"\n >\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </el-cascader-menu>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n nextTick,\n onBeforeUpdate,\n onMounted,\n provide,\n reactive,\n ref,\n useSlots,\n watch,\n} from 'vue'\nimport { cloneDeep, flattenDeep, isEqual } from 'lodash-unified'\nimport {\n castArray,\n focusNode,\n getEventCode,\n getSibling,\n isClient,\n isEmpty,\n scrollIntoView,\n unique,\n} from '@element-plus/utils'\nimport {\n CHANGE_EVENT,\n EVENT_CODE,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { useNamespace } from '@element-plus/hooks'\nimport ElCascaderMenu from './menu.vue'\nimport Store from './store'\nimport Node from './node'\nimport { cascaderPanelEmits, useCascaderConfig } from './config'\nimport { checkNode, getMenuIndex, sortByOriginalOrder } from './utils'\nimport { CASCADER_PANEL_INJECTION_KEY } from './types'\n\nimport type {\n CascaderNode,\n CascaderNodeValue,\n CascaderOption,\n CascaderValue,\n ElCascaderPanelContext,\n} from './types'\nimport type { CascaderMenuInstance } from './instance'\nimport type { CascaderPanelProps } from './config'\n\ndefineOptions({\n name: 'ElCascaderPanel',\n})\n\nconst props = withDefaults(defineProps<CascaderPanelProps>(), {\n options: () => [],\n props: () => ({}),\n border: true,\n})\nconst emit = defineEmits(cascaderPanelEmits)\n\n// for interrupt sync check status in lazy mode\nlet manualChecked = false\n\nconst ns = useNamespace('cascader')\nconst config = useCascaderConfig(props)\nconst slots = useSlots()\n\nlet store: Store\nconst initialLoaded = ref(true)\nconst initialLoadedOnce = ref(false)\nconst menuList = ref<CascaderMenuInstance[]>([])\nconst checkedValue = ref<CascaderValue>()\nconst menus = ref<CascaderNode[][]>([])\nconst expandingNode = ref<CascaderNode>()\nconst checkedNodes = ref<CascaderNode[]>([])\n\nconst isHoverMenu = computed(() => config.value.expandTrigger === 'hover')\nconst renderLabelFn = computed(() => props.renderLabel || slots.default)\n\nconst initStore = () => {\n const { options } = props\n const cfg = config.value\n\n manualChecked = false\n store = new Store(options, cfg)\n menus.value = [store.getNodes()]\n\n if (cfg.lazy && isEmpty(props.options)) {\n initialLoaded.value = false\n lazyLoad(undefined, (list) => {\n if (list) {\n store = new Store(list, cfg)\n menus.value = [store.getNodes()]\n }\n initialLoaded.value = true\n syncCheckedValue(false, true)\n })\n } else {\n syncCheckedValue(false, true)\n }\n}\n\nconst lazyLoad: ElCascaderPanelContext['lazyLoad'] = (node, cb) => {\n const cfg = config.value\n node! = node || new Node({}, cfg, undefined, true)\n node.loading = true\n\n const resolve = (dataList?: CascaderOption[]) => {\n const _node = node as Node\n const parent = _node.root ? null : _node\n _node.loading = false\n _node.loaded = true\n _node.childrenData = _node.childrenData || []\n dataList && store?.appendNodes(dataList, parent as Node)\n dataList && cb?.(dataList)\n if (node.level === 0) {\n initialLoadedOnce.value = true\n }\n }\n\n const reject = () => {\n node!.loading = false\n node!.loaded = false\n if (node!.level === 0) {\n initialLoaded.value = true\n }\n }\n\n cfg.lazyLoad(node, resolve, reject)\n}\n\nconst expandNode: ElCascaderPanelContext['expandNode'] = (node, silent) => {\n const { level } = node\n const newMenus = menus.value.slice(0, level)\n let newExpandingNode: CascaderNode\n\n if (node.isLeaf) {\n newExpandingNode = node.pathNodes[level - 2]\n } else {\n newExpandingNode = node\n newMenus.push(node.children)\n }\n\n if (expandingNode.value?.uid !== newExpandingNode?.uid) {\n expandingNode.value = node\n menus.value = newMenus\n !silent && emit('expand-change', node?.pathValues || [])\n }\n}\n\nconst handleCheckChange: ElCascaderPanelContext['handleCheckChange'] = (\n node,\n checked,\n emitClose = true\n) => {\n const { checkStrictly, multiple } = config.value\n const oldNode = checkedNodes.value[0]\n manualChecked = true\n\n !multiple && oldNode?.doCheck(false)\n node.doCheck(checked)\n calculateCheckedValue()\n emitClose && !multiple && !checkStrictly && emit('close')\n !emitClose && !multiple && expandParentNode(node)\n}\n\nconst expandParentNode = (node: Node | undefined) => {\n if (!node) return\n node = node.parent\n expandParentNode(node)\n node && expandNode(node)\n}\n\nconst getFlattedNodes = (leafOnly: boolean) => store?.getFlattedNodes(leafOnly)\n\nconst getCheckedNodes = (leafOnly: boolean) => {\n return getFlattedNodes(leafOnly)?.filter(({ checked }) => checked !== false)\n}\n\nconst clearCheckedNodes = () => {\n checkedNodes.value.forEach((node) => node.doCheck(false))\n calculateCheckedValue()\n menus.value = menus.value.slice(0, 1)\n expandingNode.value = undefined\n emit('expand-change', [])\n}\n\nconst calculateCheckedValue = () => {\n const { checkStrictly, multiple } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = getCheckedNodes(!checkStrictly)!\n // ensure the original order\n const nodes = sortByOriginalOrder(oldNodes, newNodes)\n const values = nodes.map((node) => node.valueByOption)\n checkedNodes.value = nodes\n checkedValue.value = multiple ? values : (values[0] ?? null)\n}\n\nconst syncCheckedValue = (loaded = false, forced = false) => {\n const { modelValue } = props\n const { lazy, multiple, checkStrictly } = config.value\n const leafOnly = !checkStrictly\n\n if (\n !initialLoaded.value ||\n manualChecked ||\n (!forced && isEqual(modelValue, checkedValue.value))\n )\n return\n\n if (lazy && !loaded) {\n const values: CascaderNodeValue[] = unique(\n flattenDeep(castArray(modelValue as CascaderNodeValue[]))\n )\n const nodes = values\n .map((val) => store?.getNodeByValue(val))\n .filter((node) => !!node && !node.loaded && !node.loading) as Node[]\n\n if (nodes.length) {\n nodes.forEach((node) => {\n lazyLoad(node, () => syncCheckedValue(false, forced))\n })\n } else {\n syncCheckedValue(true, forced)\n }\n } else {\n const values = multiple ? castArray(modelValue) : [modelValue]\n const nodes = unique(\n values.map((val) =>\n store?.getNodeByValue(val as CascaderNodeValue, leafOnly)\n )\n ) as Node[]\n syncMenuState(nodes, forced)\n checkedValue.value = cloneDeep(modelValue ?? undefined)\n }\n}\n\nconst syncMenuState = (\n newCheckedNodes: CascaderNode[],\n reserveExpandingState = true\n) => {\n const { checkStrictly } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = newCheckedNodes.filter(\n (node) => !!node && (checkStrictly || node.isLeaf)\n )\n const oldExpandingNode = store?.getSameNode(expandingNode.value!)\n const newExpandingNode =\n (reserveExpandingState && oldExpandingNode) || newNodes[0]\n\n if (newExpandingNode) {\n newExpandingNode.pathNodes.forEach((node) => expandNode(node, true))\n } else {\n expandingNode.value = undefined\n }\n\n oldNodes.forEach((node) => node.doCheck(false))\n reactive(newNodes).forEach((node) => node.doCheck(true))\n checkedNodes.value = newNodes\n nextTick(scrollToExpandingNode)\n}\n\nconst scrollToExpandingNode = () => {\n if (!isClient) return\n\n menuList.value.forEach((menu) => {\n const menuElement = menu?.$el\n if (menuElement) {\n const container = menuElement.querySelector(\n `.${ns.namespace.value}-scrollbar__wrap`\n )\n let activeNode = menuElement.querySelector(\n `.${ns.b('node')}.in-active-path`\n )\n if (!activeNode) {\n const activeElements = menuElement.querySelectorAll(\n `.${ns.b('node')}.${ns.is('active')}`\n )\n activeNode = activeElements[activeElements.length - 1]\n }\n scrollIntoView(container, activeNode)\n }\n })\n}\n\nconst handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.up:\n case EVENT_CODE.down: {\n e.preventDefault()\n const distance = code === EVENT_CODE.up ? -1 : 1\n focusNode(\n getSibling(\n target,\n distance,\n `.${ns.b('node')}[tabindex=\"-1\"]`\n ) as HTMLElement\n )\n break\n }\n case EVENT_CODE.left: {\n e.preventDefault()\n const preMenu = menuList.value[getMenuIndex(target) - 1]\n const expandedNode = preMenu?.$el.querySelector(\n `.${ns.b('node')}[aria-expanded=\"true\"]`\n )\n focusNode(expandedNode)\n break\n }\n case EVENT_CODE.right: {\n e.preventDefault()\n const nextMenu = menuList.value[getMenuIndex(target) + 1]\n const firstNode = nextMenu?.$el.querySelector(\n `.${ns.b('node')}[tabindex=\"-1\"]`\n )\n focusNode(firstNode)\n break\n }\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n checkNode(target)\n break\n }\n}\n\nprovide(\n CASCADER_PANEL_INJECTION_KEY,\n reactive({\n config,\n expandingNode,\n checkedNodes,\n isHoverMenu,\n initialLoaded,\n renderLabelFn,\n lazyLoad,\n expandNode,\n handleCheckChange,\n })\n)\n\nwatch(\n config,\n (newVal, oldVal) => {\n if (isEqual(newVal, oldVal)) return\n initStore()\n },\n {\n immediate: true,\n }\n)\n\nwatch(() => props.options, initStore, {\n deep: true,\n})\n\nwatch(\n () => props.modelValue,\n () => {\n manualChecked = false\n syncCheckedValue()\n },\n {\n deep: true,\n }\n)\n\nwatch(\n () => checkedValue.value,\n (val) => {\n if (!isEqual(val, props.modelValue)) {\n emit(UPDATE_MODEL_EVENT, val)\n emit(CHANGE_EVENT, val)\n }\n }\n)\n\nconst loadLazyRootNodes = () => {\n if (initialLoadedOnce.value) return\n initStore()\n}\n\nonBeforeUpdate(() => (menuList.value = []))\n\nonMounted(() => !isEmpty(props.modelValue) && syncCheckedValue())\n\ndefineExpose({\n menuList,\n menus,\n checkedNodes,\n handleKeyDown,\n handleCheckChange,\n getFlattedNodes,\n /**\n * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false`\n */\n getCheckedNodes,\n /**\n * @description clear checked nodes\n */\n clearCheckedNodes,\n calculateCheckedValue,\n scrollToExpandingNode,\n loadLazyRootNodes,\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.vue_vue_type_script_setup_true_lang.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/index.vue"],"sourcesContent":["<template>\n <div\n :class=\"[ns.b('panel'), ns.is('bordered', border)]\"\n @keydown=\"handleKeyDown\"\n >\n <el-cascader-menu\n v-for=\"(menu, index) in menus\"\n :key=\"index\"\n :ref=\"(item) => (menuList[index] = item as CascaderMenuInstance)\"\n :index=\"index\"\n :nodes=\"[...menu]\"\n :virtual-scroll=\"virtualScroll\"\n :item-size=\"itemSize\"\n :height=\"height\"\n >\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </el-cascader-menu>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n nextTick,\n onBeforeUpdate,\n onMounted,\n provide,\n reactive,\n ref,\n useSlots,\n watch,\n} from 'vue'\nimport { cloneDeep, flattenDeep, isEqual } from 'lodash-unified'\nimport {\n castArray,\n focusNode,\n getEventCode,\n getSibling,\n isClient,\n isEmpty,\n scrollIntoView,\n unique,\n} from '@element-plus/utils'\nimport {\n CHANGE_EVENT,\n EVENT_CODE,\n UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport { useNamespace } from '@element-plus/hooks'\nimport ElCascaderMenu from './menu.vue'\nimport Store from './store'\nimport Node from './node'\nimport {\n CASCADER_PANEL_HEIGHT,\n CASCADER_PANEL_ITEM_SIZE,\n cascaderPanelEmits,\n useCascaderConfig,\n} from './config'\nimport { checkNode, getMenuIndex, sortByOriginalOrder } from './utils'\nimport { CASCADER_PANEL_INJECTION_KEY } from './types'\n\nimport type {\n CascaderNode,\n CascaderNodeValue,\n CascaderOption,\n CascaderValue,\n ElCascaderPanelContext,\n} from './types'\nimport type { CascaderMenuInstance } from './instance'\nimport type { CascaderPanelProps } from './config'\n\ndefineOptions({\n name: 'ElCascaderPanel',\n})\n\nconst props = withDefaults(defineProps<CascaderPanelProps>(), {\n options: () => [],\n props: () => ({}),\n border: true,\n itemSize: CASCADER_PANEL_ITEM_SIZE,\n height: CASCADER_PANEL_HEIGHT,\n})\nconst emit = defineEmits(cascaderPanelEmits)\n\n// for interrupt sync check status in lazy mode\nlet manualChecked = false\n\nconst ns = useNamespace('cascader')\nconst config = useCascaderConfig(props)\nconst slots = useSlots()\n\nlet store: Store\nconst initialLoaded = ref(true)\nconst initialLoadedOnce = ref(false)\nconst menuList = ref<CascaderMenuInstance[]>([])\nconst checkedValue = ref<CascaderValue>()\nconst menus = ref<CascaderNode[][]>([])\nconst expandingNode = ref<CascaderNode>()\nconst checkedNodes = ref<CascaderNode[]>([])\n\nconst isHoverMenu = computed(() => config.value.expandTrigger === 'hover')\nconst renderLabelFn = computed(() => props.renderLabel || slots.default)\nconst virtualScroll = computed(() => props.virtualScroll)\nconst itemSize = computed(() => props.itemSize)\nconst height = computed(() => props.height)\n\nconst initStore = () => {\n const { options } = props\n const cfg = config.value\n\n manualChecked = false\n store = new Store(options, cfg)\n menus.value = [store.getNodes()]\n\n if (cfg.lazy && isEmpty(props.options)) {\n initialLoaded.value = false\n lazyLoad(undefined, (list) => {\n if (list) {\n store = new Store(list, cfg)\n menus.value = [store.getNodes()]\n }\n initialLoaded.value = true\n syncCheckedValue(false, true)\n })\n } else {\n syncCheckedValue(false, true)\n }\n}\n\nconst lazyLoad: ElCascaderPanelContext['lazyLoad'] = (node, cb) => {\n const cfg = config.value\n node! = node || new Node({}, cfg, undefined, true)\n node.loading = true\n\n const resolve = (dataList?: CascaderOption[]) => {\n const _node = node as Node\n const parent = _node.root ? null : _node\n _node.loading = false\n _node.loaded = true\n _node.childrenData = _node.childrenData || []\n dataList && store?.appendNodes(dataList, parent as Node)\n dataList && cb?.(dataList)\n if (node.level === 0) {\n initialLoadedOnce.value = true\n }\n }\n\n const reject = () => {\n node!.loading = false\n node!.loaded = false\n if (node!.level === 0) {\n initialLoaded.value = true\n }\n }\n\n cfg.lazyLoad(node, resolve, reject)\n}\n\nconst expandNode: ElCascaderPanelContext['expandNode'] = (node, silent) => {\n const { level } = node\n const newMenus = menus.value.slice(0, level)\n let newExpandingNode: CascaderNode\n\n if (node.isLeaf) {\n newExpandingNode = node.pathNodes[level - 2]\n } else {\n newExpandingNode = node\n newMenus.push(node.children)\n }\n\n if (expandingNode.value?.uid !== newExpandingNode?.uid) {\n expandingNode.value = node\n menus.value = newMenus\n !silent && emit('expand-change', node?.pathValues || [])\n }\n}\n\nconst handleCheckChange: ElCascaderPanelContext['handleCheckChange'] = (\n node,\n checked,\n emitClose = true\n) => {\n const { checkStrictly, multiple } = config.value\n const oldNode = checkedNodes.value[0]\n manualChecked = true\n\n !multiple && oldNode?.doCheck(false)\n node.doCheck(checked)\n calculateCheckedValue()\n emitClose && !multiple && !checkStrictly && emit('close')\n !emitClose && !multiple && expandParentNode(node)\n}\n\nconst expandParentNode = (node: Node | undefined) => {\n if (!node) return\n node = node.parent\n expandParentNode(node)\n node && expandNode(node)\n}\n\nconst getFlattedNodes = (leafOnly: boolean) => store?.getFlattedNodes(leafOnly)\n\nconst getCheckedNodes = (leafOnly: boolean) => {\n return getFlattedNodes(leafOnly)?.filter(({ checked }) => checked !== false)\n}\n\nconst clearCheckedNodes = () => {\n checkedNodes.value.forEach((node) => node.doCheck(false))\n calculateCheckedValue()\n menus.value = menus.value.slice(0, 1)\n expandingNode.value = undefined\n emit('expand-change', [])\n}\n\nconst calculateCheckedValue = () => {\n const { checkStrictly, multiple } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = getCheckedNodes(!checkStrictly)!\n // ensure the original order\n const nodes = sortByOriginalOrder(oldNodes, newNodes)\n const values = nodes.map((node) => node.valueByOption)\n checkedNodes.value = nodes\n checkedValue.value = multiple ? values : (values[0] ?? null)\n}\n\nconst syncCheckedValue = (loaded = false, forced = false) => {\n const { modelValue } = props\n const { lazy, multiple, checkStrictly } = config.value\n const leafOnly = !checkStrictly\n\n if (\n !initialLoaded.value ||\n manualChecked ||\n (!forced && isEqual(modelValue, checkedValue.value))\n )\n return\n\n if (lazy && !loaded) {\n const values: CascaderNodeValue[] = unique(\n flattenDeep(castArray(modelValue as CascaderNodeValue[]))\n )\n const nodes = values\n .map((val) => store?.getNodeByValue(val))\n .filter((node) => !!node && !node.loaded && !node.loading) as Node[]\n\n if (nodes.length) {\n nodes.forEach((node) => {\n lazyLoad(node, () => syncCheckedValue(false, forced))\n })\n } else {\n syncCheckedValue(true, forced)\n }\n } else {\n const values = multiple ? castArray(modelValue) : [modelValue]\n const nodes = unique(\n values.map((val) =>\n store?.getNodeByValue(val as CascaderNodeValue, leafOnly)\n )\n ) as Node[]\n syncMenuState(nodes, forced)\n checkedValue.value = cloneDeep(modelValue ?? undefined)\n }\n}\n\nconst syncMenuState = (\n newCheckedNodes: CascaderNode[],\n reserveExpandingState = true\n) => {\n const { checkStrictly } = config.value\n const oldNodes = checkedNodes.value\n const newNodes = newCheckedNodes.filter(\n (node) => !!node && (checkStrictly || node.isLeaf)\n )\n const oldExpandingNode = store?.getSameNode(expandingNode.value!)\n const newExpandingNode =\n (reserveExpandingState && oldExpandingNode) || newNodes[0]\n\n if (newExpandingNode) {\n newExpandingNode.pathNodes.forEach((node) => expandNode(node, true))\n } else {\n expandingNode.value = undefined\n }\n\n oldNodes.forEach((node) => node.doCheck(false))\n reactive(newNodes).forEach((node) => node.doCheck(true))\n checkedNodes.value = newNodes\n nextTick(scrollToExpandingNode)\n}\n\nconst scrollToExpandingNode = () => {\n if (!isClient) return\n\n menuList.value.forEach((menu) => {\n const menuElement = menu?.$el\n if (menuElement) {\n // virtual scroll mode, use scrollToItem method\n if (virtualScroll.value) {\n const activeIndex = menu?.getActiveNodeIndex?.()\n if (activeIndex !== undefined && activeIndex >= 0) {\n menu?.scrollToItem?.(activeIndex)\n }\n } else {\n // logic for non-virtual scroll mode\n const container = menuElement.querySelector(\n `.${ns.namespace.value}-scrollbar__wrap`\n )\n let activeNode = menuElement.querySelector(\n `.${ns.b('node')}.in-active-path`\n )\n if (!activeNode) {\n const activeElements = menuElement.querySelectorAll(\n `.${ns.b('node')}.${ns.is('active')}`\n )\n activeNode = activeElements[activeElements.length - 1]\n }\n scrollIntoView(container, activeNode)\n }\n }\n })\n}\n\nconst handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement\n const code = getEventCode(e)\n\n switch (code) {\n case EVENT_CODE.up:\n case EVENT_CODE.down: {\n e.preventDefault()\n const distance = code === EVENT_CODE.up ? -1 : 1\n\n if (virtualScroll.value) {\n const menuIndex = getMenuIndex(target)\n const menu = menuList.value[menuIndex]\n if (menu) {\n // For virtual scroll, calculate the target index and use focusNodeAt\n const currentIndex = menu.getNodeIndexById(target.id)\n if (currentIndex >= 0) {\n const nodesInMenu = menus.value[menuIndex] ?? []\n const nodesCount = nodesInMenu.length\n // Find the next non-disabled node\n let targetIndex = currentIndex + distance\n while (targetIndex >= 0 && targetIndex < nodesCount) {\n if (!nodesInMenu[targetIndex].isDisabled) {\n menu.focusNodeAt(targetIndex)\n return\n }\n targetIndex += distance\n }\n }\n }\n }\n\n focusNode(\n getSibling(\n target,\n distance,\n `.${ns.b('node')}[tabindex=\"-1\"]`\n ) as HTMLElement\n )\n break\n }\n case EVENT_CODE.left: {\n e.preventDefault()\n const preMenu = menuList.value[getMenuIndex(target) - 1]\n const expandedNode = preMenu?.$el.querySelector(\n `.${ns.b('node')}[aria-expanded=\"true\"]`\n )\n focusNode(expandedNode)\n break\n }\n case EVENT_CODE.right: {\n e.preventDefault()\n const nextMenu = menuList.value[getMenuIndex(target) + 1]\n const firstNode = nextMenu?.$el.querySelector(\n `.${ns.b('node')}[tabindex=\"-1\"]`\n )\n focusNode(firstNode)\n break\n }\n case EVENT_CODE.enter:\n case EVENT_CODE.numpadEnter:\n checkNode(target)\n break\n }\n}\n\nprovide(\n CASCADER_PANEL_INJECTION_KEY,\n reactive({\n config,\n expandingNode,\n checkedNodes,\n isHoverMenu,\n initialLoaded,\n renderLabelFn,\n virtualScroll,\n itemSize,\n height,\n lazyLoad,\n expandNode,\n handleCheckChange,\n })\n)\n\nwatch(\n config,\n (newVal, oldVal) => {\n if (isEqual(newVal, oldVal)) return\n initStore()\n },\n {\n immediate: true,\n }\n)\n\nwatch(() => props.options, initStore, {\n deep: true,\n})\n\nwatch(\n () => props.modelValue,\n () => {\n manualChecked = false\n syncCheckedValue()\n },\n {\n deep: true,\n }\n)\n\nwatch(\n () => checkedValue.value,\n (val) => {\n if (!isEqual(val, props.modelValue)) {\n emit(UPDATE_MODEL_EVENT, val)\n emit(CHANGE_EVENT, val)\n }\n }\n)\n\nconst loadLazyRootNodes = () => {\n if (initialLoadedOnce.value) return\n initStore()\n}\n\nonBeforeUpdate(() => (menuList.value = []))\n\nonMounted(() => !isEmpty(props.modelValue) && syncCheckedValue())\n\ndefineExpose({\n menuList,\n menus,\n checkedNodes,\n handleKeyDown,\n handleCheckChange,\n getFlattedNodes,\n /**\n * @description get an array of currently selected node,(leafOnly) whether only return the leaf checked nodes, default is `false`\n */\n getCheckedNodes,\n /**\n * @description clear checked nodes\n */\n clearCheckedNodes,\n calculateCheckedValue,\n scrollToExpandingNode,\n loadLazyRootNodes,\n})\n</script>\n"],"mappings":"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"}