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

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 +17 -17
  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 +16 -12
  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 +905 -888
  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,484 +1,496 @@
1
- <script lang="ts">
2
- export default {
3
- name: 'VvDropdown',
4
- inheritAttrs: false,
5
- }
6
- </script>
7
-
8
1
  <script setup lang="ts">
9
- import type { Ref } from 'vue'
10
- import {
11
- useFloating,
12
- offset,
13
- flip,
14
- autoUpdate,
15
- shift,
16
- autoPlacement,
17
- arrow,
18
- size,
19
- } from '@floating-ui/vue'
20
- import { VvDropdownProps } from '.'
21
- import type {
22
- AutoPlacementOptions,
23
- FlipOptions,
24
- OffsetOptions,
25
- ShiftOptions,
26
- SizeOptions,
27
- } from '../../types/floating-ui'
28
- import { Side, Strategy } from '../../constants'
2
+ import type { Ref } from 'vue'
3
+ import {
4
+ useFloating,
5
+ offset,
6
+ flip,
7
+ autoUpdate,
8
+ shift,
9
+ autoPlacement,
10
+ arrow,
11
+ size,
12
+ } from '@floating-ui/vue'
13
+ import type {
14
+ AutoPlacementOptions,
15
+ FlipOptions,
16
+ OffsetOptions,
17
+ ShiftOptions,
18
+ SizeOptions,
19
+ } from '../../types/floating-ui'
20
+ import { Side, Strategy } from '../../constants'
21
+ import { VvDropdownProps } from '.'
22
+
23
+ // props, emit and attrs
24
+ const props = defineProps(VvDropdownProps)
25
+
26
+ const emit = defineEmits([
27
+ 'update:modelValue',
28
+ 'beforeEnter',
29
+ 'afterLeave',
30
+ 'beforeExpand',
31
+ 'beforeCollapse',
32
+ 'afterExpand',
33
+ 'afterCollapse',
34
+ 'before-enter',
35
+ 'after-leave',
36
+ 'enter',
37
+ 'afterEnter',
38
+ 'enterCancelled',
39
+ 'beforeLeave',
40
+ 'leave',
41
+ 'leaveCancelled',
42
+ ])
29
43
 
30
- // props, emit and attrs
31
- const props = defineProps(VvDropdownProps)
32
- const emit = defineEmits([
33
- 'update:modelValue',
34
- 'beforeExpand',
35
- 'beforeCollapse',
36
- 'afterExpand',
37
- 'afterCollapse',
38
- 'before-enter',
39
- 'after-leave',
40
- 'enter',
41
- 'after-enter',
42
- 'enter-cancelled',
43
- 'before-leave',
44
- 'leave',
45
- 'leave-cancelled',
46
- ])
47
- const { id } = toRefs(props)
48
- const hasId = useUniqueId(id)
49
- const attrs = useAttrs()
50
- const maxWidth = ref('auto')
51
- const maxHeight = ref('auto')
44
+ const { id } = toRefs(props)
45
+ const hasId = useUniqueId(id)
46
+ const attrs = useAttrs()
47
+ const maxWidth = ref('auto')
48
+ const maxHeight = ref('auto')
52
49
 
53
- // template elements
54
- const localReferenceEl = ref<HTMLElement | null>(null)
55
- const floatingEl: Ref = ref()
56
- const arrowEl = ref<HTMLElement | null>(null)
57
- const listEl = ref<HTMLUListElement | null>(null)
58
- const referenceEl = computed({
59
- get: () => props.reference ?? localReferenceEl.value,
60
- set: (newValue) => {
61
- localReferenceEl.value = newValue
62
- },
63
- })
50
+ // template elements
51
+ const localReferenceEl = ref<HTMLElement | null>(null)
52
+ const floatingEl: Ref = ref()
53
+ const arrowEl = ref<HTMLElement | null>(null)
54
+ const listEl = ref<HTMLUListElement | null>(null)
55
+ const referenceEl = computed({
56
+ get: () => props.reference ?? localReferenceEl.value,
57
+ set: (newValue) => {
58
+ localReferenceEl.value = newValue
59
+ },
60
+ })
64
61
 
65
- // ref to store the value of css-var "--dropdown-custom-position"
66
- const hasCustomPosition = ref(false)
62
+ // ref to store the value of css-var "--dropdown-custom-position"
63
+ const hasCustomPosition = ref(false)
67
64
 
