@volverjs/ui-vue 0.0.10-beta.5 → 0.0.10-beta.50

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 (496) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +148 -51
  3. package/auto-imports.d.ts +25 -12
  4. package/bin/icons.cjs +1 -1
  5. package/bin/icons.js +28 -20
  6. package/dist/Volver.d.ts +11 -11
  7. package/dist/components/VvAccordion/VvAccordion.es.js +192 -104
  8. package/dist/components/VvAccordion/VvAccordion.umd.js +1 -1
  9. package/dist/components/VvAccordion/VvAccordion.vue.d.ts +29 -10
  10. package/dist/components/VvAccordion/index.d.ts +8 -9
  11. package/dist/components/VvAccordionGroup/VvAccordionGroup.es.js +485 -206
  12. package/dist/components/VvAccordionGroup/VvAccordionGroup.umd.js +1 -1
  13. package/dist/components/VvAccordionGroup/VvAccordionGroup.vue.d.ts +61 -18
  14. package/dist/components/VvAccordionGroup/index.d.ts +16 -8
  15. package/dist/components/VvAction/VvAction.es.js +84 -33
  16. package/dist/components/VvAction/VvAction.umd.js +1 -1
  17. package/dist/components/VvAction/VvAction.vue.d.ts +61 -28
  18. package/dist/components/VvAction/index.d.ts +26 -10
  19. package/dist/components/VvAlert/VvAlert.es.js +350 -318
  20. package/dist/components/VvAlert/VvAlert.umd.js +1 -1
  21. package/dist/components/VvAlert/VvAlert.vue.d.ts +25 -17
  22. package/dist/components/VvAlert/index.d.ts +20 -11
  23. package/dist/components/VvAlertGroup/VvAlertGroup.es.js +388 -327
  24. package/dist/components/VvAlertGroup/VvAlertGroup.umd.js +1 -1
  25. package/dist/components/VvAlertGroup/VvAlertGroup.vue.d.ts +22 -17
  26. package/dist/components/VvAlertGroup/index.d.ts +10 -18
  27. package/dist/components/VvAvatar/VvAvatar.es.js +66 -28
  28. package/dist/components/VvAvatar/VvAvatar.umd.js +1 -1
  29. package/dist/components/VvAvatar/VvAvatar.vue.d.ts +13 -5
  30. package/dist/components/VvAvatar/index.d.ts +4 -1
  31. package/dist/components/VvAvatarGroup/VvAvatarGroup.es.js +147 -74
  32. package/dist/components/VvAvatarGroup/VvAvatarGroup.umd.js +1 -1
  33. package/dist/components/VvAvatarGroup/VvAvatarGroup.vue.d.ts +17 -10
  34. package/dist/components/VvAvatarGroup/index.d.ts +6 -3
  35. package/dist/components/VvBadge/VvBadge.es.js +78 -34
  36. package/dist/components/VvBadge/VvBadge.umd.js +1 -1
  37. package/dist/components/VvBadge/VvBadge.vue.d.ts +13 -5
  38. package/dist/components/VvBadge/index.d.ts +4 -1
  39. package/dist/components/VvBreadcrumb/VvBreadcrumb.es.js +294 -83
  40. package/dist/components/VvBreadcrumb/VvBreadcrumb.umd.js +1 -1
  41. package/dist/components/VvBreadcrumb/VvBreadcrumb.vue.d.ts +28 -8
  42. package/dist/components/VvBreadcrumb/index.d.ts +6 -10
  43. package/dist/components/VvButton/VvButton.es.js +510 -488
  44. package/dist/components/VvButton/VvButton.umd.js +1 -1
  45. package/dist/components/VvButton/VvButton.vue.d.ts +97 -45
  46. package/dist/components/VvButton/index.d.ts +52 -30
  47. package/dist/components/VvButtonGroup/VvButtonGroup.es.js +95 -45
  48. package/dist/components/VvButtonGroup/VvButtonGroup.umd.js +1 -1
  49. package/dist/components/VvButtonGroup/VvButtonGroup.vue.d.ts +35 -17
  50. package/dist/components/VvButtonGroup/index.d.ts +13 -4
  51. package/dist/components/VvCard/VvCard.es.js +87 -42
  52. package/dist/components/VvCard/VvCard.umd.js +1 -1
  53. package/dist/components/VvCard/VvCard.vue.d.ts +13 -5
  54. package/dist/components/VvCard/index.d.ts +4 -1
  55. package/dist/components/VvCheckbox/VvCheckbox.es.js +177 -136
  56. package/dist/components/VvCheckbox/VvCheckbox.umd.js +1 -1
  57. package/dist/components/VvCheckbox/VvCheckbox.vue.d.ts +105 -35
  58. package/dist/components/VvCheckbox/index.d.ts +52 -19
  59. package/dist/components/VvCheckboxGroup/VvCheckboxGroup.es.js +408 -322
  60. package/dist/components/VvCheckboxGroup/VvCheckboxGroup.umd.js +1 -1
  61. package/dist/components/VvCheckboxGroup/VvCheckboxGroup.vue.d.ts +103 -34
  62. package/dist/components/VvCheckboxGroup/index.d.ts +45 -12
  63. package/dist/components/VvCombobox/VvCombobox.es.js +2304 -1992
  64. package/dist/components/VvCombobox/VvCombobox.umd.js +1 -1
  65. package/dist/components/VvCombobox/VvCombobox.vue.d.ts +258 -672
  66. package/dist/components/VvCombobox/index.d.ts +377 -135
  67. package/dist/components/VvDialog/VvDialog.es.js +177 -297
  68. package/dist/components/VvDialog/VvDialog.umd.js +1 -1
  69. package/dist/components/VvDialog/VvDialog.vue.d.ts +23 -7
  70. package/dist/components/VvDialog/index.d.ts +12 -0
  71. package/dist/components/VvDropdown/VvDropdown.es.js +172 -102
  72. package/dist/components/VvDropdown/VvDropdown.umd.js +1 -1
  73. package/dist/components/VvDropdown/VvDropdown.vue.d.ts +110 -315
  74. package/dist/components/VvDropdown/VvDropdownAction.vue.d.ts +77 -28
  75. package/dist/components/VvDropdown/VvDropdownItem.vue.d.ts +13 -1
  76. package/dist/components/VvDropdown/VvDropdownOptgroup.vue.d.ts +13 -5
  77. package/dist/components/VvDropdown/VvDropdownOption.vue.d.ts +38 -10
  78. package/dist/components/VvDropdown/index.d.ts +52 -118
  79. package/dist/components/VvDropdownAction/VvDropdownAction.es.js +165 -60
  80. package/dist/components/VvDropdownAction/VvDropdownAction.umd.js +1 -1
  81. package/dist/components/VvDropdownItem/VvDropdownItem.es.js +337 -10
  82. package/dist/components/VvDropdownItem/VvDropdownItem.umd.js +1 -1
  83. package/dist/components/VvDropdownOptgroup/VvDropdownOptgroup.es.js +63 -20
  84. package/dist/components/VvDropdownOptgroup/VvDropdownOptgroup.umd.js +1 -1
  85. package/dist/components/VvDropdownOption/VvDropdownOption.es.js +188 -80
  86. package/dist/components/VvDropdownOption/VvDropdownOption.umd.js +1 -1
  87. package/dist/components/VvIcon/VvIcon.es.js +24 -102
  88. package/dist/components/VvIcon/VvIcon.umd.js +1 -1
  89. package/dist/components/VvIcon/VvIcon.vue.d.ts +4 -68
  90. package/dist/components/VvIcon/index.d.ts +33 -48
  91. package/dist/components/VvInputFile/VvInputFile.es.js +1777 -0
  92. package/dist/components/VvInputFile/VvInputFile.umd.js +1 -0
  93. package/dist/components/VvInputFile/VvInputFile.vue.d.ts +317 -0
  94. package/dist/components/VvInputFile/index.d.ts +193 -0
  95. package/dist/components/VvInputText/VvInputClearAction.d.ts +16 -10
  96. package/dist/components/VvInputText/VvInputPasswordAction.d.ts +20 -14
  97. package/dist/components/VvInputText/VvInputStepAction.d.ts +11 -7
  98. package/dist/components/VvInputText/VvInputText.es.js +1491 -551
  99. package/dist/components/VvInputText/VvInputText.umd.js +1 -1
  100. package/dist/components/VvInputText/VvInputText.vue.d.ts +216 -68
  101. package/dist/components/VvInputText/index.d.ts +101 -31
  102. package/dist/components/VvNav/VvNav.es.js +155 -75
  103. package/dist/components/VvNav/VvNav.umd.js +1 -1
  104. package/dist/components/VvNav/VvNav.vue.d.ts +32 -11
  105. package/dist/components/VvNav/VvNavItem.vue.d.ts +1 -1
  106. package/dist/components/VvNav/VvNavSeparator.vue.d.ts +1 -1
  107. package/dist/components/VvNav/index.d.ts +5 -2
  108. package/dist/components/VvNavItem/VvNavItem.es.js +100 -39
  109. package/dist/components/VvNavItem/VvNavItem.umd.js +1 -1
  110. package/dist/components/VvProgress/VvProgress.es.js +73 -27
  111. package/dist/components/VvProgress/VvProgress.umd.js +1 -1
  112. package/dist/components/VvProgress/VvProgress.vue.d.ts +13 -6
  113. package/dist/components/VvProgress/index.d.ts +4 -1
  114. package/dist/components/VvRadio/VvRadio.es.js +175 -135
  115. package/dist/components/VvRadio/VvRadio.umd.js +1 -1
  116. package/dist/components/VvRadio/VvRadio.vue.d.ts +103 -33
  117. package/dist/components/VvRadio/index.d.ts +50 -17
  118. package/dist/components/VvRadioGroup/VvRadioGroup.es.js +406 -321
  119. package/dist/components/VvRadioGroup/VvRadioGroup.umd.js +1 -1
  120. package/dist/components/VvRadioGroup/VvRadioGroup.vue.d.ts +103 -34
  121. package/dist/components/VvRadioGroup/index.d.ts +45 -12
  122. package/dist/components/VvSelect/VvSelect.es.js +677 -611
  123. package/dist/components/VvSelect/VvSelect.umd.js +1 -1
  124. package/dist/components/VvSelect/VvSelect.vue.d.ts +107 -199
  125. package/dist/components/VvSelect/index.d.ts +196 -16
  126. package/dist/components/VvTab/VvTab.es.js +230 -110
  127. package/dist/components/VvTab/VvTab.umd.js +1 -1
  128. package/dist/components/VvTab/VvTab.vue.d.ts +34 -12
  129. package/dist/components/VvTab/index.d.ts +6 -3
  130. package/dist/components/VvTextarea/VvTextarea.es.js +606 -597
  131. package/dist/components/VvTextarea/VvTextarea.umd.js +1 -1
  132. package/dist/components/VvTextarea/VvTextarea.vue.d.ts +159 -54
  133. package/dist/components/VvTextarea/index.d.ts +69 -20
  134. package/dist/components/VvTooltip/VvTooltip.es.js +83 -30
  135. package/dist/components/VvTooltip/VvTooltip.umd.js +1 -1
  136. package/dist/components/VvTooltip/VvTooltip.vue.d.ts +16 -9
  137. package/dist/components/VvTooltip/index.d.ts +5 -2
  138. package/dist/components/common/HintSlot.d.ts +8 -9
  139. package/dist/components/index.d.ts +10 -0
  140. package/dist/components/index.es.js +4086 -2029
  141. package/dist/components/index.umd.js +1 -1
  142. package/dist/composables/alert/useAlerInject.d.ts +4 -0
  143. package/dist/composables/alert/useAlert.d.ts +71 -6
  144. package/dist/composables/alert/{useProvideAlert.d.ts → useAlertProvide.d.ts} +1 -1
  145. package/dist/composables/dropdown/useDropdownContextmenu.d.ts +18 -0
  146. package/dist/composables/dropdown/useDropdownInject.d.ts +12 -0
  147. package/dist/composables/dropdown/{useProvideDropdown.d.ts → useDropdownProvide.d.ts} +6 -7
  148. package/dist/composables/dropdown/useDropdownVirtualElement.d.ts +17 -0
  149. package/dist/composables/group/useGroupStateInject.d.ts +9 -0
  150. package/dist/composables/group/useGroupStateProvide.d.ts +6 -0
  151. package/dist/composables/index.d.ts +3 -0
  152. package/dist/composables/index.es.js +178 -6
  153. package/dist/composables/index.umd.js +1 -1
  154. package/dist/composables/useBlurhash.d.ts +7 -0
  155. package/dist/composables/useComponentFocus.d.ts +2 -2
  156. package/dist/composables/useComponentIcon.d.ts +9 -8
  157. package/dist/composables/useOptions.d.ts +5 -5
  158. package/dist/composables/usePersistence.d.ts +3 -0
  159. package/dist/composables/useUniqueId.d.ts +2 -2
  160. package/dist/composables/useVolver.d.ts +1 -1
  161. package/dist/constants.d.ts +35 -33
  162. package/dist/directives/index.d.ts +3 -5
  163. package/dist/directives/index.es.js +247 -82
  164. package/dist/directives/index.umd.js +1 -1
  165. package/dist/directives/v-contextmenu.es.js +137 -31
  166. package/dist/directives/v-contextmenu.umd.js +1 -1
  167. package/dist/directives/v-tooltip.es.js +101 -39
  168. package/dist/directives/v-tooltip.umd.js +1 -1
  169. package/dist/icons.d.ts +17 -17
  170. package/dist/icons.es.js +516 -516
  171. package/dist/icons.umd.js +1 -1
  172. package/dist/index.d.ts +3 -1
  173. package/dist/index.es.js +74 -6
  174. package/dist/index.umd.js +1 -1
  175. package/dist/props/index.d.ts +277 -193
  176. package/dist/resolvers/unplugin.d.ts +6 -1
  177. package/dist/resolvers/unplugin.es.js +87 -10
  178. package/dist/resolvers/unplugin.umd.js +1 -1
  179. package/dist/stories/Accordion/Accordion.settings.d.ts +2 -57
  180. package/dist/stories/AccordionGroup/AccordionGroup.settings.d.ts +2 -66
  181. package/dist/stories/AccordionGroup/AccordionGroup.stories.d.ts +2 -127
  182. package/dist/stories/AccordionGroup/AccordionGroupSlots.stories.d.ts +1304 -538
  183. package/dist/stories/Alert/Alert.settings.d.ts +2 -109
  184. package/dist/stories/AlertGroup/AlertGroup.settings.d.ts +2 -85
  185. package/dist/stories/AlertGroup/AlertGroupWithComposable.stories.d.ts +1 -1
  186. package/dist/stories/AvatarGroup/AvatarGroup.settings.d.ts +2 -38
  187. package/dist/stories/Badge/Badge.settings.d.ts +2 -26
  188. package/dist/stories/Badge/Badge.test.d.ts +1 -1
  189. package/dist/stories/Blurhash/BlurhashComposable.stories.d.ts +4 -0
  190. package/dist/stories/Breadcrumb/Breadcrumb.settings.d.ts +2 -18
  191. package/dist/stories/Breadcrumb/Breadcrumb.test.d.ts +1 -1
  192. package/dist/stories/Button/Button.settings.d.ts +2 -194
  193. package/dist/stories/ButtonGroup/ButtonGroup.settings.d.ts +2 -40
  194. package/dist/stories/Card/Card.settings.d.ts +2 -63
  195. package/dist/stories/Checkbox/Checkbox.settings.d.ts +2 -132
  196. package/dist/stories/CheckboxGroup/CheckboxGroup.settings.d.ts +1 -141
  197. package/dist/stories/Combobox/Combobox.settings.d.ts +2 -609
  198. package/dist/stories/Combobox/Combobox.stories.d.ts +1 -0
  199. package/dist/stories/Combobox/ComboboxMultiple.stories.d.ts +1 -0
  200. package/dist/stories/Dialog/Dialog.settings.d.ts +2 -47
  201. package/dist/stories/Dialog/DialogModifiers.stories.d.ts +8 -0
  202. package/dist/stories/Dropdown/Dropdown.settings.d.ts +2 -205
  203. package/dist/stories/Icon/Icon.settings.d.ts +3 -68
  204. package/dist/stories/InputFile/InputFile.settings.d.ts +6 -0
  205. package/dist/stories/InputFile/InputFile.stories.d.ts +13 -0
  206. package/dist/stories/InputFile/InputFileDropArea.stories.d.ts +9 -0
  207. package/dist/stories/InputFile/InputFileIconPosition.stories.d.ts +8 -0
  208. package/dist/stories/InputFile/InputFileSlots.stories.d.ts +7 -0
  209. package/dist/stories/InputText/InputText.settings.d.ts +2 -438
  210. package/dist/stories/Nav/Nav.settings.d.ts +2 -10
  211. package/dist/stories/Progress/Progress.settings.d.ts +2 -27
  212. package/dist/stories/Radio/Radio.settings.d.ts +1 -110
  213. package/dist/stories/RadioGroup/RadioGroup.settings.d.ts +1 -141
  214. package/dist/stories/Select/Select.settings.d.ts +2 -246
  215. package/dist/stories/Select/Select.stories.d.ts +1 -0
  216. package/dist/stories/Tab/Tab.settings.d.ts +2 -15
  217. package/dist/stories/Textarea/Textarea.settings.d.ts +2 -287
  218. package/dist/stories/argTypes.d.ts +27 -866
  219. package/dist/test/expect.d.ts +1 -2
  220. package/dist/test/options.d.ts +1 -1
  221. package/dist/test/sleep.d.ts +1 -1
  222. package/dist/types/alert.d.ts +9 -7
  223. package/dist/types/blurhash.d.ts +12 -0
  224. package/dist/types/floating-ui.d.ts +1 -1
  225. package/dist/types/generic.d.ts +1 -2
  226. package/dist/types/group.d.ts +37 -15
  227. package/dist/types/index.d.ts +7 -0
  228. package/dist/types/input-file.d.ts +9 -0
  229. package/dist/types/nav.d.ts +2 -2
  230. package/dist/utils/DomUtilities.d.ts +1 -0
  231. package/dist/utils/ObjectUtilities.d.ts +8 -9
  232. package/dist/workers/blurhash.d.ts +1 -0
  233. package/package.json +238 -246
  234. package/src/Volver.ts +251 -246
  235. package/src/assets/icons/detailed.json +1 -1
  236. package/src/assets/icons/normal.json +1 -1
  237. package/src/assets/icons/simple.json +1 -1
  238. package/src/components/VvAccordion/VvAccordion.vue +163 -100
  239. package/src/components/VvAccordion/index.ts +65 -80
  240. package/src/components/VvAccordionGroup/VvAccordionGroup.vue +224 -106
  241. package/src/components/VvAccordionGroup/index.ts +42 -42
  242. package/src/components/VvAction/VvAction.vue +144 -130
  243. package/src/components/VvAlert/VvAlert.vue +72 -70
  244. package/src/components/VvAlert/index.ts +149 -147
  245. package/src/components/VvAlertGroup/VvAlertGroup.vue +57 -56
  246. package/src/components/VvAlertGroup/index.ts +102 -118
  247. package/src/components/VvAvatar/VvAvatar.vue +20 -14
  248. package/src/components/VvAvatar/index.ts +5 -5
  249. package/src/components/VvAvatarGroup/VvAvatarGroup.vue +58 -53
  250. package/src/components/VvAvatarGroup/index.ts +21 -21
  251. package/src/components/VvBadge/VvBadge.vue +15 -14
  252. package/src/components/VvBadge/index.ts +2 -2
  253. package/src/components/VvBreadcrumb/VvBreadcrumb.vue +50 -48
  254. package/src/components/VvBreadcrumb/index.ts +3 -9
  255. package/src/components/VvButton/VvButton.vue +163 -152
  256. package/src/components/VvButton/index.ts +104 -111
  257. package/src/components/VvButtonGroup/VvButtonGroup.vue +73 -65
  258. package/src/components/VvButtonGroup/index.ts +23 -22
  259. package/src/components/VvCard/VvCard.vue +30 -30
  260. package/src/components/VvCard/index.ts +2 -2
  261. package/src/components/VvCheckbox/VvCheckbox.vue +186 -184
  262. package/src/components/VvCheckbox/index.ts +45 -45
  263. package/src/components/VvCheckboxGroup/VvCheckboxGroup.vue +88 -87
  264. package/src/components/VvCombobox/VvCombobox.vue +655 -619
  265. package/src/components/VvCombobox/index.ts +210 -168
  266. package/src/components/VvDialog/VvDialog.vue +139 -129
  267. package/src/components/VvDialog/index.ts +42 -36
  268. package/src/components/VvDropdown/VvDropdown.vue +466 -445
  269. package/src/components/VvDropdown/VvDropdownAction.vue +37 -39
  270. package/src/components/VvDropdown/VvDropdownItem.vue +30 -26
  271. package/src/components/VvDropdown/VvDropdownOptgroup.vue +13 -12
  272. package/src/components/VvDropdown/VvDropdownOption.vue +47 -64
  273. package/src/components/VvDropdown/index.ts +61 -27
  274. package/src/components/VvIcon/README.md +1 -1
  275. package/src/components/VvIcon/VvIcon.vue +133 -133
  276. package/src/components/VvIcon/index.ts +84 -97
  277. package/src/components/VvInputFile/VvInputFile.vue +413 -0
  278. package/src/components/VvInputFile/index.ts +143 -0
  279. package/src/components/VvInputText/VvInputClearAction.ts +51 -47
  280. package/src/components/VvInputText/VvInputPasswordAction.ts +66 -62
  281. package/src/components/VvInputText/VvInputStepAction.ts +43 -43
  282. package/src/components/VvInputText/VvInputText.vue +652 -516
  283. package/src/components/VvInputText/VvInputTextActions.ts +87 -87
  284. package/src/components/VvInputText/index.ts +201 -186
  285. package/src/components/VvNav/VvNav.vue +40 -36
  286. package/src/components/VvNav/VvNavItem.vue +12 -12
  287. package/src/components/VvNav/VvNavSeparator.vue +6 -6
  288. package/src/components/VvNav/index.ts +2 -2
  289. package/src/components/VvProgress/VvProgress.vue +27 -27
  290. package/src/components/VvProgress/index.ts +28 -28
  291. package/src/components/VvRadio/VvRadio.vue +115 -112
  292. package/src/components/VvRadio/index.ts +29 -29
  293. package/src/components/VvRadioGroup/VvRadioGroup.vue +91 -90
  294. package/src/components/VvSelect/VvSelect.vue +262 -241
  295. package/src/components/VvSelect/index.ts +88 -63
  296. package/src/components/VvTab/VvTab.vue +79 -69
  297. package/src/components/VvTab/index.ts +13 -13
  298. package/src/components/VvTextarea/VvTextarea.vue +218 -219
  299. package/src/components/VvTextarea/index.ts +35 -35
  300. package/src/components/VvTooltip/VvTooltip.vue +22 -16
  301. package/src/components/VvTooltip/index.ts +12 -12
  302. package/src/components/common/HintSlot.ts +151 -152
  303. package/src/components/index.ts +10 -0
  304. package/src/composables/alert/{useInjectAlert.ts → useAlerInject.ts} +1 -1
  305. package/src/composables/alert/useAlert.ts +76 -73
  306. package/src/composables/alert/{useProvideAlert.ts → useAlertProvide.ts} +12 -12
  307. package/src/composables/dropdown/useDropdownContextmenu.ts +22 -0
  308. package/src/composables/dropdown/{useInjectDropdown.ts → useDropdownInject.ts} +6 -6
  309. package/src/composables/dropdown/useDropdownProvide.ts +94 -0
  310. package/src/composables/dropdown/useDropdownVirtualElement.ts +53 -0
  311. package/src/composables/group/useGroupStateInject.ts +55 -0
  312. package/src/composables/group/useGroupStateProvide.ts +14 -0
  313. package/src/composables/index.ts +3 -0
  314. package/src/composables/useBlurhash.ts +68 -0
  315. package/src/composables/useComponentFocus.ts +9 -9
  316. package/src/composables/useComponentIcon.ts +36 -35
  317. package/src/composables/useDebouncedInput.ts +25 -25
  318. package/src/composables/useDefaults.ts +81 -80
  319. package/src/composables/useModifiers.ts +29 -29
  320. package/src/composables/useOptions.ts +51 -42
  321. package/src/composables/usePersistence.ts +74 -0
  322. package/src/composables/useTextCount.ts +46 -46
  323. package/src/composables/useUniqueId.ts +4 -4
  324. package/src/composables/useVolver.ts +1 -1
  325. package/src/constants.ts +98 -83
  326. package/src/directives/index.ts +3 -6
  327. package/src/directives/v-contextmenu.ts +26 -34
  328. package/src/directives/v-tooltip.ts +20 -11
  329. package/src/icons.ts +2 -2
  330. package/src/index.ts +6 -4
  331. package/src/props/index.ts +461 -384
  332. package/src/resolvers/unplugin.ts +154 -144
  333. package/src/shims.d.ts +4 -5
  334. package/src/stories/Accordion/Accordion.settings.ts +51 -50
  335. package/src/stories/Accordion/Accordion.stories.ts +21 -21
  336. package/src/stories/Accordion/Accordion.test.ts +56 -54
  337. package/src/stories/Accordion/AccordionSlots.stories.ts +13 -13
  338. package/src/stories/AccordionGroup/AccordionGroup.settings.ts +70 -67
  339. package/src/stories/AccordionGroup/AccordionGroup.stories.ts +41 -39
  340. package/src/stories/AccordionGroup/AccordionGroup.test.ts +49 -45
  341. package/src/stories/AccordionGroup/AccordionGroupSlots.stories.ts +36 -36
  342. package/src/stories/Alert/Alert.settings.ts +117 -116
  343. package/src/stories/Alert/Alert.stories.ts +30 -30
  344. package/src/stories/Alert/Alert.test.ts +78 -80
  345. package/src/stories/Alert/AlertModifiers.stories.ts +45 -45
  346. package/src/stories/Alert/AlertSlots.stories.ts +35 -35
  347. package/src/stories/AlertGroup/AlertGroup.settings.ts +107 -105
  348. package/src/stories/AlertGroup/AlertGroup.stories.ts +25 -25
  349. package/src/stories/AlertGroup/AlertGroup.test.ts +69 -71
  350. package/src/stories/AlertGroup/AlertGroupPosition.stories.ts +68 -68
  351. package/src/stories/AlertGroup/AlertGroupSlots.stories.ts +23 -23
  352. package/src/stories/AlertGroup/AlertGroupWithComposable.stories.ts +58 -58
  353. package/src/stories/Avatar/Avatar.settings.ts +29 -29
  354. package/src/stories/Avatar/Avatar.stories.ts +22 -22
  355. package/src/stories/Avatar/Avatar.test.ts +22 -24
  356. package/src/stories/Avatar/AvatarBadge.stories.ts +15 -15
  357. package/src/stories/Avatar/AvatarModifiers.stories.ts +60 -60
  358. package/src/stories/Avatar/AvatarSlots.stories.ts +17 -17
  359. package/src/stories/AvatarGroup/AvatarGroup.settings.ts +54 -53
  360. package/src/stories/AvatarGroup/AvatarGroup.stories.ts +17 -17
  361. package/src/stories/AvatarGroup/AvatarGroup.test.ts +24 -26
  362. package/src/stories/AvatarGroup/AvatarGroupModifiers.stories.ts +15 -15
  363. package/src/stories/AvatarGroup/AvatarGroupSlotDefault.stories.ts +17 -17
  364. package/src/stories/Badge/Badge.settings.ts +21 -20
  365. package/src/stories/Badge/Badge.stories.ts +24 -24
  366. package/src/stories/Badge/Badge.test.ts +8 -8
  367. package/src/stories/Badge/BadgeSlots.stories.ts +10 -10
  368. package/src/stories/Blurhash/BlurhashComposable.stories.ts +116 -0
  369. package/src/stories/Breadcrumb/Breadcrumb.settings.ts +35 -34
  370. package/src/stories/Breadcrumb/Breadcrumb.stories.ts +23 -23
  371. package/src/stories/Breadcrumb/Breadcrumb.test.ts +44 -43
  372. package/src/stories/Breadcrumb/BreadcrumbSlots.stories.ts +19 -19
  373. package/src/stories/Button/Button.settings.ts +147 -151
  374. package/src/stories/Button/Button.stories.ts +19 -19
  375. package/src/stories/Button/Button.test.ts +41 -42
  376. package/src/stories/Button/ButtonIcon.stories.ts +42 -42
  377. package/src/stories/Button/ButtonLink.stories.ts +24 -24
  378. package/src/stories/Button/ButtonLoading.stories.ts +22 -22
  379. package/src/stories/Button/ButtonModifiers.stories.ts +91 -91
  380. package/src/stories/Button/ButtonSlots.stories.ts +47 -47
  381. package/src/stories/Button/ButtonState.stories.ts +23 -23
  382. package/src/stories/Button/ButtonToggle.stories.ts +30 -30
  383. package/src/stories/ButtonGroup/ButtonGroup.settings.ts +33 -24
  384. package/src/stories/ButtonGroup/ButtonGroup.stories.ts +19 -19
  385. package/src/stories/ButtonGroup/ButtonGroup.test.ts +23 -26
  386. package/src/stories/ButtonGroup/ButtonGroupModifiers.stories.ts +20 -20
  387. package/src/stories/ButtonGroup/ButtonGroupSlots.stories.ts +17 -17
  388. package/src/stories/ButtonGroup/ButtonGroupToggle.stories.ts +22 -22
  389. package/src/stories/Card/Card.settings.ts +49 -48
  390. package/src/stories/Card/Card.stories.ts +22 -22
  391. package/src/stories/Card/Card.test.ts +14 -16
  392. package/src/stories/Card/CardSlots.stories.ts +42 -42
  393. package/src/stories/Checkbox/Checkbox.settings.ts +36 -35
  394. package/src/stories/Checkbox/Checkbox.stories.ts +57 -57
  395. package/src/stories/Checkbox/Checkbox.test.ts +63 -66
  396. package/src/stories/Checkbox/CheckboxBinary.stories.ts +18 -18
  397. package/src/stories/Checkbox/CheckboxSlots.stories.ts +15 -15
  398. package/src/stories/CheckboxGroup/CheckboxGroup.settings.ts +9 -9
  399. package/src/stories/CheckboxGroup/CheckboxGroup.stories.ts +50 -50
  400. package/src/stories/CheckboxGroup/CheckboxGroup.test.ts +64 -68
  401. package/src/stories/CheckboxGroup/CheckboxGroupOptions.stories.ts +34 -34
  402. package/src/stories/CheckboxGroup/CheckboxGroupSlots.stories.ts +23 -23
  403. package/src/stories/Combobox/Combobox.settings.ts +408 -385
  404. package/src/stories/Combobox/Combobox.stories.ts +116 -107
  405. package/src/stories/Combobox/Combobox.test.ts +92 -92
  406. package/src/stories/Combobox/ComboboxIconPosition.stories.ts +25 -24
  407. package/src/stories/Combobox/ComboboxMultiple.stories.ts +32 -22
  408. package/src/stories/Combobox/ComboboxOptions.stories.ts +81 -84
  409. package/src/stories/Combobox/ComboboxSlots.stories.ts +55 -54
  410. package/src/stories/Dialog/Dialog.settings.ts +49 -40
  411. package/src/stories/Dialog/Dialog.stories.ts +28 -28
  412. package/src/stories/Dialog/Dialog.test.ts +49 -54
  413. package/src/stories/Dialog/DialogModifiers.stories.ts +42 -0
  414. package/src/stories/Dialog/DialogSlots.stories.ts +20 -20
  415. package/src/stories/Dropdown/Dropdown.settings.ts +62 -61
  416. package/src/stories/Dropdown/Dropdown.stories.ts +60 -60
  417. package/src/stories/Dropdown/Dropdown.test.ts +9 -13
  418. package/src/stories/Dropdown/DropdownContextmenuDirective.stories.ts +18 -19
  419. package/src/stories/Dropdown/DropdownMultilevel.stories.ts +19 -19
  420. package/src/stories/Dropdown/DropdownSlots.stories.ts +51 -51
  421. package/src/stories/Icon/Icon.settings.ts +66 -65
  422. package/src/stories/Icon/Icon.stories.ts +29 -30
  423. package/src/stories/Icon/IconsCollection.stories.ts +24 -24
  424. package/src/stories/InputFile/InputFile.settings.ts +37 -0
  425. package/src/stories/InputFile/InputFile.stories.ts +97 -0
  426. package/src/stories/InputFile/InputFileDropArea.stories.ts +56 -0
  427. package/src/stories/InputFile/InputFileIconPosition.stories.ts +43 -0
  428. package/src/stories/InputFile/InputFileSlots.stories.ts +33 -0
  429. package/src/stories/InputText/InputText.settings.ts +248 -246
  430. package/src/stories/InputText/InputText.stories.ts +68 -68
  431. package/src/stories/InputText/InputText.test.ts +119 -122
  432. package/src/stories/InputText/InputTextIconPosition.stories.ts +24 -24
  433. package/src/stories/InputText/InputTextLength.stories.ts +33 -33
  434. package/src/stories/InputText/InputTextMask.stories.ts +91 -91
  435. package/src/stories/InputText/InputTextMinMax.stories.ts +30 -30
  436. package/src/stories/InputText/InputTextSlots.stories.ts +20 -20
  437. package/src/stories/InputText/InputTextType.stories.ts +70 -70
  438. package/src/stories/Nav/Nav.settings.ts +27 -27
  439. package/src/stories/Nav/Nav.stories.ts +18 -18
  440. package/src/stories/Nav/Nav.test.ts +10 -12
  441. package/src/stories/Nav/NavModifiers.stories.ts +25 -25
  442. package/src/stories/Progress/Progress.settings.ts +24 -23
  443. package/src/stories/Progress/Progress.stories.ts +23 -23
  444. package/src/stories/Progress/Progress.test.ts +5 -5
  445. package/src/stories/Radio/Radio.settings.ts +9 -9
  446. package/src/stories/Radio/Radio.stories.ts +47 -47
  447. package/src/stories/Radio/Radio.test.ts +54 -57
  448. package/src/stories/Radio/RadioSlots.stories.ts +15 -15
  449. package/src/stories/RadioGroup/RadioGroup.settings.ts +9 -9
  450. package/src/stories/RadioGroup/RadioGroup.stories.ts +51 -52
  451. package/src/stories/RadioGroup/RadioGroup.test.ts +64 -68
  452. package/src/stories/RadioGroup/RadioGroupOptions.stories.ts +35 -35
  453. package/src/stories/RadioGroup/RadioGroupSlots.stories.ts +23 -23
  454. package/src/stories/Select/Select.settings.ts +72 -71
  455. package/src/stories/Select/Select.stories.ts +75 -66
  456. package/src/stories/Select/Select.test.ts +67 -70
  457. package/src/stories/Select/SelectIconPosition.stories.ts +27 -26
  458. package/src/stories/Select/SelectOptions.stories.ts +55 -55
  459. package/src/stories/Select/SelectSlots.stories.ts +21 -20
  460. package/src/stories/Tab/Tab.settings.ts +34 -34
  461. package/src/stories/Tab/Tab.stories.ts +16 -16
  462. package/src/stories/Tab/Tab.test.ts +17 -19
  463. package/src/stories/Textarea/Textarea.settings.ts +80 -78
  464. package/src/stories/Textarea/Textarea.stories.ts +63 -63
  465. package/src/stories/Textarea/Textarea.test.ts +70 -73
  466. package/src/stories/Textarea/TextareaLength.stories.ts +33 -33
  467. package/src/stories/Textarea/TextareaSlots.stories.ts +20 -20
  468. package/src/stories/Textarea/TextareatIconPosition.stories.ts +24 -24
  469. package/src/stories/Tooltip/Tooltip.settings.ts +16 -17
  470. package/src/stories/Tooltip/Tooltip.stories.ts +18 -18
  471. package/src/stories/Tooltip/Tooltip.test.ts +53 -54
  472. package/src/stories/Tooltip/TooltipDirective.stories.ts +37 -37
  473. package/src/stories/argTypes.ts +506 -505
  474. package/src/test/expect.ts +74 -79
  475. package/src/test/options.ts +17 -16
  476. package/src/test/sleep.ts +3 -2
  477. package/src/test/types.d.ts +12 -12
  478. package/src/types/alert.ts +21 -17
  479. package/src/types/blurhash.ts +21 -0
  480. package/src/types/floating-ui.ts +1 -1
  481. package/src/types/generic.ts +2 -3
  482. package/src/types/group.ts +35 -27
  483. package/src/types/index.ts +7 -0
  484. package/src/types/input-file.ts +10 -0
  485. package/src/types/nav.ts +13 -14
  486. package/src/utils/DomUtilities.ts +15 -0
  487. package/src/utils/ObjectUtilities.ts +192 -188
  488. package/src/workers/blurhash.ts +9 -0
  489. package/dist/composables/alert/useInjectAlert.d.ts +0 -9
  490. package/dist/composables/dropdown/useInjectDropdown.d.ts +0 -32
  491. package/dist/composables/group/useInjectedGroupState.d.ts +0 -10
  492. package/dist/composables/group/useProvideGroupState.d.ts +0 -6
  493. package/src/composables/dropdown/useProvideDropdown.ts +0 -94
  494. package/src/composables/group/useInjectedGroupState.ts +0 -51
  495. package/src/composables/group/useProvideGroupState.ts +0 -20
  496. /package/src/assets/icons/normal/{dulicate.svg → duplicate.svg} +0 -0
