WEBLEB
Home
Editor
Accedi
Pro
Italiano
English
Français
Español
Português
Deutsch
Italiano
हिंदी
Cronometro
1430
Andev.web
Apri nell'Editor
Pubblica il Tuo Codice
Hai bisogno di un sito web?
13 June 2025
Interfaccia utente dell'app Sveglia e Cronometro
HTML
Copy
Andev Web
00:00
PLAY
pomodoro
short break
long break
Settings
x
Time (minutes)
pomodoro
short break
long break
Apply
CSS
Copy
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap"); * { margin: 0; padding: 0; box-sizing: border-box; font-family: "Poppins", sans-serif; } :root { --dark-blue: hsl(236, 44%, 17%); --dark-blue-light: hsl(236, 44%, 25%); --very-dark-blue: hsl(235, 35%, 13%); --blue-gray: hsl(236, 15%, 60%); --light-blue-gray: hsl(236, 46%, 93%); --light-white-gray: hsl(212, 22%, 73%); --pink: hsl(300, 82%, 78%); --theme-color: hsl(0, 84%, 68%); } .container.red { --theme-color: hsl(340, 100%, 58%); } .container.green { --theme-color: hsl(55, 100%, 50%); } .container.blue { --theme-color: hsl(135, 98%, 50%); } body { display: flex; align-items: center; justify-content: center; flex-direction: column; min-height: 100vh; background-color: var(--light-white-gray); } .container { position: relative; width: 450px; height: 550px; display: flex; justify-content: center; align-items: center; /* flex-direction: column; gap: 2rem; */ background: #c9d5e0; border-radius: 50px; border-top-left-radius: 250px; border-top-right-radius: 250px; box-shadow: 45px 45px 45px -15px rgba(0, 0, 0, 0.15), inset 15px 15px 10px rgba(255, 255, 255, 0.75), -15px -15px 35px rgba(255, 255, 255, 0.55), inset -2px -2px 15px rgba(0, 0, 0, 0.2); } /* .logo{ } */ /* <!---------------- TIME CONTAINER ---------------------> */ .timer-container { position: absolute; top: 30px; width: 390px; height: 390px; background-color: var(--very-dark-blue); border-radius: 50%; display: flex; justify-content: center; align-items: center; box-shadow: 7px 7px 22px #152b4a66, inset 7px 7px 7px rgba(255, 255, 255, 0.55), -9px -9px 15px rgba(255, 255, 255, 1); } .timer-content { width: 90%; height: 90%; border-radius: 50%; display: flex; justify-content: center; align-items: center; flex-direction: column; /* border: 8px solid var(--theme-color); */ transition: 0.4s; } .timer-content h2 { font-size: 4rem; font-weight: 600; padding: 0.5rem; color: var(--theme-color); } #timer { font-size: 4rem; border-radius: 40px; font-weight: 600; border-radius: 40px; background-color: var(--very-dark-blue); box-shadow: 7px 7px 22px #152b4a66, inset 7px 7px 7px rgba(7, 6, 6, 0.55), -9px -9px 15px rgb(17, 1, 1); } .timer-content button { border: none; background-color: transparent; color: var(--blue-gray); padding: 1rem; letter-spacing: 10px; cursor: pointer; } #config { background-color: transparent; border: none; cursor: pointer; position: absolute; bottom: 35px; } #config img { width: 24px; } /* <!---------------- OPTION-BUTTON-CONTAINER ---------------------> */ .option-btn-container { padding: 0.5rem; background-color: var(--very-dark-blue); border-radius: 32px; display: flex; flex-wrap: nowrap; position: absolute; bottom: 50px; } .option-btn { padding: 0.75rem 1.25rem; border: none; border-radius: 24px; font-weight: bold; background-color: transparent; color: var(--blue-gray); cursor: pointer; transition: 0.4s; } .option-btn.active-option-btn { background-color: var(--theme-color); color: var(--dark-blue); } /* SETTING MODAL */ .hidden { display: none; } .settings-modal { max-width: 450px; padding: 1.5rem 1.5rem 3rem 1.5rem; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: var(--light-blue-gray); border-radius: 24px; color: var(--dark-blue); z-index: 10; } .settings-modal .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; } .settings-modal .header #closeBtn { padding: 0.25rem; background-color: transparent; border: none; font-size: 1.25rem; font-weight: bold; color: var(--blue-gray); cursor: pointer; } .settings-modal h4 { margin-bottom: 0.75rem; } .settings-modal form { display: flex; align-items: center; justify-content: space-between; } .settings-modal form .input-container { width: 33.3%; } .settings-modal form label { margin-top: 0.5rem; font-size: 0.75rem; color: var(--blue-gray); } .settings-modal form input { max-width: 95%; padding: 0.5rem; height: 42px; border: none; border-radius: 8px; background-color: var(--light-blue-gray); font-weight: bold; color: var(--dark-blue); } .settings-modal form input:focus { outline: 1px solid var(--blue-gray); } .settings-modal #apply { position: absolute; bottom: -24px; left: 50%; transform: translateX(-50%); background-color: var(--dark-blue); color: white; font-weight: bold; padding: 0.75rem 1.5rem; border-radius: 24px; border: none; cursor: pointer; } .overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.6); backdrop-filter: blur(3px); z-index: 5; }
JS
Copy
const timerEl = document.getElementById("timer"); const playPause = document.getElementById("playPause"); const container = document.querySelector(".container"); const optionBtnContainer = document.querySelector(".option-btn-container"); const optionBtns = document.querySelectorAll(".option-btn"); const audio = new Audio("sound.mp3"); // Modal const configBtn = document.getElementById("config"); const closeBtn = document.getElementById("closeBtn"); const applyBtn = document.getElementById("apply"); const settingsModal = document.querySelector(".settings-modal"); const overlay = document.querySelector(".overlay"); const pomodoroInput = document.getElementById("pomodoroInput"); const shortBreakInput = document.getElementById("shortBreakInput"); const longBreakInput = document.getElementById("longBreakInput"); // Presets const timersSettings = { pomodoro: { name: "pomodoro", time: 1500, classe: "red" }, shortBreak: { name: "shortBreak", time: 300, classe: "green" }, longBreak: { name: "longBreak", time: 900, classe: "blue" } }; let currentTimerInterval, currentTimerSetting, definedTime, timerIsRunning, round, maxRound; // Functions const updateTimerEl = function () { const min = String(Math.trunc(definedTime / 60)).padStart(2, 0); const sec = String(Math.trunc(definedTime % 60)).padStart(2, 0); timerEl.innerHTML = `${min}:${sec}`; }; const getSettingsStored = function () { const timersSettingsStored = JSON.parse( localStorage.getItem("timersSettings") ); if (!timersSettingsStored) return; timersSettings.pomodoro.time = timersSettingsStored.pomodoro.time; timersSettings.shortBreak.time = timersSettingsStored.shortBreak.time; timersSettings.longBreak.time = timersSettingsStored.longBreak.time; pomodoroInput.value = timersSettings.pomodoro.time / 60; shortBreakInput.value = timersSettings.shortBreak.time / 60; longBreakInput.value = timersSettings.longBreak.time / 60; }; const init = function () { getSettingsStored(); currentTimerSetting = timersSettings.pomodoro; definedTime = currentTimerSetting.time; updateTimerEl(); timerIsRunning = false; round = 0; maxRound = 4; }; init(); const resetTimer = function () { clearInterval(currentTimerInterval); timerIsRunning = false; playPause.innerHTML = "PLAY"; container.classList.remove("red", "green", "blue"); optionBtns.forEach((btn) => btn.classList.remove("active-option-btn")); }; const changeTimerInterface = function (id) { currentTimerSetting = timersSettings[id]; definedTime = timersSettings[id].time; document.getElementById(`${id}`).classList.add("active-option-btn"); container.classList.add(timersSettings[id].classe); updateTimerEl(); }; const startTimer = function () { const tick = function () { definedTime--; updateTimerEl(); if (definedTime === 0) { audio.play(); resetBtn(); if (currentTimerSetting === timersSettings.pomodoro) { round++; if (round >= maxRound) { maxRound += 4; changeTimerInterface("longBreak"); } else { changeTimerInterface("shortBreak"); } } else { changeTimerInterface("pomodoro"); } } }; timerIsRunning = true; tick(); const timer = setInterval(tick, 1000); return timer; }; // Event handlers playPause.addEventListener("click", function () { if (!timerIsRunning) { currentTimerInterval = startTimer(); playPause.innerHTML = "PAUSE"; } else { clearInterval(currentTimerInterval); timerIsRunning = false; playPause.innerHTML = "PLAY"; } }); optionBtnContainer.addEventListener("click", function (e) { if (e.target.classList.contains("option-btn")) { resetTimer(); e.target.classList.add("active-option-btn"); changeTimerInterface(e.target.id); } }); // Setting Modal configBtn.addEventListener("click", function () { settingsModal.classList.remove("hidden"); overlay.classList.remove("hidden"); }); const closeModal = function () { settingsModal.classList.add("hidden"); overlay.classList.add("hidden"); }; closeBtn.addEventListener("click", closeModal); overlay.addEventListener("click", closeModal); document.addEventListener("keydown", function (e) { if (e.key == "Escape" && !settingsModal.classList.contains("hidden")) closeModal(); }); applyBtn.addEventListener("click", function () { timersSettings.pomodoro.time = Number(pomodoroInput.value) * 60; timersSettings.shortBreak.time = Number(shortBreakInput.value) * 60; timersSettings.longBreak.time = Number(longBreakInput.value) * 60; localStorage.setItem("timersSettings", JSON.stringify(timersSettings)); changeTimerInterface(currentTimerSetting.name); closeModal(); });