Skip to content

Commit aeef885

Browse files
ui update
1 parent 097bb2f commit aeef885

3 files changed

Lines changed: 667 additions & 0 deletions

File tree

countdown/index.html

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Countdown Timer</title>
7+
<link rel="stylesheet" href="styles.css">
8+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9+
</head>
10+
<body>
11+
<div class="container">
12+
<header class="header">
13+
<h1 class="title">
14+
<i class="fas fa-hourglass-half"></i> Countdown Timer
15+
</h1>
16+
<div class="date-display">
17+
<span class="date-label">Target:</span>
18+
<span class="date-value">March 9, 2026</span>
19+
</div>
20+
</header>
21+
22+
<main class="main-content">
23+
<section class="progress-section">
24+
<div class="progress-header">
25+
<span class="progress-label">Time Progress</span>
26+
<span class="progress-percent" id="percentage">0%</span>
27+
</div>
28+
29+
<div class="progress-container">
30+
<div class="progress-track">
31+
<div class="progress-fill" id="progressFill"></div>
32+
<div class="progress-marker" id="progressMarker">
33+
<i class="fas fa-chevron-down"></i>
34+
</div>
35+
</div>
36+
</div>
37+
38+
<div class="progress-stats">
39+
<div class="stat-box">
40+
<span class="stat-label">Passed</span>
41+
<span class="stat-value" id="elapsedTime">0 days</span>
42+
</div>
43+
<div class="stat-box">
44+
<span class="stat-label">Remaining</span>
45+
<span class="stat-value" id="remainingTime">0 days</span>
46+
</div>
47+
</div>
48+
</section>
49+
50+
<section class="countdown-section">
51+
<div class="countdown-grid">
52+
<div class="countdown-unit">
53+
<div class="countdown-value" id="days">00</div>
54+
<div class="countdown-label">Days</div>
55+
</div>
56+
<div class="countdown-unit">
57+
<div class="countdown-value" id="hours">00</div>
58+
<div class="countdown-label">Hours</div>
59+
</div>
60+
<div class="countdown-unit">
61+
<div class="countdown-value" id="minutes">00</div>
62+
<div class="countdown-label">Minutes</div>
63+
</div>
64+
<div class="countdown-unit">
65+
<div class="countdown-value" id="seconds">00</div>
66+
<div class="countdown-label">Seconds</div>
67+
</div>
68+
</div>
69+
</section>
70+
</main>
71+
72+
<div class="completion-message" id="completedMessage">
73+
<i class="fas fa-trophy"></i>
74+
<span>Countdown Complete!</span>
75+
</div>
76+
</div>
77+
78+
<script src="script.js"></script>
79+
</body>
80+
</html>