@@ -1,547 +1,683 @@
1
- <script lang="ts">
2
- export default {
3
- name: 'VvInputText',
4
- }
5
- </script>
6
-
7
1
  <script setup lang="ts">
8
- import type { InputHTMLAttributes } from 'vue'
9
- import { useIMask } from 'vue-imask'
10
- import HintSlotFactory from '../common/HintSlot'
11
- import VvIcon from '../VvIcon/VvIcon.vue'
12
- import VvInputTextActionsFactory from '../VvInputText/VvInputTextActions'
13
- import {
14
- VvInputTextEvents,
15
- VvInputTextProps,
16
- INPUT_TYPES,
17
- TYPES_ICON,
18
- } from '../VvInputText'
2
+ import type { MaskedNumberOptions } from 'imask'
3
+ import type { InputHTMLAttributes } from 'vue'
4
+ import { useIMask } from 'vue-imask'
5
+ import HintSlotFactory from '../common/HintSlot'
6
+ import VvDropdown from '../VvDropdown/VvDropdown.vue'
7
+ import VvDropdownOption from '../VvDropdown/VvDropdownOption.vue'
8
+ import { ACTION_ICONS } from '../VvIcon'
9
+ import VvIcon from '../VvIcon/VvIcon.vue'
10
+ import {
11
+ INPUT_TYPES,
12
+ VvInputTextEvents,
13
+ VvInputTextProps,
14
+ } from '../VvInputText'
15
+ import VvInputTextActionsFactory from '../VvInputText/VvInputTextActions'
16
+
17
+ // props, emit, slots and attrs
18
+ const props = defineProps(VvInputTextProps)
19
+
20
+ const emit = defineEmits(VvInputTextEvents)
19
21
 
