@coreui/vue-pro 5.1.0 → 5.3.0

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 (300) hide show
  1. package/README.md +2 -1
  2. package/dist/cjs/components/alert/CAlert.d.ts +2 -2
  3. package/dist/cjs/components/avatar/CAvatar.d.ts +2 -10
  4. package/dist/cjs/components/badge/CBadge.d.ts +2 -2
  5. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  6. package/dist/cjs/components/button/CButton.d.ts +2 -6
  7. package/dist/cjs/components/button/CButton.js +2 -1
  8. package/dist/cjs/components/button/CButton.js.map +1 -1
  9. package/dist/cjs/components/calendar/CCalendar.d.ts +10 -10
  10. package/dist/cjs/components/calendar/CCalendar.js +2 -2
  11. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  12. package/dist/cjs/components/calendar/utils.d.ts +5 -4
  13. package/dist/cjs/components/calendar/utils.js +13 -6
  14. package/dist/cjs/components/calendar/utils.js.map +1 -1
  15. package/dist/cjs/components/carousel/CCarousel.d.ts +2 -2
  16. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  17. package/dist/cjs/components/close-button/CCloseButton.js.map +1 -1
  18. package/dist/cjs/components/conditional-teleport/CConditionalTeleport.d.ts +2 -2
  19. package/dist/cjs/components/date-picker/CDatePicker.d.ts +16 -4
  20. package/dist/cjs/components/date-picker/CDatePicker.js +8 -2
  21. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  22. package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +45 -13
  23. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +32 -9
  24. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  25. package/dist/cjs/components/date-range-picker/utils.d.ts +1 -0
  26. package/dist/cjs/components/date-range-picker/utils.js +10 -0
  27. package/dist/cjs/components/date-range-picker/utils.js.map +1 -1
  28. package/dist/cjs/components/dropdown/CDropdown.d.ts +5 -28
  29. package/dist/cjs/components/dropdown/CDropdown.js +3 -1
  30. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  31. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  32. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  33. package/dist/cjs/components/dropdown/utils.d.ts +0 -1
  34. package/dist/cjs/components/dropdown/utils.js +0 -13
  35. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  36. package/dist/cjs/components/footer/CFooter.d.ts +17 -1
  37. package/dist/cjs/components/footer/CFooter.js +8 -1
  38. package/dist/cjs/components/footer/CFooter.js.map +1 -1
  39. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  40. package/dist/cjs/components/form/CFormControlValidation.js.map +1 -1
  41. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  42. package/dist/cjs/components/form/CFormInput.d.ts +63 -63
  43. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  44. package/dist/cjs/components/form/CFormSelect.d.ts +2 -2
  45. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  46. package/dist/cjs/components/form/CFormSwitch.js.map +1 -1
  47. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  48. package/dist/cjs/components/index.js +8 -0
  49. package/dist/cjs/components/index.js.map +1 -1
  50. package/dist/cjs/components/link/CLink.js.map +1 -1
  51. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  52. package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
  53. package/dist/cjs/components/modal/CModal.js.map +1 -1
  54. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +33 -2
  55. package/dist/cjs/components/multi-select/CMultiSelect.js +25 -2
  56. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  57. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.d.ts +2 -0
  58. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +4 -2
  59. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  60. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  61. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +1 -0
  62. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  63. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  64. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  65. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  66. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  67. package/dist/cjs/components/popover/CPopover.d.ts +4 -4
  68. package/dist/cjs/components/popover/CPopover.js +3 -2
  69. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  70. package/dist/cjs/components/progress/CProgress.d.ts +2 -2
  71. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  72. package/dist/cjs/components/progress/CProgressBar.d.ts +2 -2
  73. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  74. package/dist/cjs/components/rating/CRating.js.map +1 -1
  75. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  76. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  77. package/dist/cjs/components/smart-table/CSmartTable.d.ts +6 -6
  78. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  79. package/dist/cjs/components/smart-table/CSmartTableBody.d.ts +2 -2
  80. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  81. package/dist/cjs/components/smart-table/CSmartTableHead.d.ts +4 -4
  82. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  83. package/dist/cjs/components/smart-table/utils.d.ts +4 -4
  84. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  85. package/dist/cjs/components/spinner/CSpinner.d.ts +2 -2
  86. package/dist/cjs/components/table/CTable.d.ts +4 -4
  87. package/dist/cjs/components/table/CTable.js.map +1 -1
  88. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  89. package/dist/cjs/components/tabs/CTab.d.ts +20 -0
  90. package/dist/cjs/components/tabs/CTab.js +41 -0
  91. package/dist/cjs/components/tabs/CTab.js.map +1 -0
  92. package/dist/cjs/components/tabs/CTabList.d.ts +42 -0
  93. package/dist/cjs/components/tabs/CTabList.js +74 -0
  94. package/dist/cjs/components/tabs/CTabList.js.map +1 -0
  95. package/dist/cjs/components/tabs/CTabPane.d.ts +19 -0
  96. package/dist/cjs/components/tabs/CTabPane.js +10 -1
  97. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  98. package/dist/cjs/components/tabs/CTabPanel.d.ts +55 -0
  99. package/dist/cjs/components/tabs/CTabPanel.js +93 -0
  100. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -0
  101. package/dist/cjs/components/tabs/CTabs.d.ts +22 -0
  102. package/dist/cjs/components/tabs/CTabs.js +43 -0
  103. package/dist/cjs/components/tabs/CTabs.js.map +1 -0
  104. package/dist/cjs/components/tabs/index.d.ts +5 -1
  105. package/dist/cjs/components/tabs/index.js +12 -0
  106. package/dist/cjs/components/tabs/index.js.map +1 -1
  107. package/dist/cjs/components/time-picker/CTimePicker.js +8 -0
  108. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  109. package/dist/cjs/components/time-picker/utils.d.ts +4 -4
  110. package/dist/cjs/components/tooltip/CTooltip.d.ts +4 -4
  111. package/dist/cjs/components/tooltip/CTooltip.js +3 -2
  112. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  113. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  114. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  115. package/dist/cjs/components/widgets/CWidgetStatsC.d.ts +0 -10
  116. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  117. package/dist/cjs/composables/index.d.ts +2 -1
  118. package/dist/cjs/composables/useUniqueId.d.ts +3 -0
  119. package/dist/cjs/composables/useUniqueId.js +20 -0
  120. package/dist/cjs/composables/useUniqueId.js.map +1 -0
  121. package/dist/cjs/directives/v-c-popover.js +4 -2
  122. package/dist/cjs/directives/v-c-popover.js.map +1 -1
  123. package/dist/cjs/directives/v-c-tooltip.js +4 -2
  124. package/dist/cjs/directives/v-c-tooltip.js.map +1 -1
  125. package/dist/cjs/index.js +10 -0
  126. package/dist/cjs/index.js.map +1 -1
  127. package/dist/cjs/node_modules/@coreui/icons-vue/dist/index.es.js +66 -0
  128. package/dist/cjs/node_modules/@coreui/icons-vue/dist/index.es.js.map +1 -1
  129. package/dist/cjs/node_modules/vue-types/dist/vue-types.modern.js +1 -1
  130. package/dist/cjs/node_modules/vue-types/dist/vue-types.modern.js.map +1 -1
  131. package/dist/cjs/utils/getNextActiveElement.d.ts +2 -0
  132. package/dist/cjs/utils/getNextActiveElement.js +19 -0
  133. package/dist/cjs/utils/getNextActiveElement.js.map +1 -0
  134. package/dist/cjs/utils/index.d.ts +2 -1
  135. package/dist/esm/components/alert/CAlert.d.ts +2 -2
  136. package/dist/esm/components/avatar/CAvatar.d.ts +2 -10
  137. package/dist/esm/components/badge/CBadge.d.ts +2 -2
  138. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  139. package/dist/esm/components/button/CButton.d.ts +2 -6
  140. package/dist/esm/components/button/CButton.js +2 -1
  141. package/dist/esm/components/button/CButton.js.map +1 -1
  142. package/dist/esm/components/calendar/CCalendar.d.ts +10 -10
  143. package/dist/esm/components/calendar/CCalendar.js +2 -2
  144. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  145. package/dist/esm/components/calendar/utils.d.ts +5 -4
  146. package/dist/esm/components/calendar/utils.js +13 -7
  147. package/dist/esm/components/calendar/utils.js.map +1 -1
  148. package/dist/esm/components/carousel/CCarousel.d.ts +2 -2
  149. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  150. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  151. package/dist/esm/components/conditional-teleport/CConditionalTeleport.d.ts +2 -2
  152. package/dist/esm/components/date-picker/CDatePicker.d.ts +16 -4
  153. package/dist/esm/components/date-picker/CDatePicker.js +8 -2
  154. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  155. package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +45 -13
  156. package/dist/esm/components/date-range-picker/CDateRangePicker.js +33 -10
  157. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  158. package/dist/esm/components/date-range-picker/utils.d.ts +1 -0
  159. package/dist/esm/components/date-range-picker/utils.js +10 -1
  160. package/dist/esm/components/date-range-picker/utils.js.map +1 -1
  161. package/dist/esm/components/dropdown/CDropdown.d.ts +5 -28
  162. package/dist/esm/components/dropdown/CDropdown.js +3 -1
  163. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  164. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  165. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  166. package/dist/esm/components/dropdown/utils.d.ts +0 -1
  167. package/dist/esm/components/dropdown/utils.js +1 -13
  168. package/dist/esm/components/dropdown/utils.js.map +1 -1
  169. package/dist/esm/components/footer/CFooter.d.ts +17 -1
  170. package/dist/esm/components/footer/CFooter.js +8 -1
  171. package/dist/esm/components/footer/CFooter.js.map +1 -1
  172. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  173. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  174. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  175. package/dist/esm/components/form/CFormInput.d.ts +63 -63
  176. package/dist/esm/components/form/CFormInput.js.map +1 -1
  177. package/dist/esm/components/form/CFormSelect.d.ts +2 -2
  178. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  179. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  180. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  181. package/dist/esm/components/index.js +4 -0
  182. package/dist/esm/components/index.js.map +1 -1
  183. package/dist/esm/components/link/CLink.js.map +1 -1
  184. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  185. package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
  186. package/dist/esm/components/modal/CModal.js.map +1 -1
  187. package/dist/esm/components/multi-select/CMultiSelect.d.ts +33 -2
  188. package/dist/esm/components/multi-select/CMultiSelect.js +25 -2
  189. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  190. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.d.ts +2 -0
  191. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +4 -2
  192. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  193. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  194. package/dist/esm/components/multi-select/CMultiSelectSelection.js +1 -0
  195. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  196. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  197. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  198. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  199. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  200. package/dist/esm/components/popover/CPopover.d.ts +4 -4
  201. package/dist/esm/components/popover/CPopover.js +3 -2
  202. package/dist/esm/components/popover/CPopover.js.map +1 -1
  203. package/dist/esm/components/progress/CProgress.d.ts +2 -2
  204. package/dist/esm/components/progress/CProgress.js.map +1 -1
  205. package/dist/esm/components/progress/CProgressBar.d.ts +2 -2
  206. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  207. package/dist/esm/components/rating/CRating.js.map +1 -1
  208. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  209. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  210. package/dist/esm/components/smart-table/CSmartTable.d.ts +6 -6
  211. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  212. package/dist/esm/components/smart-table/CSmartTableBody.d.ts +2 -2
  213. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  214. package/dist/esm/components/smart-table/CSmartTableHead.d.ts +4 -4
  215. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  216. package/dist/esm/components/smart-table/utils.d.ts +4 -4
  217. package/dist/esm/components/smart-table/utils.js.map +1 -1
  218. package/dist/esm/components/spinner/CSpinner.d.ts +2 -2
  219. package/dist/esm/components/table/CTable.d.ts +4 -4
  220. package/dist/esm/components/table/CTable.js.map +1 -1
  221. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  222. package/dist/esm/components/tabs/CTab.d.ts +20 -0
  223. package/dist/esm/components/tabs/CTab.js +39 -0
  224. package/dist/esm/components/tabs/CTab.js.map +1 -0
  225. package/dist/esm/components/tabs/CTabList.d.ts +42 -0
  226. package/dist/esm/components/tabs/CTabList.js +72 -0
  227. package/dist/esm/components/tabs/CTabList.js.map +1 -0
  228. package/dist/esm/components/tabs/CTabPane.d.ts +19 -0
  229. package/dist/esm/components/tabs/CTabPane.js +10 -1
  230. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  231. package/dist/esm/components/tabs/CTabPanel.d.ts +55 -0
  232. package/dist/esm/components/tabs/CTabPanel.js +91 -0
  233. package/dist/esm/components/tabs/CTabPanel.js.map +1 -0
  234. package/dist/esm/components/tabs/CTabs.d.ts +22 -0
  235. package/dist/esm/components/tabs/CTabs.js +41 -0
  236. package/dist/esm/components/tabs/CTabs.js.map +1 -0
  237. package/dist/esm/components/tabs/index.d.ts +5 -1
  238. package/dist/esm/components/tabs/index.js +9 -1
  239. package/dist/esm/components/tabs/index.js.map +1 -1
  240. package/dist/esm/components/time-picker/CTimePicker.js +8 -0
  241. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  242. package/dist/esm/components/time-picker/utils.d.ts +4 -4
  243. package/dist/esm/components/tooltip/CTooltip.d.ts +4 -4
  244. package/dist/esm/components/tooltip/CTooltip.js +3 -2
  245. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  246. package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  247. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  248. package/dist/esm/components/widgets/CWidgetStatsC.d.ts +0 -10
  249. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  250. package/dist/esm/composables/index.d.ts +2 -1
  251. package/dist/esm/composables/useUniqueId.d.ts +3 -0
  252. package/dist/esm/composables/useUniqueId.js +18 -0
  253. package/dist/esm/composables/useUniqueId.js.map +1 -0
  254. package/dist/esm/directives/v-c-popover.js +4 -2
  255. package/dist/esm/directives/v-c-popover.js.map +1 -1
  256. package/dist/esm/directives/v-c-tooltip.js +4 -2
  257. package/dist/esm/directives/v-c-tooltip.js.map +1 -1
  258. package/dist/esm/index.js +5 -0
  259. package/dist/esm/index.js.map +1 -1
  260. package/dist/esm/node_modules/@coreui/icons-vue/dist/index.es.js +67 -1
  261. package/dist/esm/node_modules/@coreui/icons-vue/dist/index.es.js.map +1 -1
  262. package/dist/esm/node_modules/vue-types/dist/vue-types.modern.js +1 -1
  263. package/dist/esm/node_modules/vue-types/dist/vue-types.modern.js.map +1 -1
  264. package/dist/esm/utils/getNextActiveElement.d.ts +2 -0
  265. package/dist/esm/utils/getNextActiveElement.js +15 -0
  266. package/dist/esm/utils/getNextActiveElement.js.map +1 -0
  267. package/dist/esm/utils/index.d.ts +2 -1
  268. package/package.json +8 -8
  269. package/src/components/button/CButton.ts +2 -1
  270. package/src/components/calendar/CCalendar.ts +2 -2
  271. package/src/components/calendar/utils.ts +23 -7
  272. package/src/components/date-picker/CDatePicker.ts +8 -2
  273. package/src/components/date-range-picker/CDateRangePicker.ts +40 -16
  274. package/src/components/date-range-picker/utils.ts +16 -0
  275. package/src/components/dropdown/CDropdown.ts +3 -2
  276. package/src/components/dropdown/utils.ts +0 -22
  277. package/src/components/footer/CFooter.ts +8 -1
  278. package/src/components/footer/__tests__/CFooter.spec.ts +19 -0
  279. package/src/components/multi-select/CMultiSelect.ts +31 -3
  280. package/src/components/multi-select/CMultiSelectNativeSelect.ts +4 -2
  281. package/src/components/multi-select/CMultiSelectSelection.ts +1 -0
  282. package/src/components/popover/CPopover.ts +4 -3
  283. package/src/components/tabs/CTab.ts +45 -0
  284. package/src/components/tabs/CTabList.ts +89 -0
  285. package/src/components/tabs/CTabPane.ts +10 -1
  286. package/src/components/tabs/CTabPanel.ts +129 -0
  287. package/src/components/tabs/CTabs.ts +45 -0
  288. package/src/components/tabs/index.ts +9 -1
  289. package/src/components/time-picker/CTimePicker.ts +8 -0
  290. package/src/components/tooltip/CTooltip.ts +4 -3
  291. package/src/composables/index.ts +2 -1
  292. package/src/composables/useUniqueId.ts +18 -0
  293. package/src/directives/v-c-popover.ts +3 -3
  294. package/src/directives/v-c-tooltip.ts +3 -3
  295. package/src/utils/getNextActiveElement.ts +23 -0
  296. package/src/utils/index.ts +2 -1
  297. package/dist/cjs/utils/getUID.js +0 -13
  298. package/dist/cjs/utils/getUID.js.map +0 -1
  299. package/dist/esm/utils/getUID.js +0 -9
  300. package/dist/esm/utils/getUID.js.map +0 -1
