@coreui/vue-pro 5.17.1 → 5.19.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 (492) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/autocomplete/CAutocomplete.js +43 -17
  3. package/dist/cjs/components/autocomplete/CAutocomplete.js.map +1 -1
  4. package/dist/cjs/components/autocomplete/CAutocompleteOptions.js +1 -1
  5. package/dist/cjs/components/autocomplete/CAutocompleteOptions.js.map +1 -1
  6. package/dist/cjs/components/autocomplete/utils.d.ts +1 -1
  7. package/dist/cjs/components/autocomplete/utils.js.map +1 -1
  8. package/dist/cjs/components/calendar/CCalendar.d.ts +50 -4
  9. package/dist/cjs/components/calendar/CCalendar.js +146 -40
  10. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  11. package/dist/cjs/components/calendar/types.d.ts +2 -2
  12. package/dist/cjs/components/calendar/utils.d.ts +29 -4
  13. package/dist/cjs/components/calendar/utils.js +120 -6
  14. package/dist/cjs/components/calendar/utils.js.map +1 -1
  15. package/dist/cjs/components/carousel/CCarousel.d.ts +24 -2
  16. package/dist/cjs/components/carousel/CCarousel.js +51 -14
  17. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  18. package/dist/cjs/components/carousel/CCarouselItem.js +3 -3
  19. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  20. package/dist/cjs/components/chip/CChip.d.ts +253 -0
  21. package/dist/cjs/components/chip/CChip.js +314 -0
  22. package/dist/cjs/components/chip/CChip.js.map +1 -0
  23. package/dist/cjs/components/chip/const.d.ts +1 -0
  24. package/dist/cjs/components/chip/const.js +8 -0
  25. package/dist/cjs/components/chip/const.js.map +1 -0
  26. package/dist/cjs/components/chip/index.d.ts +6 -0
  27. package/dist/cjs/components/chip/index.js +13 -0
  28. package/dist/cjs/components/chip/index.js.map +1 -0
  29. package/dist/cjs/components/chip-input/CChipInput.d.ts +233 -0
  30. package/dist/cjs/components/chip-input/CChipInput.js +424 -0
  31. package/dist/cjs/components/chip-input/CChipInput.js.map +1 -0
  32. package/dist/cjs/components/chip-input/index.d.ts +6 -0
  33. package/dist/cjs/components/chip-input/index.js +13 -0
  34. package/dist/cjs/components/chip-input/index.js.map +1 -0
  35. package/dist/cjs/components/chip-set/CChipSet.d.ts +145 -0
  36. package/dist/cjs/components/chip-set/CChipSet.js +127 -0
  37. package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
  38. package/dist/cjs/components/chip-set/buildChips.d.ts +13 -0
  39. package/dist/cjs/components/chip-set/buildChips.js +19 -0
  40. package/dist/cjs/components/chip-set/buildChips.js.map +1 -0
  41. package/dist/cjs/components/chip-set/index.d.ts +2 -0
  42. package/dist/cjs/components/chip-set/useChipSet.d.ts +42 -0
  43. package/dist/cjs/components/chip-set/useChipSet.js +115 -0
  44. package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
  45. package/dist/cjs/components/collapse/CCollapse.js +2 -2
  46. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  47. package/dist/cjs/components/date-picker/CDatePicker.d.ts +51 -5
  48. package/dist/cjs/components/date-picker/CDatePicker.js +54 -3
  49. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  50. package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +52 -6
  51. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +46 -6
  52. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  53. package/dist/cjs/components/dropdown/CDropdown.d.ts +24 -1
  54. package/dist/cjs/components/dropdown/CDropdown.js +35 -18
  55. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  56. package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
  57. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  58. package/dist/cjs/components/focus-trap/CFocusTrap.js +4 -1
  59. package/dist/cjs/components/focus-trap/CFocusTrap.js.map +1 -1
  60. package/dist/cjs/components/form/CFormInput.d.ts +3 -0
  61. package/dist/cjs/components/form/CFormRange.d.ts +2 -2
  62. package/dist/cjs/components/form/CFormRange.js +2 -2
  63. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  64. package/dist/cjs/components/grid/CContainer.js +3 -1
  65. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  66. package/dist/cjs/components/index.d.ts +4 -0
  67. package/dist/cjs/components/index.js +140 -126
  68. package/dist/cjs/components/index.js.map +1 -1
  69. package/dist/cjs/components/modal/CModal.js +3 -2
  70. package/dist/cjs/components/modal/CModal.js.map +1 -1
  71. package/dist/cjs/components/modal/CModalHeader.js +6 -3
  72. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  73. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +206 -3
  74. package/dist/cjs/components/multi-select/CMultiSelect.js +307 -30
  75. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  76. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -2
  77. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  78. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +16 -1
  79. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +60 -4
  80. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  81. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +9 -0
  82. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +6 -1
  83. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  84. package/dist/cjs/components/multi-select/utils.js +1 -4
  85. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  86. package/dist/cjs/components/nav/CNav.js +8 -1
  87. package/dist/cjs/components/nav/CNav.js.map +1 -1
  88. package/dist/cjs/components/nav/CNavGroup.d.ts +15 -7
  89. package/dist/cjs/components/nav/CNavGroup.js +113 -88
  90. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  91. package/dist/cjs/components/nav/CNavLink.js +11 -0
  92. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  93. package/dist/cjs/components/popover/CPopover.d.ts +24 -1
  94. package/dist/cjs/components/popover/CPopover.js +18 -1
  95. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  96. package/dist/cjs/components/range-slider/CRangeSlider.d.ts +1 -1
  97. package/dist/cjs/components/search-button/CSearchButton.d.ts +63 -0
  98. package/dist/cjs/components/search-button/CSearchButton.js +125 -0
  99. package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
  100. package/dist/cjs/components/search-button/index.d.ts +6 -0
  101. package/dist/cjs/components/search-button/index.js +13 -0
  102. package/dist/cjs/components/search-button/index.js.map +1 -0
  103. package/dist/cjs/components/search-button/types.d.ts +10 -0
  104. package/dist/cjs/components/search-button/utils.d.ts +11 -0
  105. package/dist/cjs/components/search-button/utils.js +114 -0
  106. package/dist/cjs/components/search-button/utils.js.map +1 -0
  107. package/dist/cjs/components/sidebar/CSidebar.js +4 -3
  108. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  109. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +32 -0
  110. package/dist/cjs/components/sidebar/CSidebarNav.js +28 -24
  111. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  112. package/dist/cjs/components/smart-table/CSmartTable.d.ts +1 -1
  113. package/dist/cjs/components/smart-table/CSmartTableBody.d.ts +1 -1
  114. package/dist/cjs/components/smart-table/CSmartTableHead.d.ts +1 -1
  115. package/dist/cjs/components/spinner/CSpinner.d.ts +4 -4
  116. package/dist/cjs/components/spinner/CSpinner.js +2 -2
  117. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  118. package/dist/cjs/components/table/utils.js +4 -4
  119. package/dist/cjs/components/table/utils.js.map +1 -1
  120. package/dist/cjs/components/tabs/CTabList.js +8 -2
  121. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  122. package/dist/cjs/components/tabs/CTabs.js +1 -1
  123. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  124. package/dist/cjs/components/toast/CToast.js +12 -2
  125. package/dist/cjs/components/toast/CToast.js.map +1 -1
  126. package/dist/cjs/components/toast/CToastClose.d.ts +3 -2
  127. package/dist/cjs/components/toast/CToastClose.js +2 -3
  128. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  129. package/dist/cjs/components/tooltip/CTooltip.d.ts +24 -1
  130. package/dist/cjs/components/tooltip/CTooltip.js +18 -1
  131. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  132. package/dist/cjs/directives/v-c-popover.js +6 -3
  133. package/dist/cjs/directives/v-c-popover.js.map +1 -1
  134. package/dist/cjs/directives/v-c-tooltip.js +6 -3
  135. package/dist/cjs/directives/v-c-tooltip.js.map +1 -1
  136. package/dist/cjs/directives/v-c-visible.js +1 -1
  137. package/dist/cjs/directives/v-c-visible.js.map +1 -1
  138. package/dist/cjs/index.js +158 -144
  139. package/dist/cjs/index.js.map +1 -1
  140. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  141. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  142. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  143. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  144. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  145. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  146. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  147. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  148. package/dist/cjs/utils/index.d.ts +2 -1
  149. package/dist/cjs/utils/swipe.d.ts +26 -0
  150. package/dist/cjs/utils/swipe.js +94 -0
  151. package/dist/cjs/utils/swipe.js.map +1 -0
  152. package/dist/cjs/utils/transition.js.map +1 -1
  153. package/dist/esm/components/autocomplete/CAutocomplete.js +45 -19
  154. package/dist/esm/components/autocomplete/CAutocomplete.js.map +1 -1
  155. package/dist/esm/components/autocomplete/CAutocompleteOptions.js +2 -2
  156. package/dist/esm/components/autocomplete/utils.d.ts +1 -1
  157. package/dist/esm/components/autocomplete/utils.js.map +1 -1
  158. package/dist/esm/components/calendar/CCalendar.d.ts +50 -4
  159. package/dist/esm/components/calendar/CCalendar.js +147 -41
  160. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  161. package/dist/esm/components/calendar/types.d.ts +2 -2
  162. package/dist/esm/components/calendar/utils.d.ts +29 -4
  163. package/dist/esm/components/calendar/utils.js +118 -7
  164. package/dist/esm/components/calendar/utils.js.map +1 -1
  165. package/dist/esm/components/carousel/CCarousel.d.ts +24 -2
  166. package/dist/esm/components/carousel/CCarousel.js +52 -15
  167. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  168. package/dist/esm/components/carousel/CCarouselItem.js +3 -3
  169. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  170. package/dist/esm/components/chip/CChip.d.ts +253 -0
  171. package/dist/esm/components/chip/CChip.js +312 -0
  172. package/dist/esm/components/chip/CChip.js.map +1 -0
  173. package/dist/esm/components/chip/const.d.ts +1 -0
  174. package/dist/esm/components/chip/const.js +6 -0
  175. package/dist/esm/components/chip/const.js.map +1 -0
  176. package/dist/esm/components/chip/index.d.ts +6 -0
  177. package/dist/esm/components/chip/index.js +10 -0
  178. package/dist/esm/components/chip/index.js.map +1 -0
  179. package/dist/esm/components/chip-input/CChipInput.d.ts +233 -0
  180. package/dist/esm/components/chip-input/CChipInput.js +422 -0
  181. package/dist/esm/components/chip-input/CChipInput.js.map +1 -0
  182. package/dist/esm/components/chip-input/index.d.ts +6 -0
  183. package/dist/esm/components/chip-input/index.js +10 -0
  184. package/dist/esm/components/chip-input/index.js.map +1 -0
  185. package/dist/esm/components/chip-set/CChipSet.d.ts +145 -0
  186. package/dist/esm/components/chip-set/CChipSet.js +125 -0
  187. package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
  188. package/dist/esm/components/chip-set/buildChips.d.ts +13 -0
  189. package/dist/esm/components/chip-set/buildChips.js +17 -0
  190. package/dist/esm/components/chip-set/buildChips.js.map +1 -0
  191. package/dist/esm/components/chip-set/index.d.ts +2 -0
  192. package/dist/esm/components/chip-set/useChipSet.d.ts +42 -0
  193. package/dist/esm/components/chip-set/useChipSet.js +112 -0
  194. package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
  195. package/dist/esm/components/collapse/CCollapse.js +2 -2
  196. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  197. package/dist/esm/components/date-picker/CDatePicker.d.ts +51 -5
  198. package/dist/esm/components/date-picker/CDatePicker.js +54 -3
  199. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  200. package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +52 -6
  201. package/dist/esm/components/date-range-picker/CDateRangePicker.js +46 -6
  202. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  203. package/dist/esm/components/dropdown/CDropdown.d.ts +24 -1
  204. package/dist/esm/components/dropdown/CDropdown.js +35 -18
  205. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  206. package/dist/esm/components/dropdown/CDropdownToggle.js +2 -2
  207. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  208. package/dist/esm/components/focus-trap/CFocusTrap.js +4 -1
  209. package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -1
  210. package/dist/esm/components/form/CFormInput.d.ts +3 -0
  211. package/dist/esm/components/form/CFormRange.d.ts +2 -2
  212. package/dist/esm/components/form/CFormRange.js +2 -2
  213. package/dist/esm/components/form/CFormRange.js.map +1 -1
  214. package/dist/esm/components/grid/CContainer.js +3 -1
  215. package/dist/esm/components/grid/CContainer.js.map +1 -1
  216. package/dist/esm/components/index.d.ts +4 -0
  217. package/dist/esm/components/index.js +23 -16
  218. package/dist/esm/components/index.js.map +1 -1
  219. package/dist/esm/components/modal/CModal.js +3 -2
  220. package/dist/esm/components/modal/CModal.js.map +1 -1
  221. package/dist/esm/components/modal/CModalHeader.js +6 -3
  222. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  223. package/dist/esm/components/multi-select/CMultiSelect.d.ts +206 -3
  224. package/dist/esm/components/multi-select/CMultiSelect.js +308 -31
  225. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  226. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -2
  227. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  228. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +16 -1
  229. package/dist/esm/components/multi-select/CMultiSelectOptions.js +60 -4
  230. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  231. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +9 -0
  232. package/dist/esm/components/multi-select/CMultiSelectSelection.js +6 -1
  233. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  234. package/dist/esm/components/multi-select/utils.js +1 -4
  235. package/dist/esm/components/multi-select/utils.js.map +1 -1
  236. package/dist/esm/components/nav/CNav.js +8 -1
  237. package/dist/esm/components/nav/CNav.js.map +1 -1
  238. package/dist/esm/components/nav/CNavGroup.d.ts +15 -7
  239. package/dist/esm/components/nav/CNavGroup.js +114 -89
  240. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  241. package/dist/esm/components/nav/CNavLink.js +12 -1
  242. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  243. package/dist/esm/components/popover/CPopover.d.ts +24 -1
  244. package/dist/esm/components/popover/CPopover.js +18 -1
  245. package/dist/esm/components/popover/CPopover.js.map +1 -1
  246. package/dist/esm/components/range-slider/CRangeSlider.d.ts +1 -1
  247. package/dist/esm/components/search-button/CSearchButton.d.ts +63 -0
  248. package/dist/esm/components/search-button/CSearchButton.js +123 -0
  249. package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
  250. package/dist/esm/components/search-button/index.d.ts +6 -0
  251. package/dist/esm/components/search-button/index.js +10 -0
  252. package/dist/esm/components/search-button/index.js.map +1 -0
  253. package/dist/esm/components/search-button/types.d.ts +10 -0
  254. package/dist/esm/components/search-button/utils.d.ts +11 -0
  255. package/dist/esm/components/search-button/utils.js +103 -0
  256. package/dist/esm/components/search-button/utils.js.map +1 -0
  257. package/dist/esm/components/sidebar/CSidebar.js +4 -3
  258. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  259. package/dist/esm/components/sidebar/CSidebarNav.d.ts +32 -0
  260. package/dist/esm/components/sidebar/CSidebarNav.js +29 -25
  261. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  262. package/dist/esm/components/smart-table/CSmartTable.d.ts +1 -1
  263. package/dist/esm/components/smart-table/CSmartTableBody.d.ts +1 -1
  264. package/dist/esm/components/smart-table/CSmartTableHead.d.ts +1 -1
  265. package/dist/esm/components/smart-table/CSmartTableHead.js +1 -1
  266. package/dist/esm/components/spinner/CSpinner.d.ts +4 -4
  267. package/dist/esm/components/spinner/CSpinner.js +2 -2
  268. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  269. package/dist/esm/components/table/utils.js +4 -4
  270. package/dist/esm/components/table/utils.js.map +1 -1
  271. package/dist/esm/components/tabs/CTabList.js +8 -2
  272. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  273. package/dist/esm/components/tabs/CTabs.js +1 -1
  274. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  275. package/dist/esm/components/time-picker/CTimePicker.js +1 -1
  276. package/dist/esm/components/toast/CToast.js +12 -2
  277. package/dist/esm/components/toast/CToast.js.map +1 -1
  278. package/dist/esm/components/toast/CToastClose.d.ts +3 -2
  279. package/dist/esm/components/toast/CToastClose.js +2 -3
  280. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  281. package/dist/esm/components/tooltip/CTooltip.d.ts +24 -1
  282. package/dist/esm/components/tooltip/CTooltip.js +18 -1
  283. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  284. package/dist/esm/directives/v-c-popover.js +6 -3
  285. package/dist/esm/directives/v-c-popover.js.map +1 -1
  286. package/dist/esm/directives/v-c-tooltip.js +6 -3
  287. package/dist/esm/directives/v-c-tooltip.js.map +1 -1
  288. package/dist/esm/directives/v-c-visible.js +1 -1
  289. package/dist/esm/directives/v-c-visible.js.map +1 -1
  290. package/dist/esm/index.js +67 -60
  291. package/dist/esm/index.js.map +1 -1
  292. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  293. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  294. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  295. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  296. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  297. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  298. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  299. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  300. package/dist/esm/utils/index.d.ts +2 -1
  301. package/dist/esm/utils/swipe.d.ts +26 -0
  302. package/dist/esm/utils/swipe.js +90 -0
  303. package/dist/esm/utils/swipe.js.map +1 -0
  304. package/dist/esm/utils/transition.js.map +1 -1
  305. package/package.json +9 -9
  306. package/src/components/accordion/CAccordion.ts +2 -2
  307. package/src/components/accordion/CAccordionBody.ts +1 -1
  308. package/src/components/accordion/CAccordionButton.ts +1 -1
  309. package/src/components/accordion/CAccordionHeader.ts +2 -2
  310. package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap +1 -1
  311. package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap +1 -1
  312. package/src/components/alert/CAlert.ts +3 -3
  313. package/src/components/alert/CAlertHeading.ts +1 -1
  314. package/src/components/alert/CAlertLink.ts +1 -1
  315. package/src/components/autocomplete/CAutocomplete.ts +71 -34
  316. package/src/components/autocomplete/__tests__/CAutocomplete.spec.ts +48 -2
  317. package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.ts +8 -5
  318. package/src/components/autocomplete/utils.ts +2 -2
  319. package/src/components/avatar/CAvatar.ts +1 -1
  320. package/src/components/backdrop/CBackdrop.ts +1 -1
  321. package/src/components/badge/CBadge.ts +1 -1
  322. package/src/components/breadcrumb/CBreadcrumb.ts +1 -1
  323. package/src/components/breadcrumb/CBreadcrumbItem.ts +1 -1
  324. package/src/components/button/CButton.ts +1 -1
  325. package/src/components/button/__tests__/CButton.spec.ts +0 -1
  326. package/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap +1 -1
  327. package/src/components/button-group/CButtonGroup.ts +1 -1
  328. package/src/components/calendar/CCalendar.ts +170 -37
  329. package/src/components/calendar/types.ts +2 -2
  330. package/src/components/calendar/utils.ts +150 -7
  331. package/src/components/callout/CCallout.ts +1 -1
  332. package/src/components/card/CCard.ts +1 -1
  333. package/src/components/card/CCardImage.ts +1 -1
  334. package/src/components/card/CCardLink.ts +1 -1
  335. package/src/components/carousel/CCarousel.ts +61 -22
  336. package/src/components/carousel/CCarouselCaption.ts +1 -1
  337. package/src/components/carousel/CCarouselItem.ts +5 -4
  338. package/src/components/carousel/__tests__/CCarousel.spec.ts +1 -1
  339. package/src/components/chip/CChip.ts +361 -0
  340. package/src/components/chip/__tests__/CChip.spec.ts +391 -0
  341. package/src/components/chip/__tests__/__snapshots__/CChip.spec.ts.snap +5 -0
  342. package/src/components/chip/const.ts +3 -0
  343. package/src/components/chip/index.ts +10 -0
  344. package/src/components/chip-input/CChipInput.ts +503 -0
  345. package/src/components/chip-input/__tests__/CChipInput.spec.ts +443 -0
  346. package/src/components/chip-input/__tests__/__snapshots__/CChipInput.spec.ts.snap +3 -0
  347. package/src/components/chip-input/index.ts +10 -0
  348. package/src/components/chip-set/CChipSet.ts +140 -0
  349. package/src/components/chip-set/__tests__/CChipSet.spec.ts +174 -0
  350. package/src/components/chip-set/buildChips.ts +29 -0
  351. package/src/components/chip-set/index.ts +3 -0
  352. package/src/components/chip-set/useChipSet.ts +168 -0
  353. package/src/components/collapse/CCollapse.ts +5 -5
  354. package/src/components/collapse/__tests__/CCollapse.spec.ts +48 -0
  355. package/src/components/collapse/__tests__/__snapshots__/CCollapse.spec.ts.snap +7 -0
  356. package/src/components/conditional-teleport/CConditionalTeleport.ts +3 -3
  357. package/src/components/conditional-teleport/__tests__/CConditionalTeleport.spec.ts +28 -0
  358. package/src/components/date-picker/CDatePicker.ts +73 -13
  359. package/src/components/date-range-picker/CDateRangePicker.ts +53 -7
  360. package/src/components/dropdown/CDropdown.ts +44 -24
  361. package/src/components/dropdown/CDropdownHeader.ts +1 -1
  362. package/src/components/dropdown/CDropdownItem.ts +1 -1
  363. package/src/components/dropdown/CDropdownMenu.ts +2 -2
  364. package/src/components/dropdown/CDropdownToggle.ts +4 -4
  365. package/src/components/dropdown/__tests__/CDropdown.spec.ts +1 -1
  366. package/src/components/dropdown/__tests__/CDropdownMenu.spec.ts +11 -7
  367. package/src/components/dropdown/__tests__/CDropdownPopperConfig.spec.ts +63 -0
  368. package/src/components/dropdown/__tests__/CDropdownToggle.spec.ts +0 -2
  369. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap +1 -1
  370. package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap +4 -0
  371. package/src/components/dropdown/utils.ts +2 -2
  372. package/src/components/focus-trap/CFocusTrap.ts +9 -6
  373. package/src/components/focus-trap/__tests__/CFocusTrap.spec.ts +42 -0
  374. package/src/components/footer/CFooter.ts +1 -1
  375. package/src/components/footer/__tests__/__snapshots__/CFooter.spec.ts.snap +2 -0
  376. package/src/components/form/CForm.ts +1 -1
  377. package/src/components/form/CFormCheck.ts +5 -5
  378. package/src/components/form/CFormControlValidation.ts +3 -3
  379. package/src/components/form/CFormFeedback.ts +1 -1
  380. package/src/components/form/CFormFloating.ts +1 -1
  381. package/src/components/form/CFormInput.ts +2 -2
  382. package/src/components/form/CFormLabel.ts +1 -1
  383. package/src/components/form/CFormRange.ts +4 -4
  384. package/src/components/form/CFormSelect.ts +3 -3
  385. package/src/components/form/CFormSwitch.ts +2 -2
  386. package/src/components/form/CFormTextarea.ts +2 -2
  387. package/src/components/form/CInputGroup.ts +1 -1
  388. package/src/components/form/__tests__/CFormRange.spec.ts +2 -2
  389. package/src/components/form/__tests__/CFormText.spec.ts +1 -1
  390. package/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap +1 -1
  391. package/src/components/grid/CCol.ts +1 -1
  392. package/src/components/grid/CContainer.ts +4 -2
  393. package/src/components/grid/CRow.ts +1 -1
  394. package/src/components/header/CHeader.ts +2 -2
  395. package/src/components/header/CHeaderNav.ts +1 -1
  396. package/src/components/header/CHeaderToggler.ts +1 -1
  397. package/src/components/header/__tests__/CHeader.spec.ts +1 -2
  398. package/src/components/header/__tests__/__snapshots__/CHeader.spec.ts.snap +2 -0
  399. package/src/components/index.ts +4 -0
  400. package/src/components/link/CLink.ts +1 -1
  401. package/src/components/list-group/CListGroup.ts +1 -1
  402. package/src/components/list-group/CListGroupItem.ts +1 -1
  403. package/src/components/modal/CModal.ts +3 -2
  404. package/src/components/modal/CModalHeader.ts +10 -3
  405. package/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap +9 -4
  406. package/src/components/multi-select/CMultiSelect.ts +385 -43
  407. package/src/components/multi-select/CMultiSelectNativeSelect.ts +1 -2
  408. package/src/components/multi-select/CMultiSelectOptions.ts +77 -3
  409. package/src/components/multi-select/CMultiSelectSelection.ts +6 -1
  410. package/src/components/multi-select/utils.ts +6 -6
  411. package/src/components/nav/CNav.ts +9 -2
  412. package/src/components/nav/CNavGroup.ts +147 -99
  413. package/src/components/nav/CNavItem.ts +2 -2
  414. package/src/components/nav/CNavLink.ts +19 -2
  415. package/src/components/nav/__tests__/CNavGroup.spec.ts +188 -6
  416. package/src/components/nav/__tests__/CNavItem.spec.ts +6 -6
  417. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap +3 -7
  418. package/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap +1 -5
  419. package/src/components/navbar/CNavbar.ts +2 -2
  420. package/src/components/navbar/CNavbarBrand.ts +1 -1
  421. package/src/components/navbar/CNavbarNav.ts +1 -1
  422. package/src/components/navbar/CNavbarToggler.ts +1 -1
  423. package/src/components/navbar/__tests__/CNavbar.spec.ts +1 -1
  424. package/src/components/pagination/CPagination.ts +2 -2
  425. package/src/components/pagination/CPaginationItem.ts +2 -2
  426. package/src/components/placeholder/CPlaceholder.ts +1 -1
  427. package/src/components/popover/CPopover.ts +27 -7
  428. package/src/components/popover/__tests__/CPopover.spec.ts +43 -0
  429. package/src/components/progress/CProgress.ts +2 -2
  430. package/src/components/progress/CProgressBar.ts +1 -1
  431. package/src/components/progress/CProgressStacked.ts +1 -1
  432. package/src/components/progress/__tests__/CProgressBar.spec.ts +0 -4
  433. package/src/components/search-button/CSearchButton.ts +163 -0
  434. package/src/components/search-button/__tests__/CSearchButton.spec.ts +128 -0
  435. package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.ts.snap +13 -0
  436. package/src/components/search-button/index.ts +10 -0
  437. package/src/components/search-button/types.ts +10 -0
  438. package/src/components/search-button/utils.ts +140 -0
  439. package/src/components/sidebar/CSidebar.ts +9 -6
  440. package/src/components/sidebar/CSidebarBrand.ts +1 -1
  441. package/src/components/sidebar/CSidebarNav.ts +30 -28
  442. package/src/components/sidebar/__tests__/CSidebar.spec.ts +1 -1
  443. package/src/components/spinner/CSpinner.ts +6 -6
  444. package/src/components/spinner/__tests__/CSpinner.spec.ts +0 -1
  445. package/src/components/stepper/__tests__/CStepper.spec.ts +13 -8
  446. package/src/components/table/CTable.ts +16 -16
  447. package/src/components/table/CTableBody.ts +1 -1
  448. package/src/components/table/CTableDataCell.ts +1 -1
  449. package/src/components/table/CTableFoot.ts +1 -1
  450. package/src/components/table/CTableHead.ts +1 -1
  451. package/src/components/table/CTableHeaderCell.ts +1 -1
  452. package/src/components/table/CTableRow.ts +1 -1
  453. package/src/components/table/types.ts +1 -0
  454. package/src/components/table/utils.ts +4 -4
  455. package/src/components/tabs/CTab.ts +1 -1
  456. package/src/components/tabs/CTabList.ts +12 -5
  457. package/src/components/tabs/CTabPane.ts +3 -3
  458. package/src/components/tabs/CTabPanel.ts +5 -5
  459. package/src/components/tabs/CTabs.ts +2 -2
  460. package/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap +1 -1
  461. package/src/components/toast/CToast.ts +12 -4
  462. package/src/components/toast/CToastClose.ts +5 -6
  463. package/src/components/toast/CToaster.ts +1 -1
  464. package/src/components/toast/__tests__/CToaster.spec.ts +0 -2
  465. package/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap +1 -1
  466. package/src/components/tooltip/CTooltip.ts +26 -6
  467. package/src/components/tooltip/__tests__/CTooltip.spec.ts +43 -0
  468. package/src/components/widgets/CWidgetStatsA.ts +4 -4
  469. package/src/components/widgets/CWidgetStatsB.ts +5 -5
  470. package/src/components/widgets/CWidgetStatsC.ts +5 -5
  471. package/src/components/widgets/CWidgetStatsD.ts +5 -5
  472. package/src/components/widgets/CWidgetStatsE.ts +4 -4
  473. package/src/components/widgets/CWidgetStatsF.ts +5 -5
  474. package/src/directives/__tests__/v-c-placeholder.spec.ts +33 -0
  475. package/src/directives/__tests__/v-c-popover.spec.ts +67 -0
  476. package/src/directives/__tests__/v-c-tooltip.spec.ts +66 -0
  477. package/src/directives/v-c-popover.ts +8 -5
  478. package/src/directives/v-c-tooltip.ts +8 -5
  479. package/src/directives/v-c-visible.ts +1 -1
  480. package/src/index.ts +1 -1
  481. package/src/utils/ComponentProps.ts +1 -0
  482. package/src/utils/__tests__/swipe.spec.ts +82 -0
  483. package/src/utils/getNextActiveElement.ts +1 -1
  484. package/src/utils/index.ts +2 -0
  485. package/src/utils/swipe.ts +114 -0
  486. package/src/utils/transition.ts +2 -2
  487. package/dist/cjs/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
  488. package/dist/esm/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
  489. package/src/components/accordion/__tests__/CAccordionCollapse.spec.ts +0 -28
  490. package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.ts.snap +0 -7
  491. package/src/components/collapse/__test__/CCollapse.spec.ts +0 -44
  492. package/src/components/collapse/__test__/__snapshots__/CCollapse.spec.ts.snap +0 -13
