vft 0.0.1

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 (321) hide show
  1. package/package.json +54 -0
  2. package/src/app/index.ts +3 -0
  3. package/src/app/page-loading/assets/spin.gif +0 -0
  4. package/src/app/page-loading/index.less +10 -0
  5. package/src/app/page-loading/index.ts +3 -0
  6. package/src/app/page-loading/index.vue +38 -0
  7. package/src/app/table/assets/sort_triangle.png +0 -0
  8. package/src/app/table/demos/basic.vue +117 -0
  9. package/src/app/table/demos/complex.vue +2543 -0
  10. package/src/app/table/demos/index.vue +453 -0
  11. package/src/app/table/demos/rightAngle.png +0 -0
  12. package/src/app/table/header.vue +203 -0
  13. package/src/app/table/index.less +119 -0
  14. package/src/app/table/index.ts +5 -0
  15. package/src/app/table/index.vue +478 -0
  16. package/src/app/table/md/api.md +23 -0
  17. package/src/app/table/md/demo.md +3 -0
  18. package/src/app/table/types.ts +45 -0
  19. package/src/common/badge/index.scss +78 -0
  20. package/src/common/badge/index.ts +4 -0
  21. package/src/common/badge/index.vue +111 -0
  22. package/src/common/badge/types.ts +1 -0
  23. package/src/common/clamp/clamp-toggle.vue +91 -0
  24. package/src/common/clamp/index.ts +4 -0
  25. package/src/common/clamp/index.vue +247 -0
  26. package/src/common/code/index.less +321 -0
  27. package/src/common/code/index.ts +3 -0
  28. package/src/common/code/index.vue +60 -0
  29. package/src/common/config-provider/index.ts +4 -0
  30. package/src/common/config-provider/index.vue +94 -0
  31. package/src/common/config-provider/types.ts +29 -0
  32. package/src/common/icon/iconfont/iconfont.css +334 -0
  33. package/src/common/icon/index.scss +31 -0
  34. package/src/common/icon/index.ts +4 -0
  35. package/src/common/icon/index.vue +74 -0
  36. package/src/common/icon/types.ts +16 -0
  37. package/src/common/index.ts +6 -0
  38. package/src/common/message/index.ts +5 -0
  39. package/src/common/message/instance.ts +29 -0
  40. package/src/common/message/message.scss +108 -0
  41. package/src/common/message/message.ts +80 -0
  42. package/src/common/message/message.vue +162 -0
  43. package/src/common/message/method.ts +172 -0
  44. package/src/common/overlay/index.scss +14 -0
  45. package/src/common/overlay/index.ts +3 -0
  46. package/src/common/overlay/index.vue +117 -0
  47. package/src/constants/comp.ts +1 -0
  48. package/src/constants/index.ts +1 -0
  49. package/src/index.ts +3 -0
  50. package/src/page/index.ts +1 -0
  51. package/src/page/page-wrapper/index.scss +31 -0
  52. package/src/page/page-wrapper/index.ts +5 -0
  53. package/src/page/page-wrapper/index.vue +31 -0
  54. package/src/styles/vars.scss +500 -0
  55. package/src/use/index.ts +14 -0
  56. package/src/use/onPopupReopen.ts +15 -0
  57. package/src/use/use-delayed-toggle/index.ts +30 -0
  58. package/src/use/use-floating/index.ts +121 -0
  59. package/src/use/use-forward-ref.ts +35 -0
  60. package/src/use/use-global-config/index.ts +81 -0
  61. package/src/use/use-id/index.ts +43 -0
  62. package/src/use/use-model-toggle/index.ts +151 -0
  63. package/src/use/use-namespace/index.ts +91 -0
  64. package/src/use/use-ordered-children/index.ts +43 -0
  65. package/src/use/use-popper-container/index.ts +43 -0
  66. package/src/use/use-timeout/index.ts +18 -0
  67. package/src/use/use-z-index/index.ts +20 -0
  68. package/src/use/useGlobalZIndex.ts +24 -0
  69. package/src/use/useLazyRender.ts +17 -0
  70. package/src/use/useLockScroll.ts +66 -0
  71. package/src/utils/aria.ts +126 -0
  72. package/src/utils/arrays.ts +13 -0
  73. package/src/utils/error.ts +23 -0
  74. package/src/utils/event.ts +15 -0
  75. package/src/utils/helper.ts +7 -0
  76. package/src/utils/index.ts +8 -0
  77. package/src/utils/interceptor.ts +39 -0
  78. package/src/utils/mount-component.ts +65 -0
  79. package/src/utils/popper.ts +6 -0
  80. package/src/utils/rand.ts +12 -0
  81. package/src/utils/scroll.ts +101 -0
  82. package/src/utils/vnode.ts +169 -0
  83. package/src/web/avatar/index.scss +50 -0
  84. package/src/web/avatar/index.ts +3 -0
  85. package/src/web/avatar/index.vue +83 -0
  86. package/src/web/back-top/index.scss +35 -0
  87. package/src/web/back-top/index.ts +3 -0
  88. package/src/web/back-top/index.vue +72 -0
  89. package/src/web/back-top/types.ts +14 -0
  90. package/src/web/back-top/use-back-top.ts +65 -0
  91. package/src/web/cascader/index.scss +214 -0
  92. package/src/web/cascader/index.ts +5 -0
  93. package/src/web/cascader/index.vue +767 -0
  94. package/src/web/cascader-panel/config.ts +44 -0
  95. package/src/web/cascader-panel/index.scss +134 -0
  96. package/src/web/cascader-panel/index.ts +5 -0
  97. package/src/web/cascader-panel/index.vue +319 -0
  98. package/src/web/cascader-panel/menu.vue +135 -0
  99. package/src/web/cascader-panel/node-content.ts +23 -0
  100. package/src/web/cascader-panel/node.ts +218 -0
  101. package/src/web/cascader-panel/node.vue +197 -0
  102. package/src/web/cascader-panel/store.ts +83 -0
  103. package/src/web/cascader-panel/types.ts +56 -0
  104. package/src/web/cascader-panel/utils.ts +40 -0
  105. package/src/web/cascader-select/README.md +31 -0
  106. package/src/web/cascader-select/index.scss +54 -0
  107. package/src/web/cascader-select/index.ts +5 -0
  108. package/src/web/cascader-select/index.vue +132 -0
  109. package/src/web/cascader-select/types.ts +9 -0
  110. package/src/web/context-menu/createContextMenu.ts +72 -0
  111. package/src/web/context-menu/index.ts +4 -0
  112. package/src/web/context-menu/index.vue +89 -0
  113. package/src/web/context-menu/types.ts +27 -0
  114. package/src/web/context-menu/useContextMenu.ts +14 -0
  115. package/src/web/descriptions/description-item.vue +34 -0
  116. package/src/web/descriptions/description.vue +124 -0
  117. package/src/web/descriptions/descriptions-cell.ts +95 -0
  118. package/src/web/descriptions/descriptions-item.scss +68 -0
  119. package/src/web/descriptions/descriptions-row.vue +49 -0
  120. package/src/web/descriptions/descriptions.scss +153 -0
  121. package/src/web/descriptions/descriptions.type.ts +19 -0
  122. package/src/web/descriptions/index.ts +4 -0
  123. package/src/web/descriptions/token.ts +4 -0
  124. package/src/web/divider/index.scss +53 -0
  125. package/src/web/divider/index.ts +5 -0
  126. package/src/web/divider/index.vue +60 -0
  127. package/src/web/divider/types.ts +2 -0
  128. package/src/web/empty/assets/no-collect.png +0 -0
  129. package/src/web/empty/assets/no-data.png +0 -0
  130. package/src/web/empty/assets/no-filter.png +0 -0
  131. package/src/web/empty/assets/no-page-data.png +0 -0
  132. package/src/web/empty/assets/no-search.png +0 -0
  133. package/src/web/empty/constants.ts +12 -0
  134. package/src/web/empty/index.scss +57 -0
  135. package/src/web/empty/index.ts +5 -0
  136. package/src/web/empty/index.vue +96 -0
  137. package/src/web/exception/exception.png +0 -0
  138. package/src/web/exception/index.ts +3 -0
  139. package/src/web/exception/index.vue +44 -0
  140. package/src/web/filter/README.md +25 -0
  141. package/src/web/filter/index.scss +14 -0
  142. package/src/web/filter/index.ts +5 -0
  143. package/src/web/filter/index.vue +60 -0
  144. package/src/web/filter/type.ts +13 -0
  145. package/src/web/focus-trap/index.ts +6 -0
  146. package/src/web/focus-trap/index.vue +328 -0
  147. package/src/web/focus-trap/tokens.ts +23 -0
  148. package/src/web/focus-trap/utils.ts +178 -0
  149. package/src/web/full-screen/index.scss +22 -0
  150. package/src/web/full-screen/index.ts +3 -0
  151. package/src/web/full-screen/index.vue +24 -0
  152. package/src/web/icon-text/index.ts +3 -0
  153. package/src/web/icon-text/index.vue +77 -0
  154. package/src/web/image/index.scss +46 -0
  155. package/src/web/image/index.ts +5 -0
  156. package/src/web/image/index.vue +251 -0
  157. package/src/web/image/types.ts +1 -0
  158. package/src/web/index.ts +33 -0
  159. package/src/web/input/index.scss +473 -0
  160. package/src/web/input/index.ts +3 -0
  161. package/src/web/input/index.vue +533 -0
  162. package/src/web/input/utils.ts +102 -0
  163. package/src/web/layouts/blank.vue +4 -0
  164. package/src/web/layouts/footer/index.scss +31 -0
  165. package/src/web/layouts/footer/index.ts +3 -0
  166. package/src/web/layouts/footer/index.vue +38 -0
  167. package/src/web/layouts/header/index.scss +35 -0
  168. package/src/web/layouts/header/index.ts +3 -0
  169. package/src/web/layouts/header/index.vue +47 -0
  170. package/src/web/layouts/iframe/index.scss +18 -0
  171. package/src/web/layouts/iframe/index.vue +36 -0
  172. package/src/web/layouts/iframe/page.vue +30 -0
  173. package/src/web/layouts/index.ts +8 -0
  174. package/src/web/layouts/router-view-content/index.vue +70 -0
  175. package/src/web/link/index.scss +95 -0
  176. package/src/web/link/index.ts +3 -0
  177. package/src/web/link/index.vue +68 -0
  178. package/src/web/loading/directive.ts +104 -0
  179. package/src/web/loading/index.ts +6 -0
  180. package/src/web/loading/loading.scss +108 -0
  181. package/src/web/loading/loading.ts +156 -0
  182. package/src/web/loading/service.ts +145 -0
  183. package/src/web/loading/types.ts +29 -0
  184. package/src/web/logo/index.scss +31 -0
  185. package/src/web/logo/index.ts +5 -0
  186. package/src/web/logo/index.vue +45 -0
  187. package/src/web/logo/types.ts +6 -0
  188. package/src/web/menu/index.scss +336 -0
  189. package/src/web/menu/index.ts +8 -0
  190. package/src/web/menu/menu-collapse-transition.vue +62 -0
  191. package/src/web/menu/menu-item-group.vue +27 -0
  192. package/src/web/menu/menu-item.vue +126 -0
  193. package/src/web/menu/menu.vue +459 -0
  194. package/src/web/menu/sub-menu.vue +440 -0
  195. package/src/web/menu/types.ts +66 -0
  196. package/src/web/menu/use-menu-css-var.ts +11 -0
  197. package/src/web/menu/use-menu.ts +60 -0
  198. package/src/web/menu/utils/menu-bar.ts +19 -0
  199. package/src/web/menu/utils/menu-item.ts +55 -0
  200. package/src/web/menu/utils/submenu.ts +66 -0
  201. package/src/web/multiple-select-flat/index.ts +5 -0
  202. package/src/web/multiple-select-flat/index.vue +53 -0
  203. package/src/web/multiple-select-flat/types.ts +5 -0
  204. package/src/web/multiple-tabs/index.scss +16 -0
  205. package/src/web/multiple-tabs/index.ts +5 -0
  206. package/src/web/multiple-tabs/index.vue +193 -0
  207. package/src/web/multiple-tabs/tab-content.vue +40 -0
  208. package/src/web/multiple-tabs/types.ts +3 -0
  209. package/src/web/multiple-tabs/use/index.ts +2 -0
  210. package/src/web/multiple-tabs/use/use-multiple-tabs.ts +86 -0
  211. package/src/web/multiple-tabs/use/use-tab-dropdown.ts +101 -0
  212. package/src/web/nodata/README.md +42 -0
  213. package/src/web/nodata/fail.vue +13 -0
  214. package/src/web/nodata/img/100.png +0 -0
  215. package/src/web/nodata/img/101.png +0 -0
  216. package/src/web/nodata/img/102.png +0 -0
  217. package/src/web/nodata/img/103.png +0 -0
  218. package/src/web/nodata/img/104.png +0 -0
  219. package/src/web/nodata/img/105.png +0 -0
  220. package/src/web/nodata/img/106.png +0 -0
  221. package/src/web/nodata/img/107.png +0 -0
  222. package/src/web/nodata/img/200.png +0 -0
  223. package/src/web/nodata/img/201.png +0 -0
  224. package/src/web/nodata/img/202.png +0 -0
  225. package/src/web/nodata/img/203.png +0 -0
  226. package/src/web/nodata/index.scss +37 -0
  227. package/src/web/nodata/index.ts +6 -0
  228. package/src/web/nodata/index.vue +46 -0
  229. package/src/web/nodata/types.ts +17 -0
  230. package/src/web/only-child/index.tsx +69 -0
  231. package/src/web/pagination/components/jumper.vue +49 -0
  232. package/src/web/pagination/components/next.vue +40 -0
  233. package/src/web/pagination/components/pager.vue +215 -0
  234. package/src/web/pagination/components/prev.vue +35 -0
  235. package/src/web/pagination/components/sizes.vue +76 -0
  236. package/src/web/pagination/components/total.vue +21 -0
  237. package/src/web/pagination/index.scss +231 -0
  238. package/src/web/pagination/index.ts +5 -0
  239. package/src/web/pagination/pagination.ts +363 -0
  240. package/src/web/pagination/usePagination.ts +13 -0
  241. package/src/web/popover/directive.ts +21 -0
  242. package/src/web/popover/index.scss +58 -0
  243. package/src/web/popover/index.ts +3 -0
  244. package/src/web/popover/index.vue +161 -0
  245. package/src/web/popover/types.ts +26 -0
  246. package/src/web/popper/arrow.vue +45 -0
  247. package/src/web/popper/content.vue +311 -0
  248. package/src/web/popper/index.scss +108 -0
  249. package/src/web/popper/index.ts +11 -0
  250. package/src/web/popper/popper.vue +57 -0
  251. package/src/web/popper/tokens.ts +28 -0
  252. package/src/web/popper/trigger.vue +166 -0
  253. package/src/web/popper/types.ts +49 -0
  254. package/src/web/popper/utils.ts +81 -0
  255. package/src/web/qrcode/drawCanvas.ts +32 -0
  256. package/src/web/qrcode/drawLogo.ts +82 -0
  257. package/src/web/qrcode/index.ts +5 -0
  258. package/src/web/qrcode/index.vue +107 -0
  259. package/src/web/qrcode/qrcodePlus.ts +4 -0
  260. package/src/web/qrcode/toCanvas.ts +11 -0
  261. package/src/web/qrcode/types.ts +38 -0
  262. package/src/web/result/index.scss +69 -0
  263. package/src/web/result/index.ts +3 -0
  264. package/src/web/result/index.vue +63 -0
  265. package/src/web/scrollbar/bar.vue +48 -0
  266. package/src/web/scrollbar/index.scss +91 -0
  267. package/src/web/scrollbar/index.ts +5 -0
  268. package/src/web/scrollbar/index.vue +236 -0
  269. package/src/web/scrollbar/thumb.vue +183 -0
  270. package/src/web/scrollbar/tokens.ts +10 -0
  271. package/src/web/scrollbar/types.ts +7 -0
  272. package/src/web/scrollbar/util.ts +38 -0
  273. package/src/web/select/constants.ts +13 -0
  274. package/src/web/select/index.ts +11 -0
  275. package/src/web/select/index.vue +555 -0
  276. package/src/web/select/option-group.scss +49 -0
  277. package/src/web/select/option-group.vue +97 -0
  278. package/src/web/select/option-item.scss +66 -0
  279. package/src/web/select/option.scss +32 -0
  280. package/src/web/select/option.vue +110 -0
  281. package/src/web/select/select-dropdown.scss +86 -0
  282. package/src/web/select/select-dropdown.vue +51 -0
  283. package/src/web/select/select.scss +213 -0
  284. package/src/web/select/token.ts +56 -0
  285. package/src/web/select/useOption.ts +146 -0
  286. package/src/web/select/useSelect.ts +942 -0
  287. package/src/web/select/utils.ts +5 -0
  288. package/src/web/side-menu/index.scss +66 -0
  289. package/src/web/side-menu/index.ts +4 -0
  290. package/src/web/side-menu/index.vue +228 -0
  291. package/src/web/side-menu/types.ts +20 -0
  292. package/src/web/single-select/index.scss +60 -0
  293. package/src/web/single-select/index.ts +5 -0
  294. package/src/web/single-select/index.vue +70 -0
  295. package/src/web/single-select/select@2x.png +0 -0
  296. package/src/web/single-select/types.ts +5 -0
  297. package/src/web/svg/index.ts +3 -0
  298. package/src/web/svg/index.vue +22 -0
  299. package/src/web/tabs/index.scss +579 -0
  300. package/src/web/tabs/index.ts +6 -0
  301. package/src/web/tabs/index.vue +236 -0
  302. package/src/web/tabs/tab-bar.vue +90 -0
  303. package/src/web/tabs/tab-nav.vue +403 -0
  304. package/src/web/tabs/tab-pane.vue +90 -0
  305. package/src/web/tabs/types.ts +66 -0
  306. package/src/web/tag/index.scss +182 -0
  307. package/src/web/tag/index.ts +5 -0
  308. package/src/web/tag/index.vue +78 -0
  309. package/src/web/tag/types.ts +2 -0
  310. package/src/web/tooltip/content.vue +239 -0
  311. package/src/web/tooltip/index.ts +4 -0
  312. package/src/web/tooltip/tokens.ts +21 -0
  313. package/src/web/tooltip/tooltip.vue +270 -0
  314. package/src/web/tooltip/trigger.vue +119 -0
  315. package/src/web/tooltip/types.ts +56 -0
  316. package/src/web/tooltip/utils.ts +20 -0
  317. package/src/web/transition/collapse-transition.vue +73 -0
  318. package/src/web/transition/index.ts +5 -0
  319. package/tsconfig.json +8 -0
  320. package/types/component.ts +1 -0
  321. package/types/index.d.ts +286 -0
