@volverjs/ui-vue 0.0.10-beta.35 → 0.0.10-beta.36

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 (348) hide show
  1. package/README.md +78 -77
  2. package/bin/icons.cjs +1 -1
  3. package/bin/icons.js +5 -5
  4. package/dist/Volver.d.ts +10 -10
  5. package/dist/components/VvAccordion/VvAccordion.es.js +11 -11
  6. package/dist/components/VvAccordion/VvAccordion.umd.js +1 -1
  7. package/dist/components/VvAccordionGroup/VvAccordionGroup.es.js +17 -17
  8. package/dist/components/VvAccordionGroup/VvAccordionGroup.umd.js +1 -1
  9. package/dist/components/VvAction/VvAction.es.js +6 -6
  10. package/dist/components/VvAction/VvAction.umd.js +1 -1
  11. package/dist/components/VvAlert/VvAlert.es.js +23 -21
  12. package/dist/components/VvAlert/VvAlert.umd.js +1 -1
  13. package/dist/components/VvAlert/index.d.ts +2 -2
  14. package/dist/components/VvAlertGroup/VvAlertGroup.es.js +351 -349
  15. package/dist/components/VvAlertGroup/VvAlertGroup.umd.js +1 -1
  16. package/dist/components/VvAlertGroup/VvAlertGroup.vue.d.ts +3 -3
  17. package/dist/components/VvAlertGroup/index.d.ts +1 -1
  18. package/dist/components/VvAvatar/VvAvatar.es.js +4 -1
  19. package/dist/components/VvAvatar/VvAvatar.umd.js +1 -1
  20. package/dist/components/VvAvatarGroup/VvAvatarGroup.es.js +11 -3
  21. package/dist/components/VvAvatarGroup/VvAvatarGroup.umd.js +1 -1
  22. package/dist/components/VvBreadcrumb/VvBreadcrumb.es.js +10 -10
  23. package/dist/components/VvBreadcrumb/VvBreadcrumb.umd.js +1 -1
  24. package/dist/components/VvButton/VvButton.es.js +31 -25
  25. package/dist/components/VvButton/VvButton.umd.js +1 -1
  26. package/dist/components/VvButtonGroup/VvButtonGroup.es.js +1 -1
  27. package/dist/components/VvButtonGroup/VvButtonGroup.umd.js +1 -1
  28. package/dist/components/VvCheckbox/VvCheckbox.es.js +208 -202
  29. package/dist/components/VvCheckbox/VvCheckbox.umd.js +1 -1
  30. package/dist/components/VvCheckbox/VvCheckbox.vue.d.ts +3 -3
  31. package/dist/components/VvCheckboxGroup/VvCheckboxGroup.es.js +21 -15
  32. package/dist/components/VvCheckboxGroup/VvCheckboxGroup.umd.js +1 -1
  33. package/dist/components/VvCheckboxGroup/VvCheckboxGroup.vue.d.ts +2 -2
  34. package/dist/components/VvCombobox/VvCombobox.es.js +454 -446
  35. package/dist/components/VvCombobox/VvCombobox.umd.js +1 -1
  36. package/dist/components/VvCombobox/VvCombobox.vue.d.ts +5 -5
  37. package/dist/components/VvCombobox/index.d.ts +5 -10
  38. package/dist/components/VvDialog/VvDialog.es.js +11 -11
  39. package/dist/components/VvDialog/VvDialog.umd.js +1 -1
  40. package/dist/components/VvDropdown/VvDropdown.es.js +29 -25
  41. package/dist/components/VvDropdown/VvDropdown.umd.js +1 -1
  42. package/dist/components/VvDropdown/VvDropdown.vue.d.ts +12 -8
  43. package/dist/components/VvDropdownAction/VvDropdownAction.es.js +11 -14
  44. package/dist/components/VvDropdownAction/VvDropdownAction.umd.js +1 -1
  45. package/dist/components/VvIcon/VvIcon.es.js +1 -1
  46. package/dist/components/VvIcon/VvIcon.umd.js +1 -1
  47. package/dist/components/VvInputFile/VvInputFile.es.js +61 -55
  48. package/dist/components/VvInputFile/VvInputFile.umd.js +1 -1
  49. package/dist/components/VvInputFile/VvInputFile.vue.d.ts +2 -2
  50. package/dist/components/VvInputFile/index.d.ts +6 -6
  51. package/dist/components/VvInputText/VvInputText.es.js +287 -286
  52. package/dist/components/VvInputText/VvInputText.umd.js +1 -1
  53. package/dist/components/VvInputText/VvInputText.vue.d.ts +2 -2
  54. package/dist/components/VvInputText/index.d.ts +7 -2
  55. package/dist/components/VvNav/VvNav.es.js +23 -20
  56. package/dist/components/VvNav/VvNav.umd.js +1 -1
  57. package/dist/components/VvNavItem/VvNavItem.es.js +6 -6
  58. package/dist/components/VvNavItem/VvNavItem.umd.js +1 -1
  59. package/dist/components/VvRadio/VvRadio.es.js +208 -202
  60. package/dist/components/VvRadio/VvRadio.umd.js +1 -1
  61. package/dist/components/VvRadio/VvRadio.vue.d.ts +2 -2
  62. package/dist/components/VvRadioGroup/VvRadioGroup.es.js +21 -15
  63. package/dist/components/VvRadioGroup/VvRadioGroup.umd.js +1 -1
  64. package/dist/components/VvRadioGroup/VvRadioGroup.vue.d.ts +2 -2
  65. package/dist/components/VvSelect/VvSelect.es.js +22 -20
  66. package/dist/components/VvSelect/VvSelect.umd.js +1 -1
  67. package/dist/components/VvSelect/VvSelect.vue.d.ts +2 -2
  68. package/dist/components/VvTab/VvTab.es.js +29 -23
  69. package/dist/components/VvTab/VvTab.umd.js +1 -1
  70. package/dist/components/VvTextarea/VvTextarea.es.js +29 -27
  71. package/dist/components/VvTextarea/VvTextarea.umd.js +1 -1
  72. package/dist/components/VvTextarea/VvTextarea.vue.d.ts +2 -2
  73. package/dist/components/VvTooltip/VvTooltip.es.js +4 -1
  74. package/dist/components/VvTooltip/VvTooltip.umd.js +1 -1
  75. package/dist/components/common/HintSlot.d.ts +3 -4
  76. package/dist/components/index.es.js +893 -876
  77. package/dist/components/index.umd.js +1 -1
  78. package/dist/composables/alert/useAlert.d.ts +2 -2
  79. package/dist/composables/index.es.js +10 -10
  80. package/dist/composables/index.umd.js +1 -1
  81. package/dist/composables/useBlurhash.d.ts +1 -1
  82. package/dist/composables/usePersistence.d.ts +2 -1
  83. package/dist/composables/useUniqueId.d.ts +1 -1
  84. package/dist/directives/index.es.js +5 -2
  85. package/dist/directives/index.umd.js +1 -1
  86. package/dist/directives/v-contextmenu.es.js +1 -1
  87. package/dist/directives/v-contextmenu.umd.js +1 -1
  88. package/dist/directives/v-tooltip.es.js +4 -1
  89. package/dist/directives/v-tooltip.umd.js +1 -1
  90. package/dist/icons.es.js +3 -3
  91. package/dist/icons.umd.js +1 -1
  92. package/dist/index.es.js +2 -2
  93. package/dist/stories/Alert/AlertModifiers.stories.d.ts +1 -1
  94. package/dist/stories/Alert/AlertSlots.stories.d.ts +1 -1
  95. package/dist/stories/AlertGroup/AlertGroupPosition.stories.d.ts +1 -1
  96. package/dist/stories/AlertGroup/AlertGroupSlots.stories.d.ts +1 -1
  97. package/dist/stories/AlertGroup/AlertGroupWithComposable.stories.d.ts +1 -1
  98. package/dist/stories/Badge/Badge.test.d.ts +1 -1
  99. package/dist/stories/Combobox/Combobox.settings.d.ts +1 -1
  100. package/dist/test/options.d.ts +1 -1
  101. package/dist/test/sleep.d.ts +1 -1
  102. package/dist/types/alert.d.ts +1 -1
  103. package/dist/utils/ObjectUtilities.d.ts +7 -7
  104. package/package.json +232 -239
  105. package/src/Volver.ts +243 -243
  106. package/src/assets/icons/detailed.json +1 -1
  107. package/src/assets/icons/normal.json +1 -1
  108. package/src/assets/icons/simple.json +1 -1
  109. package/src/components/VvAccordion/VvAccordion.vue +155 -155
  110. package/src/components/VvAccordion/index.ts +62 -62
  111. package/src/components/VvAccordionGroup/VvAccordionGroup.vue +220 -219
  112. package/src/components/VvAccordionGroup/index.ts +41 -41
  113. package/src/components/VvAction/VvAction.vue +144 -142
  114. package/src/components/VvAlert/VvAlert.vue +72 -70
  115. package/src/components/VvAlert/index.ts +147 -150
  116. package/src/components/VvAlertGroup/VvAlertGroup.vue +56 -55
  117. package/src/components/VvAlertGroup/index.ts +99 -103
  118. package/src/components/VvAvatar/VvAvatar.vue +20 -14
  119. package/src/components/VvAvatar/index.ts +5 -5
  120. package/src/components/VvAvatarGroup/VvAvatarGroup.vue +58 -53
  121. package/src/components/VvAvatarGroup/index.ts +21 -21
  122. package/src/components/VvBadge/VvBadge.vue +15 -14
  123. package/src/components/VvBadge/index.ts +2 -2
  124. package/src/components/VvBreadcrumb/VvBreadcrumb.vue +49 -48
  125. package/src/components/VvBreadcrumb/index.ts +2 -2
  126. package/src/components/VvButton/VvButton.vue +163 -162
  127. package/src/components/VvButton/index.ts +102 -102
  128. package/src/components/VvButtonGroup/VvButtonGroup.vue +72 -72
  129. package/src/components/VvButtonGroup/index.ts +22 -22
  130. package/src/components/VvCard/VvCard.vue +30 -30
  131. package/src/components/VvCard/index.ts +2 -2
  132. package/src/components/VvCheckbox/VvCheckbox.vue +185 -180
  133. package/src/components/VvCheckbox/index.ts +44 -44
  134. package/src/components/VvCheckboxGroup/VvCheckboxGroup.vue +88 -86
  135. package/src/components/VvCombobox/VvCombobox.vue +633 -623
  136. package/src/components/VvCombobox/index.ts +166 -166
  137. package/src/components/VvDialog/VvDialog.vue +131 -129
  138. package/src/components/VvDialog/index.ts +35 -35
  139. package/src/components/VvDropdown/VvDropdown.vue +464 -452
  140. package/src/components/VvDropdown/VvDropdownAction.vue +37 -39
  141. package/src/components/VvDropdown/VvDropdownItem.vue +29 -28
  142. package/src/components/VvDropdown/VvDropdownOptgroup.vue +13 -12
  143. package/src/components/VvDropdown/VvDropdownOption.vue +47 -47
  144. package/src/components/VvDropdown/index.ts +53 -53
  145. package/src/components/VvIcon/README.md +1 -1
  146. package/src/components/VvIcon/VvIcon.vue +133 -133
  147. package/src/components/VvIcon/index.ts +77 -77
  148. package/src/components/VvInputFile/VvInputFile.vue +367 -363
  149. package/src/components/VvInputFile/index.ts +125 -125
  150. package/src/components/VvInputText/VvInputClearAction.ts +50 -50
  151. package/src/components/VvInputText/VvInputPasswordAction.ts +65 -65
  152. package/src/components/VvInputText/VvInputStepAction.ts +43 -43
  153. package/src/components/VvInputText/VvInputText.vue +636 -637
  154. package/src/components/VvInputText/VvInputTextActions.ts +86 -86
  155. package/src/components/VvInputText/index.ts +198 -198
  156. package/src/components/VvNav/VvNav.vue +40 -33
  157. package/src/components/VvNav/VvNavItem.vue +12 -12
  158. package/src/components/VvNav/VvNavSeparator.vue +6 -6
  159. package/src/components/VvNav/index.ts +2 -2
  160. package/src/components/VvProgress/VvProgress.vue +27 -26
  161. package/src/components/VvProgress/index.ts +28 -28
  162. package/src/components/VvRadio/VvRadio.vue +115 -112
  163. package/src/components/VvRadio/index.ts +27 -27
  164. package/src/components/VvRadioGroup/VvRadioGroup.vue +91 -89
  165. package/src/components/VvSelect/VvSelect.vue +241 -238
  166. package/src/components/VvSelect/index.ts +62 -62
  167. package/src/components/VvTab/VvTab.vue +79 -73
  168. package/src/components/VvTab/index.ts +12 -12
  169. package/src/components/VvTextarea/VvTextarea.vue +218 -216
  170. package/src/components/VvTextarea/index.ts +35 -35
  171. package/src/components/VvTooltip/VvTooltip.vue +22 -16
  172. package/src/components/VvTooltip/index.ts +12 -12
  173. package/src/components/common/HintSlot.ts +149 -150
  174. package/src/composables/alert/useAlert.ts +74 -74
  175. package/src/composables/alert/useInjectAlert.ts +1 -1
  176. package/src/composables/alert/useProvideAlert.ts +10 -10
  177. package/src/composables/dropdown/useInjectDropdown.ts +6 -6
  178. package/src/composables/dropdown/useProvideDropdown.ts +62 -62
  179. package/src/composables/group/useInjectedGroupState.ts +41 -41
  180. package/src/composables/group/useProvideGroupState.ts +1 -2
  181. package/src/composables/useBlurhash.ts +52 -60
  182. package/src/composables/useComponentFocus.ts +9 -9
  183. package/src/composables/useComponentIcon.ts +35 -35
  184. package/src/composables/useDebouncedInput.ts +25 -25
  185. package/src/composables/useDefaults.ts +77 -76
  186. package/src/composables/useModifiers.ts +29 -29
  187. package/src/composables/useOptions.ts +45 -43
  188. package/src/composables/usePersistence.ts +70 -72
  189. package/src/composables/useTextCount.ts +44 -44
  190. package/src/composables/useUniqueId.ts +3 -2
  191. package/src/composables/useVolver.ts +1 -1
  192. package/src/constants.ts +70 -70
  193. package/src/directives/v-contextmenu.ts +34 -34
  194. package/src/directives/v-tooltip.ts +17 -17
  195. package/src/index.ts +3 -3
  196. package/src/props/index.ts +453 -453
  197. package/src/resolvers/unplugin.ts +138 -138
  198. package/src/shims.d.ts +4 -5
  199. package/src/stories/Accordion/Accordion.settings.ts +49 -49
  200. package/src/stories/Accordion/Accordion.stories.ts +21 -21
  201. package/src/stories/Accordion/Accordion.test.ts +56 -54
  202. package/src/stories/Accordion/AccordionSlots.stories.ts +13 -13
  203. package/src/stories/AccordionGroup/AccordionGroup.settings.ts +69 -67
  204. package/src/stories/AccordionGroup/AccordionGroup.stories.ts +37 -37
  205. package/src/stories/AccordionGroup/AccordionGroup.test.ts +49 -47
  206. package/src/stories/AccordionGroup/AccordionGroupSlots.stories.ts +34 -34
  207. package/src/stories/Alert/Alert.settings.ts +115 -115
  208. package/src/stories/Alert/Alert.stories.ts +30 -30
  209. package/src/stories/Alert/Alert.test.ts +78 -78
  210. package/src/stories/Alert/AlertModifiers.stories.ts +45 -45
  211. package/src/stories/Alert/AlertSlots.stories.ts +35 -35
  212. package/src/stories/AlertGroup/AlertGroup.settings.ts +104 -104
  213. package/src/stories/AlertGroup/AlertGroup.stories.ts +25 -25
  214. package/src/stories/AlertGroup/AlertGroup.test.ts +67 -67
  215. package/src/stories/AlertGroup/AlertGroupPosition.stories.ts +68 -68
  216. package/src/stories/AlertGroup/AlertGroupSlots.stories.ts +23 -23
  217. package/src/stories/AlertGroup/AlertGroupWithComposable.stories.ts +57 -57
  218. package/src/stories/Avatar/Avatar.settings.ts +29 -29
  219. package/src/stories/Avatar/Avatar.stories.ts +23 -23
  220. package/src/stories/Avatar/Avatar.test.ts +22 -22
  221. package/src/stories/Avatar/AvatarBadge.stories.ts +15 -15
  222. package/src/stories/Avatar/AvatarModifiers.stories.ts +61 -61
  223. package/src/stories/Avatar/AvatarSlots.stories.ts +18 -18
  224. package/src/stories/AvatarGroup/AvatarGroup.settings.ts +53 -53
  225. package/src/stories/AvatarGroup/AvatarGroup.stories.ts +17 -17
  226. package/src/stories/AvatarGroup/AvatarGroup.test.ts +24 -24
  227. package/src/stories/AvatarGroup/AvatarGroupModifiers.stories.ts +15 -15
  228. package/src/stories/AvatarGroup/AvatarGroupSlotDefault.stories.ts +17 -17
  229. package/src/stories/Badge/Badge.settings.ts +20 -20
  230. package/src/stories/Badge/Badge.stories.ts +23 -23
  231. package/src/stories/Badge/Badge.test.ts +8 -8
  232. package/src/stories/Badge/BadgeSlots.stories.ts +10 -10
  233. package/src/stories/Blurhash/BlurhashComposable.stories.ts +77 -76
  234. package/src/stories/Breadcrumb/Breadcrumb.settings.ts +34 -34
  235. package/src/stories/Breadcrumb/Breadcrumb.stories.ts +22 -22
  236. package/src/stories/Breadcrumb/Breadcrumb.test.ts +44 -43
  237. package/src/stories/Breadcrumb/BreadcrumbSlots.stories.ts +17 -17
  238. package/src/stories/Button/Button.settings.ts +144 -144
  239. package/src/stories/Button/Button.stories.ts +18 -18
  240. package/src/stories/Button/Button.test.ts +41 -40
  241. package/src/stories/Button/ButtonIcon.stories.ts +42 -42
  242. package/src/stories/Button/ButtonLink.stories.ts +24 -24
  243. package/src/stories/Button/ButtonLoading.stories.ts +22 -22
  244. package/src/stories/Button/ButtonModifiers.stories.ts +91 -91
  245. package/src/stories/Button/ButtonSlots.stories.ts +47 -47
  246. package/src/stories/Button/ButtonState.stories.ts +23 -23
  247. package/src/stories/Button/ButtonToggle.stories.ts +30 -30
  248. package/src/stories/ButtonGroup/ButtonGroup.settings.ts +32 -32
  249. package/src/stories/ButtonGroup/ButtonGroup.stories.ts +19 -19
  250. package/src/stories/ButtonGroup/ButtonGroup.test.ts +23 -22
  251. package/src/stories/ButtonGroup/ButtonGroupModifiers.stories.ts +20 -20
  252. package/src/stories/ButtonGroup/ButtonGroupSlots.stories.ts +18 -18
  253. package/src/stories/ButtonGroup/ButtonGroupToggle.stories.ts +22 -22
  254. package/src/stories/Card/Card.settings.ts +48 -48
  255. package/src/stories/Card/Card.stories.ts +22 -22
  256. package/src/stories/Card/Card.test.ts +14 -14
  257. package/src/stories/Card/CardSlots.stories.ts +42 -42
  258. package/src/stories/Checkbox/Checkbox.settings.ts +35 -35
  259. package/src/stories/Checkbox/Checkbox.stories.ts +57 -57
  260. package/src/stories/Checkbox/Checkbox.test.ts +63 -62
  261. package/src/stories/Checkbox/CheckboxBinary.stories.ts +17 -17
  262. package/src/stories/Checkbox/CheckboxSlots.stories.ts +15 -15
  263. package/src/stories/CheckboxGroup/CheckboxGroup.settings.ts +9 -9
  264. package/src/stories/CheckboxGroup/CheckboxGroup.stories.ts +50 -50
  265. package/src/stories/CheckboxGroup/CheckboxGroup.test.ts +63 -63
  266. package/src/stories/CheckboxGroup/CheckboxGroupOptions.stories.ts +34 -34
  267. package/src/stories/CheckboxGroup/CheckboxGroupSlots.stories.ts +23 -23
  268. package/src/stories/Combobox/Combobox.settings.ts +390 -390
  269. package/src/stories/Combobox/Combobox.stories.ts +107 -107
  270. package/src/stories/Combobox/Combobox.test.ts +89 -87
  271. package/src/stories/Combobox/ComboboxIconPosition.stories.ts +24 -24
  272. package/src/stories/Combobox/ComboboxMultiple.stories.ts +22 -22
  273. package/src/stories/Combobox/ComboboxOptions.stories.ts +84 -84
  274. package/src/stories/Combobox/ComboboxSlots.stories.ts +55 -55
  275. package/src/stories/Dialog/Dialog.settings.ts +39 -39
  276. package/src/stories/Dialog/Dialog.stories.ts +28 -28
  277. package/src/stories/Dialog/Dialog.test.ts +49 -49
  278. package/src/stories/Dialog/DialogSlots.stories.ts +20 -20
  279. package/src/stories/Dropdown/Dropdown.settings.ts +62 -62
  280. package/src/stories/Dropdown/Dropdown.stories.ts +59 -59
  281. package/src/stories/Dropdown/Dropdown.test.ts +9 -9
  282. package/src/stories/Dropdown/DropdownContextmenuDirective.stories.ts +16 -16
  283. package/src/stories/Dropdown/DropdownMultilevel.stories.ts +18 -18
  284. package/src/stories/Dropdown/DropdownSlots.stories.ts +49 -49
  285. package/src/stories/Icon/Icon.settings.ts +64 -64
  286. package/src/stories/Icon/Icon.stories.ts +28 -28
  287. package/src/stories/Icon/IconsCollection.stories.ts +22 -22
  288. package/src/stories/InputFile/InputFile.settings.ts +29 -29
  289. package/src/stories/InputFile/InputFile.stories.ts +54 -54
  290. package/src/stories/InputFile/InputFileDropArea.stories.ts +34 -34
  291. package/src/stories/InputFile/InputFileIconPosition.stories.ts +24 -24
  292. package/src/stories/InputFile/InputFileSlots.stories.ts +17 -17
  293. package/src/stories/InputText/InputText.settings.ts +245 -246
  294. package/src/stories/InputText/InputText.stories.ts +67 -67
  295. package/src/stories/InputText/InputText.test.ts +118 -117
  296. package/src/stories/InputText/InputTextIconPosition.stories.ts +24 -24
  297. package/src/stories/InputText/InputTextLength.stories.ts +33 -33
  298. package/src/stories/InputText/InputTextMask.stories.ts +91 -91
  299. package/src/stories/InputText/InputTextMinMax.stories.ts +29 -29
  300. package/src/stories/InputText/InputTextSlots.stories.ts +20 -20
  301. package/src/stories/InputText/InputTextType.stories.ts +70 -70
  302. package/src/stories/Nav/Nav.settings.ts +25 -25
  303. package/src/stories/Nav/Nav.stories.ts +17 -17
  304. package/src/stories/Nav/Nav.test.ts +10 -10
  305. package/src/stories/Nav/NavModifiers.stories.ts +25 -25
  306. package/src/stories/Progress/Progress.settings.ts +23 -23
  307. package/src/stories/Progress/Progress.stories.ts +23 -23
  308. package/src/stories/Progress/Progress.test.ts +4 -4
  309. package/src/stories/Radio/Radio.settings.ts +9 -9
  310. package/src/stories/Radio/Radio.stories.ts +47 -47
  311. package/src/stories/Radio/Radio.test.ts +54 -53
  312. package/src/stories/Radio/RadioSlots.stories.ts +15 -15
  313. package/src/stories/RadioGroup/RadioGroup.settings.ts +9 -9
  314. package/src/stories/RadioGroup/RadioGroup.stories.ts +50 -50
  315. package/src/stories/RadioGroup/RadioGroup.test.ts +63 -63
  316. package/src/stories/RadioGroup/RadioGroupOptions.stories.ts +34 -34
  317. package/src/stories/RadioGroup/RadioGroupSlots.stories.ts +23 -23
  318. package/src/stories/Select/Select.settings.ts +70 -70
  319. package/src/stories/Select/Select.stories.ts +66 -66
  320. package/src/stories/Select/Select.test.ts +65 -64
  321. package/src/stories/Select/SelectIconPosition.stories.ts +24 -24
  322. package/src/stories/Select/SelectOptions.stories.ts +54 -54
  323. package/src/stories/Select/SelectSlots.stories.ts +20 -20
  324. package/src/stories/Tab/Tab.settings.ts +32 -32
  325. package/src/stories/Tab/Tab.stories.ts +17 -17
  326. package/src/stories/Tab/Tab.test.ts +17 -17
  327. package/src/stories/Textarea/Textarea.settings.ts +78 -79
  328. package/src/stories/Textarea/Textarea.stories.ts +63 -63
  329. package/src/stories/Textarea/Textarea.test.ts +70 -69
  330. package/src/stories/Textarea/TextareaLength.stories.ts +33 -33
  331. package/src/stories/Textarea/TextareaSlots.stories.ts +20 -20
  332. package/src/stories/Textarea/TextareatIconPosition.stories.ts +24 -24
  333. package/src/stories/Tooltip/Tooltip.settings.ts +16 -16
  334. package/src/stories/Tooltip/Tooltip.stories.ts +18 -18
  335. package/src/stories/Tooltip/Tooltip.test.ts +53 -52
  336. package/src/stories/Tooltip/TooltipDirective.stories.ts +37 -37
  337. package/src/stories/argTypes.ts +484 -485
  338. package/src/test/expect.ts +71 -74
  339. package/src/test/options.ts +17 -16
  340. package/src/test/sleep.ts +3 -2
  341. package/src/test/types.d.ts +11 -11
  342. package/src/types/alert.ts +18 -18
  343. package/src/types/blurhash.ts +18 -18
  344. package/src/types/generic.ts +1 -2
  345. package/src/types/group.ts +21 -21
  346. package/src/types/input-file.ts +17 -17
  347. package/src/types/nav.ts +13 -13
  348. package/src/utils/ObjectUtilities.ts +192 -177
