JSFiddle - React, Tailwind, and code Playground

by davidxmartins

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Theme Switcher</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="theme-switcher">
        <input type="checkbox" id="theme-toggle">
        <label for="theme-toggle" class="slider">
            <span class="icon sun">☀️</span>
            <span class="icon moon">🌙</span>
            <span class="circle"></span>
        </label>
    </div>
    <script src="script.js"></script>
</body>
</html>

CSS

body {
    transition: background-color 0.3s ease;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
}

/* Light mode default */
body {
    background-color: #f0f0f0;
    color: #333;
}

/* Dark mode */
body.dark {
    background-color: #333;
    color: #f0f0f0;
}

.theme-switcher {
    position: relative;
}

#theme-toggle {
    display: none;
}

.slider {
    display: flex;
    align-items: center;
    width: 80px;
    height: 40px;
    background-color: #ccc;
    border-radius: 20px;
    position: relative;
    cursor: pointer;
    transition: background-color 0.3s ease;
}

.icon {
    font-size: 20px;
    width: 40px;
    height: 40px;
    display: flex;
    justify-content: center;
    align-items: center;
    transition: transform 0.5s ease;
}

.sun {
    color: #ffd700;
}

.moon {
    color: red;
}

.icon:hover {
    transform: rotate(360deg);
}

.circle {
    position: absolute;
    width: 36px;
    height: 36px;
    background-color: #fff;
    border-radius: 50%;
    top: 2px;
    left: 2px;
    transition: transform 0.3s ease;
}

#theme-toggle:checked + .slider {
    background-color: #555;
}

#theme-toggle:checked + .slider .circle {
    transform: translateX(40px);
}

JavaScript

document.getElementById('theme-toggle').addEventListener('change', function() {
    document.body.classList.toggle('dark', this.checked);
});