20
- // props, emit, slots and attrs
21
- const props = defineProps(VvInputTextProps)
22
- const emit = defineEmits(VvInputTextEvents)
23
- const slots = useSlots()
22
+ const slots = useSlots()
24
23
 
25
- // props merged with volver defaults (now only for labels)
26
- const propsDefaults = useDefaults<typeof VvInputTextProps>(
27
- 'VvInputText',
28
- VvInputTextProps,
29
- props,
30
- )
24
+ // props merged with volver defaults (now only for labels)
25
+ const propsDefaults = useDefaults<typeof VvInputTextProps>(
26
+ 'VvInputText',
27
+ VvInputTextProps,
28
+ props,
29
+ )
31
30
 
32
- // data
33
- const {
34
- id,
35
- icon,
36
- iconPosition,
37
- label,
38
- modelValue,
39
- count,
40
- valid,
41
- invalid,
42
- loading,
43
- debounce,
44
- maxlength,
45
- minlength,
46
- type,
47
- iMask,
48
- step,
49
- } = toRefs(props)
50
- const hasId = useUniqueId(id)
51
- const hasHintId = computed(() => `${hasId.value}-hint`)
52
- // BUG: https://www.samanthaming.com/tidbits/88-css-placeholder-shown/
53
- const inputTextPlaceholder = computed(() =>
54
- props.floating && isEmpty(props.placeholder) ? ' ' : props.placeholder,
55
- )
31
+ // data
32
+ const {
33
+ count,
34
+ debounce,
35
+ icon,
36
+ iconPosition,
37
+ iconRemoveSuggestion,
38
+ id,
39
+ invalid,
40
+ label,
41
+ loading,
42
+ maxlength,
43
+ minlength,
44
+ modelValue,
45
+ step,
46
+ storageKey,
47
+ storageType,
48
+ type,
49
+ valid,
50
+ } = toRefs(props)
51
+ const hasId = useUniqueId(id)
52
+ const hasHintId = computed(() => `${hasId.value}-hint`)
53
+ // BUG: https://www.samanthaming.com/tidbits/88-css-placeholder-shown/
54
+ const inputTextPlaceholder = computed(() =>
55
+ props.floating && isEmpty(props.placeholder) ? ' ' : props.placeholder,
56
+ )
56
57
 
