@coreui/vue-pro 5.18.0 → 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 (422) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/carousel/CCarousel.d.ts +24 -2
  3. package/dist/cjs/components/carousel/CCarousel.js +51 -14
  4. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  5. package/dist/cjs/components/carousel/CCarouselItem.js +3 -3
  6. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  7. package/dist/cjs/components/chip/CChip.d.ts +97 -11
  8. package/dist/cjs/components/chip/CChip.js +107 -79
  9. package/dist/cjs/components/chip/CChip.js.map +1 -1
  10. package/dist/cjs/components/chip/const.d.ts +1 -0
  11. package/dist/cjs/components/chip/const.js +8 -0
  12. package/dist/cjs/components/chip/const.js.map +1 -0
  13. package/dist/cjs/components/chip-input/CChipInput.d.ts +30 -2
  14. package/dist/cjs/components/chip-input/CChipInput.js +108 -66
  15. package/dist/cjs/components/chip-input/CChipInput.js.map +1 -1
  16. package/dist/cjs/components/chip-set/CChipSet.d.ts +145 -0
  17. package/dist/cjs/components/chip-set/CChipSet.js +127 -0
  18. package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
  19. package/dist/cjs/components/chip-set/buildChips.d.ts +13 -0
  20. package/dist/cjs/components/chip-set/buildChips.js +19 -0
  21. package/dist/cjs/components/chip-set/buildChips.js.map +1 -0
  22. package/dist/cjs/components/chip-set/index.d.ts +2 -0
  23. package/dist/cjs/components/chip-set/useChipSet.d.ts +42 -0
  24. package/dist/cjs/components/chip-set/useChipSet.js +115 -0
  25. package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
  26. package/dist/cjs/components/collapse/CCollapse.js +2 -2
  27. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  28. package/dist/cjs/components/dropdown/CDropdown.d.ts +24 -1
  29. package/dist/cjs/components/dropdown/CDropdown.js +34 -17
  30. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  31. package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
  32. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  33. package/dist/cjs/components/focus-trap/CFocusTrap.js +4 -1
  34. package/dist/cjs/components/focus-trap/CFocusTrap.js.map +1 -1
  35. package/dist/cjs/components/form/CFormInput.d.ts +3 -0
  36. package/dist/cjs/components/form/CFormRange.d.ts +2 -2
  37. package/dist/cjs/components/form/CFormRange.js +2 -2
  38. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  39. package/dist/cjs/components/grid/CContainer.js +3 -1
  40. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  41. package/dist/cjs/components/index.d.ts +2 -0
  42. package/dist/cjs/components/index.js +30 -24
  43. package/dist/cjs/components/index.js.map +1 -1
  44. package/dist/cjs/components/modal/CModal.js +3 -2
  45. package/dist/cjs/components/modal/CModal.js.map +1 -1
  46. package/dist/cjs/components/modal/CModalHeader.js +6 -3
  47. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  48. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +206 -3
  49. package/dist/cjs/components/multi-select/CMultiSelect.js +304 -28
  50. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  51. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -2
  52. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  53. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +16 -1
  54. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +59 -3
  55. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  56. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +9 -0
  57. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +6 -1
  58. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  59. package/dist/cjs/components/multi-select/utils.js +0 -3
  60. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  61. package/dist/cjs/components/nav/CNav.js +8 -1
  62. package/dist/cjs/components/nav/CNav.js.map +1 -1
  63. package/dist/cjs/components/nav/CNavGroup.d.ts +15 -7
  64. package/dist/cjs/components/nav/CNavGroup.js +113 -88
  65. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  66. package/dist/cjs/components/nav/CNavLink.js +11 -0
  67. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  68. package/dist/cjs/components/popover/CPopover.d.ts +24 -1
  69. package/dist/cjs/components/popover/CPopover.js +18 -1
  70. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  71. package/dist/cjs/components/range-slider/CRangeSlider.d.ts +1 -1
  72. package/dist/cjs/components/search-button/CSearchButton.d.ts +63 -0
  73. package/dist/cjs/components/search-button/CSearchButton.js +125 -0
  74. package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
  75. package/dist/cjs/components/search-button/index.d.ts +6 -0
  76. package/dist/cjs/components/search-button/index.js +13 -0
  77. package/dist/cjs/components/search-button/index.js.map +1 -0
  78. package/dist/cjs/components/search-button/types.d.ts +10 -0
  79. package/dist/cjs/components/search-button/utils.d.ts +11 -0
  80. package/dist/cjs/components/search-button/utils.js +114 -0
  81. package/dist/cjs/components/search-button/utils.js.map +1 -0
  82. package/dist/cjs/components/sidebar/CSidebar.js +4 -3
  83. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  84. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +32 -0
  85. package/dist/cjs/components/sidebar/CSidebarNav.js +28 -24
  86. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  87. package/dist/cjs/components/spinner/CSpinner.d.ts +4 -4
  88. package/dist/cjs/components/spinner/CSpinner.js +2 -2
  89. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  90. package/dist/cjs/components/table/utils.js +4 -4
  91. package/dist/cjs/components/table/utils.js.map +1 -1
  92. package/dist/cjs/components/tabs/CTabList.js +8 -2
  93. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  94. package/dist/cjs/components/tabs/CTabs.js +1 -1
  95. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  96. package/dist/cjs/components/toast/CToast.js +12 -2
  97. package/dist/cjs/components/toast/CToast.js.map +1 -1
  98. package/dist/cjs/components/toast/CToastClose.d.ts +3 -2
  99. package/dist/cjs/components/toast/CToastClose.js +2 -3
  100. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  101. package/dist/cjs/components/tooltip/CTooltip.d.ts +24 -1
  102. package/dist/cjs/components/tooltip/CTooltip.js +18 -1
  103. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  104. package/dist/cjs/directives/v-c-popover.js +6 -3
  105. package/dist/cjs/directives/v-c-popover.js.map +1 -1
  106. package/dist/cjs/directives/v-c-tooltip.js +6 -3
  107. package/dist/cjs/directives/v-c-tooltip.js.map +1 -1
  108. package/dist/cjs/directives/v-c-visible.js +1 -1
  109. package/dist/cjs/directives/v-c-visible.js.map +1 -1
  110. package/dist/cjs/index.js +36 -30
  111. package/dist/cjs/index.js.map +1 -1
  112. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  113. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  114. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  115. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  116. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  117. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  118. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  119. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  120. package/dist/cjs/utils/index.d.ts +2 -1
  121. package/dist/cjs/utils/swipe.d.ts +26 -0
  122. package/dist/cjs/utils/swipe.js +94 -0
  123. package/dist/cjs/utils/swipe.js.map +1 -0
  124. package/dist/cjs/utils/transition.js.map +1 -1
  125. package/dist/esm/components/carousel/CCarousel.d.ts +24 -2
  126. package/dist/esm/components/carousel/CCarousel.js +52 -15
  127. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  128. package/dist/esm/components/carousel/CCarouselItem.js +3 -3
  129. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  130. package/dist/esm/components/chip/CChip.d.ts +97 -11
  131. package/dist/esm/components/chip/CChip.js +108 -80
  132. package/dist/esm/components/chip/CChip.js.map +1 -1
  133. package/dist/esm/components/chip/const.d.ts +1 -0
  134. package/dist/esm/components/chip/const.js +6 -0
  135. package/dist/esm/components/chip/const.js.map +1 -0
  136. package/dist/esm/components/chip-input/CChipInput.d.ts +30 -2
  137. package/dist/esm/components/chip-input/CChipInput.js +109 -67
  138. package/dist/esm/components/chip-input/CChipInput.js.map +1 -1
  139. package/dist/esm/components/chip-set/CChipSet.d.ts +145 -0
  140. package/dist/esm/components/chip-set/CChipSet.js +125 -0
  141. package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
  142. package/dist/esm/components/chip-set/buildChips.d.ts +13 -0
  143. package/dist/esm/components/chip-set/buildChips.js +17 -0
  144. package/dist/esm/components/chip-set/buildChips.js.map +1 -0
  145. package/dist/esm/components/chip-set/index.d.ts +2 -0
  146. package/dist/esm/components/chip-set/useChipSet.d.ts +42 -0
  147. package/dist/esm/components/chip-set/useChipSet.js +112 -0
  148. package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
  149. package/dist/esm/components/collapse/CCollapse.js +2 -2
  150. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  151. package/dist/esm/components/dropdown/CDropdown.d.ts +24 -1
  152. package/dist/esm/components/dropdown/CDropdown.js +34 -17
  153. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  154. package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
  155. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  156. package/dist/esm/components/focus-trap/CFocusTrap.js +4 -1
  157. package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -1
  158. package/dist/esm/components/form/CFormInput.d.ts +3 -0
  159. package/dist/esm/components/form/CFormRange.d.ts +2 -2
  160. package/dist/esm/components/form/CFormRange.js +2 -2
  161. package/dist/esm/components/form/CFormRange.js.map +1 -1
  162. package/dist/esm/components/grid/CContainer.js +3 -1
  163. package/dist/esm/components/grid/CContainer.js.map +1 -1
  164. package/dist/esm/components/index.d.ts +2 -0
  165. package/dist/esm/components/index.js +3 -0
  166. package/dist/esm/components/index.js.map +1 -1
  167. package/dist/esm/components/modal/CModal.js +3 -2
  168. package/dist/esm/components/modal/CModal.js.map +1 -1
  169. package/dist/esm/components/modal/CModalHeader.js +6 -3
  170. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  171. package/dist/esm/components/multi-select/CMultiSelect.d.ts +206 -3
  172. package/dist/esm/components/multi-select/CMultiSelect.js +305 -29
  173. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  174. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -2
  175. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  176. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +16 -1
  177. package/dist/esm/components/multi-select/CMultiSelectOptions.js +59 -3
  178. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  179. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +9 -0
  180. package/dist/esm/components/multi-select/CMultiSelectSelection.js +6 -1
  181. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  182. package/dist/esm/components/multi-select/utils.js +0 -3
  183. package/dist/esm/components/multi-select/utils.js.map +1 -1
  184. package/dist/esm/components/nav/CNav.js +8 -1
  185. package/dist/esm/components/nav/CNav.js.map +1 -1
  186. package/dist/esm/components/nav/CNavGroup.d.ts +15 -7
  187. package/dist/esm/components/nav/CNavGroup.js +114 -89
  188. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  189. package/dist/esm/components/nav/CNavLink.js +12 -1
  190. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  191. package/dist/esm/components/popover/CPopover.d.ts +24 -1
  192. package/dist/esm/components/popover/CPopover.js +18 -1
  193. package/dist/esm/components/popover/CPopover.js.map +1 -1
  194. package/dist/esm/components/range-slider/CRangeSlider.d.ts +1 -1
  195. package/dist/esm/components/search-button/CSearchButton.d.ts +63 -0
  196. package/dist/esm/components/search-button/CSearchButton.js +123 -0
  197. package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
  198. package/dist/esm/components/search-button/index.d.ts +6 -0
  199. package/dist/esm/components/search-button/index.js +10 -0
  200. package/dist/esm/components/search-button/index.js.map +1 -0
  201. package/dist/esm/components/search-button/types.d.ts +10 -0
  202. package/dist/esm/components/search-button/utils.d.ts +11 -0
  203. package/dist/esm/components/search-button/utils.js +103 -0
  204. package/dist/esm/components/search-button/utils.js.map +1 -0
  205. package/dist/esm/components/sidebar/CSidebar.js +4 -3
  206. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  207. package/dist/esm/components/sidebar/CSidebarNav.d.ts +32 -0
  208. package/dist/esm/components/sidebar/CSidebarNav.js +29 -25
  209. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  210. package/dist/esm/components/spinner/CSpinner.d.ts +4 -4
  211. package/dist/esm/components/spinner/CSpinner.js +2 -2
  212. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  213. package/dist/esm/components/table/utils.js +4 -4
  214. package/dist/esm/components/table/utils.js.map +1 -1
  215. package/dist/esm/components/tabs/CTabList.js +8 -2
  216. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  217. package/dist/esm/components/tabs/CTabs.js +1 -1
  218. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  219. package/dist/esm/components/toast/CToast.js +12 -2
  220. package/dist/esm/components/toast/CToast.js.map +1 -1
  221. package/dist/esm/components/toast/CToastClose.d.ts +3 -2
  222. package/dist/esm/components/toast/CToastClose.js +2 -3
  223. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  224. package/dist/esm/components/tooltip/CTooltip.d.ts +24 -1
  225. package/dist/esm/components/tooltip/CTooltip.js +18 -1
  226. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  227. package/dist/esm/directives/v-c-popover.js +6 -3
  228. package/dist/esm/directives/v-c-popover.js.map +1 -1
  229. package/dist/esm/directives/v-c-tooltip.js +6 -3
  230. package/dist/esm/directives/v-c-tooltip.js.map +1 -1
  231. package/dist/esm/directives/v-c-visible.js +1 -1
  232. package/dist/esm/directives/v-c-visible.js.map +1 -1
  233. package/dist/esm/index.js +3 -0
  234. package/dist/esm/index.js.map +1 -1
  235. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  236. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  237. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  238. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  239. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  240. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  241. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  242. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  243. package/dist/esm/utils/index.d.ts +2 -1
  244. package/dist/esm/utils/swipe.d.ts +26 -0
  245. package/dist/esm/utils/swipe.js +90 -0
  246. package/dist/esm/utils/swipe.js.map +1 -0
  247. package/dist/esm/utils/transition.js.map +1 -1
  248. package/package.json +6 -6
  249. package/src/components/accordion/CAccordion.ts +2 -2
  250. package/src/components/accordion/CAccordionBody.ts +1 -1
  251. package/src/components/accordion/CAccordionButton.ts +1 -1
  252. package/src/components/accordion/CAccordionHeader.ts +2 -2
  253. package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap +1 -1
  254. package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap +1 -1
  255. package/src/components/alert/CAlert.ts +3 -3
  256. package/src/components/alert/CAlertHeading.ts +1 -1
  257. package/src/components/alert/CAlertLink.ts +1 -1
  258. package/src/components/autocomplete/__tests__/CAutocomplete.spec.ts +5 -1
  259. package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.ts +8 -5
  260. package/src/components/avatar/CAvatar.ts +1 -1
  261. package/src/components/backdrop/CBackdrop.ts +1 -1
  262. package/src/components/badge/CBadge.ts +1 -1
  263. package/src/components/breadcrumb/CBreadcrumb.ts +1 -1
  264. package/src/components/breadcrumb/CBreadcrumbItem.ts +1 -1
  265. package/src/components/button/CButton.ts +1 -1
  266. package/src/components/button/__tests__/CButton.spec.ts +0 -1
  267. package/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap +1 -1
  268. package/src/components/button-group/CButtonGroup.ts +1 -1
  269. package/src/components/callout/CCallout.ts +1 -1
  270. package/src/components/card/CCard.ts +1 -1
  271. package/src/components/card/CCardImage.ts +1 -1
  272. package/src/components/card/CCardLink.ts +1 -1
  273. package/src/components/carousel/CCarousel.ts +61 -22
  274. package/src/components/carousel/CCarouselCaption.ts +1 -1
  275. package/src/components/carousel/CCarouselItem.ts +5 -4
  276. package/src/components/carousel/__tests__/CCarousel.spec.ts +1 -1
  277. package/src/components/chip/CChip.ts +123 -101
  278. package/src/components/chip/__tests__/CChip.spec.ts +26 -0
  279. package/src/components/chip/const.ts +3 -0
  280. package/src/components/chip-input/CChipInput.ts +134 -82
  281. package/src/components/chip-input/__tests__/CChipInput.spec.ts +80 -4
  282. package/src/components/chip-input/__tests__/__snapshots__/CChipInput.spec.ts.snap +1 -1
  283. package/src/components/chip-set/CChipSet.ts +140 -0
  284. package/src/components/chip-set/__tests__/CChipSet.spec.ts +174 -0
  285. package/src/components/chip-set/buildChips.ts +29 -0
  286. package/src/components/chip-set/index.ts +3 -0
  287. package/src/components/chip-set/useChipSet.ts +168 -0
  288. package/src/components/collapse/CCollapse.ts +5 -5
  289. package/src/components/collapse/__tests__/CCollapse.spec.ts +48 -0
  290. package/src/components/collapse/__tests__/__snapshots__/CCollapse.spec.ts.snap +7 -0
  291. package/src/components/conditional-teleport/CConditionalTeleport.ts +3 -3
  292. package/src/components/conditional-teleport/__tests__/CConditionalTeleport.spec.ts +28 -0
  293. package/src/components/dropdown/CDropdown.ts +43 -23
  294. package/src/components/dropdown/CDropdownHeader.ts +1 -1
  295. package/src/components/dropdown/CDropdownItem.ts +1 -1
  296. package/src/components/dropdown/CDropdownMenu.ts +2 -2
  297. package/src/components/dropdown/CDropdownToggle.ts +4 -4
  298. package/src/components/dropdown/__tests__/CDropdown.spec.ts +1 -1
  299. package/src/components/dropdown/__tests__/CDropdownMenu.spec.ts +11 -7
  300. package/src/components/dropdown/__tests__/CDropdownPopperConfig.spec.ts +63 -0
  301. package/src/components/dropdown/__tests__/CDropdownToggle.spec.ts +0 -2
  302. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap +1 -1
  303. package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap +4 -0
  304. package/src/components/dropdown/utils.ts +2 -2
  305. package/src/components/focus-trap/CFocusTrap.ts +9 -6
  306. package/src/components/focus-trap/__tests__/CFocusTrap.spec.ts +42 -0
  307. package/src/components/footer/CFooter.ts +1 -1
  308. package/src/components/form/CForm.ts +1 -1
  309. package/src/components/form/CFormCheck.ts +5 -5
  310. package/src/components/form/CFormControlValidation.ts +3 -3
  311. package/src/components/form/CFormFeedback.ts +1 -1
  312. package/src/components/form/CFormFloating.ts +1 -1
  313. package/src/components/form/CFormInput.ts +2 -2
  314. package/src/components/form/CFormLabel.ts +1 -1
  315. package/src/components/form/CFormRange.ts +4 -4
  316. package/src/components/form/CFormSelect.ts +3 -3
  317. package/src/components/form/CFormSwitch.ts +2 -2
  318. package/src/components/form/CFormTextarea.ts +2 -2
  319. package/src/components/form/CInputGroup.ts +1 -1
  320. package/src/components/form/__tests__/CFormRange.spec.ts +2 -2
  321. package/src/components/form/__tests__/CFormText.spec.ts +1 -1
  322. package/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap +1 -1
  323. package/src/components/grid/CCol.ts +1 -1
  324. package/src/components/grid/CContainer.ts +4 -2
  325. package/src/components/grid/CRow.ts +1 -1
  326. package/src/components/header/CHeader.ts +2 -2
  327. package/src/components/header/CHeaderNav.ts +1 -1
  328. package/src/components/header/CHeaderToggler.ts +1 -1
  329. package/src/components/header/__tests__/CHeader.spec.ts +1 -2
  330. package/src/components/index.ts +2 -0
  331. package/src/components/link/CLink.ts +1 -1
  332. package/src/components/list-group/CListGroup.ts +1 -1
  333. package/src/components/list-group/CListGroupItem.ts +1 -1
  334. package/src/components/modal/CModal.ts +3 -2
  335. package/src/components/modal/CModalHeader.ts +10 -3
  336. package/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap +9 -4
  337. package/src/components/multi-select/CMultiSelect.ts +380 -41
  338. package/src/components/multi-select/CMultiSelectNativeSelect.ts +1 -2
  339. package/src/components/multi-select/CMultiSelectOptions.ts +77 -3
  340. package/src/components/multi-select/CMultiSelectSelection.ts +6 -1
  341. package/src/components/nav/CNav.ts +9 -2
  342. package/src/components/nav/CNavGroup.ts +147 -99
  343. package/src/components/nav/CNavItem.ts +2 -2
  344. package/src/components/nav/CNavLink.ts +19 -2
  345. package/src/components/nav/__tests__/CNavGroup.spec.ts +188 -6
  346. package/src/components/nav/__tests__/CNavItem.spec.ts +6 -6
  347. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap +3 -7
  348. package/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap +1 -5
  349. package/src/components/navbar/CNavbar.ts +2 -2
  350. package/src/components/navbar/CNavbarBrand.ts +1 -1
  351. package/src/components/navbar/CNavbarNav.ts +1 -1
  352. package/src/components/navbar/CNavbarToggler.ts +1 -1
  353. package/src/components/navbar/__tests__/CNavbar.spec.ts +1 -1
  354. package/src/components/pagination/CPagination.ts +2 -2
  355. package/src/components/pagination/CPaginationItem.ts +2 -2
  356. package/src/components/placeholder/CPlaceholder.ts +1 -1
  357. package/src/components/popover/CPopover.ts +27 -7
  358. package/src/components/popover/__tests__/CPopover.spec.ts +43 -0
  359. package/src/components/progress/CProgress.ts +2 -2
  360. package/src/components/progress/CProgressBar.ts +1 -1
  361. package/src/components/progress/CProgressStacked.ts +1 -1
  362. package/src/components/progress/__tests__/CProgressBar.spec.ts +0 -4
  363. package/src/components/search-button/CSearchButton.ts +163 -0
  364. package/src/components/search-button/__tests__/CSearchButton.spec.ts +128 -0
  365. package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.ts.snap +13 -0
  366. package/src/components/search-button/index.ts +10 -0
  367. package/src/components/search-button/types.ts +10 -0
  368. package/src/components/search-button/utils.ts +140 -0
  369. package/src/components/sidebar/CSidebar.ts +9 -6
  370. package/src/components/sidebar/CSidebarBrand.ts +1 -1
  371. package/src/components/sidebar/CSidebarNav.ts +30 -28
  372. package/src/components/sidebar/__tests__/CSidebar.spec.ts +1 -1
  373. package/src/components/spinner/CSpinner.ts +6 -6
  374. package/src/components/spinner/__tests__/CSpinner.spec.ts +0 -1
  375. package/src/components/stepper/__tests__/CStepper.spec.ts +13 -8
  376. package/src/components/table/CTable.ts +16 -16
  377. package/src/components/table/CTableBody.ts +1 -1
  378. package/src/components/table/CTableDataCell.ts +1 -1
  379. package/src/components/table/CTableFoot.ts +1 -1
  380. package/src/components/table/CTableHead.ts +1 -1
  381. package/src/components/table/CTableHeaderCell.ts +1 -1
  382. package/src/components/table/CTableRow.ts +1 -1
  383. package/src/components/table/types.ts +1 -0
  384. package/src/components/table/utils.ts +4 -4
  385. package/src/components/tabs/CTab.ts +1 -1
  386. package/src/components/tabs/CTabList.ts +12 -5
  387. package/src/components/tabs/CTabPane.ts +3 -3
  388. package/src/components/tabs/CTabPanel.ts +5 -5
  389. package/src/components/tabs/CTabs.ts +2 -2
  390. package/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap +1 -1
  391. package/src/components/toast/CToast.ts +12 -4
  392. package/src/components/toast/CToastClose.ts +5 -6
  393. package/src/components/toast/CToaster.ts +1 -1
  394. package/src/components/toast/__tests__/CToaster.spec.ts +0 -2
  395. package/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap +1 -1
  396. package/src/components/tooltip/CTooltip.ts +26 -6
  397. package/src/components/tooltip/__tests__/CTooltip.spec.ts +43 -0
  398. package/src/components/widgets/CWidgetStatsA.ts +4 -4
  399. package/src/components/widgets/CWidgetStatsB.ts +5 -5
  400. package/src/components/widgets/CWidgetStatsC.ts +5 -5
  401. package/src/components/widgets/CWidgetStatsD.ts +5 -5
  402. package/src/components/widgets/CWidgetStatsE.ts +4 -4
  403. package/src/components/widgets/CWidgetStatsF.ts +5 -5
  404. package/src/directives/__tests__/v-c-placeholder.spec.ts +33 -0
  405. package/src/directives/__tests__/v-c-popover.spec.ts +67 -0
  406. package/src/directives/__tests__/v-c-tooltip.spec.ts +66 -0
  407. package/src/directives/v-c-popover.ts +8 -5
  408. package/src/directives/v-c-tooltip.ts +8 -5
  409. package/src/directives/v-c-visible.ts +1 -1
  410. package/src/index.ts +1 -1
  411. package/src/utils/ComponentProps.ts +1 -0
  412. package/src/utils/__tests__/swipe.spec.ts +82 -0
  413. package/src/utils/getNextActiveElement.ts +1 -1
  414. package/src/utils/index.ts +2 -0
  415. package/src/utils/swipe.ts +114 -0
  416. package/src/utils/transition.ts +2 -2
  417. package/dist/cjs/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
  418. package/dist/esm/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
  419. package/src/components/accordion/__tests__/CAccordionCollapse.spec.ts +0 -28
  420. package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.ts.snap +0 -7
  421. package/src/components/collapse/__test__/CCollapse.spec.ts +0 -44
  422. 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