@@ -0,0 +1,942 @@
1
+ import {
2
+ computed,
3
+ nextTick,
4
+ reactive,
5
+ ref,
6
+ shallowRef,
7
+ toRaw,
8
+ triggerRef,
9
+ watch
10
+ } from 'vue';
11
+ import { isObject, toRawType } from '@vue/shared';
12
+ import { get, isEqual, debounce as lodashDebounce } from 'lodash';
13
+ import { isClient } from '@vueuse/core';
14
+ import {
15
+ CHANGE_EVENT,
16
+ EVENT_CODE,
17
+ UPDATE_MODEL_EVENT
18
+ } from '@vri/constants';
19
+ import {
20
+ isFunction,
21
+ isNumber,
22
+ isString,
23
+ isKorean
24
+ } from '@vri/utils';
25
+
26
+ import {
27
+ debugWarn,
28
+ scrollIntoView
29
+ } from '../../utils';
30
+
31
+ import { getComponentSize } from './utils';
32
+
33
+ import {
34
+ useDeprecated,
35
+ useFormItem,
36
+ useLocale,
37
+ useSize,
38
+ type ElTooltip
39
+ } from 'element-plus';
40
+
41
+ import { useNamespace } from '../../use';
42
+
43
+ import type { ComponentPublicInstance } from 'vue';
44
+ import type { QueryChangeCtx, SelectOptionProxy } from './token';
45
+
46
+ export function useSelectStates (props) {
47
+ const { t } = useLocale();
48
+ return reactive({
49
+ options: new Map(),
50
+ cachedOptions: new Map(),
51
+ createdLabel: null,
52
+ createdSelected: false,
53
+ selected: props.multiple ? [] : ({} as any),
54
+ inputLength: 20,
55
+ inputWidth: 0,
56
+ optionsCount: 0,
57
+ filteredOptionsCount: 0,
58
+ visible: false,
59
+ softFocus: false,
60
+ selectedLabel: '',
61
+ hoverIndex: -1,
62
+ query: '',
63
+ previousQuery: null,
64
+ inputHovering: false,
65
+ cachedPlaceHolder: '',
66
+ currentPlaceholder: t('el.select.placeholder'),
67
+ menuVisibleOnFocus: false,
68
+ isOnComposition: false,
69
+ isSilentBlur: false,
70
+ prefixWidth: 11,
71
+ tagInMultiLine: false,
72
+ mouseEnter: false
73
+ });
74
+ }
75
+
76
+ type States = ReturnType<typeof useSelectStates>
77
+
78
+ export const useSelect = (props, states: States, ctx) => {
79
+ const { t } = useLocale();
80
+ const ns = useNamespace('select');
81
+
82
+ useDeprecated(
83
+ {
84
+ from: 'suffixTransition',
85
+ replacement: 'override style scheme',
86
+ version: '2.3.0',
87
+ scope: 'props',
88
+ ref: 'https://element-plus.org/en-US/component/select.html#select-attributes'
89
+ },
90
+ computed(() => props.suffixTransition === false)
91
+ );
92
+
93
+ // template refs
94
+ const reference = ref<ComponentPublicInstance<{
95
+ focus: () => void
96
+ blur: () => void
97
+ input: HTMLInputElement
98
+ }> | null>(null);
99
+ const input = ref<HTMLInputElement | null>(null);
100
+ const tooltipRef = ref<InstanceType<typeof ElTooltip> | null>(null);
101
+ const tags = ref<HTMLElement | null>(null);
102
+ const selectWrapper = ref<HTMLElement | null>(null);
103
+ const scrollbar = ref<{
104
+ handleScroll: () => void
105
+ } | null>(null);
106
+ const hoverOption = ref(-1);
107
+ const queryChange = shallowRef<QueryChangeCtx>({ query: '' });
108
+ const groupQueryChange = shallowRef('');
109
+
110
+ const { form, formItem } = useFormItem();
111
+
112
+ const readonly = computed(
113
+ () => !props.filterable || props.multiple || !states.visible
114
+ );
115
+
116
+ const selectDisabled = computed(() => props.disabled || form?.disabled);
117
+
118
+ const showClose = computed(() => {
119
+ const hasValue = props.multiple
120
+ ? Array.isArray(props.modelValue) && props.modelValue.length > 0
121
+ : props.modelValue !== undefined &&
122
+ props.modelValue !== null &&
123
+ props.modelValue !== '';
124
+
125
+ const criteria =
126
+ props.clearable &&
127
+ !selectDisabled.value &&
128
+ states.inputHovering &&
129
+ hasValue;
130
+ return criteria;
131
+ });
132
+ const iconComponent = computed(() =>
133
+ props.remote && props.filterable && !props.remoteShowSuffix
134
+ ? ''
135
+ : { icon: 'vi-arrow-down', size: 16 }
136
+ );
137
+ const iconReverse = computed(() =>
138
+ ns.is(
139
+ 'reverse',
140
+ iconComponent.value && states.visible && props.suffixTransition
141
+ )
142
+ );
143
+
144
+ const debounce = computed(() => (props.remote ? 300 : 0));
145
+
146
+ const emptyText = computed(() => {
147
+ if (props.loading) {
148
+ return props.loadingText || t('el.select.loading');
149
+ } else {
150
+ if (props.remote && states.query === '' && states.options.size === 0)
151
+ return false;
152
+ if (
153
+ props.filterable &&
154
+ states.query &&
155
+ states.options.size > 0 &&
156
+ states.filteredOptionsCount === 0
157
+ ) {
158
+ return props.noMatchText || t('el.select.noMatch');
159
+ }
160
+ if (states.options.size === 0) {
161
+ return props.noDataText || t('el.select.noData');
162
+ }
163
+ }
164
+ return null;
165
+ });
166
+
167
+ const optionsArray = computed(() => Array.from(states.options.values()));
168
+
169
+ const cachedOptionsArray = computed(() =>
170
+ Array.from(states.cachedOptions.values())
171
+ );
172
+
173
+ const showNewOption = computed(() => {
174
+ const hasExistingOption = optionsArray.value
175
+ .filter((option) => {
176
+ return !option.created;
177
+ })
178
+ .some((option) => {
179
+ return option.currentLabel === states.query;
180
+ });
181
+ return (
182
+ props.filterable &&
183
+ props.allowCreate &&
184
+ states.query !== '' &&
185
+ !hasExistingOption
186
+ );
187
+ });
188
+
189
+ const selectSize = useSize();
190
+
191
+ const collapseTagSize = computed(() =>
192
+ ['small'].includes(selectSize.value) ? 'small' : 'default'
193
+ );
194
+
195
+ const dropMenuVisible = computed({
196
+ get () {
197
+ return states.visible && emptyText.value !== false;
198
+ },
199
+ set (val: boolean) {
200
+ states.visible = val;
201
+ }
202
+ });
203
+
204
+ // watch
205
+ watch(
206
+ [() => selectDisabled.value, () => selectSize.value, () => form?.size],
207
+ () => {
208
+ nextTick(() => {
209
+ resetInputHeight();
210
+ });
211
+ }
212
+ );
213
+
214
+ watch(
215
+ () => props.placeholder,
216
+ (val) => {
217
+ states.cachedPlaceHolder = states.currentPlaceholder = val;
218
+ }
219
+ );
220
+
221
+ watch(
222
+ () => props.modelValue,
223
+ (val, oldVal) => {
224
+ if (props.multiple) {
225
+ resetInputHeight();
226
+ if ((val && val.length > 0) || (input.value && states.query !== '')) {
227
+ states.currentPlaceholder = '';
228
+ } else {
229
+ states.currentPlaceholder = states.cachedPlaceHolder;
230
+ }
231
+ if (props.filterable && !props.reserveKeyword) {
232
+ states.query = '';
233
+ handleQueryChange(states.query);
234
+ }
235
+ }
236
+ setSelected();
237
+ if (props.filterable && !props.multiple) {
238
+ states.inputLength = 20;
239
+ }
240
+ if (!isEqual(val, oldVal) && props.validateEvent) {
241
+ formItem?.validate('change').catch((err) => debugWarn(err));
242
+ }
243
+ },
244
+ {
245
+ flush: 'post',
246
+ deep: true
247
+ }
248
+ );
249
+
250
+ watch(
251
+ () => states.visible,
252
+ (val) => {
253
+ if (!val) {
254
+ if (props.filterable) {
255
+ if (isFunction(props.filterMethod)) {
256
+ props.filterMethod('');
257
+ }
258
+ if (isFunction(props.remoteMethod)) {
259
+ props.remoteMethod('');
260
+ }
261
+ }
262
+ input.value && input.value.blur();
263
+ states.query = '';
264
+ states.previousQuery = null;
265
+ states.selectedLabel = '';
266
+ states.inputLength = 20;
267
+ states.menuVisibleOnFocus = false;
268
+ resetHoverIndex();
269
+ nextTick(() => {
270
+ if (
271
+ input.value &&
272
+ input.value.value === '' &&
273
+ states.selected.length === 0
274
+ ) {
275
+ states.currentPlaceholder = states.cachedPlaceHolder;
276
+ }
277
+ });
278
+
279
+ if (!props.multiple) {
280
+ if (states.selected) {
281
+ if (
282
+ props.filterable &&
283
+ props.allowCreate &&
284
+ states.createdSelected &&
285
+ states.createdLabel
286
+ ) {
287
+ states.selectedLabel = states.createdLabel;
288
+ } else {
289
+ states.selectedLabel = states.selected.currentLabel;
290
+ }
291
+ if (props.filterable) states.query = states.selectedLabel;
292
+ }
293
+
294
+ if (props.filterable) {
295
+ states.currentPlaceholder = states.cachedPlaceHolder;
296
+ }
297
+ }
298
+ } else {
299
+ tooltipRef.value?.updatePopper?.();
300
+
301
+ if (props.filterable) {
302
+ states.filteredOptionsCount = states.optionsCount;
303
+ states.query = props.remote ? '' : states.selectedLabel;
304
+ if (props.multiple) {
305
+ input.value?.focus();
306
+ } else {
307
+ if (states.selectedLabel) {
308
+ states.currentPlaceholder = `${states.selectedLabel}`;
309
+ states.selectedLabel = '';
310
+ }
311
+ }
312
+ handleQueryChange(states.query);
313
+ if (!props.multiple && !props.remote) {
314
+ queryChange.value.query = '';
315
+
316
+ triggerRef(queryChange);
317
+ triggerRef(groupQueryChange);
318
+ }
319
+ }
320
+ }
321
+ ctx.emit('visible-change', val);
322
+ }
323
+ );
324
+
325
+ watch(
326
+ // fix `Array.prototype.push/splice/..` cannot trigger non-deep watcher
327
+ // https://github.com/vuejs/vue-next/issues/2116
328
+ () => states.options.entries(),
329
+ () => {
330
+ if (!isClient) return;
331
+ tooltipRef.value?.updatePopper?.();
332
+ if (props.multiple) {
333
+ resetInputHeight();
334
+ }
335
+ const inputs = selectWrapper.value?.querySelectorAll('input') || [];
336
+ if (
337
+ !Array.from(inputs).includes(document.activeElement as HTMLInputElement)
338
+ ) {
339
+ setSelected();
340
+ }
341
+ if (
342
+ props.defaultFirstOption &&
343
+ (props.filterable || props.remote) &&
344
+ states.filteredOptionsCount
345
+ ) {
346
+ checkDefaultFirstOption();
347
+ }
348
+ },
349
+ {
350
+ flush: 'post'
351
+ }
352
+ );
353
+
354
+ watch(
355
+ () => states.hoverIndex,
356
+ (val) => {
357
+ if (isNumber(val) && val > -1) {
358
+ hoverOption.value = optionsArray.value[val] || {};
359
+ } else {
360
+ hoverOption.value = {};
361
+ }
362
+ optionsArray.value.forEach((option) => {
363
+ option.hover = hoverOption.value === option;
364
+ });
365
+ }
366
+ );
367
+
368
+ // methods
369
+ const resetInputHeight = () => {
370
+ if (props.collapseTags && !props.filterable) return;
371
+ nextTick(() => {
372
+ if (!reference.value) return;
373
+ const input = reference.value.$el.querySelector(
374
+ 'input'
375
+ ) as HTMLInputElement;
376
+ const _tags = tags.value;
377
+
378
+ const sizeInMap = getComponentSize(selectSize.value || form?.size);
379
+ // it's an inner input so reduce it by 2px.
380
+ input.style.height = `${
381
+ (states.selected.length === 0
382
+ ? sizeInMap
383
+ : Math.max(
384
+ _tags
385
+ ? _tags.clientHeight + (_tags.clientHeight > sizeInMap ? 6 : 0)
386
+ : 0,
387
+ sizeInMap
388
+ )) - 2
389
+ }px`;
390
+
391
+ states.tagInMultiLine = Number.parseFloat(input.style.height) >= sizeInMap;
392
+
393
+ if (states.visible && emptyText.value !== false) {
394
+ tooltipRef.value?.updatePopper?.();
395
+ }
396
+ });
397
+ };
398
+
399
+ const handleQueryChange = async(val) => {
400
+ if (states.previousQuery === val || states.isOnComposition) return;
401
+ if (
402
+ states.previousQuery === null &&
403
+ (isFunction(props.filterMethod) || isFunction(props.remoteMethod))
404
+ ) {
405
+ states.previousQuery = val;
406
+ return;
407
+ }
408
+ states.previousQuery = val;
409
+ nextTick(() => {
410
+ if (states.visible) tooltipRef.value?.updatePopper?.();
411
+ });
412
+ states.hoverIndex = -1;
413
+ if (props.multiple && props.filterable) {
414
+ nextTick(() => {
415
+ const length = input.value!.value.length * 15 + 20;
416
+ states.inputLength = props.collapseTags ? Math.min(50, length) : length;
417
+ managePlaceholder();
418
+ resetInputHeight();
419
+ });
420
+ }
421
+ if (props.remote && isFunction(props.remoteMethod)) {
422
+ states.hoverIndex = -1;
423
+ props.remoteMethod(val);
424
+ } else if (isFunction(props.filterMethod)) {
425
+ props.filterMethod(val);
426
+ triggerRef(groupQueryChange);
427
+ } else {
428
+ states.filteredOptionsCount = states.optionsCount;
429
+ queryChange.value.query = val;
430
+
431
+ triggerRef(queryChange);
432
+ triggerRef(groupQueryChange);
433
+ }
434
+ if (
435
+ props.defaultFirstOption &&
436
+ (props.filterable || props.remote) &&
437
+ states.filteredOptionsCount
438
+ ) {
439
+ await nextTick();
440
+ checkDefaultFirstOption();
441
+ }
442
+ };
443
+
444
+ const managePlaceholder = () => {
445
+ if (states.currentPlaceholder !== '') {
446
+ states.currentPlaceholder = input.value!.value
447
+ ? ''
448
+ : states.cachedPlaceHolder;
449
+ }
450
+ };
451
+
452
+ /**
453
+ * find and highlight first option as default selected
454
+ * @remark
455
+ * - if the first option in dropdown list is user-created,
456
+ * it would be at the end of the optionsArray
457
+ * so find it and set hover.
458
+ * (NOTE: there must be only one user-created option in dropdown list with query)
459
+ * - if there's no user-created option in list, just find the first one as usual
460
+ * (NOTE: exclude options that are disabled or in disabled-group)
461
+ */
462
+ const checkDefaultFirstOption = () => {
463
+ const optionsInDropdown = optionsArray.value.filter(
464
+ (n) => n.visible && !n.disabled && !n.states.groupDisabled
465
+ );
466
+ const userCreatedOption = optionsInDropdown.find((n) => n.created);
467
+ const firstOriginOption = optionsInDropdown[0];
468
+ states.hoverIndex = getValueIndex(
469
+ optionsArray.value,
470
+ userCreatedOption || firstOriginOption
471
+ );
472
+ };
473
+
474
+ const setSelected = () => {
475
+ if (!props.multiple) {
476
+ const option = getOption(props.modelValue);
477
+ if (option.props?.created) {
478
+ states.createdLabel = option.props.value;
479
+ states.createdSelected = true;
480
+ } else {
481
+ states.createdSelected = false;
482
+ }
483
+ states.selectedLabel = option.currentLabel;
484
+ states.selected = option;
485
+ if (props.filterable) states.query = states.selectedLabel;
486
+ return;
487
+ } else {
488
+ states.selectedLabel = '';
489
+ }
490
+ const result: any[] = [];
491
+ if (Array.isArray(props.modelValue)) {
492
+ props.modelValue.forEach((value) => {
493
+ result.push(getOption(value));
494
+ });
495
+ }
496
+ states.selected = result;
497
+ nextTick(() => {
498
+ resetInputHeight();
499
+ });
500
+ };
501
+
502
+ const getOption = (value) => {
503
+ let option;
504
+ const isObjectValue = toRawType(value).toLowerCase() === 'object';
505
+ const isNull = toRawType(value).toLowerCase() === 'null';
506
+ const isUndefined = toRawType(value).toLowerCase() === 'undefined';
507
+
508
+ for (let i = states.cachedOptions.size - 1; i >= 0; i--) {
509
+ const cachedOption = cachedOptionsArray.value[i];
510
+ const isEqualValue = isObjectValue
511
+ ? get(cachedOption.value, props.valueKey) === get(value, props.valueKey)
512
+ : cachedOption.value === value;
513
+ if (isEqualValue) {
514
+ option = {
515
+ value,
516
+ currentLabel: cachedOption.currentLabel,
517
+ isDisabled: cachedOption.isDisabled
518
+ };
519
+ break;
520
+ }
521
+ }
522
+ if (option) return option;
523
+ const label = isObjectValue
524
+ ? value.label
525
+ : !isNull && !isUndefined
526
+ ? value
527
+ : '';
528
+ const newOption = {
529
+ value,
530
+ currentLabel: label
531
+ };
532
+ if (props.multiple) {
533
+ ;(newOption as any).hitState = false;
534
+ }
535
+ return newOption;
536
+ };
537
+
538
+ const resetHoverIndex = () => {
539
+ setTimeout(() => {
540
+ const valueKey = props.valueKey;
541
+ if (!props.multiple) {
542
+ states.hoverIndex = optionsArray.value.findIndex((item) => {
543
+ return getValueKey(item) === getValueKey(states.selected);
544
+ });
545
+ } else {
546
+ if (states.selected.length > 0) {
547
+ states.hoverIndex = Math.min.apply(
548
+ null,
549
+ states.selected.map((selected) => {
550
+ return optionsArray.value.findIndex((item) => {
551
+ return get(item, valueKey) === get(selected, valueKey);
552
+ });
553
+ })
554
+ );
555
+ } else {
556
+ states.hoverIndex = -1;
557
+ }
558
+ }
559
+ }, 300);
560
+ };
561
+
562
+ const handleResize = () => {
563
+ resetInputWidth();
564
+ tooltipRef.value?.updatePopper?.();
565
+ if (props.multiple && !props.filterable) resetInputHeight();
566
+ };
567
+
568
+ const resetInputWidth = () => {
569
+ states.inputWidth = reference.value?.$el.getBoundingClientRect().width;
570
+ };
571
+
572
+ const onInputChange = () => {
573
+ if (props.filterable && states.query !== states.selectedLabel) {
574
+ states.query = states.selectedLabel;
575
+ handleQueryChange(states.query);
576
+ }
577
+ };
578
+
579
+ const debouncedOnInputChange = lodashDebounce(() => {
580
+ onInputChange();
581
+ }, debounce.value);
582
+
583
+ const debouncedQueryChange = lodashDebounce((e) => {
584
+ handleQueryChange(e.target.value);
585
+ }, debounce.value);
586
+
587
+ const emitChange = (val) => {
588
+ if (!isEqual(props.modelValue, val)) {
589
+ ctx.emit(CHANGE_EVENT, val);
590
+ }
591
+ };
592
+
593
+ const deletePrevTag = (e) => {
594
+ if (e.target.value.length <= 0 && !toggleLastOptionHitState()) {
595
+ const value = props.modelValue.slice();
596
+ value.pop();
597
+ ctx.emit(UPDATE_MODEL_EVENT, value);
598
+ emitChange(value);
599
+ }
600
+
601
+ if (e.target.value.length === 1 && props.modelValue.length === 0) {
602
+ states.currentPlaceholder = states.cachedPlaceHolder;
603
+ }
604
+ };
605
+
606
+ const deleteTag = (event, tag) => {
607
+ const index = states.selected.indexOf(tag);
608
+ if (index > -1 && !selectDisabled.value) {
609
+ const value = props.modelValue.slice();
610
+ value.splice(index, 1);
611
+ ctx.emit(UPDATE_MODEL_EVENT, value);
612
+ emitChange(value);
613
+ ctx.emit('remove-tag', tag.value);
614
+ }
615
+ event.stopPropagation();
616
+ };
617
+
618
+ const deleteSelected = (event) => {
619
+ event.stopPropagation();
620
+ const value: string | any[] = props.multiple ? [] : '';
621
+ if (!isString(value)) {
622
+ for (const item of states.selected) {
623
+ if (item.isDisabled) value.push(item.value);
624
+ }
625
+ }
626
+ ctx.emit(UPDATE_MODEL_EVENT, value);
627
+ emitChange(value);
628
+ states.hoverIndex = -1;
629
+ states.visible = false;
630
+ ctx.emit('clear');
631
+ };
632
+
633
+ const handleOptionSelect = (option, byClick) => {
634
+ if (props.multiple) {
635
+ const value = (props.modelValue || []).slice();
636
+ const optionIndex = getValueIndex(value, option.value);
637
+ if (optionIndex > -1) {
638
+ value.splice(optionIndex, 1);
639
+ } else if (
640
+ props.multipleLimit <= 0 ||
641
+ value.length < props.multipleLimit
642
+ ) {
643
+ value.push(option.value);
644
+ }
645
+ ctx.emit(UPDATE_MODEL_EVENT, value);
646
+ emitChange(value);
647
+ if (option.created) {
648
+ states.query = '';
649
+ handleQueryChange('');
650
+ states.inputLength = 20;
651
+ }
652
+ if (props.filterable) input.value?.focus();
653
+ } else {
654
+ ctx.emit(UPDATE_MODEL_EVENT, option.value);
655
+ emitChange(option.value);
656
+ states.visible = false;
657
+ }
658
+ states.isSilentBlur = byClick;
659
+ setSoftFocus();
660
+ if (states.visible) return;
661
+ nextTick(() => {
662
+ scrollToOption(option);
663
+ });
664
+ };
665
+
666
+ const getValueIndex = (arr: any[] = [], value) => {
667
+ if (!isObject(value)) return arr.indexOf(value);
668
+
669
+ const valueKey = props.valueKey;
670
+ let index = -1;
671
+ arr.some((item, i) => {
672
+ if (toRaw(get(item, valueKey)) === get(value, valueKey)) {
673
+ index = i;
674
+ return true;
675
+ }
676
+ return false;
677
+ });
678
+ return index;
679
+ };
680
+
681
+ const setSoftFocus = () => {
682
+ states.softFocus = true;
683
+ const _input = input.value || reference.value;
684
+ if (_input) {
685
+ _input?.focus();
686
+ }
687
+ };
688
+
689
+ const scrollToOption = (option) => {
690
+ const targetOption = Array.isArray(option) ? option[0] : option;
691
+ let target = null;
692
+
693
+ if (targetOption?.value) {
694
+ const options = optionsArray.value.filter(
695
+ (item) => item.value === targetOption.value
696
+ );
697
+ if (options.length > 0) {
698
+ target = options[0].$el;
699
+ }
700
+ }
701
+
702
+ if (tooltipRef.value && target) {
703
+ const menu = tooltipRef.value?.popperRef?.contentRef?.querySelector?.(
704
+ `.${ns.be('dropdown', 'wrap')}`
705
+ );
706
+ if (menu) {
707
+ scrollIntoView(menu as HTMLElement, target);
708
+ }
709
+ }
710
+ scrollbar.value?.handleScroll();
711
+ };
712
+
713
+ const onOptionCreate = (vm: SelectOptionProxy) => {
714
+ states.optionsCount++;
715
+ states.filteredOptionsCount++;
716
+ states.options.set(vm.value, vm);
717
+ states.cachedOptions.set(vm.value, vm);
718
+ };
719
+
720
+ const onOptionDestroy = (key, vm: SelectOptionProxy) => {
721
+ if (states.options.get(key) === vm) {
722
+ states.optionsCount--;
723
+ states.filteredOptionsCount--;
724
+ states.options.delete(key);
725
+ }
726
+ };
727
+
728
+ const resetInputState = (e: KeyboardEvent) => {
729
+ if (e.code !== EVENT_CODE.backspace) toggleLastOptionHitState(false);
730
+ states.inputLength = input.value!.value.length * 15 + 20;
731
+ resetInputHeight();
732
+ };
733
+
734
+ const toggleLastOptionHitState = (hit?: boolean) => {
735
+ if (!Array.isArray(states.selected)) return;
736
+ const option = states.selected[states.selected.length - 1];
737
+ if (!option) return;
738
+
739
+ if (hit === true || hit === false) {
740
+ option.hitState = hit;
741
+ return hit;
742
+ }
743
+
744
+ option.hitState = !option.hitState;
745
+ return option.hitState;
746
+ };
747
+
748
+ const handleComposition = (event) => {
749
+ const text = event.target.value;
750
+ if (event.type === 'compositionend') {
751
+ states.isOnComposition = false;
752
+ nextTick(() => handleQueryChange(text));
753
+ } else {
754
+ const lastCharacter = text[text.length - 1] || '';
755
+ states.isOnComposition = !isKorean(lastCharacter);
756
+ }
757
+ };
758
+
759
+ const handleMenuEnter = () => {
760
+ nextTick(() => scrollToOption(states.selected));
761
+ };
762
+
763
+ const handleFocus = (event: FocusEvent) => {
764
+ if (!states.softFocus) {
765
+ if (props.automaticDropdown || props.filterable) {
766
+ if (props.filterable && !states.visible) {
767
+ states.menuVisibleOnFocus = true;
768
+ }
769
+ states.visible = true;
770
+ }
771
+ ctx.emit('focus', event);
772
+ } else {
773
+ states.softFocus = false;
774
+ }
775
+ };
776
+
777
+ const blur = () => {
778
+ states.visible = false;
779
+ reference.value?.blur();
780
+ };
781
+
782
+ const handleBlur = (event: FocusEvent) => {
783
+ // https://github.com/ElemeFE/element/pull/10822
784
+ nextTick(() => {
785
+ if (states.isSilentBlur) {
786
+ states.isSilentBlur = false;
787
+ } else {
788
+ ctx.emit('blur', event);
789
+ }
790
+ });
791
+ states.softFocus = false;
792
+ };
793
+
794
+ const handleClearClick = (event: Event) => {
795
+ deleteSelected(event);
796
+ };
797
+
798
+ const handleClose = () => {
799
+ states.visible = false;
800
+ };
801
+
802
+ const handleKeydownEscape = (event: KeyboardEvent) => {
803
+ if (states.visible) {
804
+ event.preventDefault();
805
+ event.stopPropagation();
806
+ states.visible = false;
807
+ }
808
+ };
809
+
810
+ const toggleMenu = (e?: PointerEvent) => {
811
+ if (e && !states.mouseEnter) {
812
+ return;
813
+ }
814
+ if (!selectDisabled.value) {
815
+ if (states.menuVisibleOnFocus) {
816
+ states.menuVisibleOnFocus = false;
817
+ } else {
818
+ if (!tooltipRef.value || !tooltipRef.value.isFocusInsideContent()) {
819
+ states.visible = !states.visible;
820
+ }
821
+ }
822
+ if (states.visible) {
823
+ ;(input.value || reference.value)?.focus();
824
+ }
825
+ }
826
+ };
827
+
828
+ const selectOption = () => {
829
+ if (!states.visible) {
830
+ toggleMenu();
831
+ } else {
832
+ if (optionsArray.value[states.hoverIndex]) {
833
+ handleOptionSelect(optionsArray.value[states.hoverIndex], undefined);
834
+ }
835
+ }
836
+ };
837
+
838
+ const getValueKey = (item) => {
839
+ return isObject(item.value) ? get(item.value, props.valueKey) : item.value;
840
+ };
841
+
842
+ const optionsAllDisabled = computed(() =>
843
+ optionsArray.value
844
+ .filter((option) => option.visible)
845
+ .every((option) => option.disabled)
846
+ );
847
+
848
+ const navigateOptions = (direction) => {
849
+ if (!states.visible) {
850
+ states.visible = true;
851
+ return;
852
+ }
853
+ if (states.options.size === 0 || states.filteredOptionsCount === 0) return;
854
+ if (states.isOnComposition) return;
855
+
856
+ if (!optionsAllDisabled.value) {
857
+ if (direction === 'next') {
858
+ states.hoverIndex++;
859
+ if (states.hoverIndex === states.options.size) {
860
+ states.hoverIndex = 0;
861
+ }
862
+ } else if (direction === 'prev') {
863
+ states.hoverIndex--;
864
+ if (states.hoverIndex < 0) {
865
+ states.hoverIndex = states.options.size - 1;
866
+ }
867
+ }
868
+ const option = optionsArray.value[states.hoverIndex];
869
+ if (
870
+ option.disabled === true ||
871
+ option.states.groupDisabled === true ||
872
+ !option.visible
873
+ ) {
874
+ navigateOptions(direction);
875
+ }
876
+ nextTick(() => scrollToOption(hoverOption.value));
877
+ }
878
+ };
879
+
880
+ const handleMouseEnter = () => {
881
+ states.mouseEnter = true;
882
+ };
883
+
884
+ const handleMouseLeave = () => {
885
+ states.mouseEnter = false;
886
+ };
887
+
888
+ return {
889
+ optionsArray,
890
+ selectSize,
891
+ handleResize,
892
+ debouncedOnInputChange,
893
+ debouncedQueryChange,
894
+ deletePrevTag,
895
+ deleteTag,
896
+ deleteSelected,
897
+ handleOptionSelect,
898
+ scrollToOption,
899
+ readonly,
900
+ resetInputHeight,
901
+ showClose,
902
+ iconComponent,
903
+ iconReverse,
904
+ showNewOption,
905
+ collapseTagSize,
906
+ setSelected,
907
+ managePlaceholder,
908
+ selectDisabled,
909
+ emptyText,
910
+ toggleLastOptionHitState,
911
+ resetInputState,
912
+ handleComposition,
913
+ onOptionCreate,
914
+ onOptionDestroy,
915
+ handleMenuEnter,
916
+ handleFocus,
917
+ blur,
918
+ handleBlur,
919
+ handleClearClick,
920
+ handleClose,
921
+ handleKeydownEscape,
922
+ toggleMenu,
923
+ selectOption,
924
+ getValueKey,
925
+ navigateOptions,
926
+ dropMenuVisible,
927
+ queryChange,
928
+ groupQueryChange,
929
+
930
+ // DOM ref
931
+ reference,
932
+ input,
933
+ tooltipRef,
934
+ tags,
935
+ selectWrapper,
936
+ scrollbar,
937
+
938
+ // Mouser Event
939
+ handleMouseEnter,
940
+ handleMouseLeave
941
+ };
942
+ };