57
- // template refs
58
- const maskReady = ref(false)
59
- const { el, mask, typed, masked, unmasked } = useIMask(
60
- computed(
61
- () =>
62
- iMask?.value ?? {
63
- mask: /./,
64
- },
65
- ),
66
- {
67
- emit,
68
- onAccept: () => {
69
- if (!maskReady.value) {
70
- return
71
- }
72
- emit('update:masked', masked.value)
73
- if (type.value === INPUT_TYPES.NUMBER) {
74
- if (masked.value === '') {
75
- if (
76
- localModelValue.value === null ||
77
- localModelValue.value === undefined
78
- ) {
79
- return
80
- }
81
- localModelValue.value = undefined
82
- return
83
- }
84
- if (typeof typed.value !== 'number') {
85
- localModelValue.value = Number(typed.value)
86
- return
87
- }
88
- localModelValue.value = typed.value
89
- return
90
- }
91
- if (type.value === INPUT_TYPES.DATE) {
92
- if (
93
- el.value instanceof HTMLInputElement &&
94
- el.value.type === 'date'
95
- ) {
96
- localModelValue.value = el.value.value
97
- return
98
- }
99
- let date = typed.value
100
- if (date === null || date === '') {
101
- if (!localModelValue.value) {
102
- return
103
- }
104
- localModelValue.value = ''
105
- return
106
- }
107
- if (!(date instanceof Date)) {
108
- date = new Date(date)
109
- }
110
- localModelValue.value = `${date.getFullYear()}-${(
111
- '0' +
112
- (date.getMonth() + 1)
113
- ).slice(-2)}-${('0' + date.getDate()).slice(-2)}`
114
- return
115
- }
116
- if (type.value === INPUT_TYPES.DATETIME_LOCAL) {
117
- if (
118
- el.value instanceof HTMLInputElement &&
119
- el.value.type === 'datetime-local'
120
- ) {
121
- localModelValue.value = el.value.value
122
- return
123
- }
124
- let date = typed.value
125
- if (date === null || date === '') {
126
- if (!localModelValue.value) {
127
- return
128
- }
129
- localModelValue.value = ''
130
- return
131
- }
132
- if (!(typed.value instanceof Date)) {
133
- date = new Date(date)
134
- }
135
- localModelValue.value = `${date.getFullYear()}-${(
136
- '0' +
137
- (date.getMonth() + 1)
138
- ).slice(-2)}-${('0' + date.getDate()).slice(-2)}T${(
139
- '0' + date.getHours()
140
- ).slice(-2)}:${('0' + date.getMinutes()).slice(-2)}`
141
- return
142
- }
143
- if (!localModelValue.value && !unmasked.value) {
144
- return
145
- }
146
- localModelValue.value = unmasked.value
147
- },
148
- },
149
- )
150
- onMounted(() => {
151
- if (mask.value) {
152
- maskReady.value = true
153
- typed.value = localModelValue.value ?? ''
154
- }
155
- })
156
- watch(
157
- () => props.modelValue,
158
- (newValue) => {
159
- if (mask.value) {
160
- typed.value =
161
- newValue && iMask?.value?.mask === Date
162
- ? new Date(newValue)
163
- : newValue ?? ''
164
- }
165
- },
166
- )
167
- watch(
168
- () => props.masked,
169
- (newValue) => {
170
- masked.value = newValue ?? ''
171
- },
172
- )
173
- const inputEl = el as Ref<HTMLInputElement>
174
- const innerEl = ref()
58
+ // debounce
59
+ const localModelValue = useDebouncedInput(
60
+ modelValue,
61
+ emit,
62
+ debounce?.value ?? 0,
63
+ )
175
64
 
