Remplacement du Thème

Le package Tailwind v3 utilise des classes utilitaires concrètes de Tailwind (par ex. sky-500, slate-100) pour tout le style. Vous pouvez personnaliser l’apparence en remplaçant l’objet de thème exporté depuis le package.

Thème par Défaut

Le thème est défini comme un ensemble d’objets exportés, chacun contenant des chaînes de noms de classe pour une partie de composant. Voici un aperçu de la palette de couleurs par défaut :

RôleClasse ClaireClasse Sombre
Primairesky-500sky-500
Texte primairesky-500sky-400
Arrière-planwhiteslate-950
Surface au survolslate-100slate-800
Texteslate-900slate-50
Texte estompéslate-500slate-400
Bordureslate-200slate-800
Fond de plagesky-50sky-950/50
Dangerred-500red-600

Structure de l’Objet de Thème

Le thème est divisé en plusieurs exportations nommées :

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

Chaque objet contient des clés correspondant à des chaînes de classes Tailwind complètes. Par exemple :

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

Remplacement avec les Composants Composés

La manière la plus simple de personnaliser le thème est via l’API des Composants Composés. Chaque partie accepte une prop className qui est fusionnée avec les valeurs par défaut en utilisant twMerge, donc les utilitaires conflictuels sont résolus correctement.

Changer la Couleur Principale

Remplacez sky par violet pour le jour sélectionné et les états associés :

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

Arrière-plan Personnalisé

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

Créer un Objet de Thème Personnalisé

Pour une refonte à l’échelle de l’application, créez un composant wrapper qui applique vos classes personnalisées à toutes les parties :

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

Utilisez-le dans toute votre application :

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

Props de Classe de Jour de la Grille

Le composant Grid transmet les props className liées au jour à chaque cellule Day. Voici les remplacements disponibles :

PropModèle de Classe par DéfautDescription
dayClassNameStyles de base du jourClasses de base pour toutes les cellules de jour
dayTodayClassNametext-sky-500Indicateur d’aujourd’hui
daySelectedClassNamebg-sky-500 text-whiteJour sélectionné
dayDisabledClassNameopacity-50Jours désactivés
dayOutsideClassNametext-slate-500/50Jours hors du mois
dayHighlightedClassNameafter:bg-amber-500Point de surbrillance
dayInRangeClassNamebg-sky-50Jours dans la plage
dayRangeStartClassNamebg-sky-500 rounded-r-noneJour de début de plage
dayRangeEndClassNamebg-sky-500 rounded-l-noneJour de fin de plage
dayRangeSingleClassNamebg-sky-500Plage d’un seul jour
dayHoverRangeClassNamebg-sky-50/50Prévisualisation de plage au survol
dayHoverTargetClassNamebg-sky-100Point final du survol
dayFocusedClassNamering-sky-500Anneau de focus clavier
dayEmptyClassNameinvisibleEspace réservé pour cellule vide

Chemin de Contenu Tailwind

Lorsque vous remplacez avec des classes de couleur personnalisées, assurez-vous qu’elles sont incluses dans vos chemins de contenu Tailwind. Les classes définies dans vos fichiers de composants sont analysées par défaut, mais si vous les définissez dans un fichier de configuration séparé, ajoutez également ce chemin :

tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}",
// Ajoutez votre configuration de thème si elle se trouve dans un fichier séparé
"./src/config/date-picker-theme.ts",
],
};
💡 Tip

Si vous souhaitez un thème basé sur des jetons sémantiques (comme shadcn/ui) au lieu de classes de couleur concrètes, envisagez d’utiliser le package Tailwind v4 qui utilise des jetons sémantiques basés sur des variables CSS.