Como implementar modo oscuro con Claude Code
Aprende a implementar el modo oscuro usando Claude Code. Incluye ejemplos de codigo practicos y guia paso a paso.
Optimizando la implementacion de modo oscuro con Claude Code
El modo oscuro ya es una funcion estandar en las aplicaciones web, pero su implementacion requiere considerar muchos aspectos como el diseno CSS, la gestion de estado y la persistencia. Con Claude Code, puedes implementarlo en poco tiempo con un diseno consistente.
Diseno de tema con variables CSS
Primero, define los tokens del tema con variables CSS.
> Disena temas claro/oscuro basados en variables CSS.
> Usa nombres de colores semanticos e integralo con Tailwind.
/* globals.css */
:root {
--color-bg-primary: #ffffff;
--color-bg-secondary: #f8fafc;
--color-bg-tertiary: #f1f5f9;
--color-text-primary: #0f172a;
--color-text-secondary: #475569;
--color-text-tertiary: #94a3b8;
--color-border: #e2e8f0;
--color-border-hover: #cbd5e1;
--color-accent: #3b82f6;
--color-accent-hover: #2563eb;
--color-surface: #ffffff;
--color-surface-hover: #f8fafc;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
}
[data-theme="dark"] {
--color-bg-primary: #0f172a;
--color-bg-secondary: #1e293b;
--color-bg-tertiary: #334155;
--color-text-primary: #f1f5f9;
--color-text-secondary: #cbd5e1;
--color-text-tertiary: #64748b;
--color-border: #334155;
--color-border-hover: #475569;
--color-accent: #60a5fa;
--color-accent-hover: #93bbfd;
--color-surface: #1e293b;
--color-surface-hover: #334155;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
}
Implementacion del cambio de tema
Creamos un hook que soporte tanto la sincronizacion con la configuracion del sistema como el cambio manual.
import { useState, useEffect, useCallback } from "react";
type Theme = "light" | "dark" | "system";
export function useTheme() {
const [theme, setThemeState] = useState<Theme>(() => {
if (typeof window === "undefined") return "system";
return (localStorage.getItem("theme") as Theme) || "system";
});
const [resolvedTheme, setResolvedTheme] = useState<"light" | "dark">("light");
const applyTheme = useCallback((newTheme: Theme) => {
const root = document.documentElement;
let resolved: "light" | "dark";
if (newTheme === "system") {
resolved = window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark"
: "light";
} else {
resolved = newTheme;
}
root.setAttribute("data-theme", resolved);
setResolvedTheme(resolved);
}, []);
const setTheme = useCallback(
(newTheme: Theme) => {
setThemeState(newTheme);
localStorage.setItem("theme", newTheme);
applyTheme(newTheme);
},
[applyTheme]
);
useEffect(() => {
applyTheme(theme);
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
const handleChange = () => {
if (theme === "system") applyTheme("system");
};
mediaQuery.addEventListener("change", handleChange);
return () => mediaQuery.removeEventListener("change", handleChange);
}, [theme, applyTheme]);
return { theme, setTheme, resolvedTheme };
}
Boton de cambio de tema
import { useTheme } from "@/hooks/useTheme";
export function ThemeToggle() {
const { theme, setTheme, resolvedTheme } = useTheme();
const options: { value: Theme; label: string; icon: string }[] = [
{ value: "light", label: "Claro", icon: "sun" },
{ value: "dark", label: "Oscuro", icon: "moon" },
{ value: "system", label: "Sistema", icon: "monitor" },
];
return (
<div className="flex items-center gap-1 p-1 rounded-lg bg-[var(--color-bg-tertiary)]">
{options.map((option) => (
<button
key={option.value}
onClick={() => setTheme(option.value)}
className={`px-3 py-1.5 rounded-md text-sm transition-colors ${
theme === option.value
? "bg-[var(--color-surface)] text-[var(--color-text-primary)] shadow-sm"
: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]"
}`}
aria-label={option.label}
>
{option.label}
</button>
))}
</div>
);
}
Prevencion de FOUC (parpadeo)
Script para prevenir el parpadeo momentaneo del tema al cargar la pagina.
<!-- Colocar dentro del head -->
<script>
(function () {
const theme = localStorage.getItem("theme") || "system";
let resolved = theme;
if (theme === "system") {
resolved = window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark"
: "light";
}
document.documentElement.setAttribute("data-theme", resolved);
})();
</script>
Integracion con Tailwind CSS
// tailwind.config.js
module.exports = {
darkMode: ["selector", '[data-theme="dark"]'],
theme: {
extend: {
colors: {
bg: {
primary: "var(--color-bg-primary)",
secondary: "var(--color-bg-secondary)",
tertiary: "var(--color-bg-tertiary)",
},
text: {
primary: "var(--color-text-primary)",
secondary: "var(--color-text-secondary)",
},
surface: {
DEFAULT: "var(--color-surface)",
hover: "var(--color-surface-hover)",
},
},
},
},
};
Para la integracion con sistemas de diseno, consulta construccion de sistemas de diseno, y para soporte responsivo, consulta diseno responsivo.
Resumen
Con Claude Code, puedes completar en poco tiempo y de forma consistente la implementacion del modo oscuro, incluyendo diseno de variables CSS, logica de cambio de tema, prevencion de FOUC e integracion con Tailwind. Solo necesitas pedir “agrega modo oscuro” para que se integre adecuadamente en un proyecto existente.
Para mas informacion, consulta la documentacion oficial de Claude Code.
PDF gratuito: Hoja de trucos de Claude Code en 5 minutos
Solo deja tu correo y te enviaremos al instante la hoja de trucos en una página A4.
Cuidamos tus datos personales y nunca enviamos spam.
Sobre el autor
Masa
Ingeniero apasionado por Claude Code. Dirige claudecode-lab.com, un medio tecnológico en 10 idiomas con más de 2.000 páginas.
Artículos relacionados
7 plantillas de CLAUDE.md para Claude Code que puedes copiar en proyectos reales
Siete plantillas prácticas de CLAUDE.md para apps individuales, sitios de contenido, APIs, equipos y repos legacy, con errores que debes evitar.
Guia de Approval y Sandbox para Claude Code | Configuracion segura para el trabajo diario
Como dividir acciones de Claude Code en allow, ask, deny y sandbox con settings practicos, hooks y casos reales.
Guía completa para empezar con Claude Code 2026 | De cero a usarlo en tu trabajo real en 7 pasos
La guía definitiva para quienes usan Claude Code por primera vez. Desde la instalación hasta integrarlo en tu flujo de desarrollo real — con todos los tropiezos que Masa tuvo al comenzar.