Skip to content

DatePicker vs the per-framework date pickers

Date pickers are one of the most-reimplemented widgets in front-end — and almost every option a design-system author can reach for is single-framework. The accessible, headless ones (React Aria, Melt/Bits UI) are locked to one framework; the styled, feature-deep ones (MUI X, @vuepic/vue-datepicker, flatpickr) are likewise React-only, Vue-only, or a vanilla engine you re-wrap per target. So a team shipping a design system across React + Vue + Svelte + Angular (+ Solid + Lit) adopts and maintains a different date picker per framework — with divergent APIs, divergent theming, and wildly divergent accessibility quality.

@rozie-ui/date-picker takes the other path: one .rozie source → six idiomatic, accessible packages with one API (value model, min/max/disabledDates, roving-grid keyboard nav, a #header slot, a focus/goToToday/clear handle). It does less than the feature-deep incumbents on purpose — single-date or range selection (with preset shortcuts), headless, token-themed — and that scope is stated plainly below, not hidden.

Research snapshot: 2026-06-24. Versions, publish dates, and weekly-download figures were verified live against the npm registry (registry.npmjs.org) and the npm downloads API. The date-picker landscape moves; re-check before relying on a specific number. Download counts are a single-week sample and bounce week to week — treat them as rough order-of-magnitude, not a quality verdict.

The landscape at a glance

Cell legend: = yes / documented · = no / not present · ~ = partial / stale / lightly-documented.

LibraryFramework(s)Headless?WAI-ARIA a11yMaintained (latest / date)Range / timeNotes
@rozie-ui/date-pickerReact + Vue + Svelte + Angular + Solid + Lit✓ token-themed✓ ARIA grid + roving keyboardthis repo (2026-06)range ✓ / time ✗One source → six idiomatic packages, one API. Single + range selection with presets; no time-of-day.
react-datepickerReact✗ styled~ keyboard, partial ARIA9.1.0 / 2025-12✓ / ✓~4.7M wk. The popular default; opinionated CSS.
react-day-pickerReact~ restyleable✓ follows APG10.0.1 / 2026-05range ✓ / time ✗Strong a11y; non-Gregorian calendars. Powers shadcn/ui's calendar.
@mui/x-date-pickersReact✗ Material✓ documented WCAG/ARIA9.6.0 / 2026-06time ✓ / range Pro-onlyDate/time/datetime free; range pickers are commercial.
react-aria (useDatePicker/useCalendar)React✓ hooks✓ best-in-class1.19.0 / 2026-06✓ / ✓Adobe; the accessibility gold standard. React-only.
AriakitReactn/a0.4.30 / 2026-06No date/calendar primitive at all — build it from Popover yourself.
@vuepic/vue-datepickerVue 3✗ styled✓ documented14.0.0 / 2026-06✓ / ✓Deepest Vue option: range, time, month/year/week, multi-cal.
v-calendarVue (3.x via @next)✗ styled~ weak3.1.2 / 2023-10range ✓ / time ✗Vue-3 build ~2.5 yrs stale; a11y long-flagged.
vue-datepicker-nextVue 3✗ styled✗ undocumented1.0.3 / 2023-03✓ / ✓Unmaintained (>3 yrs).
bits-uiSvelte 5✓ headless✓ (on @internationalized/date)2.18.1 / 2026-05✓ / ✓The live, maintained Svelte choice; wraps Melt internally.
@melt-ui/svelteSvelte 3/4/5✓ builders✓ strongest Svelte a11y docs0.86.6 / 2025-03✓ / ✓Builder API; momentum shifted to bits-ui.
date-picker-svelteSvelte 3/4/5✗ styled~ undocumented2.17.0 / 2025-11time ✓ / range ✗Small, single-date + time.
svelty-pickerSvelte 5~ themable~ keyboard claimed6.1.6 / 2025-09range ✓ / time ✓Niche (~5k wk), Bootstrap-flavored.
@angular/material (MatDatepicker)Angular✗ Material✓ documented22.0.2 / 2026-06range ✓ / sep. timepickerFirst-party; tracks the Angular release train.
PrimeNG DatePickerAngular✗ themed✓ documented21.1.9 / 2026-06✓ / ✓Deepest Angular feature set (range/time/month/year).
ng-bootstrap (NgbDatepicker)Angular✗ Bootstrap~ gaps reported21.0.0 / 2026-06range ✓ / time ✗Needs Bootstrap CSS; documented screen-reader gaps.
flatpickrvanilla (re-wrapped)✗ styled✗ known weak spot4.6.13 / 2022-04✓ / ✓Huge usage (~1.7M wk) but ~4 yrs stale; a11y a known pain point.
air-datepickervanilla✗ styled~ thin3.6.0 / 2025-05✓ / ✓Dependency-free; ARIA not comprehensively documented.
duet-date-pickerweb component✗ themable✓ a11y was its pitch1.4.0 / 2021-06✗ single-dateRepo archived read-only 2024-09 — not maintained.
Callyframework-agnostic WC~ CSS parts✓ a11y a core goal0.9.2 / 2026-02range ✓ / time ✗The modern up-and-comer; pre-1.0, framework-independent.

These libraries are good — on its home framework, most are the obvious pick, and Rozie does not claim to out-feature MUI X on React or @vuepic on Vue. The wedge is coverage and consistency, addressed next.

The cross-framework parity argument

Line the landscape up by framework and the gap is structural, not cosmetic:

  • React has the richest set — but the accessible headless one (react-aria) is React-only, and even the popular default (react-datepicker) ships opinionated CSS. Ariakit — a headless accessible toolkit you might assume covers this — has no date primitive at all.
  • Vue's only actively-maintained, a11y-documented option is @vuepic/vue-datepicker; the other two are stale (v-calendar's Vue-3 build last shipped 2023-10; vue-datepicker-next over three years ago). Different API, different theming model than anything on React.
  • Svelte is its own ecosystem again — bits-ui (headless, built on Adobe's @internationalized/date) with Melt beneath it. Builders and snippets, nothing like the React or Vue surface.
  • Angular hands you styled, framework-locked components (Material, PrimeNG, ng-bootstrap) wired through ControlValueAccessor — a fourth API and a fourth theming story.
  • Solid and Lit have essentially nothing first-class. The closest cross-framework answer is a vanilla engine like flatpickr (stale since 2022, a11y a known weak spot) or the promising web component Cally — but flatpickr still needs a per-framework wrapper, and Cally is pre-1.0.

So a single design system today binds react-aria on React, @vuepic on Vue, bits-ui on Svelte, a MatDatepicker on Angular, and hand-rolls Solid/Lit — five APIs, five theming models, and accessibility that ranges from best-in-class (react-aria) to a documented pain point (flatpickr). @rozie-ui/date-picker authors the WAI-ARIA grid pattern, the roving keyboard focus, the min/max/disabledDates gating, the two-way ISO value model, and the token theme once, and ships the same idiomatic <DatePicker> to all six — including an Angular ControlValueAccessor generated from the single value model, so [(ngModel)] and reactive forms bind directly. See the API reference for the exact surface.

Where each alternative is the better pick

This page is honest about where the incumbents win — that's what keeps it credible.

  • You ship one framework and want maximum features. If you're React-only and need time-of-day, month/year/multi-calendar, or non-Gregorian systems, @mui/x-date-pickers or react-datepicker out-feature Rozie outright (note MUI's range pickers are a commercial Pro tier — Rozie's range is free and on all six frameworks). Vue-only? @vuepic/vue-datepicker is deeper. Angular-only with a time requirement? PrimeNG.
  • You need a date-time or multi-date picker today. Rozie ships single-date and date-range selection (with presets), but not time-of-day or arbitrary multi-date. Reach for flatpickr, @vuepic, MUI X, or PrimeNG (time) instead.
  • You want the absolute accessibility ceiling on React.react-aria's date hooks are the gold standard (13 calendar systems, touch screen-reader support). Rozie targets a solid, audited WAI-ARIA grid — not Adobe's research budget.
  • You're framework-agnostic and want one web component.Cally is a genuinely good, accessible, sub-10KB framework-independent calendar — if a single custom element across all your apps is acceptable (and you don't need an idiomatic React/Vue/Angular component surface), it's a real alternative to Rozie's "idiomatic per framework" approach.

