Nadpisywanie motywu

Pakiet Tailwind v3 używa konkretnych klas użytkowych Tailwind (np. sky-500, slate-100) do całego stylowania. Możesz dostosować wygląd, nadpisując obiekt motywu eksportowany z pakietu.

Domyślny motyw

Motyw jest zdefiniowany jako zestaw eksportowanych obiektów, z których każdy zawiera ciągi nazw klas dla części komponentu. Oto przegląd domyślnej palety kolorów:

RolaKlasa jasnaKlasa ciemna
Podstawowysky-500sky-500
Tekst podstawowysky-500sky-400
Tłowhiteslate-950
Powierzchnia (hover)slate-100slate-800
Tekstslate-900slate-50
Tekst wyciszonyslate-500slate-400
Obramowanieslate-200slate-800
Tło zakresusky-50sky-950/50
Niebezpieczeństwored-500red-600

Struktura obiektu motywu

Motyw jest podzielony na wiele nazwanych eksportów:

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

Każdy obiekt zawiera klucze mapujące na pełne ciągi klas Tailwind. Na przykład:

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

Nadpisywanie za pomocą komponentów złożonych

Najprostszym sposobem dostosowania motywu jest użycie API komponentów złożonych. Każda część akceptuje prop className, który jest łączony z domyślnymi wartościami za pomocą twMerge, dzięki czemu konflikty klas użytkowych są rozwiązywane poprawnie.

Zmiana koloru podstawowego

Zastąp sky kolorem violet dla wybranego dnia i powiązanych stanów:

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

Niestandardowe tło

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

Tworzenie niestandardowego obiektu motywu

Aby przeprowadzić rebranding w całej aplikacji, utwórz komponent-wrapper, który zastosuje Twoje niestandardowe klasy do wszystkich części:

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

Używaj go w całej aplikacji:

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

Właściwości klas dnia siatki (Grid)

Komponent Grid przekazuje właściwości className związane z dniami do każdej komórki Day. Oto dostępne nadpisania:

WłaściwośćDomyślny wzorzec klasyOpis
dayClassNamePodstawowe style dniaPodstawowe klasy dla wszystkich komórek dnia
dayTodayClassNametext-sky-500Wskaźnik dzisiejszego dnia
daySelectedClassNamebg-sky-500 text-whiteWybrany dzień
dayDisabledClassNameopacity-50Dni wyłączone
dayOutsideClassNametext-slate-500/50Dni poza miesiącem
dayHighlightedClassNameafter:bg-amber-500Kropka wyróżnienia
dayInRangeClassNamebg-sky-50Dni w zakresie
dayRangeStartClassNamebg-sky-500 rounded-r-noneDzień rozpoczęcia zakresu
dayRangeEndClassNamebg-sky-500 rounded-l-noneDzień zakończenia zakresu
dayRangeSingleClassNamebg-sky-500Zakres jednodniowy
dayHoverRangeClassNamebg-sky-50/50Podgląd zakresu przy najechaniu
dayHoverTargetClassNamebg-sky-100Cel najechania
dayFocusedClassNamering-sky-500Pierścień fokusu klawiatury
dayEmptyClassNameinvisiblePlaceholder pustej komórki

Ścieżka content w Tailwind

Podczas nadpisywania za pomocą niestandardowych klas kolorów, upewnij się, że są one uwzględnione w ścieżkach content Twojego pliku konfiguracyjnego Tailwind. Klasy zdefiniowane w plikach komponentów są domyślnie skanowane, ale jeśli definiujesz je w osobnym pliku konfiguracyjnym, dodaj również tę ścieżkę:

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

Jeśli chcesz używać motywów opartych na semantycznych tokenach (takich jak w shadcn/ui) zamiast konkretnych klas kolorów, rozważ użycie pakietu Tailwind v4, który wykorzystuje semantyczne tokeny oparte na zmiennych CSS.