@@ -1,395 +1,399 @@
1
- <script lang="ts">
2
- export default {
3
- name: 'VvInputFile',
4
- }
5
- </script>
6
-
7
1
  <script setup lang="ts">
8
- import { useVModel } from '@vueuse/core'
9
- import type { UploadedFile } from '../../types'
10
- import { computed, onBeforeUnmount, ref } from 'vue'
11
- import VvButton from '../VvButton/VvButton.vue'
12
- import VvIcon from '../VvIcon/VvIcon.vue'
13
- import HintSlotFactory from '../common/HintSlot'
14
- import { VvInputFileProps, type VvInputFileEvents } from '.'
15
- import Sortable from 'vuedraggable'
2
+ import { useVModel } from '@vueuse/core'
3
+ import { computed, onBeforeUnmount, ref } from 'vue'
4
+ import Sortable from 'vuedraggable'
5
+ import type { UploadedFile } from '../../types'
6
+ import VvButton from '../VvButton/VvButton.vue'
7
+ import VvIcon from '../VvIcon/VvIcon.vue'
8
+ import HintSlotFactory from '../common/HintSlot'
9
+ import { VvInputFileProps, type VvInputFileEvents } from '.'
10
+
11
+ // props, emit, slots and attrs
12
+ const props = defineProps(VvInputFileProps)
16
13
 
