React date picker components that allow selecting multiple non-contiguous date ranges with click-and-drag support. Built on top of MUI's date picker components with full theme integration and mobile support.
A free multi-range date picker built on @mui/x-date-pickers.
Features:
- β Multi-range selection with drag support
- β Individual date selection support
- β Simple calendar-only interface
- β No commercial license required
- β Perfect for basic multi-range needs
Links:
- π¦ NPM Package
- π Documentation
MuiMultiDateRangePickerPro (MUI X Pro)
An enhanced version built on @mui/x-date-pickers-pro.
Features:
- β All features from the free version
- β Multi-range and individual date selection
- β Text input field for manual date entry
- β Visual chip-based range management
- β Delete ranges with chip close buttons
β οΈ Requires MUI X Pro license for production
Links:
- π¦ NPM Package
- π Documentation
# Free version
npm install @spacedevin/react-mui-multi-range-picker
# Pro version (requires MUI X Pro license)
npm install @spacedevin/react-mui-pro-multi-range-pickerBasic Example - Date Ranges:
import React, { useState } from 'react';
import { MultiRangeDatePicker } from '@spacedevin/react-mui-multi-range-picker';
import type { DateRange } from '@spacedevin/react-mui-multi-range-picker';
function App() {
const [ranges, setRanges] = useState<DateRange[]>([]);
return (
<MultiRangeDatePicker
onChange={setRanges}
mergeRanges={false}
/>
);
}Individual Dates:
import React, { useState } from 'react';
import { MultiRangeDatePicker } from '@spacedevin/react-mui-multi-range-picker';
function App() {
const [dates, setDates] = useState<Date[]>([]);
return (
<MultiRangeDatePicker
onIndividualDatesChange={setDates}
/>
);
}Both Ranges and Individual Dates:
import React, { useState } from 'react';
import { MultiRangeDatePicker } from '@spacedevin/react-mui-multi-range-picker';
import type { DateRange } from '@spacedevin/react-mui-multi-range-picker';
function App() {
const [ranges, setRanges] = useState<DateRange[]>([]);
const [dates, setDates] = useState<Date[]>([]);
return (
<MultiRangeDatePicker
onChange={setRanges}
onIndividualDatesChange={setDates}
mergeRanges={false}
/>
);
}Using your favorite package manager (ideally bun), install the packages and run dev.
# Free version demo
cd packages/MuiMultiDateRangePicker
bun install
bun run dev
# Pro version demo
cd packages/MuiMultiDateRangePickerPro
bun install
bun run dev
# Root-level demos (pull from NPM)
cd examples/esm # Vite + ESM
bun install && bun run dev
cd examples/cjs # Webpack + CJS
bun install && bun run devLive Demos: View on GitHub Pages
This monorepo contains two npm packages with identical APIs:
react-mui-multi-range-picker/
βββ packages/
β βββ MuiMultiDateRangePicker/ # Free version
β β βββ lib/ # Source code
β β βββ dist/ # Built ESM + CJS + types
β β βββ examples/demo/ # Local demo app
β βββ MuiMultiDateRangePickerPro/ # Pro version
β βββ lib/ # Source code
β βββ dist/ # Built ESM + CJS + types
β βββ examples/demo/ # Local demo app
βββ examples/ # Root-level demos
βββ esm/ # Vite demo (pulls from NPM)
βββ cjs/ # Webpack demo (pulls from NPM)
Package Features:
- β Tree-shakeable exports (ESM + CJS)
- β Full TypeScript support with declarations
- β Peer dependencies (no duplicate MUI/React)
- β Zero side effects for optimal bundling
- β Separate demo apps (not included in published package)
Select multiple separate date ranges or individual dates on a single calendar - perfect for vacation booking, availability calendars, or any scenario requiring non-contiguous date selection. Supports both range-based and individual date selection modes.
Intuitive drag-to-select interaction works seamlessly on both desktop (mouse) and mobile (touch) devices.
- Date Ranges: Select start and end dates for periods
- Individual Dates: Select specific dates without ranges
- Dual Mode: Track both ranges and individual dates simultaneously
- Add ranges: Click/drag or use text input (Pro)
- Remove ranges: Drag over existing ranges or use chip close buttons (Pro)
- Auto-merge: Optional automatic merging of adjacent/overlapping ranges
Built as extensions of MUI's date picker components, maintaining full compatibility with:
- Theme system (light/dark mode)
- Localization
- Accessibility features
- Responsive design
- Booking Systems: Multi-night hotel or rental reservations
- Availability Calendars: Mark multiple unavailable date ranges
- Event Planning: Select multiple event or blackout dates
- Project Management: Highlight multiple milestone or sprint periods
- Time Off Requests: Select multiple vacation periods
- React 19+ with TypeScript
- Material-UI 7+ (
@mui/material) - MUI X Date Pickers 8+ (
@mui/x-date-pickers) - MUI X Date Pickers Pro 8+ (
@mui/x-date-pickers-pro) - Pro version only - date-fns 4+ for date manipulation
- Emotion for styling
| Feature | Free | Pro |
|---|---|---|
| Multi-range selection | β | β |
| Individual date selection | β | β |
| Drag to select | β | β |
| Calendar view | β | β |
| Theme support | β | β |
| Touch support | β | β |
| Auto-merge ranges | β | β |
| Text input field | β | β |
| Range chips UI | β | β |
| Click to delete chips | β | β |
| License required | β Free |
Contributions are welcome! Please see our Contributing Guide for details on:
- Development setup
- Commit conventions
- Release process
- Testing guidelines
Note: Pro version requires MUI X Pro license for production use