68
- // observe dropdown style for "--dropdown-custom-position" css var to disable floating-ui
69
- onMounted(() => {
70
- useMutationObserver(
71
- floatingEl.value,
72
- () => {
73
- hasCustomPosition.value =
74
- window
75
- .getComputedStyle(floatingEl.value)
76
- .getPropertyValue('--dropdown-custom-position')
77
- ?.trim() === 'true'
78
- },
79
- {
80
- attributeFilter: ['style'],
81
- window,
82
- },
83
- )
84
- })
65
+ // observe dropdown style for "--dropdown-custom-position" css var to disable floating-ui
66
+ onMounted(() => {
67
+ useMutationObserver(
68
+ floatingEl.value,
69
+ () => {
70
+ hasCustomPosition.value
71
+ = window
72
+ .getComputedStyle(floatingEl.value)
73
+ .getPropertyValue('--dropdown-custom-position')
74
+ ?.trim() === 'true'
75
+ },
76
+ {
77
+ attributeFilter: ['style'],
78
+ window,
79
+ },
80
+ )
81
+ })
85
82
 
86
- // floating ui
87
- const middleware = computed(() => {
88
- const toReturn = []
83
+ // floating ui
84
+ const middleware = computed(() => {
85
+ const toReturn = []
89
86
 
90
- if (props.autoPlacement) {
91
- if (typeof props.autoPlacement === 'boolean') {
92
- toReturn.push(autoPlacement())
93
- } else {
94
- toReturn.push(
95
- autoPlacement(props.autoPlacement as AutoPlacementOptions),
96
- )
97
- }
98
- } else if (props.flip) {
99
- if (typeof props.flip === 'boolean') {
100
- toReturn.push(flip({ fallbackStrategy: 'initialPlacement' }))
101
- } else {
102
- toReturn.push(flip(props.flip as FlipOptions))
103
- }
104
- }
87
+ if (props.autoPlacement) {
88
+ if (typeof props.autoPlacement === 'boolean') {
89
+ toReturn.push(autoPlacement())
90
+ }
91
+ else {
92
+ toReturn.push(
93
+ autoPlacement(props.autoPlacement as AutoPlacementOptions),
94
+ )
95
+ }
96
+ }
97
+ else if (props.flip) {
98
+ if (typeof props.flip === 'boolean') {
99
+ toReturn.push(flip({ fallbackStrategy: 'initialPlacement' }))
100
+ }
101
+ else {
102
+ toReturn.push(flip(props.flip as FlipOptions))
103
+ }
104
+ }
105
105
 
106
- if (props.shift) {
107
- if (typeof props.shift === 'boolean') {
108
- toReturn.push(shift())
109
- } else {
110
- toReturn.push(shift(props.shift as ShiftOptions))
111
- }
112
- }
106
+ if (props.shift) {
107
+ if (typeof props.shift === 'boolean') {
108
+ toReturn.push(shift())
109
+ }
110
+ else {
111
+ toReturn.push(shift(props.shift as ShiftOptions))
112
+ }
113
+ }
113
114
 
114
- if (props.size) {
115
- const apply = ({
116
- availableWidth,
117
- availableHeight,
118
- }: {
119
- availableWidth: number
120
- availableHeight: number
121
- }) => {
122
- maxWidth.value = `${availableWidth}px`
123
- maxHeight.value = `${availableHeight}px`
124
- }
125
- if (typeof props.size === 'boolean') {
126
- toReturn.push(
127
- size({
128
- apply,
129
- }),
130
- )
131
- } else {
132
- toReturn.push(
133
- size({
134
- ...(props.size as SizeOptions),
135
- apply,
136
- }),
137
- )
138
- }
139
- }
115
+ if (props.size) {
116
+ const apply = ({
117
+ availableWidth,
118
+ availableHeight,
119
+ }: {
120
+ availableWidth: number
121
+ availableHeight: number
122
+ }) => {
123
+ maxWidth.value = `${availableWidth}px`
124
+ maxHeight.value = `${availableHeight}px`
125
+ }
126
+ if (typeof props.size === 'boolean') {
127
+ toReturn.push(
128
+ size({
129
+ apply,
130
+ }),
131
+ )
132
+ }
133
+ else {
134
+ toReturn.push(
135
+ size({
136
+ ...(props.size as SizeOptions),
137
+ apply,
138
+ }),
139
+ )
140
+ }
141
+ }
140
142
 
141
- if (props.offset) {
142
- toReturn.push(offset(Number(props.offset)))
143
+ if (props.offset) {
144
+ toReturn.push(offset(Number(props.offset)))
143
145
 
144
- if (['string', 'number'].includes(typeof props.offset)) {
145
- toReturn.push(offset(Number(props.offset)))
146
- } else {
147
- toReturn.push(offset(props.offset as OffsetOptions))
148
- }
149
- }
146
+ if (['string', 'number'].includes(typeof props.offset)) {
147
+ toReturn.push(offset(Number(props.offset)))
148
+ }
149
+ else {
150
+ toReturn.push(offset(props.offset as OffsetOptions))
151
+ }
152
+ }
150
153
 
151
- if (props.arrow) {
152
- toReturn.push(
153
- arrow({
154
- element: arrowEl,
155
- }),
156
- )
157
- }
154
+ if (props.arrow) {
155
+ toReturn.push(
156
+ arrow({
157
+ element: arrowEl,
158
+ }),
159
+ )
160
+ }
158
161
 
159
- return toReturn
160
- })
161
- const { x, y, middlewareData, placement, strategy } = useFloating(
162
- referenceEl,
163
- floatingEl,
164
- {
165
- whileElementsMounted: (...args) => {
166
- return autoUpdate(...args, {
167
- animationFrame: props.strategy === Strategy.fixed,
168
- })
169
- },
170
- placement: computed(() => props.placement),
171
- strategy: computed(() => props.strategy),
172
- middleware,
173
- },
174
- )
175
- const dropdownPlacement = computed(() => {
176
- if (hasCustomPosition.value) {
177
- return undefined
178
- }
179
- const width =
180
- props.triggerWidth && referenceEl.value
181
- ? `${referenceEl.value?.offsetWidth}px`
182
- : undefined
183
- return {
184
- position: strategy.value,
185
- top: `${y.value ?? 0}px`,
186
- left: `${x.value ?? 0}px`,
187
- maxWidth: width ? undefined : maxWidth.value,
188
- maxHeight: maxHeight.value,
189
- width,
190
- }
191
- })
162
+ return toReturn
163
+ })
164
+ const { x, y, middlewareData, placement, strategy } = useFloating(
165
+ referenceEl,
166
+ floatingEl,
167
+ {
168
+ whileElementsMounted: (...args) => {
169
+ return autoUpdate(...args, {
170
+ animationFrame: props.strategy === Strategy.fixed,
171
+ })
172
+ },
173
+ placement: computed(() => props.placement),
174
+ strategy: computed(() => props.strategy),
175
+ middleware,
176
+ },
177
+ )
178
+ const dropdownPlacement = computed(() => {
179
+ if (hasCustomPosition.value) {
180
+ return undefined
181
+ }
182
+ const width
183
+ = props.triggerWidth && referenceEl.value
184
+ ? `${referenceEl.value?.offsetWidth}px`
185
+ : undefined
186
+ return {
187
+ position: strategy.value,
188
+ top: `${y.value ?? 0}px`,
189
+ left: `${x.value ?? 0}px`,
190
+ maxWidth: width ? undefined : maxWidth.value,
191
+ maxHeight: maxHeight.value,
192
+ width,
193
+ }
194
+ })
192
195
 