What @rozie-ui/date-picker deliberately is not

Rozie's scope is narrow on purpose; framing it as deliberate is the honest move.

  • Not a date-time or arbitrary multi-date picker. It selects a single date or a date rangevalue is one ISO YYYY-MM-DD string in single mode, or { start, end } in selectionMode="range", with optional preset shortcuts (presetRanges + a #presets slot). Time-of-day and arbitrary multi-date (3+ discrete dates) remain out of scope — areas where flatpickr, @vuepic, MUI X, and PrimeNG lead. (See the selectionMode + value prop notes.)
  • Not a popover/input combo. It is the calendar surface — compose it inside your own field + popover (e.g. @rozie-ui/popover) when you want a dropdown date field. Staying headless is what lets it drop into any field pattern.
  • Not the deepest localization story. It uses Intl.DateTimeFormat for the month-year heading and weekday labels in any BCP-47 locale, but it does not ship the non-Gregorian calendar systems that react-day-picker, react-aria, bits-ui, and Melt inherit from Adobe's @internationalized/date.
  • Not a date library. It carries a tiny UTC-safe internal grid helper, not a general date toolkit — bring date-fns / dayjs / Temporal for arithmetic elsewhere in your app. The upside: no date-library dependency in the bundle, where the styled incumbents frequently pull date-fns / dayjs / luxon.

What it does ship, on all six

What Rozie does cover, it covers identically everywhere — and that uniformity is the point:

Capability@rozie-ui/date-pickerPer-framework incumbents
Cross-framework parity✓ one source → 6 idiomatic packages✗ a different library per framework
Headless / restyleable✓ token-themed + #header slot~ varies; usually opinionated CSS
min / max / disabled dates✓ built in✓ usually
Roving-grid keyboard a11yWAI-ARIA grid (arrows / Home / End / PageUp / PageDown / Enter / Space)~ ranges from best-in-class to a known weak spot
Localized labelsIntl.DateTimeFormat✓ usually (often via a date lib)
Two-way value + form binding✓ ISO value model + Angular ControlValueAccessor on all six~ per-framework idiom
Imperative handle✓ uniform focus() / goToToday() / clear()~ varies per library
Date-library dependency✓ none (UTC-safe internal helper)~ frequently date-fns / dayjs / luxon
Range selection + presetsselectionMode="range" + presetRanges/#presets, all six✓ many lead here
Time-of-day / arbitrary multi-date✗ out of scope (deliberate)✓ many lead here

See also

Pre-v1.0 — internal monorepo.