176
- defineExpose({ $inner: innerEl })
65
+ // mask
66
+ const NEGATIVE_ZERO_REGEX = /^-0?[.,]?[0*]?$/
67
+ const maskReady = ref(false)
68
+ const { el, mask, typed, masked, unmasked } = useIMask(
69
+ computed(
70
+ () => {
71
+ if (!props.iMask) {
72
+ return {
73
+ mask: /./,
74
+ }
75
+ }
76
+ if (props.iMask.mask === Number) {
77
+ const toReturn = { ...props.iMask } as MaskedNumberOptions
78
+ if (props.min) {
79
+ toReturn.min = Number(props.min)
80
+ }
81
+ if (props.max) {
82
+ toReturn.max = Number(props.max)
83
+ }
84
+ return toReturn
85
+ }
86
+ return props.iMask
87
+ },
88
+ ),
89
+ {
90
+ emit,
91
+ onAccept: () => {
92
+ if (!maskReady.value) {
93
+ return
94
+ }
95
+ emit('update:masked', masked.value)
96
+ if (type.value === INPUT_TYPES.NUMBER) {
97
+ if (/^-$|^$/.test(unmasked.value)) {
98
+ if (
99
+ localModelValue.value === null
100
+ || localModelValue.value === undefined
101
+ ) {
102
+ return
103
+ }
104
+ localModelValue.value = undefined
105
+ return
106
+ }
107
+ if (NEGATIVE_ZERO_REGEX.test(unmasked.value)) {
108
+ localModelValue.value = 0
109
+ return
110
+ }
111
+ if (typeof typed.value !== 'number') {
112
+ localModelValue.value = Number(typed.value)
113
+ return
114
+ }
115
+ localModelValue.value = typed.value
116
+ return
117
+ }
118
+ if (type.value === INPUT_TYPES.DATE) {
119
+ if (
120
+ el.value instanceof HTMLInputElement
121
+ && el.value.type === 'date'
122
+ ) {
123
+ localModelValue.value = el.value.value
124
+ return
125
+ }
126
+ let date = typed.value
127
+ if (date === null || date === '') {
128
+ if (!localModelValue.value) {
129
+ return
130
+ }
131
+ localModelValue.value = ''
132
+ return
133
+ }
134
+ if (!(date instanceof Date)) {
135
+ date = new Date(date)
136
+ }
137
+ localModelValue.value = `${date.getFullYear()}-${(
138
+ `0${
139
+ date.getMonth() + 1}`
140
+ ).slice(-2)}-${(`0${date.getDate()}`).slice(-2)}`
141
+ return
142
+ }
143
+ if (type.value === INPUT_TYPES.DATETIME_LOCAL) {
144
+ if (
145
+ el.value instanceof HTMLInputElement
146
+ && el.value.type === 'datetime-local'
147
+ ) {
148
+ localModelValue.value = el.value.value
149
+ return
150
+ }
151
+ let date = typed.value
152
+ if (date === null || date === '') {
153
+ if (!localModelValue.value) {
154
+ return
155
+ }
156
+ localModelValue.value = ''
157
+ return
158
+ }
159
+ if (!(typed.value instanceof Date)) {
160
+ date = new Date(date)
161
+ }
162
+ localModelValue.value = `${date.getFullYear()}-${(
163
+ `0${
164
+ date.getMonth() + 1}`
165
+ ).slice(-2)}-${(`0${date.getDate()}`).slice(-2)}T${(
166
+ `0${date.getHours()}`
167
+ ).slice(-2)}:${(`0${date.getMinutes()}`).slice(-2)}`
168
+ return
169
+ }
170
+ if (!localModelValue.value && !unmasked.value) {
171
+ return
172
+ }
173
+ localModelValue.value = unmasked.value
174
+ },
175
+ },
176
+ )
177
+ function updateMaskValue(newValue: string | number | undefined) {
178
+ if (newValue === undefined) {
179
+ typed.value = ''
180
+ unmasked.value = ''
181
+ return
182
+ }
183
+ if (props.iMask?.mask === Date) {
184
+ typed.value = new Date(newValue)
185
+ return
186
+ }
187
+ if (
188
+ type.value === INPUT_TYPES.NUMBER
189
+ && NEGATIVE_ZERO_REGEX.test(unmasked.value)
190
+ && newValue === 0
191
+ ) {
192
+ return
193
+ }
194
+ typed.value = newValue
195
+ unmasked.value = `${typed.value}`
196
+ }
197
+ onMounted(() => {
198
+ if (mask.value) {
199
+ maskReady.value = true
200
+ updateMaskValue(props.modelValue)
201
+ }
202
+ })
203
+ watch(
204
+ () => props.modelValue,
205
+ (newValue) => {
206
+ if (mask.value) {
207
+ updateMaskValue(newValue)
208
+ }
209
+ },
210
+ )
211
+ watch(
212
+ () => props.masked,
213
+ (newValue) => {
214
+ masked.value = newValue ?? ''
215
+ },
216
+ )
177
217
 