193
- // placement
194
- const side = computed(
195
- () =>
196
- placement.value.split('-')[0] as
197
- | Side.top
198
- | Side.right
199
- | Side.bottom
200
- | Side.left,
201
- )
202
- const arrowPlacement = computed(() => {
203
- if (hasCustomPosition.value) {
204
- return undefined
205
- }
206
- const staticSide = {
207
- [Side.top]: Side.bottom,
208
- [Side.right]: Side.left,
209
- [Side.bottom]: Side.top,
210
- [Side.left]: Side.right,
211
- }[side.value]
212
- return {
213
- left:
196
+ // placement
197
+ const side = computed(
198
+ () =>
199
+ placement.value.split('-')[0] as
200
+ | Side.top
201
+ | Side.right
202
+ | Side.bottom
203
+ | Side.left,
204
+ )
205
+ const arrowPlacement = computed(() => {
206
+ if (hasCustomPosition.value) {
207
+ return undefined
208
+ }
209
+ const staticSide = {
210
+ [Side.top]: Side.bottom,
211
+ [Side.right]: Side.left,
212
+ [Side.bottom]: Side.top,
213
+ [Side.left]: Side.right,
214
+ }[side.value]
215
+ return {
216
+ left:
214
217
  middlewareData.value.arrow?.x !== undefined
215
- ? `${middlewareData.value.arrow?.x}px`
216
- : undefined,
217
- top:
218
+ ? `${middlewareData.value.arrow?.x}px`
219
+ : undefined,
220
+ top:
218
221
  middlewareData.value.arrow?.y !== undefined
219
- ? `${middlewareData.value.arrow?.y}px`
220
- : undefined,
221
- [staticSide]: `${-(arrowEl.value?.offsetWidth ?? 0) / 2}px`,
222
- }
223
- })
222
+ ? `${middlewareData.value.arrow?.y}px`
223
+ : undefined,
224
+ [staticSide]: `${-(arrowEl.value?.offsetWidth ?? 0) / 2}px`,
225
+ }
226
+ })
224
227
 
