@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,103 +1,90 @@
1
- import type { PropType } from 'vue'
2
1
  import type { IconifyIconOnLoad, IconifyRenderMode } from '@iconify/vue'
3
2
 
3
+ export const ACTION_ICONS = {
4
+ showPassword: 'eye-on',
5
+ hidePassword: 'eye-off',
6
+ showDatePicker: 'calendar',
7
+ showTimePicker: 'time',
8
+ showColorPicker: 'color',
9
+ clear: 'close',
10
+ add: 'add',
11
+ remove: 'trash',
12
+ edit: 'edit',
13
+ download: 'download',
14
+ } as const
15
+
4
16
  export enum IconPrefix {
5
- simple = 'simple',
6
- normal = 'normal',
7
- detailed = 'detailed',
17
+ simple = 'simple',
18
+ normal = 'normal',
19
+ detailed = 'detailed',
20
+ }
21
+
22
+ export type VvIconProps = {
23
+ /**
24
+ * Icon name
25
+ * Can be the full composition of iconify name "@{provider}:{prefix}:{name}" or "{prefix}:{name}" or "{name}"
26
+ * https://docs.iconify.design/api/providers.html#provider-in-icon-name
27
+ */
28
+ name: string
29
+ color?: string
30
+ width?: string | number
31
+ height?: string | number
32
+ /**
33
+ * If custom collection is not added with "addCollection" DS class method, this prop could not be used
34
+ * Icon provider: https://docs.iconify.design/api/providers.html#provider-in-icon-name
35
+ */
36
+ provider?: string
37
+ /**
38
+ * @default 'normal'
39
+ * The name of icon set.
40
+ * Icon default options prefix: simple | normal | detailed
41
+ */
42
+ prefix?: IconPrefix | string
43
+ /**
44
+ * Url remote SVG icon
45
+ */
46
+ src?: string
47
+ horizontalFlip?: boolean
48
+ verticalFlip?: boolean
49
+ /**
50
+ * String alternative to "horizontalFlip" and "verticalFlip".
51
+ * Example: https://docs.iconify.design/icon-components/vue/transform.html
52
+ */
53
+ flip?: string
54
+ /**
55
+ * Icon render mode
56
+ * 'style' = 'bg' or 'mask', depending on icon content
57
+ * 'bg' = span with style using `background`
58
+ * 'mask' = span with style using `mask`
59
+ * 'svg' = svg
60
+ * Iconify doc: https://docs.iconify.design/iconify-icon/modes.html
61
+ */
62
+ mode?: IconifyRenderMode
63
+ /**
64
+ * Toggles inline or block mode
65
+ * Example https://docs.iconify.design/icon-components/vue/inline.html
66
+ */
67
+ inline?: boolean
68
+ /**
69
+ * rotates icon
70
+ * Example https://docs.iconify.design/icon-components/vue/transform.html
71
+ */
72
+ rotate?: number | string
73
+ /**
74
+ * A callback that is called when icon data has been loaded
75
+ */
76
+ onLoad?: IconifyIconOnLoad
77
+ /**
78
+ * SVG icon string
79
+ */
80
+ svg?: string
81
+ /**
82
+ * Icon modifiers: vv-icon css helper classes, value/s are concatened with prefix 'vv-icon--'
83
+ * @values string | string[]
84
+ */
85
+ modifiers?: string | string[]
8
86
  }
9
87
 