178
- // debounce
179
- const localModelValue = useDebouncedInput(
180
- modelValue,
181
- emit,
182
- debounce?.value ?? 0,
183
- )
218
+ // template refs
219
+ const inputEl = el as Ref<HTMLInputElement>
220
+ const innerEl = ref<HTMLInputElement>()
221
+ const wrapperEl = ref<HTMLDivElement>()
222
+ const dropdownEl = ref<typeof VvDropdown>()
184
223
 
185
- // focus
186
- const { focused } = useComponentFocus(inputEl, emit)
187
- const isFocused = computed(
188
- () => focused.value && !props.disabled && !props.readonly,
189
- )
190
- watch(isFocused, (newValue) => {
191
- if (newValue && propsDefaults.value.selectOnFocus && inputEl.value) {
192
- inputEl.value.select()
193
- }
194
- })
224
+ defineExpose({ $inner: innerEl })
195
225
 
196
- // visibility
197
- const isVisible = useElementVisibility(inputEl)
198
- watch(isVisible, (newValue) => {
199
- if (newValue && props.autofocus && !props.disabled && !props.readonly) {
200
- focused.value = true
201
- }
202
- })
226
+ // focus
227
+ const { focused } = useComponentFocus(inputEl, emit)
228
+ const isFocused = computed(
229
+ () => focused.value && !props.disabled && !props.readonly,
230
+ )
231
+ watch(isFocused, (newValue) => {
232
+ if (newValue && propsDefaults.value.selectOnFocus && inputEl.value) {
233
+ inputEl.value.select()
234
+ }
235
+ if (newValue) {
236
+ dropdownEl.value?.show()
237
+ return
238
+ }
239
+ setTimeout(() => {
240
+ if (isDirty.value && suggestions.value) {
241
+ const suggestionsLimit = props.maxSuggestions - 1
242
+ if (
243
+ suggestions.value.size > suggestionsLimit
244
+ && !suggestions.value.has(localModelValue.value)
245
+ ) {
246
+ suggestions.value = new Set(
247
+ [...suggestions.value].slice(
248
+ suggestions.value.size - suggestionsLimit,
249
+ ),
250
+ )
251
+ }
252
+ suggestions.value.add(localModelValue.value)
253
+ }
254
+ }, 300)
255
+ })
203
256
 
204
- // password
205
- const showPassword = ref(false)
206
- const isPassword = computed(() => props.type === INPUT_TYPES.PASSWORD)
207
- const onTogglePassword = () => {
208
- showPassword.value = !showPassword.value
209
- }
257
+ // visibility
258
+ const isVisible = useElementVisibility(inputEl)
259
+ watch(isVisible, (newValue) => {
260
+ if (newValue && props.autofocus && !props.disabled && !props.readonly) {
261
+ focused.value = true
262
+ }
263
+ })
210
264
 
211
- // time, datetime and date
212
- const isDateTime = computed(
213
- () =>
214
- props.type === INPUT_TYPES.TIME ||
215
- props.type === INPUT_TYPES.DATETIME_LOCAL ||
216
- props.type === INPUT_TYPES.DATE ||
217
- props.type === INPUT_TYPES.WEEK ||
218
- props.type === INPUT_TYPES.MONTH,
219
- )
265
+ // password
266
+ const showPassword = ref(false)
267
+ const isPassword = computed(() => props.type === INPUT_TYPES.PASSWORD)
268
+ function onTogglePassword() {
269
+ showPassword.value = !showPassword.value
270
+ }
220
271
 
221
- // number
222
- const isNumber = computed(() => props.type === INPUT_TYPES.NUMBER)
223
- const onStepUp = () => {
224
- if (isClickable.value) {
225
- if (iMask?.value) {
226
- typed.value = typed.value + Number(step?.value ?? 1)
227
- return
228
- }
229
- inputEl.value.stepUp()
230
- localModelValue.value = unref(inputEl).value
231
- }
232
- }
233
- const onStepDown = () => {
234
- if (isClickable.value) {
235
- if (iMask?.value) {
236
- typed.value = typed.value - Number(step?.value ?? 1)
272
+ // time, datetime and date
273
+ const isDateTime = computed(
274
+ () =>
275
+ props.type === INPUT_TYPES.TIME
276
+ || props.type === INPUT_TYPES.DATETIME_LOCAL
277
+ || props.type === INPUT_TYPES.DATE
278
+ || props.type === INPUT_TYPES.WEEK
279
+ || props.type === INPUT_TYPES.MONTH,
280
+ )
237
281
 
238
- return
239
- }
240
- inputEl.value.stepDown()
241
- localModelValue.value = unref(inputEl).value
242
- }
243
- }
282
+ // number
283
+ const isNumber = computed(() => props.type === INPUT_TYPES.NUMBER)
284
+ function onStepUp() {
285
+ if (isClickable.value) {
286
+ if (props.iMask) {
287
+ typed.value = Number(typed.value) + Number(step?.value ?? 1)
288
+ return
289
+ }
290
+ inputEl.value.stepUp()
291
+ localModelValue.value = Number(unref(inputEl).value)
292
+ }
293
+ }
294
+ function onStepDown() {
295
+ if (isClickable.value) {
296
+ if (props.iMask) {
297
+ typed.value = Number(typed.value) - Number(step?.value ?? 1)
298
+ return
299
+ }
300
+ inputEl.value.stepDown()
301
+ localModelValue.value = Number(unref(inputEl).value)
302
+ }
303
+ }
244
304
 
245
- // search
246
- const isSearch = computed(() => props.type === INPUT_TYPES.SEARCH)
247
- const onClear = () => {
248
- localModelValue.value = ''
249
- }
305
+ // search
306
+ const isSearch = computed(() => props.type === INPUT_TYPES.SEARCH)
307
+ function onClear() {
308
+ localModelValue.value = ''
309
+ }
250
310
 
251
- // icons
252
- const { hasIcon, hasIconBefore, hasIconAfter } = useComponentIcon(
253
- icon,
254
- iconPosition,
255
- )
256
- const defaultAfterIcon = computed(() => {
257
- switch (props.type) {
258
- case INPUT_TYPES.COLOR:
259
- return { name: TYPES_ICON.COLOR }
260
- case INPUT_TYPES.DATE:
261
- case INPUT_TYPES.DATETIME_LOCAL:
262
- case INPUT_TYPES.WEEK:
263
- case INPUT_TYPES.MONTH:
264
- return { name: TYPES_ICON.DATE }
265
- case INPUT_TYPES.TIME:
266
- return { name: TYPES_ICON.TIME }
267
- default:
268
- return ''
269
- }
270
- })
311
+ // icons
312
+ const { hasIconBefore, hasIconAfter } = useComponentIcon(icon, iconPosition)
313
+ const iconAfter = computed(() => {
314
+ if (hasIconAfter.value !== undefined) {
315
+ return hasIconAfter.value
316
+ }
317
+ switch (props.type) {
318
+ case INPUT_TYPES.COLOR:
319
+ return { name: ACTION_ICONS.showColorPicker }
320
+ case INPUT_TYPES.DATE:
321
+ case INPUT_TYPES.DATETIME_LOCAL:
322
+ case INPUT_TYPES.WEEK:
323
+ case INPUT_TYPES.MONTH:
324
+ return { name: ACTION_ICONS.showDatePicker }
325
+ case INPUT_TYPES.TIME:
326
+ return { name: ACTION_ICONS.showTimePicker }
327
+ }
328
+ return undefined
329
+ })
330
+ const { hasIcon: hasIconRemoveSuggestion }
331
+ = useComponentIcon(iconRemoveSuggestion)
271
332
 
272
- // count
273
- const { formatted: countFormatted } = useTextCount(localModelValue, {
274
- mode: count.value,
275
- upperLimit: Number(maxlength?.value),
276
- lowerLimit: Number(minlength?.value),
277
- })
333
+ // count
334
+ const { formatted: countFormatted } = useTextCount(localModelValue, {
335
+ mode: count.value,
336
+ upperLimit: Number(maxlength?.value),
337
+ lowerLimit: Number(minlength?.value),
338
+ })
278
339
 
279
- // tabindex
280
- const isClickable = computed(() => !props.disabled && !props.readonly)
281
- const hasTabindex = computed(() =>
282
- isClickable.value ? props.tabindex : -1,
283
- )
340
+ // tabindex
341
+ const isClickable = computed(() => !props.disabled && !props.readonly)
342
+ const hasTabindex = computed(() =>
343
+ isClickable.value ? props.tabindex : -1,
344
+ )
284
345
 
285
- // dirty
286
- const isDirty = computed(() => !isEmpty(modelValue))
346
+ // dirty
347
+ const isDirty = computed(() => !isEmpty(modelValue))
287
348
 
288
- // invalid
289
- const isInvalid = computed(() => {
290
- if (invalid.value === true) {
291
- return true
292
- }
293
- if (valid.value === true) {
294
- return false
295
- }
296
- return undefined
297
- })
349
+ // invalid
350
+ const isInvalid = computed(() => {
351
+ if (invalid.value === true) {
352
+ return true
353
+ }
354
+ if (valid.value === true) {
355
+ return false
356
+ }
357
+ return undefined
358
+ })
298
359
 
