@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
@@ -0,0 +1,174 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import { h } from 'vue'
3
+ import { CChipSet, type CChipSetItem } from '../CChipSet'
4
+ import { CChip } from '../../chip/CChip'
5
+
6
+ const set = (props: Record<string, unknown>, values: string[]) =>
7
+ mount(CChipSet, {
8
+ props,
9
+ slots: {
10
+ default: () => values.map((v) => h(CChip, { value: v, key: v }, { default: () => v })),
11
+ },
12
+ })
13
+
14
+ describe('CChipSet', () => {
15
+ it('has correct name', () => {
16
+ expect(CChipSet.name).toBe('CChipSet')
17
+ })
18
+
19
+ it('renders .chip-set', () => {
20
+ const w = set({}, ['a', 'b'])
21
+ expect(w.classes()).toContain('chip-set')
22
+ expect(w.findAll('.chip')).toHaveLength(2)
23
+ })
24
+
25
+ it('moves focus between chips with the keyboard', async () => {
26
+ const w = mount(CChipSet, {
27
+ attachTo: document.body,
28
+ props: { selectable: true },
29
+ slots: {
30
+ default: () =>
31
+ ['a', 'b', 'c'].map((v) => h(CChip, { value: v, key: v }, { default: () => v })),
32
+ },
33
+ })
34
+ const chips = w.findAll('.chip')
35
+ ;(chips[0].element as HTMLElement).focus()
36
+ await chips[0].trigger('keydown', { key: 'ArrowRight' })
37
+ expect(document.activeElement).toBe(chips[1].element)
38
+ await chips[1].trigger('keydown', { key: 'End' })
39
+ expect(document.activeElement).toBe(chips[2].element)
40
+ await chips[2].trigger('keydown', { key: 'Home' })
41
+ expect(document.activeElement).toBe(chips[0].element)
42
+ // No cycling past the first chip.
43
+ await chips[0].trigger('keydown', { key: 'ArrowLeft' })
44
+ expect(document.activeElement).toBe(chips[0].element)
45
+ w.unmount()
46
+ })
47
+
48
+ it('mirrors arrow keys in RTL', async () => {
49
+ document.documentElement.dir = 'rtl'
50
+ const w = mount(CChipSet, {
51
+ attachTo: document.body,
52
+ props: { selectable: true },
53
+ slots: {
54
+ default: () => ['a', 'b'].map((v) => h(CChip, { value: v, key: v }, { default: () => v })),
55
+ },
56
+ })
57
+ const chips = w.findAll('.chip')
58
+ ;(chips[0].element as HTMLElement).focus()
59
+ // In RTL, ArrowLeft moves to the next chip.
60
+ await chips[0].trigger('keydown', { key: 'ArrowLeft' })
61
+ expect(document.activeElement).toBe(chips[1].element)
62
+ await chips[1].trigger('keydown', { key: 'ArrowRight' })
63
+ expect(document.activeElement).toBe(chips[0].element)
64
+ w.unmount()
65
+ document.documentElement.dir = ''
66
+ })
67
+
68
+ it('selectable: click selects (multiple)', async () => {
69
+ const w = set({ selectable: true }, ['a', 'b'])
70
+ const chips = w.findAll('.chip')
71
+ await chips[0].trigger('click')
72
+ await chips[1].trigger('click')
73
+ expect(chips[0].classes()).toContain('active')
74
+ expect(chips[1].classes()).toContain('active')
75
+ expect(w.emitted('update:selected')?.slice(-1)[0]).toEqual([['a', 'b']])
76
+ })
77
+
78
+ it('single selection deselects siblings', async () => {
79
+ const w = set({ selectable: true, selectionMode: 'single' }, ['a', 'b'])
80
+ const chips = w.findAll('.chip')
81
+ await chips[0].trigger('click')
82
+ await chips[1].trigger('click')
83
+ expect(chips[0].classes()).not.toContain('active')
84
+ expect(chips[1].classes()).toContain('active')
85
+ expect(w.emitted('update:selected')?.slice(-1)[0]).toEqual([['b']])
86
+ })
87
+
88
+ it('controlled v-model', () => {
89
+ const w = set({ selectable: true, selected: ['b'] }, ['a', 'b'])
90
+ const chips = w.findAll('.chip')
91
+ expect(chips[0].classes()).not.toContain('active')
92
+ expect(chips[1].classes()).toContain('active')
93
+ })
94
+
95
+ it('filter shows check icon when selected', () => {
96
+ const w = set({ filter: true, selected: ['a'] }, ['a'])
97
+ expect(w.find('.chip-check').exists()).toBe(true)
98
+ })
99
+
100
+ it('removable fires remove', async () => {
101
+ const w = set({ removable: true }, ['a', 'b'])
102
+ await w.find('.chip-remove').trigger('click')
103
+ expect(w.emitted('remove')?.[0]).toEqual(['a'])
104
+ })
105
+
106
+ it('v-model:chips — emits update:chips without the removed chip', async () => {
107
+ const w = mount(CChipSet, {
108
+ props: { removable: true, chips: ['a', { value: 'b', label: 'B' }] },
109
+ })
110
+ await w.find('.chip-remove').trigger('click')
111
+ expect(w.emitted('remove')?.[0]).toEqual(['a'])
112
+ expect(w.emitted('update:chips')?.[0]).toEqual([[{ value: 'b', label: 'B' }]])
113
+ })
114
+
115
+ it('v-model:chips — the set removes the chip once the parent syncs', async () => {
116
+ const w = mount(CChipSet, {
117
+ props: {
118
+ removable: true,
119
+ chips: ['a', 'b'],
120
+ 'onUpdate:chips': (next: (string | CChipSetItem)[]) => w.setProps({ chips: next }),
121
+ },
122
+ })
123
+ expect(w.findAll('.chip')).toHaveLength(2)
124
+ await w.find('.chip-remove').trigger('click')
125
+ await w.vm.$nextTick()
126
+ expect(w.findAll('.chip')).toHaveLength(1)
127
+ })
128
+
129
+ it('renders chips from the chips prop (strings and objects)', async () => {
130
+ const w = mount(CChipSet, {
131
+ attachTo: document.body,
132
+ props: {
133
+ selectable: true,
134
+ chips: [
135
+ 'react',
136
+ { value: 'vue', label: 'Vue' },
137
+ { value: 'ng', label: 'Angular', selectable: false },
138
+ ],
139
+ },
140
+ })
141
+ expect(w.findAll('.chip')).toHaveLength(3)
142
+ expect(w.text()).toContain('Vue')
143
+
144
+ const chips = w.findAll('.chip')
145
+ // Per-item override still works with the data-driven API.
146
+ await chips[2].trigger('click')
147
+ expect(chips[2].classes()).not.toContain('active')
148
+ w.unmount()
149
+ })
150
+
151
+ it('disabled forwards to chips', () => {
152
+ const w = set({ disabled: true, removable: true }, ['a'])
153
+ expect(w.find('.chip').classes()).toContain('disabled')
154
+ // A disabled chip never gets a remove button (parity with vanilla).
155
+ expect(w.find('.chip-remove').exists()).toBe(false)
156
+ })
157
+
158
+ it('lets a chip override set config (opt out of selectable / removable)', async () => {
159
+ const w = mount(CChipSet, {
160
+ props: { selectable: true, removable: true },
161
+ slots: {
162
+ default: () => [
163
+ h(CChip, { value: 'a' }, { default: () => 'A' }),
164
+ h(CChip, { value: 'b', selectable: false, removable: false }, { default: () => 'B' }),
165
+ ],
166
+ },
167
+ })
168
+ const chips = w.findAll('.chip')
169
+ await chips[1].trigger('click')
170
+ expect(chips[1].classes()).not.toContain('active')
171
+ expect(chips[0].find('.chip-remove').exists()).toBe(true)
172
+ expect(chips[1].find('.chip-remove').exists()).toBe(false)
173
+ })
174
+ })
@@ -0,0 +1,29 @@
1
+ import { h, type VNode } from 'vue'
2
+
3
+ import { CChip } from '../chip/CChip'
4
+
5
+ export interface CChipSetItem {
6
+ /**
7
+ * The value that identifies the chip and tracks its selection.
8
+ */
9
+ value: string
10
+ /**
11
+ * The chip content. Falls back to `value` when omitted.
12
+ */
13
+ label?: string | object
14
+ [key: string]: unknown
15
+ }
16
+
17
+ // Build CChip vnodes from data items (string or descriptor). Coordination is
18
+ // handled by the chip-set context the chips inject, so this only creates them —
19
+ // shared by CChipSet's `chips` prop and CChipInput's value list. It lives apart
20
+ // from useChipSet to avoid a CChip ↔ useChipSet import cycle.
21
+ export const chipsFromData = (items: (string | CChipSetItem)[] = []): VNode[] =>
22
+ items.map((item) => {
23
+ if (typeof item === 'string') {
24
+ return h(CChip, { value: item, key: item }, { default: () => item })
25
+ }
26
+
27
+ const { value, label, ...rest } = item
28
+ return h(CChip, { value, key: value, ...rest }, { default: () => label ?? value })
29
+ })
@@ -0,0 +1,3 @@
1
+ import { CChipSet } from './CChipSet'
2
+
3
+ export { CChipSet }
@@ -0,0 +1,168 @@
1
+ import { computed, nextTick, provide, ref, type ComputedRef, type InjectionKey } from 'vue'
2
+
3
+ import { SELECTOR_CHIP_FOCUSABLE } from '../chip/const'
4
+ import { isRTL } from '../../utils'
5
+
6
+ export interface ChipSetConfig {
7
+ disabled?: boolean
8
+ filter?: boolean
9
+ removable?: boolean
10
+ removeIcon?: string | object
11
+ selectable?: boolean
12
+ selectedIcon?: string | object
13
+ }
14
+
15
+ export interface ChipSetContext {
16
+ /** Config forwarded to every chip in the set; the chip's own props win. */
17
+ config: ComputedRef<ChipSetConfig>
18
+ isSelected: (value: string) => boolean
19
+ toggleSelected: (value: string, next: boolean, event: MouseEvent | KeyboardEvent) => void
20
+ removeChip: (value: string, event: MouseEvent | KeyboardEvent) => void
21
+ }
22
+
23
+ export const chipSetContextKey: InjectionKey<ChipSetContext> = Symbol('CChipSet')
24
+
25
+ export interface UseChipSetOptions {
26
+ config: ComputedRef<ChipSetConfig>
27
+ selectionMode?: () => 'single' | 'multiple'
28
+ /** Controlled selected values (e.g. v-model:selected). Undefined keeps it uncontrolled. */
29
+ selected?: () => string[] | undefined
30
+ defaultSelected?: string[]
31
+ /** Move focus to a neighbor after removal. Containers with their own target (CChipInput → input) pass false. */
32
+ restoreFocusOnRemove?: boolean
33
+ onSelectionChange?: (selected: string[]) => void
34
+ onRemove?: (value: string) => void
35
+ }
36
+
37
+ /**
38
+ * Shared chip-set engine for CChipSet and CChipInput — the Vue equivalent of the
39
+ * vanilla `ChipInput extends ChipSet`. It owns selection coordination
40
+ * (single/multiple, controlled-or-uncontrolled), roving focus, and the
41
+ * focus-a-neighbor-after-removal behavior, and `provide`s a context that CChip
42
+ * injects. Existence of the chips stays with the caller.
43
+ */
44
+ export const useChipSet = (options: UseChipSetOptions) => {
45
+ const {
46
+ config,
47
+ selectionMode = () => 'multiple',
48
+ selected = () => undefined,
49
+ defaultSelected = [],
50
+ restoreFocusOnRemove = true,
51
+ onSelectionChange,
52
+ onRemove,
53
+ } = options
54
+
55
+ const rootRef = ref<HTMLElement>()
56
+ const internalSelected = ref<string[]>(defaultSelected)
57
+
58
+ const selectedValues = computed(() => {
59
+ const controlled = selected()
60
+ return controlled === undefined ? internalSelected.value : controlled
61
+ })
62
+
63
+ const getFocusableChips = (): HTMLElement[] => [
64
+ ...(rootRef.value?.querySelectorAll<HTMLElement>(SELECTOR_CHIP_FOCUSABLE) ?? []),
65
+ ]
66
+
67
+ const emitSelection = (next: string[]): void => {
68
+ if (selected() === undefined) {
69
+ internalSelected.value = next
70
+ }
71
+ onSelectionChange?.(next)
72
+ }
73
+
74
+ const toggleSelected = (value: string, next: boolean): void => {
75
+ const isSelected = selectedValues.value.includes(value)
76
+ if (next === isSelected) {
77
+ return
78
+ }
79
+
80
+ if (next) {
81
+ // Single selection mode keeps only the freshly selected chip.
82
+ emitSelection(selectionMode() === 'single' ? [value] : [...selectedValues.value, value])
83
+ return
84
+ }
85
+
86
+ emitSelection(selectedValues.value.filter((item) => item !== value))
87
+ }
88
+
89
+ const clearSelection = (): void => {
90
+ if (selectedValues.value.length > 0) {
91
+ emitSelection([])
92
+ }
93
+ }
94
+
95
+ const removeChip = (value: string): void => {
96
+ if (restoreFocusOnRemove) {
97
+ const chips = getFocusableChips()
98
+ const index = chips.findIndex((chip) => chip.dataset.coreuiChipValue === value)
99
+ // Prefer the next chip, fall back to the previous one at the end.
100
+ const neighbor = chips[index + 1] ?? chips[index - 1] ?? null
101
+ const neighborValue = neighbor?.dataset.coreuiChipValue ?? null
102
+
103
+ if (neighborValue !== null) {
104
+ nextTick(() => {
105
+ rootRef.value
106
+ ?.querySelector<HTMLElement>(`[data-coreui-chip-value="${neighborValue}"]`)
107
+ ?.focus()
108
+ })
109
+ }
110
+ }
111
+
112
+ emitSelection(selectedValues.value.filter((item) => item !== value))
113
+ onRemove?.(value)
114
+ }
115
+
116
+ // Roving focus: arrow keys move between chips and Home/End jump to the edges,
117
+ // with no cycling. Returns true when the key was handled.
118
+ const handleKeydown = (event: KeyboardEvent): boolean => {
119
+ const chip = (event.target as HTMLElement).closest<HTMLElement>(SELECTOR_CHIP_FOCUSABLE)
120
+ if (!chip) {
121
+ return false
122
+ }
123
+
124
+ const chips = getFocusableChips()
125
+ const index = chips.indexOf(chip)
126
+ // In RTL the visual direction is mirrored, so left/right swap.
127
+ const rtl = isRTL(rootRef.value)
128
+
129
+ switch (event.key) {
130
+ case 'ArrowLeft': {
131
+ event.preventDefault()
132
+ chips[rtl ? index + 1 : index - 1]?.focus()
133
+ return true
134
+ }
135
+
136
+ case 'ArrowRight': {
137
+ event.preventDefault()
138
+ chips[rtl ? index - 1 : index + 1]?.focus()
139
+ return true
140
+ }
141
+
142
+ case 'Home': {
143
+ event.preventDefault()
144
+ chips[0]?.focus()
145
+ return true
146
+ }
147
+
148
+ case 'End': {
149
+ event.preventDefault()
150
+ chips[chips.length - 1]?.focus()
151
+ return true
152
+ }
153
+
154
+ default: {
155
+ return false
156
+ }
157
+ }
158
+ }
159
+
160
+ provide(chipSetContextKey, {
161
+ config,
162
+ isSelected: (value: string) => selectedValues.value.includes(value),
163
+ toggleSelected: (value, next) => toggleSelected(value, next),
164
+ removeChip: (value) => removeChip(value),
165
+ })
166
+
167
+ return { rootRef, selectedValues, clearSelection, getFocusableChips, handleKeydown }
168
+ }
@@ -49,7 +49,7 @@ const CCollapse = defineComponent({
49
49
  const handleAfterEnter = (el: RendererElement) => {
50
50
  show.value = true
51
51
  collapsing.value = false
52
- props.horizontal ? el.style.removeProperty('width') : el.style.removeProperty('height')
52
+ el.style.removeProperty(props.horizontal ? 'width' : 'height')
53
53
  }
54
54
 
55
55
  const handleBeforeLeave = (el: RendererElement) => {
@@ -76,7 +76,7 @@ const CCollapse = defineComponent({
76
76
 
77
77
  const handleAfterLeave = (el: RendererElement) => {
78
78
  collapsing.value = false
79
- props.horizontal ? el.style.removeProperty('width') : el.style.removeProperty('height')
79
+ el.style.removeProperty(props.horizontal ? 'width' : 'height')
80
80
  }
81
81
 
82
82
  return () =>
@@ -101,10 +101,10 @@ const CCollapse = defineComponent({
101
101
  { 'collapse-horizontal': props.horizontal, show: show.value },
102
102
  ],
103
103
  },
104
- slots.default && slots.default(),
104
+ slots.default && slots.default()
105
105
  ),
106
- [[vVisible, props.visible]],
107
- ),
106
+ [[vVisible, props.visible]]
107
+ )
108
108
  )
109
109
  },
