@coreui/vue-pro 5.9.0 → 5.11.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 (198) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordionBody.js +2 -1
  3. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  4. package/dist/cjs/components/accordion/CAccordionButton.js +3 -1
  5. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  6. package/dist/cjs/components/accordion/CAccordionItem.d.ts +8 -0
  7. package/dist/cjs/components/accordion/CAccordionItem.js +10 -2
  8. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  9. package/dist/cjs/components/button/CButton.js +1 -1
  10. package/dist/cjs/components/button/CButton.js.map +1 -1
  11. package/dist/cjs/components/calendar/CCalendar.d.ts +6 -6
  12. package/dist/cjs/components/calendar/CCalendar.js +44 -39
  13. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  14. package/dist/cjs/components/calendar/types.d.ts +3 -0
  15. package/dist/cjs/components/calendar/utils.d.ts +183 -18
  16. package/dist/cjs/components/calendar/utils.js +327 -43
  17. package/dist/cjs/components/calendar/utils.js.map +1 -1
  18. package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
  19. package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +1 -1
  20. package/dist/cjs/components/form/CFormControlWrapper.d.ts +2 -0
  21. package/dist/cjs/components/form/CFormControlWrapper.js +9 -1
  22. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  23. package/dist/cjs/components/index.d.ts +2 -0
  24. package/dist/cjs/components/index.js +44 -36
  25. package/dist/cjs/components/index.js.map +1 -1
  26. package/dist/cjs/components/link/CLink.js.map +1 -1
  27. package/dist/cjs/components/loading-button/CLoadingButton.d.ts +2 -2
  28. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +12 -0
  29. package/dist/cjs/components/multi-select/CMultiSelect.js +28 -2
  30. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  31. package/dist/cjs/components/nav/CNav.d.ts +2 -2
  32. package/dist/cjs/components/nav/CNav.js +3 -2
  33. package/dist/cjs/components/nav/CNav.js.map +1 -1
  34. package/dist/cjs/components/nav/CNavGroup.js +6 -2
  35. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  36. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  37. package/dist/cjs/components/password-input/CPasswordInput.d.ts +190 -0
  38. package/dist/cjs/components/password-input/CPasswordInput.js +178 -0
  39. package/dist/cjs/components/password-input/CPasswordInput.js.map +1 -0
  40. package/dist/cjs/components/password-input/index.d.ts +6 -0
  41. package/dist/cjs/components/password-input/index.js +13 -0
  42. package/dist/cjs/components/password-input/index.js.map +1 -0
  43. package/dist/cjs/components/popover/CPopover.d.ts +1 -1
  44. package/dist/cjs/components/range-slider/CRangeSlider.js +6 -2
  45. package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
  46. package/dist/cjs/components/rating/CRating.d.ts +1 -1
  47. package/dist/cjs/components/smart-table/CSmartTable.js +2 -2
  48. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  49. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  50. package/dist/cjs/components/stepper/CStepper.d.ts +168 -0
  51. package/dist/cjs/components/stepper/CStepper.js +305 -0
  52. package/dist/cjs/components/stepper/CStepper.js.map +1 -0
  53. package/dist/cjs/components/stepper/index.d.ts +6 -0
  54. package/dist/cjs/components/stepper/index.js +13 -0
  55. package/dist/cjs/components/stepper/index.js.map +1 -0
  56. package/dist/cjs/components/stepper/types.d.ts +15 -0
  57. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  58. package/dist/cjs/components/tabs/CTabList.d.ts +2 -2
  59. package/dist/cjs/components/tabs/CTabList.js +3 -2
  60. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  61. package/dist/cjs/components/time-picker/utils.d.ts +10 -0
  62. package/dist/cjs/components/time-picker/utils.js +25 -9
  63. package/dist/cjs/components/time-picker/utils.js.map +1 -1
  64. package/dist/cjs/components/tooltip/CTooltip.d.ts +1 -1
  65. package/dist/cjs/components/widgets/CWidgetStatsB.js +2 -2
  66. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  67. package/dist/cjs/components/widgets/CWidgetStatsC.js +2 -2
  68. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  69. package/dist/cjs/index.js +50 -42
  70. package/dist/cjs/index.js.map +1 -1
  71. package/dist/cjs/node_modules/vue-types/dist/index.js +567 -0
  72. package/dist/cjs/node_modules/vue-types/dist/index.js.map +1 -0
  73. package/dist/cjs/node_modules/vue-types/dist/shared/vue-types.8139b772.js +29 -0
  74. package/dist/cjs/node_modules/vue-types/dist/shared/vue-types.8139b772.js.map +1 -0
  75. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  76. package/dist/cjs/utils/index.d.ts +2 -1
  77. package/dist/cjs/utils/isEqual.d.ts +2 -0
  78. package/dist/cjs/utils/isEqual.js +78 -0
  79. package/dist/cjs/utils/isEqual.js.map +1 -0
  80. package/dist/esm/components/accordion/CAccordionBody.js +2 -1
  81. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  82. package/dist/esm/components/accordion/CAccordionButton.js +3 -1
  83. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  84. package/dist/esm/components/accordion/CAccordionItem.d.ts +8 -0
  85. package/dist/esm/components/accordion/CAccordionItem.js +11 -3
  86. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  87. package/dist/esm/components/avatar/CAvatar.js +1 -1
  88. package/dist/esm/components/badge/CBadge.js +1 -1
  89. package/dist/esm/components/button/CButton.js +2 -2
  90. package/dist/esm/components/button/CButton.js.map +1 -1
  91. package/dist/esm/components/calendar/CCalendar.d.ts +6 -6
  92. package/dist/esm/components/calendar/CCalendar.js +46 -41
  93. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  94. package/dist/esm/components/calendar/types.d.ts +3 -0
  95. package/dist/esm/components/calendar/utils.d.ts +183 -18
  96. package/dist/esm/components/calendar/utils.js +320 -44
  97. package/dist/esm/components/calendar/utils.js.map +1 -1
  98. package/dist/esm/components/card/CCard.js +1 -1
  99. package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
  100. package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +1 -1
  101. package/dist/esm/components/dropdown/CDropdownToggle.js +2 -2
  102. package/dist/esm/components/form/CFormControlWrapper.d.ts +2 -0
  103. package/dist/esm/components/form/CFormControlWrapper.js +9 -1
  104. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  105. package/dist/esm/components/index.d.ts +2 -0
  106. package/dist/esm/components/index.js +4 -0
  107. package/dist/esm/components/index.js.map +1 -1
  108. package/dist/esm/components/link/CLink.js.map +1 -1
  109. package/dist/esm/components/loading-button/CLoadingButton.d.ts +2 -2
  110. package/dist/esm/components/multi-select/CMultiSelect.d.ts +12 -0
  111. package/dist/esm/components/multi-select/CMultiSelect.js +29 -3
  112. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  113. package/dist/esm/components/nav/CNav.d.ts +2 -2
  114. package/dist/esm/components/nav/CNav.js +3 -2
  115. package/dist/esm/components/nav/CNav.js.map +1 -1
  116. package/dist/esm/components/nav/CNavGroup.js +6 -2
  117. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  118. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  119. package/dist/esm/components/password-input/CPasswordInput.d.ts +190 -0
  120. package/dist/esm/components/password-input/CPasswordInput.js +176 -0
  121. package/dist/esm/components/password-input/CPasswordInput.js.map +1 -0
  122. package/dist/esm/components/password-input/index.d.ts +6 -0
  123. package/dist/esm/components/password-input/index.js +10 -0
  124. package/dist/esm/components/password-input/index.js.map +1 -0
  125. package/dist/esm/components/popover/CPopover.d.ts +1 -1
  126. package/dist/esm/components/range-slider/CRangeSlider.js +6 -2
  127. package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
  128. package/dist/esm/components/rating/CRating.d.ts +1 -1
  129. package/dist/esm/components/smart-table/CSmartTable.js +2 -2
  130. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  131. package/dist/esm/components/smart-table/CSmartTableBody.js +1 -1
  132. package/dist/esm/components/smart-table/utils.js.map +1 -1
  133. package/dist/esm/components/stepper/CStepper.d.ts +168 -0
  134. package/dist/esm/components/stepper/CStepper.js +303 -0
  135. package/dist/esm/components/stepper/CStepper.js.map +1 -0
  136. package/dist/esm/components/stepper/index.d.ts +6 -0
  137. package/dist/esm/components/stepper/index.js +10 -0
  138. package/dist/esm/components/stepper/index.js.map +1 -0
  139. package/dist/esm/components/stepper/types.d.ts +15 -0
  140. package/dist/esm/components/tabs/CTab.js.map +1 -1
  141. package/dist/esm/components/tabs/CTabList.d.ts +2 -2
  142. package/dist/esm/components/tabs/CTabList.js +3 -2
  143. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  144. package/dist/esm/components/time-picker/utils.d.ts +10 -0
  145. package/dist/esm/components/time-picker/utils.js +25 -10
  146. package/dist/esm/components/time-picker/utils.js.map +1 -1
  147. package/dist/esm/components/tooltip/CTooltip.d.ts +1 -1
  148. package/dist/esm/components/widgets/CWidgetStatsB.js +2 -2
  149. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  150. package/dist/esm/components/widgets/CWidgetStatsC.js +2 -2
  151. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  152. package/dist/esm/index.js +4 -0
  153. package/dist/esm/index.js.map +1 -1
  154. package/dist/esm/node_modules/vue-types/dist/index.js +541 -0
  155. package/dist/esm/node_modules/vue-types/dist/index.js.map +1 -0
  156. package/dist/esm/node_modules/vue-types/dist/shared/vue-types.8139b772.js +25 -0
  157. package/dist/esm/node_modules/vue-types/dist/shared/vue-types.8139b772.js.map +1 -0
  158. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  159. package/dist/esm/utils/index.d.ts +2 -1
  160. package/dist/esm/utils/isEqual.d.ts +2 -0
  161. package/dist/esm/utils/isEqual.js +74 -0
  162. package/dist/esm/utils/isEqual.js.map +1 -0
  163. package/package.json +10 -10
  164. package/src/components/accordion/CAccordionBody.ts +2 -1
  165. package/src/components/accordion/CAccordionButton.ts +3 -1
  166. package/src/components/accordion/CAccordionItem.ts +11 -3
  167. package/src/components/button/CButton.ts +1 -1
  168. package/src/components/calendar/CCalendar.ts +108 -95
  169. package/src/components/calendar/types.ts +5 -0
  170. package/src/components/calendar/utils.ts +439 -111
  171. package/src/components/date-picker/CDatePicker.ts +1 -1
  172. package/src/components/date-range-picker/CDateRangePicker.ts +1 -1
  173. package/src/components/form/CFormControlWrapper.ts +35 -21
  174. package/src/components/index.ts +2 -0
  175. package/src/components/multi-select/CMultiSelect.ts +57 -26
  176. package/src/components/nav/CNav.ts +3 -2
  177. package/src/components/nav/CNavGroup.ts +7 -2
  178. package/src/components/password-input/CPasswordInput.ts +214 -0
  179. package/src/components/password-input/index.ts +10 -0
  180. package/src/components/range-slider/CRangeSlider.ts +7 -2
  181. package/src/components/stepper/CStepper.ts +384 -0
  182. package/src/components/stepper/__tests__/CStepper.spec.ts +175 -0
  183. package/src/components/stepper/index.ts +10 -0
  184. package/src/components/stepper/types.ts +18 -0
  185. package/src/components/tabs/CTabList.ts +3 -2
  186. package/src/components/time-picker/CTimePicker.ts +22 -22
  187. package/src/components/time-picker/CTimePickerRollCol.ts +3 -3
  188. package/src/components/time-picker/utils.ts +30 -13
  189. package/src/utils/index.ts +10 -1
  190. package/src/utils/isEqual.ts +75 -0
  191. package/dist/cjs/node_modules/is-plain-object/dist/is-plain-object.js +0 -37
  192. package/dist/cjs/node_modules/is-plain-object/dist/is-plain-object.js.map +0 -1
  193. package/dist/cjs/node_modules/vue-types/dist/vue-types.modern.js +0 -33
  194. package/dist/cjs/node_modules/vue-types/dist/vue-types.modern.js.map +0 -1
  195. package/dist/esm/node_modules/is-plain-object/dist/is-plain-object.js +0 -35
  196. package/dist/esm/node_modules/is-plain-object/dist/is-plain-object.js.map +0 -1
  197. package/dist/esm/node_modules/vue-types/dist/vue-types.modern.js +0 -6
  198. package/dist/esm/node_modules/vue-types/dist/vue-types.modern.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { defineComponent, h, PropType, ref, watch } from 'vue'
