Sobrescrita de Tema

O pacote Tailwind v3 usa classes de utilitário concretas do Tailwind (ex. sky-500, slate-100) para toda a estilização. Você pode personalizar a aparência sobrescrevendo o objeto de tema exportado pelo pacote.

Tema Padrão

O tema é definido como um conjunto de objetos exportados, cada um contendo strings de nomes de classe para uma parte do componente. Aqui está uma visão geral da paleta de cores padrão:

PapelClasse (Claro)Classe (Escuro)
Primáriosky-500sky-500
Texto primáriosky-500sky-400
Fundowhiteslate-950
Superfície (hover)slate-100slate-800
Textoslate-900slate-50
Texto secundárioslate-500slate-400
Bordaslate-200slate-800
Fundo do intervalosky-50sky-950/50
Perigored-500red-600

Estrutura do Objeto de Tema

O tema é dividido em múltiplas exportações nomeadas:

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

Cada objeto contém chaves que mapeiam para strings completas de classes do Tailwind. Por exemplo:

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

Sobrescrevendo com Componentes Compostos

A maneira mais direta de personalizar o tema é através da API de Componentes Compostos. Cada parte aceita uma prop className que é mesclada com os padrões usando twMerge, de modo que os utilitários conflitantes são resolvidos corretamente.

Alterar Cor Primária

Substitua sky por violet para o dia selecionado e estados relacionados:

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

Fundo Personalizado

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

Construindo um Objeto de Tema Personalizado

Para uma rebrandig em todo o aplicativo, crie um componente wrapper que aplica suas classes personalizadas a todas as partes:

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-o em todo o seu aplicativo:

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

Props de Classe para o Dia no Grid

O componente Grid passa as props className relacionadas ao dia para cada célula Day. Estas são as sobrescritas disponíveis:

PropPadrão de Classe PadrãoDescrição
dayClassNameEstilos base do diaClasses base para todas as células de dia
dayTodayClassNametext-sky-500Indicador de hoje
daySelectedClassNamebg-sky-500 text-whiteDia selecionado
dayDisabledClassNameopacity-50Dias desabilitados
dayOutsideClassNametext-slate-500/50Dias fora do mês
dayHighlightedClassNameafter:bg-amber-500Ponto de destaque
dayInRangeClassNamebg-sky-50Dias dentro do intervalo
dayRangeStartClassNamebg-sky-500 rounded-r-noneDia de início do intervalo
dayRangeEndClassNamebg-sky-500 rounded-l-noneDia de fim do intervalo
dayRangeSingleClassNamebg-sky-500Intervalo de um único dia
dayHoverRangeClassNamebg-sky-50/50Pré-visualização do intervalo (hover)
dayHoverTargetClassNamebg-sky-100Ponto final do hover
dayFocusedClassNamering-sky-500Anel de foco do teclado
dayEmptyClassNameinvisiblePlaceholder de célula vazia

Caminho de Conteúdo do Tailwind

Ao sobrescrever com classes de cores personalizadas, garanta que elas estejam incluídas nos seus caminhos de conteúdo do Tailwind. Classes definidas nos arquivos do seu componente são escaneadas por padrão, mas se você as definir em um arquivo de configuração separado, adicione esse caminho também:

tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}",
// Adicione sua configuração de tema se estiver em um arquivo separado
"./src/config/date-picker-theme.ts",
],
};
💡 Tip

Se você deseja um tema baseado em tokens semânticos (como shadcn/ui) em vez de classes de cores concretas, considere usar o pacote Tailwind v4 que utiliza tokens semânticos baseados em variáveis CSS.