fetaUI
GitHub

Calendar

Pick a date, a range, or a date and a time. Six rows always, so the height never jumps.

FreeWeb and MobileMotion

Preview

npx shadcn add @fetaui/calendar
Playground
November 2026
SuMoTuWeThFrSa
Booked and events
November 2026
SuMoTuWeThFrSa
Disabled days
November 2026
SuMoTuWeThFrSa
Month and year
SuMoTuWeThFrSa
Two months
November 2026
SuMoTuWeThFrSa
December 2026
SuMoTuWeThFrSa
Date and time
Mode
Icons animation
Motion

Installation

Terminal· bash
 npx shadcn add @fetaui/calendar

Accessibility

  • Grid role with arrow key movement.
  • Each day has a full label, like Wednesday, November 4, 2026.
  • Today is marked with aria-current.

Motion

  • Months slide 24 px the way you paged, in 280 ms.
  • The selected chip scales from 0.9. A range band follows the pointer after the start is picked.
  • With reduced motion, months swap and the fill changes in place.

Responsive behavior

  • 36 px cells on Web and 44 px on Mobile.
  • Two months stack on Mobile.

Performance

  • Only range mode adds a hover handler, so other modes do not re-render every cell on hover.
  • Intl formatters are memoized per locale, and booked days sit in a set.
  • Six rows always, so paging causes no layout shift.

Note for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Import Calendar from @/components/fetaui/calendar.
  • mode is single, range or datetime. Range values are { start, end }, and datetime needs slots.
  • onApply adds the Apply or Confirm footer. Without it, read onValueChange.
  • booked and isDisabled both block picking. Without a value or defaultMonth, the month waits for the browser. The demo's Apply does nothing. Dropdowns compose Select.

Related