17
- // props, emit, slots and attrs
18
- const props = defineProps(VvInputFileProps)
19
- const emit = defineEmits<VvInputFileEvents>()
20
- const slots = useSlots()
14
+ const emit = defineEmits<VvInputFileEvents>()
21
15
 
22
- // props merged with volver defaults (now only for labels)
23
- const propsDefaults = useDefaults<typeof VvInputFileProps>(
24
- 'VvInputFile',
25
- VvInputFileProps,
26
- props,
27
- )
28
- const { modifiers, id, readonly, icon, iconPosition, iconDownload } =
29
- toRefs(props)
30
- const hasId = useUniqueId(id)
31
- const hasHintId = computed(() => `${hasId.value}-hint`)
16
+ const slots = useSlots()
32
17
 
33
- const hasProgress = computed(() => {
34
- if (!props.progress) {
35
- return false
36
- }
37
- const progress =
38
- typeof props.progress === 'string'
39
- ? parseInt(props.progress)
40
- : props.progress
41
- return progress > 0 && progress < 100
42
- })
18
+ // props merged with volver defaults (now only for labels)
19
+ const propsDefaults = useDefaults<typeof VvInputFileProps>(
20
+ 'VvInputFile',
21
+ VvInputFileProps,
22
+ props,
23
+ )
24
+ const { modifiers, id, readonly, icon, iconPosition, iconDownload }
25
+ = toRefs(props)
26
+ const hasId = useUniqueId(id)
27
+ const hasHintId = computed(() => `${hasId.value}-hint`)
43
28
 