225
- // visibility
226
- const modelValue = useVModel(props, 'modelValue', emit)
227
- const localModelValue = ref(false)
228
- const expanded = computed({
229
- get: () => modelValue.value ?? localModelValue.value,
230
- set: (newValue) => {
231
- if (modelValue.value === undefined) {
232
- localModelValue.value = newValue
233
- return
234
- }
235
- modelValue.value = newValue
236
- },
237
- })
238
- const show = () => {
239
- expanded.value = true
240
- }
241
- const hide = () => {
242
- expanded.value = false
243
- }
244
- const toggle = () => {
245
- expanded.value = !expanded.value
246
- }
247
- const init = (el: HTMLElement) => {
248
- referenceEl.value = el
249
- }
250
- defineExpose({
251
- toggle,
252
- show,
253
- hide,
254
- init,
255
- customPosition: hasCustomPosition,
256
- })
257
- watch(expanded, (newValue) => {
258
- if (newValue && props.autofocusFirst) {
259
- nextTick(() => {
260
- // focus first item
261
- const focusableElements = getKeyboardFocusableElements(
262
- floatingEl.value,
263
- )
264
- if (focusableElements.length > 0) {
265
- focusableElements[0].focus({
266
- preventScroll: true,
267
- })
268
- }
269
- })
270
- }
271
- })
272
- onClickOutside(
273
- floatingEl,
274
- () => {
275
- if (!props.keepOpen && expanded.value) {
276
- expanded.value = false
277
- }
278
- },
279
- { ignore: [referenceEl] },
280
- )
228
+ // visibility
229
+ const modelValue = useVModel(props, 'modelValue', emit)
230
+ const localModelValue = ref(false)
231
+ const expanded = computed({
232
+ get: () => modelValue.value ?? localModelValue.value,
233
+ set: (newValue) => {
234
+ if (modelValue.value === undefined) {
235
+ localModelValue.value = newValue
236
+ return
237
+ }
238
+ modelValue.value = newValue
239
+ },
240
+ })
241
+ function show() {
242
+ expanded.value = true
243
+ }
244
+ function hide() {
245
+ expanded.value = false
246
+ }
247
+ function toggle() {
248
+ expanded.value = !expanded.value
249
+ }
250
+ function init(el: HTMLElement) {
251
+ referenceEl.value = el
252
+ }
253
+ defineExpose({
254
+ toggle,
255
+ show,
256
+ hide,
257
+ init,
258
+ customPosition: hasCustomPosition,
259
+ })
260
+ watch(expanded, (newValue) => {
261
+ if (newValue && props.autofocusFirst) {
262
+ nextTick(() => {
263
+ // focus first item
264
+ const focusableElements = getKeyboardFocusableElements(
265
+ floatingEl.value,
266
+ )
267
+ if (focusableElements.length > 0) {
268
+ focusableElements[0].focus({
269
+ preventScroll: true,
270
+ })
271
+ }
272
+ })
273
+ }
274
+ })
275
+ onClickOutside(
276
+ floatingEl,
277
+ () => {
278
+ if (!props.keepOpen && expanded.value) {
279
+ expanded.value = false
280
+ }
281
+ },
282
+ { ignore: [referenceEl] },
283
+ )
281
284
 
