Modo Escuro
O pacote styled inclui suporte completo ao modo escuro. Valores para o modo escuro são definidos para cada variável CSS, então todo o seletor se adapta automaticamente.
Como Funciona
O modo escuro é ativado por dois mecanismos:
- Preferência do sistema — media query
prefers-color-scheme: dark - Alternância manual — atributo
data-theme="dark"no elemento.rdrp-rootou em um elemento pai
A preferência do sistema é aplicada por padrão. Se você definir data-theme="light" ou data-theme="dark" explicitamente, isso sobrescreve a preferência do sistema.
Automático (Preferência do Sistema)
Nenhuma configuração é necessária. O seletor respeita a configuração do sistema operacional do usuário:
import { DatePicker } from "react-date-range-picker-styled";import "react-date-range-picker-styled/rdrp-styles.css";
// Segue automaticamente o modo escuro/claro do sistema<DatePicker value={value} onChange={setValue} />;O CSS usa @media (prefers-color-scheme: dark) para alternar todas as variáveis --rdrp-* para seus valores do modo escuro.
Alternância Manual
Defina data-theme no elemento raiz do seletor ou em qualquer elemento ancestral:
function App() { const [dark, setDark] = useState(false);
return ( <div data-theme={dark ? "dark" : "light"}> <button onClick={() => setDark(!dark)}>Alternar para {dark ? "Claro" : "Escuro"}</button> <DatePicker value={value} onChange={setValue} /> </div> );}Ou aplique-o diretamente no seletor:
<DatePicker value={value} onChange={setValue} data-theme="dark" />Ao usar a API de Componentes Compostos, defina-o em Root:
<DatePicker.Root value={value} onChange={setValue} data-theme="dark"> <DatePicker.Trigger /> <DatePicker.Content>{/* ... */}</DatePicker.Content></DatePicker.Root>Valores de Cor do Modo Escuro
Todas as variáveis de cor mudam automaticamente. Aqui estão as principais diferenças:
| Variável | Claro | Escuro |
|---|---|---|
--rdrp-color-primary | #3b82f6 | #60a5fa |
--rdrp-color-bg | #ffffff | #1f2937 |
--rdrp-color-bg-hover | #f3f4f6 | #374151 |
--rdrp-color-text | #374151 | #e5e7eb |
--rdrp-color-text-strong | #111827 | #f9fafb |
--rdrp-color-text-muted | #6b7280 | #9ca3af |
--rdrp-color-border | #d1d5db | #4b5563 |
--rdrp-color-range-bg | #dbeafe | #1e3a5f |
--rdrp-color-text-today | #2563eb | #60a5fa |
--rdrp-shadow-popup | rgba(0,0,0,0.1) | rgba(0,0,0,0.3) |
Veja a lista completa em Variáveis CSS.
Personalizando as Cores do Modo Escuro
Sobrescreva as variáveis do modo escuro dentro do seletor data-theme="dark" ou da media query prefers-color-scheme:
/* Sobrescreve a cor primária do modo escuro */@media (prefers-color-scheme: dark) { .rdrp-root { --rdrp-color-primary: #a78bfa; --rdrp-color-primary-hover: #8b5cf6; --rdrp-color-primary-light: #2e1065; --rdrp-color-range-bg: #2e1065; --rdrp-color-text-today: #a78bfa; }}
/* Também aplica ao alternar manualmente para o modo escuro */.rdrp-root[data-theme="dark"] { --rdrp-color-primary: #a78bfa; --rdrp-color-primary-hover: #8b5cf6; --rdrp-color-primary-light: #2e1065; --rdrp-color-range-bg: #2e1065; --rdrp-color-text-today: #a78bfa;}Forçando o Modo Claro
Se o seu aplicativo não suporta o modo escuro, force o modo claro para evitar que o seletor mude com base na preferência do sistema:
<div data-theme="light"> <DatePicker value={value} onChange={setValue} /></div>Integração com o Tema do Aplicativo
Se o seu aplicativo já gerencia uma alternância de modo escuro (por exemplo, através de uma classe dark em <html>), mapeie-o para data-theme:
// Sincroniza com o estado do modo escuro do seu aplicativofunction ThemeSyncedPicker({ value, onChange }) { const isDark = useAppTheme(); // seu hook de tema
return ( <div data-theme={isDark ? "dark" : "light"}> <DatePicker value={value} onChange={onChange} /> </div> );}Para frameworks que usam <html class="dark"> (como Next.js com next-themes), você pode adicionar uma regra CSS para fazer a ponte entre os dois:
html.dark .rdrp-root { /* Copie os valores das variáveis do modo escuro aqui, ou use a abordagem data-theme */}Ou defina data-theme no elemento html junto com a classe:
// No seu provedor de temadocument.documentElement.setAttribute("data-theme", isDark ? "dark" : "light");Exemplos ao Vivo
Alternância de Modo Escuro
Um exemplo interativo mostrando um DatePicker (inline) com um botão de alternância para mudar entre os modos claro e escuro.
import { useState } from "react";import { DatePicker } from "react-date-range-picker-styled";import "react-date-range-picker-styled/rdrp-styles.css";
function CompoundDarkMode() { const [value, setValue] = useState<Date | null>(null); const [isDark, setIsDark] = useState(false);
return ( <div> <button onClick={() => setIsDark((prev) => !prev)} style={{ marginBottom: 12, padding: "6px 14px", border: "1px solid #d1d5db", borderRadius: 6, background: isDark ? "#374151" : "#fff", color: isDark ? "#f9fafb" : "#111827", cursor: "pointer", fontSize: 13, }} > {isDark ? "Switch to Light" : "Switch to Dark"} </button> <div className="rdrp-root" data-theme={isDark ? "dark" : "light"} style={{ padding: 16, borderRadius: 8, background: isDark ? "#0f172a" : "#fff", display: "inline-block", }} > <DatePicker value={value} onChange={setValue} inline /> </div> </div> );}Modo Escuro Forçado
Um DateTimePicker renderizado em modo escuro usando data-theme="dark" em um fundo escuro.
import { useState } from "react";import { DateTimePicker } from "react-date-range-picker-styled";import "react-date-range-picker-styled/rdrp-styles.css";
function CustomDarkMode() { const [value, setValue] = useState<Date | null>(null);
return ( <div data-theme="dark" style={{ padding: 24, borderRadius: 12, background: "#1e293b", }} > <DateTimePicker value={value} onChange={setValue} /> </div> );}