44
- const { hasIconBefore, hasIconAfter } = useComponentIcon(icon, iconPosition)
45
- const { hasIcon: hasIconDownload } = useComponentIcon(iconDownload)
29
+ const hasProgress = computed(() => {
30
+ if (!props.progress) {
31
+ return false
32
+ }
33
+ const progress
34
+ = typeof props.progress === 'string'
35
+ ? Number.parseInt(props.progress)
36
+ : props.progress
37
+ return progress > 0 && progress < 100
38
+ })
46
39
 
47
- // styles
48
- const bemCssClasses = useModifiers(
49
- 'vv-input-file',
50
- modifiers,
51
- computed(() => ({
52
- dragging: isDragging.value,
53
- loading: props.loading && !hasProgress.value,
54
- valid: props.valid === true,
55
- invalid: props.invalid === true,
56
- 'icon-before': !!hasIconBefore.value,
57
- 'icon-after': !!hasIconAfter.value,
58
- 'drop-area': hasDropArea.value,
59
- })),
60
- )
40
+ const { hasIconBefore, hasIconAfter } = useComponentIcon(icon, iconPosition)
41
+ const { hasIcon: hasIconDownload } = useComponentIcon(iconDownload)
61
42
 
62
- const {
63
- HintSlot,
64
- hasHintLabelOrSlot,
65
- hasInvalidLabelOrSlot,
66
- hintSlotScope,
67
- } = HintSlotFactory(propsDefaults, slots)
43
+ // styles
44
+ const bemCssClasses = useModifiers(
45
+ 'vv-input-file',
46
+ modifiers,
47
+ computed(() => ({
48
+ 'dragging': isDragging.value,
49
+ 'loading': props.loading && !hasProgress.value,
50
+ 'valid': props.valid === true,
51
+ 'invalid': props.invalid === true,
52
+ 'icon-before': !!hasIconBefore.value,
53
+ 'icon-after': !!hasIconAfter.value,
54
+ 'drop-area': hasDropArea.value,
55
+ })),
56
+ )
68
57
 