countdown/script.js

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
const START_DATE = new Date("December 8, 2025 00:00:00").getTime();
2+
const TARGET_DATE = new Date("March 9, 2026 00:00:00").getTime();
3+
4+
const daysElement = document.getElementById("days");
5+
const hoursElement = document.getElementById("hours");
6+
const minutesElement = document.getElementById("minutes");
7+
const secondsElement = document.getElementById("seconds");
8+
const completedMessage = document.getElementById("completedMessage");
9+
const percentageElement = document.getElementById("percentage");
10+
const progressFill = document.getElementById("progressFill");
11+
const progressMarker = document.getElementById("progressMarker");
12+
const elapsedTimeElement = document.getElementById("elapsedTime");
13+
const remainingTimeElement = document.getElementById("remainingTime");
14+
15+
let countdownInterval = null;
16+
let previousTime = {
17+
days: null,
18+
hours: null,
19+
minutes: null,
20+
seconds: null
21+
};
22+
23+
function updateProgressBar() {
24+
const now = Date.now();
25+
const totalDuration = TARGET_DATE - START_DATE;
26+
const elapsed = Math.max(0, now - START_DATE);
27+
28+
let progressPercent = Math.min((elapsed / totalDuration) * 100, 100);
29+
30+
if (progressPercent < 0) progressPercent = 0;
31+
if (progressPercent > 100) progressPercent = 100;
32+
33+
progressFill.style.width = `${progressPercent}%`;
34+
progressMarker.style.left = `${progressPercent}%`;
35+
percentageElement.textContent = `${progressPercent.toFixed(5)}%`;
36+
37+
const daysElapsed = Math.floor(elapsed / (1000 * 60 * 60 * 24));
38+
const daysRemaining = Math.floor((TARGET_DATE - now) / (1000 * 60 * 60 * 24));
39+
40+
elapsedTimeElement.textContent = `${Math.max(0, daysElapsed)} days`;
41+
remainingTimeElement.textContent = `${Math.max(0, daysRemaining)} days`;
42+
43+
return progressPercent;
44+
}
45+
46+
function updateCountdown() {
47+
const now = Date.now();
48+
const distance = TARGET_DATE - now;
49+
50+
if (distance <= 0) {
51+
handleCountdownComplete();
52+
return;
53+
}
54+
55+
const days = Math.floor(distance / (1000 * 60 * 60 * 24));
56+
const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
57+
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
58+
const seconds = Math.floor((distance % (1000 * 60)) / 1000);
59+
60+
updateTimeElement(daysElement, days, previousTime.days);
61+
updateTimeElement(hoursElement, hours, previousTime.hours);
62+
updateTimeElement(minutesElement, minutes, previousTime.minutes);
63+
updateTimeElement(secondsElement, seconds, previousTime.seconds);
64+
65+
previousTime = { days, hours, minutes, seconds };
66+
67+
updateProgressBar();
68+
}
69+
70+
function updateTimeElement(element, newValue, previousValue) {
71+
const formattedValue = newValue < 10 ? `0${newValue}` : `${newValue}`;
72+
73+
if (element.textContent !== formattedValue && previousValue !== null) {
74+
element.textContent = formattedValue;
75+
element.classList.add('changed');
76+
77+
setTimeout(() => {
78+
element.classList.remove('changed');
79+
}, 500);
80+
} else if (previousValue === null) {
81+
element.textContent = formattedValue;
82+
}
83+
}
84+
85+
function handleCountdownComplete() {
86+
if (countdownInterval) {
87+
clearInterval(countdownInterval);
88+
countdownInterval = null;
89+
}
90+
91+
daysElement.textContent = "00";
92+
hoursElement.textContent = "00";
93+
minutesElement.textContent = "00";
94+
secondsElement.textContent = "00";
95+
96+
completedMessage.style.display = "block";
97+
98+
progressFill.style.width = "100%";
99+
progressMarker.style.left = "100%";
100+
percentageElement.textContent = "100%";
101+
remainingTimeElement.textContent = "0 days";
102+
103+
progressFill.style.animation = "shimmer 1s infinite linear";
104+
}
105+
106+
function initializeCountdown() {
107+
updateProgressBar();
108+
updateCountdown();
109+
110+
countdownInterval = setInterval(updateCountdown, 1000);
111+
}
112+
113+
function handleVisibilityChange() {
114+
if (document.hidden) {
115+
if (countdownInterval) {
116+
clearInterval(countdownInterval);
117+
countdownInterval = null;
118+
}
119+
} else {
120+
updateProgressBar();
121+
updateCountdown();
122+
123+
if (!countdownInterval) {
124+
countdownInterval = setInterval(updateCountdown, 1000);
125+
}
126+
}
127+
}
128+
129+
document.addEventListener('DOMContentLoaded', initializeCountdown);
130+
document.addEventListener('visibilitychange', handleVisibilityChange);
131+
132+
window.addEventListener('focus', () => {
133+
if (document.visibilityState === 'visible') {
134+
updateCountdown();
135+
updateProgressBar();
136+
}
137+
});
138+
139+
window.addEventListener('error', (event) => {
140+
console.error('Countdown Timer Error:', event.error);
141+
142+
daysElement.textContent = "91";
143+
hoursElement.textContent = "00";
144+
minutesElement.textContent = "00";
145+
secondsElement.textContent = "00";
146+
percentageElement.textContent = "0.0%";
147+
});

0 commit comments

Comments
 (0)