@@ -48,6 +48,24 @@ const CMultiSelect = defineComponent({
48
48
  type: String,
49
49
  default: 'Toggle dropdown',
50
50
  },
51
+ /**
52
+ * Accessible label for the search input (when `search` is enabled).
53
+ *
54
+ * @since 5.19.0
55
+ */
56
+ ariaSearchLabel: {
57
+ type: String,
58
+ default: 'Search',
59
+ },
60
+ /**
61
+ * Accessible label prefix for a tag's delete button (selection type `tags`). The selected option's label is appended, so screen readers announce e.g. "Remove Angular".
62
+ *
63
+ * @since 5.19.0
64
+ */
65
+ ariaTagDeleteLabel: {
66
+ type: String,
67
+ default: 'Remove',
68
+ },
51
69
  /**
52
70
  * Enables selection cleaner element.
53
71
  *
@@ -72,6 +90,24 @@ const CMultiSelect = defineComponent({
72
90
  * @since 4.9.0
73
91
  */
74
92
  clearSearchOnSelect: Boolean,
93
+ /**
94
+ * Sets the select all button label shown once everything is selected. The button is a toggle: it shows `selectAllLabel` (and selects all) until everything is selected, then shows `deselectAllLabel` (and deselects all).
95
+ *
96
+ * @since 5.19.0
97
+ */
98
+ deselectAllLabel: {
99
+ type: String,
100
+ default: 'Deselect all',
101
+ },
102
+ /**
103
+ * Sets the deselect filtered button label (used with `selectAllMode="filtered"`).
104
+ *
105
+ * @since 5.19.0
106
+ */
107
+ deselectFilteredLabel: {
108
+ type: String,
109
+ default: 'Deselect filtered',
110
+ },
75
111
  /**
76
112
  * Toggle the disabled state for the component.
77
113
  */
@@ -141,6 +177,26 @@ const CMultiSelect = defineComponent({
141
177
  type: Array as PropType<(Option | OptionsGroup)[]>,
142
178
  default: () => [],
143
179
  },
180
+ /**
181
+ * Makes each options group label a toggle that selects or deselects all options in that group. With `optionsGroupsStyle="checkbox"` (and `multiple`) the label shows a tri-state checkbox indicator (`none` / `all` / `indeterminate`) reflecting the group's selection.
182
+ *
183
+ * @since 5.19.0
184
+ */
185
+ optionsGroupsSelectable: Boolean,
186
+ /**
187
+ * Sets the options group label style when `optionsGroupsSelectable` is enabled.
188
+ *
189
+ * @values 'checkbox', 'text'
190
+ * @default 'checkbox'
191
+ * @since 5.19.0
192
+ */
193
+ optionsGroupsStyle: {
194
+ type: String,
195
+ default: 'checkbox',
196
+ validator: (value: string) => {
197
+ return ['checkbox', 'text'].includes(value)
198
+ },
199
+ },
144
200
  /**
145
201
  * Sets maxHeight of options list.
146
202
  *
@@ -239,11 +295,57 @@ const CMultiSelect = defineComponent({
239
295
  /**
240
296
  * Sets the select all button label.
241
297
  *
242
- * @default 'Select all options'
298
+ * @default 'Select all'
243
299
  */
244
300
  selectAllLabel: {
245
301
  type: String,
246
- default: 'Select all options',
302
+ default: 'Select all',
303
+ },
304
+ /**
305
+ * Determines what the select all button operates on: all options (`'all'`) or only the currently filtered (search-visible) options (`'filtered'`).
306
+ *
307
+ * @values 'all', 'filtered'
308
+ * @default 'all'
309
+ * @since 5.19.0
310
+ */
311
+ selectAllMode: {
312
+ type: String,
313
+ default: 'all',
314
+ validator: (value: string) => {
315
+ return ['all', 'filtered'].includes(value)
316
+ },
317
+ },
318
+ /**
319
+ * Sets the select all button style. With `'checkbox'` (and `multiple`), the button shows a tri-state checkbox indicator (`none` / `all` / `indeterminate`) and toggles between selecting and deselecting.
320
+ *
321
+ * @values 'checkbox', 'text'
322
+ * @default 'checkbox'
323
+ * @since 5.19.0
324
+ */
325
+ selectAllStyle: {
326
+ type: String,
327
+ default: 'checkbox',
328
+ validator: (value: string) => {
329
+ return ['checkbox', 'text'].includes(value)
330
+ },
331
+ },
332
+ /**
333
+ * Sets the select filtered button label (used with `selectAllMode="filtered"`).
334
+ *
335
+ * @since 5.19.0
336
+ */
337
+ selectFilteredLabel: {
338
+ type: String,
339
+ default: 'Select filtered',
340
+ },
341
+ /**
342
+ * Sets the maximum number of options that can be selected. The select all button stays enabled and selects options up to the limit, then toggles to deselect all once the limit is reached. The `selectionLimit` event fires when a user tries to select more options than allowed.
343
+ *
344
+ * @since 5.19.0
345
+ */
346
+ selectionLimit: {
347
+ type: Number,
348
+ default: null,
247
349
  },
248
350
  /**
249
351
  * Sets the selection style.
@@ -349,6 +451,12 @@ const CMultiSelect = defineComponent({
349
451
  * The callback is fired when the Multi Select component requests to be hidden.
350
452
  */
351
453
  'hide',
454
+ /**
455
+ * Execute a function when the user tries to select more options than allowed by `selectionLimit`.
456
+ *
457
+ * @since 5.19.0
458
+ */
459
+ 'selectionLimit',
352
460
  /**
353
461
  * The callback is fired when the Multi Select component requests to be shown.
354
462
  */
@@ -376,14 +484,22 @@ const CMultiSelect = defineComponent({
376
484
 
377
485
  provide('nativeSelectRef', nativeSelectRef)
378
486
 
379
- const filteredOptions = computed(() =>
380
- flattenOptionsArray(
381
- isExternalSearch(props.search)
382
- ? [...props.options, ...filterOptionsList(searchValue.value, userOptions.value)]
383
- : filterOptionsList(searchValue.value, [...props.options, ...userOptions.value]),
384
- true
385
- )
386
- )
487
+ const filteredOptions = computed(() => {
488
+ const source = isExternalSearch(props.search)
489
+ ? [...props.options, ...filterOptionsList(searchValue.value, userOptions.value)]
490
+ : filterOptionsList(searchValue.value, [...props.options, ...userOptions.value])
491
+
492
+ const flattened: (Option | OptionsGroup)[] = []
493
+ for (const option of source) {
494
+ if (Array.isArray((option as OptionsGroup).options)) {
495
+ flattened.push(option, ...((option as OptionsGroup).options as Option[]))
496
+ } else {
497
+ flattened.push(option)
498
+ }
499
+ }
500
+
501
+ return flattened
502
+ })
387
503
 
388
504
  const flattenedOptions = computed(() => {
389
505
  return flattenOptionsArray(props.options).map((option) => {
@@ -418,6 +534,107 @@ const CMultiSelect = defineComponent({
418
534
  return searchRef.value && createOption(String(searchValue.value), flattenedOptions.value)
419
535
  })
420
536
 
537
+ const selectableOptions = computed(() =>
538
+ flattenOptionsArray([...props.options, ...userOptions.value]).filter(
539
+ (option) => !option.disabled,
540
+ ),
541
+ )
542
+
543
+ const filteredSelectableOptions = computed(() =>
544
+ flattenOptionsArray(
545
+ isExternalSearch(props.search)
546
+ ? [...props.options, ...filterOptionsList(searchValue.value, userOptions.value)]
547
+ : filterOptionsList(searchValue.value, [...props.options, ...userOptions.value]),
548
+ ).filter((option) => !option.disabled),
549
+ )
550
+
551
+ const hasSelectionLimit = computed(
552
+ () => props.multiple && typeof props.selectionLimit === 'number',
553
+ )
554
+ const isSelectionLimitReached = computed(
555
+ () => hasSelectionLimit.value && selected.value.length >= (props.selectionLimit as number),
556
+ )
557
+ const selectableTarget = (total: number) =>
558
+ hasSelectionLimit.value ? Math.min(total, props.selectionLimit as number) : total
559
+
560
+ const selectAllScope = computed(() => {
561
+ const selectedValues = new Set(selected.value.map((option) => option.value))
562
+ const countSelected = (scope: (Option | OptionsGroup)[]) =>
563
+ scope.filter((option) => 'value' in option && selectedValues.has(option.value)).length
564
+
565
+ return props.selectAllMode === 'filtered'
566
+ ? {
567
+ selected: countSelected(filteredSelectableOptions.value),
568
+ total: filteredSelectableOptions.value.length,
569
+ }
570
+ : { selected: countSelected(selectableOptions.value), total: selectableOptions.value.length }
571
+ })
572
+
573
+ const isAllSelected = computed(() => {
574
+ const target = selectableTarget(selectAllScope.value.total)
575
+ return target > 0 && selectAllScope.value.selected >= target
576
+ })
577
+
578
+ const selectAllCheckboxState = computed(() =>
579
+ isAllSelected.value
580
+ ? 'all'
581
+ : selectAllScope.value.selected === 0
582
+ ? 'none'
583
+ : 'indeterminate',
584
+ )
585
+
586
+ const isFilteredScopeNarrowed = computed(
587
+ () =>
588
+ props.selectAllMode === 'filtered' &&
589
+ filteredSelectableOptions.value.length < selectableOptions.value.length,
590
+ )
591
+
592
+ const selectAllButtonLabel = computed(() =>
593
+ isFilteredScopeNarrowed.value
594
+ ? isAllSelected.value
595
+ ? props.deselectFilteredLabel
596
+ : props.selectFilteredLabel
597
+ : isAllSelected.value
598
+ ? props.deselectAllLabel
599
+ : props.selectAllLabel,
600
+ )
601
+
602
+ const headerState = computed(() => {
603
+ const selectedValues = new Set(selected.value.map((option) => option.value))
604
+ return {
605
+ selected: selected.value.length,
606
+ total: selectableOptions.value.length,
607
+ filtered: filteredSelectableOptions.value.length,
608
+ filteredSelected: filteredSelectableOptions.value.filter((option) =>
609
+ selectedValues.has(option.value),
610
+ ).length,
611
+ }
612
+ })
613
+
614
+ const selectWithLimit = (scope: (Option | OptionsGroup)[]) => {
615
+ if (!hasSelectionLimit.value) {
616
+ selected.value = selectOptions(props.multiple, scope, selected.value)
617
+ return
618
+ }
619
+
620
+ const remaining = (props.selectionLimit as number) - selected.value.length
621
+
622
+ if (remaining <= 0) {
623
+ emit('selectionLimit', props.selectionLimit)
624
+ return
625
+ }
626
+
627
+ const selectedValues = new Set(selected.value.map((option) => option.value))
628
+ const toAdd = scope.filter(
629
+ (option) => 'value' in option && !selectedValues.has(option.value),
630
+ )
631
+ selected.value = selectOptions(props.multiple, toAdd.slice(0, remaining), selected.value)
632
+
633
+ if (toAdd.length > remaining) {
634
+ emit('selectionLimit', props.selectionLimit)
635
+ }
636
+ }
637
+
421
638
  watch(
422
639
  flattenedOptions,
423
640
  () => {
@@ -433,7 +650,7 @@ const CMultiSelect = defineComponent({
433
650
  (option: Option | OptionsGroup) => option.selected === false
434
651
  ) as Option[]
435
652
 
436
- if (_selected.length > 0) {
653
+ if (_selected.length > 0 || deselected.length > 0) {
437
654
  const newSelectedValue = selectOptions(
438
655
  props.multiple,
439
656
  _selected,
@@ -481,6 +698,19 @@ const CMultiSelect = defineComponent({
481
698
  }
482
699
 
483
700
  emit('hide')
701
+
702
+ const active = document.activeElement
703
+ const wrapper = multiSelectRef.value as HTMLElement | null
704
+ const menu = dropdownMenuElement.value as HTMLElement | null
705
+
706
+ if (wrapper?.contains(active) || menu?.contains(active)) {
707
+ if (props.search && searchRef.value) {
708
+ searchRef.value.focus()
709
+ } else {
710
+ ;(dropdownRefElement.value as HTMLElement | null)?.focus()
711
+ }
712
+ }
713
+
484
714
  searchValue.value = ''
485
715
  if (searchRef.value) {
486
716
  searchRef.value.value = ''
@@ -495,7 +725,10 @@ const CMultiSelect = defineComponent({
495
725
  }
496
726
 
497
727
  const handleSearchKeyDown = (event: KeyboardEvent) => {
498
- if (!isOpen.value) {
728
+ if (
729
+ (!isOpen.value && event.key.length === 1 && !event.ctrlKey && !event.metaKey) ||
730
+ event.key === 'ArrowDown'
731
+ ) {
499
732
  openDropdown()
500
733
  }
501
734
 
@@ -579,6 +812,36 @@ const CMultiSelect = defineComponent({
579
812
  }
580
813
  }
581
814
 
815
+ const handleNativeSelectKeyDown = (event: KeyboardEvent) => {
816
+ if (event.key === 'Tab' || event.key === 'Escape') {
817
+ return
818
+ }
819
+
820
+ event.preventDefault()
821
+
822
+ const isPrintable =
823
+ event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey
824
+
825
+ if (
826
+ !isOpen.value &&
827
+ (event.key === 'Enter' || event.key === 'ArrowDown' || (props.search && isPrintable))
828
+ ) {
829
+ openDropdown()
830
+ }
831
+
832
+ if (props.search && searchRef.value) {
833
+ searchRef.value.focus()
834
+
835
+ if (isPrintable) {
836
+ const nextValue = searchRef.value.value + event.key
837
+ searchRef.value.value = nextValue
838
+ searchValue.value = nextValue.toLowerCase()
839
+ }
840
+ } else {
841
+ ;(dropdownRefElement.value as HTMLElement | null)?.focus()
842
+ }
843
+ }
844
+
582
845
  const handleGlobalSearch = (event: KeyboardEvent) => {
583
846
  if (
584
847
  isGlobalSearch(props.search) &&
@@ -601,6 +864,13 @@ const CMultiSelect = defineComponent({
601
864
  return
602
865
  }
603
866
 
867
+ const alreadySelected = selected.value.some((_option) => _option.value === option.value)
868
+
869
+ if (!alreadySelected && isSelectionLimitReached.value) {
870
+ emit('selectionLimit', props.selectionLimit)
871
+ return
872
+ }
873
+
604
874
  if (option.custom && !userOptions.value.some((_option) => _option.value === option.value)) {
605
875
  userOptions.value = [...userOptions.value, option]
606
876
  }
@@ -613,7 +883,7 @@ const CMultiSelect = defineComponent({
613
883
  }
614
884
  }
615
885
 
616
- if (selected.value.some((_option) => _option.value === option.value)) {
886
+ if (alreadySelected) {
617
887
  selected.value = selected.value.filter((_option) => _option.value !== option.value)
618
888
  } else {
619
889
  selected.value = [...selected.value, option] as SelectedOption[]
@@ -621,20 +891,57 @@ const CMultiSelect = defineComponent({
621
891
  }
622
892
 
623
893
  const handleSelectAll = () => {
624
- selected.value = selectOptions(
625
- props.multiple,
626
- [
627
- ...flattenedOptions.value.filter((option: Option | OptionsGroup) => !option.disabled),
628
- ...userOptions.value,
629
- ],
630
- selected.value
631
- )
894
+ selectWithLimit(selectableOptions.value)
632
895
  }
633
896
 
634
897
  const handleDeselectAll = () => {
635
898
  selected.value = selected.value.filter((option) => option.disabled)
636
899
  }
637
900
 
901
+ const handleSelectFiltered = () => {
902
+ selectWithLimit(filteredSelectableOptions.value)
903
+ }
904
+
905
+ const handleDeselectFiltered = () => {
906
+ const filteredValues = new Set(
907
+ filteredSelectableOptions.value.map((option) => option.value),
908
+ )
909
+ selected.value = selected.value.filter(
910
+ (option) => option.disabled || !filteredValues.has(option.value),
911
+ )
912
+ }
913
+
914
+ const handleSelectAllToggle = () => {
915
+ if (props.selectAllMode === 'filtered') {
916
+ isAllSelected.value ? handleDeselectFiltered() : handleSelectFiltered()
917
+ } else {
918
+ isAllSelected.value ? handleDeselectAll() : handleSelectAll()
919
+ }
920
+ }
921
+
922
+ const handleGroupClick = (group: OptionsGroup) => {
923
+ const selectedValues = new Set(selected.value.map((option) => option.value))
924
+ const groupOptions = (group.options ?? []).filter((option) => !option.disabled)
925
+ const allSelected =
926
+ groupOptions.length > 0 && groupOptions.every((option) => selectedValues.has(option.value))
927
+
928
+ if (allSelected) {
929
+ const groupValues = new Set(groupOptions.map((option) => option.value))
930
+ selected.value = selected.value.filter(
931
+ (option) => option.disabled || !groupValues.has(option.value),
932
+ )
933
+ } else {
934
+ selectWithLimit(groupOptions)
935
+ }
936
+ }
937
+
938
+ const headerActions = {
939
+ selectAll: handleSelectAll,
940
+ deselectAll: handleDeselectAll,
941
+ selectFiltered: handleSelectFiltered,
942
+ deselectFiltered: handleDeselectFiltered,
943
+ }
944
+
638
945
  return () => [
639
946
  h(
640
947
  CFormControlWrapper,
@@ -654,17 +961,6 @@ const CMultiSelect = defineComponent({
654
961
  },
655
962
  {
656
963
  default: () => [
657
- h(CMultiSelectNativeSelect, {
658
- id: props.id ?? uniqueId,
659
- multiple: props.multiple,
660
- name: props.name ?? uniqueId,
661
- options: selected.value,
662
- required: props.required,
663
- value: props.multiple
664
- ? selected.value.map((option: SelectedOption) => option.value.toString())
665
- : selected.value.map((option: SelectedOption) => option.value)[0],
666
- onChange: () => emit('change', selected.value),
667
- }),
668
964
  h(
669
965
  'div',
670
966
  {
@@ -682,11 +978,25 @@ const CMultiSelect = defineComponent({
682
978
  role: 'combobox',
683
979
  'aria-haspopup': 'listbox',
684
980
  'aria-expanded': isOpen.value,
981
+ 'aria-controls': `multi-select-listbox-${uniqueId}`,
685
982
  ...(props.teleport && { 'aria-owns': `multi-select-listbox-${uniqueId}` }),
983
+ ...(props.disabled && { 'aria-disabled': true }),
686
984
  ref: multiSelectRef,
687
985
  },
688
986
  {
689
987
  default: () => [
988
+ h(CMultiSelectNativeSelect, {
989
+ id: props.id ?? uniqueId,
990
+ multiple: props.multiple,
991
+ name: props.name ?? uniqueId,
992
+ options: selected.value,
993
+ required: props.required,
994
+ value: props.multiple
995
+ ? selected.value.map((option: SelectedOption) => option.value.toString())
996
+ : selected.value.map((option: SelectedOption) => option.value)[0],
997
+ onChange: () => emit('change', selected.value),
998
+ onKeydown: handleNativeSelectKeyDown,
999
+ }),
690
1000
  h(
691
1001
  'div',
692
1002
  {
@@ -705,6 +1015,7 @@ const CMultiSelect = defineComponent({
705
1015
  h(
706
1016
  CMultiSelectSelection,
707
1017
  {
1018
+ ariaTagDeleteLabel: props.ariaTagDeleteLabel,
708
1019
  disabled: props.disabled,
709
1020
  multiple: props.multiple,
710
1021
  placeholder: props.placeholder,
@@ -725,6 +1036,9 @@ const CMultiSelect = defineComponent({
725
1036
  id: `search-${props.id ?? uniqueId}`,
726
1037
  name: `search-${props.name ?? uniqueId}`,
727
1038
  autocomplete: 'off',
1039
+ 'aria-label': props.ariaSearchLabel,
1040
+ 'aria-autocomplete': 'list',
1041
+ 'aria-controls': `multi-select-listbox-${uniqueId}`,
728
1042
  onInput: (event: InputEvent) => handleSearchChange(event),
729
1043
  onKeydown: (event: KeyboardEvent) => handleSearchKeyDown(event),
730
1044
  ...(selected.value.length === 0 && {
@@ -819,24 +1133,52 @@ const CMultiSelect = defineComponent({
819
1133
  },
820
1134
  {
821
1135
  default: () => [
822
- props.multiple &&
823
- props.selectAll &&
824
- h(
825
- 'button',
826
- {
827
- class: 'form-multi-select-all',
828
- onClick: () => handleSelectAll(),
829
- type: 'button',
830
- },
831
- props.selectAllLabel
832
- ),
1136
+ (slots.header || (props.multiple && props.selectAll)) &&
1137
+ h('div', { class: 'form-multi-select-dropdown-header' }, [
1138
+ slots.header
1139
+ ? h(
1140
+ 'div',
1141
+ {
1142
+ onClick: (event: MouseEvent) => event.stopPropagation(),
1143
+ },
1144
+ slots.header({
1145
+ state: headerState.value,
1146
+ actions: headerActions,
1147
+ }),
1148
+ )
1149
+ : h(
1150
+ 'button',
1151
+ {
1152
+ class: [
1153
+ 'form-multi-select-all',
1154
+ {
1155
+ 'form-multi-select-all-with-checkbox':
1156
+ props.selectAllStyle === 'checkbox',
1157
+ 'form-multi-selected':
1158
+ props.selectAllStyle === 'checkbox' &&
1159
+ selectAllCheckboxState.value === 'all',
1160
+ 'form-multi-select-indeterminate':
1161
+ props.selectAllStyle === 'checkbox' &&
1162
+ selectAllCheckboxState.value === 'indeterminate',
1163
+ },
1164
+ ],
1165
+ onClick: () => handleSelectAllToggle(),
1166
+ type: 'button',
1167
+ },
1168
+ selectAllButtonLabel.value,
1169
+ ),
1170
+ ]),
833
1171
  h(CMultiSelectOptions, {
834
1172
  loading: props.loading,
1173
+ onGroupClick: (group: OptionsGroup) => handleGroupClick(group),
835
1174
  onOptionClick: (option: Option) => handleOnOptionClick(option),
836
1175
  options:
837
1176
  filteredOptions.value.length === 0 && props.allowCreateOptions
838
1177
  ? userOption.value || []
839
1178
  : filteredOptions.value,
1179
+ optionsGroupsSelectable:
1180
+ props.optionsGroupsSelectable && props.multiple,
1181
+ optionsGroupsStyle: props.optionsGroupsStyle,
840
1182
  optionsMaxHeight: props.optionsMaxHeight,
841
1183
  optionsStyle: props.optionsStyle,
842
1184
  scopedSlots: slots,
@@ -38,13 +38,12 @@ const CMultiSelectNativeSelect = defineComponent({
38
38
  h(
39
39
  'select',
40
40
  {
41
- className: 'multi-select-new',
41
+ className: 'form-multi-select',
42
42
  id: props.id,
43
43
  ...(props.id && !props.name && { name: `${props.id}-multi-select` }), // TODO: remove in v6
44
44
  ...(props.name && { name: props.name }), // TODO: change to `name: props.name` in v6
45
45
  multiple: props.multiple,
46
46
  tabIndex: '-1',
47
- style: { display: 'none' },
48
47
  required: props.required,
49
48
  value: props.value,
50
49
  ref: nativeSelectRef,