1
+ import { defineComponent, h, nextTick, PropType, ref, watch } from 'vue'
2
2
 
3
3
  import { CButton } from '../button'
4
4
 
@@ -14,11 +14,19 @@ import {
14
14
  isDateInRange,
15
15
  isDateSelected,
16
16
  isDisableDateInRange,
17
- isSameDateAs,
17
+ isMonthDisabled,
18
+ isMonthInRange,
19
+ isMonthSelected,
18
20
  isToday,
21
+ isSameDateAs,
22
+ isYearDisabled,
23
+ isYearInRange,
24
+ isYearSelected,
25
+ getSelectableDates,
26
+ setTimeFromDate,
19
27
  } from './utils'
20
28
 
21
- export type DisabledDate = ((date: Date) => boolean) | Date | Date[]
29
+ import type { DisabledDate, SelectionTypes, ViewTypes } from './types'
22
30
 
23
31
  const CCalendar = defineComponent({
24
32
  name: 'CCalendar',
@@ -165,9 +173,9 @@ const CCalendar = defineComponent({
165
173
  * @since 5.0.0
166
174
  */
167
175
  selectionType: {
168
- type: String as PropType<'day' | 'week' | 'month' | 'year'>,
176
+ type: String as PropType<SelectionTypes>,
169
177
  default: 'day',
170
- validator: (value: string) => ['day', 'week', 'month', 'year'].includes(value),
178
+ validator: (value: SelectionTypes) => ['day', 'week', 'month', 'year'].includes(value),
171
179
  },
172
180
  /**
173
181
  * Set whether to display dates in adjacent months (non-selectable) at the start and end of the current month.
@@ -249,43 +257,37 @@ const CCalendar = defineComponent({
249
257
  ? convertToDateObject(props.calendarDate, props.selectionType)
250
258
  : props.startDate
251
259
  ? convertToDateObject(props.startDate, props.selectionType)
252
- : new Date(),
260
+ : new Date()
253
261
  )
254
262
  const startDate = ref<Date | null>(
255
- props.startDate ? convertToDateObject(props.startDate, props.selectionType) : null,
263
+ props.startDate ? convertToDateObject(props.startDate, props.selectionType) : null
256
264
  )
257
265
  const endDate = ref(
258
- props.endDate ? convertToDateObject(props.endDate, props.selectionType) : null,
266
+ props.endDate ? convertToDateObject(props.endDate, props.selectionType) : null
259
267
  )
260
268
  const hoverDate = ref<Date | null>(null)
261
269
  const maxDate = ref(
262
- props.maxDate ? convertToDateObject(props.maxDate, props.selectionType) : null,
270
+ props.maxDate ? convertToDateObject(props.maxDate, props.selectionType) : null
263
271
  )
264
272
  const minDate = ref(
265
- props.minDate ? convertToDateObject(props.minDate, props.selectionType) : null,
273
+ props.minDate ? convertToDateObject(props.minDate, props.selectionType) : null
266
274
  )
267
275
  const selectEndDate = ref(props.selectEndDate)
268
- const view = ref<'days' | 'months' | 'years'>('days')
276
+ const view = ref<ViewTypes>('days')
269
277
 
270
278
  watch(
271
279
  () => props.selectionType,
272
280
  () => {
273
- if (props.selectionType === 'day' || props.selectionType === 'week') {
274
- view.value = 'days'
275
- return
281
+ const viewMap = {
282
+ day: 'days',
283
+ week: 'days',
284
+ month: 'months',
285
+ year: 'years',
276
286
  }
277
287
 
278
- if (props.selectionType === 'month') {
279
- view.value = 'months'
280
- return
281
- }
282
-
283
- if (props.selectionType === 'year') {
284
- view.value = 'years'
285
- return
286
- }
288
+ view.value = (viewMap[props.selectionType] as ViewTypes) || 'days'
287
289
  },
288
- { immediate: true },
290
+ { immediate: true }
289
291
  )
290
292
 
291
293
  watch(
@@ -294,7 +296,7 @@ const CCalendar = defineComponent({
294
296
  if (props.calendarDate) {
295
297
  calendarDate.value = new Date(props.calendarDate)
296
298
  }
297
- },
299
+ }
298
300
  )
299
301
 
300
302
  watch(
@@ -306,7 +308,7 @@ const CCalendar = defineComponent({
306
308
  if (!isSameDateAs(date, startDate.value)) {
307
309
  startDate.value = date
308
310
  }
309
- },
311
+ }
310
312
  )
311
313
 
312
314
  watch(
@@ -316,7 +318,7 @@ const CCalendar = defineComponent({
316
318
  if (!isSameDateAs(date, endDate.value)) {
317
319
  endDate.value = date
318
320
  }
319
- },
321
+ }
320
322
  )
321
323
 
322
324
  watch(
@@ -325,7 +327,7 @@ const CCalendar = defineComponent({
325
327
  maxDate.value = props.maxDate
326
328
  ? convertToDateObject(props.maxDate, props.selectionType)
327
329
  : null
328
- },
330
+ }
329
331
  )
330
332
 
331
333
  watch(
@@ -334,14 +336,14 @@ const CCalendar = defineComponent({
334
336
  minDate.value = props.minDate
335
337
  ? convertToDateObject(props.minDate, props.selectionType)
336
338
  : null
337
- },
339
+ }
338
340
  )
339
341
 
340
342
  watch(
341
343
  () => props.selectEndDate,
342
344
  () => {
343
345
  selectEndDate.value = props.selectEndDate
344
- },
346
+ }
345
347
  )
346
348
 
347
349
  watch(startDate, () => {
@@ -357,9 +359,17 @@ const CCalendar = defineComponent({
357
359
  const month = calendarDate.value.getMonth()
358
360
  const d = new Date(year, month, 1)
359
361
 
360
- years && d.setFullYear(d.getFullYear() + years)
361
- months && d.setMonth(d.getMonth() + months)
362
- typeof setMonth === 'number' && d.setMonth(setMonth)
362
+ if (years) {
363
+ d.setFullYear(d.getFullYear() + years)
364
+ }
365
+
366
+ if (months) {
367
+ d.setMonth(d.getMonth() + months)
368
+ }
369
+
370
+ if (typeof setMonth === 'number') {
371
+ d.setMonth(setMonth)
372
+ }
363
373
 
364
374
  calendarDate.value = d
365
375
 
@@ -367,10 +377,6 @@ const CCalendar = defineComponent({
367
377
  }
368
378
 
369
379
  const handleCalendarClick = (date: Date, index?: number) => {
370
- if (isDateDisabled(date, minDate.value, maxDate.value, props.disabledDates)) {
371
- return
372
- }
373
-
374
380
  const _date = new Date(date)
375
381
 
376
382
  if (view.value === 'days') {
@@ -391,6 +397,11 @@ const CCalendar = defineComponent({
391
397
  return
392
398
  }
393
399
 
400
+ // Allow to change the calendarDate but not startDate or endDate
401
+ if (isDateDisabled(date, minDate.value, maxDate.value, props.disabledDates)) {
402
+ return
403
+ }
404
+
394
405
  if (props.range) {
395
406
  if (selectEndDate.value) {
396
407
  selectEndDate.value = false
@@ -407,7 +418,7 @@ const CCalendar = defineComponent({
407
418
  return
408
419
  }
409
420
 
410
- endDate.value = date
421
+ endDate.value = setTimeFromDate(date, endDate.value)
411
422
  return
412
423
  }
413
424
 
@@ -424,17 +435,27 @@ const CCalendar = defineComponent({
424
435
  }
425
436
 
426
437
  selectEndDate.value = true
427
- startDate.value = date
438
+ startDate.value = setTimeFromDate(date, startDate.value)
428
439
  return
429
440
  }
430
441
 
431
- startDate.value = date
442
+ startDate.value = setTimeFromDate(date, startDate.value)
432
443
  }
433
444
 
434
445
  const handleCalendarKeyDown = (event: KeyboardEvent, date: Date, index?: number) => {
435
446
  if (event.code === 'Space' || event.key === 'Enter') {
436
447
  event.preventDefault()
448
+ const _view = view.value
437
449
  handleCalendarClick(date, index)
450
+ if (
451
+ (_view === 'months' && props.selectionType !== 'month') ||
452
+ (_view === 'years' && props.selectionType !== 'year')
453
+ ) {
454
+ nextTick(() => {
455
+ const list: HTMLElement[] = getSelectableDates(calendarRef.value as HTMLDivElement)
456
+ list[0]?.focus()
457
+ })
458
+ }
438
459
  }
439
460
 
440
461
  if (
@@ -447,7 +468,7 @@ const CCalendar = defineComponent({
447
468
 
448
469
  if (
449
470
  maxDate.value &&
450
- date >= convertToDateObject(maxDate.value, props.selectionType) &&
471
+ date >= maxDate.value &&
451
472
  (event.key === 'ArrowRight' || event.key === 'ArrowDown')
452
473
  ) {
453
474
  return
@@ -455,7 +476,7 @@ const CCalendar = defineComponent({
455
476
 
456
477
  if (
457
478
  minDate.value &&
458
- date <= convertToDateObject(minDate.value, props.selectionType) &&
479
+ date <= minDate.value &&
459
480
  (event.key === 'ArrowLeft' || event.key === 'ArrowUp')
460
481
  ) {
461
482
  return
@@ -467,13 +488,7 @@ const CCalendar = defineComponent({
467
488
  element = element.closest('tr[tabindex="0"]') as HTMLElement
468
489
  }
469
490
 
470
- const list: HTMLElement[] = calendarRef.value
471
- ? Array.from(
472
- calendarRef.value.querySelectorAll(
473
- props.selectionType === 'week' ? 'tr[tabindex="0"]' : 'td[tabindex="0"]',
474
- ),
475
- )
476
- : []
491
+ const list: HTMLElement[] = getSelectableDates(calendarRef.value as HTMLDivElement)
477
492
 
478
493
  const index = list.indexOf(element)
479
494
  const first = index === 0
@@ -520,20 +535,16 @@ const CCalendar = defineComponent({
520
535
  }
521
536
 
522
537
  setTimeout(() => {
523
- const _list: HTMLElement[] = element.parentNode?.parentNode
524
- ? Array.from(
525
- element.parentNode.parentNode.querySelectorAll(
526
- 'td[tabindex="0"], tr[tabindex="0"]',
527
- ),
528
- )
529
- : []
538
+ const _list: HTMLElement[] = getSelectableDates(
539
+ element.parentNode?.parentNode as HTMLDivElement
540
+ )
530
541
 
531
542
  if (_list.length > 0 && event.key === 'ArrowRight') {
532
543
  _list[0].focus()
533
544
  }
534
545
 
535
546
  if (_list.length > 0 && event.key === 'ArrowLeft') {
536
- _list[_list.length - 1].focus()
547
+ _list.at(-1)?.focus()
537
548
  }
538
549
 
539
550
  if (_list.length > 0 && event.key === 'ArrowDown') {
@@ -571,6 +582,8 @@ const CCalendar = defineComponent({
571
582
  return
572
583
  }
573
584
 
585
+ date = setTimeFromDate(date, selectEndDate.value ? endDate.value : startDate.value)
586
+
574
587
  hoverDate.value = date
575
588
  emit('date-hover', getDateBySelectionType(date, props.selectionType))
576
589
  }
@@ -616,7 +629,7 @@ const CCalendar = defineComponent({
616
629
  const monthDetails = getMonthDetails(
617
630
  _calendarDate.getFullYear(),
618
631
  _calendarDate.getMonth(),
619
- props.firstDayOfWeek,
632
+ props.firstDayOfWeek
620
633
  )
621
634
  const listOfMonths = createGroupsInArray(getMonthsNames(props.locale), 4)
622
635
  const listOfYears = createGroupsInArray(getYears(_calendarDate.getFullYear()), 4)
@@ -632,7 +645,7 @@ const CCalendar = defineComponent({
632
645
  h(
633
646
  'th',
634
647
  { class: 'calendar-cell' },
635
- h('div', { class: 'calendar-header-cell-inner' }, props.weekNumbersLabel),
648
+ h('div', { class: 'calendar-header-cell-inner' }, props.weekNumbersLabel)
636
649
  ),
637
650
  weekDays.map(({ date }: { date: Date }) => {
638
651
  return h(
@@ -654,11 +667,11 @@ const CCalendar = defineComponent({
654
667
  })
655
668
  : date
656
669
  .toLocaleDateString(props.locale, { weekday: 'long' })
657
- .slice(0, props.weekdayFormat),
658
- ),
670
+ .slice(0, props.weekdayFormat)
671
+ )
659
672
  )
660
673
  }),
661
- ]),
674
+ ])
662
675
  ),
663
676
  h('tbody', {}, [
664
677
  view.value === 'days' &&
@@ -667,13 +680,13 @@ const CCalendar = defineComponent({
667
680
  week.weekNumber === 0
668
681
  ? `${_calendarDate.getFullYear()}W53`
669
682
  : `${_calendarDate.getFullYear()}W${week.weekNumber}`,
670
- props.selectionType,
683
+ props.selectionType
671
684
  )
672
685
  const isDisabled = isDateDisabled(
673
686
  date,
674
687
  minDate.value,
675
688
  maxDate.value,
676
- props.disabledDates,
689
+ props.disabledDates
677
690
  )
678
691
  const isSelected = isDateSelected(date, startDate.value, endDate.value)
679
692
  const current = week.days.some((day) => day.month === 'current')
@@ -711,14 +724,14 @@ const CCalendar = defineComponent({
711
724
  h(
712
725
  'th',
713
726
  { class: 'calendar-cell-week-number' },
714
- week.weekNumber === 0 ? 53 : week.weekNumber,
727
+ week.weekNumber === 0 ? 53 : week.weekNumber
715
728
  ),
716
729
  week.days.map(({ date, month }: { date: Date; month: string }) => {
717
730
  const isDisabled = isDateDisabled(
718
731
  date,
719
732
  minDate.value,
720
733
  maxDate.value,
721
- props.disabledDates,
734
+ props.disabledDates
722
735
  )
723
736
  const isSelected = isDateSelected(date, startDate.value, endDate.value)
724
737
  return month === 'current' || props.showAdjacementDays
@@ -777,12 +790,12 @@ const CCalendar = defineComponent({
777
790
  ? props.dayFormat(date)
778
791
  : date.toLocaleDateString(props.locale, {
779
792
  day: <'numeric' | '2-digit'>props.dayFormat,
780
- }),
781
- ),
793
+ })
794
+ )
782
795
  )
783
796
  : h('td')
784
797
  }),
785
- ],
798
+ ]
786
799
  )
787
800
  }),
788
801
  view.value === 'months' &&
@@ -793,13 +806,13 @@ const CCalendar = defineComponent({
793
806
  row.map((month, idx) => {
794
807
  const monthNumber = index * 3 + idx
795
808
  const date = new Date(_calendarDate.getFullYear(), monthNumber, 1)
796
- const isDisabled = isDateDisabled(
809
+ const isDisabled = isMonthDisabled(
797
810
  date,
798
811
  minDate.value,
799
812
  maxDate.value,
800
- props.disabledDates,
813
+ props.disabledDates
801
814
  )
802
- const isSelected = isDateSelected(date, startDate.value, endDate.value)
815
+ const isSelected = isMonthSelected(date, startDate.value, endDate.value)
803
816
  return h(
804
817
  'td',
805
818
  {
@@ -811,9 +824,9 @@ const CCalendar = defineComponent({
811
824
  'range-hover':
812
825
  props.selectionType === 'month' &&
813
826
  (hoverDate.value && selectEndDate.value
814
- ? isDateInRange(date, startDate.value, hoverDate.value)
815
- : isDateInRange(date, hoverDate.value, endDate.value)),
816
- range: isDateInRange(date, startDate.value, endDate.value),
827
+ ? isMonthInRange(date, startDate.value, hoverDate.value)
828
+ : isMonthInRange(date, hoverDate.value, endDate.value)),
829
+ range: isMonthInRange(date, startDate.value, endDate.value),
817
830
  },
818
831
  ],
819
832
  tabindex: isDisabled ? -1 : 0,
@@ -827,9 +840,9 @@ const CCalendar = defineComponent({
827
840
  onMouseleave: () => handleCalendarMouseLeave(),
828
841
  }),
829
842
  },
830
- h('div', { class: 'calendar-cell-inner' }, month),
843
+ h('div', { class: 'calendar-cell-inner' }, month)
831
844
  )
832
- }),
845
+ })
833
846
  )
834
847
  }),
835
848
  view.value === 'years' &&
@@ -839,13 +852,13 @@ const CCalendar = defineComponent({
839
852
  {},
840
853
  row.map((year) => {
841
854
  const date = new Date(year, 0, 1)
842
- const isDisabled = isDateDisabled(
855
+ const isDisabled = isYearDisabled(
843
856
  date,
844
857
  minDate.value,
845
858
  maxDate.value,
846
- props.disabledDates,
859
+ props.disabledDates
847
860
  )
848
- const isSelected = isDateSelected(date, startDate.value, endDate.value)
861
+ const isSelected = isYearSelected(date, startDate.value, endDate.value)
849
862
  return h(
850
863
  'td',
851
864
  {
@@ -857,9 +870,9 @@ const CCalendar = defineComponent({
857
870
  'range-hover':
858
871
  props.selectionType === 'year' &&
859
872
  (hoverDate.value && selectEndDate.value
860
- ? isDateInRange(date, startDate.value, hoverDate.value)
861
- : isDateInRange(date, hoverDate.value, endDate.value)),
862
- range: isDateInRange(date, startDate.value, endDate.value),
873
+ ? isYearInRange(date, startDate.value, hoverDate.value)
874
+ : isYearInRange(date, hoverDate.value, endDate.value)),
875
+ range: isYearInRange(date, startDate.value, endDate.value),
863
876
  },
864
877
  ],
865
878
  tabindex: isDisabled ? -1 : 0,
@@ -873,9 +886,9 @@ const CCalendar = defineComponent({
873
886
  onMouseleave: () => handleCalendarMouseLeave(),
874
887
  }),
875
888
  },
876
- h('div', { class: 'calendar-cell-inner' }, year),
889
+ h('div', { class: 'calendar-cell-inner' }, year)
877
890
  )
878
- }),
891
+ })
879
892
  )
880
893
  }),
881
894
  ]),
@@ -907,7 +920,7 @@ const CCalendar = defineComponent({
907
920
  slots.navPrevDoubleIcon
908
921
  ? slots.navPrevDoubleIcon()
909
922
  : h('span', { class: 'calendar-nav-icon calendar-nav-icon-double-prev' }),
910
- },
923
+ }
911
924
  ),
912
925
  view.value === 'days' &&
913
926
  h(
@@ -926,9 +939,9 @@ const CCalendar = defineComponent({
926
939
  slots.navPrevIcon
927
940
  ? slots.navPrevIcon()
928
941
  : h('span', { class: 'calendar-nav-icon calendar-nav-icon-prev' }),
929
- },
942
+ }
930
943
  ),
931
- ],
944
+ ]
932
945
  ),
933
946
  h(
934
947
  'div',
@@ -948,7 +961,7 @@ const CCalendar = defineComponent({
948
961
  if (props.navigation) view.value = 'months'
949
962
  },
950
963
  },
951
- () => _calendarDate.toLocaleDateString(props.locale, { month: 'long' }),
964
+ () => _calendarDate.toLocaleDateString(props.locale, { month: 'long' })
952
965
  ),
953
966
  h(
954
967
  CButton,
@@ -960,9 +973,9 @@ const CCalendar = defineComponent({
960
973
  },
961
974
  ...(props.navYearFirst && { style: { order: '-1' } }),
962
975
  },
963
- () => _calendarDate.toLocaleDateString(props.locale, { year: 'numeric' }),
976
+ () => _calendarDate.toLocaleDateString(props.locale, { year: 'numeric' })
964
977
  ),
965
- ],
978
+ ]
966
979
  ),
967
980
  props.navigation &&
968
981
  h(
@@ -988,7 +1001,7 @@ const CCalendar = defineComponent({
988
1001
  slots.navNextIcon
989
1002
  ? slots.navNextIcon()
990
1003
  : h('span', { class: 'calendar-nav-icon calendar-nav-icon-next' }),
991
- },
1004
+ }
992
1005
  ),
993
1006
  h(
994
1007
  CButton,
@@ -1006,9 +1019,9 @@ const CCalendar = defineComponent({
1006
1019
  slots.navNextDoubleIcon
1007
1020
  ? slots.navNextDoubleIcon()
1008
1021
  : h('span', { class: 'calendar-nav-icon calendar-nav-icon-double-next' }),
1009
- },
1022
+ }
1010
1023
  ),
1011
- ],
1024
+ ]
1012
1025
  ),
1013
1026
  ])
1014
1027
  }
@@ -1034,7 +1047,7 @@ const CCalendar = defineComponent({
1034
1047
  Calendar(_calendarDate),
1035
1048
  ])
1036
1049
  }),
1037
- ],
1050
+ ]
1038
1051
  )
1039
1052
  },
1040
1053
  })
@@ -0,0 +1,5 @@
1
+ export type DisabledDate = ((date: Date) => boolean) | Date | Date[]
2
+
3
+ export type SelectionTypes = 'day' | 'week' | 'month' | 'year'
4
+
5
+ export type ViewTypes = 'days' | 'months' | 'years'