69
- const localModelValue = useVModel(props, 'modelValue', emit)
70
- const files = computed({
71
- get: () => {
72
- if (
73
- !localModelValue.value ||
74
- (!Array.isArray(localModelValue.value) &&
75
- !(localModelValue.value as File)?.name)
76
- ) {
77
- return []
78
- }
79
- return Array.isArray(localModelValue.value)
80
- ? localModelValue.value
81
- : [localModelValue.value]
82
- },
83
- set: (value) => {
84
- if (isMultiple.value) {
85
- localModelValue.value = value
86
- return
87
- }
88
- localModelValue.value = value?.[0]
89
- },
90
- })
58
+ const {
59
+ HintSlot,
60
+ hasHintLabelOrSlot,
61
+ hasInvalidLabelOrSlot,
62
+ hintSlotScope,
63
+ } = HintSlotFactory(propsDefaults, slots)
91
64
 
92
- const hasMax = computed(() => {
93
- return typeof props.max === 'string' ? parseInt(props.max) : props.max
94
- })
65
+ const localModelValue = useVModel(props, 'modelValue', emit)
66
+ const files = computed({
67
+ get: () => {
68
+ if (
69
+ !localModelValue.value
70
+ || (!Array.isArray(localModelValue.value)
71
+ && !(localModelValue.value as File)?.name)
72
+ ) {
73
+ return []
74
+ }
75
+ return Array.isArray(localModelValue.value)
76
+ ? localModelValue.value
77
+ : [localModelValue.value]
78
+ },
79
+ set: (value) => {
80
+ if (isMultiple.value) {
81
+ localModelValue.value = value
82
+ return
83
+ }
84
+ localModelValue.value = value?.[0]
85
+ },
86
+ })
95
87
 
96
- const hasDropArea = computed(() => {
97
- return props.dropArea && !readonly.value
98
- })
88
+ const hasMax = computed(() => {
89
+ return typeof props.max === 'string' ? Number.parseInt(props.max) : props.max
90
+ })
99
91
 
