Theme Override

The Tailwind v3 package uses concrete Tailwind utility classes (e.g. sky-500, slate-100) for all styling. You can customize the appearance by overriding the theme object exported from the package.

Default Theme

The theme is defined as a set of exported objects, each containing class name strings for a component part. Here’s an overview of the default color palette:

RoleLight ClassDark Class
Primarysky-500sky-500
Primary textsky-500sky-400
Backgroundwhiteslate-950
Surface hoverslate-100slate-800
Textslate-900slate-50
Muted textslate-500slate-400
Borderslate-200slate-800
Range bgsky-50sky-950/50
Dangerred-500red-600

Theme Object Structure

The theme is split into multiple named exports:

import {
rootClassNames,
triggerClassNames,
headerClassNames,
gridClassNames,
dayClassNames,
footerClassNames,
contentClassNames,
rangeClassNames,
dateTimeClassNames,
timePanelClassNames,
} from "react-date-range-picker-tailwind3";

Each object contains keys mapping to full Tailwind class strings. For example:

// dayClassNames
{
day: "flex items-center justify-center w-9 h-9 mx-[1px] rounded-md transition-colors cursor-pointer hover:bg-slate-100 dark:hover:bg-slate-800 ...",
today: "font-bold text-sky-500 dark:text-sky-400",
selected: "bg-sky-500 dark:bg-sky-500 text-white font-semibold ...",
inRange: "bg-sky-50 dark:bg-sky-950/50 text-slate-900 dark:text-slate-50 rounded-none mx-0 ...",
rangeStart: "bg-sky-500 dark:bg-sky-500 text-white rounded-r-none mx-0 ...",
rangeEnd: "bg-sky-500 dark:bg-sky-500 text-white rounded-l-none mx-0 ...",
// ...
}

Overriding with Compound Components

The most straightforward way to customize the theme is through the Compound Component API. Each part accepts a className prop that is merged with the defaults using twMerge, so conflicting utilities are resolved correctly.

Change Primary Color

Replace sky with violet for the selected day and related states:

import { DatePicker } from "react-date-range-picker-tailwind3";
function VioletPicker() {
const [value, setValue] = useState<Date | null>(null);
return (
<DatePicker.Root value={value} onChange={setValue}>
<DatePicker.Trigger className="hover:border-violet-500/50 focus-visible:ring-violet-500 focus-visible:border-violet-500" />
<DatePicker.Content>
<DatePicker.Header>
<DatePicker.PrevButton className="focus-visible:ring-violet-500" />
<DatePicker.Title />
<DatePicker.NextButton className="focus-visible:ring-violet-500" />
</DatePicker.Header>
<DatePicker.Grid
dayClassName="hover:bg-violet-50 dark:hover:bg-violet-950/50 focus-visible:ring-violet-500"
dayTodayClassName="text-violet-500 dark:text-violet-400"
daySelectedClassName="bg-violet-500 dark:bg-violet-500 hover:bg-violet-500/90"
dayInRangeClassName="bg-violet-50 dark:bg-violet-950/50 hover:bg-violet-100"
dayRangeStartClassName="bg-violet-500 dark:bg-violet-500 hover:bg-violet-500/90"
dayRangeEndClassName="bg-violet-500 dark:bg-violet-500 hover:bg-violet-500/90"
dayFocusedClassName="ring-violet-500"
/>
<DatePicker.Footer>
<DatePicker.ClearButton />
<DatePicker.CancelButton />
<DatePicker.ConfirmButton className="bg-violet-500 hover:bg-violet-500/90 focus-visible:ring-violet-500" />
</DatePicker.Footer>
</DatePicker.Content>
</DatePicker.Root>
);
}

Custom Background

<DatePicker.Root value={value} onChange={setValue}>
<DatePicker.Trigger className="bg-slate-50 dark:bg-slate-900" />
<DatePicker.Content className="bg-slate-50 dark:bg-slate-900">{/* ... */}</DatePicker.Content>
</DatePicker.Root>

Building a Custom Theme Object

For app-wide rebranding, create a wrapper component that applies your custom classes to all parts:

components/MyDatePicker.tsx
import { DatePicker } from "react-date-range-picker-tailwind3";
const myTheme = {
trigger: "hover:border-emerald-500/50 focus-visible:ring-emerald-500",
dayToday: "text-emerald-500 dark:text-emerald-400",
daySelected: "bg-emerald-500 dark:bg-emerald-500 hover:bg-emerald-500/90",
dayInRange: "bg-emerald-50 dark:bg-emerald-950/50 hover:bg-emerald-100",
dayRangeStart: "bg-emerald-500 dark:bg-emerald-500 hover:bg-emerald-500/90",
dayRangeEnd: "bg-emerald-500 dark:bg-emerald-500 hover:bg-emerald-500/90",
confirmButton: "bg-emerald-500 hover:bg-emerald-500/90 focus-visible:ring-emerald-500",
focusRing: "focus-visible:ring-emerald-500",
};
export function MyDatePicker(props) {
return (
<DatePicker.Root {...props}>
<DatePicker.Trigger className={myTheme.trigger} />
<DatePicker.Content>
<DatePicker.Header>
<DatePicker.PrevButton className={myTheme.focusRing} />
<DatePicker.Title />
<DatePicker.NextButton className={myTheme.focusRing} />
</DatePicker.Header>
<DatePicker.Grid
dayTodayClassName={myTheme.dayToday}
daySelectedClassName={myTheme.daySelected}
dayInRangeClassName={myTheme.dayInRange}
dayRangeStartClassName={myTheme.dayRangeStart}
dayRangeEndClassName={myTheme.dayRangeEnd}
dayFocusedClassName={myTheme.focusRing}
/>
<DatePicker.Footer>
<DatePicker.ClearButton />
<DatePicker.CancelButton />
<DatePicker.ConfirmButton className={myTheme.confirmButton} />
</DatePicker.Footer>
</DatePicker.Content>
</DatePicker.Root>
);
}

Use it throughout your app:

<MyDatePicker value={date} onChange={setDate} />

Grid Day Class Props

The Grid component passes day-related className props down to each Day cell. These are the available overrides:

PropDefault Class PatternDescription
dayClassNameBase day stylesBase classes for all day cells
dayTodayClassNametext-sky-500Today indicator
daySelectedClassNamebg-sky-500 text-whiteSelected day
dayDisabledClassNameopacity-50Disabled days
dayOutsideClassNametext-slate-500/50Outside month days
dayHighlightedClassNameafter:bg-amber-500Highlight dot
dayInRangeClassNamebg-sky-50Days within range
dayRangeStartClassNamebg-sky-500 rounded-r-noneRange start day
dayRangeEndClassNamebg-sky-500 rounded-l-noneRange end day
dayRangeSingleClassNamebg-sky-500Single-day range
dayHoverRangeClassNamebg-sky-50/50Hover preview range
dayHoverTargetClassNamebg-sky-100Hover endpoint
dayFocusedClassNamering-sky-500Keyboard focus ring
dayEmptyClassNameinvisibleEmpty cell placeholder

Tailwind Content Path

When overriding with custom color classes, ensure they’re included in your Tailwind content paths. Classes defined in your component files are scanned by default, but if you define them in a separate config file, add that path too:

tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}",
// Add your theme config if it's in a separate file
"./src/config/date-picker-theme.ts",
],
};
💡 Tip

If you want semantic token-based theming (like shadcn/ui) instead of concrete color classes, consider using the Tailwind v4 package which uses CSS variable-based semantic tokens.