diff --git a/docs/app/components/content/ComponentCode.vue b/docs/app/components/content/ComponentCode.vue index c92ab9db49..08746c809e 100644 --- a/docs/app/components/content/ComponentCode.vue +++ b/docs/app/components/content/ComponentCode.vue @@ -93,6 +93,8 @@ const options = computed(() => { chip: key.toLowerCase().endsWith('color') ? { color: variant } : undefined })) + // TODO: process "undefined | Date | DateRange", https://github.com/nuxt/ui/issues/2651 + return { name: key, label: key, diff --git a/docs/app/components/content/examples/calendar/CalendarDisabledDatesExample.vue b/docs/app/components/content/examples/calendar/CalendarDisabledDatesExample.vue new file mode 100644 index 0000000000..78e4774c77 --- /dev/null +++ b/docs/app/components/content/examples/calendar/CalendarDisabledDatesExample.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/app/components/content/examples/calendar/CalendarEventsExample.vue b/docs/app/components/content/examples/calendar/CalendarEventsExample.vue new file mode 100644 index 0000000000..23ee1a6a51 --- /dev/null +++ b/docs/app/components/content/examples/calendar/CalendarEventsExample.vue @@ -0,0 +1,28 @@ + + + diff --git a/docs/app/components/content/examples/calendar/CalendarMinMaxDatesExample.vue b/docs/app/components/content/examples/calendar/CalendarMinMaxDatesExample.vue new file mode 100644 index 0000000000..ff985e0a7f --- /dev/null +++ b/docs/app/components/content/examples/calendar/CalendarMinMaxDatesExample.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/app/components/content/examples/calendar/CalendarUnavailableDatesExample.vue b/docs/app/components/content/examples/calendar/CalendarUnavailableDatesExample.vue new file mode 100644 index 0000000000..21a41bad95 --- /dev/null +++ b/docs/app/components/content/examples/calendar/CalendarUnavailableDatesExample.vue @@ -0,0 +1,16 @@ + + + diff --git a/docs/content/3.components/calendar.md b/docs/content/3.components/calendar.md new file mode 100644 index 0000000000..d2d786abbe --- /dev/null +++ b/docs/content/3.components/calendar.md @@ -0,0 +1,138 @@ +--- +title: Calendar +description: A calendar to select a date. +links: + - label: Calendar + icon: i-custom-radix-vue + to: https://www.radix-vue.com/components/calendar.html + - label: GitHub + icon: i-simple-icons-github + to: https://github.com/nuxt/ui/tree/v3/src/runtime/components/Calendar.vue +navigation.badge: New +--- + +## Usage + +Use the `v-model` directive to control the selected date. + +::component-code +--- +--- +:: + +### Range + +Use the `range` prop to select a range of dates. + +::component-code +--- +ignore: + - range +props: + range: true +--- +:: + +### Color + +Use the `color` prop to change the color of the calendar. + +::component-code +--- +props: + color: neutral +--- +:: + +### Size + +Use the `size` prop to change the size of the calendar. + +::component-code +--- +props: + size: md +--- +:: + +### Year Controls + +Use the `year-controls` prop to show the year controls. + +::component-code +--- +props: + yearControls: true +--- +:: + +### Fixed Weeks + +Use the `fixedWeeks` prop to display the calendar with fixed weeks. + +::component-code +--- +props: + fixedWeeks: true +--- +:: + +## Examples + +### Events Calendar + +Add a different color to each day. + +::component-example +--- +name: 'calendar-events-example' +--- +:: + +### Disabled Dates + +Mark the interval between `10` and `16` as disabled + +::component-example +--- +name: 'calendar-disabled-dates-example' +--- +:: + +### Unavailable Dates + +Mark the interval between `10` and `16` as unavailable + +::component-example +--- +name: 'calendar-unavailable-dates-example' +--- +:: + +### Min/Max Dates + +Limit the dates between `2023-09-01` and `2023-09-30` + +::component-example +--- +name: 'calendar-min-max-dates-example' +--- +:: + +## API + +### Props + +:component-props + +### Slots + +:component-slots + +### Emits + +:component-emits + +## Theme + +:component-theme diff --git a/package.json b/package.json index b5f8b7a487..84a47d398d 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ }, "dependencies": { "@iconify/vue": "^4.1.2", + "@internationalized/date": "^3.5.6", "@internationalized/number": "^3.5.4", "@nuxt/devtools-kit": "^1.6.0", "@nuxt/fonts": "^0.10.2", diff --git a/playground/app/app.vue b/playground/app/app.vue index 2780f323a9..b11bfc7454 100644 --- a/playground/app/app.vue +++ b/playground/app/app.vue @@ -26,6 +26,7 @@ const components = [ 'button', 'button-group', 'card', + 'calendar', 'carousel', 'checkbox', 'chip', diff --git a/playground/app/pages/components/calendar.vue b/playground/app/pages/components/calendar.vue new file mode 100644 index 0000000000..a026bffd60 --- /dev/null +++ b/playground/app/pages/components/calendar.vue @@ -0,0 +1,18 @@ + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5597376adc..6e1526828f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@iconify/vue': specifier: ^4.1.2 version: 4.1.2(vue@3.5.12(typescript@5.6.3)) + '@internationalized/date': + specifier: ^3.5.6 + version: 3.5.6 '@internationalized/number': specifier: ^3.5.4 version: 3.5.4 diff --git a/src/runtime/components/Calendar.vue b/src/runtime/components/Calendar.vue new file mode 100644 index 0000000000..d952f853d7 --- /dev/null +++ b/src/runtime/components/Calendar.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/src/runtime/locale/ar.ts b/src/runtime/locale/ar.ts index c1fb6ed5a8..6b86aee2d0 100644 --- a/src/runtime/locale/ar.ts +++ b/src/runtime/locale/ar.ts @@ -10,6 +10,12 @@ export default defineLocale({ noData: 'لا توجد بيانات', create: 'إنشاء "{label}"' }, + calendar: { + prevYear: 'السنة السابقة', + nextYear: 'السنة المقبلة', + prevMonth: 'الشهر السابق', + nextMonth: 'الشهر المقبل' + }, inputNumber: { increment: 'زيادة', decrement: 'تقليل' diff --git a/src/runtime/locale/cs.ts b/src/runtime/locale/cs.ts index b9296d33fd..ab1da24f66 100644 --- a/src/runtime/locale/cs.ts +++ b/src/runtime/locale/cs.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'Žádná data', create: 'Vytvořit "{label}"' }, + calendar: { + prevYear: 'Předchozí rok', + nextYear: 'Další rok', + prevMonth: 'Předchozí měsíc', + nextMonth: 'Další měsíc' + }, inputNumber: { increment: 'Zvýšit', decrement: 'Snížit' diff --git a/src/runtime/locale/de.ts b/src/runtime/locale/de.ts index a04604852c..05c4f6b297 100644 --- a/src/runtime/locale/de.ts +++ b/src/runtime/locale/de.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'Keine Daten', create: 'Erstellen "{label}"' }, + calendar: { + prevYear: 'Vorheriges Jahr', + nextYear: 'Nächstes Jahr', + prevMonth: 'Vorheriger Monat', + nextMonth: 'Nächster Monat' + }, inputNumber: { increment: 'Erhöhen', decrement: 'Verringern' diff --git a/src/runtime/locale/en.ts b/src/runtime/locale/en.ts index 4be5a9c824..74e669b5ce 100644 --- a/src/runtime/locale/en.ts +++ b/src/runtime/locale/en.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'No data', create: 'Create "{label}"' }, + calendar: { + prevYear: 'Previous year', + nextYear: 'Next year', + prevMonth: 'Previous month', + nextMonth: 'Next month' + }, inputNumber: { increment: 'Increment', decrement: 'Decrement' diff --git a/src/runtime/locale/es.ts b/src/runtime/locale/es.ts index f3579f4e8d..bd24c608ac 100644 --- a/src/runtime/locale/es.ts +++ b/src/runtime/locale/es.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'Sin datos', create: 'Crear "{label}"' }, + calendar: { + prevYear: 'A o anterior', + nextYear: 'A o siguiente', + prevMonth: 'Mes anterior', + nextMonth: 'Mes siguiente' + }, inputNumber: { increment: 'Incremento', decrement: 'Decremento' diff --git a/src/runtime/locale/fr.ts b/src/runtime/locale/fr.ts index 19086796f1..111c863b91 100644 --- a/src/runtime/locale/fr.ts +++ b/src/runtime/locale/fr.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'Aucune donnée', create: 'Créer "{label}"' }, + calendar: { + prevYear: 'Année précédente', + nextYear: 'Année suivante', + prevMonth: 'Mois précédent', + nextMonth: 'Mois suivant' + }, inputNumber: { increment: 'Augmenter', decrement: 'Diminuer' diff --git a/src/runtime/locale/it.ts b/src/runtime/locale/it.ts index cd0eb32b05..c7f70a3444 100644 --- a/src/runtime/locale/it.ts +++ b/src/runtime/locale/it.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'Nessun dato', create: 'Crea "{label}"' }, + calendar: { + prevYear: 'Anno precedente', + nextYear: 'Anno successivo', + prevMonth: 'Mese precedente', + nextMonth: 'Mese successivo' + }, inputNumber: { increment: 'Aumenta', decrement: 'Diminuisci' diff --git a/src/runtime/locale/ru.ts b/src/runtime/locale/ru.ts index 85135db5f3..f3d98d849e 100644 --- a/src/runtime/locale/ru.ts +++ b/src/runtime/locale/ru.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: 'Нет данных', create: 'Создать "{label}"' }, + calendar: { + prevYear: 'Предыдущий год', + nextYear: 'Следующий год', + prevMonth: 'Предыдущий месяц', + nextMonth: 'Следующий месяц' + }, inputNumber: { increment: 'Увеличить', decrement: 'Уменьшить' diff --git a/src/runtime/locale/zh_hans.ts b/src/runtime/locale/zh_hans.ts index c829c64164..0a9c2213ae 100644 --- a/src/runtime/locale/zh_hans.ts +++ b/src/runtime/locale/zh_hans.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: '没有数据', create: '创建 "{label}"' }, + calendar: { + prevYear: '去年', + nextYear: '明年', + prevMonth: '上个月', + nextMonth: '下个月' + }, inputNumber: { increment: '增加', decrement: '减少' diff --git a/src/runtime/locale/zh_hant.ts b/src/runtime/locale/zh_hant.ts index 1671051c28..556d237a6e 100644 --- a/src/runtime/locale/zh_hant.ts +++ b/src/runtime/locale/zh_hant.ts @@ -9,6 +9,12 @@ export default defineLocale({ noData: '沒有資料', create: '創建 "{label}"' }, + calendar: { + prevYear: '去年', + nextYear: '明年', + prevMonth: '上个月', + nextMonth: '下个月' + }, inputNumber: { increment: '增加', decrement: '减少' diff --git a/src/runtime/types/date.ts b/src/runtime/types/date.ts new file mode 100644 index 0000000000..f9e495296c --- /dev/null +++ b/src/runtime/types/date.ts @@ -0,0 +1,22 @@ +import type { DateValue, ZonedDateTime } from '@internationalized/date' + +export interface DateRange { + /** + * The start of the range + */ + start: Date | undefined + /** + * The end of the range + */ + end: Date | undefined +} + +export interface ZonedDateRange { + start: ZonedDateTime | undefined + end: ZonedDateTime | undefined +} + +export type DateRangeRadix = { + start: DateValue | undefined + end: DateValue | undefined +} diff --git a/src/runtime/types/index.ts b/src/runtime/types/index.ts index 072e3e8db8..aa067d6b7d 100644 --- a/src/runtime/types/index.ts +++ b/src/runtime/types/index.ts @@ -6,6 +6,7 @@ export * from '../components/AvatarGroup.vue' export * from '../components/Badge.vue' export * from '../components/Breadcrumb.vue' export * from '../components/Button.vue' +export * from '../components/Calendar.vue' export * from '../components/Card.vue' export * from '../components/Carousel.vue' export * from '../components/Checkbox.vue' diff --git a/src/runtime/types/locale.ts b/src/runtime/types/locale.ts index b5b3ed02bb..4148874b97 100644 --- a/src/runtime/types/locale.ts +++ b/src/runtime/types/locale.ts @@ -4,6 +4,12 @@ export type Messages = { noData: string create: string } + calendar: { + prevYear: string + nextYear: string + prevMonth: string + nextMonth: string + } inputNumber: { increment: string decrement: string diff --git a/src/runtime/utils/date.ts b/src/runtime/utils/date.ts new file mode 100644 index 0000000000..f013d3813f --- /dev/null +++ b/src/runtime/utils/date.ts @@ -0,0 +1,21 @@ +import { fromDate, getLocalTimeZone } from '@internationalized/date' +import type { ZonedDateTime } from '@internationalized/date' +import type { DateRange, ZonedDateRange } from '../types/date' + +export function toZonedDateTime(date?: Date | undefined): undefined | ZonedDateTime { + return date ? fromDate(date, getLocalTimeZone()) : undefined +} + +export function toRangeZonedDateTime(range: DateRange): ZonedDateRange { + return { + start: range.start ? toZonedDateTime(range.start) : undefined, + end: range.end ? toZonedDateTime(range.end) : undefined + } +} + +export function toRangeDate(range: ZonedDateRange): DateRange { + return { + start: range.start?.toDate(), + end: range.end?.toDate() + } +} diff --git a/src/theme/calendar.ts b/src/theme/calendar.ts new file mode 100644 index 0000000000..5887b26962 --- /dev/null +++ b/src/theme/calendar.ts @@ -0,0 +1,67 @@ +import type { ModuleOptions } from '../module' + +export default (options: Required) => { + return { + slots: { + root: 'rounded-[calc(var(--ui-radius)*1.5)]', + header: 'flex items-center justify-between', + body: 'flex flex-col space-y-4 pt-4 sm:flex-row sm:space-x-4 sm:space-y-0', + heading: 'text-center text-sm font-medium truncate', + grid: 'w-full border-collapse select-none space-y-1', + gridRow: 'grid grid-cols-7', + gridWeekDaysRow: 'mb-1 grid w-full grid-cols-7', + gridBody: 'grid', + headCell: 'rounded-md text-xs', + cell: 'relative text-center text-sm', + cellTrigger: ['m-0.5 relative flex items-center justify-center rounded-full whitespace-nowrap outline-none focus-visible:ring-2 focus-visible:ring-inset data-[disabled]:text-[var(--ui-text)]/30 data-[selected]:!text-[var(--ui-bg)] data-[today]:font-semibold data-[unavailable]:pointer-events-none data-[unavailable]:!text-[var(--ui-text)]/50 data-[unavailable]:line-through', options.theme.transitions && 'transition-[color,opacity] duration-200'] + }, + variants: { + color: { + ...Object.fromEntries((options.theme.colors || []).map((color: string) => [color, { + headCell: `text-[var(--ui-${color})]`, + cellTrigger: `focus-visible:ring-[var(--ui-${color})] data-[selected]:!bg-[var(--ui-${color})] data-[today]:text-[var(--ui-${color})] data-[highlighted]:bg-[var(--ui-${color})]/20 hover:bg-[var(--ui-${color})]/20` + }])), + neutral: { + headCell: 'text-[var(--ui-bg-inverted)]', + cellTrigger: 'focus-visible:ring-[var(--ui-border-inverted)] data-[selected]:!bg-[var(--ui-bg-inverted)] data-[today]:text-[var(--ui-bg-inverted)] data-[highlighted]:bg-[var(--ui-bg-inverted)]/20 hover:bg-[var(--ui-bg-inverted)]/10' + } + }, + size: { + xs: { + heading: 'text-xs', + cell: 'text-xs', + headCell: 'text-[10px]', + cellTrigger: 'w-7 h-7', + body: 'space-y-2 pt-2' + }, + sm: { + heading: 'text-xs', + cell: 'text-xs', + cellTrigger: 'w-7 h-7' + }, + md: { + cellTrigger: 'w-8 h-8' + }, + lg: { + heading: 'text-md', + headCell: 'text-md', + cellTrigger: 'w-9 h-9 text-md' + }, + xl: { + heading: 'text-lg', + headCell: 'text-lg', + cellTrigger: 'w-10 h-10 text-lg' + } + } + }, + compoundVariants: [ + ...(options.theme.colors || []).map((color: string) => ({ + color + })) + ], + defaultVariants: { + size: 'md', + color: 'primary' + } + } +} diff --git a/src/theme/index.ts b/src/theme/index.ts index 90d2af7156..7bbbdf938b 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -6,6 +6,7 @@ export { default as badge } from './badge' export { default as breadcrumb } from './breadcrumb' export { default as button } from './button' export { default as buttonGroup } from './button-group' +export { default as calendar } from './calendar' export { default as card } from './card' export { default as carousel } from './carousel' export { default as checkbox } from './checkbox' diff --git a/test/components/Calendar.spec.ts b/test/components/Calendar.spec.ts new file mode 100644 index 0000000000..b4a9d01887 --- /dev/null +++ b/test/components/Calendar.spec.ts @@ -0,0 +1,58 @@ +import { describe, it, expect, vi, afterAll, test } from 'vitest' +import { mountSuspended } from '@nuxt/test-utils/runtime' +import Calendar, { type CalendarProps, type CalendarSlots } from '../../src/runtime/components/Calendar.vue' +import ComponentRender from '../component-render' +import theme from '#build/ui/calendar' + +describe('Calendar', () => { + const sizes = Object.keys(theme.variants.size) as any + const date = new Date('2025-01-01') + + vi.setSystemTime(date) + + afterAll(() => { + vi.useRealTimers() + }) + + it.each([ + // Props + ['with class', { props: { class: 'custom-class' } }], + ['with ui', { props: { ui: { root: 'w-96' } } }], + ['with range', { props: { range: true } }], + ['with disabled', { props: { range: true } }], + ['with readonly', { props: { range: true } }], + ['with is date disabled', { props: { isDateDisabled: () => true } }], + ['with is date unavailable', { props: { isDateUnavailable: () => true } }], + ['with week starts on', { props: { weekStartsOn: 1 } }], + ['with weekday format', { props: { weekdayFormat: 'short' } }], + ['with number of months', { props: { numberOfMonths: 2 } }], + ['without fixed weeks', { props: { fixedWeeks: false } }], + ['without year controls', { props: { yearControls: false } }], + ...sizes.map((size: string) => [`with size ${size}`, { props: { size } }]), + // Slots + ['with heading slot', { slots: { heading: () => 'Heading' } }], + ['with day slot', { slots: { day: ({ day }: Parameters[0]) => day.day } }], + ['with week-day slot', { slots: { 'week-day': ({ day }: Parameters[0]) => day } }] + ])('renders %s correctly', async (nameOrHtml: string, options: { props?: CalendarProps, slots?: Partial }) => { + const html = await ComponentRender(nameOrHtml, options, Calendar) + expect(html).toMatchSnapshot() + }) + + describe('emits', () => { + test('update:modelValue event single', async () => { + const wrapper = await mountSuspended(Calendar) + const date = new Date('2025-01-01') + + await wrapper.setValue(date) + expect(wrapper.emitted()).toMatchObject({ 'update:modelValue': [[date]] }) + }) + + test('update:modelValue event range', async () => { + const wrapper = await mountSuspended(Calendar, { props: { range: true } }) + const date = [new Date('2025-01-01'), new Date('2025-01-02')] + + await wrapper.setValue(date) + expect(wrapper.emitted()).toMatchObject({ 'update:modelValue': [[date]] }) + }) + }) +}) diff --git a/test/components/__snapshots__/Calendar-vue.spec.ts.snap b/test/components/__snapshots__/Calendar-vue.spec.ts.snap new file mode 100644 index 0000000000..ab8e457040 --- /dev/null +++ b/test/components/__snapshots__/Calendar-vue.spec.ts.snap @@ -0,0 +1,3687 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Calendar > renders with class correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with day slot correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with disabled correctly 1`] = ` +"
+
+
Event Date, January 2025
+
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
" +`; + +exports[`Calendar > renders with heading slot correctly 1`] = ` +"
+
+
Heading
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with is date disabled correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with is date unavailable correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with number of months correctly 1`] = ` +"
+
+
January - February 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January - February 2025
+
+
" +`; + +exports[`Calendar > renders with range correctly 1`] = ` +"
+
+
Event Date, January 2025
+
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
" +`; + +exports[`Calendar > renders with readonly correctly 1`] = ` +"
+
+
Event Date, January 2025
+
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
" +`; + +exports[`Calendar > renders with size lg correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size md correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size sm correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size xl correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size xs correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with ui correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with week starts on correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with week-day slot correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with weekday format correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders without fixed weeks correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders without year controls correctly 1`] = ` +"
+
+ +
January 2025
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; diff --git a/test/components/__snapshots__/Calendar.spec.ts.snap b/test/components/__snapshots__/Calendar.spec.ts.snap new file mode 100644 index 0000000000..92b01d3984 --- /dev/null +++ b/test/components/__snapshots__/Calendar.spec.ts.snap @@ -0,0 +1,3687 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Calendar > renders with class correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with day slot correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with disabled correctly 1`] = ` +"
+
+
Event Date, January 2025
+
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
" +`; + +exports[`Calendar > renders with heading slot correctly 1`] = ` +"
+
+
Heading
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with is date disabled correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with is date unavailable correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with number of months correctly 1`] = ` +"
+
+
January - February 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January - February 2025
+
+
" +`; + +exports[`Calendar > renders with range correctly 1`] = ` +"
+
+
Event Date, January 2025
+
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
" +`; + +exports[`Calendar > renders with readonly correctly 1`] = ` +"
+
+
Event Date, January 2025
+
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
" +`; + +exports[`Calendar > renders with size lg correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size md correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size sm correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size xl correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with size xs correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with ui correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with week starts on correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with week-day slot correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders with weekday format correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders without fixed weeks correctly 1`] = ` +"
+
+
January 2025
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
+
+
Event Date, January 2025
+
+
" +`; + +exports[`Calendar > renders without year controls correctly 1`] = ` +"
+
+ +
January 2025
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
9
+
+
10
+
+
11
+
+
12
+
+
13
+
+
14
+
+
15
+
+
16
+
+
17
+
+
18
+
+
19
+
+
20
+
+
21
+
+
22
+
+
23
+
+
24
+
+
25
+
+
26
+
+
27
+
+
28
+
+
29
+
+
30
+
+
31
+
+
1
+
+
2
+
+
3
+
+
4
+
+
5
+
+
6
+
+
7
+
+
8
+
+
+
+
Event Date, January 2025
+
+
" +`;