100
- const isMultiple = computed(() => {
101
- if (!props.multiple) {
102
- return false
103
- }
104
- if (!hasMax.value) {
105
- return true
106
- }
107
- return hasMax.value - files.value.length > 1
108
- })
92
+ const hasDropArea = computed(() => {
93
+ return props.dropArea && !readonly.value
94
+ })
109
95
 
110
- const isDragging = ref(false)
96
+ const isMultiple = computed(() => {
97
+ if (!props.multiple) {
98
+ return false
99
+ }
100
+ if (!hasMax.value) {
101
+ return true
102
+ }
103
+ return hasMax.value - files.value.length > 1
104
+ })
111
105
 
112
- const inputEl = ref<HTMLInputElement>()
113
- const onDragenter = () => {
114
- isDragging.value = true
115
- }
106
+ const isDragging = ref(false)
116
107
 
117
- const onDragleave = () => {
118
- isDragging.value = false
119
- }
108
+ const inputEl = ref<HTMLInputElement>()
109
+ function onDragenter() {
110
+ isDragging.value = true
111
+ }
120
112
 
121
- const onDrop = (event: DragEvent) => {
122
- if (!event.dataTransfer?.files) {
123
- return
124
- }
125
- isDragging.value = false
126
- addFiles(event.dataTransfer?.files)
127
- }
113
+ function onDragleave() {
114
+ isDragging.value = false
115
+ }
128
116
 
129
- const onChange = () => {
130
- if (!inputEl.value?.files) {
131
- return
132
- }
133
- addFiles(inputEl.value.files)
134
- inputEl.value.value = ''
135
- }
117
+ function onDrop(event: DragEvent) {
118
+ if (!event.dataTransfer?.files) {
119
+ return
120
+ }
121
+ isDragging.value = false
122
+ addFiles(event.dataTransfer?.files)
123
+ }
136
124
 
137
- const addFiles = (uploadedFiles: FileList) => {
138
- if (!props.multiple) {
139
- if (Array.isArray(localModelValue.value)) {
140
- localModelValue.value = [...uploadedFiles]
141
- return
142
- }
143
- localModelValue.value = uploadedFiles[0]
144
- return
145
- }
146
- let toReturn: (File | UploadedFile)[] = []
147
- if (!Array.isArray(localModelValue.value) && localModelValue.value) {
148
- toReturn = [localModelValue.value]
149
- } else {
150
- toReturn =
151
- localModelValue.value && Array.isArray(localModelValue.value)
152
- ? [...localModelValue.value]
153
- : toReturn
154
- }
155
- for (const file of uploadedFiles) {
156
- if (hasMax.value && toReturn.length >= hasMax.value) {
157
- break
158
- }
159
- toReturn.push(file)
160
- }
161
- localModelValue.value = toReturn
162
- selectedFileIndex.value = toReturn.length - 1
163
- }
125
+ function onChange() {
126
+ if (!inputEl.value?.files) {
127
+ return
128
+ }
129
+ addFiles(inputEl.value.files)
130
+ inputEl.value.value = ''
131
+ }
164
132
 
165
- const onClickDropArea = () => {
166
- if (!inputEl.value) {
167
- return
168
- }
169
- if (!readonly.value) {
170
- inputEl.value.click()
171
- }
172
- }
133
+ function addFiles(uploadedFiles: FileList) {
134
+ if (!props.multiple) {
135
+ if (Array.isArray(localModelValue.value)) {
136
+ localModelValue.value = [...uploadedFiles]
137
+ return
138
+ }
139
+ localModelValue.value = uploadedFiles[0]
140
+ return
141
+ }
142
+ let toReturn: (File | UploadedFile)[] = []
143
+ if (!Array.isArray(localModelValue.value) && localModelValue.value) {
144
+ toReturn = [localModelValue.value]
145
+ }
146
+ else {
147
+ toReturn
148
+ = localModelValue.value && Array.isArray(localModelValue.value)
149
+ ? [...localModelValue.value]
150
+ : toReturn
151
+ }
152
+ for (const file of uploadedFiles) {
153
+ if (hasMax.value && toReturn.length >= hasMax.value) {
154
+ break
155
+ }
156
+ toReturn.push(file)
157
+ }
158
+ localModelValue.value = toReturn
159
+ selectedFileIndex.value = toReturn.length - 1
160
+ }
173
161
 
174
- const onClickRemoveFile = (index: number) => {
175
- if (!Array.isArray(localModelValue.value)) {
176
- localModelValue.value = undefined
177
- return
178
- }
179
- if (selectedFileIndex.value === index) {
180
- selectedFileIndex.value = 0
181
- }
182
- const toReturn = [...localModelValue.value]
183
- toReturn.splice(index, 1)
184
- localModelValue.value = toReturn
185
- }
162
+ function onClickDropArea() {
163
+ if (!inputEl.value) {
164
+ return
165
+ }
166
+ if (!readonly.value) {
167
+ inputEl.value.click()
168
+ }
169
+ }
186
170
 
187
- const selectedFileIndex = ref(0)
188
- const PREVIEW_MIME_TYPES = ['image/jpeg', 'image/png']
189
- const previewSrc = computed(() => {
190
- if (files.value.length === 0) {
191
- return
192
- }
193
- if (!files.value[selectedFileIndex.value]) {
194
- return undefined
195
- }
196
- if (files.value[selectedFileIndex.value] instanceof File) {
197
- const currentFile = files.value[selectedFileIndex.value] as File
198
- if (!PREVIEW_MIME_TYPES.includes(currentFile.type)) {
199
- return undefined
200
- }
201
- return URL.createObjectURL(currentFile)
202
- }
203
- const currentFile = files.value[selectedFileIndex.value] as UploadedFile
204
- if (currentFile.thumbnailUrl) {
205
- return currentFile.thumbnailUrl
206
- }
207
- if (!PREVIEW_MIME_TYPES.includes(currentFile.type)) {
208
- return undefined
209
- }
210
- return currentFile.url
211
- })
171
+ function onClickRemoveFile(index: number) {
172
+ if (!Array.isArray(localModelValue.value)) {
173
+ localModelValue.value = undefined
174
+ return
175
+ }
176
+ if (selectedFileIndex.value === index) {
177
+ selectedFileIndex.value = 0
178
+ }
179
+ const toReturn = [...localModelValue.value]
180
+ toReturn.splice(index, 1)
181
+ localModelValue.value = toReturn
182
+ }
212
183
 
