Modo Oscuro
El paquete styled incluye soporte completo para el modo oscuro. Se definen valores oscuros para cada variable CSS, por lo que todo el selector se adapta automáticamente.
Cómo Funciona
El modo oscuro se activa a través de dos mecanismos:
- Preferencia del sistema — consulta de medios
prefers-color-scheme: dark - Activación manual — atributo
data-theme="dark"en.rdrp-rooto en un elemento padre
La preferencia del sistema se aplica por defecto. Si estableces data-theme="light" o data-theme="dark" explícitamente, anula la preferencia del sistema.
Automático (Preferencia del Sistema)
No se requiere configuración. El selector respeta la configuración del sistema operativo del usuario:
import { DatePicker } from "react-date-range-picker-styled";import "react-date-range-picker-styled/rdrp-styles.css";
// Sigue automáticamente el modo oscuro/claro del sistema<DatePicker value={value} onChange={setValue} />;El CSS utiliza @media (prefers-color-scheme: dark) para cambiar todas las variables --rdrp-* a sus valores oscuros.
Activación Manual
Establece data-theme en la raíz del selector o en cualquier elemento ancestro:
function App() { const [dark, setDark] = useState(false);
return ( <div data-theme={dark ? "dark" : "light"}> <button onClick={() => setDark(!dark)}>Alternar Modo {dark ? "Claro" : "Oscuro"}</button> <DatePicker value={value} onChange={setValue} /> </div> );}O aplícalo directamente en el selector:
<DatePicker value={value} onChange={setValue} data-theme="dark" />Cuando uses la API de Componentes Compuestos, establécelo en Root:
<DatePicker.Root value={value} onChange={setValue} data-theme="dark"> <DatePicker.Trigger /> <DatePicker.Content>{/* ... */}</DatePicker.Content></DatePicker.Root>Valores de Color del Modo Oscuro
Todas las variables de color cambian automáticamente. Aquí están las diferencias clave:
| Variable | Claro | Oscuro |
|---|---|---|
--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) |
Consulta la lista completa en Variables CSS.
Personalizando los Colores del Modo Oscuro
Sobrescribe las variables oscuras dentro del selector data-theme="dark" o la consulta de medios prefers-color-scheme:
/* Sobrescribir el color primario del modo oscuro */@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; }}
/* Aplicar también cuando se activa manualmente el modo oscuro */.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;}Forzando el Modo Claro
Si tu aplicación no admite el modo oscuro, fuerza el modo claro para evitar que el selector cambie según la preferencia del sistema:
<div data-theme="light"> <DatePicker value={value} onChange={setValue} /></div>Integración con el Tema de la Aplicación
Si tu aplicación ya gestiona un interruptor de modo oscuro (por ejemplo, a través de una clase dark en <html>), puedes mapearlo a data-theme:
// Sincronizar con el estado del modo oscuro de tu aplicaciónfunction ThemeSyncedPicker({ value, onChange }) { const isDark = useAppTheme(); // tu hook de tema
return ( <div data-theme={isDark ? "dark" : "light"}> <DatePicker value={value} onChange={onChange} /> </div> );}Para frameworks que usan <html class="dark"> (como Next.js con next-themes), puedes añadir una regla CSS para conectar ambos:
html.dark .rdrp-root { /* Copia los valores de las variables del modo oscuro aquí, o usa el enfoque de data-theme */}O establece data-theme en el elemento html junto con la clase:
// En tu proveedor de temadocument.documentElement.setAttribute("data-theme", isDark ? "dark" : "light");Ejemplos en Vivo
Interruptor de Modo Oscuro
Un ejemplo interactivo que muestra un DatePicker (en línea) con un botón para cambiar entre los modos claro y oscuro.
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 Oscuro Forzado
Un DateTimePicker renderizado en modo oscuro usando data-theme="dark" sobre un fondo oscuro.
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> );}