110
110
  })
@@ -0,0 +1,48 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import { CCollapse as Component } from '../../../index'
3
+
4
+ const ComponentName = 'CCollapse'
5
+
6
+ describe(`Loads and display ${ComponentName} component`, () => {
7
+ it('has a name', () => {
8
+ expect(Component.name).toMatch(ComponentName)
9
+ })
10
+
11
+ it('renders correctly', () => {
12
+ const wrapper = mount(Component, {
13
+ slots: { default: 'Collapsed content' },
14
+ })
15
+ expect(wrapper.html()).toMatchSnapshot()
16
+ })
17
+
18
+ it('renders the default slot', () => {
19
+ const wrapper = mount(Component, {
20
+ slots: { default: 'Collapsed content' },
21
+ })
22
+ expect(wrapper.text()).toContain('Collapsed content')
23
+ })
24
+
25
+ it('is hidden by default', () => {
26
+ const wrapper = mount(Component, {
27
+ slots: { default: 'content' },
28
+ })
29
+ expect(wrapper.find('div').classes('collapse')).toBe(true)
30
+ expect(wrapper.find('div').classes('show')).toBe(false)
31
+ })
32
+
33
+ it('is shown when visible is true', () => {
34
+ const wrapper = mount(Component, {
35
+ props: { visible: true },
36
+ slots: { default: 'content' },
37
+ })
38
+ expect(wrapper.find('div').classes('show')).toBe(true)
39
+ })
40
+
41
+ it('applies the horizontal class', () => {
42
+ const wrapper = mount(Component, {
43
+ props: { horizontal: true },
44
+ slots: { default: 'content' },
45
+ })
46
+ expect(wrapper.find('div').classes('collapse-horizontal')).toBe(true)
47
+ })
48
+ })
@@ -0,0 +1,7 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Loads and display CCollapse component renders correctly 1`] = `
4
+ "<transition-stub appear="false" persisted="false" css="false">
5
+ <div class="collapse">Collapsed content</div>
6
+ </transition-stub>"
7
+ `;
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, h, PropType, ref, Teleport, watch } from 'vue'
2
2
 
3
3
  const getContainer = (
4
- container?: HTMLElement | (() => HTMLElement) | string,
4
+ container?: HTMLElement | (() => HTMLElement) | string
5
5
  ): HTMLElement | string => {
6
6
  if (container) {
7
7
  return typeof container === 'function' ? container() : container
@@ -39,7 +39,7 @@ const CConditionalTeleport = defineComponent({
39
39
  if (props.teleport) {
40
40
  container.value = getContainer(props.container)
41
41
  }
42
- },
42
+ }
43
43
  )
44
44
 
45
45
  return () =>
@@ -51,7 +51,7 @@ const CConditionalTeleport = defineComponent({
51
51
  },
52
52
  {
53
53
  default: () => slots.default && slots.default(),
54
- },
54
+ }
55
55
  )
56
56
  },
57
57
  })
@@ -0,0 +1,28 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import { CConditionalTeleport as Component } from '../../../index'
3
+
4
+ const ComponentName = 'CConditionalTeleport'
5
+
6
+ describe(`Loads and display ${ComponentName} component`, () => {
7
+ it('has a name', () => {
8
+ expect(Component.name).toMatch(ComponentName)
9
+ })
10
+
11
+ it('renders the slot inline when teleport is disabled', () => {
12
+ const wrapper = mount(Component, {
13
+ props: { teleport: false },
14
+ slots: { default: '<span class="child">Inline</span>' },
15
+ })
16
+ expect(wrapper.find('.child').exists()).toBe(true)
17
+ expect(wrapper.text()).toContain('Inline')
18
+ })
19
+
20
+ it('teleports the slot to the body by default', () => {
21
+ mount(Component, {
22
+ props: { container: document.body },
23
+ slots: { default: '<span class="teleported">Teleported</span>' },
24
+ attachTo: document.body,
25
+ })
26
+ expect(document.body.querySelector('.teleported')).not.toBeNull()
27
+ })
28
+ })
@@ -159,6 +159,19 @@ const CDatePicker = defineComponent({
159
159
  return false
160
160
  },
161
161
  },
162
+ /**
163
+ * Sets the format for month names.
164
+ *
165
+ * @default 'short'
166
+ * @since 5.18.0
167
+ */
168
+ monthFormat: {
169
+ type: String as PropType<'long' | 'narrow' | 'short' | 'numeric' | '2-digit'>,
170
+ default: 'short',
171
+ validator: (value: string) => {
172
+ return ['long', 'narrow', 'short', 'numeric', '2-digit'].includes(value)
173
+ },
174
+ },
162
175
  /**
163
176
  * Toggle the disabled state for the component.
164
177
  */
@@ -297,14 +310,14 @@ const CDatePicker = defineComponent({
297
310
  */
298
311
  selectAdjacementDays: Boolean,
299
312
  /**
300
- * Specify the type of date selection as day, week, month, or year.
313
+ * Specify the type of date selection as day, week, month, quarter, or year.
301
314
  *
302
315
  * @since 5.0.0
303
316
  */
304
317
  selectionType: {
305
- type: String as PropType<'day' | 'week' | 'month' | 'year'>,
318
+ type: String as PropType<'day' | 'week' | 'month' | 'quarter' | 'year'>,
306
319
  default: 'day',
307
- validator: (value: string) => ['day', 'week', 'month', 'year'].includes(value),
320
+ validator: (value: string) => ['day', 'week', 'month', 'quarter', 'year'].includes(value),
308
321
  },
309
322
  /**
310
323
  * Set whether to display dates in adjacent months (non-selectable) at the start and end of the current month.
@@ -373,6 +386,19 @@ const CDatePicker = defineComponent({
373
386
  * @since 5.0.0
374
387
  */
375
388
  weekNumbersLabel: String,
389
+ /**
390
+ * Sets the format for years.
391
+ *
392
+ * @default 'numeric'
393
+ * @since 5.18.0
394
+ */
395
+ yearFormat: {
396
+ type: String as PropType<'numeric' | '2-digit'>,
397
+ default: 'numeric',
398
+ validator: (value: string) => {
399
+ return ['numeric', '2-digit'].includes(value)
400
+ },
401
+ },
376
402
  },
377
403
  emits: [
378
404
  /**
@@ -390,18 +416,52 @@ const CDatePicker = defineComponent({
390
416
  */
391
417
  'update:date',
392
418
  ],
393
- setup(props, { emit }) {
419
+ setup(props, { emit, slots }) {
394
420
  return () =>
395
- h(CDateRangePicker, {
396
- calendars: 1,
397
- onStartDateChange: (date: Date, formatedDate: string) => {
398
- emit('date-change', date, formatedDate)
399
- emit('update:date', date)
421
+ h(
422
+ CDateRangePicker,
423
+ {
424
+ calendars: 1,
425
+ onStartDateChange: (date: Date, formatedDate: string) => {
426
+ emit('date-change', date, formatedDate)
427
+ emit('update:date', date)
428
+ },
429
+ range: false,
430
+ startDate: props.date,
431
+ ...props,
400
432
  },
401
- range: false,
402
- startDate: props.date,
403
- ...props,
404
- })
433
+ {
434
+ ...(slots.dayCell && {
435
+ dayCell: (slotProps: Record<string, unknown>) => slots.dayCell?.(slotProps),
436
+ }),
437
+ ...(slots.monthCell && {
438
+ monthCell: (slotProps: Record<string, unknown>) =>
439
+ slots.monthCell?.(slotProps),
440
+ }),
441
+ ...(slots.quarterCell && {
442
+ quarterCell: (slotProps: Record<string, unknown>) =>
443
+ slots.quarterCell?.(slotProps),
444
+ }),
445
+ ...(slots.yearCell && {
446
+ yearCell: (slotProps: Record<string, unknown>) =>
447
+ slots.yearCell?.(slotProps),
448
+ }),
449
+ ...(slots.navNextIcon && {
450
+ navNextIcon: () => slots.navNextIcon?.(),
451
+ }),
452
+ ...(slots.navNextDoubleIcon && {
453
+ navNextDoubleIcon: () =>
454
+ slots.navNextDoubleIcon?.(),
455
+ }),
456
+ ...(slots.navPrevIcon && {
457
+ navPrevIcon: () => slots.navPrevIcon?.(),
458
+ }),
459
+ ...(slots.navPrevDoubleIcon && {
460
+ navPrevDoubleIcon: () =>
461
+ slots.navPrevDoubleIcon?.(),
462
+ }),
463
+ }
464
+ )
405
465
  },
406
466
  })
407
467