10
- export const VvIconProps = {
11
- /**
12
- * Color
13
- */
14
- color: String,
15
- /**
16
- * Width
17
- */
18
- width: {
19
- type: [String, Number],
20
- },
21
- /**
22
- * Height
23
- */
24
- height: {
25
- type: [String, Number],
26
- },
27
- /**
28
- * Icon name
29
- * Can be the full composition of iconify name "@{provider}:{prefix}:{name}" or "{prefix}:{name}" or "{name}"
30
- * https://docs.iconify.design/api/providers.html#provider-in-icon-name
31
- */
32
- name: {
33
- type: String,
34
- required: true,
35
- },
36
- /**
37
- * By default 'vv'
38
- * If custom collection is not added with "addCollection" DS class method, this prop could not be used
39
- * Icon provider: https://docs.iconify.design/api/providers.html#provider-in-icon-name
40
- */
41
- provider: {
42
- type: String,
43
- },
44
- /**
45
- * The name of icon set.
46
- * Icon default options prefix: simple | normal | detailed
47
- */
48
- prefix: {
49
- type: String as PropType<`${IconPrefix}` | string>,
50
- default: 'normal',
51
- },
52
- /**
53
- * Url remote SVG icon
54
- */
55
- src: String,
56
- /**
57
- * Horizontal flip
58
- */
59
- horizontalFlip: Boolean,
60
- /**
61
- * Vertical flip
62
- */
63
- verticalFlip: Boolean,
64
- /**
65
- * String alternative to "horizontalFlip" and "verticalFlip".
66
- * Example: https://docs.iconify.design/icon-components/vue/transform.html
67
- */
68
- flip: String,
69
- /**
70
- * Icon render mode
71
- * 'style' = 'bg' or 'mask', depending on icon content
72
- * 'bg' = span with style using `background`
73
- * 'mask' = span with style using `mask`
74
- * 'svg' = svg
75
- * Iconify doc: https://docs.iconify.design/iconify-icon/modes.html
76
- */
77
- mode: String as PropType<`${IconifyRenderMode}`>,
78
- /**
79
- * Toggles inline or block mode
80
- * Example https://docs.iconify.design/icon-components/vue/inline.html
81
- */
82
- inline: Boolean,
83
- /**
84
- * rotates icon
85
- * Example https://docs.iconify.design/icon-components/vue/transform.html
86
- */
87
- rotate: [Number, String],
88
- /**
89
- * A callback that is called when icon data has been loaded
90
- */
91
- onLoad: Function as PropType<IconifyIconOnLoad>,
92
- /**
93
- * SVG icon string
94
- */
95
- svg: String,
96
- /**
97
- * Icon modifiers: vv-icon css helper classes, value/s are concatened with prefix 'vv-icon--'
98
- * @values string | string[]
99
- */
100
- modifiers: {
101
- type: [String, Array] as PropType<string | string[]>,
102
- },
88
+ export const VvIconPropsDefaults = {
89
+ prefix: IconPrefix.normal,
103
90
  }
@@ -0,0 +1,413 @@
1
+ <script setup lang="ts">
2
+ import type { UploadedFile } from '../../types'
3
+ import { useVModel } from '@vueuse/core'
4
+ import { computed, onBeforeUnmount, ref } from 'vue'
5
+ import Sortable from 'vuedraggable'
6
+ import { type VvInputFileEvents, VvInputFileProps } from '.'
7
+ import HintSlotFactory from '../common/HintSlot'
8
+ import VvButton from '../VvButton/VvButton.vue'
9
+ import VvIcon from '../VvIcon/VvIcon.vue'
10
+
11
+ // props, emit, slots and attrs
12
+ const props = defineProps(VvInputFileProps)
13
+ const emit = defineEmits<VvInputFileEvents>()
14
+ const slots = useSlots()
15
+
16
+ // props merged with volver defaults (now only for labels)
17
+ const propsDefaults = useDefaults<typeof VvInputFileProps>(
18
+ 'VvInputFile',
19
+ VvInputFileProps,
20
+ props,
21
+ )
22
+ const { modifiers, id, readonly, disabled, icon, iconPosition, iconDownload }
23
+ = toRefs(props)
24
+ const hasId = useUniqueId(id)
25
+ const hasHintId = computed(() => `${hasId.value}-hint`)
26
+
27
+ const hasProgress = computed(() => {
28
+ if (!props.progress) {
29
+ return false
30
+ }
31
+ const progress
32
+ = typeof props.progress === 'string'
33
+ ? Number.parseInt(props.progress)
34
+ : props.progress
35
+ return progress > 0 && progress < 100
36
+ })
37
+
38
+ const { hasIconBefore, hasIconAfter } = useComponentIcon(icon, iconPosition)
39
+ const { hasIcon: hasIconDownload } = useComponentIcon(iconDownload)
40
+
41
+ // styles
42
+ const bemCssClasses = useModifiers(
43
+ 'vv-input-file',
44
+ modifiers,
45
+ computed(() => ({
46
+ 'dragging': isDragging.value,
47
+ 'loading': props.loading && !hasProgress.value,
48
+ 'valid': props.valid === true,
49
+ 'invalid': props.invalid === true,
50
+ 'icon-before': !!hasIconBefore.value,
51
+ 'icon-after': !!hasIconAfter.value,
52
+ 'drop-area': hasDropArea.value,
53
+ })),
54
+ )
55
+
56
+ const {
57
+ HintSlot,
58
+ hasHintLabelOrSlot,
59
+ hasInvalidLabelOrSlot,
60
+ hintSlotScope,
61
+ } = HintSlotFactory(propsDefaults, slots)
62
+
63
+ const localModelValue = useVModel(props, 'modelValue', emit)
64
+ const files = computed({
65
+ get: () => {
66
+ if (
67
+ !localModelValue.value
68
+ || (!Array.isArray(localModelValue.value)
69
+ && !(localModelValue.value as File)?.name)
70
+ ) {
71
+ return []
72
+ }
73
+ return Array.isArray(localModelValue.value)
74
+ ? localModelValue.value
75
+ : [localModelValue.value]
76
+ },
77
+ set: (value) => {
78
+ if (isMultiple.value) {
79
+ localModelValue.value = value
80
+ return
81
+ }
82
+ localModelValue.value = value?.[0]
83
+ },
84
+ })
85
+
86
+ const isDisabledOrReadonly = computed(() => props.disabled || props.readonly)
87
+
88
+ const hasMax = computed(() => {
89
+ return typeof props.max === 'string' ? Number.parseInt(props.max) : props.max
90
+ })
91
+
92
+ const hasDropArea = computed(() => {
93
+ return props.dropArea && !isDisabledOrReadonly.value
94
+ })
95
+
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
+ })
105
+
106
+ const isDragging = ref(false)
107
+
108
+ const inputEl = ref<HTMLInputElement>()
109
+ function onDragenter() {
110
+ isDragging.value = true
111
+ }
112
+
113
+ function onDragleave() {
114
+ isDragging.value = false
115
+ }
116
+
117
+ function onDrop(event: DragEvent) {
118
+ if (!event.dataTransfer?.files) {
119
+ return
120
+ }
121
+ isDragging.value = false
122
+ addFiles(event.dataTransfer?.files)
123
+ }
124
+
125
+ function onChange() {
126
+ if (!inputEl.value?.files) {
127
+ return
128
+ }
129
+ addFiles(inputEl.value.files)
130
+ inputEl.value.value = ''
131
+ }
132
+
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
+ }
161
+
162
+ function onClickDropArea() {
163
+ if (!inputEl.value) {
164
+ return
165
+ }
166
+ if (!isDisabledOrReadonly.value) {
167
+ inputEl.value.click()
168
+ }
169
+ }
170
+
171
+ function onClickRemoveFile(index: number) {
172
+ const toRemove = !Array.isArray(localModelValue.value) ? localModelValue.value : localModelValue.value[index]
173
+ if (!toRemove) {
174
+ return
175
+ }
176
+ emit('remove', toRemove)
177
+ if (!Array.isArray(localModelValue.value)) {
178
+ localModelValue.value = undefined
179
+ return
180
+ }
181
+ if (selectedFileIndex.value === index) {
182
+ selectedFileIndex.value = 0
183
+ }
184
+ const newModelValue = [...localModelValue.value]
185
+ newModelValue.splice(index, 1)
186
+ localModelValue.value = newModelValue
187
+ }
188
+
189
+ const selectedFileIndex = ref(0)
190
+ const PREVIEW_MIME_TYPES = ['image/jpeg', 'image/png']
191
+ const previewSrc = computed(() => {
192
+ if (files.value.length === 0) {
193
+ return
194
+ }
195
+ if (!files.value[selectedFileIndex.value]) {
196
+ return undefined
197
+ }
198
+ if (files.value[selectedFileIndex.value] instanceof File) {
199
+ const currentFile = files.value[selectedFileIndex.value] as File
200
+ if (!PREVIEW_MIME_TYPES.includes(currentFile.type)) {
201
+ return undefined
202
+ }
203
+ return URL.createObjectURL(currentFile)
204
+ }
205
+ const currentFile = files.value[selectedFileIndex.value] as UploadedFile
206
+ if (currentFile.thumbnailUrl) {
207
+ return currentFile.thumbnailUrl
208
+ }
209
+ if (!PREVIEW_MIME_TYPES.includes(currentFile.type)) {
210
+ return undefined
211
+ }
212
+ return currentFile.url
213
+ })
214
+
215
+ watch(previewSrc, (_newValue, oldValue) => {
216
+ if (oldValue) {
217
+ URL.revokeObjectURL(oldValue)
218
+ }
219
+ })
220
+
221
+ onBeforeUnmount(() => {
222
+ if (previewSrc.value) {
223
+ URL.revokeObjectURL(previewSrc.value)
224
+ }
225
+ })
226
+
227
+ function formatBytes(bytes?: number, decimals?: number) {
228
+ if (!bytes) {
229
+ return
230
+ }
231
+ if (bytes === 0)
232
+ return '0 Bytes'
233
+ const k = 1024
234
+ const dm = !decimals ? 2 : decimals <= 0 ? 0 : decimals
235
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
236
+ const i = Math.floor(Math.log(bytes) / Math.log(k))
237
+ return `${Number.parseFloat((bytes / (k ** i)).toFixed(dm))} ${sizes[i]}`
238
+ }
239
+
240
+ function onClickDownloadFile(file: File | UploadedFile) {
241
+ emit('download', file)
242
+ const href = file instanceof File ? URL.createObjectURL(file) : file.url
243
+ if (!href) {
244
+ return
245
+ }
246
+ const link = document.createElement('a')
247
+ link.href = href
248
+ link.setAttribute('download', file.name)
249
+ document.body.appendChild(link)
250
+ link.click()
251
+ document.body.removeChild(link)
252
+ URL.revokeObjectURL(link.href)
253
+ }
254
+
255
+ function onClickSelectFile(index: number) {
256
+ selectedFileIndex.value = index
257
+ }
258
+
259
+ const dropdAreaActionLabel = computed(() => {
260
+ if (files.value.length === 0 || isMultiple.value) {
261
+ return props.labelAdd
262
+ }
263
+ return props.labelReplace
264
+ })
265
+
266
+ const dropAreaActionIcon = computed(() => {
267
+ if (files.value.length === 0 || isMultiple.value) {
268
+ return props.iconAdd
269
+ }
270
+ return props.iconReplace
271
+ })
272
+
273
+ function onSortEnd({ newIndex }: { newIndex: number | null }) {
274
+ if (newIndex !== null) {
275
+ selectedFileIndex.value = newIndex
276
+ }
277
+ }
278
+ </script>
279
+
280
+ <script lang="ts">
281
+ export default {
282
+ name: 'VvInputFile',
283
+ }
284
+ </script>
285
+
286
+ <template>
287
+ <div :class="bemCssClasses">
288
+ <label v-if="label" :for="hasId">
289
+ {{ label }}
290
+ </label>
291
+ <div
292
+ v-if="hasDropArea"
293
+ class="vv-input-file__drop-area"
294
+ @dragenter.prevent.stop="onDragenter"
295
+ @dragleave.prevent.stop="onDragleave"
296
+ @drop.prevent.stop="onDrop"
297
+ @dragover.prevent.stop
298
+ @click.stop="onClickDropArea"
299
+ >
300
+ <slot name="drop-area">
301
+ <picture class="vv-input-file__preview">
302
+ <img
303
+ v-if="previewSrc"
304
+ :src="previewSrc"
305
+ :alt="files[selectedFileIndex].name"
306
+ >
307
+ </picture>
308
+ <VvButton
309
+ v-if="!readonly"
310
+ modifiers="action"
311
+ :label="!previewSrc ? dropdAreaActionLabel : undefined"
312
+ :title="previewSrc ? dropdAreaActionLabel : undefined"
313
+ :disabled="disabled"
314
+ :class="{
315
+ 'vv-input-file__drop-area-action': previewSrc,
316
+ }"
317
+ :icon="dropAreaActionIcon"
318
+ @click.stop="onClickDropArea"
319
+ />
320
+ </slot>
321
+ </div>
322
+ <div class="vv-input-file__wrapper">
323
+ <VvIcon v-if="hasIconBefore" v-bind="hasIconBefore" />
324
+ <input
325
+ :id="hasId"
326
+ ref="inputEl"
327
+ type="file"
328
+ :readonly="readonly"
329
+ :disabled="disabled"
330
+ :placeholder="placeholder"
331
+ :aria-describedby="hasHintLabelOrSlot ? hasHintId : undefined"
332
+ :aria-invalid="invalid"
333
+ :aria-errormessage="
334
+ hasInvalidLabelOrSlot ? hasHintId : undefined
335
+ "
336
+ :multiple="isMultiple"
337
+ :accept="accept"
338
+ :capture="capture"
339
+ :name="name"
340
+ @change="onChange"
341
+ >
342
+ <progress
343
+ v-if="hasProgress"
344
+ class="vv-input-file__progress"
345
+ :value="progress"
346
+ max="100"
347
+ >
348
+ {{ progress }}%
349
+ </progress>
350
+ <VvIcon v-if="hasIconAfter" v-bind="hasIconAfter" />
351
+ </div>
352
+ <Sortable
353
+ v-model="files"
354
+ tag="ul"
355
+ class="vv-input-file__list"
356
+ item-key="name"
357
+ :move="() => sortable"
358
+ @end="onSortEnd"
359
+ >
360
+ <template #item="{ element: file, index }">
361
+ <li
362
+ class="vv-input-file__item"
363
+ :class="{
364
+ 'active':
365
+ index === selectedFileIndex
366
+ && hasDropArea
367
+ && files.length > 1,
368
+ 'cursor-move': sortable,
369
+ }"
370
+ @click.stop="onClickSelectFile(index)"
371
+ >
372
+ <button
373
+ v-if="hasIconDownload"
374
+ type="button"
375
+ class="vv-input-file__item-action"
376
+ :title="labelDownload"
377
+ @click.stop="onClickDownloadFile(file)"
378
+ >
379
+ <VvIcon v-bind="hasIconDownload" />
380
+ </button>
381
+ <div class="vv-input-file__item-name">
382
+ {{ file.name }}
383
+ </div>
384
+ <small class="vv-input-file__item-info">
385
+ {{ formatBytes(file.size) }}
386
+ </small>
387
+ <button
388
+ v-if="!readonly"
389
+ type="button"
390
+ class="vv-input-file__item-remove"
391
+ :title="labelRemove"
392
+ :disabled="disabled"
393
+ @click.stop="onClickRemoveFile(index)"
394
+ />
395
+ </li>
396
+ </template>
397
+ </Sortable>
398
+ <HintSlot :id="hasHintId" class="vv-input-file__hint">
399
+ <template v-if="$slots.hint" #hint>
400
+ <slot name="hint" v-bind="hintSlotScope" />
401
+ </template>
402
+ <template v-if="$slots.loading" #loading>
403
+ <slot name="loading" v-bind="hintSlotScope" />
404
+ </template>
405
+ <template v-if="$slots.valid" #valid>
406
+ <slot name="valid" v-bind="hintSlotScope" />
407
+ </template>
408
+ <template v-if="$slots.invalid" #invalid>
409
+ <slot name="invalid" v-bind="hintSlotScope" />
410
+ </template>
411
+ </HintSlot>
412
+ </div>
413
+ </template>