Calendar

A date picker component with calendar interface

Basic Date Selection

Core selection modes with constraints, disabled dates, and locale support.

Basic Calendar

Simple date selection

March 2026
SuMoTuWeThFrSa
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

No date selected

Dropdown Navigation

Quick month/year selection

SuMoTuWeThFrSa
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

No date selected

With Initial Value

Pre-selected date

March 2026
SuMoTuWeThFrSa
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

Initialized with today's date

Date Constraints

Min/max date restrictions

March 2026
SuMoTuWeThFrSa
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

Today to 2 months ahead

Disabled Weekends

Weekends are not selectable

March 2026
SuMoTuWeThFrSa
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

Saturday and Sunday disabled

Unavailable Dates

Dates marked as unavailable

March 2026
SuMoTuWeThFrSa
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

5th, 10th, 15th, 20th, 25th strikethrough

Week Starts Monday

European style calendar

March 2026
MoTuWeThFrSaSu
23
24
25
26
27
28
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

Week begins on Monday

Fixed Weeks

Always shows 6 weeks

March 2026
SuMoTuWeThFrSa
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
10
11

Consistent height across months

Spanish Locale

Localized to Spanish

marzo 2026
lumamijuvisádo
23
24
25
26
27
28
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

Ninguna fecha seleccionada


Code Svelte
1
2<script lang="ts">
3  import { Calendar } from "@kareyes/aether";
4  import { today, getLocalTimeZone, isWeekend, type DateValue } from "@internationalized/date";
5
6  let selected = $state<DateValue | undefined>();
7</script>
8
9<!-- Basic single date selection -->
10<Calendar type="single" bind:value={selected} />
11
12<!-- Dropdown navigation (month + year selects) -->
13<Calendar type="single" bind:value={selected} captionLayout="dropdown" />
14
15<!-- Pre-selected with today's date -->
16<Calendar type="single" value={today(getLocalTimeZone())} />
17
18<!-- Only allow dates from today to 2 months ahead -->
19<Calendar
20  type="single"
21  bind:value={selected}
22  minValue={today(getLocalTimeZone())}
23  maxValue={today(getLocalTimeZone()).add({ months: 2 })}
24/>
25
26<!-- Disable weekends -->
27<Calendar
28  type="single"
29  isDateDisabled={(date: DateValue) => isWeekend(date, "en-US")}
30/>
31
32<!-- Mark specific days as unavailable -->
33<Calendar
34  type="single"
35  isDateUnavailable={(date: DateValue) => [5, 10, 15, 20, 25].includes(date.day)}
36/>
37
38<!-- Week starts on Monday -->
39<Calendar type="single" weekStartsOn={1} />
40
41<!-- Always show 6 weeks (fixed height) -->
42<Calendar type="single" fixedWeeks={true} />
43
44<!-- Spanish locale -->
45<Calendar type="single" locale="es-ES" />

Multiple Months

Display multiple months side by side using numberOfMonths.

Two Month View

Display two months side by side

March 2026
SuMoTuWeThFrSa
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
April 2026
SuMoTuWeThFrSa
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
1
2

No date selected


Code Svelte
1
2<script lang="ts">
3  import { Calendar } from "@kareyes/aether";
4  import type { DateValue } from "@internationalized/date";
5
6  let selected = $state<DateValue | undefined>();
7</script>
8
9<Calendar type="single" bind:value={selected} numberOfMonths={2} />

Caption Layouts

Control how the month/year header is rendered with captionLayout.

Label

Default caption style

March 2026
SuMoTuWeThFrSa
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
Dropdown

Month & year dropdowns

SuMoTuWeThFrSa
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
Dropdown Months

Month dropdown only

2026
SuMoTuWeThFrSa
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
Dropdown Years

Year dropdown only

Mar
SuMoTuWeThFrSa
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

Code Svelte
1
2<script lang="ts">
3  import { Calendar } from "@kareyes/aether";
4</script>
5
6<!-- Default label (prev/next arrows only) -->
7<Calendar type="single" captionLayout="label" />
8
9<!-- Both month and year dropdowns -->
10<Calendar type="single" captionLayout="dropdown" />
11
12<!-- Month dropdown only -->
13<Calendar type="single" captionLayout="dropdown-months" />
14
15<!-- Year dropdown only -->
16<Calendar type="single" captionLayout="dropdown-years" />

Navigation Button Variants

Style the prev/next navigation buttons with buttonVariant.

Ghost

Default navigation style

March 2026
SuMoTuWeThFrSa
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
Outline

Outlined navigation buttons

March 2026
SuMoTuWeThFrSa
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
Default

Solid navigation buttons

March 2026
SuMoTuWeThFrSa
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

Code Svelte
1
2<script lang="ts">
3  import { Calendar } from "@kareyes/aether";
4</script>
5
6<!-- Ghost (default) -->
7<Calendar type="single" buttonVariant="ghost" />
8
9<!-- Outline -->
10<Calendar type="single" buttonVariant="outline" />
11
12<!-- Solid -->
13<Calendar type="single" buttonVariant="default" />

States

Disable all interaction or allow navigation without selection.

Disabled

Calendar is fully disabled

March 2026
SuMoTuWeThFrSa
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
Readonly

