<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 1000px;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1 {
color: #333;
text-align: center;
}
.tracker {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
.time-display {
font-size: 2em;
text-align: center;
margin: 20px 0;
}
.controls {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 20px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
#startBtn {
background-color: #4CAF50;
color: white;
}
#pauseBtn {
background-color: #f44336;
color: white;
}
#resetBtn {
background-color: #2196F3;
color: white;
}
button:hover {
opacity: 0.8;
}
.stats {
display: flex;
justify-content: space-around;
margin-bottom: 20px;
}
.stat-box {
text-align: center;
padding: 15px;
border-radius: 4px;
background-color: #f0f0f0;
width: 45%;
}
.calendar {
margin-top: 30px;
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 10px;
text-align: center;
border: 1px solid #ddd;
}
th {
background-color: #f2f2f2;
}
.session-list {
margin-top: 20px;
}
.session-item {
padding: 10px;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
}
.work {
color: #4CAF50;
}
.rest {
color: #f44336;
}
</style>
</head>
<body>
<div class="container">
<h1>Work/Rest Tracker</h1>
<div class="tracker">
<div class="time-display">
<div id="current-time">00:00:00</div>
<div id="status">Ready to start</div>
</div>
</div>
<div class="controls">
<button id="startBtn">Start Work</button>
<button id="pauseBtn">Start Rest</button>
<button id="resetBtn">Reset</button>
</div>
<div class="stats">
<div class="stat-box">
<h3>Total Work Time</h3>
<p id="total-work">00:00:00</p>
</div>
<div class="stat-box">
<h3>Total Rest Time</h3>
<p id="total-rest">00:00:00</p>
</div>
</div>
<div class="session-list">
<h2>Today's Sessions</h2>
<div id="sessions-container">
<!-- Sessions will be added here -->
</div>
</div>
<div class="calendar">
<h2>Monthly Overview</h2>
<div id="calendar-container">
<!-- Calendar will be generated here -->
</div>
</div>
</div>
<script>
// DOM elements
const currentTimeEl = document.getElementById('current-time');
const statusEl = document.getElementById('status');
const startBtn = document.getElementById('startBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resetBtn = document.getElementById('resetBtn');
const totalWorkEl = document.getElementById('total-work');
const totalRestEl = document.getElementById('total-rest');
const sessionsContainer = document.getElementById('sessions-container');
const calendarContainer = document.getElementById('calendar-container');
// State variables
let isWorking = false;
let isResting = false;
let startTime = null;
let endTime = null;
let workTime = 0;
let restTime = 0;
let currentInterval = null;
let sessions = [];
// Initialize
updateCurrentTime();
generateCalendar();
// Event listeners
startBtn.addEventListener('click', startWork);
pauseBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', resetTracker);
// Functions
function updateCurrentTime() {
const now = new Date();
const timeString = now.toLocaleTimeString();
currentTimeEl.textContent = timeString;
setTimeout(updateCurrentTime, 1000);
}
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
statusEl.textContent = 'Working...';
startTime = new Date();
startBtn.disabled = true;
pauseBtn.disabled = false;
currentInterval = setInterval(() => {
workTime += 1;
updateTotals();
}, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
statusEl.textContent = 'Resting...';
startTime = new Date();
startBtn.disabled = false;
pauseBtn.disabled = true;
currentInterval = setInterval(() => {
restTime += 1;
updateTotals();
}, 1000);
}
function endSession(type) {
clearInterval(currentInterval);
endTime = new Date();
const session = {
type,
startTime: startTime,
endTime: endTime,
duration: type === 'work' ? workTime : restTime
};
sessions.push(session);
renderSession(session);
saveToLocalStorage();
}
function resetTracker() {
clearInterval(currentInterval);
isWorking = false;
isResting = false;
statusEl.textContent = 'Ready to start';
startBtn.disabled = false;
pauseBtn.disabled = false;
startTime = null;
endTime = null;
workTime = 0;
restTime = 0;
updateTotals();
}
function updateTotals() {
const workHours = Math.floor(workTime / 3600);
const workMinutes = Math.floor((workTime % 3600) / 60);
const workSeconds = workTime % 60;
totalWorkEl.textContent = `${String(workHours).padStart(2, '0')}:${String(workMinutes).padStart(2, '0')}:${String(workSeconds).padStart(2, '0')}`;
const restHours = Math.floor(restTime / 3600);
const restMinutes = Math.floor((restTime % 3600) / 60);
const restSeconds = restTime % 60;
totalRestEl.textContent = `${String(restHours).padStart(2, '0')}:${String(restMinutes).padStart(2, '0')}:${String(restSeconds).padStart(2, '0')}`;
}
function renderSession(session) {
const sessionEl = document.createElement('div');
sessionEl.className = `session-item ${session.type}`;
const startTimeStr = session.startTime.toLocaleTimeString();
const endTimeStr = session.endTime.toLocaleTimeString();
const hours = Math.floor(session.duration / 3600);
const minutes = Math.floor((session.duration % 3600) / 60);
const seconds = session.duration % 60;
const durationStr = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
sessionEl.innerHTML = `
<div>${session.type === 'work' ? 'Work' : 'Rest'}</div>
<div>${startTimeStr} - ${endTimeStr}</div>
<div>${durationStr}</div>
`;
sessionsContainer.prepend(sessionEl);
}
function generateCalendar() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth();
const firstDay = new Date(year, month, 1);
const lastDay = new Date(year, month + 1, 0);
const daysInMonth = lastDay.getDate();
const startingDay = firstDay.getDay();
let calendarHTML = '<table><tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr><tr>';
// Empty cells for days before the 1st
for (let i = 0; i < startingDay; i++) {
calendarHTML += '<td></td>';
}
// Days of the month
for (let day = 1; day <= daysInMonth; day++) {
const date = new Date(year, month, day);
const dayOfWeek = date.getDay();
if (dayOfWeek === 0 && day !== 1) {
calendarHTML += '</tr><tr>';
}
calendarHTML += `<td>${day}</td>`;
}
// Empty cells after last day
const lastDayOfWeek = lastDay.getDay();
for (let i = lastDayOfWeek + 1; i < 7; i++) {
calendarHTML += '<td></td>';
}
calendarHTML += '</tr></table>';
calendarContainer.innerHTML = calendarHTML;
}
function saveToLocalStorage() {
localStorage.setItem('workTime', workTime);
localStorage.setItem('restTime', restTime);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
function loadFromLocalStorage() {
const savedWorkTime = localStorage.getItem('workTime');
const savedRestTime = localStorage.getItem('restTime');
const savedSessions = localStorage.getItem('sessions');
if (savedWorkTime) workTime = parseInt(savedWorkTime);
if (savedRestTime) restTime = parseInt(savedRestTime);
if (savedSessions) {
sessions = JSON.parse(savedSessions);
sessions.forEach(session => {
session.startTime = new Date(session.startTime);
session.endTime = new Date(session.endTime);
renderSession(session);
});
}
updateTotals();
}
// Load saved data
loadFromLocalStorage();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 1000px;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1 {
color: #333;
text-align: center;
}
.tracker {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
.time-display {
font-size: 2em;
text-align: center;
margin: 20px 0;
}
.controls {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 20px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
#startBtn {
background-color: #4CAF50;
color: white;
}
#pauseBtn {
background-color: #f44336;
color: white;
}
#resetBtn {
background-color: #2196F3;
color: white;
}
button:hover {
opacity: 0.8;
}
.stats {
display: flex;
justify-content: space-around;
margin-bottom: 20px;
}
.stat-box {
text-align: center;
padding: 15px;
border-radius: 4px;
background-color: #f0f0f0;
width: 45%;
}
.calendar {
margin-top: 30px;
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 10px;
text-align: center;
border: 1px solid #ddd;
}
th {
background-color: #f2f2f2;
}
.session-list {
margin-top: 20px;
}
.session-item {
padding: 10px;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
}
.work {
color: #4CAF50;
}
.rest {
color: #f44336;
}
</style>
</head>
<body>
<div class="container">
<h1>Work/Rest Tracker</h1>
<div class="tracker">
<div class="time-display">
<div id="current-time">00:00:00</div>
<div id="status">Ready to start</div>
</div>
</div>
<div class="controls">
<button id="startBtn">Start Work</button>
<button id="pauseBtn">Start Rest</button>
<button id="resetBtn">Reset</button>
</div>
<div class="stats">
<div class="stat-box">
<h3>Total Work Time</h3>
<p id="total-work">00:00:00</p>
</div>
<div class="stat-box">
<h3>Total Rest Time</h3>
<p id="total-rest">00:00:00</p>
</div>
</div>
<div class="session-list">
<h2>Today's Sessions</h2>
<div id="sessions-container">
<!-- Sessions will be added here -->
</div>
</div>
<div class="calendar">
<h2>Monthly Overview</h2>
<div id="calendar-container">
<!-- Calendar will be generated here -->
</div>
</div>
</div>
<script>
// DOM elements
const currentTimeEl = document.getElementById('current-time');
const statusEl = document.getElementById('status');
const startBtn = document.getElementById('startBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resetBtn = document.getElementById('resetBtn');
const totalWorkEl = document.getElementById('total-work');
const totalRestEl = document.getElementById('total-rest');
const sessionsContainer = document.getElementById('sessions-container');
const calendarContainer = document.getElementById('calendar-container');
// State variables
let isWorking = false;
let isResting = false;
let startTime = null;
let endTime = null;
let workTime = 0;
let restTime = 0;
let currentInterval = null;
let sessions = [];
// Initialize
updateCurrentTime();
generateCalendar();
// Event listeners
startBtn.addEventListener('click', startWork);
pauseBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', resetTracker);
// Functions
function updateCurrentTime() {
const now = new Date();
const timeString = now.toLocaleTimeString();
currentTimeEl.textContent = timeString;
setTimeout(updateCurrentTime, 1000);
}
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
statusEl.textContent = 'Working...';
startTime = new Date();
startBtn.disabled = true;
pauseBtn.disabled = false;
currentInterval = setInterval(() => {
workTime += 1;
updateTotals();
}, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
statusEl.textContent = 'Resting...';
startTime = new Date();
startBtn.disabled = false;
pauseBtn.disabled = true;
currentInterval = setInterval(() => {
restTime += 1;
updateTotals();
}, 1000);
}
function endSession(type) {
clearInterval(currentInterval);
endTime = new Date();
const session = {
type,
startTime: startTime,
endTime: endTime,
duration: type === 'work' ? workTime : restTime
};
sessions.push(session);
renderSession(session);
saveToLocalStorage();
}
function resetTracker() {
clearInterval(currentInterval);
isWorking = false;
isResting = false;
statusEl.textContent = 'Ready to start';
startBtn.disabled = false;
pauseBtn.disabled = false;
startTime = null;
endTime = null;
workTime = 0;
restTime = 0;
updateTotals();
}
function updateTotals() {
const workHours = Math.floor(workTime / 3600);
const workMinutes = Math.floor((workTime % 3600) / 60);
const workSeconds = workTime % 60;
totalWorkEl.textContent = `${String(workHours).padStart(2, '0')}:${String(workMinutes).padStart(2, '0')}:${String(workSeconds).padStart(2, '0')}`;
const restHours = Math.floor(restTime / 3600);
const restMinutes = Math.floor((restTime % 3600) / 60);
const restSeconds = restTime % 60;
totalRestEl.textContent = `${String(restHours).padStart(2, '0')}:${String(restMinutes).padStart(2, '0')}:${String(restSeconds).padStart(2, '0')}`;
}
function renderSession(session) {
const sessionEl = document.createElement('div');
sessionEl.className = `session-item ${session.type}`;
const startTimeStr = session.startTime.toLocaleTimeString();
const endTimeStr = session.endTime.toLocaleTimeString();
const hours = Math.floor(session.duration / 3600);
const minutes = Math.floor((session.duration % 3600) / 60);
const seconds = session.duration % 60;
const durationStr = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
sessionEl.innerHTML = `
<div>${session.type === 'work' ? 'Work' : 'Rest'}</div>
<div>${startTimeStr} - ${endTimeStr}</div>
<div>${durationStr}</div>
`;
sessionsContainer.prepend(sessionEl);
}
function generateCalendar() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth();
const firstDay = new Date(year, month, 1);
const lastDay = new Date(year, month + 1, 0);
const daysInMonth = lastDay.getDate();
const startingDay = firstDay.getDay();
let calendarHTML = '<table><tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr><tr>';
// Empty cells for days before the 1st
for (let i = 0; i < startingDay; i++) {
calendarHTML += '<td></td>';
}
// Days of the month
for (let day = 1; day <= daysInMonth; day++) {
const date = new Date(year, month, day);
const dayOfWeek = date.getDay();
if (dayOfWeek === 0 && day !== 1) {
calendarHTML += '</tr><tr>';
}
calendarHTML += `<td>${day}</td>`;
}
// Empty cells after last day
const lastDayOfWeek = lastDay.getDay();
for (let i = lastDayOfWeek + 1; i < 7; i++) {
calendarHTML += '<td></td>';
}
calendarHTML += '</tr></table>';
calendarContainer.innerHTML = calendarHTML;
}
function saveToLocalStorage() {
localStorage.setItem('workTime', workTime);
localStorage.setItem('restTime', restTime);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
function loadFromLocalStorage() {
const savedWorkTime = localStorage.getItem('workTime');
const savedRestTime = localStorage.getItem('restTime');
const savedSessions = localStorage.getItem('sessions');
if (savedWorkTime) workTime = parseInt(savedWorkTime);
if (savedRestTime) restTime = parseInt(savedRestTime);
if (savedSessions) {
sessions = JSON.parse(savedSessions);
sessions.forEach(session => {
session.startTime = new Date(session.startTime);
session.endTime = new Date(session.endTime);
renderSession(session);
});
}
updateTotals();
}
// Load saved data
loadFromLocalStorage();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 800px;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1 {
color: #333;
text-align: center;
}
.tracker {
text-align: center;
margin: 30px 0;
}
.time-display {
font-size: 2.5em;
margin: 20px 0;
}
.status {
font-size: 1.2em;
margin-bottom: 20px;
}
.controls {
display: flex;
justify-content: center;
gap: 15px;
margin-bottom: 30px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
#startBtn {
background-color: #4CAF50;
color: white;
}
#pauseBtn {
background-color: #f44336;
color: white;
}
#resetBtn {
background-color: #2196F3;
color: white;
}
button:hover {
opacity: 0.8;
}
.stats {
display: flex;
justify-content: space-around;
margin-bottom: 30px;
}
.stat-box {
text-align: center;
padding: 15px;
border-radius: 4px;
background-color: #f0f0f0;
width: 45%;
}
.sessions {
margin-top: 30px;
}
.session-item {
padding: 10px;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
}
.work {
color: #4CAF50;
}
.rest {
color: #f44336;
}
</style>
</head>
<body>
<div class="container">
<h1>Work/Rest Tracker</h1>
<div class="tracker">
<div class="time-display" id="currentTime">00:00:00</div>
<div class="status" id="status">Ready to start</div>
</div>
<div class="controls">
<button id="startBtn">Start Work</button>
<button id="pauseBtn" disabled>Start Rest</button>
<button id="resetBtn">Reset</button>
</div>
<div class="stats">
<div class="stat-box">
<h3>Total Work Time</h3>
<div id="totalWork">00:00:00</div>
</div>
<div class="stat-box">
<h3>Total Rest Time</h3>
<div id="totalRest">00:00:00</div>
</div>
</div>
<div class="sessions">
<h2>Today's Sessions</h2>
<div id="sessionsList"></div>
</div>
</div>
<script>
// DOM elements
const currentTimeEl = document.getElementById('currentTime');
const statusEl = document.getElementById('status');
const startBtn = document.getElementById('startBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resetBtn = document.getElementById('resetBtn');
const totalWorkEl = document.getElementById('totalWork');
const totalRestEl = document.getElementById('totalRest');
const sessionsList = document.getElementById('sessionsList');
// State variables
let isWorking = false;
let isResting = false;
let startTime = null;
let endTime = null;
let workTime = 0;
let restTime = 0;
let currentInterval = null;
let sessions = [];
// Initialize
updateCurrentTime();
loadSessions();
// Event listeners
startBtn.addEventListener('click', startWork);
pauseBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', resetTracker);
// Functions
function updateCurrentTime() {
const now = new Date();
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
currentTimeEl.textContent = `${hours}:${minutes}:${seconds}`;
setTimeout(updateCurrentTime, 1000);
}
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
statusEl.textContent = 'Working...';
startTime = new Date();
startBtn.disabled = true;
pauseBtn.disabled = false;
currentInterval = setInterval(() => {
workTime++;
updateTotalTime();
}, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
statusEl.textContent = 'Resting...';
startTime = new Date();
startBtn.disabled = false;
pauseBtn.disabled = true;
currentInterval = setInterval(() => {
restTime++;
updateTotalTime();
}, 1000);
}
function endSession(type) {
clearInterval(currentInterval);
endTime = new Date();
const session = {
type,
startTime: startTime,
endTime: endTime,
duration: type === 'work' ? workTime : restTime
};
sessions.push(session);
renderSession(session);
saveSessions();
}
function resetTracker() {
clearInterval(currentInterval);
isWorking = false;
isResting = false;
statusEl.textContent = 'Ready to start';
startBtn.disabled = false;
pauseBtn.disabled = true;
startTime = null;
endTime = null;
workTime = 0;
restTime = 0;
updateTotalTime();
}
function updateTotalTime() {
const workHours = Math.floor(workTime / 3600);
const workMinutes = Math.floor((workTime % 3600) / 60);
const workSeconds = workTime % 60;
totalWorkEl.textContent = `${String(workHours).padStart(2, '0')}:${String(workMinutes).padStart(2, '0')}:${String(workSeconds).padStart(2, '0')}`;
const restHours = Math.floor(restTime / 3600);
const restMinutes = Math.floor((restTime % 3600) / 60);
const restSeconds = restTime % 60;
totalRestEl.textContent = `${String(restHours).padStart(2, '0')}:${String(restMinutes).padStart(2, '0')}:${String(restSeconds).padStart(2, '0')}`;
}
function renderSession(session) {
const sessionEl = document.createElement('div');
sessionEl.className = `session-item ${session.type}`;
const startTimeStr = session.startTime.toLocaleTimeString();
const endTimeStr = session.endTime.toLocaleTimeString();
const hours = Math.floor(session.duration / 3600);
const minutes = Math.floor((session.duration % 3600) / 60);
const seconds = session.duration % 60;
const durationStr = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
sessionEl.innerHTML = `
<div>${session.type === 'work' ? 'Work' : 'Rest'}</div>
<div>${startTimeStr} - ${endTimeStr}</div>
<div>${durationStr}</div>
`;
sessionsList.prepend(sessionEl);
}
function saveSessions() {
localStorage.setItem('workTime', workTime);
localStorage.setItem('restTime', restTime);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
function loadSessions() {
const savedWorkTime = localStorage.getItem('workTime');
const savedRestTime = localStorage.getItem('restTime');
const savedSessions = localStorage.getItem('sessions');
if (savedWorkTime) workTime = parseInt(savedWorkTime);
if (savedRestTime) restTime = parseInt(savedRestTime);
if (savedSessions) {
sessions = JSON.parse(savedSessions);
sessions.forEach(session => {
session.startTime = new Date(session.startTime);
session.endTime = new Date(session.endTime);
renderSession(session);
});
}
updateTotalTime();
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 800px;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1 {
color: #333;
text-align: center;
}
.tracker {
text-align: center;
margin: 30px 0;
}
.time-display {
font-size: 2.5em;
margin: 20px 0;
}
.status {
font-size: 1.2em;
margin-bottom: 20px;
}
.controls {
display: flex;
justify-content: center;
gap: 15px;
margin-bottom: 30px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
#startBtn {
background-color: #4CAF50;
color: white;
}
#pauseBtn {
background-color: #f44336;
color: white;
}
#resetBtn {
background-color: #2196F3;
color: white;
}
button:hover {
opacity: 0.8;
}
.stats {
display: flex;
justify-content: space-around;
margin-bottom: 30px;
}
.stat-box {
text-align: center;
padding: 15px;
border-radius: 4px;
background-color: #f0f0f0;
width: 45%;
}
.sessions {
margin-top: 30px;
}
.session-item {
padding: 10px;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
}
.work {
color: #4CAF50;
}
.rest {
color: #f44336;
}
</style>
</head>
<body>
<div class="container">
<h1>Work/Rest Tracker</h1>
<div class="tracker">
<div class="time-display" id="currentTime">00:00:00</div>
<div class="status" id="status">Ready to start</div>
</div>
<div class="controls">
<button id="startBtn">Start Work</button>
<button id="pauseBtn" disabled>Start Rest</button>
<button id="resetBtn">Reset</button>
</div>
<div class="stats">
<div class="stat-box">
<h3>Total Work Time</h3>
<div id="totalWork">00:00:00</div>
</div>
<div class="stat-box">
<h3>Total Rest Time</h3>
<div id="totalRest">00:00:00</div>
</div>
</div>
<div class="sessions">
<h2>Today's Sessions</h2>
<div id="sessionsList"></div>
</div>
</div>
<script>
// DOM elements
const currentTimeEl = document.getElementById('currentTime');
const statusEl = document.getElementById('status');
const startBtn = document.getElementById('startBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resetBtn = document.getElementById('resetBtn');
const totalWorkEl = document.getElementById('totalWork');
const totalRestEl = document.getElementById('totalRest');
const sessionsList = document.getElementById('sessionsList');
// State variables
let isWorking = false;
let isResting = false;
let startTime = null;
let endTime = null;
let workTime = 0;
let restTime = 0;
let currentInterval = null;
let sessions = [];
// Initialize
updateCurrentTime();
loadSessions();
// Event listeners
startBtn.addEventListener('click', startWork);
pauseBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', resetTracker);
// Functions
function updateCurrentTime() {
const now = new Date();
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
currentTimeEl.textContent = `${hours}:${minutes}:${seconds}`;
setTimeout(updateCurrentTime, 1000);
}
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
statusEl.textContent = 'Working...';
startTime = new Date();
startBtn.disabled = true;
pauseBtn.disabled = false;
currentInterval = setInterval(() => {
workTime++;
updateTotalTime();
}, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
statusEl.textContent = 'Resting...';
startTime = new Date();
startBtn.disabled = false;
pauseBtn.disabled = true;
currentInterval = setInterval(() => {
restTime++;
updateTotalTime();
}, 1000);
}
function endSession(type) {
clearInterval(currentInterval);
endTime = new Date();
const session = {
type,
startTime: startTime,
endTime: endTime,
duration: type === 'work' ? workTime : restTime
};
sessions.push(session);
renderSession(session);
saveSessions();
}
function resetTracker() {
clearInterval(currentInterval);
isWorking = false;
isResting = false;
statusEl.textContent = 'Ready to start';
startBtn.disabled = false;
pauseBtn.disabled = true;
startTime = null;
endTime = null;
workTime = 0;
restTime = 0;
updateTotalTime();
}
function updateTotalTime() {
const workHours = Math.floor(workTime / 3600);
const workMinutes = Math.floor((workTime % 3600) / 60);
const workSeconds = workTime % 60;
totalWorkEl.textContent = `${String(workHours).padStart(2, '0')}:${String(workMinutes).padStart(2, '0')}:${String(workSeconds).padStart(2, '0')}`;
const restHours = Math.floor(restTime / 3600);
const restMinutes = Math.floor((restTime % 3600) / 60);
const restSeconds = restTime % 60;
totalRestEl.textContent = `${String(restHours).padStart(2, '0')}:${String(restMinutes).padStart(2, '0')}:${String(restSeconds).padStart(2, '0')}`;
}
function renderSession(session) {
const sessionEl = document.createElement('div');
sessionEl.className = `session-item ${session.type}`;
const startTimeStr = session.startTime.toLocaleTimeString();
const endTimeStr = session.endTime.toLocaleTimeString();
const hours = Math.floor(session.duration / 3600);
const minutes = Math.floor((session.duration % 3600) / 60);
const seconds = session.duration % 60;
const durationStr = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
sessionEl.innerHTML = `
<div>${session.type === 'work' ? 'Work' : 'Rest'}</div>
<div>${startTimeStr} - ${endTimeStr}</div>
<div>${durationStr}</div>
`;
sessionsList.prepend(sessionEl);
}
function saveSessions() {
localStorage.setItem('workTime', workTime);
localStorage.setItem('restTime', restTime);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
function loadSessions() {
const savedWorkTime = localStorage.getItem('workTime');
const savedRestTime = localStorage.getItem('restTime');
const savedSessions = localStorage.getItem('sessions');
if (savedWorkTime) workTime = parseInt(savedWorkTime);
if (savedRestTime) restTime = parseInt(savedRestTime);
if (savedSessions) {
sessions = JSON.parse(savedSessions);
sessions.forEach(session => {
session.startTime = new Date(session.startTime);
session.endTime = new Date(session.endTime);
renderSession(session);
});
}
updateTotalTime();
}
</script>
</body>
</html>
I've fixed the issues in the code. Here are the key improvements:
To use the tracker:
The tracker now properly shows:
I understand the issue - the preview isn't working in your environment. Let me provide a simplified version that should work better in WebContainer. Here's the fixed code:
<!DOCTYPE html>
<html>
<head>
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.timer {
font-size: 2em;
text-align: center;
margin: 20px 0;
}
.controls {
display: flex;
justify-content: center;
gap: 10px;
margin-bottom: 20px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
}
#startBtn {
background-color: #4CAF50;
color: white;
}
#pauseBtn {
background-color: #f44336;
color: white;
}
#resetBtn {
background-color: #2196F3;
color: white;
}
.stats {
display: flex;
justify-content: space-around;
margin: 20px 0;
}
.session {
border-bottom: 1px solid #eee;
padding: 10px 0;
}
</style>
</head>
<body>
<h1>Work/Rest Tracker</h1>
<div class="timer" id="timer">00:00:00</div>
<div id="status">Ready to start</div>
<div class="controls">
<button id="startBtn">Start Work</button>
<button id="pauseBtn" disabled>Start Rest</button>
<button id="resetBtn">Reset</button>
</div>
<div class="stats">
<div>Work: <span id="workTime">00:00:00</span></div>
<div>Rest: <span id="restTime">00:00:00</span></div>
</div>
<h2>Sessions</h2>
<div id="sessions"></div>
<script>
// DOM elements
const timerEl = document.getElementById('timer');
const statusEl = document.getElementById('status');
const startBtn = document.getElementById('startBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resetBtn = document.getElementById('resetBtn');
const workTimeEl = document.getElementById('workTime');
const restTimeEl = document.getElementById('restTime');
const sessionsEl = document.getElementById('sessions');
// State
let isWorking = false;
let isResting = false;
let seconds = 0;
let workSeconds = 0;
let restSeconds = 0;
let interval;
let sessions = [];
// Initialize
updateTimer();
loadSessions();
// Event listeners
startBtn.addEventListener('click', startWork);
pauseBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', reset);
// Functions
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
statusEl.textContent = 'Working...';
startBtn.disabled = true;
pauseBtn.disabled = false;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateWorkTimer, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
statusEl.textContent = 'Resting...';
startBtn.disabled = false;
pauseBtn.disabled = true;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateRestTimer, 1000);
}
function endSession(type) {
const now = new Date();
sessions.push({
type,
startTime: new Date(now.getTime() - seconds * 1000),
endTime: now,
duration: seconds
});
if (type === 'work') {
workSeconds += seconds;
} else {
restSeconds += seconds;
}
updateTimes();
saveSessions();
renderSessions();
}
function reset() {
clearInterval(interval);
isWorking = false;
isResting = false;
statusEl.textContent = 'Ready to start';
startBtn.disabled = false;
pauseBtn.disabled = true;
seconds = 0;
updateTimer();
}
function updateWorkTimer() {
seconds++;
updateTimer();
}
function updateRestTimer() {
seconds++;
updateTimer();
}
function updateTimer() {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
timerEl.textContent = `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
}
function updateTimes() {
workTimeEl.textContent = formatTime(workSeconds);
restTimeEl.textContent = formatTime(restSeconds);
}
function formatTime(totalSeconds) {
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const seconds = totalSeconds % 60;
return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
}
function pad(num) {
return num.toString().padStart(2, '0');
}
function renderSessions() {
sessionsEl.innerHTML = sessions
.map(session => `
<div class="session">
${session.type === 'work' ? 'Work' : 'Rest'}:
${session.startTime.toLocaleTimeString()} -
${session.endTime.toLocaleTimeString()}
(${formatTime(session.duration)})
</div>
`)
.reverse()
.join('');
}
function saveSessions() {
localStorage.setItem('workSeconds', workSeconds);
localStorage.setItem('restSeconds', restSeconds);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
function loadSessions() {
const savedWork = localStorage.getItem('workSeconds');
const savedRest = localStorage.getItem('restSeconds');
const savedSessions = localStorage.getItem('sessions');
if (savedWork) workSeconds = parseInt(savedWork);
if (savedRest) restSeconds = parseInt(savedRest);
if (savedSessions) sessions = JSON.parse(savedSessions);
updateTimes();
renderSessions();
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.timer {
font-size: 2em;
text-align: center;
margin: 20px 0;
}
.controls {
display: flex;
justify-content: center;
gap: 10px;
margin-bottom: 20px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
}
#startBtn {
background-color: #4CAF50;
color: white;
}
#pauseBtn {
background-color: #f44336;
color: white;
}
#resetBtn {
background-color: #2196F3;
color: white;
}
.stats {
display: flex;
justify-content: space-around;
margin: 20px 0;
}
.session {
border-bottom: 1px solid #eee;
padding: 10px 0;
}
</style>
</head>
<body>
<h1>Work/Rest Tracker</h1>
<div class="timer" id="timer">00:00:00</div>
<div id="status">Ready to start</div>
<div class="controls">
<button id="startBtn">Start Work</button>
<button id="pauseBtn" disabled>Start Rest</button>
<button id="resetBtn">Reset</button>
</div>
<div class="stats">
<div>Work: <span id="workTime">00:00:00</span></div>
<div>Rest: <span id="restTime">00:00:00</span></div>
</div>
<h2>Sessions</h2>
<div id="sessions"></div>
<script>
// DOM elements
const timerEl = document.getElementById('timer');
const statusEl = document.getElementById('status');
const startBtn = document.getElementById('startBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resetBtn = document.getElementById('resetBtn');
const workTimeEl = document.getElementById('workTime');
const restTimeEl = document.getElementById('restTime');
const sessionsEl = document.getElementById('sessions');
// State
let isWorking = false;
let isResting = false;
let seconds = 0;
let workSeconds = 0;
let restSeconds = 0;
let interval;
let sessions = [];
// Initialize
updateTimer();
loadSessions();
// Event listeners
startBtn.addEventListener('click', startWork);
pauseBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', reset);
// Functions
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
statusEl.textContent = 'Working...';
startBtn.disabled = true;
pauseBtn.disabled = false;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateWorkTimer, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
statusEl.textContent = 'Resting...';
startBtn.disabled = false;
pauseBtn.disabled = true;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateRestTimer, 1000);
}
function endSession(type) {
const now = new Date();
sessions.push({
type,
startTime: new Date(now.getTime() - seconds * 1000),
endTime: now,
duration: seconds
});
if (type === 'work') {
workSeconds += seconds;
} else {
restSeconds += seconds;
}
updateTimes();
saveSessions();
renderSessions();
}
function reset() {
clearInterval(interval);
isWorking = false;
isResting = false;
statusEl.textContent = 'Ready to start';
startBtn.disabled = false;
pauseBtn.disabled = true;
seconds = 0;
updateTimer();
}
function updateWorkTimer() {
seconds++;
updateTimer();
}
function updateRestTimer() {
seconds++;
updateTimer();
}
function updateTimer() {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
timerEl.textContent = `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
}
function updateTimes() {
workTimeEl.textContent = formatTime(workSeconds);
restTimeEl.textContent = formatTime(restSeconds);
}
function formatTime(totalSeconds) {
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const seconds = totalSeconds % 60;
return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
}
function pad(num) {
return num.toString().padStart(2, '0');
}
function renderSessions() {
sessionsEl.innerHTML = sessions
.map(session => `
<div class="session">
${session.type === 'work' ? 'Work' : 'Rest'}:
${session.startTime.toLocaleTimeString()} -
${session.endTime.toLocaleTimeString()}
(${formatTime(session.duration)})
</div>
`)
.reverse()
.join('');
}
function saveSessions() {
localStorage.setItem('workSeconds', workSeconds);
localStorage.setItem('restSeconds', restSeconds);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
function loadSessions() {
const savedWork = localStorage.getItem('workSeconds');
const savedRest = localStorage.getItem('restSeconds');
const savedSessions = localStorage.getItem('sessions');
if (savedWork) workSeconds = parseInt(savedWork);
if (savedRest) restSeconds = parseInt(savedRest);
if (savedSessions) sessions = JSON.parse(savedSessions);
updateTimes();
renderSessions();
}
</script>
</body>
</html>
Key improvements in this version:
To use:
The tracker now shows:
I understand you're getting a "Preview not available" error in Chrome. Let me provide a completely clean, minimal version that should work reliably in any browser. Here's the simplest possible working version:
<!DOCTYPE html>
<html>
<head>
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
#timer {
font-size: 2em;
text-align: center;
margin: 20px 0;
}
.buttons {
display: flex;
justify-content: center;
gap: 10px;
margin-bottom: 20px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
}
#work {
background: #4CAF50;
color: white;
}
#rest {
background: #f44336;
color: white;
}
#reset {
background: #2196F3;
color: white;
}
.totals {
display: flex;
justify-content: space-around;
margin: 20px 0;
}
#history {
margin-top: 20px;
}
</style>
</head>
<body>
<h1>Work/Rest Tracker</h1>
<div id="timer">00:00:00</div>
<div id="status">Ready to start</div>
<div class="buttons">
<button id="work">Work</button>
<button id="rest" disabled>Rest</button>
<button id="reset">Reset</button>
</div>
<div class="totals">
<div>Work: <span id="totalWork">00:00:00</span></div>
<div>Rest: <span id="totalRest">00:00:00</span></div>
</div>
<h2>History</h2>
<div id="history"></div>
<script>
// Elements
const timer = document.getElementById('timer');
const status = document.getElementById('status');
const workBtn = document.getElementById('work');
const restBtn = document.getElementById('rest');
const resetBtn = document.getElementById('reset');
const totalWork = document.getElementById('totalWork');
const totalRest = document.getElementById('totalRest');
const history = document.getElementById('history');
// State
let isWorking = false;
let isResting = false;
let seconds = 0;
let workTotal = 0;
let restTotal = 0;
let interval;
let sessions = [];
// Load saved data
if (localStorage.getItem('workTotal')) {
workTotal = parseInt(localStorage.getItem('workTotal'));
totalWork.textContent = formatTime(workTotal);
}
if (localStorage.getItem('restTotal')) {
restTotal = parseInt(localStorage.getItem('restTotal'));
totalRest.textContent = formatTime(restTotal);
}
if (localStorage.getItem('sessions')) {
sessions = JSON.parse(localStorage.getItem('sessions'));
renderHistory();
}
// Event listeners
workBtn.addEventListener('click', startWork);
restBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', resetAll);
// Functions
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
status.textContent = 'Working...';
workBtn.disabled = true;
restBtn.disabled = false;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateTimer, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
status.textContent = 'Resting...';
workBtn.disabled = false;
restBtn.disabled = true;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateTimer, 1000);
}
function endSession(type) {
const now = new Date();
sessions.push({
type,
start: new Date(now.getTime() - seconds * 1000).toLocaleTimeString(),
end: now.toLocaleTimeString(),
duration: seconds
});
if (type === 'work') {
workTotal += seconds;
totalWork.textContent = formatTime(workTotal);
} else {
restTotal += seconds;
totalRest.textContent = formatTime(restTotal);
}
saveData();
renderHistory();
}
function updateTimer() {
seconds++;
timer.textContent = formatTime(seconds);
}
function resetAll() {
clearInterval(interval);
isWorking = false;
isResting = false;
status.textContent = 'Ready to start';
workBtn.disabled = false;
restBtn.disabled = true;
seconds = 0;
timer.textContent = '00:00:00';
}
function formatTime(totalSeconds) {
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const secs = totalSeconds % 60;
return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
}
function pad(num) {
return num.toString().padStart(2, '0');
}
function renderHistory() {
history.innerHTML = sessions
.slice().reverse()
.map(session => `
<div>
${session.type}: ${session.start} - ${session.end} (${formatTime(session.duration)})
</div>
`)
.join('');
}
function saveData() {
localStorage.setItem('workTotal', workTotal);
localStorage.setItem('restTotal', restTotal);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Work/Rest Tracker</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
#timer {
font-size: 2em;
text-align: center;
margin: 20px 0;
}
.buttons {
display: flex;
justify-content: center;
gap: 10px;
margin-bottom: 20px;
}
button {
padding: 10px 20px;
font-size: 1em;
border: none;
border-radius: 4px;
cursor: pointer;
}
#work {
background: #4CAF50;
color: white;
}
#rest {
background: #f44336;
color: white;
}
#reset {
background: #2196F3;
color: white;
}
.totals {
display: flex;
justify-content: space-around;
margin: 20px 0;
}
#history {
margin-top: 20px;
}
</style>
</head>
<body>
<h1>Work/Rest Tracker</h1>
<div id="timer">00:00:00</div>
<div id="status">Ready to start</div>
<div class="buttons">
<button id="work">Work</button>
<button id="rest" disabled>Rest</button>
<button id="reset">Reset</button>
</div>
<div class="totals">
<div>Work: <span id="totalWork">00:00:00</span></div>
<div>Rest: <span id="totalRest">00:00:00</span></div>
</div>
<h2>History</h2>
<div id="history"></div>
<script>
// Elements
const timer = document.getElementById('timer');
const status = document.getElementById('status');
const workBtn = document.getElementById('work');
const restBtn = document.getElementById('rest');
const resetBtn = document.getElementById('reset');
const totalWork = document.getElementById('totalWork');
const totalRest = document.getElementById('totalRest');
const history = document.getElementById('history');
// State
let isWorking = false;
let isResting = false;
let seconds = 0;
let workTotal = 0;
let restTotal = 0;
let interval;
let sessions = [];
// Load saved data
if (localStorage.getItem('workTotal')) {
workTotal = parseInt(localStorage.getItem('workTotal'));
totalWork.textContent = formatTime(workTotal);
}
if (localStorage.getItem('restTotal')) {
restTotal = parseInt(localStorage.getItem('restTotal'));
totalRest.textContent = formatTime(restTotal);
}
if (localStorage.getItem('sessions')) {
sessions = JSON.parse(localStorage.getItem('sessions'));
renderHistory();
}
// Event listeners
workBtn.addEventListener('click', startWork);
restBtn.addEventListener('click', startRest);
resetBtn.addEventListener('click', resetAll);
// Functions
function startWork() {
if (isWorking) return;
if (isResting) {
endSession('rest');
}
isWorking = true;
isResting = false;
status.textContent = 'Working...';
workBtn.disabled = true;
restBtn.disabled = false;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateTimer, 1000);
}
function startRest() {
if (isResting) return;
if (isWorking) {
endSession('work');
}
isWorking = false;
isResting = true;
status.textContent = 'Resting...';
workBtn.disabled = false;
restBtn.disabled = true;
clearInterval(interval);
seconds = 0;
interval = setInterval(updateTimer, 1000);
}
function endSession(type) {
const now = new Date();
sessions.push({
type,
start: new Date(now.getTime() - seconds * 1000).toLocaleTimeString(),
end: now.toLocaleTimeString(),
duration: seconds
});
if (type === 'work') {
workTotal += seconds;
totalWork.textContent = formatTime(workTotal);
} else {
restTotal += seconds;
totalRest.textContent = formatTime(restTotal);
}
saveData();
renderHistory();
}
function updateTimer() {
seconds++;
timer.textContent = formatTime(seconds);
}
function resetAll() {
clearInterval(interval);
isWorking = false;
isResting = false;
status.textContent = 'Ready to start';
workBtn.disabled = false;
restBtn.disabled = true;
seconds = 0;
timer.textContent = '00:00:00';
}
function formatTime(totalSeconds) {
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const secs = totalSeconds % 60;
return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
}
function pad(num) {
return num.toString().padStart(2, '0');
}
function renderHistory() {
history.innerHTML = sessions
.slice().reverse()
.map(session => `
<div>
${session.type}: ${session.start} - ${session.end} (${formatTime(session.duration)})
</div>
`)
.join('');
}
function saveData() {
localStorage.setItem('workTotal', workTotal);
localStorage.setItem('restTotal', restTotal);
localStorage.setItem('sessions', JSON.stringify(sessions));
}
</script>
</body>
</html>
This version:
To test:
tracker.html
This should work perfectly since it's just a simple HTML file with no server requirements. The preview error you're seeing is likely from trying to run it in an online editor - this version will work when saved as a local file.*