Переопределение темы

Пакет для Tailwind v3 использует конкретные утилитарные классы Tailwind (например, sky-500, slate-100) для всей стилизации. Вы можете настроить внешний вид, переопределив объект темы, экспортируемый из пакета.

Тема по умолчанию

Тема определяется как набор экспортируемых объектов, каждый из которых содержит строки с именами классов для части компонента. Вот обзор цветовой палитры по умолчанию:

РольКласс для светлой темыКласс для темной темы
Основнойsky-500sky-500
Основной текстsky-500sky-400
Фонwhiteslate-950
Фон при наведенииslate-100slate-800
Текстslate-900slate-50
Приглушенный текстslate-500slate-400
Границаslate-200slate-800
Фон диапазонаsky-50sky-950/50
Опасностьred-500red-600

Структура объекта темы

Тема разделена на несколько именованных экспортов:

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

Каждый объект содержит ключи, сопоставленные с полными строками классов Tailwind. Например:

// 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 ...",
// ...
}

Переопределение с помощью составных компонентов

Самый простой способ настроить тему — это использовать API составных компонентов. Каждая часть принимает свойство className, которое объединяется со значениями по умолчанию с помощью twMerge, поэтому конфликтующие утилиты разрешаются правильно.

Изменение основного цвета

Замените sky на violet для выбранного дня и связанных состояний:

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>
);
}

Пользовательский фон

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

Создание пользовательского объекта темы

Для ребрендинга в масштабах всего приложения создайте компонент-обертку, который применяет ваши пользовательские классы ко всем частям:

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>
);
}

Используйте его во всем приложении:

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

Свойства классов дня для сетки

Компонент Grid передает свойства className, связанные с днем, каждой ячейке Day. Вот доступные переопределения:

СвойствоШаблон класса по умолчаниюОписание
dayClassNameБазовые стили дняБазовые классы для всех ячеек дня
dayTodayClassNametext-sky-500Индикатор сегодняшнего дня
daySelectedClassNamebg-sky-500 text-whiteВыбранный день
dayDisabledClassNameopacity-50Неактивные дни
dayOutsideClassNametext-slate-500/50Дни за пределами месяца
dayHighlightedClassNameafter:bg-amber-500Точка подсветки
dayInRangeClassNamebg-sky-50Дни в пределах диапазона
dayRangeStartClassNamebg-sky-500 rounded-r-noneНачальный день диапазона
dayRangeEndClassNamebg-sky-500 rounded-l-noneКонечный день диапазона
dayRangeSingleClassNamebg-sky-500Диапазон в один день
dayHoverRangeClassNamebg-sky-50/50Предпросмотр диапазона при наведении
dayHoverTargetClassNamebg-sky-100Конечная точка при наведении
dayFocusedClassNamering-sky-500Кольцо фокуса клавиатуры
dayEmptyClassNameinvisibleЗаполнитель для пустой ячейки

Путь к контенту Tailwind

При переопределении с помощью пользовательских классов цветов убедитесь, что они включены в ваши пути к контенту Tailwind. Классы, определенные в файлах ваших компонентов, сканируются по умолчанию, но если вы определяете их в отдельном файле конфигурации, добавьте и этот путь:

tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}",
// Добавьте конфигурацию вашей темы, если она находится в отдельном файле
"./src/config/date-picker-theme.ts",
],
};
💡 Tip

Если вы хотите использовать семантическое темирование на основе токенов (как в shadcn/ui) вместо конкретных классов цветов, рассмотрите возможность использования пакета для Tailwind v4, который использует семантические токены на основе CSS-переменных.