Can navigate but not select

March 2026
SuMoTuWeThFrSa
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

Code Svelte
1
2<script lang="ts">
3  import { Calendar } from "@kareyes/aether";
4  import { today, getLocalTimeZone } from "@internationalized/date";
5</script>
6
7<!-- Fully disabled — no interaction -->
8<Calendar type="single" disabled />
9
10<!-- Readonly — navigate but cannot select -->
11<Calendar type="single" readonly value={today(getLocalTimeZone())} />

Size Variants

Four sizes to match different layout needs.

Small

Compact calendar size

March 2026
SuMoTuWeThFrSa
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
Default

Standard calendar size

March 2026
SuMoTuWeThFrSa
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
Large

Larger calendar cells

March 2026
SuMoTuWeThFrSa
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
Extra Large

Maximum calendar size

March 2026
SuMoTuWeThFrSa
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

Code Svelte
1
2<script lang="ts">
3  import { Calendar } from "@kareyes/aether";
4</script>
5
6<Calendar type="single" size="sm" />
7<Calendar type="single" size="default" />
8<Calendar type="single" size="lg" />
9<Calendar type="single" size="xl" />

Event Markers

Dots on smaller sizes, badge labels on larger sizes. Check dates 5, 10, 15, 20, and today.

Small with Events

Dots display for events

March 2026
SuMoTuWeThFrSa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 +1
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
Default with Events

Dots display for events

March 2026
SuMoTuWeThFrSa
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
Large with Events

Badge display for events

March 2026
SuMoTuWeThFrSa
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
XL with Events

Full badge labels

March 2026
SuMoTuWeThFrSa
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

Code Svelte
1
2<script lang="ts">
3  import { Calendar, type CalendarPrimitives } from "@kareyes/aether";
4  import { today, getLocalTimeZone } from "@internationalized/date";
5
6  type CalendarEvent = CalendarPrimitives.CalendarEvent;
7
8  const now = today(getLocalTimeZone());
9  const pad = (n: number) => String(n).padStart(2, "0");
10
11  const events: CalendarEvent[] = [
12    { date: `${now.year}-${pad(now.month)}-05`, color: "#ef4444", label: "Meeting" },
13    { date: `${now.year}-${pad(now.month)}-05`, color: "#3b82f6", label: "Call" },
14    { date: `${now.year}-${pad(now.month)}-10`, color: "#22c55e", label: "Event" },
15    { date: `${now.year}-${pad(now.month)}-15`, color: "#f59e0b", label: "Deadline" },
16    { date: `${now.year}-${pad(now.month)}-20`, color: "#06b6d4", label: "Launch" },
17  ];
18</script>
19
20<!-- Dots on sm/default, badge labels on lg/xl -->
21<Calendar type="single" size="sm" {events} />
22<Calendar type="single" size="default" {events} />
23<Calendar type="single" size="lg" {events} />
24<Calendar type="single" size="xl" {events} />

Combined Features

Mixing size, events, caption layout, and fixed weeks together.

XL Calendar with Events & Dropdown

Full-featured large calendar

SuMoTuWeThFrSa
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
10
11

Code Svelte
1
2<script lang="ts">
3  import { Calendar, type CalendarPrimitives } from "@kareyes/aether";
4  import { today, getLocalTimeZone } from "@internationalized/date";
5
6  type CalendarEvent = CalendarPrimitives.CalendarEvent;
7
8  const now = today(getLocalTimeZone());
9  const pad = (n: number) => String(n).padStart(2, "0");
10
11  const events: CalendarEvent[] = [
12    { date: `${now.year}-${pad(now.month)}-10`, color: "#22c55e", label: "Event" },
13    { date: `${now.year}-${pad(now.month)}-15`, color: "#f59e0b", label: "Deadline" },
14  ];
15</script>
16
17<Calendar
18  type="single"
19  size="xl"
20  {events}
21  captionLayout="dropdown"
22  fixedWeeks={true}
23/>

Full Size Calendar

Full-width view with event cards. Events display as colored cards with labels. Responsive on mobile/desktop.

Su Mo Tu We Th Fr Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 +1
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11

Code Svelte
1
2<script lang="ts">
3  import { Calendar, type CalendarPrimitives } from "@kareyes/aether";
4  import { today, getLocalTimeZone } from "@internationalized/date";
5
6  type CalendarEvent = CalendarPrimitives.CalendarEvent;
7
8  const now = today(getLocalTimeZone());
9  const pad = (n: number) => String(n).padStart(2, "0");
10
11  const events: CalendarEvent[] = [
12    { date: `${now.year}-${pad(now.month)}-03`, color: "#3b82f6", label: "Team Standup", description: "Daily sync" },
13    { date: `${now.year}-${pad(now.month)}-05`, color: "#ef4444", label: "Client Meeting" },
14    { date: `${now.year}-${pad(now.month)}-15`, color: "#ec4899", label: "Release v2.0", description: "Major deployment" },
15    { date: `${now.year}-${pad(now.month)}-20`, color: "#06b6d4", label: "Conference" },
16  ];
17</script>
18
19<div class="border rounded-lg overflow-hidden bg-background">
20  <Calendar type="single" size="full" {events} fixedWeeks={true} />
21</div>