299
- // styles
300
- const { modifiers } = toRefs(props)
301
- const bemCssClasses = useModifiers(
302
- 'vv-input-text',
303
- modifiers,
304
- computed(() => ({
305
- valid: valid.value,
306
- invalid: invalid.value,
307
- loading: loading.value,
308
- disabled: props.disabled,
309
- readonly: props.readonly,
310
- 'icon-before': hasIconBefore.value,
311
- 'icon-after': hasIconAfter.value || !isEmpty(defaultAfterIcon),
312
- floating: props.floating && !isEmpty(props.label),
313
- dirty: isDirty.value,
314
- focus: isFocused.value,
315
- 'auto-width': props.autoWidth,
316
- })),
317
- )
360
+ // suggestions
361
+ const suggestions = usePersistence<Set<string>>(
362
+ storageKey,
363
+ storageType,
364
+ new Set(),
365
+ )
366
+ const filteredSuggestions = computed(() => {
367
+ if (!suggestions.value) {
368
+ return []
369
+ }
370
+ return [...suggestions.value]
371
+ .filter(
372
+ suggestion =>
373
+ isEmpty(localModelValue.value)
374
+ || (`${suggestion}`
375
+ .toLowerCase()
376
+ .includes(`${localModelValue.value}`.toLowerCase())
377
+ && suggestion !== localModelValue.value),
378
+ )
379
+ .reverse()
380
+ })
381
+ const hasSuggestions = computed(
382
+ () =>
383
+ storageKey?.value
384
+ && suggestions.value
385
+ && suggestions.value.size > 0,
386
+ )
387
+ function onSuggestionSelect(suggestion: string) {
388
+ localModelValue.value = suggestion
389
+ dropdownEl.value?.hide()
390
+ }
391
+ function onSuggestionRemove(suggestion: string) {
392
+ suggestions.value?.delete(suggestion)
393
+ }
318
394
 
319
- // attrs
320
- const hasAttrs = computed(() => {
321
- const type = (() => {
322
- if (isPassword.value && showPassword.value) {
323
- return INPUT_TYPES.TEXT
324
- }
325
- if (isDateTime.value && !isDirty.value && !focused.value) {
326
- return INPUT_TYPES.TEXT
327
- }
328
- if (iMask?.value) {
329
- return INPUT_TYPES.TEXT
330
- }
331
- return props.type
332
- })()
333
- const toReturn: InputHTMLAttributes = {
334
- type,
335
- name: props.name,
336
- tabindex: hasTabindex.value,
337
- disabled: props.disabled,
338
- readonly: props.readonly,
339
- required: props.required,
340
- autocomplete: props.autocomplete,
341
- 'aria-invalid': isInvalid.value,
342
- 'aria-describedby': hasHintLabelOrSlot.value
343
- ? hasHintId.value
344
- : undefined,
345
- 'aria-errormessage': hasInvalidLabelOrSlot.value
346
- ? hasHintId.value
347
- : undefined,
348
- }
349
- if (
350
- type === INPUT_TYPES.DATE ||
351
- type === INPUT_TYPES.MONTH ||
352
- type === INPUT_TYPES.WEEK ||
353
- type === INPUT_TYPES.TIME ||
354
- type === INPUT_TYPES.DATETIME_LOCAL ||
355
- type === INPUT_TYPES.NUMBER
356
- ) {
357
- toReturn.step = props.step
358
- toReturn.max =
359
- props.max !== undefined ? String(props.max) : undefined
360
- toReturn.min =
361
- props.min !== undefined ? String(props.min) : undefined
362
- }
363
- if (
364
- type === INPUT_TYPES.TEXT ||
365
- type === INPUT_TYPES.SEARCH ||
366
- type === INPUT_TYPES.URL ||
367
- type === INPUT_TYPES.TEL ||
368
- type === INPUT_TYPES.EMAIL ||
369
- type === INPUT_TYPES.PASSWORD ||
370
- type === INPUT_TYPES.NUMBER
371
- ) {
372
- toReturn.placeholder = inputTextPlaceholder.value
373
- }
374
- if (
375
- type === INPUT_TYPES.TEXT ||
376
- type === INPUT_TYPES.SEARCH ||
377
- type === INPUT_TYPES.URL ||
378
- type === INPUT_TYPES.TEL ||
379
- type === INPUT_TYPES.EMAIL ||
380
- type === INPUT_TYPES.PASSWORD
381
- ) {
382
- toReturn.minlength = props.minlength
383
- toReturn.maxlength = props.maxlength
384
- toReturn.pattern = props.pattern
385
- }
386
- if (type === INPUT_TYPES.EMAIL) {
387
- toReturn.multiple = props.multiple
388
- }
389
- return toReturn
390
- })
395
+ // styles
396
+ const { modifiers } = toRefs(props)
397
+ const bemCssClasses = useModifiers(
398
+ 'vv-input-text',
399
+ modifiers,
400
+ computed(() => ({
401
+ 'valid': valid.value,
402
+ 'invalid': invalid.value,
403
+ 'loading': loading.value,
404
+ 'disabled': props.disabled,
405
+ 'readonly': props.readonly,
406
+ 'icon-before': !!hasIconBefore.value,
407
+ 'icon-after': !!iconAfter.value,
408
+ 'floating': props.floating && !isEmpty(props.label),
409
+ 'dirty': isDirty.value,
410
+ 'focus': isFocused.value,
411
+ 'auto-width': props.autoWidth,
412
+ })),
413
+ )
391
414
 
392
- // slots
393
- const slotProps = computed(() => ({
394
- valid: props.valid,
395
- invalid: props.invalid,
396
- modelValue: props.modelValue,
397
- togglePassword: onTogglePassword,
398
- stepUp: onStepUp,
399
- stepDown: onStepDown,
400
- clear: onClear,
401
- }))
415
+ // attrs
416
+ const hasAttrs = computed(() => {
417
+ const type = (() => {
418
+ if (isPassword.value && showPassword.value) {
419
+ return INPUT_TYPES.TEXT
420
+ }
421
+ if (isDateTime.value && !isDirty.value && !focused.value) {
422
+ return INPUT_TYPES.TEXT
423
+ }
424
+ if (props.iMask) {
425
+ return INPUT_TYPES.TEXT
426
+ }
427
+ return props.type
428
+ })()
429
+ const toReturn: InputHTMLAttributes = {
430
+ type,
431
+ 'name': props.name,
432
+ 'tabindex': hasTabindex.value,
433
+ 'disabled': props.disabled,
434
+ 'readonly': props.readonly,
435
+ 'required': props.required,
436
+ 'autocomplete': props.autocomplete,
437
+ 'aria-invalid': isInvalid.value,
438
+ 'aria-describedby': hasHintLabelOrSlot.value
439
+ ? hasHintId.value
440
+ : undefined,
441
+ 'aria-errormessage': hasInvalidLabelOrSlot.value
442
+ ? hasHintId.value
443
+ : undefined,
444
+ }
445
+ if (
446
+ type === INPUT_TYPES.DATE
447
+ || type === INPUT_TYPES.MONTH
448
+ || type === INPUT_TYPES.WEEK
449
+ || type === INPUT_TYPES.TIME
450
+ || type === INPUT_TYPES.DATETIME_LOCAL
451
+ || type === INPUT_TYPES.NUMBER
452
+ ) {
453
+ let max = props.max
454
+ if (type === INPUT_TYPES.DATE && !max) {
455
+ max = '9999-12-31'
456
+ }
457
+ toReturn.step = props.step
458
+ toReturn.max = max !== undefined ? String(max) : undefined
459
+ toReturn.min
460
+ = props.min !== undefined ? String(props.min) : undefined
461
+ }
462
+ if (
463
+ type === INPUT_TYPES.TEXT
464
+ || type === INPUT_TYPES.SEARCH
465
+ || type === INPUT_TYPES.URL
466
+ || type === INPUT_TYPES.TEL
467
+ || type === INPUT_TYPES.EMAIL
468
+ || type === INPUT_TYPES.PASSWORD
469
+ || type === INPUT_TYPES.NUMBER
470
+ ) {
471
+ toReturn.placeholder = inputTextPlaceholder.value
472
+ }
473
+ if (
474
+ type === INPUT_TYPES.TEXT
475
+ || type === INPUT_TYPES.SEARCH
476
+ || type === INPUT_TYPES.URL
477
+ || type === INPUT_TYPES.TEL
478
+ || type === INPUT_TYPES.EMAIL
479
+ || type === INPUT_TYPES.PASSWORD
480
+ ) {
481
+ toReturn.minlength = props.minlength
482
+ toReturn.maxlength = props.maxlength
483
+ toReturn.pattern = props.pattern
484
+ }
485
+ if (type === INPUT_TYPES.EMAIL) {
486
+ toReturn.multiple = props.multiple
487
+ }
488
+ return toReturn
489
+ })
402
490
 
403
- // components
404
- const {
405
- HintSlot,
406
- hasHintLabelOrSlot,
407
- hasInvalidLabelOrSlot,
408
- hintSlotScope,
409
- } = HintSlotFactory(propsDefaults, slots)
410
- const PasswordInputActions = VvInputTextActionsFactory(
411
- INPUT_TYPES.PASSWORD,
412
- props,
413
- )
414
- const NumberInputActions = VvInputTextActionsFactory(
415
- INPUT_TYPES.NUMBER,
416
- props,
417
- )
418
- const SearchInputActions = VvInputTextActionsFactory(
419
- INPUT_TYPES.SEARCH,
420
- props,
421
- )
491
+ // slots
492
+ const slotProps = computed(() => ({
493
+ valid: props.valid,
494
+ invalid: props.invalid,
495
+ modelValue: props.modelValue,
496
+ togglePassword: onTogglePassword,
497
+ stepUp: onStepUp,
498
+ stepDown: onStepDown,
499
+ clear: onClear,
500
+ }))
422
501
 