213
- watch(previewSrc, (_newValue, oldValue) => {
214
- if (oldValue) {
215
- URL.revokeObjectURL(oldValue)
216
- }
217
- })
184
+ const selectedFileIndex = ref(0)
185
+ const PREVIEW_MIME_TYPES = ['image/jpeg', 'image/png']
186
+ const previewSrc = computed(() => {
187
+ if (files.value.length === 0) {
188
+ return
189
+ }
190
+ if (!files.value[selectedFileIndex.value]) {
191
+ return undefined
192
+ }
193
+ if (files.value[selectedFileIndex.value] instanceof File) {
194
+ const currentFile = files.value[selectedFileIndex.value] as File
195
+ if (!PREVIEW_MIME_TYPES.includes(currentFile.type)) {
196
+ return undefined
197
+ }
198
+ return URL.createObjectURL(currentFile)
199
+ }
200
+ const currentFile = files.value[selectedFileIndex.value] as UploadedFile
201
+ if (currentFile.thumbnailUrl) {
202
+ return currentFile.thumbnailUrl
203
+ }
204
+ if (!PREVIEW_MIME_TYPES.includes(currentFile.type)) {
205
+ return undefined
206
+ }
207
+ return currentFile.url
208
+ })
218
209
 
219
- onBeforeUnmount(() => {
220
- if (previewSrc.value) {
221
- URL.revokeObjectURL(previewSrc.value)
222
- }
223
- })
210
+ watch(previewSrc, (_newValue, oldValue) => {
211
+ if (oldValue) {
212
+ URL.revokeObjectURL(oldValue)
213
+ }
214
+ })
224
215
 
225
- const sizeInKiB = (size?: number) => {
226
- if (!size) {
227
- return
228
- }
229
- return Math.floor(size / 1024)
230
- }
216
+ onBeforeUnmount(() => {
217
+ if (previewSrc.value) {
218
+ URL.revokeObjectURL(previewSrc.value)
219
+ }
220
+ })
231
221
 
232
- const onClickDownloadFile = (file: File | UploadedFile) => {
233
- const link = document.createElement('a')
234
- if (file instanceof File) {
235
- link.href = URL.createObjectURL(file)
236
- } else if (file.url) {
237
- link.href = file.url
238
- }
239
- link.setAttribute('download', file.name)
240
- document.body.appendChild(link)
241
- link.click()
242
- document.body.removeChild(link)
243
- URL.revokeObjectURL(link.href)
244
- }
222
+ function sizeInKiB(size?: number) {
223
+ if (!size) {
224
+ return
225
+ }
226
+ return Math.floor(size / 1024)
227
+ }
245
228
 
246
- const onClickSelectFile = (index: number) => {
247
- selectedFileIndex.value = index
248
- }
229
+ function onClickDownloadFile(file: File | UploadedFile) {
230
+ const link = document.createElement('a')
231
+ if (file instanceof File) {
232
+ link.href = URL.createObjectURL(file)
233
+ }
234
+ else if (file.url) {
235
+ link.href = file.url
236
+ }
237
+ link.setAttribute('download', file.name)
238
+ document.body.appendChild(link)
239
+ link.click()
240
+ document.body.removeChild(link)
241
+ URL.revokeObjectURL(link.href)
242
+ }
249
243
 
250
- const dropdAreaActionLabel = computed(() => {
251
- if (files.value.length === 0 || isMultiple.value) {
252
- return props.labelAdd
253
- }
254
- return props.labelReplace
255
- })
244
+ function onClickSelectFile(index: number) {
245
+ selectedFileIndex.value = index
246
+ }
256
247
 
257
- const dropAreaActionIcon = computed(() => {
258
- if (files.value.length === 0 || isMultiple.value) {
259
- return props.iconAdd
260
- }
261
- return props.iconReplace
262
- })
248
+ const dropdAreaActionLabel = computed(() => {
249
+ if (files.value.length === 0 || isMultiple.value) {
250
+ return props.labelAdd
251
+ }
252
+ return props.labelReplace
253
+ })
263
254
 
264
- const onSortEnd = ({ newIndex }: { newIndex: number | null }) => {
265
- if (newIndex !== null) {
266
- selectedFileIndex.value = newIndex
267
- }
268
- }
255
+ const dropAreaActionIcon = computed(() => {
256
+ if (files.value.length === 0 || isMultiple.value) {
257
+ return props.iconAdd
258
+ }
259
+ return props.iconReplace
260
+ })
261
+
262
+ function onSortEnd({ newIndex }: { newIndex: number | null }) {
263
+ if (newIndex !== null) {
264
+ selectedFileIndex.value = newIndex
265
+ }
266
+ }
267
+ </script>
268
+
269
+ <script lang="ts">
270
+ export default {
271
+ name: 'VvInputFile',
272
+ }
269
273
  </script>
270
274
 
271
275
  <template>
