@coreui/vue-pro 5.2.0 → 5.4.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 (219) hide show
  1. package/README.md +2 -1
  2. package/dist/cjs/components/alert/CAlert.d.ts +2 -2
  3. package/dist/cjs/components/avatar/CAvatar.d.ts +2 -10
  4. package/dist/cjs/components/badge/CBadge.d.ts +2 -2
  5. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  6. package/dist/cjs/components/button/CButton.d.ts +2 -6
  7. package/dist/cjs/components/button/CButton.js +2 -1
  8. package/dist/cjs/components/button/CButton.js.map +1 -1
  9. package/dist/cjs/components/calendar/CCalendar.d.ts +86 -10
  10. package/dist/cjs/components/calendar/CCalendar.js +57 -5
  11. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  12. package/dist/cjs/components/calendar/utils.d.ts +4 -4
  13. package/dist/cjs/components/calendar/utils.js +1 -3
  14. package/dist/cjs/components/calendar/utils.js.map +1 -1
  15. package/dist/cjs/components/carousel/CCarousel.d.ts +2 -2
  16. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  17. package/dist/cjs/components/close-button/CCloseButton.js.map +1 -1
  18. package/dist/cjs/components/conditional-teleport/CConditionalTeleport.d.ts +4 -4
  19. package/dist/cjs/components/conditional-teleport/CConditionalTeleport.js +1 -1
  20. package/dist/cjs/components/date-picker/CDatePicker.d.ts +98 -10
  21. package/dist/cjs/components/date-picker/CDatePicker.js +47 -5
  22. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  23. package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +127 -19
  24. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +75 -12
  25. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  26. package/dist/cjs/components/date-range-picker/utils.d.ts +1 -0
  27. package/dist/cjs/components/date-range-picker/utils.js +10 -0
  28. package/dist/cjs/components/date-range-picker/utils.js.map +1 -1
  29. package/dist/cjs/components/dropdown/CDropdown.d.ts +9 -32
  30. package/dist/cjs/components/dropdown/CDropdown.js +2 -2
  31. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  32. package/dist/cjs/components/dropdown/CDropdownToggle.d.ts +2 -2
  33. package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
  34. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  35. package/dist/cjs/components/footer/CFooter.d.ts +17 -1
  36. package/dist/cjs/components/footer/CFooter.js +8 -1
  37. package/dist/cjs/components/footer/CFooter.js.map +1 -1
  38. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  39. package/dist/cjs/components/form/CFormControlValidation.js.map +1 -1
  40. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  41. package/dist/cjs/components/form/CFormInput.d.ts +63 -63
  42. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  43. package/dist/cjs/components/form/CFormSelect.d.ts +2 -2
  44. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  45. package/dist/cjs/components/form/CFormSwitch.js.map +1 -1
  46. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  47. package/dist/cjs/components/header/CHeader.d.ts +17 -1
  48. package/dist/cjs/components/header/CHeader.js +8 -1
  49. package/dist/cjs/components/header/CHeader.js.map +1 -1
  50. package/dist/cjs/components/link/CLink.js.map +1 -1
  51. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  52. package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
  53. package/dist/cjs/components/modal/CModal.d.ts +43 -5
  54. package/dist/cjs/components/modal/CModal.js +41 -17
  55. package/dist/cjs/components/modal/CModal.js.map +1 -1
  56. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +33 -2
  57. package/dist/cjs/components/multi-select/CMultiSelect.js +21 -2
  58. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  59. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.d.ts +2 -0
  60. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +4 -2
  61. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  62. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  63. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  64. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  65. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  66. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  67. package/dist/cjs/components/popover/CPopover.d.ts +6 -6
  68. package/dist/cjs/components/popover/CPopover.js +1 -1
  69. package/dist/cjs/components/progress/CProgress.d.ts +2 -2
  70. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  71. package/dist/cjs/components/progress/CProgressBar.d.ts +2 -2
  72. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  73. package/dist/cjs/components/rating/CRating.js.map +1 -1
  74. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  75. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  76. package/dist/cjs/components/smart-table/CSmartTable.d.ts +6 -6
  77. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  78. package/dist/cjs/components/smart-table/CSmartTableBody.d.ts +2 -2
  79. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  80. package/dist/cjs/components/smart-table/CSmartTableHead.d.ts +4 -4
  81. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  82. package/dist/cjs/components/smart-table/utils.d.ts +4 -4
  83. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  84. package/dist/cjs/components/spinner/CSpinner.d.ts +2 -2
  85. package/dist/cjs/components/table/CTable.d.ts +4 -4
  86. package/dist/cjs/components/table/CTable.js.map +1 -1
  87. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  88. package/dist/cjs/components/time-picker/CTimePicker.js +9 -1
  89. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  90. package/dist/cjs/components/time-picker/utils.d.ts +4 -4
  91. package/dist/cjs/components/tooltip/CTooltip.d.ts +6 -6
  92. package/dist/cjs/components/tooltip/CTooltip.js +1 -1
  93. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  94. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  95. package/dist/cjs/components/widgets/CWidgetStatsC.d.ts +0 -10
  96. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  97. package/dist/cjs/node_modules/@coreui/icons-vue/dist/index.es.js +66 -0
  98. package/dist/cjs/node_modules/@coreui/icons-vue/dist/index.es.js.map +1 -1
  99. package/dist/cjs/node_modules/vue-types/dist/vue-types.modern.js +1 -1
  100. package/dist/cjs/node_modules/vue-types/dist/vue-types.modern.js.map +1 -1
  101. package/dist/esm/components/alert/CAlert.d.ts +2 -2
  102. package/dist/esm/components/avatar/CAvatar.d.ts +2 -10
  103. package/dist/esm/components/badge/CBadge.d.ts +2 -2
  104. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  105. package/dist/esm/components/button/CButton.d.ts +2 -6
  106. package/dist/esm/components/button/CButton.js +2 -1
  107. package/dist/esm/components/button/CButton.js.map +1 -1
  108. package/dist/esm/components/calendar/CCalendar.d.ts +86 -10
  109. package/dist/esm/components/calendar/CCalendar.js +58 -6
  110. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  111. package/dist/esm/components/calendar/utils.d.ts +4 -4
  112. package/dist/esm/components/calendar/utils.js +1 -3
  113. package/dist/esm/components/calendar/utils.js.map +1 -1
  114. package/dist/esm/components/carousel/CCarousel.d.ts +2 -2
  115. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  116. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  117. package/dist/esm/components/conditional-teleport/CConditionalTeleport.d.ts +4 -4
  118. package/dist/esm/components/conditional-teleport/CConditionalTeleport.js +1 -1
  119. package/dist/esm/components/date-picker/CDatePicker.d.ts +98 -10
  120. package/dist/esm/components/date-picker/CDatePicker.js +47 -5
  121. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  122. package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +127 -19
  123. package/dist/esm/components/date-range-picker/CDateRangePicker.js +76 -13
  124. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  125. package/dist/esm/components/date-range-picker/utils.d.ts +1 -0
  126. package/dist/esm/components/date-range-picker/utils.js +10 -1
  127. package/dist/esm/components/date-range-picker/utils.js.map +1 -1
  128. package/dist/esm/components/dropdown/CDropdown.d.ts +9 -32
  129. package/dist/esm/components/dropdown/CDropdown.js +2 -2
  130. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  131. package/dist/esm/components/dropdown/CDropdownToggle.d.ts +2 -2
  132. package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
  133. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  134. package/dist/esm/components/footer/CFooter.d.ts +17 -1
  135. package/dist/esm/components/footer/CFooter.js +8 -1
  136. package/dist/esm/components/footer/CFooter.js.map +1 -1
  137. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  138. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  139. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  140. package/dist/esm/components/form/CFormInput.d.ts +63 -63
  141. package/dist/esm/components/form/CFormInput.js.map +1 -1
  142. package/dist/esm/components/form/CFormSelect.d.ts +2 -2
  143. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  144. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  145. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  146. package/dist/esm/components/header/CHeader.d.ts +17 -1
  147. package/dist/esm/components/header/CHeader.js +8 -1
  148. package/dist/esm/components/header/CHeader.js.map +1 -1
  149. package/dist/esm/components/link/CLink.js.map +1 -1
  150. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  151. package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
  152. package/dist/esm/components/modal/CModal.d.ts +43 -5
  153. package/dist/esm/components/modal/CModal.js +41 -17
  154. package/dist/esm/components/modal/CModal.js.map +1 -1
  155. package/dist/esm/components/multi-select/CMultiSelect.d.ts +33 -2
  156. package/dist/esm/components/multi-select/CMultiSelect.js +21 -2
  157. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  158. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.d.ts +2 -0
  159. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +4 -2
  160. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  161. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  162. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  163. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  164. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  165. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  166. package/dist/esm/components/popover/CPopover.d.ts +6 -6
  167. package/dist/esm/components/popover/CPopover.js +1 -1
  168. package/dist/esm/components/progress/CProgress.d.ts +2 -2
  169. package/dist/esm/components/progress/CProgress.js.map +1 -1
  170. package/dist/esm/components/progress/CProgressBar.d.ts +2 -2
  171. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  172. package/dist/esm/components/rating/CRating.js.map +1 -1
  173. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  174. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  175. package/dist/esm/components/smart-table/CSmartTable.d.ts +6 -6
  176. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  177. package/dist/esm/components/smart-table/CSmartTableBody.d.ts +2 -2
  178. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  179. package/dist/esm/components/smart-table/CSmartTableHead.d.ts +4 -4
  180. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  181. package/dist/esm/components/smart-table/utils.d.ts +4 -4
  182. package/dist/esm/components/smart-table/utils.js.map +1 -1
  183. package/dist/esm/components/spinner/CSpinner.d.ts +2 -2
  184. package/dist/esm/components/table/CTable.d.ts +4 -4
  185. package/dist/esm/components/table/CTable.js.map +1 -1
  186. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  187. package/dist/esm/components/time-picker/CTimePicker.js +9 -1
  188. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  189. package/dist/esm/components/time-picker/utils.d.ts +4 -4
  190. package/dist/esm/components/tooltip/CTooltip.d.ts +6 -6
  191. package/dist/esm/components/tooltip/CTooltip.js +1 -1
  192. package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  193. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  194. package/dist/esm/components/widgets/CWidgetStatsC.d.ts +0 -10
  195. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  196. package/dist/esm/node_modules/@coreui/icons-vue/dist/index.es.js +67 -1
  197. package/dist/esm/node_modules/@coreui/icons-vue/dist/index.es.js.map +1 -1
  198. package/dist/esm/node_modules/vue-types/dist/vue-types.modern.js +1 -1
  199. package/dist/esm/node_modules/vue-types/dist/vue-types.modern.js.map +1 -1
  200. package/package.json +8 -8
  201. package/src/components/button/CButton.ts +2 -1
  202. package/src/components/calendar/CCalendar.ts +57 -5
  203. package/src/components/calendar/utils.ts +1 -4
  204. package/src/components/conditional-teleport/CConditionalTeleport.ts +1 -1
  205. package/src/components/date-picker/CDatePicker.ts +47 -5
  206. package/src/components/date-range-picker/CDateRangePicker.ts +83 -19
  207. package/src/components/date-range-picker/utils.ts +16 -0
  208. package/src/components/dropdown/CDropdown.ts +2 -2
  209. package/src/components/dropdown/CDropdownToggle.ts +1 -1
  210. package/src/components/footer/CFooter.ts +8 -1
  211. package/src/components/footer/__tests__/CFooter.spec.ts +19 -0
  212. package/src/components/header/CHeader.ts +8 -1
  213. package/src/components/header/__tests__/CHeader.spec.ts +19 -0
  214. package/src/components/modal/CModal.ts +49 -19
  215. package/src/components/multi-select/CMultiSelect.ts +25 -3
  216. package/src/components/multi-select/CMultiSelectNativeSelect.ts +4 -2
  217. package/src/components/popover/CPopover.ts +1 -1
  218. package/src/components/time-picker/CTimePicker.ts +9 -1
  219. package/src/components/tooltip/CTooltip.ts +1 -1