@@ -19,28 +19,6 @@ export const getAlignmentClassNames = (alignment: Alignments) => {
19
19
  return classNames
20
20
  }
21
21
 
22
- export const getNextActiveElement = (
23
- list: HTMLElement[],
24
- activeElement: HTMLElement,
25
- shouldGetNext: boolean,
26
- isCycleAllowed: boolean,
27
- ) => {
28
- const listLength = list.length
29
- let index = list.indexOf(activeElement)
30
-
31
- if (index === -1) {
32
- return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]
33
- }
34
-
35
- index += shouldGetNext ? 1 : -1
36
-
37
- if (isCycleAllowed) {
38
- index = (index + listLength) % listLength
39
- }
40
-
41
- return list[Math.max(0, Math.min(index, listLength - 1))]
42
- }
43
-
44
22
  export const getPlacement = (
45
23
  placement: Placement,
46
24
  direction: string | undefined,
@@ -3,6 +3,13 @@ import { defineComponent, h } from 'vue'
3
3
  const CFooter = defineComponent({
4
4
  name: 'CFooter',
5
5
  props: {
6
+ /**
7
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
+ */
9
+ as: {
10
+ type: String,
11
+ default: 'div',
12
+ },
6
13
  /**
7
14
  * Place footer in non-static positions.
8
15
  *
@@ -18,7 +25,7 @@ const CFooter = defineComponent({
18
25
  setup(props, { slots }) {
19
26
  return () =>
20
27
  h(
21
- 'div',
28
+ props.as,
22
29
  { class: ['footer', { [`footer-${props.position}`]: props.position }] },
23
30
  slots.default && slots.default(),
24
31
  )
@@ -19,6 +19,15 @@ const customWrapper = mount(Component, {
19
19
  },
20
20
  })
21
21
 
22
+ const customWrapperTwo = mount(Component, {
23
+ propsData: {
24
+ as: 'footer',
25
+ },
26
+ slots: {
27
+ default: 'Default slot',
28
+ },
29
+ })
30
+
22
31
  describe(`Loads and display ${ComponentName} component`, () => {
23
32
  it('has a name', () => {
24
33
  expect(Component.name).toMatch(ComponentName)
@@ -42,3 +51,13 @@ describe(`Customize ${ComponentName} component`, () => {
42
51
  expect(customWrapper.classes('footer-fixed')).toBe(true)
43
52
  })
44
53
  })
54
+
55
+ describe(`Customize (number two) ${ComponentName} component`, () => {
56
+ it('renders correctly', () => {
57
+ expect(customWrapperTwo.html()).toMatchSnapshot()
58
+ })
59
+
60
+ it('tag name is custom', () => {
61
+ expect(customWrapperTwo.element.tagName).toBe('FOOTER')
62
+ })
63
+ })
@@ -60,7 +60,10 @@ const CMultiSelect = defineComponent({
60
60
  */
61
61
  feedbackValid: String,
62
62
  /**
63
- * The id global attribute defines an identifier (ID) that must be unique in the whole document.
63
+ * Set the id attribute for the native select element.
64
+ *
65
+ * **[Deprecated since v5.3.0]** The name attribute for the native select element is generated based on the `id` property:
66
+ * - `<select name="\{id\}-multi-select" />`
64
67
  */
65
68
  id: String,
66
69
  /**
@@ -90,6 +93,12 @@ const CMultiSelect = defineComponent({
90
93
  type: Boolean,
91
94
  default: true,
92
95
  },
96
+ /**
97
+ * The name attribute for the select element.
98
+ *
99
+ * @since 5.3.0
100
+ */
101
+ name: String,
93
102
  /**
94
103
  * List of option elements.
95
104
  */
@@ -132,6 +141,12 @@ const CMultiSelect = defineComponent({
132
141
  * When it is present, it indicates that the user must choose a value before submitting the form.
133
142
  */
134
143
  required: Boolean,
144
+ /**
145
+ * Determines whether the selected options should be cleared when the options list is updated. When set to true, any previously selected options will be reset whenever the options list undergoes a change. This ensures that outdated selections are not retained when new options are provided.
146
+ *
147
+ * @since 5.3.0
148
+ */
149
+ resetSelectionOnOptionsChange: Boolean,
135
150
  /**
136
151
  * Enables search input element.
137
152
  */
@@ -298,7 +313,8 @@ const CMultiSelect = defineComponent({
298
313
  if (
299
314
  props.allowCreateOptions &&
300
315
  filteredOptions.value.some(
301
- (option) => option.label && option.label.toLowerCase() === searchValue.value.toLowerCase(),
316
+ (option) =>
317
+ option.label && option.label.toLowerCase() === searchValue.value.toLowerCase(),
302
318
  )
303
319
  ) {
304
320
  return false
@@ -312,6 +328,12 @@ const CMultiSelect = defineComponent({
312
328
  (newValue, oldValue) => {
313
329
  if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
314
330
  options.value = newValue
331
+
332
+ if (props.resetSelectionOnOptionsChange) {
333
+ selected.value = []
334
+ return
335
+ }
336
+
315
337
  const _selected = flattenedOptions.value.filter(
316
338
  (option: Option | OptionsGroup) => option.selected === true,
317
339
  )
@@ -355,6 +377,12 @@ const CMultiSelect = defineComponent({
355
377
 
356
378
  emit('hide')
357
379
 
380
+ searchValue.value = ''
381
+
382
+ if (searchRef.value) {
383
+ searchRef.value.value = ''
384
+ }
385
+
358
386
  window.removeEventListener('mouseup', handleMouseUp)
359
387
  window.removeEventListener('keyup', handleKeyUp)
360
388
 
@@ -505,6 +533,7 @@ const CMultiSelect = defineComponent({
505
533
  h(CMultiSelectNativeSelect, {
506
534
  id: props.id,
507
535
  multiple: props.multiple,
536
+ name: props.name,
508
537
  options: selected.value,
509
538
  required: props.required,
510
539
  value: props.multiple
@@ -542,7 +571,6 @@ const CMultiSelect = defineComponent({
542
571
  },
543
572
  ],
544
573
  'aria-expanded': visible.value,
545
- id: props.id,
546
574
  ref: multiSelectRef,
547
575
  },
548
576
  {
@@ -10,6 +10,7 @@ const CMultiSelectNativeSelect = defineComponent({
10
10
  type: Boolean,
11
11
  default: true,
12
12
  },
13
+ name: String,
13
14
  options: {
14
15
  type: Array as PropType<Option[]>,
15
16
  default: () => [],
@@ -38,8 +39,9 @@ const CMultiSelectNativeSelect = defineComponent({
38
39
  'select',
39
40
  {
40
41
  className: 'multi-select-new',
41
- ...(props.id && { id: `${props.id}-multi-select` }),
42
- ...(props.id && { name: `${props.id}-multi-select` }),
42
+ id: props.id,
43
+ ...(props.id && !props.name && { name: `${props.id}-multi-select` }), // TODO: remove in v6
44
+ ...(props.name && { name: props.name }), // TODO: change to `name: props.name` in v6
43
45
  multiple: props.multiple,
44
46
  tabIndex: '-1',
45
47
  style: { display: 'none' },
@@ -63,6 +63,7 @@ const CMultiSelectSelection = defineComponent({
63
63
  !option.disabled &&
64
64
  h('button', {
65
65
  class: 'form-multi-select-tag-delete',
66
+ type: 'button',
66
67
  ariaLabel: 'Close',
67
68
  onClick: () => handleRemove(option),
68
69
  }),
@@ -2,10 +2,10 @@ import { defineComponent, h, onMounted, PropType, ref, RendererElement, Transiti
2
2
  import type { Placement } from '@popperjs/core'
3
3
 
4
4
  import { CConditionalTeleport } from '../conditional-teleport'
5
- import { usePopper } from '../../composables'
5
+ import { useUniqueId, usePopper } from '../../composables'
6
6
  import type { Placements, Triggers } from '../../types'
7
7
  import { executeAfterTransition } from '../../utils/transition'
8
- import { getRTLPlacement, getUID } from '../../utils'
8
+ import { getRTLPlacement } from '../../utils'
9
9
 
10
10
  const CPopover = defineComponent({
11
11
  name: 'CPopover',
@@ -119,6 +119,7 @@ const CPopover = defineComponent({
119
119
  const popoverRef = ref()
120
120
  const uID = ref()
121
121
  const visible = ref(props.visible)
122
+ const { getUID } = useUniqueId('popover')
122
123
  const { initPopper, destroyPopper } = usePopper()
123
124
 
124
125
  const delay =
@@ -149,7 +150,7 @@ const CPopover = defineComponent({
149
150
  }
150
151
 
151
152
  onMounted(() => {
152
- uID.value = getUID('popover')
153
+ uID.value = getUID()
153
154
  })
154
155
 
155
156
  const handleEnter = (el: RendererElement, done: () => void) => {
@@ -0,0 +1,45 @@
1
+ import { defineComponent, h, inject, Ref } from 'vue'
2
+
3
+ const CTab = defineComponent({
4
+ name: 'CTab',
5
+ props: {
6
+ /**
7
+ * Item key.
8
+ */
9
+ itemKey: {
10
+ type: [Number, String],
11
+ required: true,
12
+ },
13
+ },
14
+ setup(props, { slots }) {
15
+ const activeItemKey = inject('activeItemKey') as Ref<number | string>
16
+ const id = inject('id') as Ref<number | string>
17
+ const setActiveItemKey = inject('setActiveItemKey') as (key: number | string) => void
18
+
19
+ const isActive = () => props.itemKey === activeItemKey.value
20
+
21
+ return () =>
22
+ h(
23
+ 'button',
24
+ {
25
+ class: [
26
+ 'nav-link',
27
+ {
28
+ active: isActive(),
29
+ },
30
+ ],
31
+ id: `${props.itemKey}-tab-${id.value}`,
32
+ role: 'tab',
33
+ tabindex: isActive() ? 0 : -1,
34
+ type: 'button',
35
+ 'aria-controls': `${props.itemKey}-tab-panel-${id.value}`,
36
+ 'aria-selected': isActive(),
37
+ onClick: () => setActiveItemKey(props.itemKey),
38
+ onFocus: () => setActiveItemKey(props.itemKey),
39
+ },
40
+ slots.default && slots.default(),
41
+ )
42
+ },
43
+ })
44
+
45
+ export { CTab }
@@ -0,0 +1,89 @@
1
+ import { defineComponent, h, ref } from 'vue'
2
+ import { getNextActiveElement } from '../../utils'
3
+
4
+ const CTabList = defineComponent({
5
+ name: 'CTabList',
6
+ props: {
7
+ /**
8
+ * Specify a layout type for component.
9
+ *
10
+ * @values 'fill', 'justified'
11
+ */
12
+ layout: {
13
+ type: String,
14
+ validator: (value: string) => {
15
+ return ['fill', 'justified'].includes(value)
16
+ },
17
+ },
18
+ /**
19
+ * Set the nav variant to tabs or pills.
20
+ *
21
+ * @values 'pills', 'tabs', 'underline', 'underline-border'
22
+ */
23
+ variant: {
24
+ type: String,
25
+ validator: (value: string) => {
26
+ return ['pills', 'tabs', 'underline', 'underline-border'].includes(value)
27
+ },
28
+ },
29
+ },
30
+ setup(props, { slots }) {
31
+ const tabListRef = ref<HTMLDivElement>()
32
+
33
+ const handleKeydown = (event: KeyboardEvent) => {
34
+ if (
35
+ tabListRef.value &&
36
+ (event.key === 'ArrowDown' ||
37
+ event.key === 'ArrowUp' ||
38
+ event.key === 'ArrowLeft' ||
39
+ event.key === 'ArrowRight' ||
40
+ event.key === 'Home' ||
41
+ event.key === 'End')
42
+ ) {
43
+ event.preventDefault()
44
+ const target = event.target as HTMLElement
45
+ // eslint-disable-next-line unicorn/prefer-spread
46
+ const items: HTMLElement[] = Array.from(
47
+ tabListRef.value.querySelectorAll('.nav-link:not(.disabled):not(:disabled)'),
48
+ )
49
+
50
+ let nextActiveElement
51
+
52
+ if (event.key === 'Home' || event.key === 'End') {
53
+ nextActiveElement = event.key === 'End' ? items.at(-1) : items[0]
54
+ } else {
55
+ nextActiveElement = getNextActiveElement(
56
+ items,
57
+ target,
58
+ event.key === 'ArrowDown' || event.key === 'ArrowRight',
59
+ true,
60
+ )
61
+ }
62
+
63
+ if (nextActiveElement) {
64
+ nextActiveElement.focus({ preventScroll: true })
65
+ }
66
+ }
67
+ }
68
+
69
+ return () =>
70
+ h(
71
+ 'div',
72
+ {
73
+ class: [
74
+ 'nav',
75
+ {
76
+ [`nav-${props.layout}`]: props.layout,
77
+ [`nav-${props.variant}`]: props.variant,
78
+ },
79
+ ],
80
+ role: 'tablist',
81
+ onKeydown: (event) => handleKeydown(event),
82
+ ref: tabListRef,
83
+ },
84
+ slots.default && slots.default(),
85
+ )
86
+ },
87
+ })
88
+
89
+ export { CTabList }
@@ -5,6 +5,15 @@ import { executeAfterTransition } from '../../utils/transition'
5
5
  const CTabPane = defineComponent({
6
6
  name: 'CTabPane',
7
7
  props: {
8
+ /**
9
+ * Enable fade in and fade out transition.
10
+ *
11
+ * @since 5.1.0
12
+ */
13
+ transition: {
14
+ type: Boolean,
15
+ default: true,
16
+ },
8
17
  /**
9
18
  * Toggle the visibility of component.
10
19
  */
@@ -57,9 +66,9 @@ const CTabPane = defineComponent({
57
66
  {
58
67
  class: [
59
68
  'tab-pane',
60
- 'fade',
61
69
  {
62
70
  active: props.visible,
71
+ fade: props.transition,
63
72
  show: firstRender.value && props.visible,
64
73
  },
65
74
  ],
@@ -0,0 +1,129 @@
1
+ import {
2
+ defineComponent,
3
+ h,
4
+ inject,
5
+ ref,
6
+ Ref,
7
+ RendererElement,
8
+ Transition,
9
+ vShow,
10
+ watch,
11
+ withDirectives,
12
+ } from 'vue'
13
+
14
+ import { executeAfterTransition } from '../../utils/transition'
15
+
16
+ const CTabPanel = defineComponent({
17
+ name: 'CTabPanel',
18
+ props: {
19
+ /**
20
+ * Item key.
21
+ */
22
+ itemKey: {
23
+ type: [Number, String],
24
+ required: true,
25
+ },
26
+ /**
27
+ * Enable fade in and fade out transition.
28
+ */
29
+ transition: {
30
+ type: Boolean,
31
+ default: true,
32
+ },
33
+ /**
34
+ * Toggle the visibility of component.
35
+ */
36
+ visible: {
37
+ type: Boolean,
38
+ default: false,
39
+ },
40
+ },
41
+ emits: [
42
+ /**
43
+ * Callback fired when the component requests to be hidden.
44
+ */
45
+ 'hide',
46
+ /**
47
+ * Callback fired when the component requests to be shown.
48
+ */
49
+ 'show',
50
+ ],
51
+ setup(props, { slots, emit }) {
52
+ const activeItemKey = inject('activeItemKey') as Ref<number | string>
53
+ const id = inject('id') as Ref<number | string>
54
+
55
+ const tabPaneRef = ref()
56
+ const firstRender = ref(true)
57
+ const visible = ref()
58
+
59
+ watch(
60
+ () => props.visible,
61
+ () => {
62
+ visible.value = props.visible
63
+ },
64
+ {
65
+ immediate: true,
66
+ },
67
+ )
68
+
69
+ watch(
70
+ activeItemKey,
71
+ () => {
72
+ visible.value = Boolean(activeItemKey.value === props.itemKey)
73
+ },
74
+ {
75
+ immediate: true,
76
+ },
77
+ )
78
+
79
+ const handleEnter = (el: RendererElement, done: () => void) => {
80
+ firstRender.value = false
81
+ emit('show')
82
+ setTimeout(() => {
83
+ executeAfterTransition(() => done(), el as HTMLElement)
84
+ el.classList.add('show')
85
+ }, 1)
86
+ }
87
+
88
+ const handleLeave = (el: RendererElement, done: () => void) => {
89
+ firstRender.value = false
90
+ emit('hide')
91
+ el.classList.remove('show')
92
+ executeAfterTransition(() => done(), el as HTMLElement)
93
+ }
94
+
95
+ return () =>
96
+ h(
97
+ Transition,
98
+ {
99
+ onEnter: (el, done) => handleEnter(el, done),
100
+ onLeave: (el, done) => handleLeave(el, done),
101
+ },
102
+ () =>
103
+ withDirectives(
104
+ h(
105
+ 'div',
106
+ {
107
+ class: [
108
+ 'tab-pane',
109
+ {
110
+ active: visible.value,
111
+ fade: props.transition,
112
+ show: firstRender.value && visible.value,
113
+ },
114
+ ],
115
+ id: `${props.itemKey}-tab-panel-${id.value}`,
116
+ role: 'tabpanel',
117
+ 'aria-labelledby': `${props.itemKey}-tab-${id.value}`,
118
+ tabindex: 0,
119
+ ref: tabPaneRef,
120
+ },
121
+ slots.default && slots.default(),
122
+ ),
123
+ [[vShow, visible.value]],
124
+ ),
125
+ )
126
+ },
127
+ })
128
+
129
+ export { CTabPanel }
@@ -0,0 +1,45 @@
1
+ import { defineComponent, h, provide, ref, watch } from 'vue'
2
+ import { useUniqueId } from '../../composables'
3
+
4
+ const CTabs = defineComponent({
5
+ name: 'CTabs',
6
+ props: {
7
+ /**
8
+ * The active item key.
9
+ */
10
+ activeItemKey: {
11
+ type: [Number, String],
12
+ required: true,
13
+ }
14
+ },
15
+ emits: [
16
+ /**
17
+ * The callback is fired when the active tab changes.
18
+ */
19
+ 'change',
20
+ ],
21
+ setup(props, { slots, emit }) {
22
+ const { getUID } = useUniqueId()
23
+ const uID = ref(getUID())
24
+ const activeItemKey = ref(props.activeItemKey)
25
+ const setActiveItemKey = (key: string | number) => {
26
+ activeItemKey.value = key
27
+ }
28
+
29
+ watch(
30
+ () => props.activeItemKey,
31
+ (value) => {
32
+ activeItemKey.value = value
33
+ emit('change', value)
34
+ },
35
+ )
36
+
37
+ provide('activeItemKey', activeItemKey)
38
+ provide('id', uID)
39
+ provide('setActiveItemKey', setActiveItemKey)
40
+
41
+ return () => h('div', { class: 'tabs' }, slots.default && slots.default())
42
+ },
43
+ })
44
+
45
+ export { CTabs }
@@ -1,12 +1,20 @@
1
1
  import { App } from 'vue'
2
+ import { CTab } from './CTab'
2
3
  import { CTabContent } from './CTabContent'
4
+ import { CTabList } from './CTabList'
3
5
  import { CTabPane } from './CTabPane'
6
+ import { CTabPanel } from './CTabPanel'
7
+ import { CTabs } from './CTabs'
4
8
 
5
9
  const CTabsPlugin = {
6
10
  install: (app: App): void => {
11
+ app.component(CTab.name as string, CTab)
7
12
  app.component(CTabContent.name as string, CTabContent)
13
+ app.component(CTabList.name as string, CTabList)
8
14
  app.component(CTabPane.name as string, CTabPane)
15
+ app.component(CTabPanel.name as string, CTabPanel)
16
+ app.component(CTabs.name as string, CTabs)
9
17
  },
10
18
  }
11
19
 
12
- export { CTabsPlugin, CTabContent, CTabPane }
20
+ export { CTabsPlugin, CTab, CTabContent, CTabList, CTabPane, CTabPanel, CTabs }
@@ -213,6 +213,12 @@ const CTimePicker = defineComponent({
213
213
  >,
214
214
  default: true,
215
215
  },
216
+ /**
217
+ * Set the name attribute for the input element.
218
+ *
219
+ * @since 5.3.0
220
+ */
221
+ name: String,
216
222
  /**
217
223
  * Specifies a short hint that is visible in the input.
218
224
  */
@@ -436,6 +442,8 @@ const CTimePicker = defineComponent({
436
442
  autocomplete: 'off',
437
443
  class: 'time-picker-input',
438
444
  disabled: props.disabled,
445
+ id: props.id,
446
+ name: props.name,
439
447
  onInput: (event: Event) =>
440
448
  useDebouncedCallback(() => {
441
449
  if (isValidTime((event.target as HTMLInputElement).value)) {
@@ -2,10 +2,10 @@ import { defineComponent, h, onMounted, PropType, ref, RendererElement, Transiti
2
2
  import type { Placement } from '@popperjs/core'
3
3
 
4
4
  import { CConditionalTeleport } from '../conditional-teleport'
5
- import { usePopper } from '../../composables'
5
+ import { useUniqueId, usePopper } from '../../composables'
6
6
  import type { Placements, Triggers } from '../../types'
7
7
  import { executeAfterTransition } from '../../utils/transition'
8
- import { getRTLPlacement, getUID } from '../../utils'
8
+ import { getRTLPlacement } from '../../utils'
9
9
 
10
10
  const CTooltip = defineComponent({
11
11
  name: 'CTooltip',
@@ -115,6 +115,7 @@ const CTooltip = defineComponent({
115
115
  const tooltipRef = ref()
116
116
  const uID = ref()
117
117
  const visible = ref(props.visible)
118
+ const { getUID } = useUniqueId('popover')
118
119
  const { initPopper, destroyPopper } = usePopper()
119
120
 
120
121
  const delay =
@@ -145,7 +146,7 @@ const CTooltip = defineComponent({
145
146
  }
146
147
 
147
148
  onMounted(() => {
148
- uID.value = getUID('tooltip')
149
+ uID.value = getUID()
149
150
  })
150
151
 
151
152
  const handleEnter = (el: RendererElement, done: () => void) => {
@@ -2,5 +2,6 @@ import { useColorModes } from './useColorModes'
2
2
  import { useDebouncedCallback } from './useDebouncedCallback'
3
3
  import { useIsVisible } from './useIsVisible'
4
4
  import { usePopper } from './usePopper'
5
+ import { useUniqueId } from './useUniqueId'
5
6
 
6
- export { useColorModes, useDebouncedCallback, useIsVisible, usePopper }
7
+ export { useColorModes, useDebouncedCallback, useIsVisible, usePopper, useUniqueId }
@@ -0,0 +1,18 @@
1
+ import { ref } from 'vue'
2
+
3
+ export const useUniqueId = (prefix: string = '') => {
4
+ const ids = ref<string[]>([])
5
+
6
+ const getUID = () => {
7
+ do {
8
+ prefix += Math.floor(Math.random() * 1_000_000)
9
+ } while (ids.value.includes(prefix))
10
+
11
+ ids.value.push(prefix)
12
+ return prefix
13
+ }
14
+
15
+ return {
16
+ getUID,
17
+ }
18
+ }