423
- // auto-width
424
- const onClickInner = () => {
425
- if (isClickable.value) {
426
- focused.value = true
427
- }
428
- }
429
- const hasStyle = computed(() => {
430
- if (!props.autoWidth) {
431
- return undefined
432
- }
433
- return {
434
- width:
502
+ // components
503
+ const {
504
+ HintSlot,
505
+ hasHintLabelOrSlot,
506
+ hasInvalidLabelOrSlot,
507
+ hintSlotScope,
508
+ } = HintSlotFactory(propsDefaults, slots)
509
+ const PasswordInputActions = VvInputTextActionsFactory(
510
+ INPUT_TYPES.PASSWORD,
511
+ props,
512
+ )
513
+ const NumberInputActions = VvInputTextActionsFactory(
514
+ INPUT_TYPES.NUMBER,
515
+ props,
516
+ )
517
+ const SearchInputActions = VvInputTextActionsFactory(
518
+ INPUT_TYPES.SEARCH,
519
+ props,
520
+ )
521
+
522
+ // auto-width
523
+ function onClickInner() {
524
+ if (isClickable.value) {
525
+ focused.value = true
526
+ }
527
+ }
528
+ const hasStyle = computed(() => {
529
+ if (!props.autoWidth) {
530
+ return undefined
531
+ }
532
+ return {
533
+ width:
435
534
  localModelValue.value !== undefined
436
- ? `${String(localModelValue.value).length + 1}ch`
437
- : undefined,
438
- }
439
- })
535
+ ? `${String(localModelValue.value).length + 1}ch`
536
+ : undefined,
537
+ }
538
+ })
539
+
540
+ // keydown
541
+ function onKeyDown(event: KeyboardEvent) {
542
+ switch (event.code) {
543
+ case 'ArrowUp':
544
+ if (isNumber.value) {
545
+ onStepUp()
546
+ event.preventDefault()
547
+ }
548
+ break
440
549
 
441
- // keydown
442
- const onKeyDown = (event: KeyboardEvent) => {
443
- switch (event.code) {
444
- case 'ArrowUp':
445
- if (isNumber.value) {
446
- onStepUp()
447
- event.preventDefault()
448
- }
449
- break
550
+ case 'ArrowDown':
551
+ if (isNumber.value) {
552
+ onStepDown()
553
+ event.preventDefault()
554
+ }
555
+ break
556
+ }
557
+ emit('keydown', event)
558
+ }
559
+ </script>
450
560
 
451
- case 'ArrowDown':
452
- if (isNumber.value) {
453
- onStepDown()
454
- event.preventDefault()
455
- }
456
- break
457
- }
458
- emit('keydown', event)
459
- }
561
+ <script lang="ts">
562
+ export default {
563
+ name: 'VvInputText',
564
+ }
460
565
  </script>
461
566
 
462
567
  <template>
463
- <div :class="bemCssClasses">
464
- <label v-if="label" :for="hasId" class="vv-input-text__label">
465
- {{ label }}
466
- </label>
467
- <div class="vv-input-text__wrapper">
468
- <div v-if="$slots.before" class="vv-input-text__input-before">
469
- <!-- @slot Slot before input icon -->
470
- <slot name="before" v-bind="slotProps" />
471
- </div>
472
- <div
473
- ref="innerEl"
474
- class="vv-input-text__inner"
475
- @click.stop="onClickInner"
476
- >
477
- <VvIcon
478
- v-if="hasIconBefore"
479
- class="vv-input-text__icon"
480
- v-bind="hasIcon"
481
- />
482
- <input
483
- :id="hasId"
484
- ref="inputEl"
485
- v-bind="hasAttrs"
486
- :style="hasStyle"
487
- @keyup="emit('keyup', $event)"
488
- @keydown="onKeyDown"
489
- @keypress="emit('keypress', $event)"
490
- />
491
- <div
492
- v-if="(unit || $slots.unit) && isDirty"
493
- class="vv-input-text__unit"
494
- >
495
- <!-- @slot Slot to replace unit-->
496
- <slot name v-bind="slotProps">
497
- {{ unit }}
498
- </slot>
499
- </div>
500
- </div>
501
- <!-- @slot Slot to replace right icon -->
502
- <VvIcon
503
- v-if="hasIconAfter || defaultAfterIcon"
504
- class="vv-input-text__icon vv-input-text__icon-after"
505
- v-bind="hasIconAfter ? hasIcon : defaultAfterIcon"
506
- />
507
- <PasswordInputActions
508
- v-else-if="isPassword && !hideActions && isClickable"
509
- @toggle-password="onTogglePassword"
510
- />
511
- <NumberInputActions
512
- v-else-if="isNumber && !hideActions && isClickable"
513
- @step-up="onStepUp"
514
- @step-down="onStepDown"
515
- />
516
- <SearchInputActions
517
- v-else-if="isSearch && !hideActions && isClickable"
518
- @clear="onClear"
519
- />
520
- <!-- @slot Slot after input -->
521
- <div v-if="$slots.after" class="vv-input-text__input-after">
522
- <!-- @slot Slot before input icon -->
523
- <slot name="after" v-bind="slotProps" />
524
- </div>
525
- <span v-if="count" class="vv-input-text__limit">
526
- <!-- @slot Slot to replace count -->
527
- <slot name="count" v-bind="slotProps">
528
- {{ countFormatted }}
529
- </slot>
530
- </span>
531
- </div>
532
- <HintSlot :id="hasHintId" class="vv-input-text__hint">
533
- <template v-if="$slots.hint" #hint>
534
- <slot name="hint" v-bind="hintSlotScope" />
535
- </template>
536
- <template v-if="$slots.loading" #loading>
537
- <slot name="loading" v-bind="hintSlotScope" />
538
- </template>
539
- <template v-if="$slots.valid" #valid>
540
- <slot name="valid" v-bind="hintSlotScope" />
541
- </template>
542
- <template v-if="$slots.invalid" #invalid>
543
- <slot name="invalid" v-bind="hintSlotScope" />
544
- </template>
545
- </HintSlot>
546
- </div>
568
+ <div :class="bemCssClasses">
569
+ <label v-if="label" :for="hasId" class="vv-input-text__label">
570
+ {{ label }}
571
+ </label>
572
+ <div ref="wrapperEl" class="vv-input-text__wrapper">
573
+ <div v-if="$slots.before" class="vv-input-text__input-before">
574
+ <!-- @slot Slot before input icon -->
575
+ <slot name="before" v-bind="slotProps" />
576
+ </div>
577
+ <div
578
+ ref="innerEl"
579
+ class="vv-input-text__inner"
580
+ @click.stop="onClickInner"
581
+ >
582
+ <VvIcon
583
+ v-if="hasIconBefore"
584
+ v-bind="hasIconBefore"
585
+ class="vv-input-text__icon"
586
+ />
587
+ <input
588
+ :id="hasId"
589
+ ref="inputEl"
590
+ v-bind="hasAttrs"
591
+ :style="hasStyle"
592
+ @keyup="emit('keyup', $event)"
593
+ @keydown="onKeyDown"
594
+ @keypress="emit('keypress', $event)"
595
+ >
596
+ <div
597
+ v-if="(unit || $slots.unit) && isDirty"
598
+ class="vv-input-text__unit"
599
+ >
600
+ <!-- @slot Slot to replace unit -->
601
+ <slot name v-bind="slotProps">
602
+ {{ unit }}
603
+ </slot>
604
+ </div>
605
+ </div>
606
+ <!-- @slot Slot to replace right icon -->
607
+ <VvIcon
608
+ v-if="iconAfter"
609
+ v-bind="iconAfter"
610
+ class="vv-input-text__icon vv-input-text__icon-after"
611
+ />
612
+ <PasswordInputActions
613
+ v-else-if="isPassword && !hideActions && isClickable"
614
+ @toggle-password="onTogglePassword"
615
+ />
616
+ <NumberInputActions
617
+ v-else-if="isNumber && !hideActions && isClickable"
618
+ @step-up="onStepUp"
619
+ @step-down="onStepDown"
620
+ />
621
+ <SearchInputActions
622
+ v-else-if="isSearch && !hideActions && isClickable"
623
+ @clear="onClear"
624
+ />
625
+ <!-- @slot Slot after input -->
626
+ <div v-if="$slots.after" class="vv-input-text__input-after">
627
+ <!-- @slot Slot before input icon -->
628
+ <slot name="after" v-bind="slotProps" />
629
+ </div>
630
+ <span v-if="count" class="vv-input-text__limit">
631
+ <!-- @slot Slot to replace count -->
632
+ <slot name="count" v-bind="slotProps">
633
+ {{ countFormatted }}
634
+ </slot>
635
+ </span>
636
+ </div>
637
+ <HintSlot :id="hasHintId" class="vv-input-text__hint">
638
+ <template v-if="$slots.hint" #hint>
639
+ <slot name="hint" v-bind="hintSlotScope" />
640
+ </template>
641
+ <template v-if="$slots.loading" #loading>
642
+ <slot name="loading" v-bind="hintSlotScope" />
643
+ </template>
644
+ <template v-if="$slots.valid" #valid>
645
+ <slot name="valid" v-bind="hintSlotScope" />
646
+ </template>
647
+ <template v-if="$slots.invalid" #invalid>
648
+ <slot name="invalid" v-bind="hintSlotScope" />
649
+ </template>
650
+ </HintSlot>
651
+ <VvDropdown
652
+ v-if="hasSuggestions"
653
+ ref="dropdownEl"
654
+ :reference="wrapperEl"
655
+ :autofocus-first="false"
656
+ :trigger-width="true"
657
+ >
658
+ <template #items>
659
+ <VvDropdownOption
660
+ v-for="value in filteredSuggestions"
661
+ :key="value"
662
+ @click.stop="onSuggestionSelect(value)"
663
+ >
664
+ <div class="flex-1">
665
+ <slot name="suggestion" v-bind="{ value }">
666
+ {{ value }}
667
+ </slot>
668
+ </div>
669
+ <button
670
+ v-if="suggestions && hasIconRemoveSuggestion"
671
+ type="button"
672
+ tabindex="-1"
673
+ class="cursor-pointer"
674
+ :title="labelRemoveSuggestion"
675
+ @click.stop="onSuggestionRemove(value)"
676
+ >
677
+ <VvIcon v-bind="hasIconRemoveSuggestion" />
678
+ </button>
679
+ </VvDropdownOption>
680
+ </template>
681
+ </VvDropdown>
682
+ </div>
547
683
  </template>