@@ -21,6 +21,42 @@ import {
21
21
  const CCalendar = defineComponent({
22
22
  name: 'CCalendar',
23
23
  props: {
24
+ /**
25
+ * A string that provides an accessible label for the button that navigates to the next month in the calendar. This label is read by screen readers to describe the action associated with the button.
26
+ *
27
+ * @since 5.4.0
28
+ */
29
+ ariaNavNextMonthLabel: {
30
+ type: String,
31
+ default: 'Next month',
32
+ },
33
+ /**
34
+ * A string that provides an accessible label for the button that navigates to the next year in the calendar. This label is intended for screen readers to help users understand the button's functionality.
35
+ *
36
+ * @since 5.4.0
37
+ */
38
+ ariaNavNextYearLabel: {
39
+ type: String,
40
+ default: 'Next year',
41
+ },
42
+ /**
43
+ * A string that provides an accessible label for the button that navigates to the previous month in the calendar. Screen readers will use this label to explain the purpose of the button.
44
+ *
45
+ * @since 5.4.0
46
+ */
47
+ ariaNavPrevMonthLabel: {
48
+ type: String,
49
+ default: 'Previous month',
50
+ },
51
+ /**
52
+ * A string that provides an accessible label for the button that navigates to the previous year in the calendar. This label helps screen reader users understand the button's function.
53
+ *
54
+ * @since 5.4.0
55
+ */
56
+ ariaNavPrevYearLabel: {
57
+ type: String,
58
+ default: 'Previous year',
59
+ },
24
60
  /**
25
61
  * Default date of the component
26
62
  */
@@ -599,7 +635,10 @@ const CCalendar = defineComponent({
599
635
  weekDays.map(({ date }: { date: Date }) => {
600
636
  return h(
601
637
  'th',
602
- { class: 'calendar-cell' },
638
+ {
639
+ class: 'calendar-cell',
640
+ abbr: date.toLocaleDateString(props.locale, { weekday: 'long' }),
641
+ },
603
642
  h(
604
643
  'div',
605
644
  {
@@ -634,6 +673,7 @@ const CCalendar = defineComponent({
634
673
  maxDate.value,
635
674
  props.disabledDates,
636
675
  )
676
+ const isSelected = isDateSelected(date, startDate.value, endDate.value)
637
677
  const current = week.days.some((day) => day.month === 'current')
638
678
  return h(
639
679
  'tr',
@@ -649,10 +689,11 @@ const CCalendar = defineComponent({
649
689
  props.selectionType === 'week' && hoverDate.value && selectEndDate.value
650
690
  ? isDateInRange(date, startDate.value, hoverDate.value)
651
691
  : isDateInRange(date, hoverDate.value, endDate.value),
652
- selected: isDateSelected(date, startDate.value, endDate.value),
692
+ selected: isSelected,
653
693
  },
654
694
  ],
655
695
  tabindex: props.selectionType === 'week' && current && !isDisabled ? 0 : -1,
696
+ ...(isSelected && { 'aria-selected': true }),
656
697
  ...(props.selectionType === 'week' &&
657
698
  !isDisabled && {
658
699
  onBlur: () => handleCalendarMouseLeave(),
@@ -677,6 +718,7 @@ const CCalendar = defineComponent({
677
718
  maxDate.value,
678
719
  props.disabledDates,
679
720
  )
721
+ const isSelected = isDateSelected(date, startDate.value, endDate.value)
680
722
  return month === 'current' || props.showAdjacementDays
681
723
  ? h(
682
724
  'td',
@@ -695,7 +737,7 @@ const CCalendar = defineComponent({
695
737
  range:
696
738
  month === 'current' &&
697
739
  isDateInRange(date, startDate.value, endDate.value),
698
- selected: isDateSelected(date, startDate.value, endDate.value),
740
+ selected: isSelected,
699
741
  }),
700
742
  [month]: true,
701
743
  today: month === 'current' && isToday(date),
@@ -708,6 +750,7 @@ const CCalendar = defineComponent({
708
750
  ? 0
709
751
  : -1,
710
752
  title: date.toLocaleDateString(props.locale),
753
+ ...(isSelected && { 'aria-selected': true }),
711
754
  ...(props.selectionType === 'day' &&
712
755
  (month === 'current' || props.selectAdjacementDays) && {
713
756
  onBlur: () => handleCalendarMouseLeave(),
@@ -754,6 +797,7 @@ const CCalendar = defineComponent({
754
797
  maxDate.value,
755
798
  props.disabledDates,
756
799
  )
800
+ const isSelected = isDateSelected(date, startDate.value, endDate.value)
757
801
  return h(
758
802
  'td',
759
803
  {
@@ -761,7 +805,7 @@ const CCalendar = defineComponent({
761
805
  'calendar-cell',
762
806
  {
763
807
  disabled: isDisabled,
764
- selected: isDateSelected(date, startDate.value, endDate.value),
808
+ selected: isSelected,
765
809
  'range-hover':
766
810
  props.selectionType === 'month' &&
767
811
  (hoverDate.value && selectEndDate
@@ -771,6 +815,7 @@ const CCalendar = defineComponent({
771
815
  },
772
816
  ],
773
817
  tabindex: isDisabled ? -1 : 0,
818
+ ...(isSelected && { 'aria-selected': true }),
774
819
  ...(!isDisabled && {
775
820
  onBlur: () => handleCalendarMouseLeave(),
776
821
  onClick: () => handleCalendarClick(date),
@@ -798,6 +843,7 @@ const CCalendar = defineComponent({
798
843
  maxDate.value,
799
844
  props.disabledDates,
800
845
  )
846
+ const isSelected = isDateSelected(date, startDate.value, endDate.value)
801
847
  return h(
802
848
  'td',
803
849
  {
@@ -805,7 +851,7 @@ const CCalendar = defineComponent({
805
851
  'calendar-cell year',
806
852
  {
807
853
  disabled: isDisabled,
808
- selected: isDateSelected(date, startDate.value, endDate.value),
854
+ selected: isSelected,
809
855
  'range-hover':
810
856
  props.selectionType === 'year' &&
811
857
  (hoverDate.value && selectEndDate
@@ -815,6 +861,7 @@ const CCalendar = defineComponent({
815
861
  },
816
862
  ],
817
863
  tabindex: isDisabled ? -1 : 0,
864
+ ...(isSelected && { 'aria-selected': true }),
818
865
  ...(!isDisabled && {
819
866
  onBlur: () => handleCalendarMouseLeave(),
820
867
  onClick: () => handleCalendarClick(date),
@@ -847,6 +894,7 @@ const CCalendar = defineComponent({
847
894
  {
848
895
  color: 'transparent',
849
896
  size: 'sm',
897
+ 'aria-label': props.ariaNavPrevYearLabel,
850
898
  onClick: () => handleNavigationOnClick('prev', true),
851
899
  },
852
900
  {
@@ -865,6 +913,7 @@ const CCalendar = defineComponent({
865
913
  {
866
914
  color: 'transparent',
867
915
  size: 'sm',
916
+ 'aria-label': props.ariaNavPrevMonthLabel,
868
917
  onClick: () => handleNavigationOnClick('prev'),
869
918
  },
870
919
  {
@@ -883,6 +932,7 @@ const CCalendar = defineComponent({
883
932
  'div',
884
933
  {
885
934
  class: 'calendar-nav-date',
935
+ 'aria-live': 'polite',
886
936
  ...(props.navYearFirst && { style: { display: 'flex', justifyContent: 'center' } }),
887
937
  },
888
938
  [
@@ -925,6 +975,7 @@ const CCalendar = defineComponent({
925
975
  {
926
976
  color: 'transparent',
927
977
  size: 'sm',
978
+ 'aria-label': props.ariaNavNextMonthLabel,
928
979
  onClick: () => handleNavigationOnClick('next'),
929
980
  },
930
981
  {
@@ -942,6 +993,7 @@ const CCalendar = defineComponent({
942
993
  {
943
994
  color: 'transparent',
944
995
  size: 'sm',
996
+ 'aria-label': props.ariaNavNextYearLabel,
945
997
  onClick: () => handleNavigationOnClick('next', true),
946
998
  },
947
999
  {
@@ -19,10 +19,7 @@ export const convertToDateObject = (
19
19
  return convertIsoWeekToDate(date as string)
20
20
  }
21
21
 
22
- const _date = new Date(Date.parse(date))
23
- const userTimezoneOffset = _date.getTimezoneOffset() * 60_000
24
-
25
- return new Date(_date.getTime() + userTimezoneOffset)
22
+ return new Date(Date.parse(date))
26
23
  }
27
24
 
28
25
  export const convertToLocalDate = (d: Date, locale: string, options = {}) =>
@@ -16,7 +16,7 @@ const CConditionalTeleport = defineComponent({
16
16
  /**
17
17
  * An HTML element or function that returns a single element, with `document.body` as the default.
18
18
  *
19
- * @since v5.0.0
19
+ * @since 5.0.0
20
20
  */
21
21
  container: {
22
22
  type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
@@ -7,6 +7,42 @@ import { Color } from '../props'
7
7
  const CDatePicker = defineComponent({
8
8
  name: 'CDatePicker',
9
9
  props: {
10
+ /**
11
+ * A string that provides an accessible label for the button that navigates to the next month in the calendar. This label is read by screen readers to describe the action associated with the button.
12
+ *
13
+ * @since 5.4.0
14
+ */
15
+ ariaNavNextMonthLabel: {
16
+ type: String,
17
+ default: 'Next month',
18
+ },
19
+ /**
20
+ * A string that provides an accessible label for the button that navigates to the next year in the calendar. This label is intended for screen readers to help users understand the button's functionality.
21
+ *
22
+ * @since 5.4.0
23
+ */
24
+ ariaNavNextYearLabel: {
25
+ type: String,
26
+ default: 'Next year',
27
+ },
28
+ /**
29
+ * A string that provides an accessible label for the button that navigates to the previous month in the calendar. Screen readers will use this label to explain the purpose of the button.
30
+ *
31
+ * @since 5.4.0
32
+ */
33
+ ariaNavPrevMonthLabel: {
34
+ type: String,
35
+ default: 'Previous month',
36
+ },
37
+ /**
38
+ * A string that provides an accessible label for the button that navigates to the previous year in the calendar. This label helps screen reader users understand the button's function.
39
+ *
40
+ * @since 5.4.0
41
+ */
42
+ ariaNavPrevYearLabel: {
43
+ type: String,
44
+ default: 'Previous year',
45
+ },
10
46
  /**
11
47
  * Default date of the component
12
48
  */
@@ -165,8 +201,8 @@ const CDatePicker = defineComponent({
165
201
  /**
166
202
  * The id global attribute defines an identifier (ID) that must be unique in the whole document.
167
203
  *
168
- * The name attribute for the input element is generated based on the `id` property:
169
- * - {id}-date
204
+ * **[Deprecated since v5.3.0]** The name attributes for input element is generated based on this property until you define name prop ex.:
205
+ * - \{id\}-date
170
206
  */
171
207
  id: String,
172
208
  /**
@@ -183,19 +219,19 @@ const CDatePicker = defineComponent({
183
219
  /**
184
220
  * Custom function to format the selected date into a string according to a custom format.
185
221
  *
186
- * @since v5.0.0
222
+ * @since 5.0.0
187
223
  */
188
224
  inputDateFormat: Function,
189
225
  /**
190
226
  * Custom function to parse the input value into a valid Date object.
191
227
  *
192
- * @since v5.0.0
228
+ * @since 5.0.0
193
229
  */
194
230
  inputDateParse: Function,
195
231
  /**
196
232
  * Defines the delay (in milliseconds) for the input field's onChange event.
197
233
  *
198
- * @since v5.0.0
234
+ * @since 5.0.0
199
235
  */
200
236
  inputOnChangeDelay: {
201
237
  type: Number,
@@ -220,6 +256,12 @@ const CDatePicker = defineComponent({
220
256
  minDate: {
221
257
  type: [Date, String],
222
258
  },
259
+ /**
260
+ * The name attribute for the input element.
261
+ *
262
+ * @since 5.3.0
263
+ */
264
+ name: String,
223
265
  /**
224
266
  * Show arrows navigation.
225
267
  */
@@ -6,7 +6,7 @@ import { CFormControlWrapper } from './../form/CFormControlWrapper'
6
6
  import { CPicker } from '../picker'
7
7
  import { CTimePicker } from '../time-picker'
8
8
 
9
- import { getLocalDateFromString } from './utils'
9
+ import { getInputIdOrName, getLocalDateFromString } from './utils'
10
10
 
11
11
  import { useDebouncedCallback } from '../../composables'
12
12
  import { Color } from '../props'
@@ -14,6 +14,42 @@ import { Color } from '../props'
14
14
  const CDateRangePicker = defineComponent({
15
15
  name: 'CDateRangePicker',
16
16
  props: {
17
+ /**
18
+ * A string that provides an accessible label for the button that navigates to the next month in the calendar. This label is read by screen readers to describe the action associated with the button.
19
+ *
20
+ * @since 5.4.0
21
+ */
22
+ ariaNavNextMonthLabel: {
23
+ type: String,
24
+ default: 'Next month',
25
+ },
26
+ /**
27
+ * A string that provides an accessible label for the button that navigates to the next year in the calendar. This label is intended for screen readers to help users understand the button's functionality.
28
+ *
29
+ * @since 5.4.0
30
+ */
31
+ ariaNavNextYearLabel: {
32
+ type: String,
33
+ default: 'Next year',
34
+ },
35
+ /**
36
+ * A string that provides an accessible label for the button that navigates to the previous month in the calendar. Screen readers will use this label to explain the purpose of the button.
37
+ *
38
+ * @since 5.4.0
39
+ */
40
+ ariaNavPrevMonthLabel: {
41
+ type: String,
42
+ default: 'Previous month',
43
+ },
44
+ /**
45
+ * A string that provides an accessible label for the button that navigates to the previous year in the calendar. This label helps screen reader users understand the button's function.
46
+ *
47
+ * @since 5.4.0
48
+ */
49
+ ariaNavPrevYearLabel: {
50
+ type: String,
51
+ default: 'Previous year',
52
+ },
17
53
  /**
18
54
  * The number of calendars that render on desktop devices.
19
55
  */
@@ -197,13 +233,15 @@ const CDateRangePicker = defineComponent({
197
233
  */
198
234
  footer: Boolean,
199
235
  /**
200
- * The id global attribute defines an identifier (ID) that must be unique in the whole document.
236
+ * The id attribute for the input elements. It can be a single string for both the start and end dates. If a single string is used, the postfix "-start-date" and "-end-date" will be automatically added to make the IDs unique. Alternatively, you can use an array of two strings for start and end dates separately.
201
237
  *
202
- * The name attributes for input elements are generated based on the `id` property:
203
- * - {id}-start-date
204
- * - {id}-end-date
238
+ * **[Deprecated since v5.3.0]** If the property is a type of string, the name attributes for input elements are generated based on this property until you define name prop ex.:
239
+ * - \{id\}-start-date
240
+ * - \{id\}-end-date
205
241
  */
206
- id: String,
242
+ id: {
243
+ type: [String, Array] as PropType<string | [string, string]>,
244
+ },
207
245
  /**
208
246
  * Toggle visibility or set the content of the input indicator.
209
247
  */
@@ -214,19 +252,19 @@ const CDateRangePicker = defineComponent({
214
252
  /**
215
253
  * Custom function to format the selected date into a string according to a custom format.
216
254
  *
217
- * @since v5.0.0
255
+ * @since 5.0.0
218
256
  */
219
257
  inputDateFormat: Function,
220
258
  /**
221
259
  * Custom function to parse the input value into a valid Date object.
222
260
  *
223
- * @since v5.0.0
261
+ * @since 5.0.0
224
262
  */
225
263
  inputDateParse: Function,
226
264
  /**
227
265
  * Defines the delay (in milliseconds) for the input field's onChange event.
228
266
  *
229
- * @since v5.0.0
267
+ * @since 5.0.0
230
268
  */
231
269
  inputOnChangeDelay: {
232
270
  type: Number,
@@ -266,6 +304,20 @@ const CDateRangePicker = defineComponent({
266
304
  * Min selectable date.
267
305
  */
268
306
  minDate: [Date, String],
307
+ /**
308
+ * The name attribute for the input elements. It can be a single string for both the start and end dates. If a single string is used, the postfix "-start-date" and "-end-date" will be automatically added to make the names unique. Alternatively, you can use an array of two strings for start and end dates separately.
309
+ *
310
+ * Example for single string: 'date-input'
311
+ * Result: 'date-input-start-date', 'date-input-end-date'
312
+ *
313
+ * Example for array: ['start-date-input', 'end-date-input']
314
+ * Result: 'start-date-input', 'end-date-input'
315
+ *
316
+ * @since 5.3.0
317
+ */
318
+ name: {
319
+ type: [String, Array] as PropType<string | [string, string]>,
320
+ },
269
321
  /**
270
322
  * Show arrows navigation.
271
323
  */
@@ -283,7 +335,7 @@ const CDateRangePicker = defineComponent({
283
335
  * Specifies a short hint that is visible in the input.
284
336
  */
285
337
  placeholder: {
286
- type: [String, Array] as PropType<string | string[]>,
338
+ type: [String, Array] as PropType<string | [string, string]>,
287
339
  default: () => ['Start date', 'End date'],
288
340
  },
289
341
  /**
@@ -584,8 +636,8 @@ const CDateRangePicker = defineComponent({
584
636
  return props.inputDateFormat
585
637
  ? props.inputDateFormat(_date)
586
638
  : props.timepicker
587
- ? _date.toLocaleString(props.locale)
588
- : _date.toLocaleDateString(props.locale)
639
+ ? _date.toLocaleString(props.locale)
640
+ : _date.toLocaleDateString(props.locale)
589
641
  }
590
642
 
591
643
  const setInputValue = (date: Date | string | null) => {
@@ -698,7 +750,12 @@ const CDateRangePicker = defineComponent({
698
750
  },
699
751
  ],
700
752
  disabled: props.disabled,
701
- ...(props.id && { name: props.range ? `${props.id}-start-date` : `${props.id}-date` }),
753
+ ...(props.id && { id: getInputIdOrName(props.id, props.range, 'start') }),
754
+ ...(props.name && { name: getInputIdOrName(props.name, props.range, 'start') }),
755
+ ...(props.id &&
756
+ !Array.isArray(props.id) &&
757
+ !props.name && { name: props.range ? `${props.id}-start-date` : `${props.id}-date` }), // TODO: remove in v6
758
+
702
759
  onClick: () => {
703
760
  selectEndDate.value = false
704
761
  },
@@ -730,7 +787,11 @@ const CDateRangePicker = defineComponent({
730
787
  },
731
788
  ],
732
789
  disabled: props.disabled,
733
- ...(props.id && { name: `${props.id}-end-date` }),
790
+ ...(props.id && { id: getInputIdOrName(props.id, props.range, 'end') }),
791
+ ...(props.name && { name: getInputIdOrName(props.name, props.range, 'end') }),
792
+ ...(props.id &&
793
+ !Array.isArray(props.id) &&
794
+ !props.name && { name: `${props.id}-end-date` }), // TODO: remove in v6
734
795
  onClick: () => {
735
796
  selectEndDate.value = true
736
797
  },
@@ -767,7 +828,7 @@ const CDateRangePicker = defineComponent({
767
828
  feedback: props.feedback,
768
829
  feedbackInvalid: props.feedbackInvalid,
769
830
  feedbackValid: props.feedbackValid,
770
- id: props.id,
831
+ ...(props.id && !Array.isArray(props.id) && { id: props.id }),
771
832
  invalid: isValid.value === false ? true : false,
772
833
  label: props.label,
773
834
  text: props.text,
@@ -791,7 +852,6 @@ const CDateRangePicker = defineComponent({
791
852
  disabled: props.disabled,
792
853
  dropdownClassNames: 'date-picker-dropdown',
793
854
  footer: props.footer || props.timepicker,
794
- id: props.id,
795
855
  onHide: () => {
796
856
  visible.value = false
797
857
  emit('hide')
@@ -828,7 +888,7 @@ const CDateRangePicker = defineComponent({
828
888
  if (props.range) {
829
889
  endDate.value = date
830
890
  }
831
-
891
+
832
892
  calendarDate.value = date
833
893
  },
834
894
  },
@@ -900,6 +960,10 @@ const CDateRangePicker = defineComponent({
900
960
  h(
901
961
  CCalendar,
902
962
  {
963
+ ariaNavNextMonthLabel: props.ariaNavNextMonthLabel,
964
+ ariaNavNextYearLabel: props.ariaNavNextYearLabel,
965
+ ariaNavPrevMonthLabel: props.ariaNavPrevMonthLabel,
966
+ ariaNavPrevYearLabel: props.ariaNavPrevYearLabel,
903
967
  calendarDate: calendarDate.value,
904
968
  calendars: isMobile.value ? 1 : props.calendars,
905
969
  class: 'date-picker-calendars',
@@ -995,8 +1059,8 @@ const CDateRangePicker = defineComponent({
995
1059
  ? true
996
1060
  : false
997
1061
  : endDate.value === null
998
- ? true
999
- : false,
1062
+ ? true
1063
+ : false,
1000
1064
  locale: props.locale,
1001
1065
  onChange: (_: any, __: any, date: Date) =>
1002
1066
  index === 0
@@ -1,3 +1,19 @@
1
+ export const getInputIdOrName = (
2
+ attribute: string | [string, string],
3
+ range: boolean,
4
+ position?: 'start' | 'end',
5
+ ): string => {
6
+ if (range && !Array.isArray(attribute)) {
7
+ return `${attribute}-${position}-date`
8
+ }
9
+
10
+ if (Array.isArray(attribute)) {
11
+ return position === 'start' ? attribute[0] : attribute[1]
12
+ }
13
+
14
+ return attribute
15
+ }
16
+
1
17
  export const getLocalDateFromString = (string: string, locale: string, time?: boolean) => {
2
18
  if (!Number.isNaN(Date.parse(string))) {
3
19
  return new Date(Date.parse(string))
@@ -62,7 +62,7 @@ const CDropdown = defineComponent({
62
62
  /**
63
63
  * Appends the vue dropdown menu to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
64
64
  *
65
- * @since v5.0.0
65
+ * @since 5.0.0
66
66
  */
67
67
  container: {
68
68
  type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
@@ -115,7 +115,7 @@ const CDropdown = defineComponent({
115
115
  /**
116
116
  * Generates dropdown menu using Teleport.
117
117
  *
118
- * @since v5.0.0
118
+ * @since 5.0.0
119
119
  */
120
120
  teleport: {
121
121
  type: Boolean,
@@ -49,7 +49,7 @@ const CDropdownToggle = defineComponent({
49
49
  /**
50
50
  * If a dropdown `variant` is set to `nav-item` then render the toggler as a link instead of a button.
51
51
  *
52
- * @since v5.0.0
52
+ * @since 5.0.0
53
53
  */
54
54
  navLink: {
55
55
  type: Boolean,
@@ -3,6 +3,13 @@ import { defineComponent, h } from 'vue'
3
3
  const CFooter = defineComponent({
4
4
  name: 'CFooter',
5
5
  props: {
6
+ /**
7
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
+ */
9
+ as: {
10
+ type: String,
11
+ default: 'div',
12
+ },
6
13
  /**
7
14
  * Place footer in non-static positions.
8
15
  *
@@ -18,7 +25,7 @@ const CFooter = defineComponent({
18
25
  setup(props, { slots }) {
19
26
  return () =>
20
27
  h(
21
- 'div',
28
+ props.as,
22
29
  { class: ['footer', { [`footer-${props.position}`]: props.position }] },
23
30
  slots.default && slots.default(),
24
31
  )
@@ -19,6 +19,15 @@ const customWrapper = mount(Component, {
19
19
  },
20
20
  })
21
21
 
22
+ const customWrapperTwo = mount(Component, {
23
+ propsData: {
24
+ as: 'footer',
25
+ },
26
+ slots: {
27
+ default: 'Default slot',
28
+ },
29
+ })
30
+
22
31
  describe(`Loads and display ${ComponentName} component`, () => {
23
32
  it('has a name', () => {
24
33
  expect(Component.name).toMatch(ComponentName)
@@ -42,3 +51,13 @@ describe(`Customize ${ComponentName} component`, () => {
42
51
  expect(customWrapper.classes('footer-fixed')).toBe(true)
43
52
  })
44
53
  })
54
+
55
+ describe(`Customize (number two) ${ComponentName} component`, () => {
56
+ it('renders correctly', () => {
57
+ expect(customWrapperTwo.html()).toMatchSnapshot()
58
+ })
59
+
60
+ it('tag name is custom', () => {
61
+ expect(customWrapperTwo.element.tagName).toBe('FOOTER')
62
+ })
63
+ })
@@ -3,6 +3,13 @@ import { defineComponent, h } from 'vue'
3
3
  const CHeader = defineComponent({
4
4
  name: 'CHeader',
5
5
  props: {
6
+ /**
7
+ * Component used for the root node. Either a string to use a HTML element or a component.
8
+ */
9
+ as: {
10
+ type: String,
11
+ default: 'div',
12
+ },
6
13
  /**
7
14
  * Defines optional container wrapping children elements.
8
15
  *
@@ -31,7 +38,7 @@ const CHeader = defineComponent({
31
38
  setup(props, { slots }) {
32
39
  return () =>
33
40
  h(
34
- 'div',
41
+ props.as,
35
42
  { class: ['header', { [`header-${props.position}`]: props.position }] },
36
43
  props.container
37
44
  ? h(
@@ -20,6 +20,15 @@ const customWrapper = mount(Component, {
20
20
  },
21
21
  })
22
22
 
23
+ const customWrapperTwo = mount(Component, {
24
+ propsData: {
25
+ as: 'header',
26
+ },
27
+ slots: {
28
+ default: 'Default slot',
29
+ },
30
+ })
31
+
23
32
  describe(`Loads and display ${ComponentName} component`, () => {
24
33
  it('has a name', () => {
25
34
  expect(Component.name).toMatch(ComponentName)
@@ -44,3 +53,13 @@ describe(`Customize ${ComponentName} component`, () => {
44
53
  expect(customWrapper.find('.container-lg').classes('container-lg')).toBe(true)
45
54
  })
46
55
  })
56
+
57
+
58
+ describe(`Customize (number two) ${ComponentName} component`, () => {
59
+ it('renders correctly', () => {
60
+ expect(customWrapperTwo.html()).toMatchSnapshot()
61
+ })
62
+ it('tag name is custom', () => {
63
+ expect(customWrapperTwo.element.tagName).toBe('HEADER')
64
+ })
65
+ })