+ })
@@ -10,7 +10,7 @@ import {
10
10
  Ref,
11
11
  watch,
12
12
  } from 'vue'
13
- import type { Placement } from '@popperjs/core'
13
+ import type { Options, Placement } from '@popperjs/core'
14
14
 
15
15
  import { usePopper } from '../../composables'
16
16
  import type { Triggers } from '../../types'
@@ -124,6 +124,19 @@ const CDropdown = defineComponent({
124
124
  type: Boolean,
125
125
  default: true,
126
126
  },
127
+ /**
128
+ * A Popper.js configuration object, or a function that receives the default
129
+ * configuration and returns a modified one, used to customize the
130
+ * positioning of the dropdown menu.
131
+ *
132
+ * @since 5.10.0
133
+ */
134
+ popperConfig: {
135
+ type: [Object, Function] as PropType<
136
+ Partial<Options> | ((defaultPopperConfig: Partial<Options>) => Partial<Options>)
137
+ >,
138
+ default: undefined,
139
+ },
127
140
  /**
128
141
  * Sets the reference element for positioning the Vue Dropdown Menu.
129
142
  * - `toggle` - The Vue Dropdown Toggle button (default).
@@ -162,7 +175,7 @@ const CDropdown = defineComponent({
162
175
  */
163
176
  variant: {
164
177
  type: String,
165
- default: 'btn-group',
178
+ default: 'dropdown',
166
179
  validator: (value: string) => {
167
180
  return ['btn-group', 'dropdown', 'input-group', 'nav-item'].includes(value)
168
181
  },
@@ -192,22 +205,31 @@ const CDropdown = defineComponent({
192
205
 
193
206
  const { initPopper, destroyPopper } = usePopper()
194
207
 
195
- const popperConfig = computed(() => ({
196
- modifiers: [
197
- {
198
- name: 'offset',
199
- options: {
200
- offset: props.offset,
208
+ const popperConfig = computed(() => {
209
+ const defaultPopperConfig = {
210
+ modifiers: [
211
+ {
212
+ name: 'offset',
213
+ options: {
214
+ offset: props.offset,
215
+ },
201
216
  },
202
- },
203
- ],
204
- placement: getPlacement(
205
- props.placement,
206
- props.direction,
207
- props.alignment,
208
- isRTL(dropdownMenuRef.value)
209
- ) as Placement,
210
- }))
217
+ ],
218
+ placement: getPlacement(
219
+ props.placement,
220
+ props.direction,
221
+ props.alignment,
222
+ isRTL(dropdownMenuRef.value)
223
+ ) as Placement,
224
+ }
225
+
226
+ return {
227
+ ...defaultPopperConfig,
228
+ ...(typeof props.popperConfig === 'function'
229
+ ? props.popperConfig(defaultPopperConfig)
230
+ : props.popperConfig),
231
+ }
232
+ })
211
233
 
212
234
  watch(
213
235
  () => props.visible,
@@ -249,16 +271,14 @@ const CDropdown = defineComponent({
249
271
 
250
272
  window.removeEventListener('click', handleClick)
251
273
  window.removeEventListener('keyup', handleKeyup)
252
- dropdownMenuRef.value && dropdownMenuRef.value.removeEventListener('keydown', handleKeydown)
253
- dropdownToggleRef.value &&
254
- dropdownToggleRef.value.removeEventListener('keydown', handleKeydown)
274
+ dropdownMenuRef.value?.removeEventListener('keydown', handleKeydown)
275
+ dropdownToggleRef.value?.removeEventListener('keydown', handleKeydown)
255
276
  emit('hide')
256
277
  })
257
278
 
258
279
  onUnmounted(() => {
259
- dropdownToggleRef.value &&
260
- dropdownToggleRef.value.removeEventListener('keydown', handleKeydown)
261
- dropdownMenuRef.value && dropdownMenuRef.value.removeEventListener('keydown', handleKeydown)
280
+ dropdownToggleRef.value?.removeEventListener('keydown', handleKeydown)
281
+ dropdownMenuRef.value?.removeEventListener('keydown', handleKeydown)
262
282
  })
263
283
 
264
284
  provide('config', {
@@ -18,7 +18,7 @@ const CDropdownHeader = defineComponent({
18
18
  {
19
19
  class: 'dropdown-header',
20
20
  },
21
- slots.default && slots.default(),
21
+ slots.default && slots.default()
22
22
  )
23
23
  },
24
24
  })
@@ -38,7 +38,7 @@ const CDropdownItem = defineComponent({
38
38
  },
39
39
  {
40
40
  default: () => slots.default && slots.default(),
41
- },
41
+ }
42
42
  )
43
43
  },
44
44
  })
@@ -51,9 +51,9 @@ const CDropdownMenu = defineComponent({
51
51
  },
52
52
  props.as === 'ul'
53
53
  ? slots.default && slots.default().map((vnode) => h('li', {}, vnode))
54
- : slots.default && slots.default(),
54
+ : slots.default && slots.default()
55
55
  ),
56
- },
56
+ }
57
57
  )
58
58
  },
59
59
  })