|
1 | | -<!-- Not gonna lie agin, this was made with AI as a proof of concept --> |
2 | | - |
3 | 1 | <!DOCTYPE html> |
4 | 2 | <html lang="en"> |
5 | 3 | <head> |
6 | 4 | <meta charset="UTF-8"> |
7 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
8 | 6 | <title>Graduation Countdown</title> |
9 | 7 | <style> |
10 | | -* { |
| 8 | + * { |
11 | 9 | margin: 0; |
12 | 10 | padding: 0; |
13 | 11 | box-sizing: border-box; |
|
16 | 14 |
|
17 | 15 | body { |
18 | 16 | background: white; |
| 17 | + overflow: hidden; |
| 18 | + height: 100vh; |
| 19 | + width: 100vw; |
19 | 20 | display: flex; |
20 | 21 | justify-content: center; |
21 | 22 | align-items: center; |
| 23 | + position: relative; |
| 24 | + } |
| 25 | + |
| 26 | + /* 🎉 Confetti background canvas */ |
| 27 | + #confetti-canvas { |
| 28 | + position: fixed; |
| 29 | + top: 0; |
| 30 | + left: 0; |
| 31 | + width: 100vw; |
22 | 32 | height: 100vh; |
23 | | - overflow: hidden; |
| 33 | + pointer-events: none; |
| 34 | + z-index: 0; |
24 | 35 | } |
25 | 36 |
|
| 37 | + /* 🎓 Countdown overlay */ |
26 | 38 | #countdown-container { |
27 | 39 | position: relative; |
| 40 | + z-index: 1; |
28 | 41 | width: min(90vw, 700px); |
29 | 42 | aspect-ratio: 1 / 1; |
30 | 43 | display: flex; |
|
69 | 82 | font-size: clamp(1.4rem, 4vw, 3rem); |
70 | 83 | font-weight: 700; |
71 | 84 | line-height: 1.1; |
72 | | - transform: translateY(-0.07em); |
| 85 | + transform: translateY(-0.07em); /* 👌 your tuned offset */ |
73 | 86 | } |
74 | 87 |
|
75 | 88 | .time-label { |
|
92 | 105 | </head> |
93 | 106 | <body> |
94 | 107 |
|
| 108 | + <!-- 🎉 Confetti Canvas --> |
| 109 | + <canvas id="confetti-canvas"></canvas> |
| 110 | + |
| 111 | + <!-- 🎓 Countdown Content --> |
95 | 112 | <div id="countdown-container"> |
96 | | - <!-- purple flipped hat --> |
97 | 113 | <svg class="cap" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> |
98 | 114 | <g id="Graduation"> |
99 | 115 | <polygon points="445.055 384.794 445.055 221.864 418.805 234.989 418.805 384.777 401.301 429.785 462.551 429.785 445.055 384.794"/> |
|
102 | 118 | </g> |
103 | 119 | </svg> |
104 | 120 |
|
105 | | - <!-- timer --> |
106 | 121 | <div id="timer"> |
107 | 122 | <div class="time-group"> |
108 | 123 | <div class="time-value" id="days">--</div> |
109 | 124 | <div class="time-label">DAYS</div> |
110 | 125 | </div> |
111 | | - |
112 | 126 | <div class="time-group"> |
113 | 127 | <div class="time-colon">:</div> |
114 | 128 | <div class="time-label"> </div> |
115 | 129 | </div> |
116 | | - |
117 | 130 | <div class="time-group"> |
118 | 131 | <div class="time-value" id="hours">--</div> |
119 | 132 | <div class="time-label">HOURS</div> |
120 | 133 | </div> |
121 | | - |
122 | 134 | <div class="time-group"> |
123 | 135 | <div class="time-colon">:</div> |
124 | 136 | <div class="time-label"> </div> |
125 | 137 | </div> |
126 | | - |
127 | 138 | <div class="time-group"> |
128 | 139 | <div class="time-value" id="minutes">--</div> |
129 | 140 | <div class="time-label">MIN</div> |
|
133 | 144 | <div id="label">Graduation Countdown</div> |
134 | 145 | </div> |
135 | 146 |
|
136 | | -<script> |
| 147 | + <!-- 🎉 Confetti Library --> |
| 148 | + <script src=" https://cdn.jsdelivr.net/npm/[email protected]/dist/confetti.browser.min.js" ></script> |
| 149 | + |
| 150 | + <script> |
| 151 | + /* 🎓 Countdown Logic */ |
137 | 152 | function updateCountdown() { |
138 | | - const target = new Date("Jun 11, 2026 15:00:00 GMT").getTime(); |
139 | | - const now = new Date().getTime(); |
140 | | - const diff = target - now; |
141 | | - |
142 | | - if (diff <= 0) { |
143 | | - document.getElementById("days").textContent = "🎓"; |
144 | | - document.getElementById("hours").textContent = ""; |
145 | | - document.getElementById("minutes").textContent = ""; |
146 | | - document.getElementById("label").textContent = "It's Graduation Day!"; |
147 | | - document.querySelectorAll(".time-colon").forEach(c => c.style.display = "none"); |
148 | | - return; |
| 153 | + const target = new Date("Jun 11, 2026 15:00:00 GMT").getTime(); |
| 154 | + const now = new Date().getTime(); |
| 155 | + const diff = target - now; |
| 156 | + |
| 157 | + if (diff <= 0) { |
| 158 | + document.getElementById("days").textContent = "🎓"; |
| 159 | + document.getElementById("hours").textContent = ""; |
| 160 | + document.getElementById("minutes").textContent = ""; |
| 161 | + document.getElementById("label").textContent = "It's Graduation Day!"; |
| 162 | + document.querySelectorAll(".time-colon").forEach(c => c.style.display = "none"); |
| 163 | + return; |
| 164 | + } |
| 165 | + |
| 166 | + const days = Math.floor(diff / (1000 * 60 * 60 * 24)); |
| 167 | + const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); |
| 168 | + const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); |
| 169 | + |
| 170 | + document.getElementById("days").textContent = days; |
| 171 | + document.getElementById("hours").textContent = hours.toString().padStart(2, "0"); |
| 172 | + document.getElementById("minutes").textContent = minutes.toString().padStart(2, "0"); |
149 | 173 | } |
150 | 174 |
|
151 | | - const days = Math.floor(diff / (1000 * 60 * 60 * 24)); |
152 | | - const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); |
153 | | - const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); |
| 175 | + setInterval(updateCountdown, 1000); |
| 176 | + updateCountdown(); |
154 | 177 |
|
155 | | - document.getElementById("days").textContent = days; |
156 | | - document.getElementById("hours").textContent = hours.toString().padStart(2, "0"); |
157 | | - document.getElementById("minutes").textContent = minutes.toString().padStart(2, "0"); |
158 | | - } |
| 178 | + /* 🎉 Confetti Setup */ |
| 179 | + const confettiCanvas = document.getElementById('confetti-canvas'); |
| 180 | + const myConfetti = confetti.create(confettiCanvas, { resize: true, useWorker: true }); |
| 181 | + |
| 182 | + function randomInRange(min, max) { |
| 183 | + return Math.random() * (max - min) + min; |
| 184 | + } |
159 | 185 |
|
160 | | - setInterval(updateCountdown, 1000); |
161 | | - updateCountdown(); |
162 | | -</script> |
| 186 | + let skew = 1; |
| 187 | + (function frame() { |
| 188 | + skew = Math.max(0.8, skew - 0.001); |
| 189 | + |
| 190 | + myConfetti({ |
| 191 | + particleCount: 2, |
| 192 | + startVelocity: 0, |
| 193 | + ticks: 300, |
| 194 | + origin: { |
| 195 | + x: Math.random(), |
| 196 | + y: (Math.random() * skew) - 0.2 |
| 197 | + }, |
| 198 | + colors: ['#5A2D81', '#000000', '#FFFFFF', '#C0C0C0'], |
| 199 | + gravity: randomInRange(0.4, 0.6), |
| 200 | + scalar: randomInRange(0.6, 1.2), |
| 201 | + drift: randomInRange(-0.4, 0.4), |
| 202 | + shapes: ['square', 'circle'] |
| 203 | + }); |
| 204 | + |
| 205 | + requestAnimationFrame(frame); |
| 206 | + })(); |
| 207 | + </script> |
163 | 208 |
|
164 | 209 | </body> |
165 | 210 | </html> |
0 commit comments