272
- <div :class="bemCssClasses">
273
- <label v-if="label" :for="hasId">
274
- {{ label }}
275
- </label>
276
- <div
277
- v-if="hasDropArea"
278
- class="vv-input-file__drop-area"
279
- @dragenter.prevent.stop="onDragenter"
280
- @dragleave.prevent.stop="onDragleave"
281
- @drop.prevent.stop="onDrop"
282
- @dragover.prevent.stop
283
- @click.stop="onClickDropArea"
284
- >
285
- <slot name="drop-area">
286
- <picture class="vv-input-file__preview">
287
- <img
288
- v-if="previewSrc"
289
- :src="previewSrc"
290
- :alt="files[selectedFileIndex].name"
291
- />
292
- </picture>
293
- <VvButton
294
- v-if="!readonly"
295
- modifiers="action"
296
- :label="!previewSrc ? dropdAreaActionLabel : undefined"
297
- :title="previewSrc ? dropdAreaActionLabel : undefined"
298
- :class="{
299
- 'vv-input-file__drop-area-action': previewSrc,
300
- }"
301
- :icon="dropAreaActionIcon"
302
- @click.stop="onClickDropArea"
303
- />
304
- </slot>
305
- </div>
306
- <div class="vv-input-file__wrapper">
307
- <VvIcon v-if="hasIconBefore" v-bind="hasIconBefore" />
308
- <input
309
- :id="hasId"
310
- ref="inputEl"
311
- type="file"
312
- :readonly="readonly"
313
- :placeholder="placeholder"
314
- :aria-describedby="hasHintLabelOrSlot ? hasHintId : undefined"
315
- :aria-invalid="invalid"
316
- :aria-errormessage="
317
- hasInvalidLabelOrSlot ? hasHintId : undefined
318
- "
319
- :multiple="isMultiple"
320
- :accept="accept"
321
- :capture="capture"
322
- :name="name"
323
- @change="onChange"
324
- />
325
- <progress
326
- v-if="hasProgress"
327
- class="vv-input-file__progress"
328
- :value="progress"
329
- max="100"
330
- >
331
- {{ progress }}%
332
- </progress>
333
- <VvIcon v-if="hasIconAfter" v-bind="hasIconAfter" />
334
- </div>
335
- <Sortable
336
- v-model="files"
337
- tag="ul"
338
- class="vv-input-file__list"
339
- item-key="name"
340
- :move="() => sortable"
341
- @end="onSortEnd"
342
- >
343
- <template #item="{ element: file, index }">
344
- <li
345
- class="vv-input-file__item"
346
- :class="{
347
- active:
348
- index === selectedFileIndex &&
349
- hasDropArea &&
350
- files.length > 1,
351
- 'cursor-move': sortable,
352
- }"
353
- @click.stop="onClickSelectFile(index)"
354
- >
355
- <button
356
- v-if="hasIconDownload"
357
- type="button"
358
- class="vv-input-file__item-action"
359
- :title="labelDownload"
360
- @click.stop="onClickDownloadFile(file)"
361
- >
362
- <VvIcon v-bind="hasIconDownload" />
363
- </button>
364
- <div class="vv-input-file__item-name">
365
- {{ file.name }}
366
- </div>
367
- <small class="vv-input-file__item-info">
368
- {{ sizeInKiB(file.size) }} KB
369
- </small>
370
- <button
371
- v-if="!readonly"
372
- type="button"
373
- class="vv-input-file__item-remove"
374
- :title="labelRemove"
375
- @click.stop="onClickRemoveFile(index)"
376
- />
377
- </li>
378
- </template>
379
- </Sortable>
380
- <HintSlot :id="hasHintId" class="vv-input-file__hint">
381
- <template v-if="$slots.hint" #hint>
382
- <slot name="hint" v-bind="hintSlotScope" />
383
- </template>
384
- <template v-if="$slots.loading" #loading>
385
- <slot name="loading" v-bind="hintSlotScope" />
386
- </template>
387
- <template v-if="$slots.valid" #valid>
388
- <slot name="valid" v-bind="hintSlotScope" />
389
- </template>
390
- <template v-if="$slots.invalid" #invalid>
391
- <slot name="invalid" v-bind="hintSlotScope" />
392
- </template>
393
- </HintSlot>
394
- </div>
276
+ <div :class="bemCssClasses">
277
+ <label v-if="label" :for="hasId">
278
+ {{ label }}
279
+ </label>
280
+ <div
281
+ v-if="hasDropArea"
282
+ class="vv-input-file__drop-area"
283
+ @dragenter.prevent.stop="onDragenter"
284
+ @dragleave.prevent.stop="onDragleave"
285
+ @drop.prevent.stop="onDrop"
286
+ @dragover.prevent.stop
287
+ @click.stop="onClickDropArea"
288
+ >
289
+ <slot name="drop-area">
290
+ <picture class="vv-input-file__preview">
291
+ <img
292
+ v-if="previewSrc"
293
+ :src="previewSrc"
294
+ :alt="files[selectedFileIndex].name"
295
+ >
296
+ </picture>
297
+ <VvButton
298
+ v-if="!readonly"
299
+ modifiers="action"
300
+ :label="!previewSrc ? dropdAreaActionLabel : undefined"
301
+ :title="previewSrc ? dropdAreaActionLabel : undefined"
302
+ :class="{
303
+ 'vv-input-file__drop-area-action': previewSrc,
304
+ }"
305
+ :icon="dropAreaActionIcon"
306
+ @click.stop="onClickDropArea"
307
+ />
308
+ </slot>
309
+ </div>
310
+ <div class="vv-input-file__wrapper">
311
+ <VvIcon v-if="hasIconBefore" v-bind="hasIconBefore" />
312
+ <input
313
+ :id="hasId"
314
+ ref="inputEl"
315
+ type="file"
316
+ :readonly="readonly"
317
+ :placeholder="placeholder"
318
+ :aria-describedby="hasHintLabelOrSlot ? hasHintId : undefined"
319
+ :aria-invalid="invalid"
320
+ :aria-errormessage="
321
+ hasInvalidLabelOrSlot ? hasHintId : undefined
322
+ "
323
+ :multiple="isMultiple"
324
+ :accept="accept"
325
+ :capture="capture"
326
+ :name="name"
327
+ @change="onChange"
328
+ >
329
+ <progress
330
+ v-if="hasProgress"
331
+ class="vv-input-file__progress"
332
+ :value="progress"
333
+ max="100"
334
+ >
335
+ {{ progress }}%
336
+ </progress>
337
+ <VvIcon v-if="hasIconAfter" v-bind="hasIconAfter" />
338
+ </div>
339
+ <Sortable
340
+ v-model="files"
341
+ tag="ul"
342
+ class="vv-input-file__list"
343
+ item-key="name"
344
+ :move="() => sortable"
345
+ @end="onSortEnd"
346
+ >
347
+ <template #item="{ element: file, index }">
348
+ <li
349
+ class="vv-input-file__item"
350
+ :class="{
351
+ 'active':
352
+ index === selectedFileIndex
353
+ && hasDropArea
354
+ && files.length > 1,
355
+ 'cursor-move': sortable,
356
+ }"
357
+ @click.stop="onClickSelectFile(index)"
358
+ >
359
+ <button
360
+ v-if="hasIconDownload"
361
+ type="button"
362
+ class="vv-input-file__item-action"
363
+ :title="labelDownload"
364
+ @click.stop="onClickDownloadFile(file)"
365
+ >
366
+ <VvIcon v-bind="hasIconDownload" />
367
+ </button>
368
+ <div class="vv-input-file__item-name">
369
+ {{ file.name }}
370
+ </div>
371
+ <small class="vv-input-file__item-info">
372
+ {{ sizeInKiB(file.size) }} KB
373
+ </small>
374
+ <button
375
+ v-if="!readonly"
376
+ type="button"
377
+ class="vv-input-file__item-remove"
378
+ :title="labelRemove"
379
+ @click.stop="onClickRemoveFile(index)"
380
+ />
381
+ </li>
382
+ </template>
383
+ </Sortable>
384
+ <HintSlot :id="hasHintId" class="vv-input-file__hint">
385
+ <template v-if="$slots.hint" #hint>
386
+ <slot name="hint" v-bind="hintSlotScope" />
387
+ </template>
388
+ <template v-if="$slots.loading" #loading>
389
+ <slot name="loading" v-bind="hintSlotScope" />
390
+ </template>
391
+ <template v-if="$slots.valid" #valid>
392
+ <slot name="valid" v-bind="hintSlotScope" />
393
+ </template>
394
+ <template v-if="$slots.invalid" #invalid>
395
+ <slot name="invalid" v-bind="hintSlotScope" />
396
+ </template>
397
+ </HintSlot>
398
+ </div>
395
399
  </template>