282
- // aria
283
- const hasAriaLabelledby = computed(() => {
284
- return referenceEl.value?.getAttribute?.('id') ?? undefined
285
- })
286
- const referenceAria = computed(() => ({
287
- 'aria-controls': hasId.value,
288
- 'aria-haspopup': true,
289
- 'aria-expanded': expanded.value,
290
- }))
285
+ // aria
286
+ const hasAriaLabelledby = computed(() => {
287
+ return referenceEl.value?.getAttribute?.('id') ?? undefined
288
+ })
289
+ const referenceAria = computed(() => ({
290
+ 'aria-controls': hasId.value,
291
+ 'aria-haspopup': true,
292
+ 'aria-expanded': expanded.value,
293
+ }))
291
294
 
292
- // provide to dropdown
293
- const { component: VvDropdownTriggerProvider, bus } =
294
- useProvideDropdownTrigger({
295
- reference: referenceEl,
296
- id: hasId,
297
- expanded,
298
- aria: referenceAria,
295
+ // provide to dropdown
296
+ const { component: VvDropdownTriggerProvider, bus }
297
+ = useProvideDropdownTrigger({
298
+ reference: referenceEl,
299
+ id: hasId,
300
+ expanded,
301
+ aria: referenceAria,
299
302
  })
300
- bus.on('click', toggle)
303
+ bus.on('click', toggle)
301
304
 
302
- const { role, modifiers } = toRefs(props)
305
+ const { role, modifiers } = toRefs(props)
303
306
 
304
- // styles
305
- const bemCssClasses = useModifiers(
306
- 'vv-dropdown',
307
- modifiers,
308
- computed(() => ({
309
- arrow: props.arrow,
310
- })),
311
- )
307
+ // styles
308
+ const bemCssClasses = useModifiers(
309
+ 'vv-dropdown',
310
+ modifiers,
311
+ computed(() => ({
312
+ arrow: props.arrow,
313
+ })),
314
+ )
312
315
 
313
- // focus
314
- const { focused } = useFocusWithin(floatingEl)
315
- function getKeyboardFocusableElements(element: Element | null) {
316
- if (!element) {
317
- return []
318
- }
319
- return [
320
- ...element.querySelectorAll(
321
- 'a[href], button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])',
322
- ),
323
- ].filter(
324
- (el) =>
325
- !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden'),
326
- ) as HTMLElement[]
327
- }
328
- const focusNext = () => {
329
- nextTick(() => {
330
- if (focused.value) {
331
- const focusableElements = getKeyboardFocusableElements(
332
- floatingEl.value,
333
- )
334
- if (focusableElements.length === 0 || !document.activeElement) {
335
- return
336
- }
337
- const activeElementIndex = focusableElements.indexOf(
338
- document.activeElement as HTMLElement,
339
- )
340
- if (activeElementIndex < focusableElements.length - 1) {
341
- focusableElements[activeElementIndex + 1].focus({
342
- preventScroll: true,
343
- })
344
- } else {
345
- focusableElements[0].focus({
346
- preventScroll: true,
347
- })
348
- }
349
- }
350
- })
351
- }
352
- const focusPrev = () => {
353
- nextTick(() => {
354
- if (focused.value) {
355
- const focusableElements = getKeyboardFocusableElements(
356
- floatingEl.value,
357
- )
358
- if (focusableElements.length === 0 || !document.activeElement) {
359
- return
360
- }
361
- const activeElementIndex = focusableElements.indexOf(
362
- document.activeElement as HTMLElement,
363
- )
364
- if (activeElementIndex > 0) {
365
- focusableElements[activeElementIndex - 1].focus({
366
- preventScroll: true,
367
- })
368
- } else {
369
- focusableElements[focusableElements.length - 1].focus({
370
- preventScroll: true,
371
- })
372
- }
373
- }
374
- })
375
- }
316
+ // focus
317
+ const { focused } = useFocusWithin(floatingEl)
318
+ function getKeyboardFocusableElements(element: Element | null) {
319
+ if (!element) {
320
+ return []
321
+ }
322
+ return [
323
+ ...element.querySelectorAll(
324
+ 'a[href], button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])',
325
+ ),
326
+ ].filter(
327
+ el =>
328
+ !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden'),
329
+ ) as HTMLElement[]
330
+ }
331
+ function focusNext() {
332
+ nextTick(() => {
333
+ if (focused.value) {
334
+ const focusableElements = getKeyboardFocusableElements(
335
+ floatingEl.value,
336
+ )
337
+ if (focusableElements.length === 0 || !document.activeElement) {
338
+ return
339
+ }
340
+ const activeElementIndex = focusableElements.indexOf(
341
+ document.activeElement as HTMLElement,
342
+ )
343
+ if (activeElementIndex < focusableElements.length - 1) {
344
+ focusableElements[activeElementIndex + 1].focus({
345
+ preventScroll: true,
346
+ })
347
+ }
348
+ else {
349
+ focusableElements[0].focus({
350
+ preventScroll: true,
351
+ })
352
+ }
353
+ }
354
+ })
355
+ }
356
+ function focusPrev() {
357
+ nextTick(() => {
358
+ if (focused.value) {
359
+ const focusableElements = getKeyboardFocusableElements(
360
+ floatingEl.value,
361
+ )
362
+ if (focusableElements.length === 0 || !document.activeElement) {
363
+ return
364
+ }
365
+ const activeElementIndex = focusableElements.indexOf(
366
+ document.activeElement as HTMLElement,
367
+ )
368
+ if (activeElementIndex > 0) {
369
+ focusableElements[activeElementIndex - 1].focus({
370
+ preventScroll: true,
371
+ })
372
+ }
373
+ else {
374
+ focusableElements[focusableElements.length - 1].focus({
375
+ preventScroll: true,
376
+ })
377
+ }
378
+ }
379
+ })
380
+ }
376
381
 
377
- // hover
378
- const hovered = useElementHover(floatingEl)
382
+ // hover
383
+ const hovered = useElementHover(floatingEl)
379
384
 
380
- // provide top dropdown item
381
- const { itemRole } = useProvideDropdownItem({
382
- role,
383
- expanded,
384
- focused,
385
- hovered,
386
- })
385
+ // provide top dropdown item
386
+ const { itemRole } = useProvideDropdownItem({
387
+ role,
388
+ expanded,
389
+ focused,
390
+ hovered,
391
+ })
387
392
 
388
- // keyboard
389
- onKeyStroke('Escape', (e) => {
390
- if (expanded.value) {
391
- e.preventDefault()
392
- hide()
393
- }
394
- })
395
- onKeyStroke('ArrowDown', (e) => {
396
- if (expanded.value && focused.value) {
397
- e.preventDefault()
398
- focusNext()
399
- }
400
- })
401
- onKeyStroke('ArrowUp', (e) => {
402
- if (expanded.value && focused.value) {
403
- e.preventDefault()
404
- focusPrev()
405
- }
406
- })
407
- onKeyStroke([' ', 'Enter'], (e) => {
408
- const htmlEl = e.target as HTMLElement
393
+ // keyboard
394
+ onKeyStroke('Escape', (e) => {
395
+ if (expanded.value) {
396
+ e.preventDefault()
397
+ hide()
398
+ }
399
+ })
400
+ onKeyStroke('ArrowDown', (e) => {
401
+ if (expanded.value && focused.value) {
402
+ e.preventDefault()
403
+ focusNext()
404
+ }
405
+ })
406
+ onKeyStroke('ArrowUp', (e) => {
407
+ if (expanded.value && focused.value) {
408
+ e.preventDefault()
409
+ focusPrev()
410
+ }
411
+ })
412
+ onKeyStroke([' ', 'Enter'], (e) => {
413
+ const htmlEl = e.target as HTMLElement
409
414
 
410
- if (expanded.value && focused.value && htmlEl) {
411
- htmlEl?.click()
412
- }
413
- })
415
+ if (expanded.value && focused.value && htmlEl) {
416
+ htmlEl?.click()
417
+ }
418
+ })
414
419
 
415
- const dropdownTransitionHandlers = {
416
- 'before-enter': () => {
417
- emit(expanded.value ? 'beforeExpand' : 'beforeCollapse')
418
- emit('before-enter')
419
- },
420
- 'after-leave': () => {
421
- emit(expanded.value ? 'afterExpand' : 'afterCollapse')
422
- emit('after-leave')
423
- },
424
- enter: () => {
425
- emit('enter')
426
- },
427
- 'after-enter': () => {
428
- emit('after-enter')
429
- },
430
- 'enter-cancelled': () => {
431
- emit('enter-cancelled')
432
- },
433
- 'before-leave': () => {
434
- emit('before-leave')
435
- },
436
- leave: () => {
437
- emit('leave')
438
- },
439
- 'leave-cancelled': () => {
440
- emit('leave-cancelled')
441
- },
442
- }
420
+ const dropdownTransitionHandlers = {
421
+ 'before-enter': () => {
422
+ emit(expanded.value ? 'beforeExpand' : 'beforeCollapse')
423
+ emit('beforeEnter')
424
+ },
425
+ 'after-leave': () => {
426
+ emit(expanded.value ? 'afterExpand' : 'afterCollapse')
427
+ emit('afterLeave')
428
+ },
429
+ 'enter': () => {
430
+ emit('enter')
431
+ },
432
+ 'after-enter': () => {
433
+ emit('afterEnter')
434
+ },
435
+ 'enter-cancelled': () => {
436
+ emit('enterCancelled')
437
+ },
438
+ 'before-leave': () => {
439
+ emit('beforeLeave')
440
+ },
441
+ 'leave': () => {
442
+ emit('leave')
443
+ },
444
+ 'leave-cancelled': () => {
445
+ emit('leaveCancelled')
446
+ },
447
+ }
448
+ </script>
449
+
450
+ <script lang="ts">
451
+ export default {
452
+ name: 'VvDropdown',
453
+ inheritAttrs: false,
454
+ }
443
455
  </script>
444
456
 
445
457
  <template>
446
- <VvDropdownTriggerProvider>
447
- <slot
448
- v-bind="{ init, show, hide, toggle, expanded, aria: referenceAria }"
449
- />
450
- </VvDropdownTriggerProvider>
451
- <Transition :name="transitionName" v-on="dropdownTransitionHandlers">
452
- <div
453
- v-show="expanded"
454
- ref="floatingEl"
455
- :style="dropdownPlacement"
456
- :class="bemCssClasses"
457
- >
458
- <div
459
- v-if="props.arrow"
460
- ref="arrowEl"
461
- :style="arrowPlacement"
462
- class="vv-dropdown__arrow"
463
- ></div>
464
- <slot name="before" v-bind="{ expanded }" />
465
- <div
466
- v-bind="attrs"
467
- :id="hasId"
468
- ref="listEl"
469
- :tabindex="!expanded ? -1 : undefined"
470
- :role="role"
471
- :aria-labelledby="hasAriaLabelledby"
472
- class="vv-dropdown__list"
473
- >
474
- <slot
475
- name="items"
476
- v-bind="{
477
- role: itemRole,
478
- }"
479
- />
480
- </div>
481
- <slot name="after" v-bind="{ expanded }" />
482
- </div>
483
- </Transition>
458
+ <VvDropdownTriggerProvider>
459
+ <slot
460
+ v-bind="{ init, show, hide, toggle, expanded, aria: referenceAria }"
461
+ />
462
+ </VvDropdownTriggerProvider>
463
+ <Transition :name="transitionName" v-on="dropdownTransitionHandlers">
464
+ <div
465
+ v-show="expanded"
466
+ ref="floatingEl"
467
+ :style="dropdownPlacement"
468
+ :class="bemCssClasses"
469
+ >
470
+ <div
471
+ v-if="props.arrow"
472
+ ref="arrowEl"
473
+ :style="arrowPlacement"
474
+ class="vv-dropdown__arrow"
475
+ />
476
+ <slot name="before" v-bind="{ expanded }" />
477
+ <div
478
+ v-bind="attrs"
479
+ :id="hasId"
480
+ ref="listEl"
481
+ :tabindex="!expanded ? -1 : undefined"
482
+ :role="role"
483
+ :aria-labelledby="hasAriaLabelledby"
484
+ class="vv-dropdown__list"
485
+ >
486
+ <slot
487
+ name="items"
488
+ v-bind="{
489
+ role: itemRole,
490
+ }"
491
+ />
492
+ </div>
493
+ <slot name="after" v-bind="{ expanded }" />
494
+ </div>
495
+ </Transition>
484
496
  </template>